ROOT logo
/*
  Origin:  marian.ivanov@cern.ch
  Make sys watch default plots (see $ALICE_ROOT/STEER/AliSysInfo.cxx):
  Input   -  syswatch.log  - text log file created by process to be monitored
  Output  -  syswatch.root - root files with default histograms
  Number of top violators - only top consumer displayed
  Default histogram:  
  TOP violators      - CPU and Virtual memory usage
  Detector reports    - CPU and Virtual memory usage per detector
  //
  
  Example usage:
  //  1. Initialize
  gROOT->LoadMacro("$ALICE_ROOT/macros/PlotSys.C+");
  PInit("syswatch.log","syswatch.root","syswatch.sum");
  //  2. Make ascii report.
  SumDetector()
  //  3. Make histos of top violators
   MakePlots(20);
  //  4. Browse the results
  TFile f("syswatch.root");
  TBrowser b;
 */

#include <stdio.h>
#include "AliReconstruction.h"
#include "TMath.h"
#include "TH1F.h"
#include "TH2F.h"
#include "TTree.h"
#include "TFile.h"
#include "TCut.h"
#include "TStyle.h"
#include "AliSysInfo.h"

const Int_t kNDetectors=AliReconstruction::kNDetectors;
const char* fgkDetectorName[kNDetectors] = {"ITS", "TPC", "TRD", "TOF", "PHOS", "HMPID", "EMCAL", "MUON", "FMD", "ZDC", "PMD", "T0", "VZERO", "ACORDE", "HLT"};



TObject * htemp; 
TTree *tree=0;
TFile *fout=0;
TString sumFile;
TCut cutVM("cutVM","deltaVM>10");
TCut cutDT("cutDT","deltaT>2"); 
Int_t ctop=20;


Float_t TopUsage(TTree* tree, const char *exp, const char*cut, Int_t order);
Double_t SumUsage(TTree* tree, const char *exp, const char*cut);
void TopVM();
void TopCPU();
void TopVMDetector();
void TopCPUDetector();
void SumDetector();

void PInit(const char *log="syswatch.log", const char *out="syswatch.root", const char * sumName="syswatch.sum"){
  //
  // Set Input output
  //
  tree = AliSysInfo::MakeTree(log);
  fout = new TFile(out,"recreate");
  sumFile=sumName;
}



void MakePlots(Int_t top=20){
  //
  //
  //
  ctop=top;
  gStyle->SetOptStat(0);
  //
  // Top users
  //
  TopVM();
  TopCPU();
  //
  // Reports per detector
  //
  fout->cd();
  for (Int_t idet=0; idet<kNDetectors;idet++){
    fout->cd();
    fout->mkdir(fgkDetectorName[idet]);
  }
  TopVMDetector();
  TopCPUDetector();
  //
  fout->Close();
  ctop=top;
  delete fout;
}

void TopVM(){
  //
  // select top user of virtual Memory 
  // MakeReport - ASCII and histogram
  // 
  TH1 * his=0;
  TH2 * his2=0;
  Float_t thVM = TopUsage(tree,"deltaVM","",ctop);
  cutVM = TCut("cutDT",Form("deltaVM>%f",thVM));
  //
  //
  printf("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n\n\n");
  printf("TOP Virtual memory user\n");
  //tree->Scan("deltaVM:sname",cutVM,"colsize=20");
  printf("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n\n\n");
  //
  tree->Draw("deltaVM:sname>>hhh","1"+cutVM,"*");  
  his2 = (TH2F*)(tree->GetHistogram())->Clone("dvmsname");
  delete tree->GetHistogram();
  his2->SetYTitle("Delta Virtual Memory (MBy)");
  his2->SetMarkerStyle(22);
  his2->SetMarkerSize(1); 
  his2->Draw("l*");
  his2->Write("DVMvsName");
  delete his2;
  //
  tree->Draw("VM:sname>>hhh","id2<3"+cutVM,"*");
  his2 = (TH2F*)(tree->GetHistogram())->Clone("vmsname");
  delete tree->GetHistogram();
  his2->SetYTitle("Delta Virtual Memory (MBy)");
  his2->SetMarkerStyle(22);
  his2->SetMarkerSize(1); 
  his2->Draw("l*");
  his2->Write("VMvsName");
  delete his2;
  //
  //
  tree->Draw("VM:T>>hhh","deltaVM>1","line*");
  his = (TH1*)tree->GetHistogram()->Clone("vmt");
  delete tree->GetHistogram();
  his->SetXTitle("Time (sec)");
  his->SetYTitle("Virtual Memory (MBy)");
  his->GetYaxis()->SetTitleOffset(1.2); 
  his->SetMarkerStyle(22);
  his->SetMarkerSize(1); 
  his->Draw();
  his->Write("VMvsTime");
  delete his;
}

