ROOT logo
/*
  Make a Analysis/summary of syswatch.root files created in Analysis train 

  Summary created:  Memory usage - per train/task
                    CPU usage    - per train/task
                    IO load      - per hostName
 
  Input:    syswatch.txt          - list of syswatch.root files
  Output:   syswatchSummary.root  - file with defaut pictures
                                  - and summary information of forms of trees


 //  
 // input list of syswatch files to create a chain
 // Local creation e.g using:
 //

 .L $ALICE_ROOT/PWGPP/PWGPPmacros/syswatchEvalTrain.C

*/


#if !defined(__CINT__) || defined(__MAKECINT__)
#include <fstream>
#include "TSystem.h"
#include "TFile.h"
#include "TObjArray.h"
#include "TObjString.h"
#include "TChain.h"
#include "TH1.h"
#include "TCut.h"
#include "THashList.h"
#include "TGraphErrors.h"
#include "TF1.h"
#include "TMap.h"
#include "TTreeStream.h"
#endif



TChain * chainWatch = 0; 
TTreeSRedirector * pcstream = 0; 
TObjArray * picArray    = new TObjArray;
TObjArray * taskSummary = new TObjArray;
Int_t maxEntries   = 100000;   // maximal amount of points to visualize

//
// export variables
//
Double_t ftimeSlope = 0;   // time slope per event
Double_t fmemSlope  = 0;   // mem slope  per event
Double_t fmemOffset = 0;   // mem offset at the initialization
Double_t fmeandVM   = 0;   // mean delta VM per task
Double_t fmeandT    = 0;   // mean delta T  per task
TCut cutStep1="1";   // skipt the points if too many
//
// functions:
//
void AddToChain(TString inputList);
void SetAliasTrain();
void GetSummaryTrain();
void GetSummaryTask();
void GetSummaryHost();
void PrintPairSummary(TObjArray *array);


void syswatchEvalTrain(){
  AddToChain("syswatch.txt");
  SetAliasTrain();
  Int_t allEntries = chainWatch->GetEntries();
  if (allEntries>maxEntries) cutStep1 = Form("((%s%d)==0)","Entry$%",allEntries/maxEntries+1);
  pcstream = new TTreeSRedirector("syswatchSummary.root"); 
  pcstream->GetFile()->cd();
  //
  GetSummaryTrain();
  GetSummaryTask();
  GetSummaryHost();
  //picArray->Write("Pictures");
  //taskSummary->Write("TaskSummary",TObjectArray::kSingleKey);
  delete pcstream;
}

void PrintPairSummary(TObjArray *array){
  
  for (Int_t id1=0; id1<array->GetEntries(); id1++){
    TPair *pair= (TPair*)array->At(id1);
    printf("%s\t%s\n",pair->GetName(),pair->Value()->GetName());    
  }
}



void AddToChain(TString inputList){
  //
  // add the files form inputList into chain
  //
  if (!chainWatch) chainWatch = new TChain("syswatch");
  ifstream in;
  in.open(inputList.Data());
  Int_t counter=0;
  TString currentFile;
  while(in.good()) {
    in >> currentFile;
    if (!currentFile.Contains(".root")) continue;
    chainWatch->Add(currentFile.Data());
    printf("%d\t%s\n",counter,currentFile.Data());
    counter++;
  }
}



void SetAliasTrain(){
  //
  // Time, Memory consumption and host Id  stored for given snapshot
  // Snapshots are identified using 3 ids: id0, id1 and id2
  // Each sanphsot is identeified also using snapshot name
  //
  // Meaning of ids depends on the type of ananlysis
  //
  // Alieses according train conventions
  // id conventions in the ANALYSIS is following:
  //    id1 - task id number
  //        - 1000 reserved for the Handlers_BeginEvent
  chainWatch->SetAlias("EventNumber","id0");
  chainWatch->SetAlias("isTask","id1<200&&id1>=0");
  chainWatch->SetAlias("isReading","id1==1000");
  chainWatch->SetAlias("isEvent","id0>10");  // skip first events
  chainWatch->SetAlias("hostName","hname");
  chainWatch->SetAlias("stampName","sname");
}

