3 * @author Christian Holm Christensen <cholm@nbi.dk>
4 * @date Wed Oct 15 13:21:47 2014
6 * @brief A script to plot information from system watch files
11 * @param title Title on canvas
15 TVirtualPad* MakeCanvas(const char* title="")
18 TCanvas* c = new TCanvas(Form("c%02d", ++cId), title);
19 c->SetTopMargin(0.02);
20 c->SetRightMargin(0.02);
27 * @param tree tree to look in
28 * @param exp expression to draw
29 * @param cut Cut to use
30 * @param draw Whether to draw or not
32 * @return The summed usage
34 Double_t SumUsage(TTree* tree,
39 if (draw) MakeCanvas(Form("%s [%s]", exp, cut));
41 Int_t entries = tree->Draw(exp, cut, (draw ? "" : "goff"));
42 if (entries==0) return 0;
44 Double_t mean = TMath::Mean(entries, tree->GetV1());
45 return entries * mean;
48 * Return the most heavy load
50 * @param tree tree to look in
51 * @param exp expression to draw
52 * @param cut Cut to use
53 * @param order Off set
55 * @return Most heavy usage
57 Double_t TopUsage(TTree* tree,
62 Int_t entries = tree->Draw(exp, cut, "goff");
63 if (entries <= 1 || !tree->GetV1()) return -10000;
65 TArrayI index(entries);
66 TMath::Sort(entries, tree->GetV1(), index.fArray);
68 Int_t oindex = TMath::Min(order, entries);
69 Double_t value = tree->GetV1()[index[oindex-1]];
74 * Extract a histogram from a resource spec
76 * @param tree tree to look in
77 * @param exp expression to draw
78 * @param cut Cut to use
79 * @param name Name of histogram
80 * @param xtitle X axis title
81 * @param ytitle Y axis title
82 * @param draw If true, draw
84 * @return The extract histogram or null
87 TH1* ExtractHist(TTree* tree,
91 const char* xtitle="",
92 const char* ytitle="",
95 tree->Draw(Form("%s>>tmpa", exp), cut, "GOFF");
96 if (!tree->GetHistogram()) return 0;
98 TH1* ret = static_cast<TH1*>(tree->GetHistogram()->Clone(name));
99 delete tree->GetHistogram();
100 ret->SetXTitle(xtitle);
101 ret->SetYTitle(ytitle);
102 ret->SetMarkerStyle(22);
103 ret->SetMarkerSize(1);
105 if (draw) MakeCanvas(name);
112 * Print some information to output stream
116 * @param dT Change in time
117 * @param dVM Change in VM usage
118 * @param alldT Sum of time
119 * @param alldVM Sum of VM usage
121 void Print(std::ostream& o,
131 << 100*(alldT > 0 ? dT / alldT : 0) << "\t"
132 << 100*(alldVM > 0 ? dVM / alldVM : 0) << std::endl;
138 const char* dets[] = {"ITS",
156 * Plot information from one file
158 * @param file File to plot from
159 * @param draw Drawing flags
162 Plot1SysInfo(const char* file, UShort_t draw=0x1)
164 // --- Create output file and tree ---------------------------------
165 TString rootOut(file);
166 rootOut.ReplaceAll(".log", ".root");
167 rootOut.ReplaceAll(".foo", ".root");
168 Info("", "Writing to ROOT file %s", rootOut.Data());
169 TFile* out = TFile::Open(rootOut, "RECREATE");
170 TTree* tree = AliSysInfo::MakeTree(file);
174 // --- Create ASCII output ------------------------------------------
175 TString sumOut(rootOut);
176 sumOut.ReplaceAll(".root", ".sum");
177 Info("", "Writing to ASCII file %s", sumOut.Data());
178 std::ofstream ascii(sumOut.Data());
179 ascii << "Det/C:sumDt/F:sumDvm/F:fracDt/F:fracDvm/F" << std::endl;
181 // --- Get global stuff ---------------------------------------------
182 const char* all = "id0>=0&&id2>=0";
183 Double_t sumdTAll = SumUsage(tree, "deltaT", all, draw & 0x1);
184 Double_t sumdVMAll = SumUsage(tree, "deltaVM", all, draw & 0x1);
185 Double_t topdT = TopUsage(tree, "deltaT", "id2<3", 20);
186 Double_t topdVM = TopUsage(tree, "deltaVM", "", 20);
187 TCut cutT("cutDT", Form("deltaT > %f", topdT));
188 TCut cutVM("cutVM", Form("deltaVM > %f", topdVM));
190 ExtractHist(tree, "deltaVM:sname", "1"+cutVM,
191 "DVMvsName","","#DeltaVM [MB]", draw&0x4);
192 ExtractHist(tree, "VM:sname", "id2<3"+cutVM,
193 "VMvsName", "", "VM [MB]", draw&0x4);
194 ExtractHist(tree, "VM:T", "deltaVM>1",
195 "VMvsTime", "Time [sec]", "VM [MB]", draw&0x4);
196 ExtractHist(tree, "deltaT:sname","id2<3"+cutT,
197 "CPUvsName","","#DeltaT [sec]", draw&0x4);
201 Print(ascii, "all", sumdTAll, sumdVMAll, sumdTAll, sumdVMAll);
205 // --- Loop over detetors ------------------------------------------
206 const char** pdet = dets;
209 TString cut = Form("id0==%d && id2 >= 0", idet);
210 Double_t sumdT = SumUsage(tree, "deltaT", cut, draw & 0x2);
211 Double_t sumdVM = SumUsage(tree, "deltaVM", cut, draw & 0x2);
212 Print(ascii, *pdet, sumdT, sumdVM, sumdTAll, sumdVMAll);
215 TString cut2 = Form("id0==%d",idet);
216 ExtractHist(tree, "deltaVM:sname", cut2.Data()+cutVM,
217 Form("DVMvsName_%02d", idet), "", "#DeltaVM [MB]", draw&0x8);
218 ExtractHist(tree, "VM:sname", cut2.Data()+cutVM,
219 Form("VMvsName_%02d", idet), "", "VM [MB]", draw&0x8);
220 ExtractHist(tree, "deltaT:sname", cut2.Data()+cutT,
221 Form("CPUvsName_%02d", idet),"", "#DeltaT [sec]", draw&0x8);
235 * Plot for one job both simulation and reconstruction usage
237 * @param pid Job identifier
240 PlotSysInfo(ULong_t pid=431808952)
242 Plot1SysInfo(Form("%d_simwatch.log", pid));
243 Plot1SysInfo(Form("%d_recowatch.log", pid));