]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGLF/SPECTRA/PiKaPr/ITSsa/FitDCADistributions.C
Merge branch 'feature-movesplit'
[u/mrichter/AliRoot.git] / PWGLF / SPECTRA / PiKaPr / ITSsa / FitDCADistributions.C
CommitLineData
a1c5e4a1 1#if !defined(__CINT__) || defined(__MAKECINT__)
2#include <TFile.h>
3#include <TF1.h>
4#include <TH1F.h>
5#include <TCanvas.h>
6#include <TLatex.h>
7#include <TROOT.h>
8#include <TStyle.h>
9#include <TFractionFitter.h>
10#endif
11
12enum species {kPion, kKaon, kProton};
13enum chargesign {kPositive,kNegative};
14
15Float_t PerformFit(TH1F* fHistDCA, TObjArray *mc,TString partname,Float_t xyMax);
16
17void FitDCADistributions(TString period="LHC10d",
982ff3fe 18 TString MCname="LHC10f6a",
a1c5e4a1 19 Int_t iSpecies=2,
20 Int_t cSign=1
21 )
22{
23 gROOT->SetStyle("Plain");
24 gStyle->SetFillColor(0);
25 gStyle->SetOptStat(0000);
26 //binning
27 const Int_t nptbins = 22;
28 Double_t ptbins[nptbins+1]={0.08,0.10,0.12,0.14,0.16,0.18,0.20,0.25,0.30,0.35,0.40,0.45,0.50,0.55,0.60,0.65,0.70,0.75,0.80,0.85,0.90,0.95,1.0};
29 //Final correction
30 TH1F *hPrimAllDATA=new TH1F("hPrimAllDATA","hPrimAllDATA",nptbins,ptbins);
31 TH1F *hPrimAllMC=new TH1F("hPrimAllMC","hPrimAllMC",nptbins,ptbins);
32 TH1F *hPrimAllDATAMC=new TH1F("hPrimAllDATAMC","hPrimAllDATAMC",nptbins,ptbins);
33
34
982ff3fe 35 TString fnameMC=Form("%s/AnalysisResults.root",MCname.Data());
a1c5e4a1 36 TString lnameMC="clistITSsaMult-1to-1";
37 TString lnameCutMC="DCACutMult-1to-1";
982ff3fe 38 TString fnameDATA=Form("%s/AnalysisResults.root",period.Data());
a1c5e4a1 39 TString lnameDATA="clistITSsaMult-1to-1";
40 TString lnameCutDATA="DCACutMult-1to-1";
41
42 const Int_t firstbin=1;
43 Int_t rebin=10;
44 Bool_t optSmooth=kTRUE;
45
46
47 TString pCharge="Pos";
48 TString pcharge="pos";
49 if(cSign==kNegative){
50 pCharge="Neg";
51 pcharge="neg";
52 }
53 TString species[3]={"Pi","K","P"};
54 TString speciesRoot[6]={"#pi^{+}","#pi^{-}","K^{+}","K^{-}","p","#bar{p}"};
55 Int_t idPart=iSpecies*2+cSign;
56 TString partname=Form("%s%s",pCharge.Data(),species[iSpecies].Data());
57 printf("%s\n",partname.Data());
58
59 // MC histograms
60 TFile *fMC=new TFile(fnameMC,"READ");
61 TH1F *fHistDCAMC[nptbins];
62 TH1F *fHistDCAPrim[nptbins];
63 TH1F *fHistDCAsec[nptbins];
64 TH1F *fHistDCAsecSt[nptbins];
65 TDirectory *dirFileMC=(TDirectory*)fMC->Get("PWG2SpectraITSsa");
66 TList *liMC = (TList*)dirFileMC->Get(lnameMC.Data());
67 for(Int_t m=0;m<nptbins;m++){
68 fHistDCAMC[m] = (TH1F*)liMC->FindObject(Form("fHistDCA%s%i",partname.Data(),m));
69 fHistDCAPrim[m] = (TH1F*)liMC->FindObject(Form("fHistMCPrimDCA%s%i",partname.Data(),m));
70 fHistDCAsec[m] = (TH1F*)liMC->FindObject(Form("fHistMCSecMatDCA%s%i",partname.Data(),m));
71 fHistDCAsecSt[m] = (TH1F*)liMC->FindObject(Form("fHistMCSecStDCA%s%i",partname.Data(),m));
72 fHistDCAMC[m]->Rebin(rebin);
73 fHistDCAPrim[m]->Rebin(rebin);
74 fHistDCAsec[m]->Rebin(rebin);
75 fHistDCAsecSt[m]->Rebin(rebin);
76 }
77 TList *liCutMC = (TList*)dirFileMC->Get(lnameCutMC.Data());
78 Bool_t setDCA=kFALSE;
79
80 Float_t DCAcut=7.;
81 Double_t xyPMC[3]; //parameters of DCA cut
82 xyPMC[0]=36.; //MC LHC10d1
83 xyPMC[1]=43.9;
84 xyPMC[2]=1.3;
85 TF1* fDCAxyCutMC=0x0;
86 TF1* fDCAzCutMC=0x0;
87 Float_t nSigmaDCAxyMC=0.;
88 Float_t nSigmaDCAzMC=0.;
89 if(liCutMC){
90 fDCAxyCutMC=(TF1*)liCutMC->FindObject("fDCAxyCutFunc");
91 fDCAzCutMC=(TF1*)liCutMC->FindObject("fDCAzCutFunc");
92 nSigmaDCAxyMC=fDCAxyCutMC->GetParameter(3);
93 nSigmaDCAzMC=fDCAzCutMC->GetParameter(3);
94 printf("DCA cut parameters from TF1: %f %f %f --- DCA cut = %f\n",fDCAxyCutMC->GetParameter(0),fDCAxyCutMC->GetParameter(1),fDCAxyCutMC->GetParameter(2),nSigmaDCAxyMC);
95 setDCA=kTRUE;
96 }
97 if(!setDCA){
98 printf("DCA cut values for MC not found in the output file, use dafault values. DCAcut=%f with default resolution\n",DCAcut);
99 fDCAxyCutMC = new TF1("fDCAxyCutFunc","[3]*([0]+[1]/TMath::Power(TMath::Abs(x),[2]))",0.05,10.);
100 for(Int_t ipar=0; ipar<3; ipar++) fDCAxyCutMC->SetParameter(ipar,xyPMC[ipar]);
101 fDCAxyCutMC->SetParameter(3,DCAcut);
102 nSigmaDCAxyMC=DCAcut;
982ff3fe 103 }
a1c5e4a1 104
105 //DATA histograms
106 TFile *fDATA=new TFile(fnameDATA,"READ");
107 TDirectory *dirFileDATA=(TDirectory*)fDATA->Get("PWG2SpectraITSsa");
108 TList *liDATA = (TList*)dirFileDATA->Get(lnameDATA.Data());
109 TH1F *fHistDCADATA[nptbins];
110 for(Int_t m=0;m<nptbins;m++){
111 fHistDCADATA[m] = (TH1F*)liDATA->FindObject(Form("fHistDCA%s%i",partname.Data(),m));
112 fHistDCADATA[m]->Rebin(rebin);
113 }
114 TList *liCutDATA = (TList*)dirFileDATA->Get(lnameCutDATA.Data());
115 setDCA=kFALSE;
116 Float_t nSigmaDCAxyDATA=0.;
117 Float_t nSigmaDCAzDATA=0.;
118 Double_t xyP[3]; // parameters of DCA cut
119 xyP[0]=32.7; //DATA 7 TeV pass2
120 xyP[1]=44.8;
121 xyP[2]=1.3;
122 TF1* fDCAxyCutDATA=0x0;
123 TF1* fDCAzCutDATA=0x0;
124 if(liCutDATA){
125 fDCAxyCutDATA=(TF1*)liCutDATA->FindObject("fDCAxyCutFunc");
126 fDCAzCutDATA=(TF1*)liCutDATA->FindObject("fDCAzCutFunc");
127 nSigmaDCAxyDATA=fDCAxyCutDATA->GetParameter(3);
128 nSigmaDCAzDATA=fDCAzCutDATA->GetParameter(3);
129 printf("DCA cut parameters from TF1: %f %f %f --- DCA cut = %f\n",fDCAxyCutDATA->GetParameter(0),fDCAxyCutDATA->GetParameter(1),fDCAxyCutDATA->GetParameter(2),nSigmaDCAxyDATA);
130 setDCA=kTRUE;
131 }
132 if(!setDCA){
133 printf("DCA cut values for DATA not found in the output file, use dafault values. DCAcut=%f with default resolution\n",DCAcut);
134 fDCAxyCutDATA = new TF1("fDCAxyCutFunc","[3]*([0]+[1]/TMath::Power(TMath::Abs(x),[2]))",0.05,10.);
135 for(Int_t ipar=0; ipar<3; ipar++) fDCAxyCutDATA->SetParameter(ipar,xyP[ipar]);
136 fDCAxyCutDATA->SetParameter(3,DCAcut);
137 nSigmaDCAxyDATA=DCAcut;
138 }
982ff3fe 139
a1c5e4a1 140 if(TMath::Abs(nSigmaDCAxyDATA-nSigmaDCAxyMC)<0.01) DCAcut=nSigmaDCAxyDATA;
141 else{
142 printf("ERROR: DCAxy cuts do not match between data and MC\n");
143 return;
144 }
982ff3fe 145 if(TMath::Abs(nSigmaDCAzDATA-nSigmaDCAzMC)>0.01){
146 printf("ERROR: DCAz cuts do not match between data (%f) and MC (%f) \n",nSigmaDCAzDATA,nSigmaDCAzMC);
a1c5e4a1 147 return;
148 }
982ff3fe 149
a1c5e4a1 150 TCanvas *cfitDATA=new TCanvas("cfitDATA","cfitDATA");
151 cfitDATA->Divide(6,4);
152 TCanvas *cfitMC=new TCanvas("cfitMC","cfitMC");
153 cfitMC->Divide(6,4);
154
155 for(Int_t ibin=firstbin;ibin<nptbins;ibin++){
156
157 Double_t xyMax =fDCAxyCutDATA->Eval(TMath::Abs((ptbins[ibin+1]+ptbins[ibin])/2))/10000.;
158 Double_t xyMaxMC =fDCAxyCutMC->Eval(TMath::Abs((ptbins[ibin+1]+ptbins[ibin])/2))/10000.;
159
160 TObjArray *mcTemplates = 0x0;
161 if(partname=="PosP"){
162 mcTemplates = new TObjArray(3); // MC histograms are put in this array
163 mcTemplates->Add(fHistDCAPrim[ibin]);
164 mcTemplates->Add(fHistDCAsecSt[ibin]);
165 mcTemplates->Add(fHistDCAsec[ibin]);
166 }else{
167 mcTemplates = new TObjArray(2); // MC histograms are put in this array
168 mcTemplates->Add(fHistDCAPrim[ibin]);
169 mcTemplates->Add(fHistDCAsecSt[ibin]);
170 }
982ff3fe 171 // if(fHistDCADATA[ibin]->Integral()==0) continue;
a1c5e4a1 172
173 ////////////////// Fit on DATA
174 cfitDATA->cd(ibin);
175 gPad->SetLogy();
176 Double_t primAllDATA=PerformFit(fHistDCADATA[ibin],mcTemplates,partname,xyMax);
177
178 ////////////////// Fit on MC
179 cfitMC->cd(ibin);
180 gPad->SetLogy();
181 Double_t primAllMC=PerformFit(fHistDCAMC[ibin],mcTemplates,partname,xyMaxMC);
182
183 if(hPrimAllMC!=0 && hPrimAllDATA!=0){
184 hPrimAllDATA->Fill((ptbins[ibin]+ptbins[ibin+1])/2,primAllDATA);
185 hPrimAllMC->Fill((ptbins[ibin]+ptbins[ibin+1])/2,primAllMC);
186 hPrimAllDATAMC->Fill((ptbins[ibin]+ptbins[ibin+1])/2,primAllDATA/primAllMC);
187 }
188 }
189
190 //Adding MC truth
191 TH1F* hAll=(TH1F*)liMC->FindObject(Form("hHist%sNSigmaMean%d",pCharge.Data(),iSpecies));
192 TH1F* hPrim=(TH1F*)liMC->FindObject(Form("hHist%sNSigmaPrimMean%d",pCharge.Data(),iSpecies));
193 TH1F* hPrimRecMC=(TH1F*)liMC->FindObject(Form("fHistPrimMC%sReco%d",pcharge.Data(),iSpecies));
194 TH1F* hSecMatRecMC=(TH1F*)liMC->FindObject(Form("fHistSecMatMC%sReco%d",pcharge.Data(),iSpecies));
195 TH1F* hSecStrRecMC=(TH1F*)liMC->FindObject(Form("fHistSecStrMC%sReco%d",pcharge.Data(),iSpecies));
196 hSecStrRecMC->Add(hSecMatRecMC);
197 hSecStrRecMC->Add(hPrimRecMC);
198 hPrim->SetLineColor(8);
199 hPrim->SetLineWidth(2);
200 hPrim->SetTitle("Prim/All from MC Truth");
201 hPrim->Divide(hAll);
202 hPrimRecMC->SetLineColor(11);
203 hPrimRecMC->SetLineWidth(2);
204 hPrimRecMC->SetTitle("Prim/All from MC Truth Reco");
205 hPrimRecMC->Divide(hSecStrRecMC);
206
207 hPrimAllDATAMC->GetXaxis()->SetRangeUser(0.09,0.79);
208 hPrimAllMC->GetXaxis()->SetRangeUser(0.09,0.79);
209 hPrimAllDATA->GetXaxis()->SetRangeUser(0.09,0.79);
210 if(optSmooth) hPrimAllDATAMC->Smooth(1,"R");
211
212 hPrimAllDATA->SetTitle("Prim/all data");
213 hPrimAllDATA->SetLineColor(2);
214 hPrimAllDATA->SetLineWidth(2);
215 hPrimAllMC->SetTitle("Prim/all mc");
216 hPrimAllMC->SetLineColor(4);
217 hPrimAllMC->SetLineWidth(2);
218 hPrimAllDATAMC->SetTitle("Prim/all data/mc");
219 hPrimAllDATAMC->SetLineColor(1);
220 hPrimAllDATAMC->SetLineWidth(2);
221
222 TCanvas *cPrimAll=new TCanvas("cPrimAll","cPrimAll");
223 hPrimAllDATA->SetMinimum(0.7);
224 hPrimAllDATA->SetMaximum(1.1);
225 hPrimAllDATA->Draw("l");
226 hPrimAllMC->Draw("lsame");
227 hPrimAllDATAMC->Draw("lsame");
228 hPrim->Draw("lsame");
229 hPrimRecMC->Draw("lsame");
230 gPad->BuildLegend();
231 TLatex* tsp=new TLatex(0.4,0.75,speciesRoot[idPart].Data());
232 tsp->SetTextFont(43);
233 tsp->SetTextSize(28);
234 tsp->SetNDC();
235 tsp->Draw();
236 cPrimAll->Update();
237
238 TString fout;
239 fout=Form("DCACorr%s_%s_%.0fDCA_%s_TFraction.root",period.Data(),MCname.Data(),DCAcut,partname.Data());
240 TFile *out=new TFile(fout.Data(),"recreate");
241 hPrimAllDATA->Write();
242 hPrimAllMC->Write();
243 hPrimAllDATAMC->Write();
244 out->Close();
245 delete out;
246
247}
248
249Float_t PerformFit(TH1F* fHistDCA, TObjArray *mc,TString partname,Float_t xyMax){
250
251 Double_t prim=0,secSt=0,sec=0;
252 TFractionFitter* fit = new TFractionFitter(fHistDCA, mc); // initialise
253 fit->Constrain(0,0.0,1.0); // constrain fraction 1 to be between 0 and 1
254 fit->Constrain(1,0.0,1.0); // constrain fraction 1 to be between 0 and 1
255 if(partname=="PosP")fit->Constrain(2,0.0,1.0); // constrain fraction 1 to be between 0 and 1
256
257 //fit->SetRangeX(200,1000); // use only the first 15 bins in the fit
258 Int_t status = fit->Fit(); // perform the fit
259 cout << "fit status: " << status << endl;
260
261 if (status == 0) { // check on fit status
262 TH1F* result = (TH1F*) fit->GetPlot();
263 TH1F* PrimMCPred=(TH1F*)fit->GetMCPrediction(0);
264 TH1F* secStMCPred=(TH1F*)fit->GetMCPrediction(1);
265 TH1F* secMCPred=0x0;
266 if(partname=="PosP"){
267 secMCPred=(TH1F*)fit->GetMCPrediction(2);
268 secMCPred->SetLineColor(4);
269 }
270 //Drawing section
271 PrimMCPred->SetLineColor(2);
272 secStMCPred->SetLineColor(6);
273 fHistDCA->SetTitle("DCA distr - data");
274 fHistDCA->DrawCopy("Ep");
275 result->SetTitle("Fit result");
276 result->DrawCopy("same");
277 Double_t value,error;
278
279 fit->GetResult(0,value,error);
280 PrimMCPred->Scale(fHistDCA->GetSumOfWeights()*value/PrimMCPred->GetSumOfWeights());
281 PrimMCPred->SetTitle("Primaries");
282 PrimMCPred->DrawCopy("same");
283 fit->GetResult(1,value,error);
284 secStMCPred->Scale(fHistDCA->GetSumOfWeights()*value/secStMCPred->GetSumOfWeights());
285 secStMCPred->SetTitle("Sec from strangeness");
286 secStMCPred->DrawCopy("same");
287 if(partname=="PosP" && secMCPred){
288 fit->GetResult(2,value,error);
289 secMCPred->Scale(fHistDCA->GetSumOfWeights()*value/secMCPred->GetSumOfWeights());
290 secMCPred->SetTitle("Sec from material");
291 secMCPred->DrawCopy("same");
292 }
293 prim=PrimMCPred->Integral(PrimMCPred->FindBin(-xyMax),PrimMCPred->FindBin(xyMax));
294 secSt=secStMCPred->Integral(secStMCPred->FindBin(-xyMax),secStMCPred->FindBin(xyMax));
295 if(partname=="PosP")sec=secMCPred->Integral(secMCPred->FindBin(-xyMax),secMCPred->FindBin(xyMax));
296 }
297 else{
298 prim=1;
299 secSt=1;
300 if(partname=="PosP")sec=1;
301 }
302 Printf("Yields: primary=%f material=%f strange=%f\n",prim,sec,secSt);
303 return prim/(prim+secSt+sec);
304}