// @(#)root/proofplayer:$Id$
// Author: Kristjan Gulbrandsen   11/05/04

/*************************************************************************
 * Copyright (C) 1995-2004, 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_TPerfStats
#define ROOT_TPerfStats

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


#ifndef ROOT_TObject
#include "TObject.h"
#endif
#ifndef ROOT_TObjArray
#include "TObjArray.h"
#endif
#ifndef ROOT_TTimeStamp
#include "TTimeStamp.h"
#endif
#ifndef ROOT_TString
#include "TString.h"
#endif
#ifndef ROOT_TVirtualPerfStats
#include "TVirtualPerfStats.h"
#endif


class TDSet;
class TH1D;
class TH1I;
class TH2D;
class TList;
class TTree;

class TPerfEvent : public TObject {

public:
   TString                       fEvtNode;   // node on which the event was generated
   TTimeStamp                    fTimeStamp; // time offset from start of run
   TVirtualPerfStats::EEventType fType;
   TString                       fSlaveName;
   TString                       fNodeName;
   TString                       fFileName;
   TString                       fFileClass;
   TString                       fSlave;
   Long64_t                      fEventsProcessed;
   Long64_t                      fBytesRead;
   Long64_t                      fLen;
   Double_t                      fLatency;
   Double_t                      fProcTime;
   Double_t                      fCpuTime;
   Bool_t                        fIsStart;
   Bool_t                        fIsOk;

   TPerfEvent(TTimeStamp *offset = 0);
   virtual ~TPerfEvent() {}

   Bool_t   IsSortable() const { return kTRUE; }
   Int_t    Compare(const TObject *obj) const;
   void     Print(Option_t *option="") const;

   ClassDef(TPerfEvent,3) // Class holding TProof Event Info
};


class TPerfStats : public TVirtualPerfStats {

friend class TProofMonSender;

private:
   TTree         *fTrace;        //!TTree with trace events
   TTimeStamp     fTzero;        //!start time of this run
   TPerfEvent    *fPerfEvent;    //!TPerfEvent used to fill tree
   TH1D          *fPacketsHist;  //!histogram of packets processed per slave
   TH1I          *fProcPcktHist; //!histogram of packets being processed per slave
   TH1D          *fEventsHist;   //!histogram of events processed per slave
   TH1D          *fNodeHist;     //!histogram of slaves per file serving node
   TH2D          *fLatencyHist;  //!histogram of latency due to packet requests
   TH2D          *fProcTimeHist; //!histogram of real time spent processing packets
   TH2D          *fCpuTimeHist;  //!histogram of cpu time spent processing packets
   Long64_t       fBytesRead;    //!track bytes read of main file
   Double_t       fTotCpuTime;   //!total cpu time of all slaves
   Long64_t       fTotBytesRead; //!total bytes read on all slaves
   Long64_t       fTotEvents;    //!total number of events processed
   Long64_t       fNumEvents;    //!total number of events to be processed
   Int_t          fSlaves;       //!number of active slaves

   Bool_t         fDoHist;       //!Fill histos
   Bool_t         fDoTrace;      //!Trace details in master
   Bool_t         fDoTraceRate;  //!Trace processing rate in master
   Bool_t         fDoSlaveTrace; //!Full tracing in workers
   Bool_t         fDoQuota;      //!Save stats on SQL server for quota management

   Bool_t         fMonitorPerPacket; //!Whether to send the full entry per each packet

   TObjArray      fMonSenders;   //!Monitoring engines

   TString        fDataSet;      //!Dataset string
   Int_t          fDataSetLen;   //!Maximum size of the dataset string fDataSet
   Int_t          fDataSetSize;  //!# of files in the dataset
   TDSet         *fDSet;         //!Saved pointer to the TDSet object
   TList         *fOutput;       //!Saved pointer to the output list

   static Long_t  fgVirtMemMax;   //! Max virtual memory used by this process
   static Long_t  fgResMemMax;    //! Max resident memory used by this process

   TPerfStats(TList *input, TList *output);
   void WriteQueryLog();

public:
   virtual ~TPerfStats();

   void SimpleEvent(EEventType type);
   void PacketEvent(const char *slave, const char *slavename, const char *filename,
                    Long64_t eventsprocessed, Double_t latency,
                    Double_t proctime, Double_t cputime, Long64_t bytesRead);
   void FileEvent(const char *slave, const char *slavename, const char *nodename, const char *filename,
                  Bool_t isStart);

   void FileOpenEvent(TFile *file, const char *filename, Double_t start);
   void FileReadEvent(TFile *file, Int_t len, Double_t start);
   void UnzipEvent(TObject *tree, Long64_t pos, Double_t start, Int_t complen, Int_t objlen);
   void RateEvent(Double_t proctime, Double_t deltatime,
                  Long64_t eventsprocessed, Long64_t bytesRead);
   void SetBytesRead(Long64_t num);
   Long64_t GetBytesRead() const;
   void SetNumEvents(Long64_t num) { fNumEvents = num; }
   Long64_t GetNumEvents() const { return fNumEvents; }

   static void Start(TList *input, TList *output);
   static void Stop();
   static void Setup(TList *input);
   static void SetMemValues();
   static void GetMemValues(Long_t &vmax, Long_t &rmax);

   ClassDef(TPerfStats,0)  // Class for collecting PROOF statistics
};


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