// @(#)root/proof:$Name:  $:$Id: TProofStats.cxx,v 1.2 2004/05/30 23:14:18 rdm Exp $
// Author: Kristjan Gulbrandsen   11/05/04

/*************************************************************************
 * Copyright (C) 1995-2001, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TProofStats                                                          //
//                                                                      //
// Provides the interface for the PROOF internal performance measurment //
// and event tracing                                                    //
//                                                                      //
//////////////////////////////////////////////////////////////////////////


#include "TProofStats.h"

#include "TTree.h"
#include "TCollection.h"
#include "TSlave.h"
#include "TH1.h"
#include "TH2.h"
#include "TProofDebug.h"


ClassImp(TProofEvent)
ClassImp(TProofStats)


//------------------------------------------------------------------------------
 TProofStats::TProofStats(Int_t nslaves, TList *output, Bool_t doHist, Bool_t doTrace)
   : fTrace(0), fProofEvent(0), fPacketsHist(0), fEventsHist(0), fLatencyHist(0),
      fProcTimeHist(0), fCpuTimeHist(0)
{
   // Normal Constructor

   PDB(kGlobal,1) Info("TProofStats", "Statistics for %d slave(s)", nslaves);

   if (doTrace) {
      // Construct tree
      fTrace = new TTree("proofstats","PROOF Statistics");
      fTrace->SetDirectory(0);
      fTrace->Bronch("ProofEvents","TProofEvent",&fProofEvent,64000,0);
      output->Add(fTrace);
   }

   if (doHist) {
      // Make Histograms
      Double_t time_per_bin = 1e-2; // 10ms
      Double_t min_time = 0;
      Int_t ntime_bins = 200;

      fPacketsHist = new TH1D("PacketsHist", "Packets processed per Slave",
                              nslaves, 0, nslaves);
      fPacketsHist->SetDirectory(0);
      output->Add(fPacketsHist);

      fEventsHist = new TH1D("EventsHist","Events processed per Slave",
                             nslaves, 0, nslaves);
      fEventsHist->SetDirectory(0);
      output->Add(fEventsHist);

      fNodeHist = new TH1D("NodeHist","Slaves per Fileserving Node",
                             0, 0, 0);
      fNodeHist->SetDirectory(0);
      output->Add(fNodeHist);

      fLatencyHist = new TH2D("LatencyHist","GetPacket Latency per Slave",
                              nslaves, 0, nslaves,
                              ntime_bins, min_time, time_per_bin*ntime_bins);
      fLatencyHist->SetDirectory(0);
      output->Add(fLatencyHist);

      fProcTimeHist = new TH2D("ProcTimeHist","Packet Processing Time per Slave",
                               nslaves, 0, nslaves,
                               ntime_bins, min_time, time_per_bin*ntime_bins);
      fProcTimeHist->SetDirectory(0);
      output->Add(fProcTimeHist);

      fCpuTimeHist = new TH2D("CpuTimeHist","Packet CPU Time per Slave",
                              nslaves, 0, nslaves,
                              ntime_bins, min_time, time_per_bin*ntime_bins);
      fCpuTimeHist->SetDirectory(0);
      output->Add(fCpuTimeHist);
   }
}


//______________________________________________________________________________
 void TProofStats::SimpleEvent(TProofEvent::EEventType type)
{
   if (type == TProofEvent::kStop && fPacketsHist != 0) {
      fNodeHist->LabelsDeflate("X");
      fNodeHist->LabelsOption("auv","X");
   }

   if (fTrace == 0) return;

   TProofEvent pe; // sets timestamp

   pe.fType = type;

   fProofEvent = &pe;
   fTrace->Fill();
   fProofEvent = 0;
}


//______________________________________________________________________________
 void TProofStats::PacketEvent(Int_t slave, const char* slavename, const char* filename,
                              Long64_t eventsprocessed, Double_t latency, Double_t proctime,
                              Double_t cputime)
{

   if (fTrace != 0) {
      TProofEvent pe; // sets timestamp

      pe.fType = TProofEvent::kPacket;
      pe.fSlaveName = slavename;
      pe.fFileName = filename;
      pe.fSlave = slave;
      pe.fEventsProcessed = eventsprocessed;
      pe.fLatency = latency;
      pe.fProcTime = proctime;
      pe.fCpuTime = cputime;

      fProofEvent = &pe;
      fTrace->Fill();
      fProofEvent = 0;
   }

   if (fPacketsHist != 0) {
      fPacketsHist->Fill(slave);
      fEventsHist->Fill(slave, eventsprocessed);
      fLatencyHist->Fill(slave, latency);
      fProcTimeHist->Fill(slave, proctime);
      fCpuTimeHist->Fill(slave, cputime);
   }
}


//______________________________________________________________________________
 void TProofStats::FileEvent(Int_t slave, const char *slavename, const char *nodename,
                            const char *filename, Bool_t isStart)
{
   if (fTrace != 0) {
      TProofEvent pe; // sets timestamp

      pe.fType = TProofEvent::kFile;
      pe.fSlaveName = slavename;
      pe.fNodeName = nodename;
      pe.fFileName = filename;
      pe.fSlave = slave;
      pe.fIsStart = isStart;

      fProofEvent = &pe;
      fTrace->Fill();
      fProofEvent = 0;
   }

   if (fPacketsHist != 0) {
      fNodeHist->Fill(nodename, isStart ? 1 : -1);
   }
}


ROOT page - Class index - Class Hierarchy - Top of the page

This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.