ROOT logo
// @(#)root/proofx:$Id$
// Author: G.Ganis Nov 2011

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

#ifndef ROOT_TProofPerfAnalysis
#define ROOT_TProofPerfAnalysis

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TProofPerfAnalysis                                                       //
//                                                                      //
// Set of tools to analyse the performance tree                         //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#ifndef ROOT_TNamed
#include "TNamed.h"
#endif
#ifndef ROOT_TSortedList
#include "TSortedList.h"
#endif
#ifndef ROOT_TString
#include "TString.h"
#endif

class TFile;
class TH1F;
class TH2F;
class TList;
class TTree;
class TProofPerfAnalysis : public TNamed {

public:              // public because of Sun CC bug
   class TFileInfo;
   class TPackInfo;
   class TWrkEntry;
   class TWrkInfo;
   class TWrkInfoFile;

private:
   TFile  *fFile;                // The open performance file
   TString fDirName;             // The name of the subdir with the perfomance tree
   TString fTreeName;            // The name of the performance tree
   TTree  *fTree;                // The performance tree
   TSortedList fWrksInfo;        // Sorted list of workers info
   TSortedList fFilesInfo;       // Sorted list of files info
   Float_t fInitTime;            // End of initialization time for this query
   Float_t fMergeTime;           // Begin of merging time for this query
   Float_t fMaxTime;             // Max time for this query (slowest worker)
   TH1F   *fEvents;              // Event distribution per worker
   TH1F   *fPackets;             // Packet distribution per worker
   Double_t fEvtRateMax;         // Max event processing rate per packet
   Double_t fMBRateMax;          // Max MB processing rate per packet
   Double_t fLatencyMax;         // Max retrieval latency per packet
   TH1F *fEvtRate;               // Event processing rate vs query time
   TH1F *fEvtRateRun;            // Event processing rate running avg vs query time
   TH1F *fMBRate;                // Byte processing rate vs query time
   TH1F *fMBRateRun;             // Byte processing rate running avg vs query time
   Double_t fEvtRateAvgMax;      // Max running event processing rate
   Double_t fMBRateAvgMax;       // Max running MB processing rate
   Double_t fEvtRateAvg;         // Average event processing rate
   Double_t fMBRateAvg;          // Average MB processing rate
   TString fFileResult;          // File where to save basics of a run when requested
   Bool_t fSaveResult;           // Whether to save the results of a run

   Int_t fDebug;                 // Local verbosity level

   static Bool_t fgDebug;         // Global verbosity on/off

   Int_t CompareOrd(const char *ord1, const char *ord2);
   void  FillFileDist(TH1F *hf, TH1F *hb, TH2F *hx, Bool_t wdet = kFALSE);
   void  FillFileDistOneSrv(TH1F *hx, Bool_t wdet = kFALSE);
   void  FillWrkInfo(Bool_t force = kFALSE);
   void  FillFileInfo(Bool_t force = kFALSE);
   TString GetCanvasTitle(const char *t);
   void  GetWrkFileList(TList *wl, TList *sl);
   void  LoadTree(TDirectory *dir);
   void  DoDraw(TObject *o, Option_t *opt = "", const char *name = 0);

public:

   TProofPerfAnalysis(const char *perffile, const char *title = "",
                  const char *treename = "PROOF_PerfStats");
   TProofPerfAnalysis(TTree *tree, const char *title = "");
   virtual ~TProofPerfAnalysis();

   Bool_t IsValid() const { return (fFile && fTree) ? kTRUE : kFALSE; } 
   Bool_t WrkInfoOK() const { return (fWrksInfo.GetSize() > 0) ? kTRUE : kFALSE; } 
   
   void  EventDist();                          // Analyse event and packet distribution
   void  FileDist(Bool_t writedet = kFALSE);   // Analyse the file distribution
   void  LatencyPlot(const char *wrks = 0);    // Packet latency distribution vs time
   void  RatePlot(const char *wrks = 0);       // Rate distribution vs time
   void  WorkerActivity();                     // Analyse the worker activity
   void  PrintWrkInfo(Int_t showlast = 10);    // Print workers info
   void  PrintWrkInfo(const char *wrk);        // Print worker info by name

   void  PrintFileInfo(Int_t showlast = 10, const char *opt = "", const char *out = 0);   // Print file info
   void  PrintFileInfo(const char *fn, const char *opt = "P", const char *out = 0);        // Print file info by name
   void  FileProcPlot(const char *fn, const char *out = 0); // Plot info about file processing
   void  FileRatePlot(const char *fns = 0);    // Plot info about file processing rates

   Double_t GetEvtRateAvgMax() const { return fEvtRateAvgMax; }      // Max running event processing rate
   Double_t GetMBRateAvgMax() const { return fMBRateAvgMax; }       // Max running MB processing rate
   Double_t GetEvtRateAvg() const { return fEvtRateAvg; }         // Average event processing rate
   Double_t GetMBRateAvg() const { return fMBRateAvg; }          // Average MB processing rate
   void GetAverages(Double_t &evtmax, Double_t &mbmax, Double_t &evt, Double_t &mb) const 
        { evtmax = fEvtRateAvgMax; mbmax = fMBRateAvgMax; evt = fEvtRateAvg; mb = fMBRateAvg; return; }

   void  Summary(Option_t *opt = "", const char *out = "");
  
   Int_t SetSaveResult(const char *file = "results.root", Option_t *mode = "RECREATE");

   void  SetDebug(Int_t d = 0);   // Setter for the verbosity level
   static void  SetgDebug(Bool_t on = kTRUE);   // Overall verbosity level