void TopCPU(){  
  //
  // select top user of CPU 
  // MakeReport - ASCII and histogram
  // 
  TH2 * his2=0;
  Float_t thDT = TopUsage(tree,"deltaT","id2<3",ctop);
  cutDT = TCut("cutDT",Form("deltaT>%f",thDT));
  //
  printf("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n");
  printf("/n/n/nTOP CPU user\n");
  //tree->Scan("deltaT:sname",cutDT,"colsize=20");
  printf("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n");
  //
  tree->Draw("deltaT:sname>>hhh","id2<3"+cutDT,"*"); 
  his2 = (TH2F*)(tree->GetHistogram())->Clone("tsname"); 
  delete tree->GetHistogram();
  his2->SetName("VMsanme");
  his2->SetYTitle("Delta CPU time(sec)");
  his2->SetMarkerStyle(22);
  his2->SetMarkerSize(1); 
  his2->GetXaxis()->SetLabelSize(0.03);
  his2->Draw("l*");
  his2->Write("CPUvsName");
  delete his2;
}


void TopVMDetector(){
  //
  // Draw usage of VM
  //
  TH2 * his2=0;
  //
  //
  //detector part
  //
  for (Int_t idet=0; idet<kNDetectors; idet++){
    fout->cd();
    fout->cd(fgkDetectorName[idet]);
    char cdet[100];
    char cdvm[100];
    sprintf(cdet,"id0==%d",idet);
    char expr[100];
    sprintf(expr,"deltaVM:sname>>hhh");  
    //
    Float_t thDVM = TopUsage(tree,"deltaVM",cdet,ctop);
    sprintf(cdvm,"%s&&deltaVM>%f",cdet, thDVM);
    //
    tree->Draw(expr,cdvm,"GOFF"); 
    his2 = (TH2F*)(tree->GetHistogram())->Clone("xxx");
    delete tree->GetHistogram();
    his2->SetYTitle("Delta Virtual Memory (MBy)");
    his2->SetMarkerStyle(22);
    his2->SetMarkerSize(1); 
    //his2->Draw("l*");
    his2->Write(Form("DVMvsName_%d",idet));
    delete his2;
    //
    //    
    sprintf(expr,"VM:sname>>hhh");
    tree->Draw(expr,cdvm,"goff"); 
    his2 = (TH2F*)(tree->GetHistogram())->Clone("yyy");
    delete tree->GetHistogram();
    his2->SetYTitle("Delta Virtual Memory (MBy)");
    his2->SetMarkerStyle(22);
    his2->SetMarkerSize(1); 
    //his2->Draw("l*");
    his2->Write(Form("VMvsName_%d",idet));     
    delete his2;
  }
  fout->cd();
}



void TopCPUDetector(){
  //
  // Draw usage of CPU
  //
  TH2 * his2=0;
  //
  //
  // CPU
  //
  for (Int_t idet=0; idet<kNDetectors; idet++){
    fout->cd();
    fout->cd(fgkDetectorName[idet]);
    char cdet[100];
    char cdtime[100];
    sprintf(cdet,"id0==%d",idet);
    char expr[100];
    sprintf(expr,"deltaT:sname>>hhh");  
    //
    Float_t thDT = TopUsage(tree,"deltaT",cdet,ctop);
    sprintf(cdtime,"%s&&deltaT>%f",cdet, thDT);
    //
    tree->Draw(expr,cdtime,"goff"); 
    his2 = (TH2F*)(tree->GetHistogram())->Clone("dtsname");
    delete tree->GetHistogram();
    his2->SetYTitle("Delta CPU time(sec)");
    his2->SetMarkerStyle(22);
    his2->SetMarkerSize(1); 
    his2->GetXaxis()->SetLabelSize(0.03);
    //his2->Draw("l*");
    his2->Write(Form("CPUvsName_%d",idet));
    delete his2;
  }
  fout->cd();
}