void GetSummaryTrain(){
  //
  // Get the Summary info per train
  //  
  TF1 ftime("ftime","[0]*x");
  TF1 fmem("fmem","pol1");
  ftime.SetLineColor(2);
  fmem.SetLineColor(2);
  TGraph *gr = 0;
  Int_t entries=0;
  //
  //
  //
  entries = chainWatch->Draw("T:EventNumber*0.001",cutStep1+"isTask&&isEvent","goff");
  gr=new TGraphErrors(entries, chainWatch->GetV2(),chainWatch->GetV1(),0,0);
  gr->SetName("TvEventNumber");
  gr->SetTitle("T:EventNumber");
  gr->GetXaxis()->SetTitle("Event Nr. (10^3)");
  gr->GetYaxis()->SetTitle("T (s)");
  gr->Fit(&ftime,"ROB=0.7");
  gr->Draw("ap");
  picArray->AddLast(gr->Clone());
  pcstream->GetFile()->cd();
  gr->Write();
  //
  entries = chainWatch->Draw("0.001*VM:0.001*EventNumber",cutStep1+"isTask&&isEvent");
  gr=new TGraphErrors(entries, chainWatch->GetV2(),chainWatch->GetV1(),0,0);
  gr->SetName("VMvEventNumber");
  gr->SetTitle("VM:EventNumber");
  gr->GetXaxis()->SetTitle("Event Nr. (10^3)");
  gr->GetYaxis()->SetTitle("Virtual memory (GBy)");
  gr->Fit(&fmem,"ROB=0.7");
  gr->Draw("ap");
  picArray->AddLast(gr->Clone());
  pcstream->GetFile()->cd();
  gr->Write();

  fmemSlope=fmem.GetParameter(1);
  fmemOffset=fmem.GetParameter(0);
  ftimeSlope=ftime.GetParameter(0);
  picArray->AddLast(gr->Clone());
  pcstream->GetFile()->cd();
  gr->Write();
  (*pcstream)<<"summaryInfo"<<
    "ftimeSlope="<<ftimeSlope<<     // time slope per event
    "fmemSlope="<<fmemSlope<<       // mem slope  per event
    "fmemOffset="<<fmemOffset<<     // mem offset at the initialization
    "fmeandVM="<<fmeandVM<<         // mean delta VM per task
    "fmeandT="<<fmeandT<<           // mean delta T  per task
    "\n";
}

void GetSummaryTask(){
  //
  //
  //
  TH1 * hisVM =0;
  TH1 * hisT =0;

  chainWatch->Draw("1000*deltaVM:sname",cutStep1+"isTask&&isEvent","profile");
  hisVM = (TH1*)chainWatch->GetHistogram()->Clone();
  hisVM->SetMarkerStyle(20);
  hisVM->SetName("deltaVMperTask");
  hisVM->SetTitle("delta VM per Task");
  hisVM->GetYaxis()->SetTitle("#DeltaVM/Event (kBy)");
  hisVM->Draw();
  picArray->AddLast(hisVM);
  pcstream->GetFile()->cd();
  hisVM->Write();
  //
  chainWatch->Draw("1000*deltaT:sname",cutStep1+"isTask&&isEvent","profile");
  hisT = (TH1*)chainWatch->GetHistogram()->Clone();
  hisT->SetMarkerStyle(20);
  hisT->SetName("deltaTperTask");
  hisT->SetTitle("deltaT per Task");
  hisT->GetYaxis()->SetTitle("#Delta_{t}/Event (ms)");
  hisT->Draw();
  picArray->AddLast(hisT);
  pcstream->GetFile()->cd();
  hisT->Write();
  //
  //
  Int_t nbins = hisT->GetXaxis()->GetNbins();
  for (Int_t iname=0; iname<nbins; iname++){
    TObjString *hname= new TObjString(hisVM->GetXaxis()->GetLabels()->At(iname)->GetName());
    printf("%s\t%f\t%f\n",hname->GetName(), hisVM->GetBinContent(iname+1),hisT->GetBinContent(iname+1)); 
    Double_t vmev = hisVM->GetBinContent(iname+1);
    Double_t tev  = hisT->GetBinContent(iname+1);
    Double_t vmevErr = hisVM->GetBinError(iname+1);
    Double_t tevErr  = hisT->GetBinError(iname+1);
    char hstring[1000];
    sprintf(hstring,"%s",hname->GetName());
    (*pcstream)<<"taskInfo"<<
      "taskName.="<<hname<<   // host name
      "vmev="<< vmev<<          // memory per task per even
      "tev="<<  tev<<           // time per event per task
      "vmevErr="<< vmevErr<<          // memory per task per even
      "teverr="<<  tevErr<<           // time per event per task
      // MEAN summary (ALL)
      "ftimeSlope="<<ftimeSlope<<     // time slope per event
      "fmemSlope="<<fmemSlope<<       // mem slope  per event
      "fmemOffset="<<fmemOffset<<     // mem offset at the initialization
      "fmeandVM="<<fmeandVM<<         // mean delta VM per task
      "fmeandT="<<fmeandT<<           // mean delta T  per task
      "\n";
  }
}


