1 /////////////////////////////////////////////////////////
2 //Macro to read the results of the 3gausfit for spectra
3 //E. Biolcati, 13-feb-2010
4 /////////////////////////////////////////////////////////
5 #if !defined(__CINT__) || defined(__MAKECINT__)
13 #include <TLegendEntry.h>
14 #include <TGraphErrors.h>
15 #include <TGraphAsymmErrors.h>
24 void Labella(Int_t i);
25 void Legenda(TH1 *h2, TH1 *h3, TH1 *h4);
27 //_______________________________________________________
28 void MakeCorrectedITSsaSpectraMultiBin(Int_t multibin=0){
30 TString dirNameSIM, dirNameDATA;
31 TFile *fiSIM = new TFile(Form("../gridmultiplicitybins/LHC10d1_1.5sigma_7DCA_negmag/Spectra_MC_negmag_MultBin%d/SpectraReco.root",multibin));
32 TFile *fiDATA = new TFile(Form("../gridmultiplicitybins/data_1.5sigma_7DCA_negmag/Spectra_data_negmag_MultBin%d/SpectraReco.root",multibin));
33 TFile *fout = new TFile(Form("ITSsaSpectraCorr_MultiBin%d.root",multibin),"recreate");
36 TFile *fPanosPosP= new TFile(Form("RootFilesPanosCorr/PanosCorr_1.5sigma_7DCA_PosP_expostrange_MultBin%d.root",multibin));
37 TFile *fPanosNegP= new TFile(Form("RootFilesPanosCorr/PanosCorr_1.5sigma_7DCA_NegP_expostrange_MultBin%d.root",multibin));
38 TH1F *hPanosPosP= (TH1F*)fPanosPosP->Get("fHistSecTOTCorrDATAMC");
39 TH1F *hPanosNegP= (TH1F*)fPanosNegP->Get("fHistSecTOTCorrDATAMC");
40 for(Int_t pbin=0;pbin<=hPanosPosP->GetNbinsX();pbin++)hPanosPosP->SetBinError(pbin,0);
41 for(Int_t pbin=0;pbin<=hPanosNegP->GetNbinsX();pbin++)hPanosNegP->SetBinError(pbin,0);
44 TH1F *hstat = (TH1F*)fiDATA->Get("fHistNEvents");
45 Double_t NEvts = hstat->GetBinContent(hstat->FindBin(1.));
46 cout<<"Event number used for the normalization "<<NEvts<<endl;
49 gStyle->SetOptStat(0);
50 TCanvas *cs=new TCanvas("cs","cs",1200,700);
52 TCanvas *cmix=new TCanvas("cmix","cmix",800,900);
53 cmix->Divide(1,3,0,0);
68 hPieff[0] = (TH1F*)fiSIM->Get("hCorrFacNeg0");
69 hKeff[0] = (TH1F*)fiSIM->Get("hCorrFacNeg1");
70 hPeff[0] = (TH1F*)fiSIM->Get("hCorrFacNeg2");
71 hPieff[1] = (TH1F*)fiSIM->Get("hCorrFacPos0");
72 hKeff[1] = (TH1F*)fiSIM->Get("hCorrFacPos1");
73 hPeff[1] = (TH1F*)fiSIM->Get("hCorrFacPos2");
74 TCanvas *ceff=new TCanvas("ceff","ceff",800,500);
79 hKeff[0]->Draw("same");
80 hPeff[0]->Draw("same");
84 hKeff[1]->Draw("same");
85 hPeff[1]->Draw("same");
87 hPiDATA[0] = (TH1F*)fiDATA->Get("hSpectraNeg0");
88 hKDATA[0] = (TH1F*)fiDATA->Get("hSpectraNeg1");
89 hPDATA[0] = (TH1F*)fiDATA->Get("hSpectraNeg2");
90 hPiDATA[1] = (TH1F*)fiDATA->Get("hSpectraPos0");
91 hKDATA[1] = (TH1F*)fiDATA->Get("hSpectraPos1");
92 hPDATA[1] = (TH1F*)fiDATA->Get("hSpectraPos2");
94 hPiDATANorm[0] = new TH1F(*hPiDATA[0]);
95 hPiDATANorm[0]->SetName("hSpectraPiPlusN");
96 hPiDATANorm[1] = new TH1F(*hPiDATA[1]);
97 hPiDATANorm[1]->SetName("hSpectraPiMinusN");
98 hKDATANorm[0] = new TH1F(*hKDATA[0]);
99 hKDATANorm[0]->SetName("hSpectraKPlusN");
100 hKDATANorm[1] = new TH1F(*hKDATA[1]);
101 hKDATANorm[1]->SetName("hSpectraKMinusN");
102 hPDATANorm[0] = new TH1F(*hPDATA[0]);
103 hPDATANorm[0]->SetName("hSpectraPPlusN");
104 hPDATANorm[1] = new TH1F(*hPDATA[1]);
105 hPDATANorm[1]->SetName("hSpectraPMinusN");
107 for(Int_t i=0;i<2;i++){ //0==> negative, 1==>positive
109 hPiDATA[i] -> SetLineColor(2);
110 hKDATA[i] -> SetLineColor(3);
111 hPDATA[i] -> SetLineColor(4);
112 hPiDATA[i] -> SetMarkerStyle(27);
113 hKDATA[i] -> SetMarkerStyle(23);
114 hPDATA[i] -> SetMarkerStyle(24);
115 hPiDATA[i] -> SetMarkerColor(2);
116 hKDATA[i] -> SetMarkerColor(3);
117 hPDATA[i] -> SetMarkerColor(4);
118 hPiDATA[i] -> SetMarkerStyle(23);
119 hKDATA[i] -> SetMarkerStyle(23);
120 hPDATA[i] -> SetMarkerStyle(23);
122 hPiDATANorm[i] -> SetLineColor(2);
123 hKDATANorm[i] -> SetLineColor(3);
124 hPDATANorm[i] -> SetLineColor(4);
125 hPiDATANorm[i] -> SetMarkerStyle(27);
126 hKDATANorm[i] -> SetMarkerStyle(23);
127 hPDATANorm[i] -> SetMarkerStyle(24);
128 hPiDATANorm[i] -> SetMarkerColor(2);
129 hKDATANorm[i] -> SetMarkerColor(3);
130 hPDATANorm[i] -> SetMarkerColor(4);
131 hPiDATANorm[i] -> SetMarkerStyle(23);
132 hKDATANorm[i] -> SetMarkerStyle(23);
133 hPDATANorm[i] -> SetMarkerStyle(23);
135 //division for efficiency
136 hPiDATA[i] -> Divide(hPieff[i]);
137 hKDATA[i] -> Divide(hKeff[i]);
138 hPDATA[i] -> Divide(hPeff[i]);
139 hPiDATANorm[i] -> Divide(hPieff[i]);
140 hKDATANorm[i] -> Divide(hKeff[i]);
141 hPDATANorm[i] -> Divide(hPeff[i]);
143 //normalization number of events
144 hPiDATANorm[i] -> Scale(1./NEvts);
145 hKDATANorm[i] -> Scale(1./NEvts);
146 hPDATANorm[i] -> Scale(1./NEvts);
148 //correction factor based on fit to DCA distr for P and Pibar
149 hPDATA[0]->Multiply(hPanosPosP);
150 hPDATA[1]->Multiply(hPanosNegP);
159 hPiDATANorm[i]->Draw("e");
160 hPiDATANorm[i]->GetYaxis()->SetRangeUser(minim,maxim);
161 hPiDATANorm[i]->GetYaxis()->SetTitle("#frac{1}{N}#frac{d^{2}N}{dp_{t}dy}");
162 hPiDATANorm[i]->SetTitle("DATA from ITSsa - corrected");
163 hKDATANorm[i]->Draw("esames");
164 hPDATANorm[i]->Draw("esames");
166 Legenda(hPiDATA[i],hKDATA[i],hPDATA[i]);
170 //fluka correction for pi
171 TFile *fGeanFlukaPi= new TFile(Form("RootFilesGeantFlukaCorrection/correctionForCrossSection.211.root"));
172 TH1F *hGeantFlukaPiPos=(TH1F*)fGeanFlukaPi->Get("gHistCorrectionForCrossSectionParticles");
173 TH1F *hGeantFlukaPiNeg=(TH1F*)fGeanFlukaPi->Get("gHistCorrectionForCrossSectionAntiParticles");
174 for(Int_t binPi=0;binPi<=hPiDATA[0]->GetNbinsX();binPi++){
175 Float_t FlukaCorrPiPos=hGeantFlukaPiPos->GetBinContent(hGeantFlukaPiPos->FindBin(hPiDATA[0]->GetBinCenter(binPi)));
176 Float_t FlukaCorrPiNeg=hGeantFlukaPiNeg->GetBinContent(hGeantFlukaPiNeg->FindBin(hPiDATA[1]->GetBinCenter(binPi)));
177 //cout<<"PiPos "<<FlukaCorrPiPos<<" "<<hPiDATA[0]->GetBinCenter(binPi)<<" " <<binPi <<endl;
178 //cout<<"PiNeg "<<FlukaCorrPiNeg<<" "<<hPiDATA[0]->GetBinCenter(binPi)<<" " <<binPi <<endl;
179 hPiDATA[0]->SetBinContent(binPi,hPiDATA[0]->GetBinContent(binPi)*FlukaCorrPiPos);
180 hPiDATA[1]->SetBinContent(binPi,hPiDATA[1]->GetBinContent(binPi)*FlukaCorrPiNeg);
182 //fluka correction for pi
183 TFile *fGeanFlukaK= new TFile(Form("RootFilesGeantFlukaCorrection/correctionForCrossSection.321.root"));
184 TH1F *hGeantFlukaKPos=(TH1F*)fGeanFlukaK->Get("gHistCorrectionForCrossSectionParticles");
185 TH1F *hGeantFlukaKNeg=(TH1F*)fGeanFlukaK->Get("gHistCorrectionForCrossSectionAntiParticles");
186 for(Int_t binK=0;binK<=hKDATA[0]->GetNbinsX();binK++){
187 Float_t FlukaCorrKPos=hGeantFlukaKPos->GetBinContent(hGeantFlukaKPos->FindBin(hKDATA[0]->GetBinCenter(binK)));
188 Float_t FlukaCorrKNeg=hGeantFlukaKNeg->GetBinContent(hGeantFlukaKNeg->FindBin(hKDATA[1]->GetBinCenter(binK)));
189 //cout<<"KPos :"<<FlukaCorrKPos<<" "<<hKDATA[0]->GetBinCenter(binK)<<" " <<binK <<endl;
190 //cout<<"KNeg :"<<FlukaCorrKNeg<<" "<<hKDATA[0]->GetBinCenter(binK)<<" " <<binK <<endl;
191 hKDATA[0]->SetBinContent(binK,hKDATA[0]->GetBinContent(binK)*FlukaCorrKPos);
192 hKDATA[1]->SetBinContent(binK,hKDATA[1]->GetBinContent(binK)*FlukaCorrKNeg);
194 //fluka correction for P
195 //ITS specific file for protons/antiprotons
198 TFile* fITS = new TFile ("RootFilesGeantFlukaCorrection/correctionForCrossSectionITS_20100719.root");
199 TH2D * hCorrFlukaITS[2];
200 hCorrFlukaITS[kPos] = (TH2D*)fITS->Get("gHistCorrectionForCrossSectionProtons");
201 hCorrFlukaITS[kNeg] = (TH2D*)fITS->Get("gHistCorrectionForCrossSectionAntiProtons");
202 for(Int_t icharge = 0; icharge < 2; icharge++){
203 Int_t nbins = hPDATA[0]->GetNbinsX();
204 Int_t nbinsy=hCorrFlukaITS[icharge]->GetNbinsY();
205 for(Int_t ibin = 0; ibin < nbins; ibin++){
206 Float_t pt = hPDATA[0]->GetBinCenter(ibin);
207 Float_t minPtCorrection = hCorrFlukaITS[icharge]->GetYaxis()->GetBinLowEdge(1);
208 Float_t maxPtCorrection = hCorrFlukaITS[icharge]->GetYaxis()->GetBinLowEdge(nbinsy+1);
209 if (pt < minPtCorrection) pt = minPtCorrection+0.0001;
210 if (pt > maxPtCorrection) pt = maxPtCorrection;
211 Float_t correction = hCorrFlukaITS[icharge]->GetBinContent(1,hCorrFlukaITS[icharge]->GetYaxis()->FindBin(pt));
213 if (correction != 0) {// If the bin is empty this is a 0
214 hPDATA[0]->SetBinContent(ibin,hPDATA[0]->GetBinContent(ibin)*correction);
215 hPDATA[0]->SetBinError(ibin,hPDATA[0]->GetBinError (ibin)*correction);
216 }else if (hPDATA[0]->GetBinContent(ibin) > 0) { // If we are skipping a non-empty bin, we notify the user
217 cout << "Fluka/GEANT: Not correcting bin "<<ibin << " for protons secondaries, ITS, " << endl;
218 cout << " Bin content: " << hPDATA[0]->GetBinContent(ibin) << endl;
222 if (correction != 0) {// If the bin is empty this is a 0
223 hPDATA[1]->SetBinContent(ibin,hPDATA[1]->GetBinContent(ibin)*correction);
224 hPDATA[1]->SetBinError(ibin,hPDATA[1]->GetBinError (ibin)*correction);
225 }else if (hPDATA[1]->GetBinContent(ibin) > 0) { // If we are skipping a non-empty bin, we notify the user
226 cout << "Fluka/GEANT: Not correcting bin "<<ibin << " for Antiprotons secondaries, ITS, " << endl;
227 cout << " Bin content: " << hPDATA[1]->GetBinContent(ibin) << endl;
234 //mixed particle ratios
235 for(Int_t i=0;i<2;i++){
236 hKsuPi[i] = (TH1F*)hKDATA[i]->Clone("KsuPi");
237 hPsuPi[i] = (TH1F*)hPDATA[i]->Clone("PsuPi");
238 hPsuK[i] = (TH1F*)hPDATA[i]->Clone("PsuK");
239 hKsuPi[i] -> Divide(hPiDATA[i]);
240 hPsuPi[i] -> Divide(hPiDATA[i]);
241 hPsuK[i] -> Divide(hKDATA[i]);
244 //positive/negative ratios
245 TH1F *hPiratio = (TH1F*)hPiDATA[1]->Clone("PionsRatio");
246 TH1F *hKratio = (TH1F*)hKDATA[1]->Clone("KaonsRatio");
247 TH1F * hPratio = (TH1F*)hPDATA[1]->Clone("ProtonsRatio");
248 hPiratio -> Divide(hPiDATA[0]);
249 hKratio -> Divide(hKDATA[0]);
250 hPratio -> Divide(hPDATA[0]);
253 //drawing positive/negative ratios
254 TCanvas *cratio=new TCanvas("cratio","",980,600);
255 cratio->Divide(1,3,0,0);
256 cratio->SetBottomMargin(0.08);
259 hPiratio->GetYaxis()->SetTitle("");
260 hPiratio->GetYaxis()->SetRangeUser(0.7,1.3);
261 hPiratio->SetTitle("");
262 hPiratio->Draw("mp");
263 TLatex *ll1=new TLatex(0.7,0.7,"#pi^{+}/#pi^{-}");
265 ll1->SetTextSize(0.14);
269 hKratio->SetTitle("");
270 hKratio->GetYaxis()->SetRangeUser(0.7,1.3);
272 TLatex *ll2=new TLatex(0.7,0.7,"K^{+}/K^{-}");
274 ll2->SetTextSize(0.14);
278 hPratio->SetTitle("");
279 hPratio->GetYaxis()->SetRangeUser(0.7,1.3);
280 hPratio->GetXaxis()->SetTitle("p_{t} [GeV/c]");
282 TLatex *ll3=new TLatex(0.7,0.7,"p/#bar{p}");
284 ll3->SetTextSize(0.144);
287 //drawing mixed particle ratios
288 gStyle->SetOptTitle(0);
290 hKsuPi[0]->GetXaxis()->SetTitle("p_{t} [GeV/c]");
292 hKsuPi[1]->Draw("same");
293 hKsuPi[0]->SetMinimum(0);
294 hKsuPi[0]->SetMarkerStyle(23);
295 hKsuPi[1]->SetMarkerStyle(24);
296 TLegend *legm1=new TLegend(0.2,0.6,0.39,0.89,NULL,"brNDC");
297 legm1->AddEntry(hKsuPi[0],"K^{-}/#pi^{-}","p");
298 legm1->AddEntry(hKsuPi[1],"K^{+}/#pi^{+}","p");
299 legm1->SetFillColor(0);
300 legm1->SetBorderSize(0);
302 hKsuPi[0]->SetMarkerColor(2);
303 hKsuPi[1]->SetMarkerColor(4);
304 hKsuPi[0]->SetLineColor(2);
305 hKsuPi[1]->SetLineColor(4);
308 hPsuPi[0]->GetXaxis()->SetTitle("p_{t} [GeV/c]");
310 hPsuPi[1]->Draw("same");
311 hPsuPi[0]->SetMinimum(0);
312 hPsuPi[0]->SetMarkerStyle(23);
313 hPsuPi[1]->SetMarkerStyle(24);
314 hPsuPi[0]->SetMarkerColor(2);
315 hPsuPi[1]->SetMarkerColor(4);
316 hPsuPi[0]->SetLineColor(2);
317 hPsuPi[1]->SetLineColor(4);
318 TLegend *legm2=new TLegend(0.2,0.6,0.39,0.89,NULL,"brNDC");
319 legm2->AddEntry(hPsuPi[0],"#bar{p}/#pi^{-}","p");
320 legm2->AddEntry(hPsuPi[1],"p/#pi^{+}","p");
321 legm2->SetFillColor(0);
322 legm2->SetBorderSize(0);
326 hPsuK[0]->GetXaxis()->SetTitle("p_{t} [GeV/c]");
328 hPsuK[1]->Draw("same");
329 hPsuK[0]->SetMinimum(0);
330 hPsuK[0]->SetMarkerStyle(23);
331 hPsuK[1]->SetMarkerStyle(24);
332 hPsuK[0]->SetMarkerColor(2);
333 hPsuK[1]->SetMarkerColor(4);
334 hPsuK[0]->SetLineColor(2);
335 hPsuK[1]->SetLineColor(4);
336 TLegend *legm3=new TLegend(0.2,0.6,0.39,0.89,NULL,"brNDC");
337 legm3->AddEntry(hPsuPi[0],"#bar{p}/K^{-}","p");
338 legm3->AddEntry(hPsuPi[1],"p/K^{+}","p");
339 legm3->SetFillColor(0);
340 legm3->SetBorderSize(0);
343 //save histograms in the root files
351 hPiDATANorm[0]->Write();
352 hKDATANorm[0] ->Write();
353 hPDATANorm[0] ->Write();
354 hPiDATANorm[1]->Write();
355 hKDATANorm[1] ->Write();
356 hPDATANorm[1] ->Write();
363 //_______________________________________________________
364 void Labella(Int_t i){
366 if(i==0) sprintf(txt,"negative particles");
367 else sprintf(txt,"positive particles");
368 TLatex *ltx=new TLatex(0.4,0.3,txt);
370 ltx->SetTextColor(6);
371 ltx->SetTextFont(22);
376 //_______________________________________________________
377 void Legenda(TH1 *h2, TH1 *h3, TH1 *h4){
378 TLegend *leg=new TLegend(0.51,0.11,0.84,0.25,NULL,"brNDC");
379 leg->SetFillColor(0);
380 leg->SetBorderSize(0);
381 TLegendEntry *entry2=leg->AddEntry(h2,"pions","p");
382 entry2->SetTextColor(2);
383 TLegendEntry *entry3=leg->AddEntry(h3,"kaons","p");
384 entry3->SetTextColor(3);
385 TLegendEntry *entry4=leg->AddEntry(h4,"protons","p");
386 entry4->SetTextColor(4);