1 /************************************************************************
3 V0 QA Post-processing Macro
4 ---------------------------
6 To be used in conjunction with AliAnalysisTaskQAV0.cxx, .h
7 Designed for visualization of the QA output from this task.
9 Creates a "summary pdf" file with several pages, each referring to
10 some aspect of the QA, including:
13 --- Topological Variables
14 --- Invariant Mass Peak Widths (resolution)
15 --- TPC dE/dx for daughters
17 ************************************************************************/
20 DrawV0QAPlots01(Bool_t lAttemptInvMassFit = kTRUE){
21 CustomGStyleSettings();
23 //==============================================================
25 TFile* file = TFile::Open("AnalysisResults.root", "READ");
27 cout<<"Output file not found!"<<endl;
30 file->cd("PWGLFQAV0_QA");
31 TList* clist = (TList*)file->FindObjectAny("clist");
33 cout<<"File does not seem to hold QA list output!"<<endl;
36 //==============================================================
38 //==============================================================
39 //Open Event Histogram: first canvas
40 TH1D* fHistEvent = (TH1D*)clist->FindObject("fHistEvent");
41 TCanvas *cHistEvent = new TCanvas("cHistEvent","",800,670);
42 cHistEvent->SetTopMargin(0.15);
43 cHistEvent->SetGridx();
44 cHistEvent->SetGridy();
47 fHistEvent->SetMarkerSize(1.35);
48 fHistEvent->GetXaxis()->SetTitleOffset(1.2);
49 fHistEvent->GetYaxis()->SetTitleOffset(1.2);
50 fHistEvent->Draw("same text00");
55 Tl.DrawLatex(.35, .9277, "Event Counters") ;
56 cHistEvent->SaveAs("V0_QA.pdf(");
57 //==============================================================
59 //==============================================================
60 //Invariant Mass Plots: Base, no dE/dx
62 TH2D *f2dHistInvMassK0Short = (TH2D*)clist->FindObject("f2dHistInvMassK0Short");
63 TH2D *f2dHistInvMassLambda = (TH2D*)clist->FindObject("f2dHistInvMassLambda");
64 TH2D *f2dHistInvMassAntiLambda = (TH2D*)clist->FindObject("f2dHistInvMassAntiLambda");
66 f2dHistInvMassK0Short -> Scale ( 1. / ((Double_t)fHistEvent->GetBinContent(4) ) );
67 f2dHistInvMassLambda -> Scale ( 1. / ((Double_t)fHistEvent->GetBinContent(4) ) );
68 f2dHistInvMassAntiLambda -> Scale ( 1. / ((Double_t)fHistEvent->GetBinContent(4) ) );
70 TCanvas *cInvMassK0Short = new TCanvas ( "cInvMassK0Short", "", 1200,800);
71 cInvMassK0Short->Divide(1,2);
72 cInvMassK0Short->cd(2)->Divide(3,1);
73 cInvMassK0Short->cd(1);
74 cInvMassK0Short->cd(1)->SetLogz();
75 cInvMassK0Short->cd(1)->SetLeftMargin(0.065);
76 cInvMassK0Short->cd(1)->SetTopMargin(0.13);
77 cInvMassK0Short->cd(1)->SetBottomMargin(0.11);
79 f2dHistInvMassK0Short->GetYaxis()->SetTitleSize(0.05);
80 f2dHistInvMassK0Short->GetYaxis()->SetTitleOffset(0.6);
81 f2dHistInvMassK0Short->GetXaxis()->SetTitleSize(0.05);
82 f2dHistInvMassK0Short->GetXaxis()->SetTitle("p_{T} (GeV/c)");
83 f2dHistInvMassK0Short->GetZaxis()->SetTitle("Counts / Event");
84 f2dHistInvMassK0Short->GetZaxis()->SetTitleOffset(0.7);
85 f2dHistInvMassK0Short->GetZaxis()->SetRangeUser( f2dHistInvMassK0Short->GetMinimum(1e-10)*0.9, f2dHistInvMassK0Short->GetMaximum()*1.2 );
86 f2dHistInvMassK0Short->Draw("colz");
87 Tl.DrawLatex(.35, .9277, "Mass under K^{0}_{S} hypothesis, no TPC dE/dx") ;
89 TH1D *fLowPtK0ShortSample = (TH1D*) f2dHistInvMassK0Short->ProjectionY( "fLowPtK0ShortSample",
90 f2dHistInvMassK0Short->GetXaxis()->FindBin(0.5001),
91 f2dHistInvMassK0Short->GetXaxis()->FindBin(0.9999) );
93 TH1D *fMidPtK0ShortSample = (TH1D*) f2dHistInvMassK0Short->ProjectionY( "fMidPtK0ShortSample",
94 f2dHistInvMassK0Short->GetXaxis()->FindBin(1.5001),
95 f2dHistInvMassK0Short->GetXaxis()->FindBin(2.4999) );
97 TH1D *fHiPtK0ShortSample = (TH1D*) f2dHistInvMassK0Short->ProjectionY( "fHiPtK0ShortSample",
98 f2dHistInvMassK0Short->GetXaxis()->FindBin(5.0001),
99 f2dHistInvMassK0Short->GetXaxis()->FindBin(9.9999) );
101 for(Int_t ic = 1; ic<4; ic++){
102 cInvMassK0Short->cd(2)->cd(ic)->SetTopMargin(0.14);
103 cInvMassK0Short->cd(2)->cd(ic)->SetLeftMargin(0.15);
104 cInvMassK0Short->cd(2)->cd(ic)->SetBottomMargin(0.11);
105 cInvMassK0Short->cd(2)->cd(ic)->SetGridx();
106 cInvMassK0Short->cd(2)->cd(ic)->SetGridy();
109 cInvMassK0Short->cd(2)->cd(1);
110 fLowPtK0ShortSample->GetXaxis()->SetTitleOffset(1.1);
111 fLowPtK0ShortSample->GetYaxis()->SetTitleOffset(2.33);
112 fLowPtK0ShortSample->GetYaxis()->SetTitle("Counts/Event");
113 fLowPtK0ShortSample->Draw();
114 Tl.DrawLatex(.25, .9277, "0.5 < p_{T} (GeV/c^{2}) < 1.0");
116 cInvMassK0Short->cd(2)->cd(2);
117 fMidPtK0ShortSample->GetXaxis()->SetTitleOffset(1.1);
118 fMidPtK0ShortSample->GetYaxis()->SetTitleOffset(2.33);
119 fMidPtK0ShortSample->GetYaxis()->SetTitle("Counts/Event");
120 fMidPtK0ShortSample->Draw();
121 Tl.DrawLatex(.25, .9277, "1.5 < p_{T} (GeV/c^{2}) < 2.5");
123 cInvMassK0Short->cd(2)->cd(3);
124 fHiPtK0ShortSample->GetXaxis()->SetTitleOffset(1.1);
125 fHiPtK0ShortSample->GetYaxis()->SetTitleOffset(2.33);
126 fHiPtK0ShortSample->GetYaxis()->SetTitle("Counts/Event");
127 fHiPtK0ShortSample->Draw();
128 Tl.DrawLatex(.25, .9277, "5 < p_{T} (GeV/c^{2}) < 10");
129 cInvMassK0Short->SaveAs("V0_QA.pdf");
131 //==============================================================
133 //==============================================================
134 //Invariant Mass Plots: WITH dE/dx
135 TH2D *f2dHistInvMassWithdEdxK0Short = (TH2D*)clist->FindObject("f2dHistInvMassWithdEdxK0Short");
136 TH2D *f2dHistInvMassWithdEdxLambda = (TH2D*)clist->FindObject("f2dHistInvMassWithdEdxLambda");
137 TH2D *f2dHistInvMassWithdEdxAntiLambda = (TH2D*)clist->FindObject("f2dHistInvMassWithdEdxAntiLambda");
139 f2dHistInvMassWithdEdxK0Short -> Scale ( 1. / ((Double_t)fHistEvent->GetBinContent(4) ) );
140 f2dHistInvMassWithdEdxLambda -> Scale ( 1. / ((Double_t)fHistEvent->GetBinContent(4) ) );
141 f2dHistInvMassWithdEdxAntiLambda -> Scale ( 1. / ((Double_t)fHistEvent->GetBinContent(4) ) );
143 TCanvas *cInvMassK0ShortWithdEdx = new TCanvas ( "cInvMassK0ShortWithdEdx", "", 1200,800);
144 cInvMassK0ShortWithdEdx->Divide(1,2);
145 cInvMassK0ShortWithdEdx->cd(2)->Divide(3,1);
146 cInvMassK0ShortWithdEdx->cd(1);
147 cInvMassK0ShortWithdEdx->cd(1)->SetLogz();
148 cInvMassK0ShortWithdEdx->cd(1)->SetLeftMargin(0.065);
149 cInvMassK0ShortWithdEdx->cd(1)->SetTopMargin(0.13);
150 cInvMassK0ShortWithdEdx->cd(1)->SetBottomMargin(0.11);
152 f2dHistInvMassWithdEdxK0Short->GetYaxis()->SetTitleSize(0.05);
153 f2dHistInvMassWithdEdxK0Short->GetYaxis()->SetTitleOffset(0.6);
154 f2dHistInvMassWithdEdxK0Short->GetXaxis()->SetTitleSize(0.05);
155 f2dHistInvMassWithdEdxK0Short->GetXaxis()->SetTitle("p_{T} (GeV/c)");
156 f2dHistInvMassWithdEdxK0Short->GetZaxis()->SetTitle("Counts / Event");
157 f2dHistInvMassWithdEdxK0Short->GetZaxis()->SetTitleOffset(0.7);
158 f2dHistInvMassWithdEdxK0Short->GetZaxis()->SetRangeUser( f2dHistInvMassWithdEdxK0Short->GetMinimum(1e-10)*0.9, f2dHistInvMassWithdEdxK0Short->GetMaximum()*1.2 );
159 f2dHistInvMassWithdEdxK0Short->Draw("colz");
160 Tl.DrawLatex(.35, .9277, "Mass under K^{0}_{S} hypothesis, With TPC dE/dx") ;
162 TH1D *fLowPtK0ShortSampleWithdEdx = (TH1D*) f2dHistInvMassWithdEdxK0Short->ProjectionY( "fLowPtK0ShortSampleWithdEdx",
163 f2dHistInvMassWithdEdxK0Short->GetXaxis()->FindBin(0.5001),
164 f2dHistInvMassWithdEdxK0Short->GetXaxis()->FindBin(0.9999) );
166 TH1D *fMidPtK0ShortSampleWithdEdx = (TH1D*) f2dHistInvMassWithdEdxK0Short->ProjectionY( "fMidPtK0ShortSampleWithdEdx",
167 f2dHistInvMassWithdEdxK0Short->GetXaxis()->FindBin(1.5001),
168 f2dHistInvMassWithdEdxK0Short->GetXaxis()->FindBin(2.4999) );
170 TH1D *fHiPtK0ShortSampleWithdEdx = (TH1D*) f2dHistInvMassWithdEdxK0Short->ProjectionY( "fHiPtK0ShortSampleWithdEdx",
171 f2dHistInvMassWithdEdxK0Short->GetXaxis()->FindBin(5.0001),
172 f2dHistInvMassWithdEdxK0Short->GetXaxis()->FindBin(9.9999) );
174 for(Int_t ic = 1; ic<4; ic++){
175 cInvMassK0ShortWithdEdx->cd(2)->cd(ic)->SetTopMargin(0.14);
176 cInvMassK0ShortWithdEdx->cd(2)->cd(ic)->SetLeftMargin(0.15);
177 cInvMassK0ShortWithdEdx->cd(2)->cd(ic)->SetBottomMargin(0.11);
178 cInvMassK0ShortWithdEdx->cd(2)->cd(ic)->SetGridx();
179 cInvMassK0ShortWithdEdx->cd(2)->cd(ic)->SetGridy();
182 cInvMassK0ShortWithdEdx->cd(2)->cd(1);
183 fLowPtK0ShortSampleWithdEdx->GetXaxis()->SetTitleOffset(1.1);
184 fLowPtK0ShortSampleWithdEdx->GetYaxis()->SetTitleOffset(2.33);
185 fLowPtK0ShortSampleWithdEdx->GetYaxis()->SetTitle("Counts/Event");
186 fLowPtK0ShortSampleWithdEdx->Draw();
187 Tl.DrawLatex(.25, .9277, "0.5 < p_{T} (GeV/c^{2}) < 1.0");
189 cInvMassK0ShortWithdEdx->cd(2)->cd(2);
190 fMidPtK0ShortSampleWithdEdx->GetXaxis()->SetTitleOffset(1.1);
191 fMidPtK0ShortSampleWithdEdx->GetYaxis()->SetTitleOffset(2.33);
192 fMidPtK0ShortSampleWithdEdx->GetYaxis()->SetTitle("Counts/Event");
193 fMidPtK0ShortSampleWithdEdx->Draw();
194 Tl.DrawLatex(.25, .9277, "1.5 < p_{T} (GeV/c^{2}) < 2.5");
196 cInvMassK0ShortWithdEdx->cd(2)->cd(3);
197 fHiPtK0ShortSampleWithdEdx->GetXaxis()->SetTitleOffset(1.1);
198 fHiPtK0ShortSampleWithdEdx->GetYaxis()->SetTitleOffset(2.33);
199 fHiPtK0ShortSampleWithdEdx->GetYaxis()->SetTitle("Counts/Event");
200 fHiPtK0ShortSampleWithdEdx->Draw();
201 Tl.DrawLatex(.25, .9277, "5 < p_{T} (GeV/c^{2}) < 10");
205 Tli.SetTextSize(0.05);
207 if( lAttemptInvMassFit ){
208 //Attempt rough signal extraction
209 TF1 *f1 = new TF1("f1","[0]+[1]*x+[2]*x*x+[3]*TMath::Gaus(x,[4],[5])",0.435, 0.565);
210 //Reasonable first guess
211 f1->SetParameter(0, fLowPtK0ShortSampleWithdEdx -> GetBinContent( fLowPtK0ShortSampleWithdEdx->FindBin(0.497-0.01) ) );
212 f1->SetParameter(1, 0 );
213 f1->SetParameter(2, 0 );
214 f1->SetParameter(3, 0.5*fLowPtK0ShortSampleWithdEdx->GetMaximum() );
215 f1->SetParameter(4, 0.497);
216 f1->SetParameter(5, 0.0045);
217 cout<<"Will now fit, please wait!"<<endl;
218 fLowPtK0ShortSampleWithdEdx->Fit("f1","REM0");
219 cInvMassK0ShortWithdEdx->cd(2)->cd(1);
221 //Peak Position, Width: printout
222 fLowPtK0ShortSampleWithdEdx->GetYaxis()->SetRangeUser(0,fLowPtK0ShortSampleWithdEdx->GetMaximum() * 1.2);
223 Tli.DrawLatex(0.2,0.8,Form("peak = %.4f #pm %.4f MeV/c^{2}",f1->GetParameter(4),f1->GetParameter(5)) ) ;
225 //Attempt rough signal extraction
226 TF1 *f2 = new TF1("f2","[0]+[1]*x+[2]*x*x+[3]*TMath::Gaus(x,[4],[5])",0.375, 0.635);
227 //Reasonable first guess
228 f2->SetParameter(0, fMidPtK0ShortSampleWithdEdx -> GetBinContent( fMidPtK0ShortSampleWithdEdx->FindBin(0.497-0.01) ) );
229 f2->SetParameter(1, 0 );
230 f2->SetParameter(2, 0 );
231 f2->SetParameter(3, 0.5*fMidPtK0ShortSampleWithdEdx->GetMaximum() );
232 f2->SetParameter(4, 0.497);
233 f2->SetParameter(5, 0.0045);
234 cout<<"Will now fit, please wait!"<<endl;
235 fMidPtK0ShortSampleWithdEdx->Fit("f2","REM0");
236 cInvMassK0ShortWithdEdx->cd(2)->cd(2);
238 //Peak Position, Width: printout
239 fMidPtK0ShortSampleWithdEdx->GetYaxis()->SetRangeUser(0,fMidPtK0ShortSampleWithdEdx->GetMaximum() * 1.2);
240 Tli.DrawLatex(0.2,0.8,Form("peak = %.4f #pm %.4f MeV/c^{2}",f2->GetParameter(4),f2->GetParameter(5)) ) ;
242 //Attempt rough signal extraction
243 TF1 *f3 = new TF1("f3","[0]+[1]*x+[2]*x*x+[3]*TMath::Gaus(x,[4],[5])",0.375, 0.665);
244 //Reasonable first guess
245 f3->SetParameter(0, fHiPtK0ShortSampleWithdEdx -> GetBinContent( fHiPtK0ShortSampleWithdEdx->FindBin(0.497-0.01) ) );
246 f3->SetParameter(1, 0 );
247 f3->SetParameter(2, 0 );
248 f3->SetParameter(3, 0.5*fHiPtK0ShortSampleWithdEdx->GetMaximum() );
249 f3->SetParameter(4, 0.497);
250 f3->SetParameter(5, 0.0045);
251 cout<<"Will now fit, please wait!"<<endl;
252 fHiPtK0ShortSampleWithdEdx->Fit("f3","REM0");
253 cInvMassK0ShortWithdEdx->cd(2)->cd(3);
255 //Peak Position, Width: printout
256 fHiPtK0ShortSampleWithdEdx->GetYaxis()->SetRangeUser(0,fHiPtK0ShortSampleWithdEdx->GetMaximum() * 1.2);
257 Tli.DrawLatex(0.2,0.8,Form("peak = %.4f #pm %.4f MeV/c^{2}",f3->GetParameter(4),f3->GetParameter(5)) ) ;
260 cInvMassK0ShortWithdEdx->SaveAs("V0_QA.pdf");
261 //==============================================================
264 //==============================================================
265 //Invariant Mass Plots: Base, no dE/dx
267 TCanvas *cInvMassLambda = new TCanvas ( "cInvMassLambda", "", 1200,800);
268 cInvMassLambda->Divide(1,2);
269 cInvMassLambda->cd(2)->Divide(3,1);
270 cInvMassLambda->cd(1);
271 cInvMassLambda->cd(1)->SetLogz();
272 cInvMassLambda->cd(1)->SetLeftMargin(0.065);
273 cInvMassLambda->cd(1)->SetTopMargin(0.13);
274 cInvMassLambda->cd(1)->SetBottomMargin(0.11);
276 f2dHistInvMassLambda->GetYaxis()->SetTitleSize(0.05);
277 f2dHistInvMassLambda->GetYaxis()->SetTitleOffset(0.6);
278 f2dHistInvMassLambda->GetXaxis()->SetTitleSize(0.05);
279 f2dHistInvMassLambda->GetXaxis()->SetTitle("p_{T} (GeV/c)");
280 f2dHistInvMassLambda->GetZaxis()->SetTitle("Counts / Event");
281 f2dHistInvMassLambda->GetZaxis()->SetTitleOffset(0.7);
282 f2dHistInvMassLambda->GetZaxis()->SetRangeUser( f2dHistInvMassLambda->GetMinimum(1e-10)*0.9, f2dHistInvMassLambda->GetMaximum()*1.2 );
283 f2dHistInvMassLambda->Draw("colz");
284 Tl.DrawLatex(.35, .9277, "Mass under #Lambda hypothesis, no TPC dE/dx") ;
286 TH1D *fLowPtLambdaSample = (TH1D*) f2dHistInvMassLambda->ProjectionY( "fLowPtLambdaSample",
287 f2dHistInvMassLambda->GetXaxis()->FindBin(0.5001),
288 f2dHistInvMassLambda->GetXaxis()->FindBin(0.9999) );
290 TH1D *fMidPtLambdaSample = (TH1D*) f2dHistInvMassLambda->ProjectionY( "fMidPtLambdaSample",
291 f2dHistInvMassLambda->GetXaxis()->FindBin(1.5001),
292 f2dHistInvMassLambda->GetXaxis()->FindBin(2.4999) );
294 TH1D *fHiPtLambdaSample = (TH1D*) f2dHistInvMassLambda->ProjectionY( "fHiPtLambdaSample",
295 f2dHistInvMassLambda->GetXaxis()->FindBin(5.0001),
296 f2dHistInvMassLambda->GetXaxis()->FindBin(9.9999) );
298 for(Int_t ic = 1; ic<4; ic++){
299 cInvMassLambda->cd(2)->cd(ic)->SetTopMargin(0.14);
300 cInvMassLambda->cd(2)->cd(ic)->SetLeftMargin(0.15);
301 cInvMassLambda->cd(2)->cd(ic)->SetBottomMargin(0.11);
302 cInvMassLambda->cd(2)->cd(ic)->SetGridx();
303 cInvMassLambda->cd(2)->cd(ic)->SetGridy();
306 cInvMassLambda->cd(2)->cd(1);
307 fLowPtLambdaSample->GetXaxis()->SetTitleOffset(1.1);
308 fLowPtLambdaSample->GetYaxis()->SetTitleOffset(2.33);
309 fLowPtLambdaSample->GetYaxis()->SetTitle("Counts/Event");
310 fLowPtLambdaSample->Draw();
311 Tl.DrawLatex(.25, .9277, "0.5 < p_{T} (GeV/c^{2}) < 1.0");
313 cInvMassLambda->cd(2)->cd(2);
314 fMidPtLambdaSample->GetXaxis()->SetTitleOffset(1.1);
315 fMidPtLambdaSample->GetYaxis()->SetTitleOffset(2.33);
316 fMidPtLambdaSample->GetYaxis()->SetTitle("Counts/Event");
317 fMidPtLambdaSample->Draw();
318 Tl.DrawLatex(.25, .9277, "1.5 < p_{T} (GeV/c^{2}) < 2.5");
320 cInvMassLambda->cd(2)->cd(3);
321 fHiPtLambdaSample->GetXaxis()->SetTitleOffset(1.1);
322 fHiPtLambdaSample->GetYaxis()->SetTitleOffset(2.33);
323 fHiPtLambdaSample->GetYaxis()->SetTitle("Counts/Event");
324 fHiPtLambdaSample->Draw();
325 Tl.DrawLatex(.25, .9277, "5 < p_{T} (GeV/c^{2}) < 10");
326 cInvMassLambda->SaveAs("V0_QA.pdf");
328 //==============================================================
330 //==============================================================
331 //Invariant Mass Plots: WITH dE/dx
332 TCanvas *cInvMassLambdaWithdEdx = new TCanvas ( "cInvMassLambdaWithdEdx", "", 1200,800);
333 cInvMassLambdaWithdEdx->Divide(1,2);
334 cInvMassLambdaWithdEdx->cd(2)->Divide(3,1);
335 cInvMassLambdaWithdEdx->cd(1);
336 cInvMassLambdaWithdEdx->cd(1)->SetLogz();
337 cInvMassLambdaWithdEdx->cd(1)->SetLeftMargin(0.065);
338 cInvMassLambdaWithdEdx->cd(1)->SetTopMargin(0.13);
339 cInvMassLambdaWithdEdx->cd(1)->SetBottomMargin(0.11);
341 f2dHistInvMassWithdEdxLambda->GetYaxis()->SetTitleSize(0.05);
342 f2dHistInvMassWithdEdxLambda->GetYaxis()->SetTitleOffset(0.6);
343 f2dHistInvMassWithdEdxLambda->GetXaxis()->SetTitleSize(0.05);
344 f2dHistInvMassWithdEdxLambda->GetXaxis()->SetTitle("p_{T} (GeV/c)");
345 f2dHistInvMassWithdEdxLambda->GetZaxis()->SetTitle("Counts / Event");
346 f2dHistInvMassWithdEdxLambda->GetZaxis()->SetTitleOffset(0.7);
347 f2dHistInvMassWithdEdxLambda->GetZaxis()->SetRangeUser( f2dHistInvMassWithdEdxLambda->GetMinimum(1e-10)*0.9, f2dHistInvMassWithdEdxLambda->GetMaximum()*1.2 );
348 f2dHistInvMassWithdEdxLambda->Draw("colz");
349 Tl.DrawLatex(.35, .9277, "Mass under #Lambda hypothesis, With TPC dE/dx") ;
351 TH1D *fLowPtLambdaSampleWithdEdx = (TH1D*) f2dHistInvMassWithdEdxLambda->ProjectionY( "fLowPtLambdaSampleWithdEdx",
352 f2dHistInvMassWithdEdxLambda->GetXaxis()->FindBin(0.5001),
353 f2dHistInvMassWithdEdxLambda->GetXaxis()->FindBin(0.9999) );
355 TH1D *fMidPtLambdaSampleWithdEdx = (TH1D*) f2dHistInvMassWithdEdxLambda->ProjectionY( "fMidPtLambdaSampleWithdEdx",
356 f2dHistInvMassWithdEdxLambda->GetXaxis()->FindBin(1.5001),
357 f2dHistInvMassWithdEdxLambda->GetXaxis()->FindBin(2.4999) );
359 TH1D *fHiPtLambdaSampleWithdEdx = (TH1D*) f2dHistInvMassWithdEdxLambda->ProjectionY( "fHiPtLambdaSampleWithdEdx",
360 f2dHistInvMassWithdEdxLambda->GetXaxis()->FindBin(5.0001),
361 f2dHistInvMassWithdEdxLambda->GetXaxis()->FindBin(9.9999) );
363 for(Int_t ic = 1; ic<4; ic++){
364 cInvMassLambdaWithdEdx->cd(2)->cd(ic)->SetTopMargin(0.14);
365 cInvMassLambdaWithdEdx->cd(2)->cd(ic)->SetLeftMargin(0.15);
366 cInvMassLambdaWithdEdx->cd(2)->cd(ic)->SetBottomMargin(0.11);
367 cInvMassLambdaWithdEdx->cd(2)->cd(ic)->SetGridx();
368 cInvMassLambdaWithdEdx->cd(2)->cd(ic)->SetGridy();
371 cInvMassLambdaWithdEdx->cd(2)->cd(1);
372 fLowPtLambdaSampleWithdEdx->GetXaxis()->SetTitleOffset(1.1);
373 fLowPtLambdaSampleWithdEdx->GetYaxis()->SetTitleOffset(2.33);
374 fLowPtLambdaSampleWithdEdx->GetYaxis()->SetTitle("Counts/Event");
375 fLowPtLambdaSampleWithdEdx->Draw();
376 Tl.DrawLatex(.25, .9277, "0.5 < p_{T} (GeV/c^{2}) < 1.0");
378 cInvMassLambdaWithdEdx->cd(2)->cd(2);
379 fMidPtLambdaSampleWithdEdx->GetXaxis()->SetTitleOffset(1.1);
380 fMidPtLambdaSampleWithdEdx->GetYaxis()->SetTitleOffset(2.33);
381 fMidPtLambdaSampleWithdEdx->GetYaxis()->SetTitle("Counts/Event");
382 fMidPtLambdaSampleWithdEdx->Draw();
383 Tl.DrawLatex(.25, .9277, "1.5 < p_{T} (GeV/c^{2}) < 2.5");
385 cInvMassLambdaWithdEdx->cd(2)->cd(3);
386 fHiPtLambdaSampleWithdEdx->GetXaxis()->SetTitleOffset(1.1);
387 fHiPtLambdaSampleWithdEdx->GetYaxis()->SetTitleOffset(2.33);
388 fHiPtLambdaSampleWithdEdx->GetYaxis()->SetTitle("Counts/Event");
389 fHiPtLambdaSampleWithdEdx->Draw();
390 Tl.DrawLatex(.25, .9277, "5 < p_{T} (GeV/c^{2}) < 10");
392 if( lAttemptInvMassFit ){
393 //Attempt rough signal extraction
394 TF1 *fl1 = new TF1("fl1","[0]+[1]*x+[2]*x*x+[3]*TMath::Gaus(x,[4],[5])",1.095, 1.14);
395 //Reasonable first guess
396 fl1->SetParameter(0, fLowPtLambdaSampleWithdEdx -> GetBinContent( fLowPtLambdaSampleWithdEdx->FindBin(1.116+0.01) ) );
397 fl1->SetParameter(1, 0 );
398 fl1->SetParameter(2, 0 );
399 fl1->SetParameter(3, 0.35*fLowPtLambdaSampleWithdEdx->GetMaximum() );
400 fl1->SetParameter(4, 1.115683);
401 fl1->SetParLimits(4,1.116-0.01,1.116+0.01);
402 fl1->SetParameter(5, 0.002);
403 fl1->SetParLimits(5,0.0005,0.01);
404 cout<<"Will now fit, please wait!"<<endl;
405 fLowPtLambdaSampleWithdEdx->Fit("fl1","REM0");
406 cInvMassLambdaWithdEdx->cd(2)->cd(1);
408 //Peak Position, Width: printout
409 fLowPtLambdaSampleWithdEdx->GetYaxis()->SetRangeUser(0,fLowPtLambdaSampleWithdEdx->GetMaximum() * 1.2);
410 Tli.DrawLatex(0.2,0.8,Form("peak = %.4f #pm %.4f MeV/c^{2}",fl1->GetParameter(4),fl1->GetParameter(5)) ) ;
412 //Attempt rough signal extraction
413 TF1 *fl2 = new TF1("fl2","[0]+[1]*x+[2]*x*x+[3]*TMath::Gaus(x,[4],[5])",1.085, 1.15);
414 //Reasonable first guess
415 fl2->SetParameter(0, fMidPtLambdaSampleWithdEdx -> GetBinContent( fMidPtLambdaSampleWithdEdx->FindBin(1.116+0.01) ) );
416 fl2->SetParameter(1, 0 );
417 fl2->SetParameter(2, 0 );
418 fl2->SetParameter(3, 0.6*fMidPtLambdaSampleWithdEdx->GetMaximum() );
419 fl2->SetParLimits(4,1.116-0.01,1.116+0.01);
420 fl2->SetParameter(4, 1.116);
421 fl2->SetParameter(5, 0.0025);
422 fl2->SetParLimits(5,0.0005,0.01);
423 cout<<"Will now fit, please wait!"<<endl;
424 fMidPtLambdaSampleWithdEdx->Fit("fl2","REM0");
425 cInvMassLambdaWithdEdx->cd(2)->cd(2);
427 //Peak Position, Width: printout
428 fMidPtLambdaSampleWithdEdx->GetYaxis()->SetRangeUser(0,fMidPtLambdaSampleWithdEdx->GetMaximum() * 1.2);
429 Tli.DrawLatex(0.2,0.8,Form("peak = %.4f #pm %.4f MeV/c^{2}",fl2->GetParameter(4),fl2->GetParameter(5)) ) ;
431 //Attempt rough signal extraction
432 TF1 *fl3 = new TF1("fl3","[0]+[1]*x+[2]*x*x+[3]*TMath::Gaus(x,[4],[5])",1.095, 1.15);
433 //Reasonable first guess
434 fl3->SetParameter(0, fHiPtLambdaSampleWithdEdx -> GetBinContent( fHiPtLambdaSampleWithdEdx->FindBin(1.116+0.01) ) );
435 fl3->SetParameter(1, 0 );
436 fl3->SetParameter(2, 0 );
437 fl3->SetParameter(3, 0.6*fHiPtLambdaSampleWithdEdx->GetMaximum() );
438 fl3->SetParameter(4, 1.116);
439 fl3->SetParLimits(4,1.116-0.005,1.116+0.005);
440 fl3->SetParameter(5, 0.0035);
441 fl3->SetParLimits(5,0.0005,0.01);
442 cout<<"Will now fit, please wait!"<<endl;
443 fHiPtLambdaSampleWithdEdx->Fit("fl3","REM0");
444 cInvMassLambdaWithdEdx->cd(2)->cd(3);
446 //Peak Position, Width: printout
447 fHiPtLambdaSampleWithdEdx->GetYaxis()->SetRangeUser(0,fHiPtLambdaSampleWithdEdx->GetMaximum() * 1.2);
448 Tli.DrawLatex(0.2,0.8,Form("peak = %.4f #pm %.4f MeV/c^{2}",fl3->GetParameter(4),fl3->GetParameter(5)) ) ;
455 cInvMassLambdaWithdEdx->SaveAs("V0_QA.pdf");
456 //==============================================================
458 //==============================================================
459 //Invariant Mass Plots: Base, no dE/dx
461 TCanvas *cInvMassAntiLambda = new TCanvas ( "cInvMassAntiLambda", "", 1200,800);
462 cInvMassAntiLambda->Divide(1,2);
463 cInvMassAntiLambda->cd(2)->Divide(3,1);
464 cInvMassAntiLambda->cd(1);
465 cInvMassAntiLambda->cd(1)->SetLogz();
466 cInvMassAntiLambda->cd(1)->SetLeftMargin(0.065);
467 cInvMassAntiLambda->cd(1)->SetTopMargin(0.13);
468 cInvMassAntiLambda->cd(1)->SetBottomMargin(0.11);
470 f2dHistInvMassAntiLambda->GetYaxis()->SetTitleSize(0.05);
471 f2dHistInvMassAntiLambda->GetYaxis()->SetTitleOffset(0.6);
472 f2dHistInvMassAntiLambda->GetXaxis()->SetTitleSize(0.05);
473 f2dHistInvMassAntiLambda->GetXaxis()->SetTitle("p_{T} (GeV/c)");
474 f2dHistInvMassAntiLambda->GetZaxis()->SetTitle("Counts / Event");
475 f2dHistInvMassAntiLambda->GetZaxis()->SetTitleOffset(0.7);
476 f2dHistInvMassAntiLambda->GetZaxis()->SetRangeUser( f2dHistInvMassAntiLambda->GetMinimum(1e-10)*0.9, f2dHistInvMassAntiLambda->GetMaximum()*1.2 );
477 f2dHistInvMassAntiLambda->Draw("colz");
478 Tl.DrawLatex(.35, .9277, "Mass under #bar{#Lambda} hypothesis, no TPC dE/dx") ;
480 TH1D *fLowPtAntiLambdaSample = (TH1D*) f2dHistInvMassAntiLambda->ProjectionY( "fLowPtAntiLambdaSample",
481 f2dHistInvMassAntiLambda->GetXaxis()->FindBin(0.5001),
482 f2dHistInvMassAntiLambda->GetXaxis()->FindBin(0.9999) );
484 TH1D *fMidPtAntiLambdaSample = (TH1D*) f2dHistInvMassAntiLambda->ProjectionY( "fMidPtAntiLambdaSample",
485 f2dHistInvMassAntiLambda->GetXaxis()->FindBin(1.5001),
486 f2dHistInvMassAntiLambda->GetXaxis()->FindBin(2.4999) );
488 TH1D *fHiPtAntiLambdaSample = (TH1D*) f2dHistInvMassAntiLambda->ProjectionY( "fHiPtAntiLambdaSample",
489 f2dHistInvMassAntiLambda->GetXaxis()->FindBin(5.0001),
490 f2dHistInvMassAntiLambda->GetXaxis()->FindBin(9.9999) );
492 for(Int_t ic = 1; ic<4; ic++){
493 cInvMassAntiLambda->cd(2)->cd(ic)->SetTopMargin(0.14);
494 cInvMassAntiLambda->cd(2)->cd(ic)->SetLeftMargin(0.15);
495 cInvMassAntiLambda->cd(2)->cd(ic)->SetBottomMargin(0.11);
496 cInvMassAntiLambda->cd(2)->cd(ic)->SetGridx();
497 cInvMassAntiLambda->cd(2)->cd(ic)->SetGridy();
500 cInvMassAntiLambda->cd(2)->cd(1);
501 fLowPtAntiLambdaSample->GetXaxis()->SetTitleOffset(1.1);
502 fLowPtAntiLambdaSample->GetYaxis()->SetTitleOffset(2.33);
503 fLowPtAntiLambdaSample->GetYaxis()->SetTitle("Counts/Event");
504 fLowPtAntiLambdaSample->Draw();
505 Tl.DrawLatex(.25, .9277, "0.5 < p_{T} (GeV/c^{2}) < 1.0");
507 cInvMassAntiLambda->cd(2)->cd(2);
508 fMidPtAntiLambdaSample->GetXaxis()->SetTitleOffset(1.1);
509 fMidPtAntiLambdaSample->GetYaxis()->SetTitleOffset(2.33);
510 fMidPtAntiLambdaSample->GetYaxis()->SetTitle("Counts/Event");
511 fMidPtAntiLambdaSample->Draw();
512 Tl.DrawLatex(.25, .9277, "1.5 < p_{T} (GeV/c^{2}) < 2.5");
514 cInvMassAntiLambda->cd(2)->cd(3);
515 fHiPtAntiLambdaSample->GetXaxis()->SetTitleOffset(1.1);
516 fHiPtAntiLambdaSample->GetYaxis()->SetTitleOffset(2.33);
517 fHiPtAntiLambdaSample->GetYaxis()->SetTitle("Counts/Event");
518 fHiPtAntiLambdaSample->Draw();
519 Tl.DrawLatex(.25, .9277, "5 < p_{T} (GeV/c^{2}) < 10");
520 cInvMassAntiLambda->SaveAs("V0_QA.pdf");
522 //==============================================================
524 //==============================================================
525 //Invariant Mass Plots: WITH dE/dx
526 TCanvas *cInvMassAntiLambdaWithdEdx = new TCanvas ( "cInvMassAntiLambdaWithdEdx", "", 1200,800);
527 cInvMassAntiLambdaWithdEdx->Divide(1,2);
528 cInvMassAntiLambdaWithdEdx->cd(2)->Divide(3,1);
529 cInvMassAntiLambdaWithdEdx->cd(1);
530 cInvMassAntiLambdaWithdEdx->cd(1)->SetLogz();
531 cInvMassAntiLambdaWithdEdx->cd(1)->SetLeftMargin(0.065);
532 cInvMassAntiLambdaWithdEdx->cd(1)->SetTopMargin(0.13);
533 cInvMassAntiLambdaWithdEdx->cd(1)->SetBottomMargin(0.11);
535 f2dHistInvMassWithdEdxAntiLambda->GetYaxis()->SetTitleSize(0.05);
536 f2dHistInvMassWithdEdxAntiLambda->GetYaxis()->SetTitleOffset(0.6);
537 f2dHistInvMassWithdEdxAntiLambda->GetXaxis()->SetTitleSize(0.05);
538 f2dHistInvMassWithdEdxAntiLambda->GetXaxis()->SetTitle("p_{T} (GeV/c)");
539 f2dHistInvMassWithdEdxAntiLambda->GetZaxis()->SetTitle("Counts / Event");
540 f2dHistInvMassWithdEdxAntiLambda->GetZaxis()->SetTitleOffset(0.7);
541 f2dHistInvMassWithdEdxAntiLambda->GetZaxis()->SetRangeUser( f2dHistInvMassWithdEdxAntiLambda->GetMinimum(1e-10)*0.9, f2dHistInvMassWithdEdxAntiLambda->GetMaximum()*1.2 );
542 f2dHistInvMassWithdEdxAntiLambda->Draw("colz");
543 Tl.DrawLatex(.35, .9277, "Mass under #bar{#Lambda} hypothesis, With TPC dE/dx") ;
545 TH1D *fLowPtAntiLambdaSampleWithdEdx = (TH1D*) f2dHistInvMassWithdEdxAntiLambda->ProjectionY( "fLowPtAntiLambdaSampleWithdEdx",
546 f2dHistInvMassWithdEdxAntiLambda->GetXaxis()->FindBin(0.5001),
547 f2dHistInvMassWithdEdxAntiLambda->GetXaxis()->FindBin(0.9999) );
549 TH1D *fMidPtAntiLambdaSampleWithdEdx = (TH1D*) f2dHistInvMassWithdEdxAntiLambda->ProjectionY( "fMidPtAntiLambdaSampleWithdEdx",
550 f2dHistInvMassWithdEdxAntiLambda->GetXaxis()->FindBin(1.5001),
551 f2dHistInvMassWithdEdxAntiLambda->GetXaxis()->FindBin(2.4999) );
553 TH1D *fHiPtAntiLambdaSampleWithdEdx = (TH1D*) f2dHistInvMassWithdEdxAntiLambda->ProjectionY( "fHiPtAntiLambdaSampleWithdEdx",
554 f2dHistInvMassWithdEdxAntiLambda->GetXaxis()->FindBin(5.0001),
555 f2dHistInvMassWithdEdxAntiLambda->GetXaxis()->FindBin(9.9999) );
557 for(Int_t ic = 1; ic<4; ic++){
558 cInvMassAntiLambdaWithdEdx->cd(2)->cd(ic)->SetTopMargin(0.14);
559 cInvMassAntiLambdaWithdEdx->cd(2)->cd(ic)->SetLeftMargin(0.15);
560 cInvMassAntiLambdaWithdEdx->cd(2)->cd(ic)->SetBottomMargin(0.11);
561 cInvMassAntiLambdaWithdEdx->cd(2)->cd(ic)->SetGridx();
562 cInvMassAntiLambdaWithdEdx->cd(2)->cd(ic)->SetGridy();
565 cInvMassAntiLambdaWithdEdx->cd(2)->cd(1);
566 fLowPtAntiLambdaSampleWithdEdx->GetXaxis()->SetTitleOffset(1.1);
567 fLowPtAntiLambdaSampleWithdEdx->GetYaxis()->SetTitleOffset(2.33);
568 fLowPtAntiLambdaSampleWithdEdx->GetYaxis()->SetTitle("Counts/Event");
569 fLowPtAntiLambdaSampleWithdEdx->Draw();
570 Tl.DrawLatex(.25, .9277, "0.5 < p_{T} (GeV/c^{2}) < 1.0");
572 cInvMassAntiLambdaWithdEdx->cd(2)->cd(2);
573 fMidPtAntiLambdaSampleWithdEdx->GetXaxis()->SetTitleOffset(1.1);
574 fMidPtAntiLambdaSampleWithdEdx->GetYaxis()->SetTitleOffset(2.33);
575 fMidPtAntiLambdaSampleWithdEdx->GetYaxis()->SetTitle("Counts/Event");
576 fMidPtAntiLambdaSampleWithdEdx->Draw();
577 Tl.DrawLatex(.25, .9277, "1.5 < p_{T} (GeV/c^{2}) < 2.5");
579 cInvMassAntiLambdaWithdEdx->cd(2)->cd(3);
580 fHiPtAntiLambdaSampleWithdEdx->GetXaxis()->SetTitleOffset(1.1);
581 fHiPtAntiLambdaSampleWithdEdx->GetYaxis()->SetTitleOffset(2.33);
582 fHiPtAntiLambdaSampleWithdEdx->GetYaxis()->SetTitle("Counts/Event");
583 fHiPtAntiLambdaSampleWithdEdx->Draw();
584 Tl.DrawLatex(.25, .9277, "5 < p_{T} (GeV/c^{2}) < 10");
586 if( lAttemptInvMassFit ){
587 //Attempt rough signal extraction
588 TF1 *fal1 = new TF1("fal1","[0]+[1]*x+[2]*x*x+[3]*TMath::Gaus(x,[4],[5])",1.095, 1.14);
589 //Reasonable first guess
590 fal1->SetParameter(0, fLowPtAntiLambdaSampleWithdEdx -> GetBinContent( fLowPtAntiLambdaSampleWithdEdx->FindBin(1.116+0.01) ) );
591 fal1->SetParameter(1, 0 );
592 fal1->SetParameter(2, 0 );
593 fal1->SetParameter(3, 0.35*fLowPtAntiLambdaSampleWithdEdx->GetMaximum() );
594 fal1->SetParameter(4, 1.115683);
595 fal1->SetParLimits(4,1.116-0.01,1.116+0.01);
596 fal1->SetParameter(5, 0.002);
597 fal1->SetParLimits(5,0.0005,0.01);
598 cout<<"Will now fit, please wait!"<<endl;
599 fLowPtAntiLambdaSampleWithdEdx->Fit("fal1","REM0");
600 cInvMassAntiLambdaWithdEdx->cd(2)->cd(1);
602 //Peak Position, Width: printout
603 fLowPtAntiLambdaSampleWithdEdx->GetYaxis()->SetRangeUser(0,fLowPtAntiLambdaSampleWithdEdx->GetMaximum() * 1.2);
604 Tli.DrawLatex(0.2,0.8,Form("peak = %.4f #pm %.4f MeV/c^{2}",fal1->GetParameter(4),fal1->GetParameter(5)) ) ;
606 //Attempt rough signal extraction
607 TF1 *fal2 = new TF1("fal2","[0]+[1]*x+[2]*x*x+[3]*TMath::Gaus(x,[4],[5])",1.085, 1.15);
608 //Reasonable first guess
609 fal2->SetParameter(0, fMidPtAntiLambdaSampleWithdEdx -> GetBinContent( fMidPtAntiLambdaSampleWithdEdx->FindBin(1.116+0.01) ) );
610 fal2->SetParameter(1, 0 );
611 fal2->SetParameter(2, 0 );
612 fal2->SetParameter(3, 0.6*fMidPtAntiLambdaSampleWithdEdx->GetMaximum() );
613 fal2->SetParLimits(4,1.116-0.01,1.116+0.01);
614 fal2->SetParameter(4, 1.116);
615 fal2->SetParameter(5, 0.0025);
616 fal2->SetParLimits(5,0.0005,0.01);
617 cout<<"Will now fit, please wait!"<<endl;
618 fMidPtAntiLambdaSampleWithdEdx->Fit("fal2","REM0");
619 cInvMassAntiLambdaWithdEdx->cd(2)->cd(2);
621 //Peak Position, Width: printout
622 fMidPtAntiLambdaSampleWithdEdx->GetYaxis()->SetRangeUser(0,fMidPtAntiLambdaSampleWithdEdx->GetMaximum() * 1.2);
623 Tli.DrawLatex(0.2,0.8,Form("peak = %.4f #pm %.4f MeV/c^{2}",fal2->GetParameter(4),fal2->GetParameter(5)) ) ;
625 //Attempt rough signal extraction
626 TF1 *fal3 = new TF1("fal3","[0]+[1]*x+[2]*x*x+[3]*TMath::Gaus(x,[4],[5])",1.095, 1.15);
627 //Reasonable first guess
628 fal3->SetParameter(0, fHiPtAntiLambdaSampleWithdEdx -> GetBinContent( fHiPtAntiLambdaSampleWithdEdx->FindBin(1.116+0.01) ) );
629 fal3->SetParameter(1, 0 );
630 fal3->SetParameter(2, 0 );
631 fal3->SetParameter(3, 0.6*fHiPtAntiLambdaSampleWithdEdx->GetMaximum() );
632 fal3->SetParameter(4, 1.116);
633 fal3->SetParLimits(4,1.116-0.005,1.116+0.005);
634 fal3->SetParameter(5, 0.0035);
635 fal3->SetParLimits(5,0.0005,0.01);
636 cout<<"Will now fit, please wait!"<<endl;
637 fHiPtAntiLambdaSampleWithdEdx->Fit("fal3","REM0");
638 cInvMassAntiLambdaWithdEdx->cd(2)->cd(3);
640 //Peak Position, Width: printout
641 fHiPtAntiLambdaSampleWithdEdx->GetYaxis()->SetRangeUser(0,fHiPtAntiLambdaSampleWithdEdx->GetMaximum() * 1.2);
642 Tli.DrawLatex(0.2,0.8,Form("peak = %.4f #pm %.4f MeV/c^{2}",fal3->GetParameter(4),fal3->GetParameter(5)) ) ;
646 cInvMassAntiLambdaWithdEdx->SaveAs("V0_QA.pdf");
647 //==============================================================
649 //==============================================================
650 // Strict Lambda Analysis for dE/dx Calibration Check
651 TH2D *f2dHistdEdxSignalPionFromLambda = (TH2D*)clist->FindObject("f2dHistdEdxSignalPionFromLambda");
652 TH2D *f2dHistdEdxSignalProtonFromLambda = (TH2D*)clist->FindObject("f2dHistdEdxSignalProtonFromLambda");
653 TH2D *f2dHistResponsePionFromLambda = (TH2D*)clist->FindObject("f2dHistResponsePionFromLambda");
654 TH2D *f2dHistResponseProtonFromLambda = (TH2D*)clist->FindObject("f2dHistResponseProtonFromLambda");
656 f2dHistdEdxSignalPionFromLambda->Rebin2D(2,10);
657 f2dHistdEdxSignalProtonFromLambda->Rebin2D(2,10);
660 TH1D *fLowPtPionResponse = (TH1D*) f2dHistResponsePionFromLambda->ProjectionY( "fLowPtPionResponse",
661 f2dHistResponsePionFromLambda->GetXaxis()->FindBin(0.5001),
662 f2dHistResponsePionFromLambda->GetXaxis()->FindBin(0.9999) );
664 TH1D *fMidPtPionResponse = (TH1D*) f2dHistResponsePionFromLambda->ProjectionY( "fMidPtPionResponse",
665 f2dHistResponsePionFromLambda->GetXaxis()->FindBin(1.5001),
666 f2dHistResponsePionFromLambda->GetXaxis()->FindBin(2.4999) );
668 TH1D *fLowPtProtonResponse = (TH1D*) f2dHistResponseProtonFromLambda->ProjectionY( "fLowPtProtonResponse",
669 f2dHistResponseProtonFromLambda->GetXaxis()->FindBin(0.5001),
670 f2dHistResponseProtonFromLambda->GetXaxis()->FindBin(0.9999) );
672 TH1D *fMidPtProtonResponse = (TH1D*) f2dHistResponseProtonFromLambda->ProjectionY( "fMidPtProtonResponse",
673 f2dHistResponseProtonFromLambda->GetXaxis()->FindBin(1.5001),
674 f2dHistResponseProtonFromLambda->GetXaxis()->FindBin(2.4999) );
678 TCanvas *cdEdxPure = new TCanvas("cdEdxPure","",1500,800);
679 cdEdxPure->Divide(4,2);
681 for(Int_t ic = 1; ic<9; ic++){
682 cdEdxPure->SetLeftMargin(0.15);
683 cdEdxPure->cd(ic)->SetLogz();
684 //cdEdxPure->cd(ic)->SetTopMargin(0.133);
685 if( ic%4 == 1 || ic%4 == 2){
686 cdEdxPure->cd(ic)->SetRightMargin(0.133);
688 if( ic%4 != 1 && ic%4 != 2){
689 cdEdxPure->cd(ic)->SetGridx();
690 cdEdxPure->cd(ic)->SetGridy();
697 f2dHistdEdxSignalPionFromLambda->Draw("colz");
699 f2dHistResponsePionFromLambda->Draw("colz");
701 fLowPtPionResponse->Draw();
703 fMidPtPionResponse->Draw();
706 f2dHistdEdxSignalProtonFromLambda->Draw("colz");
708 f2dHistResponseProtonFromLambda->Draw("colz");
710 fLowPtProtonResponse->Draw();
712 fMidPtProtonResponse->Draw();
716 //Write explanations on canvases
717 cdEdxPure->cd(1); Tl.DrawLatex(.25, .9277, "#pi^{-} from #Lambda: TPC Signal");
718 cdEdxPure->cd(2); Tl.DrawLatex(.15, .9277, "#pi^{-} from #Lambda: AliPIDResponse Value");
719 cdEdxPure->cd(3); Tl.DrawLatex(.21, .9277, "#pi^{-} N#sigma, 0.5 < p_{T} (GeV/c) < 1.0");
720 cdEdxPure->cd(4); Tl.DrawLatex(.21, .9277, "#pi^{-} N#sigma, 1.5 < p_{T} (GeV/c) < 2.5");
722 cdEdxPure->cd(5); Tl.DrawLatex(.25, .9277, "p from #Lambda: TPC Signal");
723 cdEdxPure->cd(6); Tl.DrawLatex(.15, .9277, "p from #Lambda: AliPIDResponse Value");
724 cdEdxPure->cd(7); Tl.DrawLatex(.21, .9277, "p N#sigma, 0.5 < p_{T} (GeV/c) < 1.0");
725 cdEdxPure->cd(8); Tl.DrawLatex(.21, .9277, "p N#sigma, 1.5 < p_{T} (GeV/c) < 2.5");
727 Double_t lLowPtPeakPion = fLowPtPionResponse->GetBinCenter( fLowPtPionResponse->GetMaximumBin() );
728 Double_t lMidPtPeakPion = fMidPtPionResponse->GetBinCenter( fMidPtPionResponse->GetMaximumBin() );
729 Double_t lLowPtPeakProton = fLowPtProtonResponse->GetBinCenter( fLowPtProtonResponse->GetMaximumBin() );
730 Double_t lMidPtPeakProton = fMidPtProtonResponse->GetBinCenter( fMidPtProtonResponse->GetMaximumBin() );
732 //List Maximal Values
733 cout<<"Maximal Value for pion from Lambda at low pt...............: " <<lLowPtPeakPion<<endl;
734 cout<<"Maximal Value for pion from Lambda at mid pt...............: " <<lMidPtPeakPion<<endl;
735 cout<<"Maximal Value for proton from Lambda at low pt.............: " <<lLowPtPeakProton<<endl;
736 cout<<"Maximal Value for proton from Lambda at mid pt.............: " <<lMidPtPeakProton<<endl;
738 if( TMath::Abs( lLowPtPeakPion ) > 0.3) cout<<"*** WARNING: Check Low Pt pion PID Response! ***"<<endl;
739 if( TMath::Abs( lMidPtPeakPion ) > 0.3) cout<<"*** WARNING: Check Mid Pt pion PID Response! ***"<<endl;
740 if( TMath::Abs( lLowPtPeakProton ) > 0.3) cout<<"*** WARNING: Check Low Pt proton PID Response! ***"<<endl;
741 if( TMath::Abs( lMidPtPeakProton ) > 0.3) cout<<"*** WARNING: Check Mid Pt proton PID Response! ***"<<endl;
745 Tlq.SetTextSize(0.06);
747 //Draw Arrows to be sure!
748 Double_t lFractionHeight = 0.33;
750 TArrow *ar1 = new TArrow(lLowPtPeakPion,lFractionHeight * fLowPtPionResponse->GetMaximum(),lLowPtPeakPion,0.0, 0.008 ,"|>");
751 ar1->SetLineWidth(2);
753 if( TMath::Abs( lLowPtPeakPion ) < 0.3) {
755 Tlq.DrawLatex ( 0.15,0.8, "OK!");
757 Tlq.SetTextColor(kRed);
758 Tlq.DrawLatex ( 0.15,0.8, "Prob.! Check dEd/x!");
762 TArrow *ar2 = new TArrow(lMidPtPeakPion,lFractionHeight * fMidPtPionResponse->GetMaximum(),lLowPtPeakPion,0.0, 0.008 ,"|>");
763 ar2->SetLineWidth(2);
765 if( TMath::Abs( lMidPtPeakPion ) < 0.3) {
767 Tlq.DrawLatex ( 0.15,0.8, "OK!");
769 Tlq.SetTextColor(kRed);
770 Tlq.DrawLatex ( 0.15,0.8, "Prob.! Check dEd/x!");
774 TArrow *ar3 = new TArrow(lLowPtPeakProton,lFractionHeight * fLowPtProtonResponse->GetMaximum(),lLowPtPeakPion,0.0, 0.008 ,"|>");
775 ar3->SetLineWidth(2);
777 if( TMath::Abs( lLowPtPeakProton ) < 0.3) {
779 Tlq.DrawLatex ( 0.15,0.8, "OK!");
781 Tlq.SetTextColor(kRed);
782 Tlq.DrawLatex ( 0.15,0.8, "Prob.! Check dEd/x!");
786 TArrow *ar4 = new TArrow(lMidPtPeakProton,lFractionHeight * fMidPtProtonResponse->GetMaximum(),lLowPtPeakPion,0.0, 0.008 ,"|>");
787 ar4->SetLineWidth(2);
789 if( TMath::Abs( lMidPtPeakProton ) < 0.3) {
791 Tlq.DrawLatex ( 0.15,0.8, "OK!");
793 Tlq.SetTextColor(kRed);
794 Tlq.DrawLatex ( 0.15,0.8, "Prob.! Check dEd/x!");
796 cdEdxPure->SaveAs("V0_QA.pdf");
798 //==============================================================
800 //==============================================================
801 //Topological variable QA
802 // FIXME: This is still only a rough first version.
803 // Adjustments will be required for easy / long-term operation.
804 TH1D *fHistTopDCAPosToPV = (TH1D*)clist->FindObject("fHistSelectedTopDCAPosToPV");
805 TH1D *fHistTopDCANegToPV = (TH1D*)clist->FindObject("fHistSelectedTopDCANegToPV");
806 TH1D *fHistTopDCAV0Daughters = (TH1D*)clist->FindObject("fHistSelectedTopDCAV0Daughters");
807 TH1D *fHistTopCosinePA = (TH1D*)clist->FindObject("fHistSelectedTopCosinePA");
808 TH1D *fHistTopV0Radius = (TH1D*)clist->FindObject("fHistSelectedTopV0Radius");
810 //Zoom in on selection in Cosine of pointing angle...
815 //Normalize to per-event
816 fHistTopDCAPosToPV -> Scale ( 1. / ((Double_t)fHistEvent->GetBinContent(4) ) );
817 fHistTopDCANegToPV -> Scale ( 1. / ((Double_t)fHistEvent->GetBinContent(4) ) );
818 fHistTopDCAV0Daughters -> Scale ( 1. / ((Double_t)fHistEvent->GetBinContent(4) ) );
819 fHistTopCosinePA -> Scale ( 1. / ((Double_t)fHistEvent->GetBinContent(4) ) );
820 fHistTopV0Radius -> Scale ( 1. / ((Double_t)fHistEvent->GetBinContent(4) ) );
822 fHistTopDCAPosToPV -> GetYaxis() -> SetTitle("Counts / Event");
823 fHistTopDCANegToPV -> GetYaxis() -> SetTitle("Counts / Event");
824 fHistTopDCAV0Daughters -> GetYaxis() -> SetTitle("Counts / Event");
825 fHistTopCosinePA -> GetYaxis() -> SetTitle("Counts / Event");
826 fHistTopV0Radius -> GetYaxis() -> SetTitle("Counts / Event");
828 fHistTopDCAPosToPV -> GetYaxis() -> SetTitleSize(0.05);
829 fHistTopDCANegToPV -> GetYaxis() -> SetTitleSize(0.05);
830 fHistTopDCAV0Daughters -> GetYaxis() -> SetTitleSize(0.05);
831 fHistTopCosinePA -> GetYaxis() -> SetTitleSize(0.05);
832 fHistTopV0Radius -> GetYaxis() -> SetTitleSize(0.05);
834 fHistTopDCAPosToPV -> GetXaxis() -> SetTitleSize(0.05);
835 fHistTopDCANegToPV -> GetXaxis() -> SetTitleSize(0.05);
836 fHistTopDCAV0Daughters -> GetXaxis() -> SetTitleSize(0.05);
837 fHistTopCosinePA -> GetXaxis() -> SetTitleSize(0.05);
838 fHistTopV0Radius -> GetXaxis() -> SetTitleSize(0.05);
840 Double_t lMinimumCosPADraw = 1.-1.25*(1.-GetXForMinValue ( fHistTopCosinePA ) ); //assumes monotonically increasing dist
841 cout<<"Function test: "<< lMinimumCosPADraw <<endl;
842 fHistTopCosinePA->GetXaxis()->SetRangeUser(lMinimumCosPADraw,1.001);
845 Double_t lminPrecision[5];
846 lmin[3] = GetXForMinValue ( fHistTopCosinePA );
847 lmin[4] = GetXForMinValue ( fHistTopV0Radius );
848 lmin[0] = GetXForMaxValue ( fHistTopDCAPosToPV );
849 lmin[1] = GetXForMaxValue ( fHistTopDCANegToPV );
850 lmin[2] = GetXForMinValue ( fHistTopDCAV0Daughters );
852 lminPrecision[3] = fHistTopCosinePA -> GetBinWidth(1);
853 lminPrecision[4] = fHistTopV0Radius -> GetBinWidth(1);
854 lminPrecision[0] = fHistTopDCAPosToPV -> GetBinWidth(1);
855 lminPrecision[1] = fHistTopDCANegToPV -> GetBinWidth(1);
856 lminPrecision[2] = fHistTopDCAV0Daughters -> GetBinWidth(1);
858 cout<<"Minimum Values Found: "<<endl;
859 cout<<"Cosine of Pointing Angle...........: "<<GetXForMinValue (fHistTopCosinePA )<<" precision = "<<lminPrecision[3]<<endl;
860 cout<<"DCA Neg Daughter to PV.............: "<<GetXForMaxValue (fHistTopDCAPosToPV )<<" precision = "<<lminPrecision[1]<<endl;
861 cout<<"DCA Pos Daughter to PV.............: "<<GetXForMaxValue (fHistTopDCANegToPV )<<" precision = "<<lminPrecision[0]<<endl;
862 cout<<"DCA V0 Daughers....................: "<<GetXForMinValue (fHistTopDCAV0Daughters )<<" precision = "<<lminPrecision[2]<<endl;
863 cout<<"V0 Decay Radius....................: "<<GetXForMinValue (fHistTopV0Radius )<<" precision = "<<lminPrecision[4]<<endl;
866 TCanvas *cTopo = new TCanvas ("cTopo","",1200,800);
868 for(Int_t ic = 1; ic<7; ic++){
869 cTopo->cd(ic)->SetLeftMargin(0.15);
870 cTopo->cd(ic)->SetGridx();
871 cTopo->cd(ic)->SetGridy();
875 fHistTopDCAPosToPV->Draw();
877 fHistTopDCANegToPV->Draw();
879 fHistTopDCAV0Daughters->Draw();
881 fHistTopCosinePA->Draw();
883 fHistTopV0Radius->Draw();
887 Tlt.SetTextSize(0.05);
890 Tlt.DrawLatex(.22, .9, "Boundary Checks") ;
895 lCut [ 0 ] = "Min DCA Pos D. To PV (cm)";
896 lCut [ 1 ] = "Min DCA Neg D. To PV (cm)";
897 lCut [ 2 ] = "Max DCA V0 Daughters (#sigma)";
898 lCut [ 3 ] = "Min Cosine PA";
899 lCut [ 4 ] = "Min 2D Decay Radius (cm)";
902 TString lCutValPrec[5];
904 Tlt.SetTextSize(0.04);
907 Tlt.DrawLatex(.01, .80, "Topological Var.") ;
908 Tlt.DrawLatex(.6, .80, "Value") ;
909 Tlt.DrawLatex(.75, .80, "Precision") ;
911 for (Int_t il=0;il<5;il++){
912 Tlt.DrawLatex(.01,0.72-((double)il)*0.075, lCut[il].Data() );
913 lCutVal[il] = Form( "%.4f", lmin[il] );
914 Tlt.DrawLatex(.5925,0.72-((double)il)*0.075, lCutVal[il].Data() );
915 lCutValPrec[il] = Form( "%.4f", lminPrecision[il] );
916 Tlt.DrawLatex(.7675,0.72-((double)il)*0.075, lCutValPrec[il].Data() );
919 Tlt.SetTextSize(0.05);
922 //Try to make a wild guess...
923 if ( TMath::Abs( lmin[0] - 0.100 ) < 2*lminPrecision[0] &&
924 TMath::Abs( lmin[1] - 0.100 ) < 2*lminPrecision[1] &&
925 TMath::Abs( lmin[2] - 1.000 ) < 2*lminPrecision[2] &&
926 TMath::Abs( lmin[3] - 0.998 ) < 2*lminPrecision[3] &&
927 TMath::Abs( lmin[4] - 0.500 ) < 2*lminPrecision[4] ){
928 Tlt.DrawLatex( 0.17, 0.275, "#bf{Autodetect Interpretation}: ");
929 Tlt.DrawLatex( 0.1, 0.2, "Typical #bf{Pb-Pb} Reconstruction Cuts");
931 if ( TMath::Abs( lmin[0] - 0.020 ) < 2*lminPrecision[0] &&
932 TMath::Abs( lmin[1] - 0.020 ) < 2*lminPrecision[1] &&
933 TMath::Abs( lmin[2] - 1.500 ) < 2*lminPrecision[2] &&
934 TMath::Abs( lmin[3] - 0.98 ) < 2*lminPrecision[3] &&
935 TMath::Abs( lmin[4] - 0.500 ) < 2*lminPrecision[4] ){
936 Tlt.DrawLatex( 0.15, 0.29, "#bf{Autodetect Interpretation}: ");
937 Tlt.DrawLatex( 0.1, 0.2, "Typical pp Reconstruction Cuts"); //To be checked
939 cTopo->SaveAs("V0_QA.pdf)");
944 CustomGStyleSettings(){
945 gStyle->SetOptStat(0);
946 gStyle->SetGridColor(kGray);
950 Double_t GetXForMaxValue( TH1D *lHist){
951 Double_t lMaximum = 1e-10;
952 Double_t lMaximumX = 1000;
953 Double_t lThisBin = -1;
954 for(Long_t ib=1; ib<lHist->GetNbinsX()+1; ib++){
955 lThisBin = lHist->GetBinContent(ib);
956 if ( lThisBin > lMaximum ){
957 lMaximum = lHist->GetBinContent(ib);
958 lMaximumX = lHist->GetBinLowEdge(ib);
964 Double_t GetXForMinValue( TH1D *lHist){
965 Double_t lThreshold = 1e-7;
966 Double_t lMinimum = 1e+10;
967 Double_t lMinimumX = 1000;
968 Double_t lThisBin = -1;
969 for(Long_t ib=1; ib<lHist->GetNbinsX()+1; ib++){
970 lThisBin = lHist->GetBinContent(ib);
971 if ( lThisBin < lMinimum && lThisBin>lThreshold ){
972 lMinimum = lHist->GetBinContent(ib);
973 lMinimumX = lHist->GetBinLowEdge(ib);
979 //Trick for background fitting (pol2)
980 Double_t MyBgPol2(const Double_t *x, const Double_t *par)
982 //par[0] and par[1] -> linear and angular coefficients
983 //par[2] and par[3] -> lower and upper peak boundaries
984 if ( x[0] > par[2] && x[0] < par[3]) {
988 return par[0] + par[1]*x[0];