void SumDetector(){
  //
  // Sum - detector information
  //
  FILE * pFile;
  pFile = fopen (sumFile,"w");
  char cdet[100];
  char expr[100];
  sprintf(cdet,"id0>=0&&id2>=0");
  Double_t sumdTAll  = SumUsage(tree,"deltaT",cdet);
  Double_t sumdVMAll = SumUsage(tree,"deltaVM",cdet);
  printf("%s%s%s%s%s\n","Det/C:","sumDt/F:","sumDvm/F:","fracDt/F:","fracDvm/F");
  printf("%s\t%f\t%f\t%f\t%f\t\n","all", sumdTAll,sumdVMAll,100.,100.);
  fprintf(pFile,"%s%s%s%s%s\n","Det/C:","sumDt/F:","sumDvm/F:","fracDt/F:","fracDvm/F");
  fprintf(pFile,"%s\t%f\t%f\t%f\t%f\t\n","all", sumdTAll,sumdVMAll,100.,100.);
  for (Int_t idet=0; idet<kNDetectors; idet++){
    sprintf(cdet,"id0==%d&&id2>=0",idet);
    sprintf(expr,"deltaT:sname>>hhh");  
    Double_t sumdT  = SumUsage(tree,"deltaT",cdet);
    Double_t sumdVM = SumUsage(tree,"deltaVM",cdet);
    printf("%s\t%f\t%f\t%f\t%f\t\n",fgkDetectorName[idet], sumdT,sumdVM,100.*sumdT/sumdTAll, 100.*sumdVM/sumdVMAll); 
    fprintf(pFile,"%s\t%f\t%f\t%f\t%f\t\n",fgkDetectorName[idet], sumdT,sumdVM,100.*sumdT/sumdTAll, 100.*sumdVM/sumdVMAll); 
  }
  fclose (pFile);
}






Float_t TopUsage(TTree* tree, const char *exp, const char*cut, Int_t order){
  //
  // 
  // Find value for given order
  // Used to select top violator
  //
  Int_t entries = tree->Draw(Form("%s>>hhh1",exp),cut,"goff");
  if (entries<=1) {
    if (tree->GetHistogram()) delete tree->GetHistogram(); 
    printf("%s\t No entries\n",cut);
    return -10000;
  }
  if (!tree->GetV1()) {
    printf("%s\t No entries\n",cut);
    return -10000; 
  }
  Int_t *index = new Int_t[entries];
  TMath::Sort(entries, tree->GetV1(), index);
  Int_t oindex = TMath::Min(order, entries);
  Float_t val = tree->GetV1()[index[oindex-1]];
  if (tree->GetHistogram()) delete tree->GetHistogram();
  delete [] index;
  return val;
}


