ROOT logo
/**
 * @file   PlotSysInfo.C
 * @author Christian Holm Christensen <cholm@nbi.dk>
 * @date   Wed Oct 15 13:21:47 2014
 * 
 * @brief  A script to plot information from system watch files
 */
/** 
 * Make a canvas 
 * 
 * @param title Title on canvas 
 * 
 * @return The canvas 
 */
TVirtualPad* MakeCanvas(const char* title="")
{
  static Int_t cId = 0;
  TCanvas* c = new TCanvas(Form("c%02d", ++cId), title);
  c->SetTopMargin(0.02);
  c->SetRightMargin(0.02);
  c->cd();
  return c;
}
/** 
 * Summarize the usage 
 * 
 * @param tree tree to look in 
 * @param exp  expression to draw 
 * @param cut  Cut to use 
 * @param draw Whether to draw or not 
 * 
 * @return The summed usage 
 */
Double_t SumUsage(TTree*      tree, 
		  const char* exp, 
		  const char* cut, 
		  bool        draw=false)
{
  if (draw) MakeCanvas(Form("%s [%s]", exp, cut));
  
  Int_t  entries = tree->Draw(exp, cut, (draw ? "" : "goff"));
  if (entries==0) return 0;

  Double_t mean = TMath::Mean(entries, tree->GetV1());
  return entries * mean;
}
/** 
 * Return the most heavy load 
 * 
 * @param tree  tree to look in 
 * @param exp   expression to draw 
 * @param cut   Cut to use 
 * @param order Off set
 * 
 * @return Most heavy usage 
 */
Double_t TopUsage(TTree*      tree, 
		  const char* exp, 
		  const char* cut, 
		  Int_t       order)
{
  Int_t entries = tree->Draw(exp, cut, "goff");
  if (entries <= 1 || !tree->GetV1()) return -10000;
  
  TArrayI index(entries);
  TMath::Sort(entries, tree->GetV1(), index.fArray);

  Int_t    oindex = TMath::Min(order, entries);
  Double_t value  = tree->GetV1()[index[oindex-1]];
  
  return value;
}
/** 
 * Extract a histogram from a resource spec 
 * 
 * @param tree    tree to look in 
 * @param exp     expression to draw 
 * @param cut     Cut to use 
 * @param name    Name of histogram
 * @param xtitle  X axis title
 * @param ytitle  Y axis title 
 * @param draw    If true, draw 
 * 
 * @return The extract histogram or null
 */
  
TH1* ExtractHist(TTree*      tree,
		 const char* exp, 
		 const char* cut,
		 const char* name,
		 const char* xtitle="", 
		 const char* ytitle="",
		 Bool_t      draw=false)
{
  tree->Draw(Form("%s>>tmpa", exp), cut, "GOFF");
  if (!tree->GetHistogram()) return 0;

  TH1* ret = static_cast<TH1*>(tree->GetHistogram()->Clone(name));
  delete tree->GetHistogram();
  ret->SetXTitle(xtitle);
  ret->SetYTitle(ytitle);
  ret->SetMarkerStyle(22);
  ret->SetMarkerSize(1);
  if (draw) {
    if (draw) MakeCanvas(name);
    ret->Draw();
  }
  return ret;
}
		 
/** 
 * Print some information to output stream
 *  
 * @param o             Stream
 * @param name          Step
 * @param dT            Change in time
 * @param dVM           Change in VM usage
 * @param alldT         Sum of time
 * @param alldVM        Sum of VM usage 
 */		 
void Print(std::ostream& o,
	   const char*   name, 
	   Double_t      dT, 
	   Double_t      dVM, 
	   Double_t      alldT, 
	   Double_t      alldVM)
{
  o << name << "\t" 
    << dT   << "\t" 
    << dVM  << "\t" 
    << 100*(alldT  > 0 ? dT  / alldT  : 0) << "\t" 
    << 100*(alldVM > 0 ? dVM / alldVM : 0) << std::endl;
}
/**
 * Detectors
 * 
 */
const char* dets[] = {"ITS", 
		      "TPC", 
		      "TRD", 
		      "TOF", 
		      "PHOS", 
		      "HMPID", 
		      "EMCAL", 
		      "MUON", 
		      "FMD", 
		      "ZDC", 
		      "PMD", 
		      "T0", 
		      "VZERO", 
		      "ACORDE", 
		      "HLT",
		      0 };

