]>
Commit | Line | Data |
---|---|---|
6c178944 | 1 | /************************************************************************** |
2 | * Author: Panos Christakoglou. * | |
3 | * Contributors are mentioned in the code where appropriate. * | |
4 | * * | |
5 | * Permission to use, copy, modify and distribute this software and its * | |
6 | * documentation strictly for non-commercial purposes is hereby granted * | |
7 | * without fee, provided that the above copyright notice appears in all * | |
8 | * copies and that both the copyright notice and this permission notice * | |
9 | * appear in the supporting documentation. The authors make no claims * | |
10 | * about the suitability of this software for any purpose. It is * | |
11 | * provided "as is" without express or implied warranty. * | |
12 | **************************************************************************/ | |
13 | ||
14 | /* $Id$ */ | |
15 | ||
16 | //----------------------------------------------------------------- | |
17 | // Balance Function class | |
18 | // This is the class to deal with the Balance Function analysis | |
19 | // Origin: Panos Christakoglou, UOA-CERN, Panos.Christakoglou@cern.ch | |
20 | //----------------------------------------------------------------- | |
21 | ||
22 | ||
23 | //ROOT | |
24 | #include <Riostream.h> | |
25 | #include <TMath.h> | |
d560b581 | 26 | #include <TAxis.h> |
74b04dd4 | 27 | #include <TH2D.h> |
6c178944 | 28 | #include <TLorentzVector.h> |
5c33329d | 29 | #include <TObjArray.h> |
6c178944 | 30 | #include <TGraphErrors.h> |
9d1f0df5 | 31 | #include <TString.h> |
6c178944 | 32 | |
cd54a838 | 33 | #include "AliVParticle.h" |
34 | #include "AliMCParticle.h" | |
5c33329d | 35 | #include "AliESDtrack.h" |
cd54a838 | 36 | #include "AliAODTrack.h" |
37 | ||
6c178944 | 38 | #include "AliBalance.h" |
39 | ||
40 | ClassImp(AliBalance) | |
41 | ||
7f0257ea | 42 | //____________________________________________________________________// |
5d534bd4 | 43 | AliBalance::AliBalance() : |
44 | TObject(), | |
6432ac6a | 45 | bShuffle(kFALSE), |
49a3750f | 46 | bHBTcut(kFALSE), |
845fdeca | 47 | bConversionCut(kFALSE), |
3feee083 | 48 | fAnalysisLevel("ESD"), |
6a3f819e | 49 | fAnalyzedEvents(0) , |
74b04dd4 | 50 | fCentralityId(0) , |
51 | fCentStart(0.), | |
52 | fCentStop(0.) | |
53 | { | |
6c178944 | 54 | // Default constructor |
3feee083 | 55 | |
b966652f | 56 | for(Int_t i = 0; i < ANALYSIS_TYPES; i++){ |
57 | if(i == 6) { | |
58 | fNumberOfBins[i] = 180; | |
6432ac6a | 59 | fP1Start[i] = -360.0; |
b966652f | 60 | fP1Stop[i] = 360.0; |
61 | fP2Start[i] = -360.0; | |
62 | fP2Stop[i] = 360.0; | |
63 | fP2Step[i] = 0.1; | |
64 | } | |
65 | else { | |
66 | fNumberOfBins[i] = 20; | |
67 | fP1Start[i] = -1.0; | |
68 | fP1Stop[i] = 1.0; | |
69 | fP2Start[i] = 0.0; | |
70 | fP2Stop[i] = 2.0; | |
71 | } | |
72 | fP2Step[i] = TMath::Abs(fP2Start - fP2Stop) / (Double_t)fNumberOfBins[i]; | |
74b04dd4 | 73 | fCentStart = 0.; |
74 | fCentStop = 0.; | |
75 | ||
b966652f | 76 | fNn[i] = 0.0; |
77 | fNp[i] = 0.0; | |
3feee083 | 78 | |
79 | for(Int_t j = 0; j < MAXIMUM_NUMBER_OF_STEPS; j++) { | |
80 | fNpp[i][j] = .0; | |
81 | fNnn[i][j] = .0; | |
82 | fNpn[i][j] = .0; | |
6432ac6a | 83 | fNnp[i][j] = .0; |
3feee083 | 84 | fB[i][j] = 0.0; |
85 | ferror[i][j] = 0.0; | |
6432ac6a | 86 | } |
b966652f | 87 | |
6432ac6a | 88 | fHistP[i] = NULL; |
89 | fHistN[i] = NULL; | |
90 | fHistPP[i] = NULL; | |
91 | fHistPN[i] = NULL; | |
92 | fHistNP[i] = NULL; | |
93 | fHistNN[i] = NULL; | |
b966652f | 94 | |
95 | } | |
6c178944 | 96 | } |
97 | ||
6c178944 | 98 | |
7f0257ea | 99 | //____________________________________________________________________// |
100 | AliBalance::AliBalance(const AliBalance& balance): | |
49a3750f | 101 | TObject(balance), |
102 | bShuffle(balance.bShuffle), | |
103 | bHBTcut(balance.bHBTcut), | |
845fdeca | 104 | bConversionCut(balance.bConversionCut), |
6a3f819e | 105 | fAnalysisLevel(balance.fAnalysisLevel), |
106 | fAnalyzedEvents(balance.fAnalyzedEvents), | |
74b04dd4 | 107 | fCentralityId(balance.fCentralityId), |
108 | fCentStart(balance.fCentStart), | |
109 | fCentStop(balance.fCentStop) { | |
7f0257ea | 110 | //copy constructor |
b966652f | 111 | for(Int_t i = 0; i < ANALYSIS_TYPES; i++){ |
112 | fNn[i] = balance.fNn[i]; | |
113 | fNp[i] = balance.fNp[i]; | |
3feee083 | 114 | |
b966652f | 115 | fP1Start[i] = balance.fP1Start[i]; |
116 | fP1Stop[i] = balance.fP1Stop[i]; | |
3feee083 | 117 | fNumberOfBins[i] = balance.fNumberOfBins[i]; |
118 | fP2Start[i] = balance.fP2Start[i]; | |
119 | fP2Stop[i] = balance.fP2Stop[i]; | |
120 | fP2Step[i] = balance.fP2Step[i]; | |
74b04dd4 | 121 | fCentStart = balance.fCentStart; |
122 | fCentStop = balance.fCentStop; | |
3feee083 | 123 | |
b966652f | 124 | fHistP[i] = balance.fHistP[i]; |
125 | fHistN[i] = balance.fHistN[i]; | |
126 | fHistPN[i] = balance.fHistPN[i]; | |
127 | fHistNP[i] = balance.fHistNP[i]; | |
128 | fHistPP[i] = balance.fHistPP[i]; | |
129 | fHistNN[i] = balance.fHistNN[i]; | |
130 | ||
3feee083 | 131 | for(Int_t j = 0; j < MAXIMUM_NUMBER_OF_STEPS; j++) { |
132 | fNpp[i][j] = .0; | |
133 | fNnn[i][j] = .0; | |
134 | fNpn[i][j] = .0; | |
6432ac6a | 135 | fNnp[i][j] = .0; |
3feee083 | 136 | fB[i][j] = 0.0; |
137 | ferror[i][j] = 0.0; | |
138 | } | |
139 | } | |
140 | } | |
141 | ||
7f0257ea | 142 | |
143 | //____________________________________________________________________// | |
144 | AliBalance::~AliBalance() { | |
6c178944 | 145 | // Destructor |
6c178944 | 146 | |
6432ac6a | 147 | for(Int_t i = 0; i < ANALYSIS_TYPES; i++){ |
148 | ||
149 | delete fHistP[i]; | |
150 | delete fHistN[i]; | |
151 | delete fHistPN[i]; | |
152 | delete fHistNP[i]; | |
153 | delete fHistPP[i]; | |
154 | delete fHistNN[i]; | |
155 | ||
156 | } | |
7f0257ea | 157 | } |
158 | ||
7f0257ea | 159 | //____________________________________________________________________// |
6432ac6a | 160 | void AliBalance::SetInterval(Int_t iAnalysisType, |
161 | Double_t p1Start, Double_t p1Stop, | |
162 | Int_t ibins, Double_t p2Start, Double_t p2Stop) { | |
6c178944 | 163 | // Sets the analyzed interval. |
3feee083 | 164 | // Set the same Information for all analyses |
6432ac6a | 165 | |
166 | if(iAnalysisType == -1){ | |
b966652f | 167 | for(Int_t i = 0; i < ANALYSIS_TYPES; i++){ |
168 | fP1Start[i] = p1Start; | |
169 | fP1Stop[i] = p1Stop; | |
6432ac6a | 170 | fNumberOfBins[i] = ibins; |
3feee083 | 171 | fP2Start[i] = p2Start; |
172 | fP2Stop[i] = p2Stop; | |
173 | fP2Step[i] = TMath::Abs(p2Start - p2Stop) / (Double_t)fNumberOfBins[i]; | |
174 | } | |
7f0257ea | 175 | } |
3feee083 | 176 | // Set the Information for one analysis |
6432ac6a | 177 | else if((iAnalysisType > -1) && (iAnalysisType < ANALYSIS_TYPES)) { |
178 | fP1Start[iAnalysisType] = p1Start; | |
179 | fP1Stop[iAnalysisType] = p1Stop; | |
180 | fNumberOfBins[iAnalysisType] = ibins; | |
181 | fP2Start[iAnalysisType] = p2Start; | |
182 | fP2Stop[iAnalysisType] = p2Stop; | |
183 | fP2Step[iAnalysisType] = TMath::Abs(p2Start - p2Stop) / (Double_t)fNumberOfBins[iAnalysisType]; | |
7f0257ea | 184 | } |
6432ac6a | 185 | else { |
3feee083 | 186 | AliError("Wrong ANALYSIS number!"); |
7f0257ea | 187 | } |
6c178944 | 188 | } |
189 | ||
6432ac6a | 190 | //____________________________________________________________________// |
191 | void AliBalance::InitHistograms() { | |
6a3f819e | 192 | //Initialize the histograms |
6432ac6a | 193 | TString histName; |
194 | for(Int_t iAnalysisType = 0; iAnalysisType < ANALYSIS_TYPES; iAnalysisType++) { | |
6a3f819e | 195 | histName = "fHistP"; histName += gBFAnalysisType[iAnalysisType]; |
196 | if(bShuffle) histName.Append("_shuffle"); | |
197 | if(fCentralityId) histName += fCentralityId.Data(); | |
74b04dd4 | 198 | fHistP[iAnalysisType] = new TH2D(histName.Data(),"",fCentStop-fCentStart,fCentStart,fCentStop,100,fP1Start[iAnalysisType],fP1Stop[iAnalysisType]); |
6a3f819e | 199 | |
200 | histName = "fHistN"; histName += gBFAnalysisType[iAnalysisType]; | |
201 | if(bShuffle) histName.Append("_shuffle"); | |
202 | if(fCentralityId) histName += fCentralityId.Data(); | |
74b04dd4 | 203 | fHistN[iAnalysisType] = new TH2D(histName.Data(),"",fCentStop-fCentStart,fCentStart,fCentStop,100,fP1Start[iAnalysisType],fP1Stop[iAnalysisType]); |
6432ac6a | 204 | |
6a3f819e | 205 | histName = "fHistPN"; histName += gBFAnalysisType[iAnalysisType]; |
206 | if(bShuffle) histName.Append("_shuffle"); | |
207 | if(fCentralityId) histName += fCentralityId.Data(); | |
74b04dd4 | 208 | fHistPN[iAnalysisType] = new TH2D(histName.Data(),"",fCentStop-fCentStart,fCentStart,fCentStop,fNumberOfBins[iAnalysisType],fP2Start[iAnalysisType],fP2Stop[iAnalysisType]); |
6a3f819e | 209 | |
210 | histName = "fHistNP"; histName += gBFAnalysisType[iAnalysisType]; | |
211 | if(bShuffle) histName.Append("_shuffle"); | |
212 | if(fCentralityId) histName += fCentralityId.Data(); | |
74b04dd4 | 213 | fHistNP[iAnalysisType] = new TH2D(histName.Data(),"",fCentStop-fCentStart,fCentStart,fCentStop,fNumberOfBins[iAnalysisType],fP2Start[iAnalysisType],fP2Stop[iAnalysisType]); |
6a3f819e | 214 | |
215 | histName = "fHistPP"; histName += gBFAnalysisType[iAnalysisType]; | |
216 | if(bShuffle) histName.Append("_shuffle"); | |
217 | if(fCentralityId) histName += fCentralityId.Data(); | |
74b04dd4 | 218 | fHistPP[iAnalysisType] = new TH2D(histName.Data(),"",fCentStop-fCentStart,fCentStart,fCentStop,fNumberOfBins[iAnalysisType],fP2Start[iAnalysisType],fP2Stop[iAnalysisType]); |
6a3f819e | 219 | |
220 | histName = "fHistNN"; histName += gBFAnalysisType[iAnalysisType]; | |
221 | if(bShuffle) histName.Append("_shuffle"); | |
222 | if(fCentralityId) histName += fCentralityId.Data(); | |
74b04dd4 | 223 | fHistNN[iAnalysisType] = new TH2D(histName.Data(),"",fCentStop-fCentStart,fCentStart,fCentStop,fNumberOfBins[iAnalysisType],fP2Start[iAnalysisType],fP2Stop[iAnalysisType]); |
6432ac6a | 224 | } |
225 | } | |
3feee083 | 226 | |
898d5b28 | 227 | //____________________________________________________________________// |
09bb7bf4 | 228 | void AliBalance::PrintAnalysisSettings() { |
09bb7bf4 | 229 | |
230 | Printf("======================================"); | |
231 | Printf("Analysis level: %s",fAnalysisLevel.Data()); | |
3feee083 | 232 | Printf("======================================"); |
b966652f | 233 | for(Int_t ibin = 0; ibin < ANALYSIS_TYPES; ibin++){ |
3feee083 | 234 | Printf("Interval info for variable %d",ibin); |
235 | Printf("Analyzed interval (min.): %lf",fP2Start[ibin]); | |
236 | Printf("Analyzed interval (max.): %lf",fP2Stop[ibin]); | |
237 | Printf("Number of bins: %d",fNumberOfBins[ibin]); | |
238 | Printf("Step: %lf",fP2Step[ibin]); | |
239 | Printf(" "); | |
240 | } | |
09bb7bf4 | 241 | Printf("======================================"); |
898d5b28 | 242 | } |
243 | ||
7f0257ea | 244 | //____________________________________________________________________// |
845fdeca | 245 | void AliBalance::CalculateBalance(Float_t fCentrality,vector<Double_t> **chargeVector,Float_t bSign) { |
6c178944 | 246 | // Calculates the balance function |
247 | fAnalyzedEvents++; | |
248 | Int_t i = 0 , j = 0; | |
3feee083 | 249 | Int_t iBin = 0; |
845fdeca | 250 | |
6432ac6a | 251 | // Initialize histograms if not done yet |
252 | if(!fHistPN[0]){ | |
253 | AliWarning("Histograms not yet initialized! --> Will be done now"); | |
254 | AliWarning("This works only in local mode --> Add 'gBalance->InitHistograms()' in your configBalanceFunction"); | |
255 | InitHistograms(); | |
256 | } | |
257 | ||
74b04dd4 | 258 | Int_t gNtrack = chargeVector[0]->size(); |
259 | //Printf("(AliBalance) Number of tracks: %d",gNtrack); | |
260 | ||
261 | for(i = 0; i < gNtrack;i++){ | |
f12385bb | 262 | Short_t charge = chargeVector[0]->at(i); |
74b04dd4 | 263 | Double_t rapidity = chargeVector[1]->at(i); |
264 | Double_t pseudorapidity = chargeVector[2]->at(i); | |
265 | Double_t phi = chargeVector[3]->at(i); | |
b966652f | 266 | |
267 | //0:y - 1:eta - 2:Qlong - 3:Qout - 4:Qside - 5:Qinv - 6:phi | |
268 | for(Int_t iAnalysisType = 0; iAnalysisType < ANALYSIS_TYPES; iAnalysisType++) { | |
6432ac6a | 269 | if(iAnalysisType == kEta) { |
b966652f | 270 | if((pseudorapidity >= fP1Start[iAnalysisType]) && (pseudorapidity <= fP1Stop[iAnalysisType])) { |
271 | if(charge > 0) { | |
272 | fNp[iAnalysisType] += 1.; | |
74b04dd4 | 273 | fHistP[iAnalysisType]->Fill(fCentrality,pseudorapidity); |
b966652f | 274 | }//charge > 0 |
275 | if(charge < 0) { | |
276 | fNn[iAnalysisType] += 1.; | |
74b04dd4 | 277 | fHistN[iAnalysisType]->Fill(fCentrality,pseudorapidity); |
b966652f | 278 | }//charge < 0 |
279 | }//p1 interval check | |
280 | }//analysis type: eta | |
5d42ac40 | 281 | else if(iAnalysisType == kPhi) { |
b966652f | 282 | if((phi >= fP1Start[iAnalysisType]) && (phi <= fP1Stop[iAnalysisType])) { |
283 | if(charge > 0) { | |
284 | fNp[iAnalysisType] += 1.; | |
74b04dd4 | 285 | fHistP[iAnalysisType]->Fill(fCentrality,phi); |
b966652f | 286 | }//charge > 0 |
287 | if(charge < 0) { | |
288 | fNn[iAnalysisType] += 1.; | |
74b04dd4 | 289 | fHistN[iAnalysisType]->Fill(fCentrality,phi); |
b966652f | 290 | }//charge < 0 |
291 | }//p1 interval check | |
292 | }//analysis type: phi | |
293 | else { | |
294 | if((rapidity >= fP1Start[iAnalysisType]) && (rapidity <= fP1Stop[iAnalysisType])) { | |
295 | if(charge > 0) { | |
296 | fNp[iAnalysisType] += 1.; | |
74b04dd4 | 297 | fHistP[iAnalysisType]->Fill(fCentrality,rapidity); |
b966652f | 298 | }//charge > 0 |
299 | if(charge < 0) { | |
300 | fNn[iAnalysisType] += 1.; | |
74b04dd4 | 301 | fHistN[iAnalysisType]->Fill(fCentrality,rapidity); |
b966652f | 302 | }//charge < 0 |
303 | }//p1 interval check | |
304 | }//analysis type: y, qside, qout, qlong, qinv | |
305 | }//analysis type loop | |
7f0257ea | 306 | } |
74b04dd4 | 307 | |
32a4f715 | 308 | //Printf("Np: %lf - Nn: %lf",fNp[0],fNn[0]); |
6c178944 | 309 | |
b966652f | 310 | Double_t dy = 0., deta = 0.; |
311 | Double_t qLong = 0., qOut = 0., qSide = 0., qInv = 0.; | |
312 | Double_t dphi = 0.; | |
313 | ||
f12385bb | 314 | Short_t charge1 = 0; |
b966652f | 315 | Double_t eta1 = 0., rap1 = 0.; |
74b04dd4 | 316 | Double_t px1 = 0., py1 = 0., pz1 = 0.; |
317 | Double_t pt1 = 0.; | |
b966652f | 318 | Double_t energy1 = 0.; |
319 | Double_t phi1 = 0.; | |
320 | ||
f12385bb | 321 | Short_t charge2 = 0; |
b966652f | 322 | Double_t eta2 = 0., rap2 = 0.; |
74b04dd4 | 323 | Double_t px2 = 0., py2 = 0., pz2 = 0.; |
324 | Double_t pt2 = 0.; | |
b966652f | 325 | Double_t energy2 = 0.; |
326 | Double_t phi2 = 0.; | |
6c178944 | 327 | //0:y - 1:eta - 2:Qlong - 3:Qout - 4:Qside - 5:Qinv - 6:phi |
3feee083 | 328 | for(i = 1; i < gNtrack; i++) { |
c511520f | 329 | |
74b04dd4 | 330 | charge1 = chargeVector[0]->at(i); |
331 | rap1 = chargeVector[1]->at(i); | |
332 | eta1 = chargeVector[2]->at(i); | |
333 | phi1 = chargeVector[3]->at(i); | |
334 | px1 = chargeVector[4]->at(i); | |
335 | py1 = chargeVector[5]->at(i); | |
336 | pz1 = chargeVector[6]->at(i); | |
337 | pt1 = chargeVector[7]->at(i); | |
338 | energy1 = chargeVector[8]->at(i); | |
3feee083 | 339 | |
340 | for(j = 0; j < i; j++) { | |
74b04dd4 | 341 | |
342 | charge2 = chargeVector[0]->at(j); | |
343 | rap2 = chargeVector[1]->at(j); | |
344 | eta2 = chargeVector[2]->at(j); | |
345 | phi2 = chargeVector[3]->at(j); | |
346 | px2 = chargeVector[4]->at(j); | |
347 | py2 = chargeVector[5]->at(j); | |
348 | pz2 = chargeVector[6]->at(j); | |
349 | pt2 = chargeVector[7]->at(i); | |
350 | energy2 = chargeVector[8]->at(j); | |
351 | ||
3feee083 | 352 | // filling the arrays |
353 | ||
354 | // RAPIDITY | |
74b04dd4 | 355 | dy = TMath::Abs(rap1 - rap2); |
b966652f | 356 | |
3feee083 | 357 | // Eta |
b966652f | 358 | deta = TMath::Abs(eta1 - eta2); |
3feee083 | 359 | |
b966652f | 360 | //qlong |
3feee083 | 361 | Double_t eTot = energy1 + energy2; |
74b04dd4 | 362 | Double_t pxTot = px1 + px2; |
363 | Double_t pyTot = py1 + py2; | |
364 | Double_t pzTot = pz1 + pz2; | |
3feee083 | 365 | Double_t q0Tot = energy1 - energy2; |
74b04dd4 | 366 | Double_t qxTot = px1 - px2; |
367 | Double_t qyTot = py1 - py2; | |
368 | Double_t qzTot = pz1 - pz2; | |
369 | ||
370 | Double_t eTot2 = eTot*eTot; | |
371 | Double_t pTot2 = pxTot*pxTot + pyTot*pyTot + pzTot*pzTot; | |
372 | Double_t pzTot2 = pzTot*pzTot; | |
373 | ||
374 | Double_t q0Tot2 = q0Tot*q0Tot; | |
375 | Double_t qTot2 = qxTot*qxTot + qyTot*qyTot + qzTot*qzTot; | |
376 | ||
377 | Double_t snn = eTot2 - pTot2; | |
378 | Double_t ptTot2 = pTot2 - pzTot2 ; | |
379 | Double_t ptTot = TMath::Sqrt( ptTot2 ); | |
3feee083 | 380 | |
74b04dd4 | 381 | qLong = TMath::Abs(eTot*qzTot - pzTot*q0Tot)/TMath::Sqrt(snn + ptTot2); |
b966652f | 382 | |
383 | //qout | |
74b04dd4 | 384 | qOut = TMath::Sqrt(snn/(snn + ptTot2)) * TMath::Abs(pxTot*qxTot + pyTot*qyTot)/ptTot; |
b966652f | 385 | |
386 | //qside | |
387 | qSide = TMath::Abs(pxTot*qyTot - pyTot*qxTot)/ptTot; | |
3feee083 | 388 | |
b966652f | 389 | //qinv |
74b04dd4 | 390 | qInv = TMath::Sqrt(TMath::Abs(-q0Tot2 + qTot2 )); |
b966652f | 391 | |
392 | //phi | |
6432ac6a | 393 | dphi = TMath::Abs(phi1 - phi2); |
4bd2c3ed | 394 | if(dphi>180) dphi = 360 - dphi; //dphi should be between 0 and 180! |
b966652f | 395 | |
49a3750f | 396 | // HBT like cut |
397 | if(bHBTcut){ | |
845fdeca | 398 | //if( dphi < 3 || deta < 0.01 ){ // VERSION 1 |
399 | // continue; | |
400 | ||
401 | // VERSION 2 (Taken from DPhiCorrelations) | |
402 | // the variables & cuthave been developed by the HBT group | |
403 | // see e.g. https://indico.cern.ch/materialDisplay.py?contribId=36&sessionId=6&materialId=slides&confId=142700 | |
404 | ||
405 | // optimization | |
406 | if (TMath::Abs(deta) < 0.02 * 2.5 * 3) //twoTrackEfficiencyCutValue = 0.02 [default for dphicorrelations] | |
407 | { | |
408 | // check first boundaries to see if is worth to loop and find the minimum | |
409 | Float_t dphistar1 = GetDPhiStar(phi1*TMath::DegToRad(), pt1, charge1, phi2*TMath::DegToRad(), pt2, charge2, 0.8, bSign); | |
410 | Float_t dphistar2 = GetDPhiStar(phi1*TMath::DegToRad(), pt1, charge1, phi2*TMath::DegToRad(), pt2, charge2, 2.5, bSign); | |
411 | ||
412 | const Float_t kLimit = 0.02 * 3; | |
413 | ||
414 | Float_t dphistarminabs = 1e5; | |
415 | Float_t dphistarmin = 1e5; | |
416 | if (TMath::Abs(dphistar1) < kLimit || TMath::Abs(dphistar2) < kLimit || dphistar1 * dphistar2 < 0) | |
417 | { | |
418 | for (Double_t rad=0.8; rad<2.51; rad+=0.01) | |
419 | { | |
420 | Float_t dphistar = GetDPhiStar(phi1*TMath::DegToRad(), pt1, charge1, phi2*TMath::DegToRad(), pt2, charge2, rad, bSign); | |
421 | ||
422 | Float_t dphistarabs = TMath::Abs(dphistar); | |
423 | ||
424 | if (dphistarabs < dphistarminabs) | |
425 | { | |
426 | dphistarmin = dphistar; | |
427 | dphistarminabs = dphistarabs; | |
428 | } | |
429 | } | |
430 | ||
431 | if (dphistarminabs < 0.02 && TMath::Abs(deta) < 0.02) | |
432 | { | |
433 | //Printf("Removed track pair %d %d with %f %f %f %f %d %f %f %d %f", i, j, deta, dphistarminabs, phi1, pt1, charge1, phi2, pt2, charge2, bSign); | |
434 | continue; | |
435 | } | |
436 | } | |
437 | } | |
49a3750f | 438 | } |
845fdeca | 439 | |
440 | // conversions | |
441 | if(bConversionCut){ | |
442 | if (charge1 * charge2 < 0) | |
443 | { | |
444 | Float_t m0 = 0.510e-3; | |
445 | Float_t tantheta1 = 1e10; | |
446 | ||
447 | if (eta1 < -1e-10 || eta1 > 1e-10) | |
448 | tantheta1 = 2 * TMath::Exp(-eta1) / ( 1 - TMath::Exp(-2*eta1)); | |
449 | ||
450 | Float_t tantheta2 = 1e10; | |
451 | if (eta2 < -1e-10 || eta2 > 1e-10) | |
452 | tantheta2 = 2 * TMath::Exp(-eta2) / ( 1 - TMath::Exp(-2*eta2)); | |
453 | ||
454 | Float_t e1squ = m0 * m0 + pt1 * pt1 * (1.0 + 1.0 / tantheta1 / tantheta1); | |
455 | Float_t e2squ = m0 * m0 + pt2 * pt2 * (1.0 + 1.0 / tantheta2 / tantheta2); | |
456 | ||
457 | Float_t mass = 2 * m0 * m0 + 2 * ( TMath::Sqrt(e1squ * e2squ) - ( pt1 * pt2 * ( TMath::Cos(phi1 - phi2) + 1.0 / tantheta1 / tantheta2 ) ) ); | |
458 | ||
459 | if (mass < 0.04*0.04){ | |
460 | //Printf("Removed track pair %d %d with %f %f %d %d ", i, j, deta, mass, charge1, charge2); | |
461 | continue; | |
462 | } | |
463 | } | |
464 | } | |
465 | ||
466 | ||
b966652f | 467 | //0:y - 1:eta - 2:Qlong - 3:Qout - 4:Qside - 5:Qinv - 6:phi |
74b04dd4 | 468 | if((rap1 >= fP1Start[kRapidity]) && (rap1 <= fP1Stop[kRapidity]) && (rap2 >= fP1Start[kRapidity]) && (rap2 <= fP1Stop[kRapidity])) { |
469 | ||
470 | // rapidity | |
471 | if( dy > fP2Start[kRapidity] && dy < fP2Stop[kRapidity]){ | |
472 | iBin = Int_t((dy-fP2Start[kRapidity])/fP2Step[kRapidity]); | |
473 | if(iBin >=0 && iBin < MAXIMUM_NUMBER_OF_STEPS){ | |
474 | ||
475 | if((charge1 > 0)&&(charge2 > 0)) { | |
476 | fNpp[kRapidity][iBin] += 1.; | |
477 | fHistPP[kRapidity]->Fill(fCentrality,dy); | |
478 | } | |
479 | else if((charge1 < 0)&&(charge2 < 0)) { | |
480 | fNnn[kRapidity][iBin] += 1.; | |
481 | fHistNN[kRapidity]->Fill(fCentrality,dy); | |
482 | } | |
483 | else if((charge1 > 0)&&(charge2 < 0)) { | |
484 | fNpn[kRapidity][iBin] += 1.; | |
485 | fHistPN[kRapidity]->Fill(fCentrality,dy); | |
486 | } | |
487 | else if((charge1 < 0)&&(charge2 > 0)) { | |
488 | fNpn[kRapidity][iBin] += 1.; | |
489 | fHistPN[kRapidity]->Fill(fCentrality,dy); | |
490 | } | |
491 | }//BF binning check | |
492 | }//p2 interval check | |
493 | }//p1 interval check | |
6432ac6a | 494 | |
74b04dd4 | 495 | // pseudorapidity |
496 | if((eta1 >= fP1Start[kEta]) && (eta1 <= fP1Stop[kEta]) && (eta2 >= fP1Start[kEta]) && (eta2 <= fP1Stop[kEta])) { | |
497 | if( deta > fP2Start[kEta] && deta < fP2Stop[kEta]){ | |
498 | iBin = Int_t((deta-fP2Start[kEta])/fP2Step[kEta]); | |
499 | if(iBin >=0 && iBin < MAXIMUM_NUMBER_OF_STEPS){ | |
500 | if((charge1 > 0)&&(charge2 > 0)) { | |
501 | fNpp[kEta][iBin] += 1.; | |
502 | fHistPP[kEta]->Fill(fCentrality,deta); | |
503 | } | |
504 | if((charge1 < 0)&&(charge2 < 0)) { | |
505 | fNnn[kEta][iBin] += 1.; | |
506 | fHistNN[kEta]->Fill(fCentrality,deta); | |
507 | } | |
508 | if((charge1 > 0)&&(charge2 < 0)) { | |
509 | fNpn[kEta][iBin] += 1.; | |
510 | fHistPN[kEta]->Fill(fCentrality,deta); | |
511 | } | |
512 | if((charge1 < 0)&&(charge2 > 0)) { | |
513 | fNpn[kEta][iBin] += 1.; | |
514 | fHistPN[kEta]->Fill(fCentrality,deta); | |
515 | } | |
516 | }//BF binning check | |
517 | }//p2 interval check | |
518 | }//p1 interval check | |
b966652f | 519 | |
74b04dd4 | 520 | // Qlong, out, side, inv |
521 | // Check the p1 intervall for rapidity here (like for single tracks above) | |
522 | if((rap1 >= fP1Start[kRapidity]) && (rap1 <= fP1Stop[kRapidity]) && (rap2 >= fP1Start[kRapidity]) && (rap2 <= fP1Stop[kRapidity])) { | |
523 | if( qLong > fP2Start[kQlong] && qLong < fP2Stop[kQlong]){ | |
524 | iBin = Int_t((qLong-fP2Start[kQlong])/fP2Step[kQlong]); | |
525 | if(iBin >=0 && iBin < MAXIMUM_NUMBER_OF_STEPS){ | |
526 | if((charge1 > 0)&&(charge2 > 0)) { | |
527 | fNpp[kQlong][iBin] += 1.; | |
528 | fHistPP[kQlong]->Fill(fCentrality,qLong); | |
529 | } | |
530 | if((charge1 < 0)&&(charge2 < 0)) { | |
531 | fNnn[kQlong][iBin] += 1.; | |
532 | fHistNN[kQlong]->Fill(fCentrality,qLong); | |
533 | } | |
534 | if((charge1 > 0)&&(charge2 < 0)) { | |
535 | fNpn[kQlong][iBin] += 1.; | |
536 | fHistPN[kQlong]->Fill(fCentrality,qLong); | |
537 | } | |
538 | if((charge1 < 0)&&(charge2 > 0)) { | |
539 | fNpn[kQlong][iBin] += 1.; | |
540 | fHistPN[kQlong]->Fill(fCentrality,qLong); | |
541 | } | |
542 | }//BF binning check | |
543 | }//p2 interval check | |
544 | }//p1 interval check | |
6432ac6a | 545 | |
74b04dd4 | 546 | if((rap1 >= fP1Start[kRapidity]) && (rap1 <= fP1Stop[kRapidity]) && (rap2 >= fP1Start[kRapidity]) && (rap2 <= fP1Stop[kRapidity])) { |
547 | if( qOut > fP2Start[kQout] && qOut < fP2Stop[kQout]){ | |
548 | iBin = Int_t((qOut-fP2Start[kQout])/fP2Step[kQout]); | |
549 | if(iBin >=0 && iBin < MAXIMUM_NUMBER_OF_STEPS){ | |
550 | if((charge1 > 0)&&(charge2 > 0)) { | |
551 | fNpp[kQout][iBin] += 1.; | |
552 | fHistPP[kQout]->Fill(fCentrality,qOut); | |
553 | } | |
554 | if((charge1 < 0)&&(charge2 < 0)) { | |
555 | fNnn[kQout][iBin] += 1.; | |
556 | fHistNN[kQout]->Fill(fCentrality,qOut); | |
557 | } | |
558 | if((charge1 > 0)&&(charge2 < 0)) { | |
559 | fNpn[kQout][iBin] += 1.; | |
560 | fHistPN[kQout]->Fill(fCentrality,qOut); | |
561 | } | |
562 | if((charge1 < 0)&&(charge2 > 0)) { | |
563 | fNpn[kQout][iBin] += 1.; | |
564 | fHistPN[kQout]->Fill(fCentrality,qOut); | |
565 | } | |
566 | }//BF binning check | |
567 | }//p2 interval check | |
568 | }//p1 interval check | |
569 | ||
570 | if((rap1 >= fP1Start[kRapidity]) && (rap1 <= fP1Stop[kRapidity]) && (rap2 >= fP1Start[kRapidity]) && (rap2 <= fP1Stop[kRapidity])) { | |
571 | if( qSide > fP2Start[kQside] && qSide < fP2Stop[kQside]){ | |
572 | iBin = Int_t((qSide-fP2Start[kQside])/fP2Step[kQside]); | |
573 | if(iBin >=0 && iBin < MAXIMUM_NUMBER_OF_STEPS){ | |
574 | if((charge1 > 0)&&(charge2 > 0)) { | |
575 | fNpp[kQside][iBin] += 1.; | |
576 | fHistPP[kQside]->Fill(fCentrality,qSide); | |
577 | } | |
578 | if((charge1 < 0)&&(charge2 < 0)) { | |
579 | fNnn[kQside][iBin] += 1.; | |
580 | fHistNN[kQside]->Fill(fCentrality,qSide); | |
581 | } | |
582 | if((charge1 > 0)&&(charge2 < 0)) { | |
583 | fNpn[kQside][iBin] += 1.; | |
584 | fHistPN[kQside]->Fill(fCentrality,qSide); | |
585 | } | |
586 | if((charge1 < 0)&&(charge2 > 0)) { | |
587 | fNpn[kQside][iBin] += 1.; | |
588 | fHistPN[kQside]->Fill(fCentrality,qSide); | |
589 | } | |
590 | }//BF binning check | |
591 | }//p2 interval check | |
592 | }//p1 interval check | |
593 | ||
594 | if((rap1 >= fP1Start[kRapidity]) && (rap1 <= fP1Stop[kRapidity]) && (rap2 >= fP1Start[kRapidity]) && (rap2 <= fP1Stop[kRapidity])) { | |
595 | if( qInv > fP2Start[kQinv] && qInv < fP2Stop[kQinv]){ | |
596 | iBin = Int_t((qInv-fP2Start[kQinv])/fP2Step[kQinv]); | |
597 | if(iBin >=0 && iBin < MAXIMUM_NUMBER_OF_STEPS){ | |
598 | if((charge1 > 0)&&(charge2 > 0)) { | |
599 | fNpp[kQinv][iBin] += 1.; | |
600 | fHistPP[kQinv]->Fill(fCentrality,qInv); | |
601 | } | |
602 | if((charge1 < 0)&&(charge2 < 0)) { | |
603 | fNnn[kQinv][iBin] += 1.; | |
604 | fHistNN[kQinv]->Fill(fCentrality,qInv); | |
605 | } | |
606 | if((charge1 > 0)&&(charge2 < 0)) { | |
607 | fNpn[kQinv][iBin] += 1.; | |
608 | fHistPN[kQinv]->Fill(fCentrality,qInv); | |
609 | } | |
610 | if((charge1 < 0)&&(charge2 > 0)) { | |
611 | fNpn[kQinv][iBin] += 1.; | |
612 | fHistPN[kQinv]->Fill(fCentrality,qInv); | |
613 | } | |
614 | }//BF binning check | |
615 | }//p2 interval check | |
616 | }//p1 interval check | |
617 | ||
618 | // Phi | |
619 | if((phi1 >= fP1Start[kPhi]) && (phi1 <= fP1Stop[kPhi]) && (phi2 >= fP1Start[kPhi]) && (phi2 <= fP1Stop[kPhi])) { | |
620 | if( dphi > fP2Start[kPhi] && dphi < fP2Stop[kPhi]){ | |
621 | iBin = Int_t((dphi-fP2Start[kPhi])/fP2Step[kPhi]); | |
622 | if(iBin >=0 && iBin < MAXIMUM_NUMBER_OF_STEPS){ | |
623 | if((charge1 > 0)&&(charge2 > 0)) { | |
624 | fNpp[kPhi][iBin] += 1.; | |
625 | fHistPP[kPhi]->Fill(fCentrality,dphi); | |
626 | } | |
627 | if((charge1 < 0)&&(charge2 < 0)) { | |
628 | fNnn[kPhi][iBin] += 1.; | |
629 | fHistNN[kPhi]->Fill(fCentrality,dphi); | |
630 | } | |
631 | if((charge1 > 0)&&(charge2 < 0)) { | |
632 | fNpn[kPhi][iBin] += 1.; | |
633 | fHistPN[kPhi]->Fill(fCentrality,dphi); | |
634 | } | |
635 | if((charge1 < 0)&&(charge2 > 0)) { | |
636 | fNpn[kPhi][iBin] += 1.; | |
637 | fHistPN[kPhi]->Fill(fCentrality,dphi); | |
638 | } | |
639 | }//BF binning check | |
640 | }//p2 interval check | |
641 | }//p1 interval check | |
b966652f | 642 | }//end of 2nd particle loop |
643 | }//end of 1st particle loop | |
3feee083 | 644 | //Printf("Number of analyzed events: %i",fAnalyzedEvents); |
74b04dd4 | 645 | //Printf("DeltaEta NN[0] = %.0f, PP[0] = %.0f, NP[0] = %.0f, PN[0] = %.0f",fNnn[kEta][0],fNpp[kEta][0],fNnp[kEta][0],fNpn[kEta][0]); |
3feee083 | 646 | } |
1d8792e7 | 647 | |
1d8792e7 | 648 | |
7f0257ea | 649 | //____________________________________________________________________// |
33a86282 | 650 | Double_t AliBalance::GetBalance(Int_t iAnalysisType, Int_t p2) { |
6c178944 | 651 | // Returns the value of the balance function in bin p2 |
33a86282 | 652 | fB[iAnalysisType][p2] = 0.5*(((fNpn[iAnalysisType][p2] - 2.*fNnn[iAnalysisType][p2])/fNn[iAnalysisType]) + ((fNpn[iAnalysisType][p2] - 2.*fNpp[iAnalysisType][p2])/fNp[iAnalysisType]))/fP2Step[iAnalysisType]; |
7f0257ea | 653 | |
33a86282 | 654 | return fB[iAnalysisType][p2]; |
6c178944 | 655 | } |
656 | ||
7f0257ea | 657 | //____________________________________________________________________// |
33a86282 | 658 | Double_t AliBalance::GetError(Int_t iAnalysisType, Int_t p2) { |
6c178944 | 659 | // Returns the error on the BF value for bin p2 |
6432ac6a | 660 | // The errors for fNn and fNp are neglected here (0.1 % of total error) |
33a86282 | 661 | /*ferror[iAnalysisType][p2] = TMath::Sqrt(Double_t(fNpp[iAnalysisType][p2])/(Double_t(fNp[iAnalysisType])*Double_t(fNp[iAnalysisType])) |
662 | + Double_t(fNnn[iAnalysisType][p2])/(Double_t(fNn[iAnalysisType])*Double_t(fNn[iAnalysisType])) | |
663 | + Double_t(fNpn[iAnalysisType][p2])/(Double_t(fNp[iAnalysisType])*Double_t(fNp[iAnalysisType])) | |
664 | + Double_t(fNnp[iAnalysisType][p2])/(Double_t(fNp[iAnalysisType])*Double_t(fNp[iAnalysisType])) | |
665 | //+ TMath::Power(fNpn[iAnalysisType][p2]-fNpp[iAnalysisType][p2],2)/TMath::Power(Double_t(fNp[iAnalysisType]),3) | |
666 | //+ TMath::Power(fNnp[iAnalysisType][p2]-fNnn[iAnalysisType][p2],2)/TMath::Power(Double_t(fNn[iAnalysisType]),3) | |
667 | ) /fP2Step[iAnalysisType];*/ | |
668 | ||
669 | ferror[iAnalysisType][p2] = TMath::Sqrt( Double_t(fNpp[iAnalysisType][p2])/(Double_t(fNp[iAnalysisType])*Double_t(fNp[iAnalysisType])) + | |
670 | Double_t(fNnn[iAnalysisType][p2])/(Double_t(fNn[iAnalysisType])*Double_t(fNn[iAnalysisType])) + | |
671 | Double_t(fNpn[iAnalysisType][p2])*TMath::Power((0.5/Double_t(fNp[iAnalysisType]) + 0.5/Double_t(fNn[iAnalysisType])),2))/fP2Step[iAnalysisType]; | |
6432ac6a | 672 | |
33a86282 | 673 | return ferror[iAnalysisType][p2]; |
6c178944 | 674 | } |
6432ac6a | 675 | //____________________________________________________________________// |
33a86282 | 676 | TGraphErrors *AliBalance::DrawBalance(Int_t iAnalysisType) { |
6432ac6a | 677 | |
678 | // Draws the BF | |
679 | Double_t x[MAXIMUM_NUMBER_OF_STEPS]; | |
680 | Double_t xer[MAXIMUM_NUMBER_OF_STEPS]; | |
681 | Double_t b[MAXIMUM_NUMBER_OF_STEPS]; | |
682 | Double_t ber[MAXIMUM_NUMBER_OF_STEPS]; | |
683 | ||
33a86282 | 684 | if((fNp[iAnalysisType] == 0)||(fNn[iAnalysisType] == 0)) { |
6432ac6a | 685 | cerr<<"Couldn't find any particles in the analyzed interval!!!"<<endl; |
686 | return NULL; | |
687 | } | |
688 | ||
33a86282 | 689 | for(Int_t i = 0; i < fNumberOfBins[iAnalysisType]; i++) { |
690 | b[i] = GetBalance(iAnalysisType,i); | |
691 | ber[i] = GetError(iAnalysisType,i); | |
692 | x[i] = fP2Start[iAnalysisType] + fP2Step[iAnalysisType]*i + fP2Step[iAnalysisType]/2; | |
6432ac6a | 693 | xer[i] = 0.0; |
694 | } | |
695 | ||
33a86282 | 696 | TGraphErrors *gr = new TGraphErrors(fNumberOfBins[iAnalysisType],x,b,xer,ber); |
6432ac6a | 697 | gr->GetXaxis()->SetTitleColor(1); |
33a86282 | 698 | if(iAnalysisType==0) { |
6432ac6a | 699 | gr->SetTitle("Balance function B(#Delta y)"); |
700 | gr->GetXaxis()->SetTitle("#Delta y"); | |
701 | gr->GetYaxis()->SetTitle("B(#Delta y)"); | |
702 | } | |
33a86282 | 703 | if(iAnalysisType==1) { |
6432ac6a | 704 | gr->SetTitle("Balance function B(#Delta #eta)"); |
705 | gr->GetXaxis()->SetTitle("#Delta #eta"); | |
706 | gr->GetYaxis()->SetTitle("B(#Delta #eta)"); | |
707 | } | |
33a86282 | 708 | if(iAnalysisType==2) { |
6432ac6a | 709 | gr->SetTitle("Balance function B(q_{long})"); |
710 | gr->GetXaxis()->SetTitle("q_{long} (GeV/c)"); | |
711 | gr->GetYaxis()->SetTitle("B(q_{long}) ((GeV/c)^{-1})"); | |
712 | } | |
33a86282 | 713 | if(iAnalysisType==3) { |
6432ac6a | 714 | gr->SetTitle("Balance function B(q_{out})"); |
715 | gr->GetXaxis()->SetTitle("q_{out} (GeV/c)"); | |
716 | gr->GetYaxis()->SetTitle("B(q_{out}) ((GeV/c)^{-1})"); | |
717 | } | |
33a86282 | 718 | if(iAnalysisType==4) { |
6432ac6a | 719 | gr->SetTitle("Balance function B(q_{side})"); |
720 | gr->GetXaxis()->SetTitle("q_{side} (GeV/c)"); | |
721 | gr->GetYaxis()->SetTitle("B(q_{side}) ((GeV/c)^{-1})"); | |
722 | } | |
33a86282 | 723 | if(iAnalysisType==5) { |
6432ac6a | 724 | gr->SetTitle("Balance function B(q_{inv})"); |
725 | gr->GetXaxis()->SetTitle("q_{inv} (GeV/c)"); | |
726 | gr->GetYaxis()->SetTitle("B(q_{inv}) ((GeV/c)^{-1})"); | |
727 | } | |
33a86282 | 728 | if(iAnalysisType==6) { |
6432ac6a | 729 | gr->SetTitle("Balance function B(#Delta #phi)"); |
730 | gr->GetXaxis()->SetTitle("#Delta #phi"); | |
731 | gr->GetYaxis()->SetTitle("B(#Delta #phi)"); | |
732 | } | |
33a86282 | 733 | |
734 | return gr; | |
6432ac6a | 735 | } |
6c178944 | 736 | |
6432ac6a | 737 | //____________________________________________________________________// |
738 | void AliBalance::PrintResults(Int_t iAnalysisType, TH1D *gHistBalance) { | |
739 | //Prints the calculated width of the BF and its error | |
740 | Double_t x[MAXIMUM_NUMBER_OF_STEPS]; | |
741 | Double_t gSumXi = 0.0, gSumBi = 0.0, gSumBiXi = 0.0; | |
742 | Double_t gSumBiXi2 = 0.0, gSumBi2Xi2 = 0.0; | |
743 | Double_t gSumDeltaBi2 = 0.0, gSumXi2DeltaBi2 = 0.0; | |
744 | Double_t deltaBalP2 = 0.0, integral = 0.0; | |
745 | Double_t deltaErrorNew = 0.0; | |
746 | ||
747 | cout<<"=================================================="<<endl; | |
748 | for(Int_t i = 1; i <= fNumberOfBins[iAnalysisType]; i++) { | |
749 | x[i-1] = fP2Start[iAnalysisType] + fP2Step[iAnalysisType]*i + fP2Step[iAnalysisType]/2; | |
7ef516b2 | 750 | //cout<<"B: "<<gHistBalance->GetBinContent(i)<<"\t Error: "<<gHistBalance->GetBinError(i)<<"\t bin: "<<gHistBalance->GetBinCenter(i)<<endl; |
6432ac6a | 751 | } |
7ef516b2 | 752 | //cout<<"=================================================="<<endl; |
6432ac6a | 753 | for(Int_t i = 2; i <= fNumberOfBins[iAnalysisType]; i++) { |
754 | gSumXi += gHistBalance->GetBinCenter(i); | |
33a86282 | 755 | gSumBi += gHistBalance->GetBinContent(i); |
756 | gSumBiXi += gHistBalance->GetBinContent(i)*gHistBalance->GetBinCenter(i); | |
757 | gSumBiXi2 += gHistBalance->GetBinContent(i)*TMath::Power(gHistBalance->GetBinCenter(i),2); | |
758 | gSumBi2Xi2 += TMath::Power(gHistBalance->GetBinContent(i),2)*TMath::Power(gHistBalance->GetBinCenter(i),2); | |
759 | gSumDeltaBi2 += TMath::Power(gHistBalance->GetBinError(i),2); | |
760 | gSumXi2DeltaBi2 += TMath::Power(gHistBalance->GetBinCenter(i),2) * TMath::Power(gHistBalance->GetBinError(i),2); | |
6432ac6a | 761 | |
33a86282 | 762 | deltaBalP2 += fP2Step[iAnalysisType]*TMath::Power(gHistBalance->GetBinError(i),2); |
763 | integral += fP2Step[iAnalysisType]*gHistBalance->GetBinContent(i); | |
764 | } | |
765 | for(Int_t i = 1; i < fNumberOfBins[iAnalysisType]; i++) | |
766 | deltaErrorNew += gHistBalance->GetBinError(i)*(gHistBalance->GetBinCenter(i)*gSumBi - gSumBiXi)/TMath::Power(gSumBi,2); | |
767 | ||
768 | Double_t integralError = TMath::Sqrt(deltaBalP2); | |
769 | ||
770 | Double_t delta = gSumBiXi / gSumBi; | |
771 | Double_t deltaError = (gSumBiXi / gSumBi) * TMath::Sqrt(TMath::Power((TMath::Sqrt(gSumXi2DeltaBi2)/gSumBiXi),2) + TMath::Power((gSumDeltaBi2/gSumBi),2) ); | |
7ef516b2 | 772 | cout<<"Analysis type: "<<gBFAnalysisType[iAnalysisType].Data()<<endl; |
33a86282 | 773 | cout<<"Width: "<<delta<<"\t Error: "<<deltaError<<endl; |
774 | cout<<"New error: "<<deltaErrorNew<<endl; | |
775 | cout<<"Integral: "<<integral<<"\t Error: "<<integralError<<endl; | |
776 | cout<<"=================================================="<<endl; | |
6432ac6a | 777 | } |
778 | ||
779 | //____________________________________________________________________// | |
b7ce3d3f | 780 | TH1D *AliBalance::GetBalanceFunctionHistogram(Int_t iAnalysisType,Double_t centrMin, Double_t centrMax, Double_t etaWindow) { |
74b04dd4 | 781 | //Returns the BF histogram, extracted from the 6 TH2D objects |
6432ac6a | 782 | //(private members) of the AliBalance class. |
b7ce3d3f | 783 | // |
784 | // Acceptance correction: | |
785 | // - only for analysis type = kEta | |
786 | // - only if etaWindow > 0 (default = -1.) | |
787 | // - calculated as proposed by STAR | |
788 | // | |
6432ac6a | 789 | TString gAnalysisType[ANALYSIS_TYPES] = {"y","eta","qlong","qout","qside","qinv","phi"}; |
790 | TString histName = "gHistBalanceFunctionHistogram"; | |
791 | histName += gAnalysisType[iAnalysisType]; | |
792 | ||
74b04dd4 | 793 | SetInterval(iAnalysisType, fHistP[iAnalysisType]->GetYaxis()->GetXmin(), |
794 | fHistP[iAnalysisType]->GetYaxis()->GetXmin(), | |
795 | fHistPP[iAnalysisType]->GetNbinsY(), | |
796 | fHistPP[iAnalysisType]->GetYaxis()->GetXmin(), | |
797 | fHistPP[iAnalysisType]->GetYaxis()->GetXmax()); | |
798 | ||
799 | // determine the projection thresholds | |
800 | Int_t binMinX, binMinY, binMinZ; | |
801 | Int_t binMaxX, binMaxY, binMaxZ; | |
802 | ||
803 | fHistPP[iAnalysisType]->GetBinXYZ(fHistPP[iAnalysisType]->FindBin(centrMin),binMinX,binMinY,binMinZ); | |
804 | fHistPP[iAnalysisType]->GetBinXYZ(fHistPP[iAnalysisType]->FindBin(centrMax),binMaxX,binMaxY,binMaxZ); | |
6432ac6a | 805 | |
74b04dd4 | 806 | TH1D *gHistBalanceFunctionHistogram = new TH1D(histName.Data(),"",fHistPP[iAnalysisType]->GetNbinsY(),fHistPP[iAnalysisType]->GetYaxis()->GetXmin(),fHistPP[iAnalysisType]->GetYaxis()->GetXmax()); |
6432ac6a | 807 | switch(iAnalysisType) { |
808 | case kRapidity: | |
809 | gHistBalanceFunctionHistogram->GetXaxis()->SetTitle("#Delta y"); | |
810 | gHistBalanceFunctionHistogram->GetYaxis()->SetTitle("B(#Delta y)"); | |
811 | break; | |
812 | case kEta: | |
813 | gHistBalanceFunctionHistogram->GetXaxis()->SetTitle("#Delta #eta"); | |
814 | gHistBalanceFunctionHistogram->GetYaxis()->SetTitle("B(#Delta #eta)"); | |
815 | break; | |
816 | case kQlong: | |
817 | gHistBalanceFunctionHistogram->GetXaxis()->SetTitle("q_{long} (GeV/c)"); | |
818 | gHistBalanceFunctionHistogram->GetYaxis()->SetTitle("B(q_{long})"); | |
819 | break; | |
820 | case kQout: | |
821 | gHistBalanceFunctionHistogram->GetXaxis()->SetTitle("q_{out} (GeV/c)"); | |
822 | gHistBalanceFunctionHistogram->GetYaxis()->SetTitle("B(q_{out})"); | |
823 | break; | |
824 | case kQside: | |
825 | gHistBalanceFunctionHistogram->GetXaxis()->SetTitle("q_{side} (GeV/c)"); | |
826 | gHistBalanceFunctionHistogram->GetYaxis()->SetTitle("B(q_{side})"); | |
827 | break; | |
828 | case kQinv: | |
829 | gHistBalanceFunctionHistogram->GetXaxis()->SetTitle("q_{inv} (GeV/c)"); | |
830 | gHistBalanceFunctionHistogram->GetYaxis()->SetTitle("B(q_{inv})"); | |
831 | break; | |
832 | case kPhi: | |
833 | gHistBalanceFunctionHistogram->GetXaxis()->SetTitle("#Delta #phi (deg.)"); | |
834 | gHistBalanceFunctionHistogram->GetYaxis()->SetTitle("B(#Delta #phi)"); | |
835 | break; | |
836 | default: | |
837 | break; | |
838 | } | |
74b04dd4 | 839 | |
840 | TH1D *hTemp1 = dynamic_cast<TH1D *>(fHistPN[iAnalysisType]->ProjectionY(Form("%s_Cent_%.0f_%.0f",fHistPN[iAnalysisType]->GetName(),centrMin,centrMax),binMinX,binMaxX)); | |
841 | TH1D *hTemp2 = dynamic_cast<TH1D *>(fHistPN[iAnalysisType]->ProjectionY(Form("%s_Cent_%.0f_%.0f_copy",fHistPN[iAnalysisType]->GetName(),centrMin,centrMax),binMinX,binMaxX)); | |
842 | TH1D *hTemp3 = dynamic_cast<TH1D *>(fHistNN[iAnalysisType]->ProjectionY(Form("%s_Cent_%.0f_%.0f",fHistNN[iAnalysisType]->GetName(),centrMin,centrMax),binMinX,binMaxX)); | |
843 | TH1D *hTemp4 = dynamic_cast<TH1D *>(fHistPP[iAnalysisType]->ProjectionY(Form("%s_Cent_%.0f_%.0f",fHistPP[iAnalysisType]->GetName(),centrMin,centrMax),binMinX,binMaxX)); | |
844 | TH1D *hTemp5 = dynamic_cast<TH1D *>(fHistN[iAnalysisType]->ProjectionY(Form("%s_Cent_%.0f_%.0f",fHistN[iAnalysisType]->GetName(),centrMin,centrMax),binMinX,binMaxX)); | |
845 | TH1D *hTemp6 = dynamic_cast<TH1D *>(fHistP[iAnalysisType]->ProjectionY(Form("%s_Cent_%.0f_%.0f",fHistP[iAnalysisType]->GetName(),centrMin,centrMax),binMinX,binMaxX)); | |
33a86282 | 846 | |
847 | if((hTemp1)&&(hTemp2)&&(hTemp3)&&(hTemp4)) { | |
848 | hTemp1->Sumw2(); | |
849 | hTemp2->Sumw2(); | |
850 | hTemp3->Sumw2(); | |
851 | hTemp4->Sumw2(); | |
852 | hTemp1->Add(hTemp3,-2.); | |
74b04dd4 | 853 | hTemp1->Scale(1./hTemp5->GetEntries()); |
33a86282 | 854 | hTemp2->Add(hTemp4,-2.); |
74b04dd4 | 855 | hTemp2->Scale(1./hTemp6->GetEntries()); |
33a86282 | 856 | gHistBalanceFunctionHistogram->Add(hTemp1,hTemp2,1.,1.); |
857 | gHistBalanceFunctionHistogram->Scale(0.5/fP2Step[iAnalysisType]); | |
858 | } | |
b7ce3d3f | 859 | |
860 | // do the acceptance correction (only for Eta and etaWindow > 0) | |
861 | if(iAnalysisType == kEta && etaWindow > 0){ | |
862 | for(Int_t iBin = 0; iBin < gHistBalanceFunctionHistogram->GetNbinsX(); iBin++){ | |
863 | ||
864 | Double_t notCorrected = gHistBalanceFunctionHistogram->GetBinContent(iBin+1); | |
865 | Double_t corrected = notCorrected / (1 - (gHistBalanceFunctionHistogram->GetBinCenter(iBin+1))/ etaWindow ); | |
866 | gHistBalanceFunctionHistogram->SetBinContent(iBin+1, corrected); | |
867 | ||
868 | } | |
869 | } | |
6432ac6a | 870 | |
871 | PrintResults(iAnalysisType,gHistBalanceFunctionHistogram); | |
898d5b28 | 872 | |
6432ac6a | 873 | return gHistBalanceFunctionHistogram; |
874 | } |