]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGPP/EMCAL/QA/macros/PlotEMCALQATrendingTree.C
Merge branch 'feature-movesplit'
[u/mrichter/AliRoot.git] / PWGPP / EMCAL / QA / macros / PlotEMCALQATrendingTree.C
CommitLineData
97a28f97 1#if !defined(__CINT__) || defined(__MAKECINT__)
2#include <TSystem.h>
3#include <TStyle.h>
4#include <TROOT.h>
5#include <Riostream.h>
6#include <TFile.h>
7#include <TH1F.h>
8#include <TCanvas.h>
9#include <TGraphErrors.h>
10#include <TLegend.h>
11#include <TTree.h>
12#include <TTreeFormula.h>
13#include <TEventList.h>
14#include <TObjString.h>
15#include <TList.h>
16#include <TCut.h>
17#include <TError.h>
18#include <TDatime.h>
19#include <TPRegexp.h>
20#include <TInterpreter.h>
21#include <TGaxis.h>
22#endif
23
24// This macro produces periodLevelQA for EMCAL from a trending tree
25// Authors: A. Mas, M. Germain & A.Shabetai SUBATECH
26// re-factored for automatic QA processing and trending A. A.SHABETAI
27
28int PlotEMCALQATrendingTree(TTree* tree, const char* trig,TFile* fout,Bool_t SavePlots,TString expr);
29TH1F* ZoomFromTree(TH1F* h, TTree* atree, Int_t n, const char* aVar, UShort_t aScaleFactor=1);
30Double_t GetTreeMinimum(TTree* aTree, Int_t n, const char* columname);
31Double_t GetTreeMaximum(TTree* aTree, Int_t n, const char* columname);
32
33TString QAPATH;
34TString QAPATHF= "./";
35
36//--------------------------------------------------------------------------------------------------------------------
37int NextInt(int newMax=0)
38{
39
40 static int N=0;
41 static int nMax=1;
42
43 if(newMax) {nMax = newMax; N=0; return 0;}
44 if (N == nMax) N=0;
45 N = N +1;
46 return N;
47
48}
49
50//--------------------------------------------------------------------------------------------------------------------
51int PlotEMCALQATrendingTree(const char* filename="trending.root",Bool_t SavePlots=0, TString expr ="", TString fTrigger="")
52{
53
54 QAPATH = TString(gSystem->Getenv("QAPATH"));
55 if(QAPATH.IsNull()) QAPATH = QAPATHF;
56
57 Int_t ret=0;
58 TFile* f = TFile::Open(filename);
59 if(!f) { return -1;}
60 TTree* tree = (TTree*)f->Get("trending");
61 if (! tree) {Error("PlotEMCALQATrendingTree","No Tree found!"); return -1;}
62 TFile* fout = new TFile(Form("%s/trendingPlots.root",QAPATH.Data()),"RECREATE");
63
64 TList* TriggersList = new TList();
65 if (fTrigger=="")
66 {
67 tree->Draw("fTrigger","","goff");
68 const char* obj;
69 for(Int_t i = 0 ; i < tree->GetSelectedRows() ; i++){
70 tree->GetEntry(i);
71 obj = tree->GetVar1()->PrintValue(0);
72 if(! TriggersList->FindObject(obj)) {TriggersList->Add(new TObjString(obj));}
73 }
74 }
75 else
76 {
77 if(!fTrigger.Contains("QA")) {fTrigger = "CaloQA_" + fTrigger;}
78 TriggersList->Add(new TObjString(fTrigger.Data()));
79 }
80 TIter next(TriggersList);
81 TObject* obj1;
82 while ((obj1 = next()))
83 {
84 ret = PlotEMCALQATrendingTree(tree,obj1->GetName(),fout,SavePlots,expr);
85 }
86
87 f->Close();
88 return ret;
89
90}
91
92//--------------------------------------------------------------------------------------------------------------------
93int PlotEMCALQATrendingTree(TTree* tree, const char* Trig, TFile* fout, Bool_t SavePlots,TString Expr)
94{
95
96 TCut trig = Form("fTrigger==\"%s\"",Trig);
97 TCut NotZero = TCut("Nevent>0.");
98 TCut select = trig;
99
100 if (Expr.Contains(".C"))
101 {
102 Info("PlotEMCALQATrendingTree",Form("Additional selections from %s: ", Expr.Data()));
103 gInterpreter->ExecuteMacro(Expr.Data());
104 select = trig + expr;
105 }
106
107 if (! tree) {Error("PlotEMCALQATrendingTree","No Tree found!"); return -1;}
108 select.Print();
109 int CurN=0;
110 TString* fCalorimeter;
111 TString* period;
112 TString* pass;
113 TString* fTrigger;
114 TString* system;
115 TDatime* dtime;
116
117 tree->SetBranchAddress("fDate",&dtime);
118 tree->SetBranchAddress("nSM",&CurN);
119 tree->SetBranchAddress("fCalorimeter",&fCalorimeter);
120 tree->SetBranchAddress("system",&system);
121 tree->SetBranchAddress("period",&period);
122 tree->SetBranchAddress("pass",&pass);
123 tree->SetBranchAddress("fTrigger",&fTrigger);
124
125
126 tree->SetEventList(0);
127 tree->Draw(">>elist",select);
128 tree->Draw(">>listNotZero",select+NotZero);
129 TEventList* listNotZero = (TEventList*)gDirectory->Get("listNotZero");
130 TEventList* elist = (TEventList*)gDirectory->Get("elist");
131 tree->SetEventList(elist);
132 if(! elist->GetN()) { Error("PlotEMCALQATrendingTree","The current selection doess not match any entry!"); return -2; }
133 CurN = tree->GetMinimum("nSM");
134 const Int_t n = CurN;
135 tree->GetEntry(elist->GetEntry(0));
136
137 TGraphErrors* AverNclustersSM[n];
138 TGraphErrors* AverNcellsPerClusterSM[n];
139 TGraphErrors* AverESM[n];
140 TGraphErrors* AverMeanSM[n];
141 TGraphErrors* AverWidthSM[n];
142 TGraphErrors* AverNpi0SM[n];
143
144 // --------------------------------- plots ------------------------------
145
146 TString base = QAPATH + period->Data() + "_" + pass->Data() + "_";
147 TPRegexp r("_\\w+");
148
149 TString ClusterAverages ; ClusterAverages = base + "ClAvNew" + (*fTrigger)(r) + ".png";
150 TString Entries; Entries = base + "Nentries" + (*fTrigger)(r) + ".png";
151 TString ClusterAveragesEnergy; ClusterAveragesEnergy = base + "ClAvEne" + (*fTrigger)(r) + ".png";
152 TString ClusterAveragesEnergy2; ClusterAveragesEnergy2 = base + "ClAvEne" + (*fTrigger)(r) + ".pdf";
153 TString ClusterAveragesEntries; ClusterAveragesEntries = base + "ClAvEnt" + (*fTrigger)(r) + ".png";
154 TString ClusterAveragesEntries2; ClusterAveragesEntries2 = base + "ClAvEnt" + (*fTrigger)(r) + ".pdf";
155 TString ClusterAveragesCells; ClusterAveragesCells = base + "ClAvCells" + (*fTrigger)(r) + ".png";
156 TString ClusterAveragesCells2; ClusterAveragesCells2 = base + "ClAvCells" + (*fTrigger)(r) + ".pdf";
157 TString Pi0Entries; Pi0Entries = base + "Pi0Entries" + (*fTrigger)(r) + ".png";
158 TString Pi0Entries2; Pi0Entries2 = base + "Pi0Entries" + (*fTrigger)(r) + ".pdf";
159 TString Pi0Mass; Pi0Mass = base + "Pi0Mass" + (*fTrigger)(r) + ".png";
160 TString Pi0Mass2; Pi0Mass2 = base + "Pi0Mass" + (*fTrigger)(r) + ".pdf";
161 TString Pi0Width; Pi0Width = base + "Pi0Width" + (*fTrigger)(r) + ".png";
162 TString Pi0Width2; Pi0Width2 = base + "Pi0Width" + (*fTrigger)(r) + ".pdf";
163
164
165 int nEmptyRuns = tree->Draw("run","Nevent==0","goff");
166 if (nEmptyRuns && (nEmptyRuns != -1)) {
167 Info("PlotEMCALQATrendingTree",Form("The following %i runs are empty for trigger %s:",nEmptyRuns,Trig));
168 for(Int_t i = 0 ; i < nEmptyRuns ; i++){
169 cout<<tree->GetV1()[i]<<endl;
170 }
171 }
172
173 int nRun = tree->Draw("run","","goff");
174 NextInt(nRun);
175 TH1F* h1 = new TH1F("h1", "dummy", nRun, 0., nRun+0.5);
176 TGaxis::SetMaxDigits(3);
177 h1->SetTitle("") ;
178 h1->SetStats(kFALSE) ;
179 h1->SetAxisRange(0, nRun, "X") ;
180 h1->GetXaxis()->SetTitle("RUN Index");
181 h1->GetXaxis()->SetTitleOffset(1.86);
182 h1->GetXaxis()->SetTitleSize(0.03);
183
184 for(Int_t i = 0 ; i < nRun ; i++){
185 TString label = " ";
186 label+=tree->GetV1()[i];
187 h1->GetXaxis()->SetBinLabel(i+1,label.Data());
188 h1->GetXaxis()->LabelsOption("v");
189 }
190
191 //number of events
192 TCanvas* c1 = new TCanvas("Nevents","Nb of events", 1000, 500);
193 c1->SetFillColor(0);
194 c1->SetBorderSize(0);
195 c1->SetFrameBorderMode(0);
196 gStyle->SetOptStat(0);
197 gPad->SetLeftMargin(0.08);
198 gPad->SetRightMargin(0.02);
199 c1->SetGrid();
200 tree->Draw("NextInt():Nevent","","goff");
201 h1->GetYaxis()->SetTitle("N_{events}");
202 ZoomFromTree(h1,tree,n,"Nevent",2);
203 if (h1->GetMinimum() > 0.) {c1->SetLogy();}
204 h1->Draw();
205
206 TGraph* Nevents = new TGraph(tree->GetSelectedRows(), tree->GetV1(), tree->GetV2());
207 Nevents->SetMarkerStyle(20);
208 Nevents->SetMarkerColor(1);
209 Nevents->SetLineColor(2);
210 Nevents->Draw("same lp") ;
211
212 c1->Update();
213 if(SavePlots) c1->SaveAs(Entries);
214
215 TCanvas* c2 = new TCanvas("ClusterAveragesEvents", "Mean Nb of Cluster per Event", 1000, 500);
216 c2->SetFillColor(0);
217 c2->SetBorderSize(0);
218 c2->SetFrameBorderMode(0);
219 c2->SetGrid();
220
221 gPad->SetLeftMargin(0.08);
222 gPad->SetRightMargin(0.02);
223 gPad->SetGrid();
224
225 TH1F* h2 = (TH1F*)h1->Clone("");
226 h2->GetYaxis()->SetTitle("<N_{clusters}>/event");
227 ZoomFromTree(h2,tree,n,"ClusterMeanSM");
228 h2->GetXaxis()->SetTitle("RUN Index");
229 h2->GetXaxis()->SetTitleOffset(1.86);
230 h2->GetXaxis()->SetTitleSize(0.03);
231 h2->Draw();
232
233 tree->Draw("NextInt():ClusterMean:xe:ClusterRMS","","goff");
234 TGraphErrors * AverNclusters = new TGraphErrors(tree->GetSelectedRows(), tree->GetV1(), tree->GetV2(),tree->GetV3(), tree->GetV4());
235 AverNclusters->SetMarkerStyle(20);
236 AverNclusters->SetMarkerColor(1);
237 AverNclusters->Draw("same P") ;
238
239 for(Int_t ism = 0 ; ism < n ; ism++){
240 tree->Draw(Form("NextInt():ClusterMeanSM[%i]:xe:ClusterRMSSM[%i]",ism,ism),"","goff");
241 AverNclustersSM[ism] = new TGraphErrors(tree->GetSelectedRows(), tree->GetV1(), tree->GetV2(),tree->GetV3(),tree->GetV4());
242 if (ism !=8)AverNclustersSM[ism]->SetMarkerColor(ism<10?ism+2:ism+1);else AverNclustersSM[ism]->SetMarkerColor(7);
243 AverNclustersSM[ism]->SetMarkerStyle(21+(ism<10 ? ism: ism-10));
244
245 AverNclustersSM[ism]->Draw("same P");
246 }
247
248 TLegend* l2 = new TLegend(0.123, 0.744, 0.933, 0.894);
249 l2->SetNColumns((n+1)/2.);
250 l2->SetFillColor(0);
251 l2->SetBorderSize(0);
252 l2->SetTextSize(0.04);
253 l2->SetHeader(Form("<# of clusters> in %s (period %s trigger %s)",fCalorimeter->Data(),period->Data(),((*fTrigger)(r)).Data()));
254 l2->AddEntry(AverNclusters,"average", "p");
255 for(Int_t ism = 0 ; ism < n ; ism++){
256 TString projname = Form("SM %d",ism);
257 l2->AddEntry(AverNclustersSM[ism],projname.Data(), "p");
258 }
259 l2->Draw("same");
260 c2->Update();
261 if(SavePlots) c2->SaveAs(ClusterAveragesEntries);
262 if(SavePlots==2) c2->SaveAs(ClusterAveragesEntries2);
263
264 TCanvas* c3 = new TCanvas("ClusterAveragesEnergy", "Mean Cluster Energy", 1000, 500);
265 c3->SetFillColor(0);
266 c3->SetBorderSize(0);
267 c3->SetFrameBorderMode(0);
268 c3->SetGrid();
269
270 gPad->SetLeftMargin(0.08);
271 gPad->SetRightMargin(0.02);
272 gPad->SetGrid();
273
274 TH1F* h3 = (TH1F*)h1->Clone("");
275 h3->GetYaxis()->SetTitle("<E> (GeV)");
276 ZoomFromTree(h3,tree,n,"EtotalMeanSM");
277 h3->GetXaxis()->SetTitle("RUN Index");
278 h3->GetXaxis()->SetTitleOffset(1.86);
279 h3->GetXaxis()->SetTitleSize(0.03);
280 h3->Draw();
281
282 tree->Draw("NextInt():EtotalMean:xe:EtotalRMS","","goff");
283 TGraphErrors * AverE = new TGraphErrors(tree->GetSelectedRows(), tree->GetV1(), tree->GetV2(),tree->GetV3(),tree->GetV4());
284 AverE->SetMarkerStyle(20);
285 AverE->SetMarkerColor(1);
286 AverE->Draw("same P");
287
288 for(Int_t ism = 0 ; ism < n ; ism++){
289
290 tree->Draw(Form("NextInt():EtotalMeanSM[%i]:xe:EtotalRMSSM[%i]",ism,ism),"","goff");
291 AverESM[ism] = new TGraphErrors(tree->GetSelectedRows(), tree->GetV1(), tree->GetV2(),tree->GetV3(),tree->GetV4());
292 if (ism !=8)AverESM[ism]->SetMarkerColor(ism<10?ism+2:ism+1);else AverESM[ism]->SetMarkerColor(7);
293 AverESM[ism]->SetMarkerStyle(21+(ism<10 ? ism: ism-10));
294 AverESM[ism]->Draw("same P");
295
296 }
297
298 TLegend* l3 = new TLegend(0.123, 0.744, 0.933, 0.894);
299 l3->SetNColumns((n+1)/2.);
300 l3->SetFillColor(0);
301 l3->SetBorderSize(0);
302 l3->SetTextSize(0.04);
303 l3->SetHeader(Form("<E> in %s (period %s trigger %s)",fCalorimeter->Data(),period->Data(),((*fTrigger)(r)).Data()));
304 l3->AddEntry(AverE,"average", "p");
305 for(Int_t ism = 0 ; ism < n ; ism++){
306 TString projname = Form("SM %d",ism);
307 l3->AddEntry(AverESM[ism],projname.Data(), "p");
308 }
309 l3->Draw("same");
310
311 if(SavePlots) c3->SaveAs(ClusterAveragesEnergy);
312 if(SavePlots==2) c3->SaveAs(ClusterAveragesEnergy2);
313
314 TCanvas* c4 = new TCanvas("ClusterAveragesCells", "Mean Nb of Cells per Cluster", 1000, 500);
315 c4->SetFillColor(0);
316 c4->SetBorderSize(0);
317 c4->SetFrameBorderMode(0);
318 c4->SetGrid();
319
320 gPad->SetLeftMargin(0.08);
321 gPad->SetRightMargin(0.02);
322 gPad->SetGrid();
323
324 TH1F* h4 = (TH1F*)h1->Clone("");
325 h4->GetYaxis()->SetTitle("<N_{CellsPerCluster}>");
326 ZoomFromTree(h4,tree,n,"CellPerClusterMeanSM");
327 h4->GetXaxis()->SetTitle("RUN Index");
328 h4->GetXaxis()->SetTitleOffset(1.86);
329 h4->GetXaxis()->SetTitleSize(0.03);
330 h4->Draw();
331
332 //
333 tree->Draw("NextInt():CellPerClusterMean:xe:CellPerClusterRMS","","goff");
334 TGraphErrors * AverCellPerCluster = new TGraphErrors(tree->GetSelectedRows(), tree->GetV1(), tree->GetV2(),tree->GetV3(),tree->GetV4());
335 AverCellPerCluster->SetMarkerStyle(20);
336 AverCellPerCluster->SetMarkerColor(1);
337
338 for(Int_t ism = 0 ; ism < n ; ism++){
339 tree->Draw(Form("NextInt():CellPerClusterMeanSM[%i]:xe:CellPerClusterRMSSM[%i]",ism,ism),"","goff");
340 AverNcellsPerClusterSM[ism] = new TGraphErrors(tree->GetSelectedRows(), tree->GetV1(), tree->GetV2(),tree->GetV3(),tree->GetV4());
341 if (ism !=8)AverNcellsPerClusterSM[ism]->SetMarkerColor(ism<10?ism+2:ism+1);else AverNcellsPerClusterSM[ism]->SetMarkerColor(7);
342 AverNcellsPerClusterSM[ism]->SetMarkerStyle(21+(ism<10 ? ism: ism-10));
343 AverNcellsPerClusterSM[ism]->Draw("same P");
344
345 }
346
347 TLegend* l4 = new TLegend(0.123, 0.744, 0.933, 0.894);
348 l4->SetNColumns((n+1)/2.);
349 l4->SetFillColor(0);
350 l4->SetBorderSize(0);
351 l4->SetTextSize(0.04);
352 l4->SetHeader(Form("<# of cells per cluster> in %s (period %s trigger %s)",fCalorimeter->Data(),period->Data(),((*fTrigger)(r)).Data()));
353 l4->AddEntry(AverCellPerCluster,"average", "p");
354 for(Int_t ism = 0 ; ism < n ; ism++){
355 TString projname = Form("SM %d",ism);
356 l4->AddEntry(AverNcellsPerClusterSM[ism],projname.Data(), "p");
357 }
358 l4->Draw("same");
359
360 if(SavePlots) c4->SaveAs(ClusterAveragesCells);
361
362 TCanvas* c5 = new TCanvas("Pi0Position", "Mean Pi0 Mass", 1000, 500);
363 c5->SetFillColor(0);
364 c5->SetBorderSize(0);
365 c5->SetFrameBorderMode(0);
366 c5->SetGrid();
367
368 gStyle->SetOptStat(0);
369
370 gPad->SetLeftMargin(0.08);
371 gPad->SetRightMargin(0.02);
372 gPad->SetGrid();
373
374 TH1F * h5 = (TH1F*)h1->Clone("");
375 ZoomFromTree(h5,tree,n,"MeanPosSM");
376 h5->GetXaxis()->SetTitle("RUN Index");
377 h5->GetXaxis()->SetTitleOffset(1.86);
378 h5->GetXaxis()->SetTitleSize(0.03);
379 h5->GetYaxis()->SetTitle("Mean_{#pi^{0}}");
380
381 h5->Draw();
382
383 tree->Draw("NextInt():MeanPos:xe:MeanPosErr","","goff");
384 TGraphErrors * AverMean = new TGraphErrors(tree->GetSelectedRows(), tree->GetV1(), tree->GetV2(),tree->GetV3(),tree->GetV4());
385 AverMean->SetMarkerStyle(20);
386 AverMean->SetMarkerColor(1);
387 AverMean->Draw("same P");
388
389 for(Int_t ism = 0 ; ism < n ; ism++){
390
391 tree->Draw(Form("NextInt():MeanPosSM[%i]:xe:MeanPosErrSM[%i]",ism,ism),"","goff");
392 AverMeanSM[ism] = new TGraphErrors(tree->GetSelectedRows(), tree->GetV1(), tree->GetV2(),tree->GetV3(),tree->GetV4());
393 if (ism !=8)AverMeanSM[ism]->SetMarkerColor(ism<10?ism+2:ism+1);else AverMeanSM[ism]->SetMarkerColor(7);
394 AverMeanSM[ism]->SetMarkerStyle(21+(ism<10 ? ism: ism-10));
395 AverMeanSM[ism]->Draw("same P");
396 }
397
398
399 TLegend* l5 = new TLegend(0.123, 0.744, 0.933, 0.894);
400 l5->SetNColumns((n+1)/2.);
401 l5->SetFillColor(0);
402 l5->SetBorderSize(0);
403 l5->SetTextSize(0.04);
404 l5->SetHeader(Form("<M_{#pi^{0}}> (MeV) in %s (period %s trigger %s)",fCalorimeter->Data(),period->Data(),((*fTrigger)(r)).Data()));
405 l5->AddEntry(AverMean,"average", "p");
406 for(Int_t ism = 0 ; ism < n ; ism++){
407 TString projname = Form("SM %d",ism);
408 l5->AddEntry(AverMeanSM[ism],projname.Data(), "p");
409 }
410 l5->Draw("same");
411
412 c5->Update();
413 if(SavePlots) c5->SaveAs(Pi0Mass);
414
415
416 TCanvas* c6 = new TCanvas("Pi0Width", "Mean Pi0 Width", 1000, 500);
417 c6->SetFillColor(0);
418 c6->SetBorderSize(0);
419 c6->SetFrameBorderMode(0);
420 c6->SetGrid();
421
422 gPad->SetLeftMargin(0.08);
423 gPad->SetRightMargin(0.02);
424 gPad->SetGrid();
425
426 TH1F* h6 = (TH1F*)h1->Clone("");
427 ZoomFromTree(h6,tree,n,"WidthSM");
428 h6->GetXaxis()->SetTitle("RUN Index");
429 h6->GetXaxis()->SetTitleOffset(1.86);
430 h6->GetXaxis()->SetTitleSize(0.03);
431 h6->GetYaxis()->SetTitle("#sigma_{#pi^{0}}");
432 h6->Draw();
433
434 tree->Draw("NextInt():Width:xe:WidthErr","","goff");
435 TGraphErrors * AverWidth = new TGraphErrors(tree->GetSelectedRows(), tree->GetV1(), tree->GetV2(),tree->GetV3(),tree->GetV4());
436 AverWidth->SetMarkerStyle(20);
437 AverWidth->SetMarkerColor(1);
438 AverWidth->Draw("same P");
439
440 for(Int_t ism = 0 ; ism < n ; ism++){
441 tree->Draw(Form("NextInt():WidthSM[%i]:xe:WidthErrSM[%i]",ism,ism),"","goff");
442 AverWidthSM[ism] = new TGraphErrors(tree->GetSelectedRows(), tree->GetV1(), tree->GetV2(),tree->GetV3(),tree->GetV4());
443 if (ism !=8)AverWidthSM[ism]->SetMarkerColor(ism<10?ism+2:ism+1);else AverWidthSM[ism]->SetMarkerColor(7);
444 AverWidthSM[ism]->SetMarkerStyle(21+(ism<10 ? ism: ism-10));
445 AverWidthSM[ism]->Draw("same P");
446 }
447
448
449 TLegend* l6 = new TLegend(0.123, 0.744, 0.933, 0.894);
450 l6->SetNColumns((n+1)/2.);
451 l6->SetFillColor(0);
452 l6->SetBorderSize(0);
453 l6->SetTextSize(0.04);
454 l6->SetHeader(Form("#sigma_{#pi^{0}} in %s (period %s trigger %s)",fCalorimeter->Data(),period->Data(),((*fTrigger)(r)).Data()));
455 l6->AddEntry(AverWidth,"total", "p");
456 for(Int_t ism = 0 ; ism < n ; ism++){
457 TString projname = Form("SM %d",ism);
458 l6->AddEntry(AverWidthSM[ism],projname.Data(), "p");
459 }
460 l6->Draw("same");
461 c6->Update();
462 if(SavePlots) c6->SaveAs(Pi0Width);
463
464 TCanvas* c7 = new TCanvas("Npi0", "Mean Nb of Pi0", 1000, 500);
465 c7->SetFillColor(0);
466 c7->SetBorderSize(0);
467 c7->SetFrameBorderMode(0);
468 c7->SetGrid();
469
470 gPad->SetLeftMargin(0.08);
471 gPad->SetRightMargin(0.02);
472 gPad->SetGrid();
473
474 TH1F* h7 = (TH1F*)h1->Clone("");
475 ZoomFromTree(h7,tree,n,"Npi0SM");
476 if (h7->GetMinimum() > 0.) {c7->SetLogy();}
477 h7->GetXaxis()->SetTitle("RUN Index");
478 h7->GetXaxis()->SetTitleOffset(1.86);
479 h7->GetXaxis()->SetTitleSize(0.03);
480 h7->GetYaxis()->SetTitle("<N_{#pi^{0}}>/event");
481 h7->Draw();
482
483 tree->Draw("NextInt():Npi0:xe:Npi0Err","","goff");
484 if (tree->GetMinimum("Npi0") > 1) c4->SetLogy();
485 TGraphErrors * AverNpi0 = new TGraphErrors(tree->GetSelectedRows(), tree->GetV1(), tree->GetV2(),tree->GetV3(),tree->GetV4());
486 AverNpi0->SetMarkerStyle(20);
487 AverNpi0->SetMarkerColor(1);
488 AverNpi0->Draw("same P");
489
490 for(Int_t ism = 0 ; ism < n ; ism++){
491 tree->Draw(Form("NextInt():Npi0SM[%i]:xe:Npi0ErrSM[%i]",ism,ism),"","goff");
492 AverNpi0SM[ism] = new TGraphErrors(tree->GetSelectedRows(), tree->GetV1(), tree->GetV2(),tree->GetV3(),tree->GetV4());
493 if (ism !=8)AverNpi0SM[ism]->SetMarkerColor(ism<10?ism+2:ism+1);else AverNpi0SM[ism]->SetMarkerColor(7);
494 AverNpi0SM[ism]->SetMarkerStyle(21+(ism<10 ? ism: ism-10));
495 AverNpi0SM[ism]->Draw("same P");
496 }
497
498 TLegend* l7 = new TLegend(0.123, 0.744, 0.933, 0.894);
499 l7->SetNColumns((n+1)/2.);
500 l7->SetFillColor(0);
501 l7->SetBorderSize(0);
502 l7->SetTextSize(0.04);
503 l7->SetHeader(Form("<N_{#pi^{0}}>/event in %s (period %s trigger %s)",fCalorimeter->Data(),period->Data(),((*fTrigger)(r)).Data()));
504 l7->AddEntry(AverNpi0,"total", "p");
505 for(Int_t ism = 0 ; ism < n ; ism++){
506 TString projname = Form("SM %d",ism);
507 l7->AddEntry(AverNpi0SM[ism],projname.Data(), "p");
508 }
509 l7->Draw("same");
510 c7->Update();
511 if(SavePlots) c7->SaveAs(Pi0Entries);
512 if(SavePlots==2) c7->SaveAs(Pi0Entries2);
513
514 fout->mkdir(Form("%s/%s/%s/%s",period->Data(),pass->Data(),"TrendingQA",fTrigger->Data()));
515 fout->cd();
516 fout->Cd(Form("%s/%s/%s/%s",period->Data(),pass->Data(),"TrendingQA",fTrigger->Data()));
517
518 gROOT->GetListOfCanvases()->Write();
519 gROOT->GetListOfCanvases()->Delete();
520
521 if((!Expr.IsNull()) && (!Expr.EndsWith(".root"))) elist->Write();
522 if(listNotZero) {listNotZero->Reset();}
523 if(elist) {elist->Reset();}
524 delete h1;
525
526 return 0;
527
528}
529
530//---------------------------------------------------------------------------------------------
531TH1F* ZoomFromTree(TH1F* h, TTree* atree, Int_t n, const char* aVar, UShort_t aScaleFactor)
532{
533
534 atree->SetEventList(0);
535 TEventList *listNotZero = (TEventList*)gDirectory->Get("listNotZero");
536 atree->SetEventList(listNotZero);
537
538 double treeMin = GetTreeMinimum(atree,n,aVar);
539 double treeMax = GetTreeMaximum(atree,n,aVar);
540 double offset = 30*((treeMax - treeMin)/(100.*aScaleFactor));
541
542 if(treeMin != -treeMax){
543 h->SetMinimum(TMath::Max(0.,treeMin-offset));
544 h->SetMaximum(treeMax+2*offset);
545 }
546
547 atree->SetEventList(0);
548 TEventList *elist = (TEventList*)gDirectory->Get("elist");
549 atree->SetEventList(elist);
550
551 return h;
552
553}
554
555//--------------------------------------------------------------------------------------------
556Double_t GetTreeMinimum(TTree* aTree,Int_t n, const char* columname)
557{
558
559 TLeaf* leaf = aTree->GetLeaf(columname);
560 if (!leaf) {
561 return 0;
562 }
563 TBranch* branch = leaf->GetBranch();
564 Double_t cmin = 3.40282e+38;
565 for (Long64_t i = 0; i < aTree->GetEntries(); ++i) {
566 Long64_t entryNumber = aTree->GetEntryNumber(i);
567 if (entryNumber < 0) break;
568 branch->GetEntry(entryNumber);
569 for (Int_t j = 0;j < TMath::Min(leaf->GetLen(),n); ++j) {
570 Double_t val = leaf->GetValue(j);
571 if (val < cmin) {
572 cmin = val;
573 }
574 }
575 }
576
577 return cmin;
578
579}
580
581//______________________________________________________________________________
582Double_t GetTreeMaximum(TTree* aTree,Int_t n,const char* columname)
583{
584
585 TLeaf* leaf = aTree->GetLeaf(columname);
586 if (!leaf) {
587 return 0;
588 }
589 TBranch* branch = leaf->GetBranch();
590 Double_t cmax = - 3.40282e+38;
591 for (Long64_t i = 0; i < aTree->GetEntries(); ++i) {
592 Long64_t entryNumber = aTree->GetEntryNumber(i);
593 if (entryNumber < 0) break;
594 branch->GetEntry(entryNumber);
595 for (Int_t j = 0; j < TMath::Min(leaf->GetLen(),n); ++j) {
596 Double_t val = leaf->GetValue(j);
597 if (val > cmax) {
598 cmax = val;
599 }
600 }
601 }
602
603 return cmax;
604
605}
606