1 ///////////////////////////////////////////////////////////////////////////////////////////
2 // CheckNSigmaStability.C (called by AODQAChecks.C) //
4 // Written by John Groh //
5 ///////////////////////////////////////////////////////////////////////////////////////////
7 void CheckNSigmaStability(AliSpectraAODHistoManager * hman,
8 TH1F*& TPCnsigMeanTrendPion,
9 TH1F*& TPCnsigMeanTrendKaon,
10 TH1F*& TPCnsigMeanTrendProton,
11 TH1F*& TPCnsigSigmaTrendPion,
12 TH1F*& TPCnsigSigmaTrendKaon,
13 TH1F*& TPCnsigSigmaTrendProton,
14 TH1F*& TOFnsigMeanTrendPion,
15 TH1F*& TOFnsigMeanTrendKaon,
16 TH1F*& TOFnsigMeanTrendProton,
17 TH1F*& TOFnsigSigmaTrendPion,
18 TH1F*& TOFnsigSigmaTrendKaon,
19 TH1F*& TOFnsigSigmaTrendProton,
25 // ranges for the projections
26 const Double_t ProjTPC[2] = {0.4, 0.5};
27 const Double_t ProjTOF[2] = {0.9, 1.0};
29 // ranges for the gaussian fits
30 const Double_t fitRangeTPC[nPart][2] = {{-3.5, 3.5},
33 const Double_t fitRangeTOF[nPart][2] = {{-2.3, 2.3},
37 //------------------------------------------------------
39 //------------------------------------------------------
41 // canvas for printing the projections and fits to a pdf file (once per run)
42 TCanvas * cNSigProjFits = new TCanvas("cNSigProjFits","cNSigProjFits");
43 cNSigProjFits->Divide(3,2);
45 // define the 2D nsigma histograms, the projections, and the fitting functions
46 // (one each for pions, kaons, and protons)
47 TH2F * nsig_TPC[nPart];
48 TH1F * nsig_TPC_proj[nPart];
49 TF1 * fitFuncTPC[nPart];
50 for (Int_t ipart; ipart<nPart; ipart++)
52 nsig_TPC[ipart] = new TH2F;
53 nsig_TPC_proj[ipart] = new TH1F;
56 // for plotting data/fit
57 TGraph gDataOverFitTPC[nPart];
58 TGraph gDataOverFitTOF[nPart];
59 TCanvas * cDataOverFit = new TCanvas("cDataOverFit","cDataOverFit");
60 cDataOverFit->Divide(2,1);
62 for (Int_t ipart=0; ipart<nPart; ipart++)
65 nsig_TPC[ipart] = (TH2F*)((TH2F*)hman->GetNSigHistogram(Form("hHistNSig%sTPC",Particle[ipart].Data())))->Clone();
67 nsig_TPC_proj[ipart] = (TH1F*)nsig_TPC[ipart]->ProjectionY(Form("TPC NsigProjection %s, mc [%.1f,%.1f]",Particle[ipart].Data(),ProjTPC[0],ProjTPC[1]), nsig_TPC[ipart]->GetXaxis()->FindBin(ProjTPC[0]), nsig_TPC[ipart]->GetXaxis()->FindBin(ProjTPC[1]));
69 nsig_TPC_proj[ipart] = (TH1F*)nsig_TPC[ipart]->ProjectionY(Form("TPC NsigProjection %s, data [%.1f,%.1f]",Particle[ipart].Data(),ProjTPC[0],ProjTPC[1]), nsig_TPC[ipart]->GetXaxis()->FindBin(ProjTPC[0]), nsig_TPC[ipart]->GetXaxis()->FindBin(ProjTPC[1]));
71 // fit the peak of interest with a gaussian
72 fitFuncTPC[ipart] = new TF1("fitFuncTPC","gaus",fitRangeTPC[ipart][0],fitRangeTPC[ipart][1]);
73 nsig_TPC_proj[ipart]->Fit(fitFuncTPC[ipart],"NRLQ");
75 // draw the projections and fits
76 cNSigProjFits->cd(ipart+1);
78 nsig_TPC_proj[ipart]->GetXaxis()->SetTitle(Form("TPC nsigma for %.1f GeV/c < p < %.1f GeV/c",ProjTPC[0],ProjTPC[1]));
79 nsig_TPC_proj[ipart]->GetXaxis()->SetRangeUser(-10,10);
80 nsig_TPC_proj[ipart]->SetStats(kFALSE);
81 nsig_TPC_proj[ipart]->DrawCopy();
82 //fitFuncTPC[ipart]->SetLineWidth(1);
83 fitFuncTPC[ipart]->DrawCopy("same");
84 TLegend * lNSigTPC = new TLegend(0.59,0.59,0.99,0.99);
85 lNSigTPC->SetFillColor(0);
86 lNSigTPC->AddEntry(nsig_TPC_proj[ipart],Form("%ss, TPC",Particle[ipart].Data()),"");
87 lNSigTPC->AddEntry(nsig_TPC_proj[ipart],Form("Run %i",runs[irun]),"");
88 if (useMC) lNSigTPC->AddEntry(nsig_TPC_proj[ipart],"MC","");
89 else lNSigTPC->AddEntry(nsig_TPC_proj[ipart],"DATA","");
90 // lNSigTPC->AddEntry(nsig_TPC_proj[ipart],Form("#chi^{2}/nDOF = %.2f",(Float_t)resultTPC->Chi2() / (Float_t)resultTPC->Ndf()),"");
91 lNSigTPC->DrawClone();
93 // fill gDataOverFitTPC[] graphs
94 Int_t nGraphPoints = 0;
95 for (Float_t iPt = fitRangeTPC[ipart][0]; iPt <= fitRangeTPC[ipart][1]; iPt += (fitRangeTPC[ipart][1] - fitRangeTPC[ipart][0])/15)
97 gDataOverFitTPC[ipart].SetPoint(nGraphPoints,iPt, nsig_TPC_proj[ipart]->GetBinContent(nsig_TPC_proj[ipart]->FindBin(iPt)) / fitFuncTPC[ipart]->Eval(iPt));
101 // fill the histograms with the fit parameters and run numbers
105 TPCnsigMeanTrendPion->SetBinContent(irun+1, fitFuncTPC[ipart]->GetParameter(1));
106 TPCnsigSigmaTrendPion->SetBinContent(irun+1, fitFuncTPC[ipart]->GetParameter(2));
107 TPCnsigMeanTrendPion->SetBinError(irun+1, fitFuncTPC[ipart]->GetParError(1));
108 TPCnsigSigmaTrendPion->SetBinError(irun+1, fitFuncTPC[ipart]->GetParError(2));
111 TPCnsigMeanTrendKaon->SetBinContent(irun+1, fitFuncTPC[ipart]->GetParameter(1));
112 TPCnsigSigmaTrendKaon->SetBinContent(irun+1, fitFuncTPC[ipart]->GetParameter(2));
113 TPCnsigMeanTrendKaon->SetBinError(irun+1, fitFuncTPC[ipart]->GetParError(1));
114 TPCnsigSigmaTrendKaon->SetBinError(irun+1, fitFuncTPC[ipart]->GetParError(2));
117 TPCnsigMeanTrendProton->SetBinContent(irun+1, fitFuncTPC[ipart]->GetParameter(1));
118 TPCnsigSigmaTrendProton->SetBinContent(irun+1, fitFuncTPC[ipart]->GetParameter(2));
119 TPCnsigMeanTrendProton->SetBinError(irun+1, fitFuncTPC[ipart]->GetParError(1));
120 TPCnsigSigmaTrendProton->SetBinError(irun+1, fitFuncTPC[ipart]->GetParError(2));
123 Printf("\n!!! ERROR in TPC switch control structure in CheckNSigmaStability.C !!!\n");
126 } // end loop over ipart
130 TH2F * hAxesDataOverFitTPC = new TH2F("hAxesDataOverFitTPC","",100,-5,5,100,-3,5);
131 hAxesDataOverFitTPC->SetStats(kFALSE);
132 hAxesDataOverFitTPC->SetTitle(";nsigma for 0.4 GeV/c < p < 0.5 GeV/c;Data/Fit (TPC)");
133 hAxesDataOverFitTPC->DrawCopy();
134 TLegend * lDataOverFitTPC = new TLegend(.59,.69,.99,.99);
135 lDataOverFitTPC->SetFillColor(0);
136 lDataOverFitTPC->AddEntry(&gDataOverFitTPC[0],Form("Run %i",runs[irun]),"");
137 if (useMC) lDataOverFitTPC->AddEntry(&gDataOverFitTPC[0],"MC","");
138 else lDataOverFitTPC->AddEntry(&gDataOverFitTPC[0],"DATA","");
139 for (Int_t ipart=0; ipart<nPart; ipart++)
141 gDataOverFitTPC[ipart].SetMarkerStyle(Marker[ipart]);
142 gDataOverFitTPC[ipart].SetMarkerColor(Color[ipart]);
143 gDataOverFitTPC[ipart].DrawClone("Psame");
144 lDataOverFitTPC->AddEntry(&gDataOverFitTPC[ipart],Particle[ipart].Data(),"p");
146 lDataOverFitTPC->DrawClone();
148 //------------------------------------------------------
150 //------------------------------------------------------
152 // define the 2D nsigma histograms, the projections, and the fitting functions
153 // (one each for pions, kaons, and protons)
154 TH2F * nsig_TOF[nPart];
155 TH1F * nsig_TOF_proj[nPart];
156 TF1 * fitFuncTOF[nPart];
157 for (Int_t ipart; ipart<nPart; ipart++)
159 nsig_TOF[ipart] = new TH2F;
160 nsig_TOF_proj[ipart] = new TH1F;
163 for (Int_t ipart=0; ipart<nPart; ipart++)
166 nsig_TOF[ipart] = (TH2F*)((TH2F*)hman->GetNSigHistogram(Form("hHistNSig%sTOF",Particle[ipart].Data())))->Clone();
168 nsig_TOF_proj[ipart] = (TH1F*)nsig_TOF[ipart]->ProjectionY(Form("TOF NsigProjection %s, mc [%.1f,%.1f]",Particle[ipart].Data(),ProjTOF[0],ProjTOF[1]), nsig_TOF[ipart]->GetXaxis()->FindBin(ProjTOF[0]), nsig_TOF[ipart]->GetXaxis()->FindBin(ProjTOF[1]));
170 nsig_TOF_proj[ipart] = (TH1F*)nsig_TOF[ipart]->ProjectionY(Form("TOF NsigProjection %s, data [%.1f,%.1f]",Particle[ipart].Data(),ProjTOF[0],ProjTOF[1]), nsig_TOF[ipart]->GetXaxis()->FindBin(ProjTOF[0]), nsig_TOF[ipart]->GetXaxis()->FindBin(ProjTOF[1]));
172 // fit the peak of interest with a gaussian
173 fitFuncTOF[ipart] = new TF1("fitFuncTOF","gaus",fitRangeTOF[ipart][0],fitRangeTOF[ipart][1]);
174 TFitResultPtr resultTOF = nsig_TOF_proj[ipart]->Fit(fitFuncTOF[ipart],"NRSLQ");
176 // draw the projections and fits
177 cNSigProjFits->cd(ipart+1+nPart);
180 nsig_TOF_proj[ipart]->GetXaxis()->SetTitle(Form("TOF nsigma for %.1f GeV/c < p < %.1f GeV/c",ProjTOF[0],ProjTOF[1]));
181 nsig_TOF_proj[ipart]->SetStats(kFALSE);
182 nsig_TOF_proj[ipart]->DrawCopy();
183 fitFuncTOF[ipart]->DrawCopy("same");
184 TLegend * lNSigTOF = new TLegend(0.59,0.59,0.99,0.99);
185 lNSigTOF->SetFillColor(0);
186 lNSigTOF->AddEntry(nsig_TOF_proj[ipart],Form("%ss, TOF",Particle[ipart].Data()),"");
187 lNSigTOF->AddEntry(nsig_TOF_proj[ipart],Form("Run %i",runs[irun]),"");
188 if (useMC) lNSigTOF->AddEntry(nsig_TOF_proj[ipart],"MC","");
189 else lNSigTOF->AddEntry(nsig_TOF_proj[ipart],"DATA","");
190 //lNSigTOF->AddEntry(nsig_TOF_proj[ipart],Form("#chi^{2}/nDOF = %.2f",fitFuncTOF[ipart]->GetChisquare()/fitFuncTOF[ipart]->GetNDF()),"");
191 lNSigTOF->DrawClone();
193 // fill gDataOverFitTOF[] graphs
194 Int_t nGraphPoints = 0;
195 for (Float_t iPt = fitRangeTOF[ipart][0]; iPt <= fitRangeTOF[ipart][1]; iPt += (fitRangeTOF[ipart][1] - fitRangeTOF[ipart][0])/15)
197 gDataOverFitTOF[ipart].SetPoint(nGraphPoints,iPt, nsig_TOF_proj[ipart]->GetBinContent(nsig_TOF_proj[ipart]->FindBin(iPt)) / fitFuncTOF[ipart]->Eval(iPt));
202 // fill the histograms with the fit parameters and run numbers
206 TOFnsigMeanTrendPion->SetBinContent(irun+1, resultTOF->Parameter(1));
207 TOFnsigMeanTrendPion->SetBinError(irun+1, resultTOF->ParError(1));
208 TOFnsigSigmaTrendPion->SetBinContent(irun+1, resultTOF->Parameter(2));
209 TOFnsigSigmaTrendPion->SetBinError(irun+1, resultTOF->ParError(2));
212 TOFnsigMeanTrendKaon->SetBinContent(irun+1, resultTOF->Parameter(1));
213 TOFnsigMeanTrendKaon->SetBinError(irun+1, resultTOF->ParError(1));
214 TOFnsigSigmaTrendKaon->SetBinContent(irun+1, resultTOF->Parameter(2));
215 TOFnsigSigmaTrendKaon->SetBinError(irun+1, resultTOF->ParError(2));
218 TOFnsigMeanTrendProton->SetBinContent(irun+1, resultTOF->Parameter(1));
219 TOFnsigMeanTrendProton->SetBinError(irun+1, resultTOF->ParError(1));
220 TOFnsigSigmaTrendProton->SetBinContent(irun+1, resultTOF->Parameter(2));
221 TOFnsigSigmaTrendProton->SetBinError(irun+1, resultTOF->ParError(2));
224 Printf("\n!!! ERROR in TOF switch control structure in CheckNSigmaStability.C !!!\n");
227 } // end loop over ipart
231 TH2F * hAxesDataOverFitTOF = new TH2F("hAxesDataOverFitTOF","",100,-5,5,100,-3,5);
232 hAxesDataOverFitTOF->SetStats(kFALSE);
233 hAxesDataOverFitTOF->SetTitle(";nsigma for 0.9 GeV/c < p < 1.0 GeV/c;Data/Fit (TOF)");
234 hAxesDataOverFitTOF->DrawCopy();
235 TLegend * lDataOverFitTOF = new TLegend(.59,.69,.99,.99);
236 lDataOverFitTOF->SetFillColor(0);
237 lDataOverFitTOF->AddEntry(&gDataOverFitTOF[0],Form("Run %i",runs[irun]),"");
238 if (useMC) lDataOverFitTOF->AddEntry(&gDataOverFitTOF[0],"MC","");
239 else lDataOverFitTOF->AddEntry(&gDataOverFitTOF[0],"DATA","");
240 for (Int_t ipart=0; ipart<nPart; ipart++)
242 gDataOverFitTOF[ipart].SetMarkerStyle(Marker[ipart]);
243 gDataOverFitTOF[ipart].SetMarkerColor(Color[ipart]);
244 gDataOverFitTOF[ipart].DrawClone("Psame");
245 lDataOverFitTOF->AddEntry(&gDataOverFitTOF[ipart],Particle[ipart].Data(),"p");
247 lDataOverFitTOF->DrawClone();
252 // save the projections and fits to a pdf file once per run
255 if (irun == 0) cNSigProjFits->Print("Plots/MC/AODnSigmaProjFits.pdf(","pdf");
256 else if (irun < nRuns-1) cNSigProjFits->Print("Plots/MC/AODnSigmaProjFits.pdf","pdf");
257 else if (irun == nRuns-1) cNSigProjFits->Print("Plots/MC/AODnSigmaProjFits.pdf)","pdf");
261 if (irun == 0) cNSigProjFits->Print("Plots/DATA/AODnSigmaProjFits.pdf(","pdf");
262 else if (irun < nRuns-1) cNSigProjFits->Print("Plots/DATA/AODnSigmaProjFits.pdf","pdf");
263 else if (irun == nRuns-1) cNSigProjFits->Print("Plots/DATA/AODnSigmaProjFits.pdf)","pdf");
265 cNSigProjFits->Close();
269 // also save the data/fit plots to a pdf file once per run
272 if (irun == 0) cDataOverFit->Print("Plots/MC/NSigDataOverFit.pdf(","pdf");
273 else if (irun < nRuns-1) cDataOverFit->Print("Plots/MC/NSigDataOverFit.pdf","pdf");
274 else if (irun == nRuns-1) cDataOverFit->Print("Plots/MC/NSigDataOverFit.pdf)","pdf");
278 if (irun == 0) cDataOverFit->Print("Plots/DATA/NSigDataOverFit.pdf(","pdf");
279 else if (irun < nRuns-1) cDataOverFit->Print("Plots/DATA/NSigDataOverFit.pdf","pdf");
280 else if (irun == nRuns-1) cDataOverFit->Print("Plots/DATA/NSigDataOverFit.pdf)","pdf");
282 cDataOverFit->Close();