ROOT logo
// @(#)root/monalisa:$Id: TMonaLisaWriter.h 23209 2008-04-14 13:25:09Z rdm $
// Author: Andreas Peters   5/10/2005

/*************************************************************************
 * Copyright (C) 1995-2006, 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_TMonaLisaWriter
#define ROOT_TMonaLisaWriter

#ifndef ROOT_TVirtualMonitoring
#include "TVirtualMonitoring.h"
#endif
#ifndef ROOT_TStopwatch
#include "TStopwatch.h"
#endif

#ifndef __CINT__
#include <ApMon.h>
#else
struct ApMon;
#endif

#include <time.h>
#include <map>

class MonitoredTFileInfo;

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TMonaLisaWriter                                                      //
//                                                                      //
// Class defining interface to MonaLisa Monitoring Services in ROOT.    //
// The TMonaLisaWriter object is used to send monitoring information to //
// a MonaLisa server using the ML ApMon package (libapmoncpp.so/UDP     //
// packets). The MonaLisa ApMon library for C++ can be downloaded at    //
// http://monalisa.cacr.caltech.edu/monalisa__Download__ApMon.html,     //
// current version:                                                     //
//http://monalisa.cacr.caltech.edu/download/apmon/ApMon_cpp-2.2.0.tar.gz//
//                                                                      //
// The ROOT implementation is primary optimized for process/job         //
// monitoring, although all other generic MonaLisa ApMon functionality  //
// can be exploited through the ApMon class directly via                //
// dynamic_cast<TMonaLisaWriter*>(gMonitoringWriter)->GetApMon().       //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

class TMonaLisaValue : public TNamed {

private:
   Double_t fValue;  // double monitor value

   TMonaLisaValue(const TMonaLisaValue&); // Not implented
   TMonaLisaValue& operator=(const TMonaLisaValue&); // Not implented

public:
   TMonaLisaValue(const char *name, Double_t value)
      : TNamed(name, ""), fValue(value) { }
   virtual ~TMonaLisaValue() { }

   Double_t  GetValue() const { return fValue; }
   Double_t *GetValuePtr() { return &fValue; }

   ClassDef(TMonaLisaValue, 1)  // Interface to MonaLisa Monitoring Values
};


class TMonaLisaText : public TNamed {

public:
   TMonaLisaText(const char *name, const char *text) : TNamed(name, text) { }
   virtual ~TMonaLisaText() { }

   const char *GetText() const { return GetTitle(); }

   ClassDef(TMonaLisaText, 1)   // Interface to MonaLisa Monitoring Text
};


class TMonaLisaWriter : public TVirtualMonitoringWriter {

private:
   ApMon     *fApmon;            //! connection to MonaLisa
   TString    fJobId;            //! job id
   TString    fSubJobId;         //! sub job id
   TString    fHostname;         //! hostname of MonaLisa server
   Int_t      fPid;              //! process id
   Bool_t     fInitialized;      // true if initialized
   Bool_t     fVerbose;          // verbocity
   Double_t   fLastRWSendTime;     // timestamp of the last send command for file reads/writes
   Double_t   fLastFCloseSendTime; // In order not to flood ML servers
   time_t     fLastProgressTime; // timestamp of the last send command for player process

   std::map<UInt_t,  MonitoredTFileInfo *>   //!
             *fMonInfoRepo;      //! repo to gather per-file-instance mon info;
                                 // ROOT should really have something like this

   Int_t      fReportInterval;   // interval after which to send the latest value

   TStopwatch fStopwatch;        // cpu and time measurement for job and proc status
   TStopwatch fFileStopwatch;     // time measurements for data access throughputs

   TMonaLisaWriter(const TMonaLisaWriter&); // Not implemented
   TMonaLisaWriter& operator=(const TMonaLisaWriter&); // Not implemented

   void Init(const char *monserver, const char *montag, const char *monid,
             const char *monsubid, const char *option);

   Bool_t SendFileCheckpoint(TFile *file);
public:
   TMonaLisaWriter(const char *monserver, const char *montag, const char *monid = 0,
                   const char *monsubid = 0, const char *option = "");

   virtual ~TMonaLisaWriter();

   ApMon *GetApMon() const { return fApmon; }

   virtual Bool_t SendParameters(TList *valuelist, const char *identifier = 0);
   virtual Bool_t SendInfoTime();
   virtual Bool_t SendInfoUser(const char *user = 0);
   virtual Bool_t SendInfoDescription(const char *jobtag);
   virtual Bool_t SendInfoStatus(const char *status);

   virtual Bool_t SendFileCloseEvent(TFile *file);

   // An Open might have several phases, and the timings might be interesting
   // to report
   // The info is only gathered, and sent when forcesend=kTRUE
   virtual Bool_t SendFileOpenProgress(TFile *file, TList *openphases, const char *openphasename,
                               Bool_t forcesend = kFALSE);

   virtual Bool_t SendFileReadProgress(TFile *file);
   virtual Bool_t SendFileWriteProgress(TFile *file);

   virtual Bool_t SendProcessingStatus(const char *status, Bool_t restarttimer=kFALSE);
   virtual Bool_t SendProcessingProgress(Double_t nevent, Double_t nbytes, Bool_t force=kFALSE);
   virtual void   SetLogLevel(const char *loglevel = "WARNING");
   virtual void   Verbose(Bool_t onoff) { fVerbose = onoff; }

   void   Print(Option_t *option = "") const;

   ClassDef(TMonaLisaWriter, 1)   // Interface to MonaLisa Monitoring
};

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