Double_t SumUsage(TTree* tree, const char *exp, const char*cut){
  //
  // return sum of usage
  //
  Int_t  entries = tree->Draw(Form("%s",exp),cut,"goff");
  if (entries==0) return 0;
  Double_t mean = TMath::Mean(entries, tree->GetV1());
  return entries*mean;
}
 PlotSys.C:1
 PlotSys.C:2
 PlotSys.C:3
 PlotSys.C:4
 PlotSys.C:5
 PlotSys.C:6
 PlotSys.C:7
 PlotSys.C:8
 PlotSys.C:9
 PlotSys.C:10
 PlotSys.C:11
 PlotSys.C:12
 PlotSys.C:13
 PlotSys.C:14
 PlotSys.C:15
 PlotSys.C:16
 PlotSys.C:17
 PlotSys.C:18
 PlotSys.C:19
 PlotSys.C:20
 PlotSys.C:21
 PlotSys.C:22
 PlotSys.C:23
 PlotSys.C:24
 PlotSys.C:25
 PlotSys.C:26
 PlotSys.C:27
 PlotSys.C:28
 PlotSys.C:29
 PlotSys.C:30
 PlotSys.C:31
 PlotSys.C:32
 PlotSys.C:33
 PlotSys.C:34
 PlotSys.C:35
 PlotSys.C:36
 PlotSys.C:37
 PlotSys.C:38
 PlotSys.C:39
 PlotSys.C:40
 PlotSys.C:41
 PlotSys.C:42
 PlotSys.C:43
 PlotSys.C:44
 PlotSys.C:45
 PlotSys.C:46
 PlotSys.C:47
 PlotSys.C:48
 PlotSys.C:49
 PlotSys.C:50
 PlotSys.C:51
 PlotSys.C:52
 PlotSys.C:53
 PlotSys.C:54
 PlotSys.C:55
 PlotSys.C:56
 PlotSys.C:57
 PlotSys.C:58
 PlotSys.C:59
 PlotSys.C:60
 PlotSys.C:61
 PlotSys.C:62
 PlotSys.C:63
 PlotSys.C:64
 PlotSys.C:65
 PlotSys.C:66
 PlotSys.C:67
 PlotSys.C:68
 PlotSys.C:69
 PlotSys.C:70
 PlotSys.C:71
 PlotSys.C:72
 PlotSys.C:73
 PlotSys.C:74
 PlotSys.C:75
 PlotSys.C:76
 PlotSys.C:77
 PlotSys.C:78
 PlotSys.C:79
 PlotSys.C:80
 PlotSys.C:81
 PlotSys.C:82
 PlotSys.C:83
 PlotSys.C:84
 PlotSys.C:85
 PlotSys.C:86
 PlotSys.C:87
 PlotSys.C:88
 PlotSys.C:89
 PlotSys.C:90
 PlotSys.C:91
 PlotSys.C:92
 PlotSys.C:93
 PlotSys.C:94
 PlotSys.C:95
 PlotSys.C:96
 PlotSys.C:97
 PlotSys.C:98
 PlotSys.C:99
 PlotSys.C:100
 PlotSys.C:101
 PlotSys.C:102
 PlotSys.C:103
 PlotSys.C:104
 PlotSys.C:105
 PlotSys.C:106
 PlotSys.C:107
 PlotSys.C:108
 PlotSys.C:109
 PlotSys.C:110
 PlotSys.C:111
 PlotSys.C:112
 PlotSys.C:113
 PlotSys.C:114
 PlotSys.C:115
 PlotSys.C:116
 PlotSys.C:117
 PlotSys.C:118
 PlotSys.C:119
 PlotSys.C:120
 PlotSys.C:121
 PlotSys.C:122
 PlotSys.C:123
 PlotSys.C:124
 PlotSys.C:125
 PlotSys.C:126
 PlotSys.C:127
 PlotSys.C:128
 PlotSys.C:129
 PlotSys.C:130
 PlotSys.C:131
 PlotSys.C:132
 PlotSys.C:133
 PlotSys.C:134
 PlotSys.C:135
 PlotSys.C:136
 PlotSys.C:137
 PlotSys.C:138
 PlotSys.C:139
 PlotSys.C:140
 PlotSys.C:141
 PlotSys.C:142
 PlotSys.C:143
 PlotSys.C:144
 PlotSys.C:145
 PlotSys.C:146
 PlotSys.C:147
 PlotSys.C:148
 PlotSys.C:149
 PlotSys.C:150
 PlotSys.C:151
 PlotSys.C:152
 PlotSys.C:153
 PlotSys.C:154
 PlotSys.C:155
 PlotSys.C:156
 PlotSys.C:157
 PlotSys.C:158
 PlotSys.C:159
 PlotSys.C:160
 PlotSys.C:161
 PlotSys.C:162
 PlotSys.C:163
 PlotSys.C:164
 PlotSys.C:165
 PlotSys.C:166
 PlotSys.C:167
 PlotSys.C:168
 PlotSys.C:169
 PlotSys.C:170
 PlotSys.C:171
 PlotSys.C:172
 PlotSys.C:173
 PlotSys.C:174
 PlotSys.C:175
 PlotSys.C:176
 PlotSys.C:177
 PlotSys.C:178
 PlotSys.C:179
 PlotSys.C:180
 PlotSys.C:181
 PlotSys.C:182
 PlotSys.C:183
 PlotSys.C:184
 PlotSys.C:185
 PlotSys.C:186
 PlotSys.C:187
 PlotSys.C:188
 PlotSys.C:189
 PlotSys.C:190
 PlotSys.C:191
 PlotSys.C:192
 PlotSys.C:193
 PlotSys.C:194
 PlotSys.C:195
 PlotSys.C:196
 PlotSys.C:197
 PlotSys.C:198
 PlotSys.C:199
 PlotSys.C:200
 PlotSys.C:201
 PlotSys.C:202
 PlotSys.C:203
 PlotSys.C:204
 PlotSys.C:205
 PlotSys.C:206
 PlotSys.C:207
 PlotSys.C:208
 PlotSys.C:209
 PlotSys.C:210
 PlotSys.C:211
 PlotSys.C:212
 PlotSys.C:213
 PlotSys.C:214
 PlotSys.C:215
 PlotSys.C:216
 PlotSys.C:217
 PlotSys.C:218
 PlotSys.C:219
 PlotSys.C:220
 PlotSys.C:221
 PlotSys.C:222
 PlotSys.C:223
 PlotSys.C:224
 PlotSys.C:225
 PlotSys.C:226
 PlotSys.C:227
 PlotSys.C:228
 PlotSys.C:229
 PlotSys.C:230
 PlotSys.C:231
 PlotSys.C:232
 PlotSys.C:233
 PlotSys.C:234
 PlotSys.C:235
 PlotSys.C:236
 PlotSys.C:237
 PlotSys.C:238
 PlotSys.C:239
 PlotSys.C:240
 PlotSys.C:241
 PlotSys.C:242
 PlotSys.C:243
 PlotSys.C:244
 PlotSys.C:245
 PlotSys.C:246
 PlotSys.C:247
 PlotSys.C:248
 PlotSys.C:249
 PlotSys.C:250
 PlotSys.C:251
 PlotSys.C:252
 PlotSys.C:253
 PlotSys.C:254
 PlotSys.C:255
 PlotSys.C:256
 PlotSys.C:257
 PlotSys.C:258
 PlotSys.C:259
 PlotSys.C:260
 PlotSys.C:261
 PlotSys.C:262
 PlotSys.C:263
 PlotSys.C:264
 PlotSys.C:265
 PlotSys.C:266
 PlotSys.C:267
 PlotSys.C:268
 PlotSys.C:269
 PlotSys.C:270
 PlotSys.C:271
 PlotSys.C:272
 PlotSys.C:273
 PlotSys.C:274
 PlotSys.C:275
 PlotSys.C:276
 PlotSys.C:277
 PlotSys.C:278
 PlotSys.C:279
 PlotSys.C:280
 PlotSys.C:281
 PlotSys.C:282
 PlotSys.C:283
 PlotSys.C:284
 PlotSys.C:285
 PlotSys.C:286
 PlotSys.C:287
 PlotSys.C:288
 PlotSys.C:289
 PlotSys.C:290
 PlotSys.C:291
 PlotSys.C:292
 PlotSys.C:293
 PlotSys.C:294
 PlotSys.C:295
 PlotSys.C:296
 PlotSys.C:297
 PlotSys.C:298
 PlotSys.C:299
 PlotSys.C:300
 PlotSys.C:301
 PlotSys.C:302
 PlotSys.C:303
 PlotSys.C:304
 PlotSys.C:305
 PlotSys.C:306
 PlotSys.C:307
 PlotSys.C:308
 PlotSys.C:309
 PlotSys.C:310
 PlotSys.C:311
 PlotSys.C:312
 PlotSys.C:313
 PlotSys.C:314
 PlotSys.C:315
 PlotSys.C:316
 PlotSys.C:317
 PlotSys.C:318
 PlotSys.C:319
 PlotSys.C:320
 PlotSys.C:321
 PlotSys.C:322
 PlotSys.C:323