1 //Christine Nattrass, University of Tennessee at Knoxville
2 //This macro is to calculate the contributions to Et from various particles based on Levy fits to ALICE data at 900 GeV
3 //It uses d^2N/dpTdy from the papers, weighs it by Et, and integrates over all pT.
5 //A=1 for antinucleons since they would anihilate in the calorimeter if they were observed by a calorimeter
6 //A=-1 for nucleons since they would not anihilate and their mass would not be measured
7 //At the end this is used to calculate the pid calculation correction
8 class AliAnalysisLevyPtModified{
10 virtual ~AliAnalysisLevyPtModified(){;};
13 Double_t Evaluate(Double_t *pt, Double_t *par)
15 Double_t ldNdy = par[0];
16 Double_t l2pi = 2*TMath::Pi();
17 Double_t lTemp = par[1];
18 Double_t lPower = par[2];
19 Double_t lMass = par[3];
21 Double_t lMassEt = par[5];//only used for calculating Et
22 //this is the Et we would calculate if we had identified the particle as having a mass lMassEt
23 Double_t Et = TMath::Sqrt(pt[0]*pt[0]+lMassEt*lMassEt)+A*lMassEt;
25 Double_t lBigCoef = ((lPower-1)*(lPower-2)) / (l2pi*lPower*lTemp*(lPower*lTemp+lMass*(lPower-2)));
26 Double_t lInPower = 1 + (TMath::Sqrt(pt[0]*pt[0]+lMass*lMass)-lMass) / (lPower*lTemp);
27 //This is the density of particles times the Et weight
28 return ldNdy *Et* pt[0] * lBigCoef * TMath::Power(lInPower,(-1)*lPower);
30 ClassDef(AliAnalysisLevyPtModified, 1);
32 class AliAnalysisLevyPtModifiedStrangeness{
34 virtual ~AliAnalysisLevyPtModifiedStrangeness(){;};
37 Double_t Evaluate(Double_t *pt, Double_t *par)
39 Double_t ldNdy = par[0];
40 Double_t l2pi = 2*TMath::Pi();
41 Double_t lTemp = par[1];
42 Double_t lPower = par[2];
43 Double_t lMass = par[3];
45 Double_t lMassEt = par[5];//only used for calculating Et
46 //this is the Et we would calculate if we had identified the particle as having a mass lMassEt
47 Double_t Et = TMath::Sqrt(pt[0]*pt[0]+lMassEt*lMassEt)+A*lMassEt;
49 Double_t lBigCoef = ((lPower-1)*(lPower-2)) / (l2pi*lPower*lTemp*(lPower*lTemp+lMass*(lPower-2)));
50 Double_t lInPower = 1 + (TMath::Sqrt(pt[0]*pt[0]+lMass*lMass)-lMass) / (lPower*lTemp);
51 Double_t strangeness = (0.4333333*pt[0]-0.0666666)/(0.2333333333*pt[0]-0.01666666);
52 if(strangeness<1.0 || pt[0]<0.1) strangeness = 1.0;
53 //This is the density of particles times the Et weight
54 return ldNdy *strangeness* Et* pt[0] * lBigCoef * TMath::Power(lInPower,(-1)*lPower);
56 ClassDef(AliAnalysisLevyPtModifiedStrangeness, 1);
58 class AliAnalysisLevyPtModifiedBaryonEnhanced{
60 virtual ~AliAnalysisLevyPtModifiedBaryonEnhanced(){;};
63 Double_t Evaluate(Double_t *pt, Double_t *par)
65 Double_t ldNdy = par[0];
66 Double_t l2pi = 2*TMath::Pi();
67 Double_t lTemp = par[1];
68 Double_t lPower = par[2];
69 Double_t lMass = par[3];
71 Double_t lMassEt = par[5];//only used for calculating Et
72 Double_t lBary0 = par[6];
73 Double_t lBary1 = par[7];
74 Double_t lBary2 = par[8];
75 Double_t lBary3 = par[9];
76 Double_t lBary4 = par[10];
77 Double_t lBary5 = par[11];
78 //this is the Et we would calculate if we had identified the particle as having a mass lMassEt
79 Double_t Et = TMath::Sqrt(pt[0]*pt[0]+lMassEt*lMassEt)+A*lMassEt;
81 Double_t lBigCoef = ((lPower-1)*(lPower-2)) / (l2pi*lPower*lTemp*(lPower*lTemp+lMass*(lPower-2)));
82 Double_t lInPower = 1 + (TMath::Sqrt(pt[0]*pt[0]+lMass*lMass)-lMass) / (lPower*lTemp);
83 //this is the baryon enhancement factor
84 Double_t baryonEnhancement = lBary0*pow(pt[0],lBary1)*exp(-pow(pt[0]/lBary2,lBary3))/(lBary4+lBary5*pt[0]);
85 if(baryonEnhancement<1.0) baryonEnhancement = 1.0;
86 Double_t strangeness = (0.4333333*pt[0]-0.0666666)/(0.2333333333*pt[0]-0.01666666);
87 if(strangeness<1.0 || pt[0]<0.1) strangeness = 1.0;
88 //This is the density of particles times the Et weight
89 return ldNdy *Et*strangeness* baryonEnhancement*pt[0] * lBigCoef * TMath::Power(lInPower,(-1)*lPower); }
90 ClassDef(AliAnalysisLevyPtModifiedBaryonEnhanced, 1);
92 class AliAnalysisLevyPtModifiedStrangenessBaryonEnhanced{
94 virtual ~AliAnalysisLevyPtModifiedStrangenessBaryonEnhanced(){;};
97 Double_t Evaluate(Double_t *pt, Double_t *par)
99 Double_t ldNdy = par[0];
100 Double_t l2pi = 2*TMath::Pi();
101 Double_t lTemp = par[1];
102 Double_t lPower = par[2];
103 Double_t lMass = par[3];
105 Double_t lMassEt = par[5];//only used for calculating Et
106 Double_t lBary0 = par[6];
107 Double_t lBary1 = par[7];
108 Double_t lBary2 = par[8];
109 Double_t lBary3 = par[9];
110 Double_t lBary4 = par[10];
111 Double_t lBary5 = par[11];
112 //this is the Et we would calculate if we had identified the particle as having a mass lMassEt
113 Double_t Et = TMath::Sqrt(pt[0]*pt[0]+lMassEt*lMassEt)+A*lMassEt;
115 Double_t lBigCoef = ((lPower-1)*(lPower-2)) / (l2pi*lPower*lTemp*(lPower*lTemp+lMass*(lPower-2)));
116 Double_t lInPower = 1 + (TMath::Sqrt(pt[0]*pt[0]+lMass*lMass)-lMass) / (lPower*lTemp);
117 //this is the baryon enhancement factor
118 Double_t baryonEnhancement = lBary0*pow(pt[0],lBary1)*exp(-pow(pt[0]/lBary2,lBary3))/(lBary4+lBary5*pt[0]);
119 if(baryonEnhancement<1.0) baryonEnhancement = 1.0;
120 //This is the density of particles times the Et weight
121 return ldNdy *Et* baryonEnhancement*pt[0] * lBigCoef * TMath::Power(lInPower,(-1)*lPower); }
122 ClassDef(AliAnalysisLevyPtModifiedStrangenessBaryonEnhanced, 1);
125 void CorrPIDLevyFit(bool hadronic = false){
126 //pt cuts where we can identify things
127 float protoncut = 0.9+0.25;
128 float protoncuterr = 0.25;
129 float kaoncut = 0.45+0.25;
130 float kaoncuterr = 0.25;
133 // particle & $\frac{dN}{dy}$ & T (GeV) & n & $\frac{dE_T}{dy}$& a &\ET \\ \hline
134 // $\pi^{+}+\pi^{-}$ & 2.977 $\pm$ 0.15 & 0.126 $\pm$ 0.001 & 7.82 $\pm$ 0.1 & & & \\
135 AliAnalysisLevyPtModified *function = new AliAnalysisLevyPtModified();
136 fPion = new TF1("fPion",function, &AliAnalysisLevyPtModified::Evaluate,0,50,6,"AliAnalysisLevyPtModified","Evaluate");
137 fPion->SetParameter(0,2.977);//dN/dy
138 fPion->SetParameter(1,0.126);//T
139 fPion->SetParameter(2,7.82);//n
140 fPion->SetParameter(3,0.13957);//mass
141 fPion->SetParameter(4,0);//A=0 for pions
142 fPion->SetParameter(5,0.13957);//mass et
143 float integralPion = fPion->Integral(ptcut,50);
144 float integralErrPion = integralPion*0.007/2.977;
145 float myerrorPionT = 0.0;
146 float myerrorPionn = 0.0;
152 fPion->SetParameter(1,T+Terr);//T
153 tmpPion = fPion->Integral(ptcut,50);
154 myerrorPionT = TMath::Abs(integralPion-tmpPion);
155 fPion->SetParameter(1,T-Terr);//T
156 tmpPion = fPion->Integral(ptcut,50);
157 if(TMath::Abs(integralPion-tmpPion)>myerrorPionT) myerrorPionT = TMath::Abs(integralPion-tmpPion);
158 fPion->SetParameter(1,T);//T
159 fPion->SetParameter(2,n+nerr);//n
160 tmpPion = fPion->Integral(ptcut,50);
161 myerrorPionn = TMath::Abs(integralPion-tmpPion);
162 fPion->SetParameter(2,n-nerr);//n
163 tmpPion = fPion->Integral(ptcut,50);
164 if(TMath::Abs(integralPion-tmpPion)>myerrorPionn) myerrorPionn = TMath::Abs(integralPion-tmpPion);
165 //This isn't strictly correct because the errors on the parameters should be correlated but it's close
166 //To get the correct error one would have to fit the spectra data to get the covariance matrix...
167 cout<<"Errors: dN/dy "<<integralErrPion<<" T "<<myerrorPionT<<" n "<<myerrorPionn<<endl;
168 integralErrPion = TMath::Sqrt(TMath::Power(integralErrPion,2)+TMath::Power(myerrorPionT,2)+TMath::Power(myerrorPionn,2));
169 cout<<"Pion Et = "<<integralPion<<"$\\pm$"<<integralErrPion<<endl;
174 // particle & $\frac{dN}{dy}$ & T (GeV) & n & $\frac{dE_T}{dy}$& a &\ET \\ \hline
175 // $K^{+}+K^{-}$ & 0.366 $\pm$ 0.03 & 0.160 $\pm$ 0.006 & 6.087 $\pm$ 0.4 & & & \\
176 fKaon = new TF1("fKaon",function, &AliAnalysisLevyPtModified::Evaluate,0,50,6,"AliAnalysisLevyPtModified","Evaluate");
177 fKaon->SetParameter(0,0.366);//dN/dy
178 fKaon->SetParameter(1,0.160);//T
179 fKaon->SetParameter(2,6.087);//n
180 fKaon->SetParameter(3,0.493677);//mass
181 fKaon->SetParameter(4,0);//A=0 for kaons
182 fKaon->SetParameter(5,0.493677);//mass et
183 fKaonStrange = new TF1("fKaonStrange",function, &AliAnalysisLevyPtModifiedStrangeness::Evaluate,0,50,6,"AliAnalysisLevyPtModifiedStrangeness","Evaluate");
184 for(int i=0;i<6;i++){fKaonStrange->SetParameter(i,fKaon->GetParameter(i));}
185 float integralKaon = fKaon->Integral(ptcut,50);
186 float integralKaonStrange = fKaonStrange->Integral(ptcut,50);
187 float integralErrKaon = integralKaon*0.006/0.366;
188 float myerrorKaonT = 0.0;
189 float myerrorKaonn = 0.0;
195 fKaon->SetParameter(1,T+Terr);//T
196 tmpKaon = fKaon->Integral(ptcut,50);
197 myerrorKaonT = TMath::Abs(integralKaon-tmpKaon);
198 fKaon->SetParameter(1,T-Terr);//T
199 tmpKaon = fKaon->Integral(ptcut,50);
200 if(TMath::Abs(integralKaon-tmpKaon)>myerrorKaonT) myerrorKaonT = TMath::Abs(integralKaon-tmpKaon);
201 fKaon->SetParameter(1,T);//T
202 fKaon->SetParameter(2,n+nerr);//n
203 tmpKaon = fKaon->Integral(ptcut,50);
204 myerrorKaonn = TMath::Abs(integralKaon-tmpKaon);
205 fKaon->SetParameter(2,n-nerr);//n
206 tmpKaon = fKaon->Integral(ptcut,50);
207 if(TMath::Abs(integralKaon-tmpKaon)>myerrorKaonn) myerrorKaonn = TMath::Abs(integralKaon-tmpKaon);
208 //This isn't strictly correct because the errors on the parameters should be correlated but it's close
209 cout<<"Errors: dN/dy "<<integralErrKaon<<" T "<<myerrorKaonT<<" n "<<myerrorKaonn<<endl;
210 integralErrKaon = TMath::Sqrt(TMath::Power(integralErrKaon,2)+TMath::Power(myerrorKaonT,2)+TMath::Power(myerrorKaonn,2));
211 cout<<"Kaon Et = "<<integralKaon<<"$\\pm$"<<integralErrKaon<<endl;
212 cout<<"Kaon Et Strangeness Enhanced = "<<integralKaonStrange<<endl;
213 //now calculate the integral for kaons we can identify:
214 float integralKaonLowPtMean = fKaon->Integral(ptcut,kaoncut);
215 float integralKaonLowPtPlus = fKaon->Integral(ptcut,kaoncut+kaoncuterr);
216 float integralKaonLowPtMinus = fKaon->Integral(ptcut,kaoncut-kaoncuterr);
217 float integralKaonStrangeLowPtMinus = fKaonStrange->Integral(ptcut,kaoncut-kaoncuterr);
218 //now we switch the kaon mass to the pion mass
219 fKaon->SetParameter(5,0.13957);//mass et
220 fKaonStrange->SetParameter(5,0.13957);//mass et
221 //and do the integrals
222 float integralKaonHighPtMean = fKaon->Integral(kaoncut,50);
223 float integralKaonHighPtPlus = fKaon->Integral(kaoncut+kaoncuterr,50);
224 float integralKaonHighPtMinus = fKaon->Integral(kaoncut-kaoncuterr,50);
225 float integralKaonStrangeHighPtMinus = fKaonStrange->Integral(kaoncut-kaoncuterr,50);
226 float integralKaonNoID = fKaon->Integral(ptcut,50);
227 cout<<"Kaon Et as pion = "<<integralKaonHighPtMean+integralKaonLowPtMean<<endl;
228 cout<<"Kaon Et Strange as pion = "<<integralKaonStrangeHighPtMinus+integralKaonStrangeLowPtMinus<<endl;
229 TF1 *fKaonPion = fKaon->Clone("fKaonPion");
230 //and change it back just to avoid confusion
231 fKaon->SetParameter(5,0.493677);//mass et
232 fKaonStrange->SetParameter(5,0.493677);//mass et
234 // particle & $\frac{dN}{dy}$ & T (GeV) & n & $\frac{dE_T}{dy}$& a &\ET \\ \hline
235 // $p + \bar{p}$ & 0.157 $\pm$ 0.012 & 0.196 $\pm$ 0.009 & 8.6 $\pm$ 1.1 & & & \\
236 fProton = new TF1("fProton",function, &AliAnalysisLevyPtModified::Evaluate,0,50,6,"AliAnalysisLevyPtModified","Evaluate");
237 fProton->SetParameter(0,0.08);//dN/dy
238 fProton->SetParameter(1,0.196);//T
239 fProton->SetParameter(2,8.6);//n
240 fProton->SetParameter(3,0.938272);//mass
241 fProton->SetParameter(4,-1);//A=0 for protons
242 fProton->SetParameter(5,0.938272);//mass et
243 fProtonEnhanced = new TF1("fProtonEnhanced",function, &AliAnalysisLevyPtModifiedBaryonEnhanced::Evaluate,0,50,12,"AliAnalysisLevyPtModifiedBaryonEnhanced","Evaluate");
244 for(int i=0;i<6;i++){fProtonEnhanced->SetParameter(i,fProton->GetParameter(i));}//set all of the spectra parameters to their normal values
245 //and now set the baryon enhancement parameters
246 fProtonEnhanced->SetParameter(6,0.900878);
247 fProtonEnhanced->SetParameter(7,1.38882);
248 fProtonEnhanced->SetParameter(8,2.6361);
249 fProtonEnhanced->SetParameter(9,1.37751);
250 fProtonEnhanced->SetParameter(10,0.5);
251 fProtonEnhanced->SetParameter(11,-0.03);
252 float integralProton = fProton->Integral(ptcut,50);
253 float integralErrProton = integralProton*0.002/0.08;
254 float myerrorProtonT = 0.0;
255 float myerrorProtonn = 0.0;
261 fProton->SetParameter(1,T+Terr);//T
262 tmpProton = fProton->Integral(ptcut,50);
263 myerrorProtonT = TMath::Abs(integralProton-tmpProton);
264 fProton->SetParameter(1,T-Terr);//T
265 tmpProton = fProton->Integral(ptcut,50);
266 if(TMath::Abs(integralProton-tmpProton)>myerrorProtonT) myerrorProtonT = TMath::Abs(integralProton-tmpProton);
267 fProton->SetParameter(1,T);//T
268 fProton->SetParameter(2,n+nerr);//n
269 tmpProton = fProton->Integral(ptcut,50);
270 myerrorProtonn = TMath::Abs(integralProton-tmpProton);
271 fProton->SetParameter(2,n-nerr);//n
272 tmpProton = fProton->Integral(ptcut,50);
273 if(TMath::Abs(integralProton-tmpProton)>myerrorProtonn) myerrorProtonn = TMath::Abs(integralProton-tmpProton);
274 //This isn't strictly correct because the errors on the parameters should be correlated but it's close
275 cout<<"Errors: dN/dy "<<integralErrProton<<" T "<<myerrorProtonT<<" n "<<myerrorProtonn<<endl;
276 integralErrProton = TMath::Sqrt(TMath::Power(integralErrProton,2)+TMath::Power(myerrorProtonT,2)+TMath::Power(myerrorProtonn,2));
277 cout<<"Proton Et = "<<integralProton<<"$\\pm$"<<integralErrProton<<endl;
278 //now calculate the integral for kaons we can identify:
279 float integralProtonLowPtMean = fProton->Integral(ptcut,protoncut);
280 float integralProtonLowPtPlus = fProton->Integral(ptcut,protoncut+protoncuterr);
281 float integralProtonLowPtMinus = fProton->Integral(ptcut,protoncut-protoncuterr);
282 float integralProtonEnhancedTrue =integralProtonLowPtMinus+ fProtonEnhanced->Integral(protoncut-protoncuterr,50);
283 fProtonEnhanced->SetParameter(6,1.2*fProtonEnhanced->GetParameter(6));
284 float integralProtonReallyEnhancedTrue = integralProtonLowPtMinus+ fProtonEnhanced->Integral(protoncut-protoncuterr,50);
285 fProtonEnhanced->SetParameter(6,1.0/1.2*fProtonEnhanced->GetParameter(6));
286 //now we switch the kaon mass to the pion mass
287 fProton->SetParameter(5,0.13957);//mass et
288 fProton->SetParameter(4,0);//A=0 for pions
289 //and do the integrals
290 float integralProtonHighPtMean = fProton->Integral(protoncut,50);
291 float integralProtonHighPtPlus = fProton->Integral(protoncut+protoncuterr,50);
292 float integralProtonHighPtMinus = fProton->Integral(protoncut-protoncuterr,50);
294 //now we switch the kaon mass to the pion mass
295 fProtonEnhanced->SetParameter(5,0.13957);//mass et
296 fProtonEnhanced->SetParameter(4,0);//A=0 for pions
297 float integralProtonHighPtMinusEnhanced = fProtonEnhanced->Integral(protoncut-protoncuterr,50);
298 fProtonEnhanced->SetParameter(6,1.2*fProtonEnhanced->GetParameter(6));
299 float integralProtonHighPtMinusReallyEnhanced = fProtonEnhanced->Integral(protoncut-protoncuterr,50);
300 fProtonEnhanced->SetParameter(6,1.0/1.2*fProtonEnhanced->GetParameter(6));
302 float integralProtonNoID = fProton->Integral(ptcut,50);
303 float integralProtonEnhancedNoID = integralProtonHighPtMinusEnhanced+integralProtonLowPtMinus;
304 float integralProtonReallyEnhancedNoID = integralProtonHighPtMinusReallyEnhanced+integralProtonLowPtMinus;
305 cout<<"Proton Et as pion = "<<integralProtonHighPtMean+integralProtonLowPtMean<<endl;
306 cout<<"Proton Et really enhanced = "<<integralProtonReallyEnhancedTrue<<"("<<integralProtonHighPtMinusReallyEnhanced+integralProtonLowPtMinus<<")"<<endl;
307 TF1 *fProtonPion = fProton->Clone("fProtonPion");
308 //and change it back just to avoid confusion
309 fProton->SetParameter(5,0.938272);//mass et
310 fProton->SetParameter(4,-1);//A=0 for protons
311 fProtonEnhanced->SetParameter(5,0.938272);//mass et
312 fProtonEnhanced->SetParameter(4,-1);//A=0 for protons
317 fProton->SetParameter(0,0.077);//dN/dy
318 fProton->SetParameter(2,n);//n
319 fProton->SetParameter(4,1);//A=0 for protons
320 fAntiProtonEnhanced = new TF1("fAntiProtonEnhanced",function, &AliAnalysisLevyPtModifiedBaryonEnhanced::Evaluate,0,50,12,"AliAnalysisLevyPtModifiedBaryonEnhanced","Evaluate");
321 for(int i=0;i<6;i++){fAntiProtonEnhanced->SetParameter(i,fProton->GetParameter(i));}//set all of the spectra parameters to their normal values
322 //and now set the baryon enhancement parameters
323 fAntiProtonEnhanced->SetParameter(6,0.900878);
324 fAntiProtonEnhanced->SetParameter(7,1.38882);
325 fAntiProtonEnhanced->SetParameter(8,2.6361);
326 fAntiProtonEnhanced->SetParameter(9,1.37751);
327 fAntiProtonEnhanced->SetParameter(10,0.5);
328 fAntiProtonEnhanced->SetParameter(11,-0.03);
329 float integralAntiProton = fProton->Integral(ptcut,50);
330 float integralErrAntiProton = integralAntiProton*0.002/0.077;
331 float myerrorAntiProtonT = 0.0;
332 float myerrorAntiProtonn = 0.0;
338 fProton->SetParameter(1,T+Terr);//T
339 tmpAntiProton = fProton->Integral(ptcut,50);
340 myerrorAntiProtonT = TMath::Abs(integralAntiProton-tmpAntiProton);
341 fProton->SetParameter(1,T-Terr);//T
342 tmpAntiProton = fProton->Integral(ptcut,50);
343 if(TMath::Abs(integralAntiProton-tmpAntiProton)>myerrorAntiProtonT) myerrorAntiProtonT = TMath::Abs(integralAntiProton-tmpAntiProton);
344 fProton->SetParameter(1,T);//T
345 fProton->SetParameter(2,n+nerr);//n
346 tmpAntiProton = fProton->Integral(ptcut,50);
347 myerrorAntiProtonn = TMath::Abs(integralAntiProton-tmpAntiProton);
348 fProton->SetParameter(2,n-nerr);//n
349 tmpAntiProton = fProton->Integral(ptcut,50);
350 if(TMath::Abs(integralAntiProton-tmpAntiProton)>myerrorAntiProtonn) myerrorAntiProtonn = TMath::Abs(integralAntiProton-tmpAntiProton);
351 //This isn't strictly correct because the errors on the parameters should be correlated but it's close
352 cout<<"Errors: dN/dy "<<integralErrAntiProton<<" T "<<myerrorAntiProtonT<<" n "<<myerrorAntiProtonn<<endl;
353 integralErrAntiProton = TMath::Sqrt(TMath::Power(integralErrAntiProton,2)+TMath::Power(myerrorAntiProtonT,2)+TMath::Power(myerrorAntiProtonn,2));
354 cout<<"AntiProton Et = "<<integralAntiProton<<"$\\pm$"<<integralErrAntiProton<<endl;
355 TF1 *fAntiProton = fProton->Clone("fAntiProton");
356 //now calculate the integral for kaons we can identify:
357 float integralAntiProtonLowPtMean = fProton->Integral(ptcut,protoncut);
358 float integralAntiProtonLowPtPlus = fProton->Integral(ptcut,protoncut+protoncuterr);
359 float integralAntiProtonLowPtMinus = fProton->Integral(ptcut,protoncut-protoncuterr);
360 float integralAntiProtonEnhancedTrue =integralAntiProtonLowPtMinus+ fAntiProtonEnhanced->Integral(protoncut-protoncuterr,50);
361 fAntiProtonEnhanced->SetParameter(6,1.2*fAntiProtonEnhanced->GetParameter(6));
362 float integralAntiProtonReallyEnhancedTrue = integralAntiProtonLowPtMinus+ fAntiProtonEnhanced->Integral(protoncut-protoncuterr,50);
363 fAntiProtonEnhanced->SetParameter(6,1.0/1.2*fAntiProtonEnhanced->GetParameter(6));
364 //now we switch the kaon mass to the pion mass
365 fProton->SetParameter(5,0.13957);//mass et
366 fProton->SetParameter(4,0);//A=0 for pions
367 //and do the integrals
368 float integralAntiProtonHighPtMean = fProton->Integral(protoncut,50);
369 float integralAntiProtonHighPtPlus = fProton->Integral(protoncut+protoncuterr,50);
370 float integralAntiProtonHighPtMinus = fProton->Integral(protoncut-protoncuterr,50);
372 //now we switch the kaon mass to the pion mass
373 fAntiProtonEnhanced->SetParameter(5,0.13957);//mass et
374 fAntiProtonEnhanced->SetParameter(4,0);//A=0 for pions
375 float integralAntiProtonHighPtMinusEnhanced = fAntiProtonEnhanced->Integral(protoncut-protoncuterr,50);
376 fAntiProtonEnhanced->SetParameter(6,1.2*fAntiProtonEnhanced->GetParameter(6));
377 float integralAntiProtonHighPtMinusReallyEnhanced = fAntiProtonEnhanced->Integral(protoncut-protoncuterr,50);
378 fAntiProtonEnhanced->SetParameter(6,1.0/1.2*fAntiProtonEnhanced->GetParameter(6));
380 float integralAntiProtonNoID = fProton->Integral(ptcut,50);
381 cout<<"AntiProton Et as pion = "<<integralAntiProtonHighPtMean+integralAntiProtonLowPtMean<<endl;
382 cout<<"AntiProton Et really enhanced = "<<integralAntiProtonReallyEnhancedTrue<<"("<<integralAntiProtonHighPtMinusReallyEnhanced+integralAntiProtonLowPtMinus<<")"<<endl;
383 TF1 *fAntiProtonPion = fProton->Clone("fAntiProtonPion");
384 //and change it back just to avoid confusion
385 fProton->SetParameter(5,0.938272);//mass
386 //cout<<"CHECK "<<fProton->GetParameter(5)<<endl;
387 fProton->SetParameter(4,-1);//A=0 for protons
388 fAntiProtonEnhanced->SetParameter(5,0.938272);//mass et
389 fAntiProtonEnhanced->SetParameter(4,-1);//A=0 for protons
391 float totTrue = integralPion + integralKaon + integralProton + integralAntiProton;
392 float totTrueErr = TMath::Sqrt(TMath::Power(integralErrAntiProton,2)+TMath::Power(integralErrProton,2)+TMath::Power(integralErrKaon,2)+TMath::Power(integralErrPion,2));
393 float totTrueEnhanced = integralPion + integralKaon + integralProtonEnhancedTrue + integralAntiProtonEnhancedTrue;
394 float totTrueReallyEnhanced = integralPion + integralKaon + integralProtonReallyEnhancedTrue + integralAntiProtonReallyEnhancedTrue;
395 float totTrueStrange = integralPion + integralKaonStrange + integralProton + integralAntiProton;
396 float totTrueStrangeEnhanced = integralPion + integralKaonStrange + integralProtonReallyEnhancedTrue + integralAntiProtonReallyEnhancedTrue;
397 cout<<"totEt "<<totTrue<<"+/-"<<totTrueErr<<endl;
399 float measEt = integralPion+integralKaonLowPtMean+integralKaonHighPtMean+integralProtonLowPtMean+integralProtonHighPtMean+integralAntiProtonLowPtMean+integralAntiProtonHighPtMean;
400 float measEtPlus = integralPion+integralKaonLowPtPlus+integralKaonHighPtPlus+integralProtonLowPtPlus+integralProtonHighPtPlus+integralAntiProtonLowPtPlus+integralAntiProtonHighPtPlus;
401 float measEtMinus = integralPion+integralKaonLowPtMinus+integralKaonHighPtMinus+integralProtonLowPtMinus+integralProtonHighPtMinus+integralAntiProtonLowPtMinus+integralAntiProtonHighPtMinus;
402 float measEtMinusStrange = integralPion+integralKaonStrangeLowPtMinus+integralKaonStrangeHighPtMinus+integralProtonLowPtMinus+integralProtonHighPtMinus+integralAntiProtonLowPtMinus+integralAntiProtonHighPtMinus;
403 float measEtEnhanced = integralPion+integralKaonLowPtMinus+integralKaonHighPtMinus+integralProtonLowPtMinus+integralProtonHighPtMinusEnhanced+integralAntiProtonLowPtMinus+integralAntiProtonHighPtMinusEnhanced;
404 float measEtReallyEnhanced = integralPion+integralKaonLowPtMinus+integralKaonHighPtMinus+integralProtonLowPtMinus+integralProtonHighPtMinusReallyEnhanced+integralAntiProtonLowPtMinus+integralAntiProtonHighPtMinusReallyEnhanced;
405 cout<<"measEt "<<measEt<<" "<<measEtPlus<<" "<<measEtMinus<<endl;
406 float measEtStrangeEnhanced = integralPion+integralKaonStrangeLowPtMinus+integralKaonStrangeHighPtMinus+integralProtonLowPtMinus+integralProtonHighPtMinusReallyEnhanced+integralAntiProtonLowPtMinus+integralAntiProtonHighPtMinusReallyEnhanced;
407 cout<<"measEt "<<measEt<<" "<<measEtPlus<<" "<<measEtMinus<<endl;
408 float measNoID = integralPion+integralKaonNoID+integralProtonNoID+integralAntiProtonNoID;
410 float fpid = measEt/totTrue;
411 float fpiderr = fpid*totTrueErr/totTrue;
412 float fpidsyserr = TMath::Abs(measEtMinus-measEt)/totTrue;
413 float fnopid = measNoID/totTrue;
414 float fnopiderr = fnopid*totTrueErr/totTrue;
415 if(TMath::Abs(measEtPlus-measEt)> fpidsyserr) fpidsyserr = TMath::Abs(measEtPlus-measEt);
416 cout<<"fpid "<<fpid<<" +/- "<<fpiderr<<" +/- "<<fpidsyserr<<endl;
417 cout<<"fpid (no pt uncertainty) "<<measEtMinus/totTrue<<" +/- "<<(measEtMinus/totTrue)*totTrueErr/totTrue<<endl;
418 cout<<"For no id fpid "<<fnopid<<" +/- "<<fnopiderr<<endl;
419 cout<<"fpid enhanced "<<measEtEnhanced/totTrueEnhanced<<endl;
420 cout<<"fpid strange "<<measEtMinusStrange/totTrueStrange<<endl;
421 cout<<"fpid strange enhanced "<<measEtStrangeEnhanced/totTrueStrangeEnhanced<<endl;
422 cout<<"fpid really enhanced "<<measEtReallyEnhanced/totTrueReallyEnhanced<<endl;
426 gStyle->SetOptTitle(0);
427 gStyle->SetOptStat(0);
428 gStyle->SetOptFit(0);
429 TCanvas *c1 = new TCanvas("c1","c1",500,400);
430 c1->SetTopMargin(0.02);
431 c1->SetRightMargin(0.02);
432 c1->SetBorderSize(0);
435 c1->SetBorderMode(0);
436 c1->SetFrameFillColor(0);
437 c1->SetFrameBorderMode(0);
439 fPion->SetLineColor(1);
440 fKaon->SetLineColor(2);
441 fKaonPion->SetLineColor(2);
442 fKaonPion->SetLineStyle(2);
443 fProton->SetLineColor(4);
444 fProtonPion->SetLineColor(4);
445 fProtonPion->SetLineStyle(2);
446 fAntiProton->SetLineColor(TColor::kCyan);
447 fAntiProtonPion->SetLineColor(TColor::kCyan);
448 fAntiProtonPion->SetLineStyle(2);
449 // cout<<"Kaon pion mass "<<Form("%2.4f",fKaonPion->GetParameter(5))<<" A "<<fKaonPion->GetParameter(4)<<endl;
450 // cout<<"Proton pion mass "<<fProtonPion->GetParameter(5)<<" A "<<fProtonPion->GetParameter(4)<<endl;
451 // cout<<"AntiProton pion mass "<<fAntiProtonPion->GetParameter(5)<<" A "<<fAntiProtonPion->GetParameter(4)<<endl;
452 // cout<<"Kaon mass "<<Form("%2.4f",fKaon->GetParameter(5))<<" A "<<fKaon->GetParameter(4)<<endl;
453 // cout<<"Proton mass "<<fProton->GetParameter(5)<<" A "<<fProton->GetParameter(4)<<endl;
454 // cout<<"AntiProton mass "<<fAntiProton->GetParameter(5)<<" A "<<fAntiProton->GetParameter(4)<<endl;
455 TH1F *frame = new TH1F("frame","frame",1,0,2);
456 frame->GetYaxis()->SetTitle("1/N_{eve}d^{2}NE_{T}/dydp_{T}");
457 frame->GetXaxis()->SetTitle("p_{T}");
458 //fPion->SetRange(0,2);
459 frame->SetMinimum(1e-4);
460 frame->SetMaximum(0.5);
464 fProton->Draw("same");
465 fAntiProton->Draw("same");
466 fKaonPion->Draw("same");
467 fProtonPion->Draw("same");
468 fAntiProtonPion->Draw("same");
469 TLegend *leg = new TLegend(0.782258,0.774194,0.925403,0.962366);
470 leg->AddEntry(fPion,"#pi");
471 leg->AddEntry(fProton,"p");
472 leg->AddEntry(fKaon,"K");
473 leg->AddEntry(fAntiProton,"#bar{p}");
474 leg->SetFillStyle(0);
475 leg->SetFillColor(0);
476 leg->SetBorderSize(0);
477 leg->SetTextSize(0.06);
479 TLine *lineProton = new TLine(protoncut-protoncuterr,frame->GetMinimum(),protoncut-protoncuterr,frame->GetMaximum());
480 lineProton->SetLineColor(fProton->GetLineColor());
481 lineProton->SetLineStyle(3);
482 lineProton->SetLineWidth(2);
484 TLine *lineKaon = new TLine(kaoncut-kaoncuterr,frame->GetMinimum(),kaoncut-kaoncuterr,frame->GetMaximum());
485 lineKaon->SetLineColor(fKaon->GetLineColor());
486 lineKaon->SetLineStyle(3);
487 lineKaon->SetLineWidth(2);
491 TCanvas *c2 = new TCanvas("c2","c2",500,400);
492 c2->SetTopMargin(0.02);
493 c2->SetRightMargin(0.02);
494 c2->SetBorderSize(0);
497 c2->SetBorderMode(0);
498 c2->SetFrameFillColor(0);
499 c2->SetFrameBorderMode(0);
501 fPionSpectrum = (TF1*) fPion->Clone("fPionSpectrum");
502 fKaonSpectrum = (TF1*) fKaon->Clone("fKaonSpectrum");
503 fProtonSpectrum = (TF1*) fProton->Clone("fProtonSpectrum");
504 fAntiProtonSpectrum = (TF1*) fAntiProton->Clone("fAntiProtonSpectrum");
505 fPionSpectrum->SetLineColor(1);
506 fKaonSpectrum->SetLineColor(2);
507 fProtonSpectrum->SetLineColor(4);
508 fAntiProtonSpectrum->SetLineColor(TColor::kCyan);
509 fKaonSpectrum->SetParameter(5,0.0);//mass et
510 fProtonSpectrum->SetParameter(5,0.0);//mass et
511 fPionSpectrum->SetParameter(5,0.0);//mass et
512 fAntiProtonSpectrum->SetParameter(5,0.0);//mass et
513 TH1F *frame2 = new TH1F("frame2","frame2",1,0,2);
514 frame2->GetYaxis()->SetTitle("1/N_{eve}d^{2}N/dydp_{T}");
515 frame2->GetXaxis()->SetTitle("p_{T}");
516 //fPionSpectrum->SetRange(0,2);
517 frame2->SetMinimum(1e-5);
518 frame2->SetMaximum(1);
520 fPionSpectrum->Draw("same");
521 fKaonSpectrum->Draw("same");
522 fProtonSpectrum->Draw("same");
523 //fAntiProtonSpectrum->Draw("same");
524 TLegend *leg2 = new TLegend(0.782258,0.774194,0.925403,0.962366);
525 leg2->AddEntry(fPionSpectrum,"#pi");
526 leg2->AddEntry(fProtonSpectrum,"p,#bar{p}");
527 leg2->AddEntry(fKaonSpectrum,"K");
528 leg2->SetFillStyle(0);
529 leg2->SetFillColor(0);
530 leg2->SetBorderSize(0);
531 leg2->SetTextSize(0.06);
534 TCanvas *c3 = new TCanvas("c3","c3",500,400);
535 c3->SetTopMargin(0.02);
536 c3->SetRightMargin(0.02);
537 c3->SetBorderSize(0);
540 c3->SetBorderMode(0);
541 c3->SetFrameFillColor(0);
542 c3->SetFrameBorderMode(0);
544 TH1F *frame3 = new TH1F("frame3","frame3",1,0,2);
545 frame3->GetYaxis()->SetTitle("E_{T}");
546 frame3->GetXaxis()->SetTitle("p_{T}");
547 //fPionSpectrum->SetRange(0,2);
548 frame3->SetMinimum(0.0);
549 frame3->SetMaximum(4);
552 TF1 *fPionEt = new TF1("fPionEt","sqrt(x*x+[0]*[0])",0,2);
553 fPionEt->SetParameter(0,0.13957);
554 fPionEt->Draw("same");
555 TF1 *fKaonEt = new TF1("fKaonEt","sqrt(x*x+[0]*[0])",0,2);
556 fKaonEt->SetParameter(0,0.493677);
557 fKaonEt->Draw("same");
558 TF1 *fProtonEt = new TF1("fProtonEt","sqrt(x*x+[0]*[0])-[0]",0,2);
559 fProtonEt->SetParameter(0,0.938272);
560 fProtonEt->Draw("same");
561 TF1 *fAntiProtonEt = new TF1("fAntiProtonEt","sqrt(x*x+[0]*[0])+[0]",0,2);
562 fAntiProtonEt->SetParameter(0,0.938272);
563 fAntiProtonEt->Draw("same");
564 fPionEt->SetLineColor(1);
565 fKaonEt->SetLineColor(2);
566 fProtonEt->SetLineColor(4);
567 fAntiProtonEt->SetLineColor(TColor::kCyan);
568 TLegend *leg3 = new TLegend(0.782258,0.774194,0.925403,0.962366);
569 leg3->AddEntry(fPionEt,"#pi");
570 leg3->AddEntry(fProtonEt,"p");
571 leg3->AddEntry(fAntiProtonEt,"#bar{p}");
572 leg3->AddEntry(fKaonEt,"K");
573 leg3->SetFillStyle(0);
574 leg3->SetFillColor(0);
575 leg3->SetBorderSize(0);
576 leg3->SetTextSize(0.06);
579 c1->SaveAs("pics/PIDEtweight.eps");
580 c2->SaveAs("pics/PIDSpectra.eps");
581 c3->SaveAs("pics/PIDEt.eps");