   ClassDef(TProofPerfAnalysis, 0)   // Set of tools to analyse the performance tree
};

#endif
 TProofPerfAnalysis.h:1
 TProofPerfAnalysis.h:2
 TProofPerfAnalysis.h:3
 TProofPerfAnalysis.h:4
 TProofPerfAnalysis.h:5
 TProofPerfAnalysis.h:6
 TProofPerfAnalysis.h:7
 TProofPerfAnalysis.h:8
 TProofPerfAnalysis.h:9
 TProofPerfAnalysis.h:10
 TProofPerfAnalysis.h:11
 TProofPerfAnalysis.h:12
 TProofPerfAnalysis.h:13
 TProofPerfAnalysis.h:14
 TProofPerfAnalysis.h:15
 TProofPerfAnalysis.h:16
 TProofPerfAnalysis.h:17
 TProofPerfAnalysis.h:18
 TProofPerfAnalysis.h:19
 TProofPerfAnalysis.h:20
 TProofPerfAnalysis.h:21
 TProofPerfAnalysis.h:22
 TProofPerfAnalysis.h:23
 TProofPerfAnalysis.h:24
 TProofPerfAnalysis.h:25
 TProofPerfAnalysis.h:26
 TProofPerfAnalysis.h:27
 TProofPerfAnalysis.h:28
 TProofPerfAnalysis.h:29
 TProofPerfAnalysis.h:30
 TProofPerfAnalysis.h:31
 TProofPerfAnalysis.h:32
 TProofPerfAnalysis.h:33
 TProofPerfAnalysis.h:34
 TProofPerfAnalysis.h:35
 TProofPerfAnalysis.h:36
 TProofPerfAnalysis.h:37
 TProofPerfAnalysis.h:38
 TProofPerfAnalysis.h:39
 TProofPerfAnalysis.h:40
 TProofPerfAnalysis.h:41
 TProofPerfAnalysis.h:42
 TProofPerfAnalysis.h:43
 TProofPerfAnalysis.h:44
 TProofPerfAnalysis.h:45
 TProofPerfAnalysis.h:46
 TProofPerfAnalysis.h:47
 TProofPerfAnalysis.h:48
 TProofPerfAnalysis.h:49
 TProofPerfAnalysis.h:50
 TProofPerfAnalysis.h:51
 TProofPerfAnalysis.h:52
 TProofPerfAnalysis.h:53
 TProofPerfAnalysis.h:54
 TProofPerfAnalysis.h:55
 TProofPerfAnalysis.h:56
 TProofPerfAnalysis.h:57
 TProofPerfAnalysis.h:58
 TProofPerfAnalysis.h:59
 TProofPerfAnalysis.h:60
 TProofPerfAnalysis.h:61
 TProofPerfAnalysis.h:62
 TProofPerfAnalysis.h:63
 TProofPerfAnalysis.h:64
 TProofPerfAnalysis.h:65
 TProofPerfAnalysis.h:66
 TProofPerfAnalysis.h:67
 TProofPerfAnalysis.h:68
 TProofPerfAnalysis.h:69
 TProofPerfAnalysis.h:70
 TProofPerfAnalysis.h:71
 TProofPerfAnalysis.h:72
 TProofPerfAnalysis.h:73
 TProofPerfAnalysis.h:74
 TProofPerfAnalysis.h:75
 TProofPerfAnalysis.h:76
 TProofPerfAnalysis.h:77
 TProofPerfAnalysis.h:78
 TProofPerfAnalysis.h:79
 TProofPerfAnalysis.h:80
 TProofPerfAnalysis.h:81
 TProofPerfAnalysis.h:82
 TProofPerfAnalysis.h:83
 TProofPerfAnalysis.h:84
 TProofPerfAnalysis.h:85
 TProofPerfAnalysis.h:86
 TProofPerfAnalysis.h:87
 TProofPerfAnalysis.h:88
 TProofPerfAnalysis.h:89
 TProofPerfAnalysis.h:90
 TProofPerfAnalysis.h:91
 TProofPerfAnalysis.h:92
 TProofPerfAnalysis.h:93
 TProofPerfAnalysis.h:94
 TProofPerfAnalysis.h:95
 TProofPerfAnalysis.h:96
 TProofPerfAnalysis.h:97
 TProofPerfAnalysis.h:98
 TProofPerfAnalysis.h:99
 TProofPerfAnalysis.h:100
 TProofPerfAnalysis.h:101
 TProofPerfAnalysis.h:102
 TProofPerfAnalysis.h:103
 TProofPerfAnalysis.h:104
 TProofPerfAnalysis.h:105
 TProofPerfAnalysis.h:106
 TProofPerfAnalysis.h:107
 TProofPerfAnalysis.h:108
 TProofPerfAnalysis.h:109
 TProofPerfAnalysis.h:110
 TProofPerfAnalysis.h:111
 TProofPerfAnalysis.h:112
 TProofPerfAnalysis.h:113
 TProofPerfAnalysis.h:114
 TProofPerfAnalysis.h:115
 TProofPerfAnalysis.h:116
 TProofPerfAnalysis.h:117
 TProofPerfAnalysis.h:118
 TProofPerfAnalysis.h:119
 TProofPerfAnalysis.h:120
 TProofPerfAnalysis.h:121
 TProofPerfAnalysis.h:122
 TProofPerfAnalysis.h:123
 TProofPerfAnalysis.h:124
 TProofPerfAnalysis.h:125
 TProofPerfAnalysis.h:126
 TProofPerfAnalysis.h:127