/** 
 * Plot information from one file 
 * 
 * @param file  File to plot from 
 * @param draw  Drawing flags
 */
void
Plot1SysInfo(const char* file, UShort_t draw=0x1)
{
  // --- Create output file and tree ---------------------------------
  TString rootOut(file); 
  rootOut.ReplaceAll(".log", ".root");
  rootOut.ReplaceAll(".foo", ".root");
  Info("", "Writing to ROOT file %s", rootOut.Data());
  TFile* out  = TFile::Open(rootOut, "RECREATE");
  TTree* tree = AliSysInfo::MakeTree(file);
  tree->SetName("T");
  
  
  // --- Create ASCII output ------------------------------------------
  TString sumOut(rootOut); 
  sumOut.ReplaceAll(".root", ".sum");
  Info("", "Writing to ASCII file %s", sumOut.Data());
  std::ofstream ascii(sumOut.Data());
  ascii << "Det/C:sumDt/F:sumDvm/F:fracDt/F:fracDvm/F" << std::endl;

  // --- Get global stuff ---------------------------------------------
  const char* all     = "id0>=0&&id2>=0";
  Double_t sumdTAll   = SumUsage(tree, "deltaT",  all, draw & 0x1);
  Double_t sumdVMAll  = SumUsage(tree, "deltaVM", all, draw & 0x1);
  Double_t topdT      = TopUsage(tree, "deltaT",  "id2<3", 20);
  Double_t topdVM     = TopUsage(tree, "deltaVM", "", 20);
  TCut     cutT("cutDT", Form("deltaT > %f", topdT));
  TCut     cutVM("cutVM", Form("deltaVM > %f", topdVM));
  
  ExtractHist(tree, "deltaVM:sname", "1"+cutVM,
	      "DVMvsName","","#DeltaVM [MB]", draw&0x4);
  ExtractHist(tree, "VM:sname", "id2<3"+cutVM, 
	      "VMvsName", "", "VM [MB]", draw&0x4);
  ExtractHist(tree, "VM:T", "deltaVM>1", 
	      "VMvsTime", "Time [sec]", "VM [MB]", draw&0x4);
  ExtractHist(tree, "deltaT:sname","id2<3"+cutT,
	      "CPUvsName","","#DeltaT [sec]", draw&0x4);
  


  Print(ascii, "all", sumdTAll, sumdVMAll, sumdTAll, sumdVMAll);

  

  // --- Loop over detetors ------------------------------------------
  const char** pdet = dets;
  Int_t        idet = 0;
  while (*pdet) { 
    TString  cut    = Form("id0==%d && id2 >= 0", idet);
    Double_t sumdT  = SumUsage(tree, "deltaT",  cut, draw & 0x2);
    Double_t sumdVM = SumUsage(tree, "deltaVM", cut, draw & 0x2);
    Print(ascii, *pdet, sumdT, sumdVM, sumdTAll, sumdVMAll);
    
#if 0
    TString cut2    = Form("id0==%d",idet);
    ExtractHist(tree, "deltaVM:sname", cut2.Data()+cutVM,
		Form("DVMvsName_%02d", idet), "", "#DeltaVM [MB]", draw&0x8);
    ExtractHist(tree, "VM:sname",      cut2.Data()+cutVM,
		Form("VMvsName_%02d", idet), "", "VM [MB]", draw&0x8);
    ExtractHist(tree, "deltaT:sname",  cut2.Data()+cutT, 
		Form("CPUvsName_%02d", idet),"", "#DeltaT [sec]", draw&0x8);
#endif

    pdet++;
    idet++;
  }
  ascii.close();
  tree->Write();
  out->Write();
  out->ls();
  new TBrowser;
}

/** 
 * Plot for one job both simulation and reconstruction usage 
 * 
 * @param pid Job identifier 
 */
void
PlotSysInfo(ULong_t pid=431808952)
{
  Plot1SysInfo(Form("%d_simwatch.log", pid));
  Plot1SysInfo(Form("%d_recowatch.log", pid));
}
// 
// EOF
// 

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