void GetSummaryHost(){
  //
  // Get summary information per hosts
  // 2 histograms
  // 
  Int_t nbins=0;
  TH1 * hisIOT=0;
  TH1 * hisT=0;
  chainWatch->Draw("0.0000001*fileBytesRead/T:hostName","EventNumber>0&&isReading","prof");
  hisIOT = (TH1*)chainWatch->GetHistogram()->Clone();
  hisIOT->SetDirectory(0);
  chainWatch->Draw("1000*T/EventNumber:hostName","EventNumber>0&&isReading","prof");
  hisT = (TH1*)chainWatch->GetHistogram()->Clone();
  hisT->SetDirectory(0);
  //
  hisIOT->SetTitle("input MBy/s per host");
  hisIOT->SetName("input-MBysPerHost");
  hisIOT->SetTitle("MBy/s");
  hisIOT->GetYaxis()->SetTitle("MBy/s");
  hisIOT->SetMarkerStyle(22);
  hisIOT->Draw();
  picArray->AddLast(hisIOT);
  pcstream->GetFile()->cd();
  hisIOT->Write();
  //
  hisT->SetTitle("Event/ms per host");
  hisT->SetName("Event/ms per Host");
  hisT->GetYaxis()->SetTitle("Events/ms");
  hisT->SetMarkerStyle(22);
  hisT->Draw();
  picArray->AddLast(hisT);
  pcstream->GetFile()->cd();
  hisT->Write();
  //
  nbins = hisIOT->GetXaxis()->GetNbins();
  for (Int_t iname=0; iname<nbins; iname++){
    TObjString *hname= new TObjString(hisIOT->GetXaxis()->GetLabels()->At(iname)->GetName());
    printf("%s\t%f\t%f\n",hname->GetName(), hisIOT->GetBinContent(iname+1),hisT->GetBinContent(iname+1)); 
    Double_t iot= hisIOT->GetBinContent(iname+1);
    Double_t tev= hisT->GetBinContent(iname+1);
    char hstring[1000];
    sprintf(hstring,"%s",hname->GetName());
    (*pcstream)<<"hostInfo"<<
      "hostName.="<<hname<<   // host name
      "iot="<< iot<<          // reading per second
      "tev="<< tev<<          // events per milisecond 
      // mean summary (all)
      "ftimeSlope="<<ftimeSlope<<     // time slope per event
      "fmemSlope="<<fmemSlope<<       // mem slope  per event
      "fmemOffset="<<fmemOffset<<     // mem offset at the initialization
      "fmeandVM="<<fmeandVM<<         // mean delta VM per task
      "fmeandT="<<fmeandT<<           // mean delta T  per task
      "\n";
  }

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