]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGCF/FEMTOSCOPY/Chaoticity/AliFourPion.cxx
Include 3D histos to calculate c3(q12,q13,q23)
[u/mrichter/AliRoot.git] / PWGCF / FEMTOSCOPY / Chaoticity / AliFourPion.cxx
CommitLineData
be9ef9f9 1#include <iostream>
2#include <math.h>
3#include "TChain.h"
4#include "TFile.h"
5#include "TKey.h"
6#include "TObject.h"
7#include "TObjString.h"
8#include "TList.h"
9#include "TTree.h"
10#include "TH1F.h"
11#include "TH1D.h"
12#include "TH2D.h"
13#include "TH3D.h"
14#include "TProfile.h"
15#include "TProfile2D.h"
78c3bd48 16#include "TProfile3D.h"
be9ef9f9 17#include "TCanvas.h"
18#include "TRandom3.h"
19#include "TF1.h"
20
21#include "AliAnalysisTask.h"
22#include "AliAnalysisManager.h"
23
24
25#include "AliESDEvent.h"
26#include "AliESDInputHandler.h"
27#include "AliESDtrackCuts.h"
28
29#include "AliAODEvent.h"
30#include "AliAODInputHandler.h"
31#include "AliAODMCParticle.h"
32#include "AliAnalysisUtils.h"
33
34#include "AliFourPion.h"
35
36#define PI 3.1415927
37#define G_Coeff 0.006399 // 2*pi*alpha*M_pion
42802bba 38#define FmToGeV 0.19733 // conversion of Fm to GeV
fcb16ac9 39#define kappa3 0.15 // kappa3 Edgeworth coefficient (non-Gaussian features of C2)
40#define kappa4 0.32 // kappa4 Edgeworth coefficient (non-Gaussian features of C2)
42802bba 41#define kappa3Fit 0.1 // kappa3 for c4QS fit
42#define kappa4Fit 0.5 // kappa4 for c4QS fit
be9ef9f9 43
44// Author: Dhevan Gangadharan
45
46ClassImp(AliFourPion)
47
48//________________________________________________________________________
49AliFourPion::AliFourPion():
50AliAnalysisTaskSE(),
51 fname(0),
52 fAOD(0x0),
53 fOutputList(0x0),
54 fPIDResponse(0x0),
55 fEC(0x0),
56 fEvt(0x0),
57 fTempStruct(0x0),
58 fRandomNumber(0x0),
59 fLEGO(kTRUE),
60 fMCcase(kFALSE),
61 fAODcase(kTRUE),
62 fPbPbcase(kTRUE),
63 fGenerateSignal(kFALSE),
64 fGeneratorOnly(kFALSE),
be9ef9f9 65 fTabulatePairs(kFALSE),
95567836 66 fLinearInterpolation(kTRUE),
42802bba 67 fMixedChargeCut(kFALSE),
be9ef9f9 68 fRMax(11),
78c3bd48 69 fRstartMC(5.0),
be9ef9f9 70 ffcSq(0.7),
80507acf 71 ffcSqMRC(0.6),
be9ef9f9 72 fFilterBit(7),
73 fMaxChi2NDF(10),
74 fMinTPCncls(0),
75 fBfield(0),
76 fMbin(0),
77 fFSIindex(0),
78 fEDbin(0),
79 fMbins(fCentBins),
80 fMultLimit(0),
81 fCentBinLowLimit(0),
82 fCentBinHighLimit(1),
0207c034 83 fTriggerType(0),
be9ef9f9 84 fEventCounter(0),
85 fEventsToMix(0),
86 fZvertexBins(0),
87 fMultLimits(),
42802bba 88 fMinPt(0.16),
89 fMaxPt(1.0),
be9ef9f9 90 fQcut(0),
91 fQLowerCut(0),
92 fNormQcutLow(0),
93 fNormQcutHigh(0),
94 fKupperBound(0),
95 fQupperBoundQ2(0),
96 fQupperBoundQ3(0),
97 fQupperBoundQ4(0),
98 fQbinsQ2(1),
99 fQbinsQ3(1),
100 fQbinsQ4(1),
101 fQupperBoundWeights(0),
78c3bd48 102 fQbinsQinv3D(0),
103 fQupperBoundQinv3D(0),
be9ef9f9 104 fKstepT(),
105 fKstepY(),
106 fKmeanT(),
107 fKmeanY(),
108 fKmiddleT(),
109 fKmiddleY(),
110 fQstep(0),
111 fQstepWeights(0),
112 fQmean(),
113 fDampStart(0),
114 fDampStep(0),
115 fTPCTOFboundry(0),
116 fTOFboundry(0),
117 fSigmaCutTPC(2.0),
118 fSigmaCutTOF(2.0),
4bf06935 119 fMinSepPairEta(0.02),
120 fMinSepPairPhi(0.045),
be9ef9f9 121 fShareQuality(0),
122 fShareFraction(0),
123 fTrueMassP(0),
124 fTrueMassPi(0),
125 fTrueMassK(0),
126 fTrueMassKs(0),
127 fTrueMassLam(0),
128 fKtIndexL(0),
129 fKtIndexH(0),
130 fQoIndexL(0),
131 fQoIndexH(0),
132 fQsIndexL(0),
133 fQsIndexH(0),
134 fQlIndexL(0),
135 fQlIndexH(0),
136 fDummyB(0),
137 fKT3transition(0.3),
138 fKT4transition(0.3),
95567836 139 farrP1(),
140 farrP2(),
b71263d0 141 fDefaultsCharSwitch(),
142 fLowQPairSwitch_E0E0(),
143 fLowQPairSwitch_E0E1(),
144 fLowQPairSwitch_E0E2(),
145 fLowQPairSwitch_E0E3(),
6bb6954b 146 fLowQPairSwitch_E1E1(),
b71263d0 147 fLowQPairSwitch_E1E2(),
148 fLowQPairSwitch_E1E3(),
149 fLowQPairSwitch_E2E3(),
150 fNormQPairSwitch_E0E0(),
151 fNormQPairSwitch_E0E1(),
152 fNormQPairSwitch_E0E2(),
153 fNormQPairSwitch_E0E3(),
6bb6954b 154 fNormQPairSwitch_E1E1(),
b71263d0 155 fNormQPairSwitch_E1E2(),
156 fNormQPairSwitch_E1E3(),
157 fNormQPairSwitch_E2E3(),
80507acf 158 fMomResC2SC(0x0),
159 fMomResC2MC(0x0),
5591748e 160 fWeightmuonCorrection(0x0)
be9ef9f9 161{
162 // Default constructor
163 for(Int_t mb=0; mb<fMbins; mb++){
164 for(Int_t edB=0; edB<fEDbins; edB++){
165 for(Int_t c1=0; c1<2; c1++){
166 for(Int_t c2=0; c2<2; c2++){
167 for(Int_t term=0; term<2; term++){
168
169 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fTerms2=0x0;
170
171 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fIdeal = 0x0;
172 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fSmeared = 0x0;
173 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[0].fTerms2OSL = 0x0;
174 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[0].fTerms2OSLQW = 0x0;
175 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[1].fTerms2OSL = 0x0;
176 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[1].fTerms2OSLQW = 0x0;
177
178 }// term_2
179
180
181 for(Int_t c3=0; c3<2; c3++){
182 for(Int_t term=0; term<5; term++){
183
184 Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fNorm3 = 0x0;
185 Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fTerms3 = 0x0;
b71263d0 186 Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fKfactor = 0x0;
be9ef9f9 187 Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fTwoPartNorm = 0x0;
188
189 }// term_3
b71263d0 190
191 for(Int_t c4=0; c4<2; c4++){
6bb6954b 192 for(Int_t term=0; term<13; term++){
b71263d0 193
194 Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fNorm4 = 0x0;
195 Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fTerms4 = 0x0;
196 Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fKfactor = 0x0;
197 Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fTwoPartNorm = 0x0;
198
199 }// term_4
200
201 }// c4
be9ef9f9 202 }//c3
203 }//c2
204 }//c1
205 for(Int_t tKbin=0; tKbin<fKbinsT; tKbin++){
206 for(Int_t yKbin=0; yKbin<fKbinsY; yKbin++){
207 KT[tKbin].KY[yKbin].MB[mb].EDB[edB].TwoPT[0].fTerms2ThreeD = 0x0;
208 KT[tKbin].KY[yKbin].MB[mb].EDB[edB].TwoPT[1].fTerms2ThreeD = 0x0;
209 }
210 }
211
212 }// ED
213 }// Mbin
214
215 // Initialize FSI histograms
216 for(Int_t i=0; i<12; i++){
217 fFSIss[i]=0x0;
218 fFSIos[i]=0x0;
219 }
220
221
222 // Initialize fNormWeight and fNormWeightErr to 0
223 for(Int_t i=0; i<3; i++){// Kt iterator
224 for(Int_t j=0; j<10; j++){// Mbin iterator
225 fNormWeight[i][j]=0x0;
226 }
227 }
228
229
230}
231//________________________________________________________________________
232AliFourPion::AliFourPion(const Char_t *name)
233: AliAnalysisTaskSE(name),
234 fname(name),
235 fAOD(0x0),
236 fOutputList(0x0),
237 fPIDResponse(0x0),
238 fEC(0x0),
239 fEvt(0x0),
240 fTempStruct(0x0),
241 fRandomNumber(0x0),
242 fLEGO(kTRUE),
243 fMCcase(kFALSE),
244 fAODcase(kTRUE),
245 fPbPbcase(kTRUE),
246 fGenerateSignal(kFALSE),
247 fGeneratorOnly(kFALSE),
be9ef9f9 248 fTabulatePairs(kFALSE),
95567836 249 fLinearInterpolation(kTRUE),
42802bba 250 fMixedChargeCut(kFALSE),
be9ef9f9 251 fRMax(11),
78c3bd48 252 fRstartMC(5.0),
be9ef9f9 253 ffcSq(0.7),
80507acf 254 ffcSqMRC(0.6),
be9ef9f9 255 fFilterBit(7),
256 fMaxChi2NDF(10),
257 fMinTPCncls(0),
258 fBfield(0),
259 fMbin(0),
260 fFSIindex(0),
261 fEDbin(0),
262 fMbins(fCentBins),
263 fMultLimit(0),
264 fCentBinLowLimit(0),
265 fCentBinHighLimit(1),
0207c034 266 fTriggerType(0),
be9ef9f9 267 fEventCounter(0),
268 fEventsToMix(0),
269 fZvertexBins(0),
270 fMultLimits(),
42802bba 271 fMinPt(0.16),
272 fMaxPt(1.0),
be9ef9f9 273 fQcut(0),
274 fQLowerCut(0),
275 fNormQcutLow(0),
276 fNormQcutHigh(0),
277 fKupperBound(0),
278 fQupperBoundQ2(0),
279 fQupperBoundQ3(0),
280 fQupperBoundQ4(0),
281 fQbinsQ2(1),
282 fQbinsQ3(1),
283 fQbinsQ4(1),
284 fQupperBoundWeights(0),
78c3bd48 285 fQbinsQinv3D(0),
286 fQupperBoundQinv3D(0),
be9ef9f9 287 fKstepT(),
288 fKstepY(),
289 fKmeanT(),
290 fKmeanY(),
291 fKmiddleT(),
292 fKmiddleY(),
293 fQstep(0),
294 fQstepWeights(0),
295 fQmean(),
296 fDampStart(0),
297 fDampStep(0),
298 fTPCTOFboundry(0),
299 fTOFboundry(0),
300 fSigmaCutTPC(2.0),
301 fSigmaCutTOF(2.0),
4bf06935 302 fMinSepPairEta(0.02),
303 fMinSepPairPhi(0.045),
be9ef9f9 304 fShareQuality(0),
305 fShareFraction(0),
306 fTrueMassP(0),
307 fTrueMassPi(0),
308 fTrueMassK(0),
309 fTrueMassKs(0),
310 fTrueMassLam(0),
311 fKtIndexL(0),
312 fKtIndexH(0),
313 fQoIndexL(0),
314 fQoIndexH(0),
315 fQsIndexL(0),
316 fQsIndexH(0),
317 fQlIndexL(0),
318 fQlIndexH(0),
319 fDummyB(0),
320 fKT3transition(0.3),
321 fKT4transition(0.3),
95567836 322 farrP1(),
323 farrP2(),
b71263d0 324 fDefaultsCharSwitch(),
325 fLowQPairSwitch_E0E0(),
326 fLowQPairSwitch_E0E1(),
327 fLowQPairSwitch_E0E2(),
328 fLowQPairSwitch_E0E3(),
6bb6954b 329 fLowQPairSwitch_E1E1(),
b71263d0 330 fLowQPairSwitch_E1E2(),
331 fLowQPairSwitch_E1E3(),
332 fLowQPairSwitch_E2E3(),
333 fNormQPairSwitch_E0E0(),
334 fNormQPairSwitch_E0E1(),
335 fNormQPairSwitch_E0E2(),
336 fNormQPairSwitch_E0E3(),
6bb6954b 337 fNormQPairSwitch_E1E1(),
b71263d0 338 fNormQPairSwitch_E1E2(),
339 fNormQPairSwitch_E1E3(),
340 fNormQPairSwitch_E2E3(),
80507acf 341 fMomResC2SC(0x0),
342 fMomResC2MC(0x0),
5591748e 343 fWeightmuonCorrection(0x0)
be9ef9f9 344{
345 // Main constructor
346 fAODcase=kTRUE;
6432c081 347
be9ef9f9 348
349
350 for(Int_t mb=0; mb<fMbins; mb++){
351 for(Int_t edB=0; edB<fEDbins; edB++){
352 for(Int_t c1=0; c1<2; c1++){
353 for(Int_t c2=0; c2<2; c2++){
354 for(Int_t term=0; term<2; term++){
355
356 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fTerms2=0x0;
357
358 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fIdeal = 0x0;
359 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fSmeared = 0x0;
360 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[0].fTerms2OSL = 0x0;
361 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[0].fTerms2OSLQW = 0x0;
362 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[1].fTerms2OSL = 0x0;
363 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[1].fTerms2OSLQW = 0x0;
364
365 }// term_2
366
367 for(Int_t c3=0; c3<2; c3++){
368 for(Int_t term=0; term<5; term++){
369
370 Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fNorm3 = 0x0;
371 Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fTerms3 = 0x0;
b71263d0 372 Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fKfactor = 0x0;
be9ef9f9 373 Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fTwoPartNorm = 0x0;
374
375 }// term_3
b71263d0 376
377 for(Int_t c4=0; c4<2; c4++){
6bb6954b 378 for(Int_t term=0; term<13; term++){
b71263d0 379
380 Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fNorm4 = 0x0;
381 Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fTerms4 = 0x0;
382 Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fKfactor = 0x0;
383 Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fTwoPartNorm = 0x0;
384
385 }// term_4
386 }// c4
be9ef9f9 387 }//c3
388 }//c2
389 }//c1
390
391 for(Int_t tKbin=0; tKbin<fKbinsT; tKbin++){
392 for(Int_t yKbin=0; yKbin<fKbinsY; yKbin++){
393 KT[tKbin].KY[yKbin].MB[mb].EDB[edB].TwoPT[0].fTerms2ThreeD = 0x0;
394 KT[tKbin].KY[yKbin].MB[mb].EDB[edB].TwoPT[1].fTerms2ThreeD = 0x0;
395 }
396 }
397
398 }// ED
399 }// Mbin
400
401 // Initialize FSI histograms
402 for(Int_t i=0; i<12; i++){
403 fFSIss[i]=0x0;
404 fFSIos[i]=0x0;
405 }
406
407 // Initialize fNormWeight and fNormWeightErr to 0
408 for(Int_t i=0; i<3; i++){// Kt iterator
409 for(Int_t j=0; j<10; j++){// Mbin iterator
410 fNormWeight[i][j]=0x0;
411 }
412 }
413
414
415 DefineOutput(1, TList::Class());
416}
417//________________________________________________________________________
418AliFourPion::AliFourPion(const AliFourPion &obj)
419 : AliAnalysisTaskSE(obj.fname),
420 fname(obj.fname),
421 fAOD(obj.fAOD),
422 //fESD(obj.fESD),
423 fOutputList(obj.fOutputList),
424 fPIDResponse(obj.fPIDResponse),
425 fEC(obj.fEC),
426 fEvt(obj.fEvt),
427 fTempStruct(obj.fTempStruct),
428 fRandomNumber(obj.fRandomNumber),
429 fLEGO(obj.fLEGO),
430 fMCcase(obj.fMCcase),
431 fAODcase(obj.fAODcase),
432 fPbPbcase(obj.fPbPbcase),
433 fGenerateSignal(obj.fGenerateSignal),
434 fGeneratorOnly(obj.fGeneratorOnly),
be9ef9f9 435 fTabulatePairs(obj.fTabulatePairs),
95567836 436 fLinearInterpolation(obj.fLinearInterpolation),
42802bba 437 fMixedChargeCut(obj.fMixedChargeCut),
be9ef9f9 438 fRMax(obj.fRMax),
78c3bd48 439 fRstartMC(obj.fRstartMC),
be9ef9f9 440 ffcSq(obj.ffcSq),
80507acf 441 ffcSqMRC(obj.ffcSqMRC),
be9ef9f9 442 fFilterBit(obj.fFilterBit),
443 fMaxChi2NDF(obj.fMaxChi2NDF),
444 fMinTPCncls(obj.fMinTPCncls),
445 fBfield(obj.fBfield),
446 fMbin(obj.fMbin),
447 fFSIindex(obj.fFSIindex),
448 fEDbin(obj.fEDbin),
449 fMbins(obj.fMbins),
450 fMultLimit(obj.fMultLimit),
451 fCentBinLowLimit(obj.fCentBinLowLimit),
452 fCentBinHighLimit(obj.fCentBinHighLimit),
0207c034 453 fTriggerType(obj.fTriggerType),
be9ef9f9 454 fEventCounter(obj.fEventCounter),
455 fEventsToMix(obj.fEventsToMix),
456 fZvertexBins(obj.fZvertexBins),
457 fMultLimits(),
42802bba 458 fMinPt(obj.fMinPt),
459 fMaxPt(obj.fMaxPt),
460 fQcut(obj.fQcut),
be9ef9f9 461 fQLowerCut(obj.fQLowerCut),
462 fNormQcutLow(0),
463 fNormQcutHigh(0),
464 fKupperBound(obj.fKupperBound),
465 fQupperBoundQ2(obj.fQupperBoundQ2),
466 fQupperBoundQ3(obj.fQupperBoundQ3),
467 fQupperBoundQ4(obj.fQupperBoundQ4),
468 fQbinsQ2(obj.fQbinsQ2),
469 fQbinsQ3(obj.fQbinsQ3),
470 fQbinsQ4(obj.fQbinsQ4),
471 fQupperBoundWeights(obj.fQupperBoundWeights),
78c3bd48 472 fQbinsQinv3D(obj.fQbinsQinv3D),
473 fQupperBoundQinv3D(obj.fQupperBoundQinv3D),
be9ef9f9 474 fKstepT(),
475 fKstepY(),
476 fKmeanT(),
477 fKmeanY(),
478 fKmiddleT(),
479 fKmiddleY(),
480 fQstep(obj.fQstep),
481 fQstepWeights(obj.fQstepWeights),
482 fQmean(),
483 fDampStart(obj.fDampStart),
484 fDampStep(obj.fDampStep),
485 fTPCTOFboundry(obj.fTPCTOFboundry),
486 fTOFboundry(obj.fTOFboundry),
487 fSigmaCutTPC(obj.fSigmaCutTPC),
488 fSigmaCutTOF(obj.fSigmaCutTOF),
489 fMinSepPairEta(obj.fMinSepPairEta),
490 fMinSepPairPhi(obj.fMinSepPairPhi),
491 fShareQuality(obj.fShareQuality),
492 fShareFraction(obj.fShareFraction),
493 fTrueMassP(obj.fTrueMassP),
494 fTrueMassPi(obj.fTrueMassPi),
495 fTrueMassK(obj.fTrueMassK),
496 fTrueMassKs(obj.fTrueMassKs),
497 fTrueMassLam(obj.fTrueMassLam),
498 fKtIndexL(obj.fKtIndexL),
499 fKtIndexH(obj.fKtIndexH),
500 fQoIndexL(obj.fQoIndexL),
501 fQoIndexH(obj.fQoIndexH),
502 fQsIndexL(obj.fQsIndexL),
503 fQsIndexH(obj.fQsIndexH),
504 fQlIndexL(obj.fQlIndexL),
505 fQlIndexH(obj.fQlIndexH),
506 fDummyB(obj.fDummyB),
507 fKT3transition(obj.fKT3transition),
508 fKT4transition(obj.fKT4transition),
95567836 509 farrP1(),
510 farrP2(),
b71263d0 511 fDefaultsCharSwitch(),
512 fLowQPairSwitch_E0E0(),
513 fLowQPairSwitch_E0E1(),
514 fLowQPairSwitch_E0E2(),
515 fLowQPairSwitch_E0E3(),
6bb6954b 516 fLowQPairSwitch_E1E1(),
b71263d0 517 fLowQPairSwitch_E1E2(),
518 fLowQPairSwitch_E1E3(),
519 fLowQPairSwitch_E2E3(),
520 fNormQPairSwitch_E0E0(),
521 fNormQPairSwitch_E0E1(),
522 fNormQPairSwitch_E0E2(),
523 fNormQPairSwitch_E0E3(),
6bb6954b 524 fNormQPairSwitch_E1E1(),
b71263d0 525 fNormQPairSwitch_E1E2(),
526 fNormQPairSwitch_E1E3(),
527 fNormQPairSwitch_E2E3(),
80507acf 528 fMomResC2SC(obj.fMomResC2SC),
529 fMomResC2MC(obj.fMomResC2MC),
5591748e 530 fWeightmuonCorrection(obj.fWeightmuonCorrection)
be9ef9f9 531{
532 // Copy Constructor
533
534 for(Int_t i=0; i<12; i++){
535 fFSIss[i]=obj.fFSIss[i];
536 fFSIos[i]=obj.fFSIos[i];
537 }
538
539 // Initialize fNormWeight and fNormWeightErr to 0
540 for(Int_t i=0; i<3; i++){// Kt iterator
541 for(Int_t j=0; j<10; j++){// Mbin iterator
542 fNormWeight[i][j]=0x0;
543 }
544 }
545
546
547}
548//________________________________________________________________________
549AliFourPion &AliFourPion::operator=(const AliFourPion &obj)
550{
551 // Assignment operator
552 if (this == &obj)
553 return *this;
554
555 fname = obj.fname;
556 fAOD = obj.fAOD;
557 fOutputList = obj.fOutputList;
558 fPIDResponse = obj.fPIDResponse;
559 fEC = obj.fEC;
560 fEvt = obj.fEvt;
561 fTempStruct = obj.fTempStruct;
562 fRandomNumber = obj.fRandomNumber;
563 fLEGO = fLEGO;
564 fMCcase = obj.fMCcase;
565 fAODcase = obj.fAODcase;
566 fPbPbcase = obj.fPbPbcase;
567 fGenerateSignal = obj.fGenerateSignal;
568 fGeneratorOnly = obj.fGeneratorOnly;
be9ef9f9 569 fTabulatePairs = obj.fTabulatePairs;
95567836 570 fLinearInterpolation = obj.fLinearInterpolation;
42802bba 571 fMixedChargeCut = obj.fMixedChargeCut;
be9ef9f9 572 fRMax = obj.fRMax;
78c3bd48 573 fRstartMC = obj.fRstartMC;
be9ef9f9 574 ffcSq = obj.ffcSq;
80507acf 575 ffcSqMRC = obj.ffcSqMRC;
be9ef9f9 576 fFilterBit = obj.fFilterBit;
577 fMaxChi2NDF = obj.fMaxChi2NDF;
578 fMinTPCncls = obj.fMinTPCncls;
579 fBfield = obj.fBfield;
580 fMbin = obj.fMbin;
581 fFSIindex = obj.fFSIindex;
582 fEDbin = obj.fEDbin;
583 fMbins = obj.fMbins;
584 fMultLimit = obj.fMultLimit;
585 fCentBinLowLimit = obj.fCentBinLowLimit;
586 fCentBinHighLimit = obj.fCentBinHighLimit;
0207c034 587 fTriggerType = obj.fTriggerType;
be9ef9f9 588 fEventCounter = obj.fEventCounter;
589 fEventsToMix = obj.fEventsToMix;
590 fZvertexBins = obj.fZvertexBins;
42802bba 591 fMinPt = obj.fMinPt;
592 fMaxPt = obj.fMaxPt;
593 fQcut = obj.fQcut;
be9ef9f9 594 fQLowerCut = obj.fQLowerCut;
595 fKupperBound = obj.fKupperBound;
596 fQupperBoundQ2 = obj.fQupperBoundQ2;
597 fQupperBoundQ3 = obj.fQupperBoundQ3;
598 fQupperBoundQ4 = obj.fQupperBoundQ4;
599 fQbinsQ2 = obj.fQbinsQ2;
600 fQbinsQ3 = obj.fQbinsQ3;
601 fQbinsQ4 = obj.fQbinsQ4;
602 fQupperBoundWeights = obj.fQupperBoundWeights;
78c3bd48 603 fQbinsQinv3D = obj.fQbinsQinv3D;
604 fQupperBoundQinv3D = obj.fQupperBoundQinv3D;
be9ef9f9 605 fQstep = obj.fQstep;
606 fQstepWeights = obj.fQstepWeights;
607 fDampStart = obj.fDampStart;
608 fDampStep = obj.fDampStep;
609 fTPCTOFboundry = obj.fTPCTOFboundry;
610 fTOFboundry = obj.fTOFboundry;
611 fSigmaCutTPC = obj.fSigmaCutTPC;
612 fSigmaCutTOF = obj.fSigmaCutTOF;
613 fMinSepPairEta = obj.fMinSepPairEta;
614 fMinSepPairPhi = obj.fMinSepPairPhi;
615 fShareQuality = obj.fShareQuality;
616 fShareFraction = obj.fShareFraction;
617 fTrueMassP = obj.fTrueMassP;
618 fTrueMassPi = obj.fTrueMassPi;
619 fTrueMassK = obj.fTrueMassK;
620 fTrueMassKs = obj.fTrueMassKs;
621 fTrueMassLam = obj.fTrueMassLam;
622 fKtIndexL = obj.fKtIndexL;
623 fKtIndexH = obj.fKtIndexH;
624 fQoIndexL = obj.fQoIndexL;
625 fQoIndexH = obj.fQoIndexH;
626 fQsIndexL = obj.fQsIndexL;
627 fQsIndexH = obj.fQsIndexH;
628 fQlIndexL = obj.fQlIndexL;
629 fQlIndexH = obj.fQlIndexH;
630 fDummyB = obj.fDummyB;
631 fKT3transition = obj.fKT3transition;
632 fKT4transition = obj.fKT4transition;
80507acf 633 fMomResC2SC = obj.fMomResC2SC;
634 fMomResC2MC = obj.fMomResC2MC;
5591748e 635 fWeightmuonCorrection = obj.fWeightmuonCorrection;
be9ef9f9 636
637 for(Int_t i=0; i<12; i++){
638 fFSIss[i]=obj.fFSIss[i];
639 fFSIos[i]=obj.fFSIos[i];
640 }
641 for(Int_t i=0; i<3; i++){// Kt iterator
642 for(Int_t j=0; j<10; j++){// Mbin iterator
643 fNormWeight[i][j]=obj.fNormWeight[i][j];
644 }
645 }
646
647 return (*this);
648}
649//________________________________________________________________________
650AliFourPion::~AliFourPion()
651{
652 // Destructor
653 if(fAOD) delete fAOD;
654 //if(fESD) delete fESD;
655 if(fOutputList) delete fOutputList;
656 if(fPIDResponse) delete fPIDResponse;
657 if(fEC) delete fEC;
658 if(fEvt) delete fEvt;
659 if(fTempStruct) delete [] fTempStruct;
660 if(fRandomNumber) delete fRandomNumber;
80507acf 661 if(fMomResC2SC) delete fMomResC2SC;
662 if(fMomResC2MC) delete fMomResC2MC;
5591748e 663 if(fWeightmuonCorrection) delete fWeightmuonCorrection;
664
b71263d0 665 for(Int_t j=0; j<kMultLimitPbPb; j++){
666 if(fLowQPairSwitch_E0E0[j]) delete [] fLowQPairSwitch_E0E0[j];
667 if(fLowQPairSwitch_E0E1[j]) delete [] fLowQPairSwitch_E0E1[j];
668 if(fLowQPairSwitch_E0E2[j]) delete [] fLowQPairSwitch_E0E2[j];
669 if(fLowQPairSwitch_E0E3[j]) delete [] fLowQPairSwitch_E0E3[j];
6bb6954b 670 if(fLowQPairSwitch_E1E1[j]) delete [] fLowQPairSwitch_E1E1[j];
b71263d0 671 if(fLowQPairSwitch_E1E2[j]) delete [] fLowQPairSwitch_E1E2[j];
672 if(fLowQPairSwitch_E1E3[j]) delete [] fLowQPairSwitch_E1E3[j];
673 if(fLowQPairSwitch_E2E3[j]) delete [] fLowQPairSwitch_E2E3[j];
674 //
675 if(fNormQPairSwitch_E0E0[j]) delete [] fNormQPairSwitch_E0E0[j];
676 if(fNormQPairSwitch_E0E1[j]) delete [] fNormQPairSwitch_E0E1[j];
677 if(fNormQPairSwitch_E0E2[j]) delete [] fNormQPairSwitch_E0E2[j];
678 if(fNormQPairSwitch_E0E3[j]) delete [] fNormQPairSwitch_E0E3[j];
6bb6954b 679 if(fNormQPairSwitch_E1E1[j]) delete [] fNormQPairSwitch_E1E1[j];
b71263d0 680 if(fNormQPairSwitch_E1E2[j]) delete [] fNormQPairSwitch_E1E2[j];
681 if(fNormQPairSwitch_E1E3[j]) delete [] fNormQPairSwitch_E1E3[j];
682 if(fNormQPairSwitch_E2E3[j]) delete [] fNormQPairSwitch_E2E3[j];
683 }
be9ef9f9 684
685 //
686 for(Int_t mb=0; mb<fMbins; mb++){
687 for(Int_t edB=0; edB<fEDbins; edB++){
688 for(Int_t c1=0; c1<2; c1++){
689 for(Int_t c2=0; c2<2; c2++){
690 for(Int_t term=0; term<2; term++){
691
692 if(Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fTerms2) delete Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fTerms2;
693
694 if(Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fIdeal) delete Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fIdeal;
695 if(Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fSmeared) delete Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fSmeared;
696 if(Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[0].fTerms2OSL) delete Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[0].fTerms2OSL;
697 if(Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[0].fTerms2OSLQW) delete Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[0].fTerms2OSLQW;
698 if(Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[1].fTerms2OSL) delete Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[1].fTerms2OSL;
699 if(Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[1].fTerms2OSLQW) delete Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[1].fTerms2OSLQW;
700 //
701 if(Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fMCqinv) delete Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fMCqinv;
702 if(Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fMCqinvQW) delete Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fMCqinvQW;
703 }// term_2
704
705 for(Int_t c3=0; c3<2; c3++){
706 for(Int_t term=0; term<5; term++){
707
708 if(Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fNorm3) delete Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fNorm3;
709 if(Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fTerms3) delete Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fTerms3;
b71263d0 710 if(Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fKfactor) delete Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fKfactor;
42802bba 711 if(Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fKfactorWeighted) delete Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fKfactorWeighted;
be9ef9f9 712 //
713 if(Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fTwoPartNorm) delete Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fTwoPartNorm;
78c3bd48 714 if(Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fTerms33D) delete Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fTerms33D;
715 if(Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fKfactor3D) delete Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fKfactor3D;
be9ef9f9 716 }// term_3
b71263d0 717
718 for(Int_t c4=0; c4<2; c4++){
6bb6954b 719 for(Int_t term=0; term<13; term++){
b71263d0 720
721 if(Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fNorm4) delete Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fNorm4;
722 if(Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fTerms4) delete Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fTerms4;
723 if(Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fKfactor) delete Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fKfactor;
42802bba 724 if(Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fKfactorWeighted) delete Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fKfactorWeighted;
b71263d0 725 //
726 if(Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fTwoPartNorm) delete Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fTwoPartNorm;
727 }// term_4
728
729 }//c4
be9ef9f9 730 }//c3
731 }//c2
732 }//c1
733 for(Int_t tKbin=0; tKbin<fKbinsT; tKbin++){
734 for(Int_t yKbin=0; yKbin<fKbinsY; yKbin++){
735 if(KT[tKbin].KY[yKbin].MB[mb].EDB[edB].TwoPT[0].fTerms2ThreeD) delete KT[tKbin].KY[yKbin].MB[mb].EDB[edB].TwoPT[0].fTerms2ThreeD;
736 if(KT[tKbin].KY[yKbin].MB[mb].EDB[edB].TwoPT[1].fTerms2ThreeD) delete KT[tKbin].KY[yKbin].MB[mb].EDB[edB].TwoPT[1].fTerms2ThreeD;
737 }
738 }
739
740 }// ED
741 }// Mbin
742
743
744 for(Int_t i=0; i<12; i++){
745 if(fFSIss[i]) delete fFSIss[i];
746 if(fFSIos[i]) delete fFSIos[i];
747 }
748 for(Int_t i=0; i<3; i++){// Kt iterator
749 for(Int_t j=0; j<10; j++){// Mbin iterator
750 if(fNormWeight[i][j]) delete fNormWeight[i][j];
751 }
752 }
753
754}
755//________________________________________________________________________
756void AliFourPion::ParInit()
757{
758 cout<<"AliFourPion MyInit() call"<<endl;
759 cout<<"lego:"<<fLEGO<<" MCcase:"<<fMCcase<<" PbPbcase:"<<fPbPbcase<<" TabulatePairs:"<<fTabulatePairs<<" GenSignal:"<<fGenerateSignal<<" CentLow:"<<fCentBinLowLimit<<" CentHigh:"<<fCentBinHighLimit<<" RMax:"<<fRMax<<" fc^2:"<<ffcSq<<" FB:"<<fFilterBit<<" MaxChi2/NDF:"<<fMaxChi2NDF<<" MinTPCncls:"<<fMinTPCncls<<" MinPairSepEta:"<<fMinSepPairEta<<" MinPairSepPhi:"<<fMinSepPairPhi<<" NsigTPC:"<<fSigmaCutTPC<<" NsigTOF:"<<fSigmaCutTOF<<endl;
760
761 fRandomNumber = new TRandom3();
762 fRandomNumber->SetSeed(0);
763
764 //
765 fEventCounter=0;
766 fEventsToMix=3;
767 fZvertexBins=2;//2
768
769 fTPCTOFboundry = 0.6;// TPC pid used below this momentum, TOF above but below TOF_boundry
770 fTOFboundry = 2.1;// TOF pid used below this momentum
771
772 ////////////////////////////////////////////////
773 // PadRow Pair Cuts
774 fShareQuality = .5;// max
775 fShareFraction = .05;// max
776 ////////////////////////////////////////////////
777
0207c034 778 // pp and pPb mult limits
779 fMultLimits[0]=0, fMultLimits[1]=5; fMultLimits[2]=10; fMultLimits[3]=15; fMultLimits[4]=20;
780 fMultLimits[5]=30, fMultLimits[6]=40; fMultLimits[7]=50; fMultLimits[8]=70; fMultLimits[9]=100;
781 fMultLimits[10]=150;
be9ef9f9 782
783
784
785 if(fPbPbcase) {// PbPb
786 fMultLimit=kMultLimitPbPb;
787 fMbins=fCentBins;
788 fQcut=0.1;
b71263d0 789 fNormQcutLow = 0.15;// 0.15
790 fNormQcutHigh = 0.2;// 0.175
78c3bd48 791 fRstartMC = 5.0;
792 fQbinsQinv3D = 20;
793 fQupperBoundQinv3D = 0.1;
be9ef9f9 794 }else {// pp
795 fMultLimit=kMultLimitpp;
0207c034 796 fMbins=1;
be9ef9f9 797 fQcut=0.6;
798 fNormQcutLow = 1.0;
799 fNormQcutHigh = 1.5;
78c3bd48 800 fRstartMC = 1.0;
801 fQbinsQinv3D = 60;
802 fQupperBoundQinv3D = 0.6;
be9ef9f9 803 }
804
805 fQLowerCut = 0.005;// was 0.005
806 fKupperBound = 1.0;
807 //
808 fKstepY[0] = 1.6;
809 fKmeanY[0] = 0;// central y
810 fKmiddleY[0] = 0;
811
812 // 4x1 (Kt: 0-0.25, 0.25-0.35, 0.35-0.45, 0.45-1.0)
813 if(fKbinsT==4){
814 fKstepT[0] = 0.25; fKstepT[1] = 0.1; fKstepT[2] = 0.1; fKstepT[3] = 0.55;
815 fKmeanT[0] = 0.212; fKmeanT[1] = 0.299; fKmeanT[2] = 0.398; fKmeanT[3] = 0.576;
816 fKmiddleT[0] = 0.125; fKmiddleT[1] = 0.3; fKmiddleT[2] = 0.4; fKmiddleT[3] = 0.725;
817 }
818 // 3x1 (Kt: 0-0.3, 0.3-0.45, 0.45-1.0)
819 if(fKbinsT==3){
820 fKstepT[0] = 0.3; fKstepT[1] = 0.15; fKstepT[2] = 0.55;
821 fKmeanT[0] = 0.240; fKmeanT[1] = 0.369; fKmeanT[2] = 0.576;
822 fKmiddleT[0] = 0.15; fKmiddleT[1] = 0.375; fKmiddleT[2] = 0.725;
823 }
824 // 2x1 (Kt: 0-0.35, 0.35-1.0)
825 if(fKbinsT==2){
826 fKstepT[0] = 0.35; fKstepT[1] = 0.65;
827 fKmeanT[0] = 0.264; fKmeanT[1] = 0.500;
828 fKmiddleT[0] = 0.175; fKmiddleT[1] = 0.675;
829 }
830
831 //
832 fQupperBoundWeights = 0.2;
833 fQupperBoundQ2 = 2.0;
5591748e 834 fQupperBoundQ3 = 0.6;
835 fQupperBoundQ4 = 0.6;
be9ef9f9 836 fQbinsQ2 = fQupperBoundQ2/0.005;
837 fQbinsQ3 = fQupperBoundQ3/0.005;
838 fQbinsQ4 = fQupperBoundQ4/0.005;
839 fQstepWeights = fQupperBoundWeights/Float_t(kQbinsWeights);
840 for(Int_t i=0; i<kQbinsWeights; i++) {fQmean[i]=(i+0.5)*fQstepWeights;}
841 //
842 fDampStart = 0.5;// was 0.3, then 0.5
843 fDampStep = 0.02;
844
845 //
be9ef9f9 846
847 fEC = new AliFourPionEventCollection **[fZvertexBins];
848 for(UShort_t i=0; i<fZvertexBins; i++){
849
0207c034 850 fEC[i] = new AliFourPionEventCollection *[fMbinsMixing];
be9ef9f9 851
0207c034 852 for(UShort_t j=0; j<fMbinsMixing; j++){
be9ef9f9 853
854 fEC[i][j] = new AliFourPionEventCollection(fEventsToMix+1, fMultLimit, kMCarrayLimit, fMCcase);
855 }
856 }
857
b71263d0 858 for(Int_t i=0; i<kMultLimitPbPb; i++) fDefaultsCharSwitch[i]='0';
859 for(Int_t i=0; i<kMultLimitPbPb; i++) {
860 fLowQPairSwitch_E0E0[i] = new TArrayC(kMultLimitPbPb,fDefaultsCharSwitch);
861 fLowQPairSwitch_E0E1[i] = new TArrayC(kMultLimitPbPb,fDefaultsCharSwitch);
862 fLowQPairSwitch_E0E2[i] = new TArrayC(kMultLimitPbPb,fDefaultsCharSwitch);
863 fLowQPairSwitch_E0E3[i] = new TArrayC(kMultLimitPbPb,fDefaultsCharSwitch);
6bb6954b 864 fLowQPairSwitch_E1E1[i] = new TArrayC(kMultLimitPbPb,fDefaultsCharSwitch);
b71263d0 865 fLowQPairSwitch_E1E2[i] = new TArrayC(kMultLimitPbPb,fDefaultsCharSwitch);
866 fLowQPairSwitch_E1E3[i] = new TArrayC(kMultLimitPbPb,fDefaultsCharSwitch);
867 fLowQPairSwitch_E2E3[i] = new TArrayC(kMultLimitPbPb,fDefaultsCharSwitch);
868 //
869 fNormQPairSwitch_E0E0[i] = new TArrayC(kMultLimitPbPb,fDefaultsCharSwitch);
870 fNormQPairSwitch_E0E1[i] = new TArrayC(kMultLimitPbPb,fDefaultsCharSwitch);
871 fNormQPairSwitch_E0E2[i] = new TArrayC(kMultLimitPbPb,fDefaultsCharSwitch);
872 fNormQPairSwitch_E0E3[i] = new TArrayC(kMultLimitPbPb,fDefaultsCharSwitch);
6bb6954b 873 fNormQPairSwitch_E1E1[i] = new TArrayC(kMultLimitPbPb,fDefaultsCharSwitch);
b71263d0 874 fNormQPairSwitch_E1E2[i] = new TArrayC(kMultLimitPbPb,fDefaultsCharSwitch);
875 fNormQPairSwitch_E1E3[i] = new TArrayC(kMultLimitPbPb,fDefaultsCharSwitch);
876 fNormQPairSwitch_E2E3[i] = new TArrayC(kMultLimitPbPb,fDefaultsCharSwitch);
877 }
be9ef9f9 878
879 fTempStruct = new AliFourPionTrackStruct[fMultLimit];
b71263d0 880
881
be9ef9f9 882 fTrueMassP=0.93827, fTrueMassPi=0.13957, fTrueMassK=0.493677, fTrueMassKs=0.497614, fTrueMassLam=1.11568;
883
884
885
886 // Set weights, Coulomb corrections, and Momentum resolution corrections manually if not on LEGO
887 if(!fLEGO) {
888 SetFSICorrelations(fLEGO);// Read in 2-particle and 3-particle FSI correlations
889 if(!fTabulatePairs) SetWeightArrays(fLEGO);// Set Weight Array
890 if(!fMCcase && !fTabulatePairs) SetMomResCorrections(fLEGO);// Read Momentum resolution file
5591748e 891 if(!fMCcase && !fTabulatePairs) SetMuonCorrections(fLEGO);// Read Muon corrections
be9ef9f9 892 }
893
894 /////////////////////////////////////////////
895 /////////////////////////////////////////////
896
897}
898//________________________________________________________________________
899void AliFourPion::UserCreateOutputObjects()
900{
901 // Create histograms
902 // Called once
903
904 ParInit();// Initialize my settings
905
906
907 fOutputList = new TList();
908 fOutputList->SetOwner();
909
910 TH3F *fVertexDist = new TH3F("fVertexDist","Vertex Distribution",20,-1,1, 20,-1,1, 600,-30,30);
911 fVertexDist->GetXaxis()->SetTitle("X Vertex (cm)");
912 fVertexDist->GetYaxis()->SetTitle("Y Vertex (cm)");
913 fVertexDist->GetZaxis()->SetTitle("Z Vertex (cm)");
914 fOutputList->Add(fVertexDist);
915
916
917 TH2F *fDCAxyDistPlus = new TH2F("fDCAxyDistPlus","DCA distribution",300,0,3., 50,0,5);
918 fOutputList->Add(fDCAxyDistPlus);
919 TH2F *fDCAzDistPlus = new TH2F("fDCAzDistPlus","DCA distribution",300,0,3., 50,0,5);
920 fOutputList->Add(fDCAzDistPlus);
921 TH2F *fDCAxyDistMinus = new TH2F("fDCAxyDistMinus","DCA distribution",300,0,3., 50,0,5);
922 fOutputList->Add(fDCAxyDistMinus);
923 TH2F *fDCAzDistMinus = new TH2F("fDCAzDistMinus","DCA distribution",300,0,3., 50,0,5);
924 fOutputList->Add(fDCAzDistMinus);
925
926
927 TH1F *fEvents1 = new TH1F("fEvents1","Events vs. fMbin",fMbins,.5,fMbins+.5);
928 fOutputList->Add(fEvents1);
929 TH1F *fEvents2 = new TH1F("fEvents2","Events vs. fMbin",fMbins,.5,fMbins+.5);
930 fOutputList->Add(fEvents2);
931
932 TH1F *fMultDist0 = new TH1F("fMultDist0","Multiplicity Distribution",fMultLimit,-.5,fMultLimit-.5);
933 fMultDist0->GetXaxis()->SetTitle("Multiplicity");
934 fOutputList->Add(fMultDist0);
935
936 TH1F *fMultDist1 = new TH1F("fMultDist1","Multiplicity Distribution",fMultLimit,-.5,fMultLimit-.5);
937 fMultDist1->GetXaxis()->SetTitle("Multiplicity");
938 fOutputList->Add(fMultDist1);
939
940 TH1F *fMultDist2 = new TH1F("fMultDist2","Multiplicity Distribution",fMultLimit,-.5,fMultLimit-.5);
941 fMultDist2->GetXaxis()->SetTitle("Multiplicity");
942 fOutputList->Add(fMultDist2);
943
944 TH1F *fMultDist3 = new TH1F("fMultDist3","Multiplicity Distribution",fMultLimit,-.5,fMultLimit-.5);
945 fMultDist3->GetXaxis()->SetTitle("Multiplicity");
946 fOutputList->Add(fMultDist3);
947
0207c034 948 TH3F *fChPtEtaDist = new TH3F("fChPtEtaDist","fChPtEtaDist",2,-1.1,1.1, 300,0,3., 28,-1.4,1.4);
949 fOutputList->Add(fChPtEtaDist);
950 TH3F *fChPhiPtDist = new TH3F("fChPhiPtDist","fChPhiPtDist",2,-1.1,1.1, 120,0,2*PI, 300,0,3.);
951 fOutputList->Add(fChPhiPtDist);
be9ef9f9 952
0207c034 953 TH2F *fCentEtaDist = new TH2F("fCentEtaDist","",10,-.5,9.5, 28,-1.4,1.4);
954 fOutputList->Add(fCentEtaDist);
955 TH2F *fCentPtDist = new TH2F("fCentPtDist","",10,-.5,9.5, 600,0,3.);
956 fOutputList->Add(fCentPtDist);
957
be9ef9f9 958 TH3F *fTOFResponse = new TH3F("fTOFResponse","TOF relative time",20,0,100, 200,0,2, 4000,-20000,20000);
959 fOutputList->Add(fTOFResponse);
960 TH3F *fTPCResponse = new TH3F("fTPCResponse","TPCsignal",20,0,100, 200,0,2, 1000,0,1000);
961 fOutputList->Add(fTPCResponse);
962
fac2d84b 963 TH1F *fRejectedPairs = new TH1F("fRejectedPairs","",400,0,2);
be9ef9f9 964 fOutputList->Add(fRejectedPairs);
fac2d84b 965 TH1F *fRejectedPairsWeighting = new TH1F("fAcceptedPairsWeighting","",400,0,2);
966 fOutputList->Add(fRejectedPairsWeighting);
967 TH1F *fTotalPairsWeighting = new TH1F("fTotalPairsWeighting","",400,0,2);
968 fOutputList->Add(fTotalPairsWeighting);
969 //
970 TH1F *fRejectedPairsMC = new TH1F("fRejectedPairsMC","",400,0,2);
971 fOutputList->Add(fRejectedPairsMC);
972 TH1F *fRejectedPairsWeightingMC = new TH1F("fAcceptedPairsWeightingMC","",400,0,2);
973 fOutputList->Add(fRejectedPairsWeightingMC);
974 TH1F *fTotalPairsWeightingMC = new TH1F("fTotalPairsWeightingMC","",400,0,2);
975 fOutputList->Add(fTotalPairsWeightingMC);
976
be9ef9f9 977 TH1I *fRejectedEvents = new TH1I("fRejectedEvents","",fMbins,0.5,fMbins+.5);
978 fOutputList->Add(fRejectedEvents);
fac2d84b 979
be9ef9f9 980 TH3F *fPairsDetaDPhiNum = new TH3F("fPairsDetaDPhiNum","",10,-.5,9.5, 200,-0.2,0.2, 600,-0.3,0.3);
981 if(fMCcase) fOutputList->Add(fPairsDetaDPhiNum);
982 TH3F *fPairsDetaDPhiDen = new TH3F("fPairsDetaDPhiDen","",10,-.5,9.5, 200,-0.2,0.2, 600,-0.3,0.3);
983 if(fMCcase) fOutputList->Add(fPairsDetaDPhiDen);
984 TH3F *fPairsShareFracDPhiNum = new TH3F("fPairsShareFracDPhiNum","",10,-.5,9.5, 159,0,1, 600,-0.3,0.3);
985 if(fMCcase) fOutputList->Add(fPairsShareFracDPhiNum);
986 TH3F *fPairsShareFracDPhiDen = new TH3F("fPairsShareFracDPhiDen","",10,-.5,9.5, 159,0,1, 600,-0.3,0.3);
987 if(fMCcase) fOutputList->Add(fPairsShareFracDPhiDen);
988 TH3D* fPairsPadRowNum = new TH3D("fPairsPadRowNum","", 20,0,1, 159,0,1, 40,0,0.2);
989 if(fMCcase) fOutputList->Add(fPairsPadRowNum);
990 TH3D* fPairsPadRowDen = new TH3D("fPairsPadRowDen","", 20,0,1, 159,0,1, 40,0,0.2);
991 if(fMCcase) fOutputList->Add(fPairsPadRowDen);
992
993
994
995 TH2D *fResonanceOSPairs = new TH2D("fResonanceOSPairs","",fMbins,.5,fMbins+.5, 1000,0,2);
996 if(fMCcase) fOutputList->Add(fResonanceOSPairs);
997 TH2D *fAllOSPairs = new TH2D("fAllOSPairs","",fMbins,.5,fMbins+.5, 1000,0,2);
998 if(fMCcase) fOutputList->Add(fAllOSPairs);
999
1000 TH3D *fPrimarySCPionPairs = new TH3D("fPrimarySCPionPairs","",fMbins,.5,fMbins+.5, 20,0,1, 20,0,0.2);
1001 if(fMCcase) fOutputList->Add(fPrimarySCPionPairs);
1002 TH3D *fAllSCPionPairs = new TH3D("fAllSCPionPairs","",fMbins,.5,fMbins+.5, 20,0,1, 20,0,0.2);
1003 if(fMCcase) fOutputList->Add(fAllSCPionPairs);
1004 TH3D *fPrimaryMCPionPairs = new TH3D("fPrimaryMCPionPairs","",fMbins,.5,fMbins+.5, 20,0,1, 20,0,0.2);
1005 if(fMCcase) fOutputList->Add(fPrimaryMCPionPairs);
1006 TH3D *fAllMCPionPairs = new TH3D("fAllMCPionPairs","",fMbins,.5,fMbins+.5, 20,0,1, 20,0,0.2);
1007 if(fMCcase) fOutputList->Add(fAllMCPionPairs);
1008
1009 //
1010 TH1D *fMuonParents = new TH1D("fMuonParents","",500,0.5,500.5);
1011 if(fMCcase) fOutputList->Add(fMuonParents);
1012 TH1D *fSecondaryMuonParents = new TH1D("fSecondaryMuonParents","",500,0.5,500.5);
1013 if(fMCcase) fOutputList->Add(fSecondaryMuonParents);
1014 TH3D *fMuonPionDeltaQinv = new TH3D("fMuonPionDeltaQinv","",2,-0.5,1.5, 20,0,1, 100,-0.2,0.2);
1015 if(fMCcase) fOutputList->Add(fMuonPionDeltaQinv);
1016 TH1D *fPionCandidates = new TH1D("fPionCandidates","",500,0.5,500.5);
1017 if(fMCcase) fOutputList->Add(fPionCandidates);
1018 //
1019
1020
1021 TProfile *fAvgMult = new TProfile("fAvgMult","",fMbins,.5,fMbins+.5, 0,1500,"");
1022 fOutputList->Add(fAvgMult);
1023
1024 TH2D *fTrackChi2NDF = new TH2D("fTrackChi2NDF","",20,0,100, 100,0,10);
1025 fOutputList->Add(fTrackChi2NDF);
1026 TH2D *fTrackTPCncls = new TH2D("fTrackTPCncls","",20,0,100, 110,50,160);
1027 fOutputList->Add(fTrackTPCncls);
1028
1029
1030 TH1D *fTPNRejects3pion1 = new TH1D("fTPNRejects3pion1","",fQbinsQ3,0,fQupperBoundQ3);
1031 fOutputList->Add(fTPNRejects3pion1);
1032 TH1D *fTPNRejects3pion2 = new TH1D("fTPNRejects3pion2","",fQbinsQ3,0,fQupperBoundQ3);
1033 fOutputList->Add(fTPNRejects3pion2);
1034 TH1D *fTPNRejects4pion1 = new TH1D("fTPNRejects4pion1","",fQbinsQ4,0,fQupperBoundQ4);
1035 fOutputList->Add(fTPNRejects4pion1);
1036
1037 TH3D *fKT3DistTerm1 = new TH3D("fKT3DistTerm1","",fMbins,.5,fMbins+.5, 20,0,1, 20,0,0.2);
1038 TH3D *fKT3DistTerm5 = new TH3D("fKT3DistTerm5","",fMbins,.5,fMbins+.5, 20,0,1, 20,0,0.2);
1039 fOutputList->Add(fKT3DistTerm1);
1040 fOutputList->Add(fKT3DistTerm5);
1041 TH3D *fKT4DistTerm1 = new TH3D("fKT4DistTerm1","",fMbins,.5,fMbins+.5, 20,0,1, 20,0,0.2);
6bb6954b 1042 TH3D *fKT4DistTerm13 = new TH3D("fKT4DistTerm13","",fMbins,.5,fMbins+.5, 20,0,1, 20,0,0.2);
be9ef9f9 1043 fOutputList->Add(fKT4DistTerm1);
6bb6954b 1044 fOutputList->Add(fKT4DistTerm13);
be9ef9f9 1045
1046
1047 TProfile2D *fKT3AvgpT = new TProfile2D("fKT3AvgpT","",fMbins,.5,fMbins+.5, 2,-0.5,1.5, 0.,1.0,"");
1048 fOutputList->Add(fKT3AvgpT);
1049 TProfile2D *fKT4AvgpT = new TProfile2D("fKT4AvgpT","",fMbins,.5,fMbins+.5, 2,-0.5,1.5, 0.,1.0,"");
1050 fOutputList->Add(fKT4AvgpT);
4bf06935 1051 TH3D* fQ3AvgpTENsum0 = new TH3D("fQ3AvgpTENsum0","", 2,-0.5,1.5, fQbinsQ3,0,fQupperBoundQ3, 180,0.1,1.0);
1052 fOutputList->Add(fQ3AvgpTENsum0);
1053 TH3D* fQ3AvgpTENsum3 = new TH3D("fQ3AvgpTENsum3","", 2,-0.5,1.5, fQbinsQ3,0,fQupperBoundQ3, 180,0.1,1.0);
1054 fOutputList->Add(fQ3AvgpTENsum3);
1055 TH3D* fQ3AvgpTENsum6 = new TH3D("fQ3AvgpTENsum6","", 2,-0.5,1.5, fQbinsQ3,0,fQupperBoundQ3, 180,0.1,1.0);
1056 fOutputList->Add(fQ3AvgpTENsum6);
1057 //
1058 TH3D* fQ4AvgpTENsum0 = new TH3D("fQ4AvgpTENsum0","", 2,-0.5,1.5, fQbinsQ4,0,fQupperBoundQ4, 180,0.1,1.0);
1059 fOutputList->Add(fQ4AvgpTENsum0);
1060 TH3D* fQ4AvgpTENsum1 = new TH3D("fQ4AvgpTENsum1","", 2,-0.5,1.5, fQbinsQ4,0,fQupperBoundQ4, 180,0.1,1.0);
1061 fOutputList->Add(fQ4AvgpTENsum1);
1062 TH3D* fQ4AvgpTENsum2 = new TH3D("fQ4AvgpTENsum2","", 2,-0.5,1.5, fQbinsQ4,0,fQupperBoundQ4, 180,0.1,1.0);
1063 fOutputList->Add(fQ4AvgpTENsum2);
1064 TH3D* fQ4AvgpTENsum3 = new TH3D("fQ4AvgpTENsum3","", 2,-0.5,1.5, fQbinsQ4,0,fQupperBoundQ4, 180,0.1,1.0);
1065 fOutputList->Add(fQ4AvgpTENsum3);
1066 TH3D* fQ4AvgpTENsum6 = new TH3D("fQ4AvgpTENsum6","", 2,-0.5,1.5, fQbinsQ4,0,fQupperBoundQ4, 180,0.1,1.0);
1067 fOutputList->Add(fQ4AvgpTENsum6);
be9ef9f9 1068
1069 TH1D *fMCWeight3DTerm1SC = new TH1D("fMCWeight3DTerm1SC","", 20,0,0.2);
1070 TH1D *fMCWeight3DTerm1SCden = new TH1D("fMCWeight3DTerm1SCden","", 20,0,0.2);
1071 TH1D *fMCWeight3DTerm2SC = new TH1D("fMCWeight3DTerm2SC","", 20,0,0.2);
1072 TH1D *fMCWeight3DTerm2SCden = new TH1D("fMCWeight3DTerm2SCden","", 20,0,0.2);
1073 TH1D *fMCWeight3DTerm1MC = new TH1D("fMCWeight3DTerm1MC","", 20,0,0.2);
1074 TH1D *fMCWeight3DTerm1MCden = new TH1D("fMCWeight3DTerm1MCden","", 20,0,0.2);
1075 TH1D *fMCWeight3DTerm2MC = new TH1D("fMCWeight3DTerm2MC","", 20,0,0.2);
1076 TH1D *fMCWeight3DTerm2MCden = new TH1D("fMCWeight3DTerm2MCden","", 20,0,0.2);
1077 TH1D *fMCWeight3DTerm3MC = new TH1D("fMCWeight3DTerm3MC","", 20,0,0.2);
1078 TH1D *fMCWeight3DTerm3MCden = new TH1D("fMCWeight3DTerm3MCden","", 20,0,0.2);
1079 TH1D *fMCWeight3DTerm4MC = new TH1D("fMCWeight3DTerm4MC","", 20,0,0.2);
1080 TH1D *fMCWeight3DTerm4MCden = new TH1D("fMCWeight3DTerm4MCden","", 20,0,0.2);
1081 fOutputList->Add(fMCWeight3DTerm1SC);
1082 fOutputList->Add(fMCWeight3DTerm1SCden);
1083 fOutputList->Add(fMCWeight3DTerm2SC);
1084 fOutputList->Add(fMCWeight3DTerm2SCden);
1085 fOutputList->Add(fMCWeight3DTerm1MC);
1086 fOutputList->Add(fMCWeight3DTerm1MCden);
1087 fOutputList->Add(fMCWeight3DTerm2MC);
1088 fOutputList->Add(fMCWeight3DTerm2MCden);
1089 fOutputList->Add(fMCWeight3DTerm3MC);
1090 fOutputList->Add(fMCWeight3DTerm3MCden);
1091 fOutputList->Add(fMCWeight3DTerm4MC);
1092 fOutputList->Add(fMCWeight3DTerm4MCden);
1093
1094
6432c081 1095
1096 for(Int_t mb=0; mb<fMbins; mb++){
0207c034 1097 if(fPbPbcase) {if((mb < fCentBinLowLimit) || (mb > fCentBinHighLimit)) continue;}
be9ef9f9 1098
6432c081 1099 for(Int_t edB=0; edB<fEDbins; edB++){
1100 for(Int_t c1=0; c1<2; c1++){
1101 for(Int_t c2=0; c2<2; c2++){
1102 for(Int_t term=0; term<2; term++){
1103
1104 TString *nameEx2 = new TString("TwoParticle_Charge1_");
1105 *nameEx2 += c1;
1106 nameEx2->Append("_Charge2_");
1107 *nameEx2 += c2;
1108 nameEx2->Append("_M_");
1109 *nameEx2 += mb;
1110 nameEx2->Append("_ED_");
1111 *nameEx2 += edB;
1112 nameEx2->Append("_Term_");
1113 *nameEx2 += term+1;
1114
1115 if( (c1+c2)==1 ) {if(c1!=0) continue;}// skip degenerate histogram
1116
1117
1118 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fTerms2 = new TH2D(nameEx2->Data(),"Two Particle Distribution",20,0,1, fQbinsQ2,0,fQupperBoundQ2);
1119 fOutputList->Add(Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fTerms2);
1120 TString *nameEx2QW=new TString(nameEx2->Data());
1121 nameEx2QW->Append("_QW");
1122 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fTerms2QW = new TH2D(nameEx2QW->Data(),"Two Particle Distribution",20,0,1, fQbinsQ2,0,fQupperBoundQ2);
1123 fOutputList->Add(Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fTerms2QW);
1124 TString *nameAvgP=new TString(nameEx2->Data());
1125 nameAvgP->Append("_AvgP");
1126 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fAvgP = new TProfile2D(nameAvgP->Data(),"",10,0,1, fQbinsQ2,0,fQupperBoundQ2, 0.,1.0,"");
1127 fOutputList->Add(Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fAvgP);
1128
1129 TString *nameUnitMult=new TString(nameEx2->Data());
1130 nameUnitMult->Append("_UnitMult");
1131 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fUnitMultBin = new TH2D(nameUnitMult->Data(),"Two Particle Distribution",21,0.5,21.5, fQbinsQ2,0,fQupperBoundQ2);
1132 fOutputList->Add(Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fUnitMultBin);
1133
1134 if(fMCcase){
1135 // Momentum resolution histos
1136 TString *nameIdeal = new TString(nameEx2->Data());
1137 nameIdeal->Append("_Ideal");
1138 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fIdeal = new TH2D(nameIdeal->Data(),"Two Particle Distribution",11,0.5,11.5, fQbinsQ2,0,fQupperBoundQ2);
1139 if(mb==0) fOutputList->Add(Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fIdeal);
1140 TString *nameSmeared = new TString(nameEx2->Data());
1141 nameSmeared->Append("_Smeared");
1142 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fSmeared = new TH2D(nameSmeared->Data(),"Two Particle Distribution",11,0.5,11.5, fQbinsQ2,0,fQupperBoundQ2);
1143 if(mb==0) fOutputList->Add(Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fSmeared);
1144 //
1145 // Muon correction histos
1146 TString *nameMuonIdeal=new TString(nameEx2->Data());
1147 nameMuonIdeal->Append("_MuonIdeal");
1148 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fMuonIdeal = new TH2D(nameMuonIdeal->Data(),"", 11,0.5,11.5, fQbinsQ2,0,fQupperBoundQ2);
1149 if(mb==0 && edB==0) fOutputList->Add(Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fMuonIdeal);
1150 TString *nameMuonSmeared=new TString(nameEx2->Data());
1151 nameMuonSmeared->Append("_MuonSmeared");
1152 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fMuonSmeared = new TH2D(nameMuonSmeared->Data(),"", 11,0.5,11.5, fQbinsQ2,0,fQupperBoundQ2);
1153 if(mb==0 && edB==0) fOutputList->Add(Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fMuonSmeared);
1154 //
1155 TString *nameMuonPionK2=new TString(nameEx2->Data());
1156 nameMuonPionK2->Append("_MuonPionK2");
1157 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fMuonPionK2 = new TH2D(nameMuonPionK2->Data(),"", 11,0.5,11.5, fQbinsQ2,0,fQupperBoundQ2);
1158 if(mb==0 && edB==0) fOutputList->Add(Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fMuonPionK2);
1159 //
1160 TString *namePionPionK2=new TString(nameEx2->Data());
1161 namePionPionK2->Append("_PionPionK2");
1162 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fPionPionK2 = new TH2D(namePionPionK2->Data(),"", 11,0.5,11.5, fQbinsQ2,0,fQupperBoundQ2);
1163 if(mb==0 && edB==0) fOutputList->Add(Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fPionPionK2);
1164 //
1165 //
1166 TString *nameEx2MC=new TString(nameEx2->Data());
1167 nameEx2MC->Append("_MCqinv");
1168 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fMCqinv = new TH1D(nameEx2MC->Data(),"", fQbinsQ2,0,fQupperBoundQ2);
1169 fOutputList->Add(Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fMCqinv);
1170 TString *nameEx2MCQW=new TString(nameEx2->Data());
1171 nameEx2MCQW->Append("_MCqinvQW");
1172 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fMCqinvQW = new TH1D(nameEx2MCQW->Data(),"", fQbinsQ2,0,fQupperBoundQ2);
1173 fOutputList->Add(Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fMCqinvQW);
1174 //
1175 TString *nameEx2PIDpurityDen=new TString(nameEx2->Data());
1176 nameEx2PIDpurityDen->Append("_PIDpurityDen");
1177 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fPIDpurityDen = new TH2D(nameEx2PIDpurityDen->Data(),"Two Particle Distribution",20,0,1, fQbinsQ2,0,fQupperBoundQ2);
1178 fOutputList->Add(Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fPIDpurityDen);
1179 TString *nameEx2PIDpurityNum=new TString(nameEx2->Data());
1180 nameEx2PIDpurityNum->Append("_PIDpurityNum");
1181 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fPIDpurityNum = new TH3D(nameEx2PIDpurityNum->Data(),"Two Particle Distribution",16,0.5,16.5, 20,0,1, fQbinsQ2,0,fQupperBoundQ2);
1182 fOutputList->Add(Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fPIDpurityNum);
1183 }
1184 TString *nameEx2OSLB1 = new TString(nameEx2->Data());
1185 nameEx2OSLB1->Append("_osl_b1");
1186 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[0].fTerms2OSL = new TH3D(nameEx2OSLB1->Data(),"Two Particle Distribution",kQbinsWeights,0,fQupperBoundWeights, kQbinsWeights,0,fQupperBoundWeights, kQbinsWeights,0,fQupperBoundWeights);
1187 fOutputList->Add(Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[0].fTerms2OSL);
1188 nameEx2OSLB1->Append("_QW");
1189 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[0].fTerms2OSLQW = new TH3D(nameEx2OSLB1->Data(),"Two Particle Distribution",kQbinsWeights,0,fQupperBoundWeights, kQbinsWeights,0,fQupperBoundWeights, kQbinsWeights,0,fQupperBoundWeights);
1190 fOutputList->Add(Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[0].fTerms2OSLQW);
1191 //
1192 TString *nameEx2OSLB2 = new TString(nameEx2->Data());
1193 nameEx2OSLB2->Append("_osl_b2");
1194 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[1].fTerms2OSL = new TH3D(nameEx2OSLB2->Data(),"Two Particle Distribution",kQbinsWeights,0,fQupperBoundWeights, kQbinsWeights,0,fQupperBoundWeights, kQbinsWeights,0,fQupperBoundWeights);
1195 fOutputList->Add(Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[1].fTerms2OSL);
1196 nameEx2OSLB2->Append("_QW");
1197 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[1].fTerms2OSLQW = new TH3D(nameEx2OSLB2->Data(),"Two Particle Distribution",kQbinsWeights,0,fQupperBoundWeights, kQbinsWeights,0,fQupperBoundWeights, kQbinsWeights,0,fQupperBoundWeights);
1198 fOutputList->Add(Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[1].fTerms2OSLQW);
1199
1200 }// term_2
1201
1202
1203
1204 // skip 3-particle if Tabulate6DPairs is true
1205 if(fTabulatePairs) continue;
1206
1207 for(Int_t c3=0; c3<2; c3++){
1208 for(Int_t term=0; term<5; term++){
be9ef9f9 1209
6432c081 1210 TString *namePC3 = new TString("ThreeParticle_Charge1_");
1211 *namePC3 += c1;
1212 namePC3->Append("_Charge2_");
1213 *namePC3 += c2;
1214 namePC3->Append("_Charge3_");
1215 *namePC3 += c3;
1216 namePC3->Append("_M_");
1217 *namePC3 += mb;
1218 namePC3->Append("_ED_");
1219 *namePC3 += edB;
1220 namePC3->Append("_Term_");
1221 *namePC3 += term+1;
be9ef9f9 1222
6432c081 1223 ///////////////////////////////////////
1224 // skip degenerate histograms
1225 if( (c1+c2+c3)==1) {if(c3!=1) continue;}
1226 if( (c1+c2+c3)==2) {if(c1!=0) continue;}
1227 /////////////////////////////////////////
be9ef9f9 1228
be9ef9f9 1229
6432c081 1230 TString *nameNorm=new TString(namePC3->Data());
1231 nameNorm->Append("_Norm");
1232 Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fNorm3 = new TH1D(nameNorm->Data(),"Norm",1,-0.5,0.5);
1233 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fNorm3);
1234 //
be9ef9f9 1235
6432c081 1236 TString *name1DQ=new TString(namePC3->Data());
1237 name1DQ->Append("_1D");
1238 Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fTerms3 = new TH1D(name1DQ->Data(),"", fQbinsQ3,0,fQupperBoundQ3);
1239 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fTerms3);
78c3bd48 1240 if(c1==0 && c2==0 && c3==0){
1241 TString *name3DQ=new TString(namePC3->Data());
1242 name3DQ->Append("_3D");
1243 Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fTerms33D = new TH3D(name3DQ->Data(),"", fQbinsQinv3D,0,fQupperBoundQinv3D, fQbinsQinv3D,0,fQupperBoundQinv3D, fQbinsQinv3D,0,fQupperBoundQinv3D);
1244 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fTerms33D);
1245 }
6432c081 1246 //
1247 TString *nameKfactor=new TString(namePC3->Data());
1248 nameKfactor->Append("_Kfactor");
1249 Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fKfactor = new TProfile(nameKfactor->Data(),"", fQbinsQ3,0,fQupperBoundQ3, 0,100, "");
1250 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fKfactor);
78c3bd48 1251 if(c1==0 && c2==0 && c3==0){
1252 TString *nameKfactor3D=new TString(namePC3->Data());
1253 nameKfactor3D->Append("_Kfactor3D");
1254 Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fKfactor3D = new TProfile3D(nameKfactor3D->Data(),"", fQbinsQinv3D,0,fQupperBoundQinv3D, fQbinsQinv3D,0,fQupperBoundQinv3D, fQbinsQinv3D,0,fQupperBoundQinv3D, "");
1255 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fKfactor3D);
1256 }
6432c081 1257 //
80507acf 1258 TString *nameKfactorW=new TString(namePC3->Data());
1259 nameKfactorW->Append("_KfactorWeighted");
1260 Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fKfactorWeighted = new TProfile(nameKfactorW->Data(),"", fQbinsQ3,0,fQupperBoundQ3, 0,100, "");
1261 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fKfactorWeighted);
1262 //
6432c081 1263 TString *nameMeanQinv=new TString(namePC3->Data());
1264 nameMeanQinv->Append("_MeanQinv");
1265 Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fMeanQinv = new TProfile(nameMeanQinv->Data(),"", fQbinsQ3,0,fQupperBoundQ3, 0,.2, "");
1266 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fMeanQinv);
1267
1268 if(fMCcase==kTRUE){
1269 // Momentum resolution correction histos
1270 TString *nameMomResIdeal=new TString(namePC3->Data());
1271 nameMomResIdeal->Append("_Ideal");
1272 Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fIdeal = new TH2D(nameMomResIdeal->Data(),"", 11,0.5,11.5, fQbinsQ3,0,fQupperBoundQ3);
1273 if(mb==0) fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fIdeal);
1274 TString *nameMomResSmeared=new TString(namePC3->Data());
1275 nameMomResSmeared->Append("_Smeared");
1276 Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fSmeared = new TH2D(nameMomResSmeared->Data(),"", 11,0.5,11.5, fQbinsQ3,0,fQupperBoundQ3);
1277 if(mb==0) fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fSmeared);
be9ef9f9 1278 // Muon correction histos
6432c081 1279 TString *nameMuonIdeal=new TString(namePC3->Data());
be9ef9f9 1280 nameMuonIdeal->Append("_MuonIdeal");
6432c081 1281 Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fMuonIdeal = new TH3D(nameMuonIdeal->Data(),"", 2,0.5,2.5, 11,0.5,11.5, fQbinsQ3,0,fQupperBoundQ3);
1282 if(mb==0 && edB==0 && term<4) fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fMuonIdeal);
1283 TString *nameMuonSmeared=new TString(namePC3->Data());
be9ef9f9 1284 nameMuonSmeared->Append("_MuonSmeared");
6432c081 1285 Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fMuonSmeared = new TH3D(nameMuonSmeared->Data(),"", 2,0.5,2.5, 11,0.5,11.5, fQbinsQ3,0,fQupperBoundQ3);
1286 if(mb==0 && edB==0 && term<4) fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fMuonSmeared);
be9ef9f9 1287 //
6432c081 1288 TString *nameMuonPionK3=new TString(namePC3->Data());
1289 nameMuonPionK3->Append("_MuonPionK3");
1290 Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fMuonPionK3 = new TH3D(nameMuonPionK3->Data(),"", 2,0.5,2.5, 11,0.5,11.5, fQbinsQ3,0,fQupperBoundQ3);
1291 if(mb==0 && edB==0 && term<4) fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fMuonPionK3);
be9ef9f9 1292 //
6432c081 1293 TString *namePionPionK3=new TString(namePC3->Data());
1294 namePionPionK3->Append("_PionPionK3");
1295 Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fPionPionK3 = new TH3D(namePionPionK3->Data(),"", 2,0.5,2.5, 11,0.5,11.5, fQbinsQ3,0,fQupperBoundQ3);
1296 if(mb==0 && edB==0 && term<4) fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fPionPionK3);
1297
1298 }// MCcase
1299 //
1300 if(c1==c2 && c1==c3 && term==4 ){
1301 TString *nameTwoPartNorm=new TString(namePC3->Data());
1302 nameTwoPartNorm->Append("_TwoPartNorm");
1303 Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fTwoPartNorm = new TH2D(nameTwoPartNorm->Data(),"", kDENtypes,0.5,kDENtypes+0.5, fQbinsQ3,0,fQupperBoundQ3);
1304 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fTwoPartNorm);
be9ef9f9 1305 //
6432c081 1306 TString *nameTwoPartNegNorm=new TString(namePC3->Data());
1307 nameTwoPartNegNorm->Append("_TwoPartNegNorm");
1308 Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fTwoPartNegNorm = new TH2D(nameTwoPartNegNorm->Data(),"", kDENtypes,0.5,kDENtypes+0.5, fQbinsQ3,0,fQupperBoundQ3);
1309 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fTwoPartNegNorm);
be9ef9f9 1310 //
6432c081 1311 TString *nameTwoPartNormErr=new TString(namePC3->Data());
1312 nameTwoPartNormErr->Append("_TwoPartNormErr");
1313 Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fTwoPartNormErr = new TH2D(nameTwoPartNormErr->Data(),"", kDENtypes,0.5,kDENtypes+0.5, fQbinsQ3,0,fQupperBoundQ3);
1314 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fTwoPartNormErr);
1315 }// term=4
be9ef9f9 1316
6432c081 1317 }// term_3
be9ef9f9 1318
6432c081 1319 for(Int_t c4=0; c4<2; c4++){
1320 for(Int_t term=0; term<13; term++){
1321
1322 TString *namePC4 = new TString("FourParticle_Charge1_");
1323 *namePC4 += c1;
1324 namePC4->Append("_Charge2_");
1325 *namePC4 += c2;
1326 namePC4->Append("_Charge3_");
1327 *namePC4 += c3;
1328 namePC4->Append("_Charge4_");
1329 *namePC4 += c4;
1330 namePC4->Append("_M_");
1331 *namePC4 += mb;
1332 namePC4->Append("_ED_");
1333 *namePC4 += edB;
1334 namePC4->Append("_Term_");
1335 *namePC4 += term+1;
be9ef9f9 1336
1337 ///////////////////////////////////////
1338 // skip degenerate histograms
6432c081 1339 if( (c1+c2+c3+c4)==1) {if(c4!=1) continue;}
1340 if( (c1+c2+c3+c4)==2) {if(c3+c4!=2) continue;}
1341 if( (c1+c2+c3+c4)==3) {if(c1!=0) continue;}
be9ef9f9 1342 /////////////////////////////////////////
1343
6432c081 1344 TString *nameNorm=new TString(namePC4->Data());
be9ef9f9 1345 nameNorm->Append("_Norm");
6432c081 1346 Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fNorm4 = new TH1D(nameNorm->Data(),"Norm",1,-0.5,0.5);
1347 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fNorm4);
be9ef9f9 1348 //
6432c081 1349 TString *name1DQ=new TString(namePC4->Data());
be9ef9f9 1350 name1DQ->Append("_1D");
6432c081 1351 Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fTerms4 = new TH1D(name1DQ->Data(),"", fQbinsQ4,0,fQupperBoundQ4);
1352 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fTerms4);
be9ef9f9 1353 //
6432c081 1354 TString *nameKfactor=new TString(namePC4->Data());
be9ef9f9 1355 nameKfactor->Append("_Kfactor");
6432c081 1356 Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fKfactor = new TProfile(nameKfactor->Data(),"", fQbinsQ4,0,fQupperBoundQ4, 0,100, "");
1357 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fKfactor);
be9ef9f9 1358 //
80507acf 1359 TString *nameKfactorW=new TString(namePC4->Data());
1360 nameKfactorW->Append("_KfactorWeighted");
1361 Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fKfactorWeighted = new TProfile(nameKfactorW->Data(),"", fQbinsQ4,0,fQupperBoundQ4, 0,100, "");
1362 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fKfactorWeighted);
1363 //
6432c081 1364 if(c1==c2 && c1==c3 && c1==c4 && term==12 ){
1365 TString *nameTwoPartNorm=new TString(namePC4->Data());
1366 nameTwoPartNorm->Append("_TwoPartNorm");
1367 Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fTwoPartNorm = new TH2D(nameTwoPartNorm->Data(),"", kDENtypes,0.5,kDENtypes+0.5, fQbinsQ4,0,fQupperBoundQ4);
1368 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fTwoPartNorm);
1369 //
1370 TString *nameTwoPartNegNorm=new TString(namePC4->Data());
1371 nameTwoPartNegNorm->Append("_TwoPartNegNorm");
1372 Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fTwoPartNegNorm = new TH2D(nameTwoPartNegNorm->Data(),"", kDENtypes,0.5,kDENtypes+0.5, fQbinsQ4,0,fQupperBoundQ4);
1373 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fTwoPartNegNorm);
1374 //
1375 TString *nameTwoPartNormErr=new TString(namePC4->Data());
1376 nameTwoPartNormErr->Append("_TwoPartNormErr");
1377 Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fTwoPartNormErr = new TH2D(nameTwoPartNormErr->Data(),"", kDENtypes,0.5,kDENtypes+0.5, fQbinsQ4,0,fQupperBoundQ4);
1378 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fTwoPartNormErr);
1379 }
be9ef9f9 1380
1381 if(fMCcase==kTRUE){
1382 // Momentum resolution correction histos
6432c081 1383 TString *nameMomResIdeal=new TString(namePC4->Data());
be9ef9f9 1384 nameMomResIdeal->Append("_Ideal");
6432c081 1385 Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fIdeal = new TH2D(nameMomResIdeal->Data(),"", 11,0.5,11.5, fQbinsQ4,0,fQupperBoundQ4);
1386 if(mb==0) fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fIdeal);
1387 TString *nameMomResSmeared=new TString(namePC4->Data());
be9ef9f9 1388 nameMomResSmeared->Append("_Smeared");
6432c081 1389 Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fSmeared = new TH2D(nameMomResSmeared->Data(),"", 11,0.5,11.5, fQbinsQ4,0,fQupperBoundQ4);
1390 if(mb==0) fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fSmeared);
be9ef9f9 1391 // Muon correction histos
6432c081 1392 TString *nameMuonIdeal=new TString(namePC4->Data());
be9ef9f9 1393 nameMuonIdeal->Append("_MuonIdeal");
6432c081 1394 Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fMuonIdeal = new TH3D(nameMuonIdeal->Data(),"", 2,0.5,2.5, 11,0.5,11.5, fQbinsQ4,0,fQupperBoundQ4);
1395 if(mb==0 && edB==0 && term<12) fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fMuonIdeal);
1396 TString *nameMuonSmeared=new TString(namePC4->Data());
be9ef9f9 1397 nameMuonSmeared->Append("_MuonSmeared");
6432c081 1398 Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fMuonSmeared = new TH3D(nameMuonSmeared->Data(),"", 2,0.5,2.5, 11,0.5,11.5, fQbinsQ4,0,fQupperBoundQ4);
1399 if(mb==0 && edB==0 && term<12) fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fMuonSmeared);
be9ef9f9 1400 //
6432c081 1401 TString *nameMuonPionK4=new TString(namePC4->Data());
1402 nameMuonPionK4->Append("_MuonPionK4");
1403 Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fMuonPionK4 = new TH3D(nameMuonPionK4->Data(),"", 2,0.5,2.5, 11,0.5,11.5, fQbinsQ4,0,fQupperBoundQ4);
1404 if(mb==0 && edB==0 && term<12) fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fMuonPionK4);
be9ef9f9 1405 //
6432c081 1406 TString *namePionPionK4=new TString(namePC4->Data());
1407 namePionPionK4->Append("_PionPionK4");
1408 Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fPionPionK4 = new TH3D(namePionPionK4->Data(),"", 2,0.5,2.5, 11,0.5,11.5, fQbinsQ4,0,fQupperBoundQ4);
1409 if(mb==0 && edB==0 && term<12) fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fPionPionK4);
be9ef9f9 1410
1411 }// MCcase
be9ef9f9 1412
6432c081 1413
be9ef9f9 1414 }
6432c081 1415 }
1416
1417 }//c3
1418 }//c2
1419 }//c1
1420 }// ED
1421 }// mbin
be9ef9f9 1422
be9ef9f9 1423
1424
1425 if(fTabulatePairs){
1426
1427 for(Int_t tKbin=0; tKbin<fKbinsT; tKbin++){
1428 for(Int_t yKbin=0; yKbin<fKbinsY; yKbin++){
1429 for(Int_t mb=0; mb<fMbins; mb++){
1430 for(Int_t edB=0; edB<fEDbins; edB++){
1431
1432 TString *nameNum = new TString("TPN_num_Kt_");
1433 *nameNum += tKbin;
1434 nameNum->Append("_Ky_");
1435 *nameNum += yKbin;
1436 nameNum->Append("_M_");
1437 *nameNum += mb;
1438 nameNum->Append("_ED_");
1439 *nameNum += edB;
1440
1441 TString *nameDen = new TString("TPN_den_Kt_");
1442 *nameDen += tKbin;
1443 nameDen->Append("_Ky_");
1444 *nameDen += yKbin;
1445 nameDen->Append("_M_");
1446 *nameDen += mb;
1447 nameDen->Append("_ED_");
1448 *nameDen += edB;
1449
1450 if(edB==0){
1451 KT[tKbin].KY[yKbin].MB[mb].EDB[edB].TwoPT[0].fTerms2ThreeD = new TH3D(nameNum->Data(),"", kQbinsWeights,0,fQupperBoundWeights, kQbinsWeights,0,fQupperBoundWeights, kQbinsWeights,0,fQupperBoundWeights);
1452 fOutputList->Add(KT[tKbin].KY[yKbin].MB[mb].EDB[edB].TwoPT[0].fTerms2ThreeD);
1453
1454 KT[tKbin].KY[yKbin].MB[mb].EDB[edB].TwoPT[1].fTerms2ThreeD = new TH3D(nameDen->Data(),"", kQbinsWeights,0,fQupperBoundWeights, kQbinsWeights,0,fQupperBoundWeights, kQbinsWeights,0,fQupperBoundWeights);
1455 fOutputList->Add(KT[tKbin].KY[yKbin].MB[mb].EDB[edB].TwoPT[1].fTerms2ThreeD);
1456 }
1457
1458 }
1459 }
1460 }
1461 }
1462
1463 }
1464
1465
1466 TProfile *fQsmearMean = new TProfile("fQsmearMean","",2,0.5,2.5, -0.2,0.2,"");
1467 fOutputList->Add(fQsmearMean);
1468 TProfile *fQsmearSq = new TProfile("fQsmearSq","",2,0.5,2.5, -2,2,"");
1469 fOutputList->Add(fQsmearSq);
1470 TH2D *fQ2Res = new TH2D("fQ2Res","",20,0,1, 200,-.2,.2);
1471 fOutputList->Add(fQ2Res);
1472 TH2D *fQ3Res = new TH2D("fQ3Res","",20,0,1, 200,-.3,.3);
1473 fOutputList->Add(fQ3Res);
1474 TH2D *fQ4Res = new TH2D("fQ4Res","",20,0,1, 200,-.4,.4);
1475 fOutputList->Add(fQ4Res);
1476
0207c034 1477 TH2D *DistQinv4pion = new TH2D("DistQinv4pion","",6,0.5,6.5, fQbinsQ2,0,fQupperBoundQ2);
be9ef9f9 1478 fOutputList->Add(DistQinv4pion);
0207c034 1479 TH2D *DistQinvMC4pion = new TH2D("DistQinvMC4pion","",6,0.5,6.5, fQbinsQ2,0,fQupperBoundQ2);
be9ef9f9 1480 if(fMCcase) fOutputList->Add(DistQinvMC4pion);
1481
0207c034 1482 TH2D *fAvgQ12VersusQ3 = new TH2D("fAvgQ12VersusQ3","",40,0,0.2, fQbinsQ3,0,fQupperBoundQ3);
be9ef9f9 1483 fOutputList->Add(fAvgQ12VersusQ3);
0207c034 1484 TH2D *fAvgQ13VersusQ3 = new TH2D("fAvgQ13VersusQ3","",40,0,0.2, fQbinsQ3,0,fQupperBoundQ3);
be9ef9f9 1485 fOutputList->Add(fAvgQ13VersusQ3);
0207c034 1486 TH2D *fAvgQ23VersusQ3 = new TH2D("fAvgQ23VersusQ3","",40,0,0.2, fQbinsQ3,0,fQupperBoundQ3);
be9ef9f9 1487 fOutputList->Add(fAvgQ23VersusQ3);
1488
5591748e 1489 TH1D *fDistPionParents4 = new TH1D("fDistPionParents4","",4,0.5,4.5);
1490 fOutputList->Add(fDistPionParents4);
1491
6432c081 1492 TH2D *fDistTPCNclsFindable = new TH2D("fDistTPCNclsFindable","", 100,0,0.5, 201,-0.5,200.5);
1493 fDistTPCNclsFindable->GetXaxis()->SetTitle("pT (GeV/c)"); fDistTPCNclsFindable->GetYaxis()->SetTitle("Ncls Findable");
1494 fOutputList->Add(fDistTPCNclsFindable);
1495 TProfile *fProfileTPCNclsFindable = new TProfile("fProfileTPCNclsFindable","",100,0,0.5, 0,200, "");
1496 fProfileTPCNclsFindable->GetXaxis()->SetTitle("pT (GeV/c)"); fProfileTPCNclsFindable->GetYaxis()->SetTitle("<Ncls Findable>");
1497 fOutputList->Add(fProfileTPCNclsFindable);
1498 //
1499 TH2D *fDistTPCNclsCrossed = new TH2D("fDistTPCNclsCrossed","",100,0,0.5, 201,-0.5,200.5);
1500 fDistTPCNclsCrossed->GetXaxis()->SetTitle("pT (GeV/c)"); fDistTPCNclsCrossed->GetYaxis()->SetTitle("Ncls Crossed");
1501 fOutputList->Add(fDistTPCNclsCrossed);
1502 TProfile *fProfileTPCNclsCrossed = new TProfile("fProfileTPCNclsCrossed","",100,0,0.5, 0,200, "");
1503 fProfileTPCNclsCrossed->GetXaxis()->SetTitle("pT (GeV/c)"); fProfileTPCNclsCrossed->GetYaxis()->SetTitle("<Ncls Crossed>");
1504 fOutputList->Add(fProfileTPCNclsCrossed);
1505 //
1506 TH2D *fDistTPCNclsFindableRatio = new TH2D("fDistTPCNclsFindableRatio","",100,0,0.5, 100,0,1);
1507 fDistTPCNclsFindableRatio->GetXaxis()->SetTitle("pT (GeV/c)"); fDistTPCNclsFindableRatio->GetYaxis()->SetTitle("Ncls / Ncls Findable");
1508 fOutputList->Add(fDistTPCNclsFindableRatio);
1509 TProfile *fProfileTPCNclsFindableRatio = new TProfile("fProfileTPCNclsFindableRatio","",100,0,0.5, 0,1, "");
1510 fProfileTPCNclsFindableRatio->GetXaxis()->SetTitle("pT (GeV/c)"); fProfileTPCNclsFindableRatio->GetYaxis()->SetTitle("<Ncls / Ncls Findable>");
1511 fOutputList->Add(fProfileTPCNclsFindableRatio);
1512 //
1513 TH2D *fDistTPCNclsCrossedRatio = new TH2D("fDistTPCNclsCrossedRatio","",100,0,0.5, 100,0,1);
1514 fDistTPCNclsCrossedRatio->GetXaxis()->SetTitle("pT (GeV/c)"); fDistTPCNclsCrossedRatio->GetYaxis()->SetTitle("Ncls / Ncls Crossed");
1515 fOutputList->Add(fDistTPCNclsCrossedRatio);
1516 TProfile *fProfileTPCNclsCrossedRatio = new TProfile("fProfileTPCNclsCrossedRatio","",100,0,0.5, 0,1, "");
1517 fProfileTPCNclsCrossedRatio->GetXaxis()->SetTitle("pT (GeV/c)"); fProfileTPCNclsCrossedRatio->GetYaxis()->SetTitle("<Ncls / Ncls Crossed>");
1518 fOutputList->Add(fProfileTPCNclsCrossedRatio);
1519
42802bba 1520 TH2D *fc4QSFitNum = new TH2D("fc4QSFitNum","",7,0.5,7.5, fQbinsQ4,0,fQupperBoundQ4);
1521 fOutputList->Add(fc4QSFitNum);
1522 TH2D *fc4QSFitDen = new TH2D("fc4QSFitDen","",7,0.5,7.5, fQbinsQ4,0,fQupperBoundQ4);
1523 fOutputList->Add(fc4QSFitDen);
1524
be9ef9f9 1525 ////////////////////////////////////
1526 ///////////////////////////////////
1527
1528 PostData(1, fOutputList);
1529}
1530
1531//________________________________________________________________________
1532void AliFourPion::UserExec(Option_t *)
1533{
1534 // Main loop
1535 // Called for each event
1536 //cout<<"=========== Event # "<<fEventCounter+1<<" ==========="<<endl;
1537 fEventCounter++;
0207c034 1538 if(fEventCounter%1000==0) cout<<"=========== Event # "<<fEventCounter<<" ==========="<<endl;
1539
be9ef9f9 1540 if(!fAODcase) {cout<<"ESDs not supported"<<endl; return;}
1541
1542 fAOD = dynamic_cast<AliAODEvent*> (InputEvent());
1543 if (!fAOD) {Printf("ERROR: fAOD not available"); return;}
1544
1545
1546 // Trigger Cut
1547 if(fAOD->GetRunNumber() >= 136851 && fAOD->GetRunNumber() <= 139517){// 10h data
1548 Bool_t isSelected1 = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kMB);
1549 if(!isSelected1 && !fMCcase) {return;}
1550 }else if(fAOD->GetRunNumber() >= 167693 && fAOD->GetRunNumber() <= 170593){// 11h data
1551 Bool_t isSelected1 = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kCentral);
1552 Bool_t isSelected2 = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kSemiCentral);
1553 if(!isSelected1 && !isSelected2 && !fMCcase) {return;}
0207c034 1554 }else {
1555 Bool_t isSelected[4]={kFALSE};
1556 isSelected[0] = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kMB);
1557 isSelected[1] = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kAny);
1558 isSelected[2] = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kINT7);
1559 isSelected[3] = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kHighMult);
1560 if(!isSelected[fTriggerType] && !fMCcase) return;
1561 }
1562
be9ef9f9 1563 ///////////////////////////////////////////////////////////
1564 const AliAODVertex *primaryVertexAOD;
1565 AliCentrality *centrality;// for AODs and ESDs
1566
1567
1568 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
1569 AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
1570 fPIDResponse = inputHandler->GetPIDResponse();
1571
1572
1573 TClonesArray *mcArray = 0x0;
1574 if(fMCcase){
1575 if(fAODcase){
1576 mcArray = (TClonesArray*)fAOD->FindListObject(AliAODMCParticle::StdBranchName());
1577 if(!mcArray || mcArray->GetEntriesFast() >= kMCarrayLimit){
1578 cout<<"No MC particle branch found or Array too large!!"<<endl;
1579 return;
1580 }
1581 }
1582 }
1583
1584
1585 UInt_t status=0;
1586 Int_t positiveTracks=0, negativeTracks=0;
1587 Int_t myTracks=0, pionCount=0, kaonCount=0, protonCount=0;
1588
1589 Double_t vertex[3]={0};
1590 Int_t zbin=0;
1591 Double_t zstep=2*10/Double_t(fZvertexBins), zstart=-10.;
1592 /////////////////////////////////////////////////
4bf06935 1593 // ratio of Real data to HIJING reconstructed pT (10 MeV bins)
0207c034 1594 //Double_t HIJINGptWeights[100]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.5, 0.590355, 0.672751, 0.795686, 0.848618, 0.861539, 0.874636, 0.880394, 0.87923, 0.885105, 0.888841, 0.892765, 0.896278, 0.899725, 0.903054, 0.907074, 0.91066, 0.913765, 0.918804, 0.923374, 0.929005, 0.935538, 0.942802, 0.949584, 0.956928, 0.963521, 0.972898, 0.981403, 0.989027, 0.997965, 1.00558, 1.01372, 1.02148, 1.03064, 1.04131, 1.05199, 1.06319, 1.07698, 1.09113, 1.10416, 1.11662, 1.12823, 1.14161, 1.15455, 1.1683, 1.18439, 1.19696, 1.21124, 1.22607, 1.24087, 1.25386, 1.26666, 1.27374, 1.2821, 1.29218, 1.30137, 1.30795, 1.31512, 1.32047, 1.32571, 1.33242, 1.3376, 1.34084, 1.34644, 1.34978, 1.35259, 1.35149, 1.35534, 1.3541, 1.35808, 1.36003, 1.35981, 1.36037, 1.35774, 1.35814, 1.35796, 1.35764, 1.35517, 1.34804, 1.34797, 1.33822, 1.32501, 1.30844, 1.2971, 1.27107};
1595 Float_t HIJINGq2WeightsSC[200]={0.72, 0.723886, 0.770856, 0.799396, 0.815821, 0.827209, 0.833142, 0.837393, 0.839721, 0.842022, 0.84374, 0.845376, 0.84732, 0.848803, 0.850515, 0.852089, 0.853712, 0.855571, 0.857279, 0.85894, 0.860671, 0.862479, 0.863945, 0.865519, 0.867301, 0.868955, 0.870215, 0.871652, 0.873089, 0.874289, 0.875633, 0.876694, 0.877712, 0.878681, 0.879694, 0.88073, 0.881459, 0.882039, 0.882761, 0.88334, 0.884004, 0.884455, 0.884816, 0.885327, 0.88556, 0.885997, 0.886291, 0.886526, 0.886975, 0.887374, 0.887712, 0.888016, 0.888627, 0.888971, 0.889295, 0.889845, 0.890088, 0.890599, 0.890893, 0.891363, 0.891598, 0.892019, 0.892141, 0.892256, 0.892372, 0.892276, 0.892012, 0.891801, 0.891554, 0.891267, 0.891074, 0.890822, 0.890737, 0.890768, 0.89081, 0.890987, 0.89124, 0.891499, 0.891887, 0.892403, 0.892978, 0.893485, 0.894214, 0.894858, 0.895669, 0.896584, 0.897447, 0.89844, 0.899375, 0.900527, 0.901568, 0.902717, 0.903952, 0.905128, 0.90645, 0.907729, 0.909055, 0.910516, 0.911916, 0.913396, 0.914911, 0.91645, 0.918067, 0.919725, 0.921435, 0.923185, 0.925044, 0.926784, 0.928747, 0.930641, 0.932574, 0.934767, 0.93666, 0.938805, 0.94098, 0.943166, 0.945492, 0.947778, 0.950146, 0.952474, 0.954981, 0.957334, 0.959891, 0.96247, 0.965063, 0.967719, 0.97025, 0.973033, 0.975868, 0.978622, 0.981536, 0.984275, 0.987362, 0.990211, 0.993284, 0.996277, 0.999363, 1.00251, 1.00555, 1.00883, 1.01209, 1.01519, 1.01853, 1.02184, 1.0252, 1.02866, 1.03206, 1.03545, 1.03881, 1.04227, 1.04569, 1.04914, 1.05259, 1.056, 1.05953, 1.063, 1.06652, 1.07005, 1.07353, 1.07719, 1.0808, 1.08426, 1.08763, 1.09136, 1.09486, 1.0985, 1.10199, 1.10562, 1.10933, 1.11293, 1.11628, 1.11992, 1.1236, 1.12736, 1.13088, 1.13448, 1.13815, 1.14168, 1.14537, 1.1489, 1.15255, 1.15629, 1.15981, 1.16349, 1.16699, 1.17076, 1.17445, 1.17833, 1.18188, 1.18551, 1.18928, 1.19318, 1.19691, 1.20059, 1.20455, 1.20817, 1.21199, 1.21609, 1.21977, 1.22367};
1596 Float_t HIJINGq2WeightsMC[200]={0.83, 0.833821, 0.834928, 0.836263, 0.837359, 0.83809, 0.838463, 0.840012, 0.840868, 0.842129, 0.843379, 0.844784, 0.846186, 0.847562, 0.849184, 0.850567, 0.85239, 0.854038, 0.855708, 0.857257, 0.859145, 0.860831, 0.862469, 0.864066, 0.865664, 0.867224, 0.868654, 0.870187, 0.871525, 0.872742, 0.874066, 0.875166, 0.876261, 0.877325, 0.878249, 0.879089, 0.879897, 0.880624, 0.881234, 0.881898, 0.88248, 0.882964, 0.883452, 0.883857, 0.884323, 0.884818, 0.885157, 0.885589, 0.88595, 0.886352, 0.886864, 0.887326, 0.887809, 0.888366, 0.888873, 0.889273, 0.889781, 0.890211, 0.890571, 0.891011, 0.891294, 0.891612, 0.891867, 0.892072, 0.89211, 0.891951, 0.891729, 0.891513, 0.891194, 0.890843, 0.89054, 0.890331, 0.890168, 0.890082, 0.890156, 0.890266, 0.890395, 0.890707, 0.891075, 0.891482, 0.891972, 0.89255, 0.893115, 0.893882, 0.89471, 0.895582, 0.896505, 0.897537, 0.898425, 0.89959, 0.900708, 0.901903, 0.903061, 0.904374, 0.905684, 0.907069, 0.908443, 0.909809, 0.911322, 0.912849, 0.914481, 0.916016, 0.917755, 0.919439, 0.921197, 0.922945, 0.924892, 0.926703, 0.928648, 0.930665, 0.932648, 0.934779, 0.936863, 0.939002, 0.941158, 0.943437, 0.945753, 0.948068, 0.950428, 0.952854, 0.955338, 0.957853, 0.960329, 0.962977, 0.965578, 0.968212, 0.970931, 0.97373, 0.97653, 0.979386, 0.982208, 0.985161, 0.988179, 0.991104, 0.994135, 0.997152, 1.00033, 1.00348, 1.00664, 1.00977, 1.01307, 1.01632, 1.01975, 1.02304, 1.02628, 1.02974, 1.03302, 1.03653, 1.03986, 1.04345, 1.04684, 1.05039, 1.05374, 1.05738, 1.06089, 1.06444, 1.06794, 1.07139, 1.07506, 1.07841, 1.08201, 1.08563, 1.08919, 1.09277, 1.09637, 1.10003, 1.10361, 1.10713, 1.11064, 1.11432, 1.11795, 1.12165, 1.12533, 1.1289, 1.13251, 1.13617, 1.13979, 1.1435, 1.14709, 1.15079, 1.15436, 1.15803, 1.16164, 1.16529, 1.1688, 1.17255, 1.17619, 1.17996, 1.18369, 1.18727, 1.19104, 1.19478, 1.1986, 1.20233, 1.20613, 1.20977, 1.21385, 1.21761, 1.22134, 1.22535};
1597 //
1598 Float_t HIJINGq3WeightsSC[35]={0.946, 0.946, 0.946171, 0.92177, 0.958284, 0.986155, 0.99244, 0.999372, 1.00152, 1.00427, 1.00328, 1.00546, 1.00546, 1.00628, 1.00586, 1.00446, 1.00496, 1.00427, 1.00413, 1.00354, 1.00322, 1.00266, 1.00158, 1.00123, 1.00048, 0.999826, 0.99901, 0.997586, 0.996728, 0.994507, 0.993044, 0.990995, 0.989289, 0.988248, 0.988455};
1599 Float_t HIJINGq3WeightsMC[35]={0.634, 0.63488, 0.963204, 0.977364, 0.992797, 1.00015, 1.00179, 1.00467, 1.00602, 1.00635, 1.00665, 1.00677, 1.00643, 1.00601, 1.00562, 1.00542, 1.00494, 1.0048, 1.00406, 1.0036, 1.00297, 1.0025, 1.00178, 1.00126, 1.00035, 0.999798, 0.998795, 0.997544, 0.996334, 0.994345, 0.992467, 0.991007, 0.988918, 0.9877, 0.98789};
1600 //
1601 Float_t HIJINGq4WeightsSC[50]={0.88, 0.88, 0.88, 0.88, 0.88, 0.88, 0.889957, 0.911624, 0.932747, 0.959097, 0.987571, 0.974175, 0.974291, 0.985743, 0.989953, 0.988542, 0.992858, 0.995232, 0.995808, 0.997182, 0.997073, 0.99795, 0.998597, 0.999141, 0.999598, 1.00026, 1.0002, 1.00061, 1.0003, 1.00054, 1.0006, 1.00082, 1.00094, 1.00092, 1.00058, 1.00036, 0.999695, 0.999366, 0.998782, 0.998301, 0.997107, 0.995746, 0.994276, 0.992814, 0.992403, 0.992536, 0.994614, 0.982908, 0.992077, .99};
1602 Float_t HIJINGq4WeightsMC1[50]={0.82, 0.82, 0.82, 0.82, 0.82, 0.823248, 0.917691, 0.960501, 0.96697, 0.972048, 0.984931, 0.98916, 0.986344, 0.992934, 0.996263, 0.996503, 0.996566, 0.997508, 0.998417, 0.999181, 0.999746, 0.999707, 1.00034, 1.00065, 1.00081, 1.00104, 1.0009, 1.00097, 1.00088, 1.00111, 1.00101, 1.00095, 1.00078, 1.00069, 1.00037, 1.00002, 0.999555, 0.998796, 0.998073, 0.997315, 0.9964, 0.994994, 0.993685, 0.990758, 0.990211, 0.987958, 0.980713, 0.985536, 0.923206, 0.92};
1603 Float_t HIJINGq4WeightsMC2[50]={0.88, 0.88, 0.88, 0.88, 0.885817, 0.9888, 1.00199, 0.974765, 0.987792, 0.989186, 0.984239, 0.991871, 0.992879, 0.995809, 0.997829, 0.998076, 0.998521, 0.998509, 0.999429, 0.999958, 1.00029, 1.00064, 1.00052, 1.00095, 1.00107, 1.00121, 1.0011, 1.00123, 1.00106, 1.00111, 1.00108, 1.00097, 1.00078, 1.00066, 1.00038, 0.999903, 0.99931, 0.998711, 0.997939, 0.997057, 0.99611, 0.994732, 0.993368, 0.991332, 0.989286, 0.987895, 0.983888, 0.986218, 0.945475, .94};
1604
be9ef9f9 1605
be9ef9f9 1606 Float_t centralityPercentile=0;
4bf06935 1607 Float_t cStep=5.0, cStepMixing=5.0, cStart=0;
12f1dc46 1608 Int_t MbinMixing=0;
be9ef9f9 1609
1610 if(fAODcase){// AOD case
1611
1612 if(fPbPbcase){
1613 centrality = fAOD->GetCentrality();
1614 centralityPercentile = centrality->GetCentralityPercentile("V0M");
1615 if(centralityPercentile == 0) {cout<<"Centrality = 0, skipping event"<<endl; return;}
1616 if((centralityPercentile < 5*fCentBinLowLimit) || (centralityPercentile>= 5*(fCentBinHighLimit+1))) {/*cout<<"Centrality out of Range. Skipping Event"<<endl;*/ return;}
1617 cout<<"Centrality % = "<<centralityPercentile<<endl;
1618 }
1619
b71263d0 1620
be9ef9f9 1621 ((TH1F*)fOutputList->FindObject("fMultDist0"))->Fill(fAOD->GetNumberOfTracks());
1622
1623 // Pile-up rejection
1624 AliAnalysisUtils *AnaUtil=new AliAnalysisUtils();
1625 if(!fPbPbcase) AnaUtil->SetUseMVPlpSelection(kTRUE);// use Multi-Vertex tool for pp and pPb
1626 else AnaUtil->SetUseMVPlpSelection(kFALSE);
1627 Bool_t pileUpCase=AnaUtil->IsPileUpEvent(fAOD);
1628 if(pileUpCase) return;
1629
1630 ////////////////////////////////
1631 // Vertexing
1632 ((TH1F*)fOutputList->FindObject("fMultDist1"))->Fill(fAOD->GetNumberOfTracks());
1633 primaryVertexAOD = fAOD->GetPrimaryVertex();
1634 vertex[0]=primaryVertexAOD->GetX(); vertex[1]=primaryVertexAOD->GetY(); vertex[2]=primaryVertexAOD->GetZ();
1635
0207c034 1636 if(fabs(vertex[2]) > 10) {/*cout<<"Zvertex Out of Range. Skip Event"<<endl;*/ return;} // Z-Vertex Cut
be9ef9f9 1637 ((TH3F*)fOutputList->FindObject("fVertexDist"))->Fill(vertex[0], vertex[1], vertex[2]);
1638
1639 if(!fMCcase && primaryVertexAOD->GetNContributors() < 1) {cout<<"Bad Vertex. Skip Event"<<endl; return;}
1640
1641 ((TH1F*)fOutputList->FindObject("fMultDist2"))->Fill(fAOD->GetNumberOfTracks());
1642
1643 fBfield = fAOD->GetMagneticField();
1644
1645 for(Int_t i=0; i<fZvertexBins; i++){
1646 if( (vertex[2] >= zstart+i*zstep) && (vertex[2] < zstart+(i+1)*zstep) ){
1647 zbin=i;
1648 break;
1649 }
1650 }
1651
1652
1653
1654 /////////////////////////////
1655 // Create Shuffled index list
1656 Int_t randomIndex[fAOD->GetNumberOfTracks()];
1657 for (Int_t i = 0; i < fAOD->GetNumberOfTracks(); i++) randomIndex[i]=i;
1658 Shuffle(randomIndex,0,fAOD->GetNumberOfTracks()-1);
1659 /////////////////////////////
4bf06935 1660
be9ef9f9 1661
1662 // Track loop
1663 for (Int_t i = 0; i < fAOD->GetNumberOfTracks(); i++) {
1664 AliAODTrack* aodtrack = fAOD->GetTrack(randomIndex[i]);
1665 if (!aodtrack) continue;
1666 if(myTracks >= fMultLimit) {cout<<"More tracks than Track Limit"<<endl; return;}
1667
1668 status=aodtrack->GetStatus();
1669
1670 if(!aodtrack->TestFilterBit(BIT(fFilterBit))) continue;// AOD filterBit cut
1671 ((TH2D*)fOutputList->FindObject("fTrackChi2NDF"))->Fill(centralityPercentile, aodtrack->Chi2perNDF());
1672 ((TH2D*)fOutputList->FindObject("fTrackTPCncls"))->Fill(centralityPercentile, aodtrack->GetTPCncls());
1673 if(aodtrack->GetTPCNcls() < fMinTPCncls) continue;// TPC nCluster cut
1674 if(aodtrack->Chi2perNDF() > fMaxChi2NDF) continue;
1675
1676 if(fFilterBit != 7){
1677 Bool_t goodTrackOtherFB = kFALSE;
1678 for (Int_t j = 0; j < fAOD->GetNumberOfTracks(); j++) {
1679 AliAODTrack* aodtrack2 = fAOD->GetTrack(randomIndex[j]);
1680 if(!aodtrack2) continue;
1681 if(!aodtrack2->TestFilterBit(BIT(fFilterBit))) continue;
1682
1683 if(-(aodtrack->GetID()+1)==aodtrack2->GetID()) {goodTrackOtherFB=kTRUE; break;}
1684
1685 }
1686 if(!goodTrackOtherFB) continue;
1687 }
1688
1689
86528e76 1690 if(aodtrack->Pt() < 0.16) continue;
be9ef9f9 1691 if(fabs(aodtrack->Eta()) > 0.8) continue;
1692
1693
1694 Bool_t goodMomentum = aodtrack->GetPxPyPz( fTempStruct[myTracks].fP);
1695 if(!goodMomentum) continue;
1696 aodtrack->GetXYZ( fTempStruct[myTracks].fX);
1697
0207c034 1698
be9ef9f9 1699 Double_t dca2[2]={0};
1700 dca2[0] = sqrt( pow(fTempStruct[myTracks].fX[0] - vertex[0],2) + pow(fTempStruct[myTracks].fX[1] - vertex[1],2));
1701 dca2[1] = sqrt( pow(fTempStruct[myTracks].fX[2] - vertex[2],2));
1702 Double_t dca3d = sqrt( pow(dca2[0],2) + pow(dca2[1],2));
1703
1704 fTempStruct[myTracks].fStatus = status;
1705 fTempStruct[myTracks].fFiltermap = aodtrack->GetFilterMap();
1706 fTempStruct[myTracks].fId = aodtrack->GetID();
1707 //
1708 fTempStruct[myTracks].fLabel = aodtrack->GetLabel();
1709 fTempStruct[myTracks].fPhi = atan2(fTempStruct[myTracks].fP[1], fTempStruct[myTracks].fP[0]);
1710 if(fTempStruct[myTracks].fPhi < 0) fTempStruct[myTracks].fPhi += 2*PI;
1711 fTempStruct[myTracks].fPt = sqrt(pow(fTempStruct[myTracks].fP[0],2) + pow(fTempStruct[myTracks].fP[1],2));
1712 fTempStruct[myTracks].fMom = sqrt( pow(fTempStruct[myTracks].fPt,2) + pow(fTempStruct[myTracks].fP[2],2) );
1713 fTempStruct[myTracks].fEta = aodtrack->Eta();
1714 fTempStruct[myTracks].fCharge = aodtrack->Charge();
1715 fTempStruct[myTracks].fDCAXY = dca2[0];
1716 fTempStruct[myTracks].fDCAZ = dca2[1];
1717 fTempStruct[myTracks].fDCA = dca3d;
1718 fTempStruct[myTracks].fClusterMap = aodtrack->GetTPCClusterMap();
1719 fTempStruct[myTracks].fSharedMap = aodtrack->GetTPCSharedMap();
1720
1721
1722
86528e76 1723 if(fTempStruct[myTracks].fMom > 0.9999) continue;// upper P bound
1724
be9ef9f9 1725
1726
1727 // PID section
1728 fTempStruct[myTracks].fElectron = kFALSE;
1729 fTempStruct[myTracks].fPion = kFALSE;
1730 fTempStruct[myTracks].fKaon = kFALSE;
1731 fTempStruct[myTracks].fProton = kFALSE;
1732
1733 Float_t nSigmaTPC[5];
1734 Float_t nSigmaTOF[5];
1735 nSigmaTPC[0]=10; nSigmaTPC[1]=10; nSigmaTPC[2]=10; nSigmaTPC[3]=10; nSigmaTPC[4]=10;
1736 nSigmaTOF[0]=10; nSigmaTOF[1]=10; nSigmaTOF[2]=10; nSigmaTOF[3]=10; nSigmaTOF[4]=10;
1737 fTempStruct[myTracks].fTOFhit = kFALSE;// default
1738 Float_t signalTPC=0, signalTOF=0;
1739 Double_t integratedTimesTOF[10]={0};
1740
1741
1742 Bool_t DoPIDWorkAround=kTRUE;
1743 //if(fFilterBit == 7) DoPIDWorkAround=kTRUE;
1744 if(fMCcase && !fPbPbcase) DoPIDWorkAround=kFALSE;
1745 if(DoPIDWorkAround==kFALSE && fabs(fPIDResponse->NumberOfSigmasTPC(aodtrack,AliPID::kPion)) < 900) {
1746 nSigmaTPC[0]=fPIDResponse->NumberOfSigmasTPC(aodtrack,AliPID::kElectron);
1747 nSigmaTPC[1]=fPIDResponse->NumberOfSigmasTPC(aodtrack,AliPID::kMuon);
1748 nSigmaTPC[2]=fPIDResponse->NumberOfSigmasTPC(aodtrack,AliPID::kPion);
1749 nSigmaTPC[3]=fPIDResponse->NumberOfSigmasTPC(aodtrack,AliPID::kKaon);
1750 nSigmaTPC[4]=fPIDResponse->NumberOfSigmasTPC(aodtrack,AliPID::kProton);
1751 //
1752 nSigmaTOF[0]=fPIDResponse->NumberOfSigmasTOF(aodtrack,AliPID::kElectron);
1753 nSigmaTOF[1]=fPIDResponse->NumberOfSigmasTOF(aodtrack,AliPID::kMuon);
1754 nSigmaTOF[2]=fPIDResponse->NumberOfSigmasTOF(aodtrack,AliPID::kPion);
1755 nSigmaTOF[3]=fPIDResponse->NumberOfSigmasTOF(aodtrack,AliPID::kKaon);
1756 nSigmaTOF[4]=fPIDResponse->NumberOfSigmasTOF(aodtrack,AliPID::kProton);
1757 signalTPC = aodtrack->GetTPCsignal();
1758 if( (status&AliESDtrack::kTOFpid)!=0 && (status&AliESDtrack::kTIME)!=0 && (status&AliESDtrack::kTOFout)!=0 && (status&AliESDtrack::kTOFmismatch)<=0){// good tof hit
1759 fTempStruct[myTracks].fTOFhit = kTRUE;
1760 signalTOF = aodtrack->GetTOFsignal();
1761 aodtrack->GetIntegratedTimes(integratedTimesTOF);
1762 }else fTempStruct[myTracks].fTOFhit = kFALSE;
1763
1764 }else {// FilterBit 7 PID workaround
1765
1766 for(Int_t j = 0; j < fAOD->GetNumberOfTracks(); j++) {
1767 AliAODTrack* aodTrack2 = fAOD->GetTrack(j);
1768 if (!aodTrack2) continue;
1769 if(aodtrack->GetID() != (-aodTrack2->GetID() - 1)) continue;// (-aodTrack2->GetID() - 1)
1770
1771 UInt_t status2=aodTrack2->GetStatus();
1772
1773 nSigmaTPC[0]=fPIDResponse->NumberOfSigmasTPC(aodTrack2,AliPID::kElectron);
1774 nSigmaTPC[1]=fPIDResponse->NumberOfSigmasTPC(aodTrack2,AliPID::kMuon);
1775 nSigmaTPC[2]=fPIDResponse->NumberOfSigmasTPC(aodTrack2,AliPID::kPion);
1776 nSigmaTPC[3]=fPIDResponse->NumberOfSigmasTPC(aodTrack2,AliPID::kKaon);
1777 nSigmaTPC[4]=fPIDResponse->NumberOfSigmasTPC(aodTrack2,AliPID::kProton);
1778 //
1779 nSigmaTOF[0]=fPIDResponse->NumberOfSigmasTOF(aodTrack2,AliPID::kElectron);
1780 nSigmaTOF[1]=fPIDResponse->NumberOfSigmasTOF(aodTrack2,AliPID::kMuon);
1781 nSigmaTOF[2]=fPIDResponse->NumberOfSigmasTOF(aodTrack2,AliPID::kPion);
1782 nSigmaTOF[3]=fPIDResponse->NumberOfSigmasTOF(aodTrack2,AliPID::kKaon);
1783 nSigmaTOF[4]=fPIDResponse->NumberOfSigmasTOF(aodTrack2,AliPID::kProton);
1784 signalTPC = aodTrack2->GetTPCsignal();
1785
1786 if( (status2&AliESDtrack::kTOFpid)!=0 && (status2&AliESDtrack::kTIME)!=0 && (status2&AliESDtrack::kTOFout)!=0 && (status2&AliESDtrack::kTOFmismatch)<=0){// good tof hit
1787 fTempStruct[myTracks].fTOFhit = kTRUE;
1788 signalTOF = aodTrack2->GetTOFsignal();
1789 aodTrack2->GetIntegratedTimes(integratedTimesTOF);
1790 }else fTempStruct[myTracks].fTOFhit = kFALSE;
1791
6432c081 1792 //if(aodTrack2->Pt()<0.2) cout<<aodTrack2->GetTPCNclsF()<<" "<<aodTrack2->GetTPCNCrossedRows()<<" "<<aodTrack2->GetTPCNcls()<<" "<<aodTrack2->GetTPCFoundFraction()<<endl;
1793
1794
be9ef9f9 1795 }// aodTrack2
1796 }// FilterBit 7 PID workaround
1797
1798
1799 ///////////////////
1800 ((TH3F*)fOutputList->FindObject("fTPCResponse"))->Fill(centralityPercentile, fTempStruct[myTracks].fMom, signalTPC);
1801 if(fTempStruct[myTracks].fTOFhit) {
1802 ((TH3F*)fOutputList->FindObject("fTOFResponse"))->Fill(centralityPercentile, fTempStruct[myTracks].fMom, signalTOF - integratedTimesTOF[3]);
1803 }
1804 ///////////////////
1805
1806 // Use TOF if good hit and above threshold
1807 if(fTempStruct[myTracks].fTOFhit && fTempStruct[myTracks].fMom > fTPCTOFboundry){
1808 if(fabs(nSigmaTOF[0])<fSigmaCutTOF) fTempStruct[myTracks].fElectron = kTRUE;// Electron candidate
1809 if(fabs(nSigmaTOF[2])<fSigmaCutTOF) fTempStruct[myTracks].fPion = kTRUE;// Pion candidate
1810 if(fabs(nSigmaTOF[3])<fSigmaCutTOF) fTempStruct[myTracks].fKaon = kTRUE;// Kaon candidate
1811 if(fabs(nSigmaTOF[4])<fSigmaCutTOF) fTempStruct[myTracks].fProton = kTRUE;// Proton candidate
1812 }else {// TPC info instead
1813 if(fabs(nSigmaTPC[0])<fSigmaCutTPC) fTempStruct[myTracks].fElectron = kTRUE;// Electron candidate
1814 if(fabs(nSigmaTPC[2])<fSigmaCutTPC) fTempStruct[myTracks].fPion = kTRUE;// Pion candidate
1815 if(fabs(nSigmaTPC[3])<fSigmaCutTPC) fTempStruct[myTracks].fKaon = kTRUE;// Kaon candidate
1816 if(fabs(nSigmaTPC[4])<fSigmaCutTPC) fTempStruct[myTracks].fProton = kTRUE;// Proton candidate
1817 }
1818
1819
1820 // Ensure there is only 1 candidate per track
1821 if(fTempStruct[myTracks].fElectron && fTempStruct[myTracks].fMom < 0.45) continue;// Remove electron band
1822 if(!fTempStruct[myTracks].fPion && !fTempStruct[myTracks].fKaon && !fTempStruct[myTracks].fProton) continue;
1823 if(!fTempStruct[myTracks].fPion) continue;// only pions
1824 if(fTempStruct[myTracks].fPion && fTempStruct[myTracks].fKaon) continue;
1825 if(fTempStruct[myTracks].fPion && fTempStruct[myTracks].fProton) continue;
1826 if(fTempStruct[myTracks].fKaon && fTempStruct[myTracks].fProton) continue;
0207c034 1827
be9ef9f9 1828
1829
1830
1831 if(fTempStruct[myTracks].fCharge==+1) {
1832 ((TH2F*)fOutputList->FindObject("fDCAxyDistPlus"))->Fill(fTempStruct[myTracks].fPt, dca2[0]);
1833 ((TH2F*)fOutputList->FindObject("fDCAzDistPlus"))->Fill(fTempStruct[myTracks].fPt, dca2[1]);
1834 }else {
1835 ((TH2F*)fOutputList->FindObject("fDCAxyDistMinus"))->Fill(fTempStruct[myTracks].fPt, dca2[0]);
1836 ((TH2F*)fOutputList->FindObject("fDCAzDistMinus"))->Fill(fTempStruct[myTracks].fPt, dca2[1]);
1837 }
1838
0207c034 1839 ((TH3F*)fOutputList->FindObject("fChPhiPtDist"))->Fill(aodtrack->Charge(), aodtrack->Phi(), aodtrack->Pt());
1840 ((TH3F*)fOutputList->FindObject("fChPtEtaDist"))->Fill(aodtrack->Charge(), aodtrack->Pt(), aodtrack->Eta());
1841 ((TH2F*)fOutputList->FindObject("fCentPtDist"))->Fill(int(centralityPercentile/5.), aodtrack->Pt());
1842 ((TH2F*)fOutputList->FindObject("fCentEtaDist"))->Fill(int(centralityPercentile/5.), aodtrack->Eta());
1843
6432c081 1844 ((TH2D*)fOutputList->FindObject("fDistTPCNclsFindable"))->Fill(aodtrack->Pt(), aodtrack->GetTPCNclsF());
1845 ((TProfile*)fOutputList->FindObject("fProfileTPCNclsFindable"))->Fill(aodtrack->Pt(), aodtrack->GetTPCNclsF());
1846 //
1847 ((TH2D*)fOutputList->FindObject("fDistTPCNclsCrossed"))->Fill(aodtrack->Pt(), aodtrack->GetTPCNCrossedRows());
1848 ((TProfile*)fOutputList->FindObject("fProfileTPCNclsCrossed"))->Fill(aodtrack->Pt(), aodtrack->GetTPCNCrossedRows());
1849 //
1850 if(aodtrack->GetTPCNclsF() > 0){
1851 ((TH2D*)fOutputList->FindObject("fDistTPCNclsFindableRatio"))->Fill(aodtrack->Pt(), double(aodtrack->GetTPCNcls())/double(aodtrack->GetTPCNclsF()));
1852 ((TProfile*)fOutputList->FindObject("fProfileTPCNclsFindableRatio"))->Fill(aodtrack->Pt(), double(aodtrack->GetTPCNcls())/double(aodtrack->GetTPCNclsF()));
1853 }
1854 //
1855 ((TH2D*)fOutputList->FindObject("fDistTPCNclsCrossedRatio"))->Fill(aodtrack->Pt(), aodtrack->GetTPCFoundFraction());
1856 ((TProfile*)fOutputList->FindObject("fProfileTPCNclsCrossedRatio"))->Fill(aodtrack->Pt(), aodtrack->GetTPCFoundFraction());
1857
1858
be9ef9f9 1859 if(fTempStruct[myTracks].fPion) {// pions
1860 fTempStruct[myTracks].fEaccepted = sqrt(pow(fTempStruct[myTracks].fMom,2) + pow(fTrueMassPi,2));
1861 fTempStruct[myTracks].fKey = 1;
1862 }else if(fTempStruct[myTracks].fKaon){// kaons
1863 fTempStruct[myTracks].fEaccepted = sqrt(pow(fTempStruct[myTracks].fMom,2) + pow(fTrueMassK,2));;
1864 fTempStruct[myTracks].fKey = 10;
1865 }else{// protons
1866 fTempStruct[myTracks].fEaccepted = sqrt(pow(fTempStruct[myTracks].fMom,2) + pow(fTrueMassP,2));;
1867 fTempStruct[myTracks].fKey = 100;
1868 }
1869
1870
1871
1872 if(aodtrack->Charge() > 0) positiveTracks++;
1873 else negativeTracks++;
1874
1875 if(fTempStruct[myTracks].fPion) pionCount++;
1876 if(fTempStruct[myTracks].fKaon) kaonCount++;
1877 if(fTempStruct[myTracks].fProton) protonCount++;
1878
1879 myTracks++;
1880
1881 if(fMCcase){// muon mothers
1882 AliAODMCParticle *tempMCTrack=(AliAODMCParticle*)mcArray->At(abs(aodtrack->GetLabel()));
1883 if(abs(tempMCTrack->GetPdgCode())==13 && tempMCTrack->GetMother()>0){// muons
1884 AliAODMCParticle *parent=(AliAODMCParticle*)mcArray->At(tempMCTrack->GetMother());
1885 if(parent->IsPhysicalPrimary()){
1886 ((TH1D*)fOutputList->FindObject("fMuonParents"))->Fill(abs(parent->GetPdgCode()));
1887 }else ((TH1D*)fOutputList->FindObject("fSecondaryMuonParents"))->Fill(abs(parent->GetPdgCode()));
1888 }
1889 ((TH1D*)fOutputList->FindObject("fPionCandidates"))->Fill(abs(tempMCTrack->GetPdgCode()));
1890 }
1891 }
1892 //cout<<"kinkcount = "<<kinkcount<<" pionkinks = "<<pionkinks<<" primarypionkinks = "<<primarypionkinks<<endl;
1893 }else {// ESD tracks
1894 cout<<"ESDs not supported currently"<<endl;
1895 return;
1896 }
1897
1898 // Generator info only
1899 if(fMCcase && fGeneratorOnly){
1900 myTracks=0; pionCount=0; kaonCount=0; protonCount=0;// reset track counters
1901 for(Int_t mctrackN=0; mctrackN<mcArray->GetEntriesFast(); mctrackN++){
1902 if(myTracks >= fMultLimit) {cout<<"More tracks than Track Limit"<<endl; return;}
1903 if(myTracks >= 1300) continue;// additional cut to limit high mult events which exceed pair # limits
1904
1905 AliAODMCParticle *mcParticle = (AliAODMCParticle*)mcArray->At(mctrackN);
1906 if(!mcParticle) continue;
1907 if(fabs(mcParticle->Eta())>0.8) continue;
1908 if(mcParticle->Charge()!=-3 && mcParticle->Charge()!=+3) continue;// x3 by convention
86528e76 1909 if(mcParticle->Pt() < 0.16 || mcParticle->Pt() > 1.0) continue;
be9ef9f9 1910 if(!mcParticle->IsPrimary()) continue;
1911 if(!mcParticle->IsPhysicalPrimary()) continue;
1912 if(abs(mcParticle->GetPdgCode())!=211) continue;
1913
1914 fTempStruct[myTracks].fP[0] = mcParticle->Px();
1915 fTempStruct[myTracks].fP[1] = mcParticle->Py();
1916 fTempStruct[myTracks].fP[2] = mcParticle->Pz();
1917 fTempStruct[myTracks].fX[0] = 0.; fTempStruct[myTracks].fX[1] = 0.; fTempStruct[myTracks].fX[2] = 0.;
1918
1919 fTempStruct[myTracks].fId = myTracks;// use my track counter
1920 fTempStruct[myTracks].fLabel = mctrackN;
1921 fTempStruct[myTracks].fPhi = atan2(fTempStruct[myTracks].fP[1], fTempStruct[myTracks].fP[0]);
1922 if(fTempStruct[myTracks].fPhi < 0) fTempStruct[myTracks].fPhi += 2*PI;
1923 fTempStruct[myTracks].fPt = sqrt(pow(fTempStruct[myTracks].fP[0],2) + pow(fTempStruct[myTracks].fP[1],2));
1924 fTempStruct[myTracks].fMom = sqrt( pow(fTempStruct[myTracks].fPt,2) + pow(fTempStruct[myTracks].fP[2],2) );
1925 fTempStruct[myTracks].fEta = mcParticle->Eta();
1926 fTempStruct[myTracks].fCharge = int(mcParticle->Charge()/3.);
1927 fTempStruct[myTracks].fDCAXY = 0.;
1928 fTempStruct[myTracks].fDCAZ = 0.;
1929 fTempStruct[myTracks].fDCA = 0.;
1930 fTempStruct[myTracks].fPion = kTRUE;
1931 fTempStruct[myTracks].fEaccepted = sqrt(pow(fTempStruct[myTracks].fMom,2) + pow(fTrueMassPi,2));
1932 fTempStruct[myTracks].fKey = 1;
1933
1934 myTracks++;
1935 pionCount++;
1936 }
1937 }
1938
1939 if(myTracks >= 1) {
1940 ((TH1F*)fOutputList->FindObject("fMultDist3"))->Fill(myTracks);
1941 }
1942
1943
1944 //cout<<"There are "<<myTracks<<" myTracks"<<endl;
1945 //cout<<"pionCount = "<<pionCount<<" kaonCount = "<<kaonCount<<" protonCount = "<<protonCount<<endl;
6432c081 1946 //return;
be9ef9f9 1947
1948 /////////////////////////////////////////
1949 // Pion Multiplicity Cut (To ensure all Correlation orders are present in each event)
0207c034 1950 if(myTracks < 4) {/*cout<<"Less than 4 tracks. Skipping Event."<<endl;*/ return;}
be9ef9f9 1951 /////////////////////////////////////////
1952
1953
1954 ////////////////////////////////
1955 ///////////////////////////////
1956 // Mbin determination
1957 //
1958 // Mbin set to Pion Count Only for pp!!!!!!!
1959 fMbin=-1;
1960 if(!fPbPbcase){
0207c034 1961
1962 if(pionCount >= fMultLimits[3] && pionCount < fMultLimits[10]) fMbin=0;// only 1 bin
1963
1964 for(Int_t i=0; i<fMbinsMixing; i++){// event-mixing M bin
1965 if( ( pionCount >= fMultLimits[i]) && ( pionCount < fMultLimits[i+1]) ){
1966 MbinMixing=i;// 0 = lowest mult
1967 break;
1968 }
be9ef9f9 1969 }
0207c034 1970
be9ef9f9 1971 }else{
29d2e579 1972 for(Int_t i=0; i<fCentBins; i++){// correlation analysis M bin
be9ef9f9 1973 if( (centralityPercentile >= cStart+i*cStep) && (centralityPercentile < cStart+(i+1)*cStep) ){
1974 fMbin=i;// 0 = most central
1975 break;
1976 }
1977 }
0207c034 1978 for(Int_t i=0; i<fMbinsMixing; i++){// event-mixing M bin
29d2e579 1979 if( (centralityPercentile >= cStart+i*cStepMixing) && (centralityPercentile < cStart+(i+1)*cStepMixing) ){
1980 MbinMixing=i;// 0 = most central
1981 break;
1982 }
1983 }
be9ef9f9 1984 }
0207c034 1985
1986 if(fMbin==-1) {return;}
be9ef9f9 1987
1988 ///////////////////
1989 // can only be called after fMbin has been set
1990 // Radius parameter only matters for Monte-Carlo data
1991 SetFSIindex(fRMax);
1992 ///////////////////
1993
1994 Int_t rBinForTPNMomRes = 10;
1995 if(fMbin==0) {rBinForTPNMomRes=10;}// 10 fm with EW (fRMax should be 11 for normal running)
1996 else if(fMbin==1) {rBinForTPNMomRes=9;}
1997 else if(fMbin<=3) {rBinForTPNMomRes=8;}
1998 else if(fMbin<=5) {rBinForTPNMomRes=7;}
1999 else {rBinForTPNMomRes=6;}
2000
2001 //////////////////////////////////////////////////
2002 fEDbin=0;// Extra Dimension bin (Kt, (Kt-Psi),....)
2003 //////////////////////////////////////////////////
2004
2005
2006
2007 ((TH1F*)fOutputList->FindObject("fEvents1"))->Fill(fMbin+1);
2008 ((TProfile*)fOutputList->FindObject("fAvgMult"))->Fill(fMbin+1., pionCount);
2009
2010 ////////////////////////////////////
2011 // Add event to buffer if > 0 tracks
2012 if(myTracks > 0){
29d2e579 2013 fEC[zbin][MbinMixing]->FIFOShift();
2014 (fEvt) = fEC[zbin][MbinMixing]->fEvtStr;
be9ef9f9 2015 (fEvt)->fNtracks = myTracks;
2016 (fEvt)->fFillStatus = 1;
2017 for(Int_t i=0; i<myTracks; i++) (fEvt)->fTracks[i] = fTempStruct[i];
2018 if(fMCcase){
2019 (fEvt)->fMCarraySize = mcArray->GetEntriesFast();
2020 for(Int_t i=0; i<mcArray->GetEntriesFast(); i++) {
2021 AliAODMCParticle *tempMCTrack = (AliAODMCParticle*)mcArray->At(i);
2022 (fEvt)->fMCtracks[i].fPx = tempMCTrack->Px();
2023 (fEvt)->fMCtracks[i].fPy = tempMCTrack->Py();
2024 (fEvt)->fMCtracks[i].fPz = tempMCTrack->Pz();
2025 (fEvt)->fMCtracks[i].fPtot = sqrt(pow(tempMCTrack->Px(),2)+pow(tempMCTrack->Py(),2)+pow(tempMCTrack->Pz(),2));
2026 (fEvt)->fMCtracks[i].fPdgCode = tempMCTrack->GetPdgCode();
2027 (fEvt)->fMCtracks[i].fMotherLabel = tempMCTrack->GetMother();
2028 }
2029 }
2030 }
4bf06935 2031
be9ef9f9 2032
2033
2034 Float_t qinv12=0, qinv13=0, qinv14=0, qinv23=0, qinv24=0, qinv34=0;
2035 Float_t qout=0, qside=0, qlong=0;
2036 Float_t kT12=0;
2037 Float_t q3=0, q3MC=0;
2038 Float_t q4=0, q4MC=0;
2039 Int_t ch1=0, ch2=0, ch3=0, ch4=0;
2040 Int_t bin1=0, bin2=0, bin3=0, bin4=0;
2041 Float_t pVect1[4]={0};
2042 Float_t pVect2[4]={0};
2043 Float_t pVect3[4]={0};
2044 Float_t pVect4[4]={0};
2045 Float_t pVect1MC[4]={0};
2046 Float_t pVect2MC[4]={0};
2047 Float_t pVect3MC[4]={0};
2048 Float_t pVect4MC[4]={0};
2049 Float_t Pparent1[4]={0};
2050 Float_t Pparent2[4]={0};
2051 Float_t Pparent3[4]={0};
2052 Float_t Pparent4[4]={0};
2053 Float_t weight12=0, weight13=0, weight14=0, weight23=0, weight24=0, weight34=0;
2054 Float_t weight12Err=0, weight13Err=0, weight14Err=0, weight23Err=0, weight24Err=0, weight34Err=0;
5591748e 2055 Float_t weight12CC[3]={0};
2056 Float_t weight13CC[3]={0};
2057 Float_t weight14CC[3]={0};
2058 Float_t weight23CC[3]={0};
2059 Float_t weight24CC[3]={0};
2060 Float_t weight34CC[3]={0};
ab890ec3 2061 //Float_t weight12CC_e=0, weight13CC_e=0, weight14CC_e=0, weight23CC_e=0, weight24CC_e=0, weight34CC_e=0;
2062 Float_t weightTotal=0;//, weightTotalErr=0;
be9ef9f9 2063 Float_t qinv12MC=0, qinv13MC=0, qinv14MC=0, qinv23MC=0, qinv24MC=0, qinv34MC=0;
2064 Float_t parentQinv12=0, parentQinv13=0, parentQinv14=0, parentQinv23=0, parentQinv24=0, parentQinv34=0;
2065 Float_t parentQ3=0;
2066 Float_t FSICorr12=0, FSICorr13=0, FSICorr14=0, FSICorr23=0, FSICorr24=0, FSICorr34=0;
2067 Bool_t pionParent1=kFALSE, pionParent2=kFALSE, pionParent3=kFALSE, pionParent4=kFALSE;
2068 Bool_t FilledMCpair12=kFALSE, FilledMCtriplet123=kFALSE;
6432c081 2069 Bool_t Positive1stTripletWeights=kTRUE, Positive2ndTripletWeights=kTRUE;
ab890ec3 2070 Float_t T12=0, T13=0, T14=0, T23=0, T24=0, T34=0;
80507acf 2071 Int_t momBin12=1, momBin13=1, momBin14=1, momBin23=1, momBin24=1, momBin34=1;
2072 Float_t MomResCorr12=1.0, MomResCorr13=1.0, MomResCorr14=1.0, MomResCorr23=1.0, MomResCorr24=1.0, MomResCorr34=1.0;
be9ef9f9 2073 //
2074 AliAODMCParticle *mcParticle1=0x0;
2075 AliAODMCParticle *mcParticle2=0x0;
2076
2077
2078 ////////////////////
b71263d0 2079 //Int_t PairCount[7]={0};
2080 //Int_t NormPairCount[7]={0};
be9ef9f9 2081 Int_t KT3index=0, KT4index=0;
2082
b71263d0 2083 // reset to defaults
0207c034 2084 for(Int_t i=0; i<fMultLimit; i++) {
b71263d0 2085 fLowQPairSwitch_E0E0[i]->Set(kMultLimitPbPb,fDefaultsCharSwitch);
2086 fLowQPairSwitch_E0E1[i]->Set(kMultLimitPbPb,fDefaultsCharSwitch);
2087 fLowQPairSwitch_E0E2[i]->Set(kMultLimitPbPb,fDefaultsCharSwitch);
2088 fLowQPairSwitch_E0E3[i]->Set(kMultLimitPbPb,fDefaultsCharSwitch);
6bb6954b 2089 fLowQPairSwitch_E1E1[i]->Set(kMultLimitPbPb,fDefaultsCharSwitch);
b71263d0 2090 fLowQPairSwitch_E1E2[i]->Set(kMultLimitPbPb,fDefaultsCharSwitch);
2091 fLowQPairSwitch_E1E3[i]->Set(kMultLimitPbPb,fDefaultsCharSwitch);
2092 fLowQPairSwitch_E2E3[i]->Set(kMultLimitPbPb,fDefaultsCharSwitch);
2093 //
2094 fNormQPairSwitch_E0E0[i]->Set(kMultLimitPbPb,fDefaultsCharSwitch);
2095 fNormQPairSwitch_E0E1[i]->Set(kMultLimitPbPb,fDefaultsCharSwitch);
2096 fNormQPairSwitch_E0E2[i]->Set(kMultLimitPbPb,fDefaultsCharSwitch);
2097 fNormQPairSwitch_E0E3[i]->Set(kMultLimitPbPb,fDefaultsCharSwitch);
6bb6954b 2098 fNormQPairSwitch_E1E1[i]->Set(kMultLimitPbPb,fDefaultsCharSwitch);
b71263d0 2099 fNormQPairSwitch_E1E2[i]->Set(kMultLimitPbPb,fDefaultsCharSwitch);
2100 fNormQPairSwitch_E1E3[i]->Set(kMultLimitPbPb,fDefaultsCharSwitch);
2101 fNormQPairSwitch_E2E3[i]->Set(kMultLimitPbPb,fDefaultsCharSwitch);
2102 }
5591748e 2103
b71263d0 2104
2105 //////////////////////////////////////////
2106 // make low-q pair storage and normalization-pair storage
2107 //
2108 for(Int_t en1=0; en1<=2; en1++){// 1st event number (en1=0 is the same event as current event)
2109 for(Int_t en2=en1; en2<=3; en2++){// 2nd event number (en2=0 is the same event as current event)
6bb6954b 2110 if(en1>1 && en1==en2) continue;
2111
b71263d0 2112 for (Int_t i=0; i<(fEvt+en1)->fNtracks; i++) {// 1st particle
2113 for (Int_t j=i+1; j<(fEvt+en2)->fNtracks; j++) {// 2nd particle
2114
5591748e 2115
b71263d0 2116 pVect1[0]=(fEvt+en1)->fTracks[i].fEaccepted; pVect2[0]=(fEvt+en2)->fTracks[j].fEaccepted;
2117 pVect1[1]=(fEvt+en1)->fTracks[i].fP[0]; pVect2[1]=(fEvt+en2)->fTracks[j].fP[0];
2118 pVect1[2]=(fEvt+en1)->fTracks[i].fP[1]; pVect2[2]=(fEvt+en2)->fTracks[j].fP[1];
2119 pVect1[3]=(fEvt+en1)->fTracks[i].fP[2]; pVect2[3]=(fEvt+en2)->fTracks[j].fP[2];
2120 ch1 = Int_t(((fEvt+en1)->fTracks[i].fCharge + 1)/2.);
2121 ch2 = Int_t(((fEvt+en2)->fTracks[j].fCharge + 1)/2.);
2122
2123 qinv12 = GetQinv(pVect1, pVect2);
2124 kT12 = sqrt(pow(pVect1[1]+pVect2[1],2) + pow(pVect1[2]+pVect2[2],2))/2.;
2125 SetFillBins2(ch1, ch2, bin1, bin2);
2126
80507acf 2127 if(qinv12 < fQLowerCut) continue;// remove unwanted low-q pairs (also a type of track splitting/merging cut)
2128 if(ch1 == ch2 && !fGeneratorOnly){
fac2d84b 2129 Int_t tempChGroup[2]={0,0};
80507acf 2130 if(en1==0 && en2==1) ((TH1F*)fOutputList->FindObject("fTotalPairsWeighting"))->Fill(qinv12, MCWeight(tempChGroup, 10, ffcSqMRC, qinv12, 0.));
b71263d0 2131 if(!AcceptPair((fEvt+en1)->fTracks[i], (fEvt+en2)->fTracks[j])) {
2132 if(en1==0 && en2==0) ((TH1F*)fOutputList->FindObject("fRejectedPairs"))->Fill(qinv12);
2133 continue;
be9ef9f9 2134 }
80507acf 2135 if(en1==0 && en2==1) ((TH1F*)fOutputList->FindObject("fAcceptedPairsWeighting"))->Fill(qinv12, MCWeight(tempChGroup, 10, ffcSqMRC, qinv12, 0.));
fac2d84b 2136 }
42802bba 2137 if(fMixedChargeCut && ch1 != ch2 && !fGeneratorOnly && !fMCcase){// remove +- low-q pairs to keep balance between ++ and +- contributions to multi-particle Q3,Q4 projections
fac2d84b 2138 Int_t tempChGroup[2]={0,1};
80507acf 2139 if(en1==0 && en2==1) ((TH1F*)fOutputList->FindObject("fTotalPairsWeightingMC"))->Fill(qinv12, MCWeight(tempChGroup, 10, ffcSqMRC, qinv12, 0.));
fac2d84b 2140 if(!AcceptPairPM((fEvt+en1)->fTracks[i], (fEvt+en2)->fTracks[j])) {
2141 if(en1==0 && en2==0) ((TH1F*)fOutputList->FindObject("fRejectedPairsMC"))->Fill(qinv12);
2142 continue;
2143 }
80507acf 2144 if(en1==0 && en2==1) ((TH1F*)fOutputList->FindObject("fAcceptedPairsWeightingMC"))->Fill(qinv12, MCWeight(tempChGroup, 10, ffcSqMRC, qinv12, 0.));
42802bba 2145 }
b71263d0 2146
2147 GetQosl(pVect1, pVect2, qout, qside, qlong);
2148 if( (en1+en2==0)) {
86528e76 2149 if(!fGenerateSignal) Charge1[bin1].Charge2[bin2].MB[fMbin].EDB[0].TwoPT[0].fTerms2->Fill(kT12, qinv12);
b71263d0 2150 Charge1[bin1].Charge2[bin2].MB[fMbin].EDB[0].TwoPT[0].fTerms2QW->Fill(kT12, qinv12, qinv12);
2151 // osl frame
2152 if((kT12 > 0.2) && (kT12 < 0.3)){
2153 Charge1[bin1].Charge2[bin2].MB[fMbin].EDB[0].TwoPT[en2].OSL_ktbin[0].fTerms2OSL->Fill(fabs(qout), fabs(qside), fabs(qlong));
2154 Charge1[bin1].Charge2[bin2].MB[fMbin].EDB[0].TwoPT[en2].OSL_ktbin[0].fTerms2OSLQW->Fill(fabs(qout), fabs(qside), fabs(qlong), qinv12);
be9ef9f9 2155 }
b71263d0 2156 if((kT12 > 0.6) && (kT12 < 0.7)){
2157 Charge1[bin1].Charge2[bin2].MB[fMbin].EDB[0].TwoPT[en2].OSL_ktbin[1].fTerms2OSL->Fill(fabs(qout), fabs(qside), fabs(qlong));
2158 Charge1[bin1].Charge2[bin2].MB[fMbin].EDB[0].TwoPT[en2].OSL_ktbin[1].fTerms2OSLQW->Fill(fabs(qout), fabs(qside), fabs(qlong), qinv12);
be9ef9f9 2159 }
b71263d0 2160 // unit mult bins
2161 if( (fEvt+en1)->fNtracks%100==0){
2162 Int_t kTindex=0;
2163 if(kT12>0.3) kTindex=1;
2164 Int_t UnitMultBin = int((fEvt+en1)->fNtracks / 100.) + 1;
2165 Charge1[bin1].Charge2[bin2].MB[fMbin].EDB[kTindex].TwoPT[0].fUnitMultBin->Fill(UnitMultBin, qinv12);
be9ef9f9 2166 }
2167
b71263d0 2168 }
2169 if( (en1+en2==1)) {
86528e76 2170 if(!fGenerateSignal) Charge1[bin1].Charge2[bin2].MB[fMbin].EDB[0].TwoPT[1].fTerms2->Fill(kT12, qinv12);
b71263d0 2171 Charge1[bin1].Charge2[bin2].MB[fMbin].EDB[0].TwoPT[1].fTerms2QW->Fill(kT12, qinv12, qinv12);
2172 // osl frame
2173 if((kT12 > 0.2) && (kT12 < 0.3)){
2174 Charge1[bin1].Charge2[bin2].MB[fMbin].EDB[fEDbin].TwoPT[en2].OSL_ktbin[0].fTerms2OSL->Fill(fabs(qout), fabs(qside), fabs(qlong));
2175 Charge1[bin1].Charge2[bin2].MB[fMbin].EDB[fEDbin].TwoPT[en2].OSL_ktbin[0].fTerms2OSLQW->Fill(fabs(qout), fabs(qside), fabs(qlong), qinv12);
2176 }
2177 if((kT12 > 0.6) && (kT12 < 0.7)){
2178 Charge1[bin1].Charge2[bin2].MB[fMbin].EDB[fEDbin].TwoPT[en2].OSL_ktbin[1].fTerms2OSL->Fill(fabs(qout), fabs(qside), fabs(qlong));
2179 Charge1[bin1].Charge2[bin2].MB[fMbin].EDB[fEDbin].TwoPT[en2].OSL_ktbin[1].fTerms2OSLQW->Fill(fabs(qout), fabs(qside), fabs(qlong), qinv12);
be9ef9f9 2180 }
b71263d0 2181 // unit mult bins
2182 if( (fEvt+en1)->fNtracks%100==0){
2183 Int_t kTindex=0;
2184 if(kT12>0.3) kTindex=1;
2185 Int_t UnitMultBin = int((fEvt+en1)->fNtracks / 100.) + 1;
2186 Charge1[bin1].Charge2[bin2].MB[fMbin].EDB[kTindex].TwoPT[1].fUnitMultBin->Fill(UnitMultBin, qinv12);
be9ef9f9 2187 }
b71263d0 2188 }
2189 //////////////////////////////////////////
6bb6954b 2190 if(fTabulatePairs && en1==0 && en2<=1 && bin1==bin2){
b71263d0 2191 Float_t kY = 0;
2192 Int_t kTbin=-1, kYbin=-1;
86528e76 2193 Bool_t PairToReject=kFALSE;
2194 if((fEvt+en1)->fTracks[i].fPt < fMinPt || (fEvt+en1)->fTracks[i].fPt > fMaxPt) PairToReject=kTRUE;
2195 if((fEvt+en2)->fTracks[j].fPt < fMinPt || (fEvt+en2)->fTracks[j].fPt > fMaxPt) PairToReject=kTRUE;
2196 if(!PairToReject){
2197 for(Int_t kIt=0; kIt<fKbinsT; kIt++) {if(kT12 < (fKmiddleT[kIt] + fKstepT[kIt]/2.)) {kTbin = kIt; break;}}
2198 for(Int_t kIt=0; kIt<fKbinsY; kIt++) {if(kY < (fKmiddleY[kIt] + fKstepY[kIt]/2.)) {kYbin = kIt; break;}}
2199 if((kTbin<0) || (kYbin<0)) {cout<<"problem!!!!!!!!!!!!!!!!!!!!!!!!!!!!"<<endl; continue;}
2200 if((kTbin>=fKbinsT) || (kYbin>=fKbinsY)) {cout<<"problem!!!!!!!!!!!!!!!!!!!!!!!!!!!!"<<endl; continue;}
2201 if(fGenerateSignal && en2==0) {
2202 Int_t chGroup2[2]={ch1,ch2};
2203 Float_t WInput = MCWeight(chGroup2, fRMax, ffcSqMRC, qinv12, kT12);
b71263d0 2204 KT[kTbin].KY[kYbin].MB[fMbin].EDB[0].TwoPT[en2].fTerms2ThreeD->Fill(fabs(qout), fabs(qside), fabs(qlong), WInput);
86528e76 2205 }else KT[kTbin].KY[kYbin].MB[fMbin].EDB[0].TwoPT[en2].fTerms2ThreeD->Fill(fabs(qout), fabs(qside), fabs(qlong));
2206 }
b71263d0 2207 }
2208
2209 //////////////////////////////////////////////////////////////////////////////
86528e76 2210
b71263d0 2211 if(qinv12 <= fQcut) {
b71263d0 2212 if(en1==0 && en2==0) {fLowQPairSwitch_E0E0[i]->AddAt('1',j);}
2213 if(en1==0 && en2==1) {fLowQPairSwitch_E0E1[i]->AddAt('1',j);}
2214 if(en1==0 && en2==2) {fLowQPairSwitch_E0E2[i]->AddAt('1',j);}
2215 if(en1==0 && en2==3) {fLowQPairSwitch_E0E3[i]->AddAt('1',j);}
6bb6954b 2216 if(en1==1 && en2==1) {fLowQPairSwitch_E1E1[i]->AddAt('1',j);}
b71263d0 2217 if(en1==1 && en2==2) {fLowQPairSwitch_E1E2[i]->AddAt('1',j);}
2218 if(en1==1 && en2==3) {fLowQPairSwitch_E1E3[i]->AddAt('1',j);}
2219 if(en1==2 && en2==3) {fLowQPairSwitch_E2E3[i]->AddAt('1',j);}
2220 }
2221 if((qinv12 >= fNormQcutLow) && (qinv12 < fNormQcutHigh)) {
b71263d0 2222 if(en1==0 && en2==0) {fNormQPairSwitch_E0E0[i]->AddAt('1',j);}
2223 if(en1==0 && en2==1) {fNormQPairSwitch_E0E1[i]->AddAt('1',j);}
2224 if(en1==0 && en2==2) {fNormQPairSwitch_E0E2[i]->AddAt('1',j);}
2225 if(en1==0 && en2==3) {fNormQPairSwitch_E0E3[i]->AddAt('1',j);}
6bb6954b 2226 if(en1==1 && en2==1) {fNormQPairSwitch_E1E1[i]->AddAt('1',j);}
b71263d0 2227 if(en1==1 && en2==2) {fNormQPairSwitch_E1E2[i]->AddAt('1',j);}
2228 if(en1==1 && en2==3) {fNormQPairSwitch_E1E3[i]->AddAt('1',j);}
2229 if(en1==2 && en2==3) {fNormQPairSwitch_E2E3[i]->AddAt('1',j);}
be9ef9f9 2230 }
b71263d0 2231
be9ef9f9 2232 }
2233 }
2234 }
b71263d0 2235 }
be9ef9f9 2236
b71263d0 2237 //cout<<PairCount[0]<<" "<<PairCount[1]<<" "<<PairCount[2]<<" "<<PairCount[3]<<" "<<PairCount[4]<<" "<<PairCount[5]<<" "<<PairCount[6]<<endl;
2238 //cout<<NormPairCount[0]<<" "<<NormPairCount[1]<<" "<<NormPairCount[2]<<" "<<NormPairCount[3]<<" "<<NormPairCount[4]<<" "<<NormPairCount[5]<<" "<<NormPairCount[6]<<endl;
2239 ///////////////////////////////////////////////////
2240 // Do not use pairs from events with too many pairs
2241
2242 ((TH1F*)fOutputList->FindObject("fEvents2"))->Fill(fMbin+1);
2243
2244 ///////////////////////////////////////////////////
2245
2246
2247 if(fTabulatePairs) return;
be9ef9f9 2248
fac2d84b 2249 /*TF1 *SCpairWeight = new TF1("SCpairWeight","[0] + [1]*x + [2]*exp(-[3]*x)",0,0.2);// same-charge pair weight for monte-carlo data without two-track cuts.
2250 SCpairWeight->FixParameter(0, 0.959);
2251 SCpairWeight->FixParameter(1, 0.278);
2252 SCpairWeight->FixParameter(2, -1.759);
2253 SCpairWeight->FixParameter(3, 115.107);*/
2254
b71263d0 2255 ////////////////////////////////////////////////////
2256 ////////////////////////////////////////////////////
2257 // Normalization counting of 3- and 4-particle terms
2258 for(Int_t en2=0; en2<=1; en2++){// 2nd event number (en2=0 is the same event as current event)
2259 for(Int_t en3=en2; en3<=2; en3++){// 3rd event number
6bb6954b 2260 if(en2==0 && en3>2) continue;// not needed config
b71263d0 2261 if(en2==1 && en3==en2) continue;// not needed config
2262 for(Int_t en4=en3; en4<=3; en4++){// 4th event number
2263 if(en3==0 && en4>1) continue;// not needed config
6bb6954b 2264 if(en3==1 && en4==3) continue;// not needed configs
2265 if(en3==2 && (en2+en3+en4)!=6) continue;// not needed configs
b71263d0 2266
2267 for (Int_t i=0; i<myTracks; i++) {// 1st particle
2268 pVect1[1]=(fEvt)->fTracks[i].fP[0];
2269 pVect1[2]=(fEvt)->fTracks[i].fP[1];
2270 pVect1[3]=(fEvt)->fTracks[i].fP[2];
2271 ch1 = Int_t(((fEvt)->fTracks[i].fCharge + 1)/2.);
be9ef9f9 2272
b71263d0 2273 for (Int_t j=i+1; j<(fEvt+en2)->fNtracks; j++) {// 2nd particle
b71263d0 2274 if(en2==0) {if(fNormQPairSwitch_E0E0[i]->At(j)=='0') continue;}
2275 else {if(fNormQPairSwitch_E0E1[i]->At(j)=='0') continue;}
2276
2277 pVect2[1]=(fEvt+en2)->fTracks[j].fP[0];
2278 pVect2[2]=(fEvt+en2)->fTracks[j].fP[1];
2279 pVect2[3]=(fEvt+en2)->fTracks[j].fP[2];
2280 ch2 = Int_t(((fEvt+en2)->fTracks[j].fCharge + 1)/2.);
2281
2282 for (Int_t k=j+1; k<(fEvt+en3)->fNtracks; k++) {// 3rd particle
b71263d0 2283 if(en3==0) {
2284 if(fNormQPairSwitch_E0E0[i]->At(k)=='0') continue;
2285 if(fNormQPairSwitch_E0E0[j]->At(k)=='0') continue;
2286 }else if(en3==1){
2287 if(fNormQPairSwitch_E0E1[i]->At(k)=='0') continue;
2288 if(fNormQPairSwitch_E0E1[j]->At(k)=='0') continue;
2289 }else{
2290 if(fNormQPairSwitch_E0E2[i]->At(k)=='0') continue;
2291 if(fNormQPairSwitch_E1E2[j]->At(k)=='0') continue;
2292 }
be9ef9f9 2293
b71263d0 2294 pVect3[1]=(fEvt+en3)->fTracks[k].fP[0];
2295 pVect3[2]=(fEvt+en3)->fTracks[k].fP[1];
2296 pVect3[3]=(fEvt+en3)->fTracks[k].fP[2];
2297 ch3 = Int_t(((fEvt+en3)->fTracks[k].fCharge + 1)/2.);
2298 Bool_t fill2=kFALSE, fill3=kFALSE, fill4=kFALSE;
2299 SetFillBins3(ch1, ch2, ch3, 1, bin1, bin2, bin3, fill2, fill3, fill4);
2300
2301 Float_t KT3 = sqrt(pow(pVect1[1]+pVect2[1]+pVect3[1],2) + pow(pVect1[2]+pVect2[2]+pVect3[2],2))/3.;
2302 if(KT3<=fKT3transition) KT3index=0;
2303 else KT3index=1;
2304
2305 if(en2==0 && en3==0 && en4==0) Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[0].fNorm3->Fill(0);
2306 if(en2==1 && en3==2 && en4==3) Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[4].fNorm3->Fill(0);
2307 if(en2==0 && en3==1 && en4==2) {
2308 if(fill2) Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[1].fNorm3->Fill(0);
2309 if(fill3) Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[2].fNorm3->Fill(0);
2310 if(fill4) Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[3].fNorm3->Fill(0);
2311 }
2312
2313
2314 for (Int_t l=k+1; l<(fEvt+en4)->fNtracks; l++) {// 4th particle
b71263d0 2315 if(en4==0){
2316 if(fNormQPairSwitch_E0E0[i]->At(l)=='0') continue;
2317 if(fNormQPairSwitch_E0E0[j]->At(l)=='0') continue;
2318 if(fNormQPairSwitch_E0E0[k]->At(l)=='0') continue;
2319 }else if(en4==1){
6bb6954b 2320 if(en3==0){
2321 if(fNormQPairSwitch_E0E1[i]->At(l)=='0') continue;
2322 if(fNormQPairSwitch_E0E1[j]->At(l)=='0') continue;
2323 if(fNormQPairSwitch_E0E1[k]->At(l)=='0') continue;
2324 }else{
2325 if(fNormQPairSwitch_E0E1[i]->At(l)=='0') continue;
2326 if(fNormQPairSwitch_E0E1[j]->At(l)=='0') continue;
2327 if(fNormQPairSwitch_E1E1[k]->At(l)=='0') continue;
2328 }
b71263d0 2329 }else if(en4==2){
2330 if(fNormQPairSwitch_E0E2[i]->At(l)=='0') continue;
2331 if(fNormQPairSwitch_E0E2[j]->At(l)=='0') continue;
2332 if(fNormQPairSwitch_E1E2[k]->At(l)=='0') continue;
be9ef9f9 2333 }else{
b71263d0 2334 if(fNormQPairSwitch_E0E3[i]->At(l)=='0') continue;
2335 if(fNormQPairSwitch_E1E3[j]->At(l)=='0') continue;
2336 if(fNormQPairSwitch_E2E3[k]->At(l)=='0') continue;
be9ef9f9 2337 }
86528e76 2338
b71263d0 2339 pVect4[1]=(fEvt+en4)->fTracks[l].fP[0];
2340 pVect4[2]=(fEvt+en4)->fTracks[l].fP[1];
2341 pVect4[3]=(fEvt+en4)->fTracks[l].fP[2];
2342 ch4 = Int_t(((fEvt+en4)->fTracks[l].fCharge + 1)/2.);
2343 Float_t KT4 = sqrt(pow(pVect1[1]+pVect2[1]+pVect3[1]+pVect4[1],2) + pow(pVect1[2]+pVect2[2]+pVect3[2]+pVect4[2],2))/4.;
2344 if(KT4<=fKT4transition) KT4index=0;
2345 else KT4index=1;
be9ef9f9 2346
6bb6954b 2347 Bool_t FillTerms[13]={kFALSE};
b71263d0 2348 SetFillBins4(ch1, ch2, ch3, ch4, bin1, bin2, bin3, bin4, en2+en3+en4, FillTerms);
2349 //
6bb6954b 2350 for(int ft=0; ft<13; ft++) {
b71263d0 2351 if(FillTerms[ft]) Charge1[bin1].Charge2[bin2].Charge3[bin3].Charge4[bin4].MB[fMbin].EDB[KT4index].FourPT[ft].fNorm4->Fill(0.);
be9ef9f9 2352 }
be9ef9f9 2353
b71263d0 2354
be9ef9f9 2355 }
2356 }
b71263d0 2357 }
2358 }
2359
be9ef9f9 2360 }
2361 }
b71263d0 2362 }
be9ef9f9 2363
6bb6954b 2364
0207c034 2365
be9ef9f9 2366
2367 ///////////////////////////////////////////////////////////////////////
2368 ///////////////////////////////////////////////////////////////////////
2369 ///////////////////////////////////////////////////////////////////////
2370 //
2371 //
2372 // Start the Main Correlation Analysis
2373 //
2374 //
2375 ///////////////////////////////////////////////////////////////////////
6bb6954b 2376
be9ef9f9 2377
2378
2379 ////////////////////////////////////////////////////
2380 ////////////////////////////////////////////////////
2381 for(Int_t en2=0; en2<=1; en2++){// 2nd event number (en2=0 is the same event as current event)
2382 for(Int_t en3=en2; en3<=2; en3++){// 3rd event number
6bb6954b 2383 if(en2==0 && en3>2) continue;// not needed config
be9ef9f9 2384 if(en2==1 && en3==en2) continue;// not needed config
2385 for(Int_t en4=en3; en4<=3; en4++){// 4th event number
2386 if(en3==0 && en4>1) continue;// not needed config
6bb6954b 2387 if(en3==1 && en4==3) continue;// not needed configs
2388 if(en3==2 && (en2+en3+en4)!=6) continue;// not needed configs
2389
be9ef9f9 2390 Int_t ENsum=en2+en3+en4;// 0 or 1 or 3 or 6
4bf06935 2391
be9ef9f9 2392 /////////////////////////////////////////////////////////////
2393 for (Int_t i=0; i<myTracks; i++) {// 1st particle
2394 pVect1[0]=(fEvt)->fTracks[i].fEaccepted;
2395 pVect1[1]=(fEvt)->fTracks[i].fP[0];
2396 pVect1[2]=(fEvt)->fTracks[i].fP[1];
2397 pVect1[3]=(fEvt)->fTracks[i].fP[2];
2398 ch1 = Int_t(((fEvt)->fTracks[i].fCharge + 1)/2.);
86528e76 2399 if((fEvt)->fTracks[i].fPt < fMinPt) continue;
2400 if((fEvt)->fTracks[i].fPt > fMaxPt) continue;
be9ef9f9 2401
2402 /////////////////////////////////////////////////////////////
2403 for (Int_t j=i+1; j<(fEvt+en2)->fNtracks; j++) {// 2nd particle
b71263d0 2404 if(en2==0) {if(fLowQPairSwitch_E0E0[i]->At(j)=='0') continue;}
2405 else {if(fLowQPairSwitch_E0E1[i]->At(j)=='0') continue;}
86528e76 2406 if((fEvt+en2)->fTracks[j].fPt < fMinPt) continue;
2407 if((fEvt+en2)->fTracks[j].fPt > fMaxPt) continue;
2408
be9ef9f9 2409 pVect2[0]=(fEvt+en2)->fTracks[j].fEaccepted;
2410 pVect2[1]=(fEvt+en2)->fTracks[j].fP[0];
2411 pVect2[2]=(fEvt+en2)->fTracks[j].fP[1];
2412 pVect2[3]=(fEvt+en2)->fTracks[j].fP[2];
2413 ch2 = Int_t(((fEvt+en2)->fTracks[j].fCharge + 1)/2.);
2414 qinv12 = GetQinv(pVect1, pVect2);
2415 kT12 = sqrt(pow(pVect1[1]+pVect2[1],2) + pow(pVect1[2]+pVect2[2],2))/2.;
2416 SetFillBins2(ch1, ch2, bin1, bin2);
2417 Int_t kTindex=0;
2418 if(kT12<=0.3) kTindex=0;
2419 else kTindex=1;
2420
2421 FSICorr12 = FSICorrelation(ch1,ch2, qinv12);
2422
2423 // two particle terms filled during tabulation of low-q pairs
2424
2425
2426 if(fMCcase){
2427 FilledMCpair12=kFALSE;
2428
6bb6954b 2429 if(ch1==ch2 && fMbin==0 && qinv12<0.2 && ENsum!=2 && ENsum!=3 && ENsum!=6){
be9ef9f9 2430 for(Int_t rstep=0; rstep<10; rstep++){
2431 Float_t coeff = (rstep)*0.2*(0.18/1.2);
2432 Float_t phi1 = (fEvt)->fTracks[i].fPhi - asin((fEvt)->fTracks[i].fCharge*(0.1*fBfield)*coeff/(fEvt)->fTracks[i].fPt);
2433 if(phi1 > 2*PI) phi1 -= 2*PI;
2434 if(phi1 < 0) phi1 += 2*PI;
2435 Float_t phi2 = (fEvt+en2)->fTracks[j].fPhi - asin((fEvt+en2)->fTracks[j].fCharge*(0.1*fBfield)*coeff/(fEvt+en2)->fTracks[j].fPt);
2436 if(phi2 > 2*PI) phi2 -= 2*PI;
2437 if(phi2 < 0) phi2 += 2*PI;
2438 Float_t deltaphi = phi1 - phi2;
2439 if(deltaphi > PI) deltaphi -= PI;
2440 if(deltaphi < -PI) deltaphi += PI;
2441
2442 if(ENsum==0) ((TH3F*)fOutputList->FindObject("fPairsDetaDPhiNum"))->Fill(rstep, (fEvt)->fTracks[i].fEta-(fEvt+en2)->fTracks[j].fEta, deltaphi);
2443 else ((TH3F*)fOutputList->FindObject("fPairsDetaDPhiDen"))->Fill(rstep, (fEvt)->fTracks[i].fEta-(fEvt+en2)->fTracks[j].fEta, deltaphi);
2444 }
2445
2446 }// pair selection
2447
2448 // Check that label does not exceed stack size
2449 if((fEvt)->fTracks[i].fLabel < (fEvt)->fMCarraySize && (fEvt+en2)->fTracks[j].fLabel < (fEvt+en2)->fMCarraySize){
2450 if(ENsum==0 && abs((fEvt+en2)->fTracks[j].fLabel) == abs((fEvt)->fTracks[i].fLabel)) continue;
2451 pVect1MC[0]=sqrt(pow((fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPtot,2)+pow(fTrueMassPi,2));
2452 pVect2MC[0]=sqrt(pow((fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPtot,2)+pow(fTrueMassPi,2));
2453 pVect1MC[1]=(fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPx; pVect2MC[1]=(fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPx;
2454 pVect1MC[2]=(fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPy; pVect2MC[2]=(fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPy;
2455 pVect1MC[3]=(fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPz; pVect2MC[3]=(fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPz;
2456 qinv12MC = GetQinv(pVect1MC, pVect2MC);
86528e76 2457 Int_t chGroup2[2]={ch1,ch2};
2458
2459 if(fGenerateSignal && (ENsum==0 || ENsum==6)){
2460 if(ENsum==0) {
2461 Float_t WInput = MCWeight(chGroup2, fRMax, ffcSqMRC, qinv12MC, 0.);
2462 Charge1[bin1].Charge2[bin2].MB[fMbin].EDB[0].TwoPT[0].fTerms2->Fill(kT12, qinv12, WInput);
2463 }else{
2464 Charge1[bin1].Charge2[bin2].MB[fMbin].EDB[0].TwoPT[1].fTerms2->Fill(kT12, qinv12);
2465 }
2466 }
be9ef9f9 2467
2468 if(qinv12<0.1 && ch1==ch2 && ENsum==0) {
2469 ((TProfile*)fOutputList->FindObject("fQsmearMean"))->Fill(1.,qinv12-qinv12MC);
2470 ((TProfile*)fOutputList->FindObject("fQsmearSq"))->Fill(1.,1000.*pow(qinv12-qinv12MC,2));
2471 ((TH2D*)fOutputList->FindObject("fQ2Res"))->Fill(kT12, qinv12-qinv12MC);
2472 }
2473
2474 // secondary contamination
2475 if(ENsum==0){
2476 mcParticle1 = (AliAODMCParticle*)mcArray->At(abs((fEvt)->fTracks[i].fLabel));
2477 mcParticle2 = (AliAODMCParticle*)mcArray->At(abs((fEvt+en2)->fTracks[j].fLabel));
2478 if(!mcParticle1 || !mcParticle2) continue;
2479 if(abs(mcParticle1->GetPdgCode())==211 && abs(mcParticle2->GetPdgCode())==211){
2480 if(ch1==ch2) {
2481 ((TH3D*)fOutputList->FindObject("fAllSCPionPairs"))->Fill(fMbin+1, kT12, qinv12);
2482 if(!mcParticle1->IsSecondaryFromWeakDecay() && !mcParticle2->IsSecondaryFromWeakDecay()) {
2483 ((TH3D*)fOutputList->FindObject("fPrimarySCPionPairs"))->Fill(fMbin+1, kT12, qinv12);
2484 }
2485 }else{
2486 ((TH3D*)fOutputList->FindObject("fAllMCPionPairs"))->Fill(fMbin+1, kT12, qinv12);
2487 if(!mcParticle1->IsSecondaryFromWeakDecay() && !mcParticle2->IsSecondaryFromWeakDecay()) {
2488 ((TH3D*)fOutputList->FindObject("fPrimaryMCPionPairs"))->Fill(fMbin+1, kT12, qinv12);
2489 }
2490 }
2491 }
2492 }
2493
2494 if(ENsum==6){// all mixed events
86528e76 2495
be9ef9f9 2496 Float_t rForQW=5.0;
2497 if(fFSIindex<=1) rForQW=10;
2498 else if(fFSIindex==2) rForQW=9;
2499 else if(fFSIindex==3) rForQW=8;
2500 else if(fFSIindex==4) rForQW=7;
2501 else if(fFSIindex==5) rForQW=6;
2502 else if(fFSIindex==6) rForQW=5;
2503 else if(fFSIindex==7) rForQW=4;
2504 else if(fFSIindex==8) rForQW=3;
2505 else rForQW=2;
2506
2507
80507acf 2508 Charge1[bin1].Charge2[bin2].MB[fMbin].EDB[0].TwoPT[1].fMCqinv->Fill(qinv12MC, MCWeight(chGroup2, rForQW, ffcSqMRC, qinv12MC, 0.));// was 4,5
2509 Charge1[bin1].Charge2[bin2].MB[fMbin].EDB[0].TwoPT[1].fMCqinvQW->Fill(qinv12MC, qinv12MC*MCWeight(chGroup2, rForQW, ffcSqMRC, qinv12MC, 0.));// was 4,5
be9ef9f9 2510 // pion purity
2511 Charge1[bin1].Charge2[bin2].MB[fMbin].EDB[0].TwoPT[1].fPIDpurityDen->Fill(kT12, qinv12);
2512 Int_t SCNumber = 1;
2513 Int_t PdgCodeSum = abs((fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPdgCode) + abs((fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPdgCode);
2514 if(PdgCodeSum==22) SCNumber=1;// e-e
2515 else if(PdgCodeSum==24) SCNumber=2;// e-mu
2516 else if(PdgCodeSum==222) SCNumber=3;// e-pi
2517 else if(PdgCodeSum==332) SCNumber=4;// e-k
2518 else if(PdgCodeSum==2223) SCNumber=5;// e-p
2519 else if(PdgCodeSum==26) SCNumber=6;// mu-mu
2520 else if(PdgCodeSum==224) SCNumber=7;// mu-pi
2521 else if(PdgCodeSum==334) SCNumber=8;// mu-k
2522 else if(PdgCodeSum==2225) SCNumber=9;// mu-p
2523 else if(PdgCodeSum==422) SCNumber=10;// pi-pi
2524 else if(PdgCodeSum==532) SCNumber=11;// pi-k
2525 else if(PdgCodeSum==2423) SCNumber=12;// pi-p
2526 else if(PdgCodeSum==642) SCNumber=13;// k-k
2527 else if(PdgCodeSum==2533) SCNumber=14;// k-p
2528 else if(PdgCodeSum==4424) SCNumber=15;// p-p
2529 else {SCNumber=16;}
2530
2531 Charge1[bin1].Charge2[bin2].MB[fMbin].EDB[0].TwoPT[1].fPIDpurityNum->Fill(SCNumber, kT12, qinv12);
2532
2533 ///////////////////////
2534 // muon contamination
2535 Pparent1[0]=pVect1MC[0]; Pparent1[1]=pVect1MC[1]; Pparent1[2]=pVect1MC[2]; Pparent1[3]=pVect1MC[3];
2536 Pparent2[0]=pVect2MC[0]; Pparent2[1]=pVect2MC[1]; Pparent2[2]=pVect2MC[2]; Pparent2[3]=pVect2MC[3];
2537 pionParent1=kFALSE; pionParent2=kFALSE;
2538 FilledMCpair12=kTRUE;
2539 //
2540 if(abs((fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPdgCode)==13 || abs((fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPdgCode)==13){// muon check
2541 Int_t MotherLabel1 = (fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fMotherLabel;
2542 if(abs((fEvt)->fMCtracks[MotherLabel1].fPdgCode)==211) {
2543 pionParent1=kTRUE;
2544 Pparent1[1] = (fEvt)->fMCtracks[MotherLabel1].fPx; Pparent1[2] = (fEvt)->fMCtracks[MotherLabel1].fPy; Pparent1[3] = (fEvt)->fMCtracks[MotherLabel1].fPz;
2545 Pparent1[0] = sqrt(pow(Pparent1[1],2)+pow(Pparent1[2],2)+pow(Pparent1[3],2)+pow(fTrueMassPi,2));
2546 }
2547 //
2548 if(abs((fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPdgCode)==13) {
2549 Int_t MotherLabel2 = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fMotherLabel;
2550 if(abs((fEvt+en2)->fMCtracks[MotherLabel2].fPdgCode)==211) {
2551 pionParent2=kTRUE;
2552 Pparent2[1] = (fEvt+en2)->fMCtracks[MotherLabel2].fPx; Pparent2[2] = (fEvt+en2)->fMCtracks[MotherLabel2].fPy; Pparent2[3] = (fEvt+en2)->fMCtracks[MotherLabel2].fPz;
2553 Pparent2[0] = sqrt(pow(Pparent2[1],2)+pow(Pparent2[2],2)+pow(Pparent2[3],2)+pow(fTrueMassPi,2));
2554 }
2555 }
2556
2557 parentQinv12 = GetQinv(Pparent1, Pparent2);
2558
2559 if(pionParent1 || pionParent2){
2560 if(parentQinv12 > 0.001 && parentQinv12 < 0.3){
2561 Float_t muonPionK12 = FSICorrelation(ch1, ch2, qinv12MC);
2562 Float_t pionPionK12 = FSICorrelation(ch1, ch2, parentQinv12);
2563 for(Int_t term=1; term<=2; term++){
2564 for(Int_t Riter=0; Riter<fRVALUES; Riter++){
78c3bd48 2565 Float_t Rvalue = fRstartMC+Riter;
be9ef9f9 2566 Float_t WInput = 1.0;
2567 if(term==1) {
2568 WInput = MCWeight(chGroup2, Rvalue, 1.0, parentQinv12, 0.);
5591748e 2569 }else{
be9ef9f9 2570 muonPionK12 = 1.0; pionPionK12=1.0;
2571 }
5591748e 2572
be9ef9f9 2573 Charge1[bin1].Charge2[bin2].MB[0].EDB[0].TwoPT[term-1].fMuonSmeared->Fill(Rvalue, qinv12MC, WInput);
2574 Charge1[bin1].Charge2[bin2].MB[0].EDB[0].TwoPT[term-1].fMuonIdeal->Fill(Rvalue, parentQinv12, WInput);
2575 Charge1[bin1].Charge2[bin2].MB[0].EDB[0].TwoPT[term-1].fMuonPionK2->Fill(Rvalue, qinv12MC, muonPionK12);
2576 Charge1[bin1].Charge2[bin2].MB[0].EDB[0].TwoPT[term-1].fPionPionK2->Fill(Rvalue, parentQinv12, pionPionK12);
2577 }// Riter
2578 }// term loop
2579
2580 if(ch1==ch2) ((TH3D*)fOutputList->FindObject("fMuonPionDeltaQinv"))->Fill(0., kT12, qinv12MC-parentQinv12);
2581 else ((TH3D*)fOutputList->FindObject("fMuonPionDeltaQinv"))->Fill(1., kT12, qinv12MC-parentQinv12);
2582 }// parentQ check
2583 }// pion parent check
2584 }// muon check
2585
2586
0207c034 2587 Int_t indexq2 = qinv12 / 0.005;
2588 if(indexq2 >=200) indexq2=199;
78c3bd48 2589 Float_t WSpectrum = 1.0;
2590 if(fPbPbcase) {
2591 WSpectrum = HIJINGq2WeightsSC[indexq2];
2592 if(ch1!=ch2) WSpectrum = HIJINGq2WeightsMC[indexq2];
2593 }
be9ef9f9 2594 // momentum resolution
2595 for(Int_t Riter=0; Riter<fRVALUES; Riter++){
78c3bd48 2596 Float_t Rvalue = fRstartMC+Riter;
80507acf 2597 Float_t WInput = MCWeight(chGroup2, Rvalue, ffcSqMRC, qinv12MC, 0.);
0207c034 2598 Charge1[bin1].Charge2[bin2].MB[0].EDB[kTindex].TwoPT[0].fIdeal->Fill(Rvalue, qinv12MC, WInput * WSpectrum);
2599 Charge1[bin1].Charge2[bin2].MB[0].EDB[kTindex].TwoPT[1].fIdeal->Fill(Rvalue, qinv12MC, WSpectrum);
2600 Charge1[bin1].Charge2[bin2].MB[0].EDB[kTindex].TwoPT[0].fSmeared->Fill(Rvalue, qinv12, WInput * WSpectrum);
2601 Charge1[bin1].Charge2[bin2].MB[0].EDB[kTindex].TwoPT[1].fSmeared->Fill(Rvalue, qinv12, WSpectrum);
be9ef9f9 2602 }
2603
2604 }// ENsum check
2605 }// MC array check
2606 }// MC case
2607
2608
6bb6954b 2609
be9ef9f9 2610 /////////////////////////////////////////////////////////////
2611 for (Int_t k=j+1; k<(fEvt+en3)->fNtracks; k++) {// 3rd particle
b71263d0 2612 if(en3==0) {
2613 if(fLowQPairSwitch_E0E0[i]->At(k)=='0') continue;
2614 if(fLowQPairSwitch_E0E0[j]->At(k)=='0') continue;
2615 }else if(en3==1){
2616 if(fLowQPairSwitch_E0E1[i]->At(k)=='0') continue;
2617 if(fLowQPairSwitch_E0E1[j]->At(k)=='0') continue;
2618 }else{
2619 if(fLowQPairSwitch_E0E2[i]->At(k)=='0') continue;
2620 if(fLowQPairSwitch_E1E2[j]->At(k)=='0') continue;
be9ef9f9 2621 }
86528e76 2622 if((fEvt+en3)->fTracks[k].fPt < fMinPt) continue;
2623 if((fEvt+en3)->fTracks[k].fPt > fMaxPt) continue;
2624
be9ef9f9 2625 pVect3[0]=(fEvt+en3)->fTracks[k].fEaccepted;
2626 pVect3[1]=(fEvt+en3)->fTracks[k].fP[0];
2627 pVect3[2]=(fEvt+en3)->fTracks[k].fP[1];
2628 pVect3[3]=(fEvt+en3)->fTracks[k].fP[2];
2629 ch3 = Int_t(((fEvt+en3)->fTracks[k].fCharge + 1)/2.);
2630 qinv13 = GetQinv(pVect1, pVect3);
2631 qinv23 = GetQinv(pVect2, pVect3);
2632 q3 = sqrt(pow(qinv12,2) + pow(qinv13,2) + pow(qinv23,2));
86528e76 2633 Int_t chGroup3[3]={ch1,ch2,ch3};
2634 Float_t QinvMCGroup3[3]={0};
2635 Float_t kTGroup3[3]={0};
be9ef9f9 2636 FilledMCtriplet123 = kFALSE;
0207c034 2637 if(fMCcase){
86528e76 2638 if((fEvt+en3)->fTracks[k].fLabel == (fEvt+en2)->fTracks[j].fLabel) continue;
2639 if((fEvt+en3)->fTracks[k].fLabel == (fEvt)->fTracks[i].fLabel) continue;
2640
2641 pVect3MC[0]=sqrt(pow((fEvt+en3)->fMCtracks[abs((fEvt+en3)->fTracks[k].fLabel)].fPtot,2)+pow(fTrueMassPi,2));
2642 pVect3MC[1]=(fEvt+en3)->fMCtracks[abs((fEvt+en3)->fTracks[k].fLabel)].fPx;
2643 pVect3MC[2]=(fEvt+en3)->fMCtracks[abs((fEvt+en3)->fTracks[k].fLabel)].fPy;
2644 pVect3MC[3]=(fEvt+en3)->fMCtracks[abs((fEvt+en3)->fTracks[k].fLabel)].fPz;
2645 qinv13MC = GetQinv(pVect1MC, pVect3MC);
2646 qinv23MC = GetQinv(pVect2MC, pVect3MC);
2647 QinvMCGroup3[0] = qinv12MC; QinvMCGroup3[1] = qinv13MC; QinvMCGroup3[2] = qinv23MC;
2648 }
2649
be9ef9f9 2650
2651 Bool_t fill2=kFALSE, fill3=kFALSE, fill4=kFALSE;
2652 SetFillBins3(ch1, ch2, ch3, 1, bin1, bin2, bin3, fill2, fill3, fill4);
2653
2654 Float_t KT3 = sqrt(pow(pVect1[1]+pVect2[1]+pVect3[1],2) + pow(pVect1[2]+pVect2[2]+pVect3[2],2))/3.;
2655 if(KT3<=fKT3transition) KT3index=0;
2656 else KT3index=1;
2657
2658 FSICorr13 = FSICorrelation(ch1,ch3, qinv13);
2659 FSICorr23 = FSICorrelation(ch2,ch3, qinv23);
80507acf 2660 if(!fGenerateSignal && !fMCcase) {
2661 momBin12 = fMomResC2SC->GetYaxis()->FindBin(qinv12);
2662 momBin13 = fMomResC2SC->GetYaxis()->FindBin(qinv13);
2663 momBin23 = fMomResC2SC->GetYaxis()->FindBin(qinv23);
2664 if(momBin12 >= 20) momBin12 = 19;
2665 if(momBin13 >= 20) momBin13 = 19;
2666 if(momBin23 >= 20) momBin23 = 19;
2667 //
2668 if(ch1==ch2) MomResCorr12 = fMomResC2SC->GetBinContent(rBinForTPNMomRes, momBin12);
2669 else MomResCorr12 = fMomResC2MC->GetBinContent(rBinForTPNMomRes, momBin12);
2670 if(ch1==ch3) MomResCorr13 = fMomResC2SC->GetBinContent(rBinForTPNMomRes, momBin13);
2671 else MomResCorr13 = fMomResC2MC->GetBinContent(rBinForTPNMomRes, momBin13);
2672 if(ch2==ch3) MomResCorr23 = fMomResC2SC->GetBinContent(rBinForTPNMomRes, momBin23);
2673 else MomResCorr23 = fMomResC2MC->GetBinContent(rBinForTPNMomRes, momBin23);
2674 }
be9ef9f9 2675 if(ENsum==0) {
86528e76 2676 Float_t Winput=1.0;
2677 if(fMCcase && fGenerateSignal) Winput = MCWeight3(1, fRMax, ffcSqMRC, chGroup3, QinvMCGroup3, kTGroup3);
2678 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[0].fTerms3->Fill(q3, Winput);
2679 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[0].fKfactor->Fill(q3, 1/(FSICorr12*FSICorr13*FSICorr23), Winput);
2680 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[0].fKfactorWeighted->Fill(q3, 1/(FSICorr12*FSICorr13*FSICorr23), MomResCorr12*MomResCorr13*MomResCorr23 * Winput);
be9ef9f9 2681 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[0].fMeanQinv->Fill(q3, qinv12);
2682 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[0].fMeanQinv->Fill(q3, qinv13);
2683 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[0].fMeanQinv->Fill(q3, qinv23);
78c3bd48 2684 if(bin1==bin2 && bin1==bin3){
2685 Charge1[0].Charge2[0].Charge3[0].MB[fMbin].EDB[KT3index].ThreePT[0].fTerms33D->Fill(qinv12, qinv13, qinv23);
2686 Charge1[0].Charge2[0].Charge3[0].MB[fMbin].EDB[KT3index].ThreePT[0].fKfactor3D->Fill(qinv12, qinv13, qinv23, 1/(FSICorr12*FSICorr13*FSICorr23));
2687 }
be9ef9f9 2688 }
2689 if(ENsum==6) {
2690 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[4].fTerms3->Fill(q3);
2691 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[4].fMeanQinv->Fill(q3, qinv12);
2692 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[4].fMeanQinv->Fill(q3, qinv13);
2693 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[4].fMeanQinv->Fill(q3, qinv23);
78c3bd48 2694 if(bin1==bin2 && bin1==bin3) Charge1[0].Charge2[0].Charge3[0].MB[fMbin].EDB[KT3index].ThreePT[4].fTerms33D->Fill(qinv12, qinv13, qinv23);
be9ef9f9 2695 }
2696 if(ENsum==3){
86528e76 2697 Float_t Winput=1.0;
be9ef9f9 2698 if(fill2) {
86528e76 2699 if(fMCcase && fGenerateSignal) Winput = MCWeight3(2, fRMax, ffcSqMRC, chGroup3, QinvMCGroup3, kTGroup3);
2700 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[1].fTerms3->Fill(q3, Winput);
2701 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[1].fKfactor->Fill(q3, 1/(FSICorr12), Winput);
2702 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[1].fKfactorWeighted->Fill(q3, 1/(FSICorr12), MomResCorr12 * Winput);
be9ef9f9 2703 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[1].fMeanQinv->Fill(q3, qinv12);
2704 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[1].fMeanQinv->Fill(q3, qinv13);
2705 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[1].fMeanQinv->Fill(q3, qinv23);
78c3bd48 2706 if(bin1==bin2 && bin1==bin3){
2707 Charge1[0].Charge2[0].Charge3[0].MB[fMbin].EDB[KT3index].ThreePT[1].fTerms33D->Fill(qinv12, qinv13, qinv23);
2708 Charge1[0].Charge2[0].Charge3[0].MB[fMbin].EDB[KT3index].ThreePT[1].fKfactor3D->Fill(qinv12, qinv13, qinv23, 1/(FSICorr12));
2709 }
be9ef9f9 2710 }if(fill3) {
86528e76 2711 if(fMCcase && fGenerateSignal) Winput = MCWeight3(3, fRMax, ffcSqMRC, chGroup3, QinvMCGroup3, kTGroup3);
2712 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[2].fTerms3->Fill(q3, Winput);
2713 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[2].fKfactor->Fill(q3, 1/(FSICorr12), Winput);
2714 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[2].fKfactorWeighted->Fill(q3, 1/(FSICorr12), MomResCorr12 * Winput);
be9ef9f9 2715 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[2].fMeanQinv->Fill(q3, qinv12);
2716 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[2].fMeanQinv->Fill(q3, qinv13);
2717 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[2].fMeanQinv->Fill(q3, qinv23);
78c3bd48 2718 if(bin1==bin2 && bin1==bin3){
2719 Charge1[0].Charge2[0].Charge3[0].MB[fMbin].EDB[KT3index].ThreePT[2].fTerms33D->Fill(qinv13, qinv12, qinv23);
2720 Charge1[0].Charge2[0].Charge3[0].MB[fMbin].EDB[KT3index].ThreePT[2].fKfactor3D->Fill(qinv13, qinv12, qinv23, 1/(FSICorr12));
2721 }
be9ef9f9 2722 }if(fill4) {
86528e76 2723 if(fMCcase && fGenerateSignal) Winput = MCWeight3(4, fRMax, ffcSqMRC, chGroup3, QinvMCGroup3, kTGroup3);
2724 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[3].fTerms3->Fill(q3, Winput);
2725 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[3].fKfactor->Fill(q3, 1/(FSICorr12), Winput);
2726 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[3].fKfactorWeighted->Fill(q3, 1/(FSICorr12), MomResCorr12 * Winput);
be9ef9f9 2727 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[3].fMeanQinv->Fill(q3, qinv12);
2728 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[3].fMeanQinv->Fill(q3, qinv13);
2729 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[3].fMeanQinv->Fill(q3, qinv23);
78c3bd48 2730 if(bin1==bin2 && bin1==bin3){
2731 Charge1[0].Charge2[0].Charge3[0].MB[fMbin].EDB[KT3index].ThreePT[3].fTerms33D->Fill(qinv13, qinv23, qinv12);
2732 Charge1[0].Charge2[0].Charge3[0].MB[fMbin].EDB[KT3index].ThreePT[3].fKfactor3D->Fill(qinv13, qinv23, qinv12, 1/(FSICorr12));
2733 }
be9ef9f9 2734 }
2735 }
2736
2737 // r3 denominator
0207c034 2738 if(ENsum==6 && ch1==ch2 && ch1==ch3 && fPbPbcase){
6432c081 2739 Positive1stTripletWeights = kTRUE;
be9ef9f9 2740 //
2741 GetWeight(pVect1, pVect2, weight12, weight12Err);
2742 GetWeight(pVect1, pVect3, weight13, weight13Err);
2743 GetWeight(pVect2, pVect3, weight23, weight23Err);
2744
2745 if(sqrt(fabs(weight12*weight13*weight23)) > 1.0) {// weight should never be larger than 1
2746 if(fMbin==0 && bin1==0) {
2747 ((TH1D*)fOutputList->FindObject("fTPNRejects3pion1"))->Fill(q3, sqrt(fabs(weight12*weight13*weight23)));
2748 }
2749 }else{
2750
5591748e 2751 Float_t MuonCorr12=1.0, MuonCorr13=1.0, MuonCorr23=1.0;
be9ef9f9 2752 if(!fGenerateSignal && !fMCcase) {
5591748e 2753 MuonCorr12 = fWeightmuonCorrection->GetBinContent(rBinForTPNMomRes, momBin12);
2754 MuonCorr13 = fWeightmuonCorrection->GetBinContent(rBinForTPNMomRes, momBin13);
2755 MuonCorr23 = fWeightmuonCorrection->GetBinContent(rBinForTPNMomRes, momBin23);
be9ef9f9 2756 }
fac2d84b 2757
5591748e 2758 // no MRC, no Muon Correction
2759 weight12CC[0] = ((weight12+1) - ffcSq*FSICorr12 - (1-ffcSq));
2760 weight12CC[0] /= FSICorr12*ffcSq;
2761 weight13CC[0] = ((weight13+1) - ffcSq*FSICorr13 - (1-ffcSq));
2762 weight13CC[0] /= FSICorr13*ffcSq;
2763 weight23CC[0] = ((weight23+1) - ffcSq*FSICorr23 - (1-ffcSq));
2764 weight23CC[0] /= FSICorr23*ffcSq;
2765 if(weight12CC[0] > 0 && weight13CC[0] > 0 && weight23CC[0] > 0){
2766 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[4].fTwoPartNorm->Fill(1, q3, sqrt(weight12CC[0]*weight13CC[0]*weight23CC[0]));
2767 }
2768 // no Muon Correction
2769 weight12CC[1] = ((weight12+1)*MomResCorr12 - ffcSq*FSICorr12 - (1-ffcSq));
2770 weight12CC[1] /= FSICorr12*ffcSq;
2771 weight13CC[1] = ((weight13+1)*MomResCorr13 - ffcSq*FSICorr13 - (1-ffcSq));
2772 weight13CC[1] /= FSICorr13*ffcSq;
2773 weight23CC[1] = ((weight23+1)*MomResCorr23 - ffcSq*FSICorr23 - (1-ffcSq));
2774 weight23CC[1] /= FSICorr23*ffcSq;
2775 if(weight12CC[1] > 0 && weight13CC[1] > 0 && weight23CC[1] > 0){
2776 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[4].fTwoPartNorm->Fill(2, q3, sqrt(weight12CC[1]*weight13CC[1]*weight23CC[1]));
2777 }
2778 // both Corrections
2779 weight12CC[2] = ((weight12+1)*MomResCorr12 - ffcSq*FSICorr12 - (1-ffcSq));
2780 weight12CC[2] /= FSICorr12*ffcSq;
2781 weight12CC[2] *= MuonCorr12;
2782 weight13CC[2] = ((weight13+1)*MomResCorr13 - ffcSq*FSICorr13 - (1-ffcSq));
2783 weight13CC[2] /= FSICorr13*ffcSq;
2784 weight13CC[2] *= MuonCorr13;
2785 weight23CC[2] = ((weight23+1)*MomResCorr23 - ffcSq*FSICorr23 - (1-ffcSq));
2786 weight23CC[2] /= FSICorr23*ffcSq;
2787 weight23CC[2] *= MuonCorr23;
6432c081 2788
5591748e 2789 if(weight12CC[2] < 0 || weight13CC[2] < 0 || weight23CC[2] < 0) {// C2^QS can never be less than unity
be9ef9f9 2790 if(fMbin==0 && bin1==0) {
5591748e 2791 ((TH1D*)fOutputList->FindObject("fTPNRejects3pion2"))->Fill(q3, sqrt(fabs(weight12CC[2]*weight13CC[2]*weight23CC[2])));
be9ef9f9 2792 }
6432c081 2793 if(weight12CC[2] < 0) weight12CC[2]=0;
2794 if(weight13CC[2] < 0) weight13CC[2]=0;
2795 if(weight23CC[2] < 0) weight23CC[2]=0;
2796 Positive1stTripletWeights = kFALSE;
2797 }
2798 /////////////////////////////////////////////////////
2799 weightTotal = sqrt(weight12CC[2]*weight13CC[2]*weight23CC[2]);
2800 /////////////////////////////////////////////////////
2801 if(Positive1stTripletWeights){
5591748e 2802 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[4].fTwoPartNorm->Fill(3, q3, weightTotal);
ab890ec3 2803 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[4].fTwoPartNorm->Fill(4, q3, 1);
6432c081 2804 }else{
2805 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[4].fTwoPartNegNorm->Fill(4, q3, 1);
2806 }
0207c034 2807
6432c081 2808 //
2809 // Full Weight reconstruction
2810
2811 for(Int_t RcohIndex=0; RcohIndex<2; RcohIndex++){// Rcoh=0, then Rcoh=Rch
9c0557fb 2812 for(Int_t GIndex=0; GIndex<50; GIndex++){
2813 Int_t FillBin = 5 + RcohIndex*50 + GIndex;
6432c081 2814 Float_t G = 0.02*GIndex;
2815 if(RcohIndex==0){
2816 T12 = (-2*G*(1-G) + sqrt(pow(2*G*(1-G),2) + 4*pow(1-G,2)*weight12CC[2])) / (2*pow(1-G,2));
2817 T13 = (-2*G*(1-G) + sqrt(pow(2*G*(1-G),2) + 4*pow(1-G,2)*weight13CC[2])) / (2*pow(1-G,2));
2818 T23 = (-2*G*(1-G) + sqrt(pow(2*G*(1-G),2) + 4*pow(1-G,2)*weight23CC[2])) / (2*pow(1-G,2));
2819 weightTotal = 2*G*(1-G)*(T12 + T13 + T23) + pow(1-G,2)*(T12*T12 + T13*T13 + T23*T23);
2820 weightTotal += 2*G*pow(1-G,2)*(T12*T13 + T12*T23 + T13*T23) + 2*pow(1-G,3)*T12*T13*T23;
2821 }else{
95567836 2822 T12 = sqrt(weight12CC[2] / (1-G*G));
2823 T13 = sqrt(weight13CC[2] / (1-G*G));
2824 T23 = sqrt(weight23CC[2] / (1-G*G));
2825 weightTotal = (1-G*G)*(T12*T12 + T13*T13 + T23*T23);
2826 weightTotal += (6*G*pow(1-G,2) + 2*pow(1-G,3)) * T12*T13*T23;
6432c081 2827 }
2828 if(Positive1stTripletWeights){
ab890ec3 2829 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[4].fTwoPartNorm->Fill(FillBin, q3, weightTotal);
6432c081 2830 }else{
2831 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[4].fTwoPartNegNorm->Fill(FillBin, q3, weightTotal);
ab890ec3 2832 }
2833 }
6432c081 2834 }
2835 //
2836 /*weight12CC_e = weight12Err*MomResCorr12 / FSICorr12 / ffcSq * MuonCorr12;
43046300 2837 weight13CC_e = weight13Err*MomResCorr13 / FSICorr13 / ffcSq * MuonCorr13;
2838 weight23CC_e = weight23Err*MomResCorr23 / FSICorr23 / ffcSq * MuonCorr23;
2839 if(weight12CC[2]*weight13CC[2]*weight23CC[2] > 0){
6432c081 2840 weightTotalErr = pow(2 * sqrt(3) * weight12CC_e*weight13CC[2]*weight23CC[2] / sqrt(weight12CC[2]*weight13CC[2]*weight23CC[2]),2);
43046300 2841 }
2842 weightTotalErr += pow(weight12CC_e,2) + pow(weight13CC_e,2) + pow(weight23CC_e,2);
ab890ec3 2843 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[4].fTwoPartNormErr->Fill(4, q3, weightTotalErr);*/
5591748e 2844
be9ef9f9 2845 }// 1st r3 den check
5591748e 2846
be9ef9f9 2847 }// r3 den
2848
4bf06935 2849
2850 if(ch1==ch2 && ch1==ch3){
2851 Float_t pt1=sqrt(pow(pVect1[1],2)+pow(pVect1[2],2));
2852 Float_t pt2=sqrt(pow(pVect2[1],2)+pow(pVect2[2],2));
2853 Float_t pt3=sqrt(pow(pVect3[1],2)+pow(pVect3[2],2));
2854 if(ENsum==0){
2855 ((TH3D*)fOutputList->FindObject("fKT3DistTerm1"))->Fill(fMbin+1, KT3, q3);
2856 if(q3<0.1){
2857 ((TProfile2D*)fOutputList->FindObject("fKT3AvgpT"))->Fill(fMbin+1, KT3index, pt1);
2858 ((TProfile2D*)fOutputList->FindObject("fKT3AvgpT"))->Fill(fMbin+1, KT3index, pt2);
2859 ((TProfile2D*)fOutputList->FindObject("fKT3AvgpT"))->Fill(fMbin+1, KT3index, pt3);
2860 }
2861 }
2862 if(fMbin==0){
2863 if(ENsum==0){
2864 ((TH3D*)fOutputList->FindObject("fQ3AvgpTENsum0"))->Fill(KT3index, q3, pt1);
2865 ((TH3D*)fOutputList->FindObject("fQ3AvgpTENsum0"))->Fill(KT3index, q3, pt2);
2866 ((TH3D*)fOutputList->FindObject("fQ3AvgpTENsum0"))->Fill(KT3index, q3, pt3);
2867 }
2868 if(ENsum==3){
2869 ((TH3D*)fOutputList->FindObject("fQ3AvgpTENsum3"))->Fill(KT3index, q3, pt1);
2870 ((TH3D*)fOutputList->FindObject("fQ3AvgpTENsum3"))->Fill(KT3index, q3, pt2);
2871 ((TH3D*)fOutputList->FindObject("fQ3AvgpTENsum3"))->Fill(KT3index, q3, pt3);
2872 }
2873 if(ENsum==6){
2874 ((TH3D*)fOutputList->FindObject("fQ3AvgpTENsum6"))->Fill(KT3index, q3, pt1);
2875 ((TH3D*)fOutputList->FindObject("fQ3AvgpTENsum6"))->Fill(KT3index, q3, pt2);
2876 ((TH3D*)fOutputList->FindObject("fQ3AvgpTENsum6"))->Fill(KT3index, q3, pt3);
9c0557fb 2877 }
be9ef9f9 2878 }
9c0557fb 2879
be9ef9f9 2880 }
2881 if(ch1==ch2 && ch1==ch3 && ENsum==6) ((TH3D*)fOutputList->FindObject("fKT3DistTerm5"))->Fill(fMbin+1, KT3, q3);
2882
2883
2884
2885
2886 if(fMCcase && ENsum==6 && FilledMCpair12){// for momentum resolution and muon correction
2887 if((fEvt+en3)->fTracks[k].fLabel < (fEvt+en3)->fMCarraySize){
2888
2889 pVect3MC[0]=sqrt(pow((fEvt+en3)->fMCtracks[abs((fEvt+en3)->fTracks[k].fLabel)].fPtot,2)+pow(fTrueMassPi,2));
2890 pVect3MC[1]=(fEvt+en3)->fMCtracks[abs((fEvt+en3)->fTracks[k].fLabel)].fPx;
2891 pVect3MC[2]=(fEvt+en3)->fMCtracks[abs((fEvt+en3)->fTracks[k].fLabel)].fPy;
2892 pVect3MC[3]=(fEvt+en3)->fMCtracks[abs((fEvt+en3)->fTracks[k].fLabel)].fPz;
2893 qinv13MC = GetQinv(pVect1MC, pVect3MC);
2894 qinv23MC = GetQinv(pVect2MC, pVect3MC);
2895
2896 q3MC = sqrt(pow(qinv12MC,2)+pow(qinv13MC,2)+pow(qinv23MC,2));
2897 if(q3<0.1 && ch1==ch2 && ch1==ch3) ((TH2D*)fOutputList->FindObject("fQ3Res"))->Fill(KT3, q3-q3MC);
2898
4bf06935 2899 //Float_t TripletWeightTTC=1.0;// same-charge weights to mimic two-track depletion of same-charge pairs
fac2d84b 2900 //if(ch1==ch2 && qinv12>0.006) TripletWeightTTC *= SCpairWeight->Eval(qinv12);
2901 //if(ch1==ch3 && qinv13>0.006) TripletWeightTTC *= SCpairWeight->Eval(qinv13);
2902 //if(ch2==ch3 && qinv23>0.006) TripletWeightTTC *= SCpairWeight->Eval(qinv23);
2903
86528e76 2904
be9ef9f9 2905 Pparent3[0]=pVect3MC[0]; Pparent3[1]=pVect3MC[1]; Pparent3[2]=pVect3MC[2]; Pparent3[3]=pVect3MC[3];
2906 pionParent3=kFALSE;
2907
2908 if(abs((fEvt+en3)->fMCtracks[abs((fEvt+en3)->fTracks[k].fLabel)].fPdgCode)==13){// muon check
2909 Int_t MotherLabel3 = (fEvt+en3)->fMCtracks[abs((fEvt+en3)->fTracks[k].fLabel)].fMotherLabel;
2910 if(abs((fEvt+en3)->fMCtracks[MotherLabel3].fPdgCode)==211) {
2911 pionParent3=kTRUE;
2912 Pparent3[1] = (fEvt+en3)->fMCtracks[MotherLabel3].fPx; Pparent3[2] = (fEvt+en3)->fMCtracks[MotherLabel3].fPy; Pparent3[3] = (fEvt+en3)->fMCtracks[MotherLabel3].fPz;
2913 Pparent3[0] = sqrt(pow(Pparent3[1],2)+pow(Pparent3[2],2)+pow(Pparent3[3],2)+pow(fTrueMassPi,2));
2914 }
2915 }
2916
2917 parentQinv13 = GetQinv(Pparent1, Pparent3);
2918 parentQinv23 = GetQinv(Pparent2, Pparent3);
2919 parentQ3 = sqrt(pow(parentQinv12,2) + pow(parentQinv13,2) + pow(parentQinv23,2));
2920
2921 if(parentQinv12 > 0.001 && parentQinv13 > 0.001 && parentQinv23 > 0.001 && parentQ3 < 0.5){
2922 FilledMCtriplet123=kTRUE;
2923 if(pionParent1 || pionParent2 || pionParent3) {// want at least one pion-->muon
2924
2925 Float_t parentQinvGroup3[3]={parentQinv12, parentQinv13, parentQinv23};
2926 //Float_t parentkTGroup3[3]={float(sqrt(pow(Pparent1[1]+Pparent2[1],2) + pow(Pparent1[2]+Pparent2[2],2))/2.),
2927 //float(sqrt(pow(Pparent1[1]+Pparent3[1],2) + pow(Pparent1[2]+Pparent3[2],2))/2.),
2928 //float(sqrt(pow(Pparent2[1]+Pparent3[1],2) + pow(Pparent2[2]+Pparent3[2],2))/2.)};
2929 Float_t parentkTGroup3[3]={0};
2930
2931 ((TH2D*)fOutputList->FindObject("fAvgQ12VersusQ3"))->Fill(parentQ3, parentQinv12);
2932 ((TH2D*)fOutputList->FindObject("fAvgQ13VersusQ3"))->Fill(parentQ3, parentQinv13);
2933 ((TH2D*)fOutputList->FindObject("fAvgQ23VersusQ3"))->Fill(parentQ3, parentQinv23);
2934
5591748e 2935 for(Int_t term=1; term<=4; term++){
2936 if(term==1) {}
2937 else if(term==2) {if(!pionParent1 && !pionParent2) continue;}
2938 else if(term==3) {if(!pionParent1 && !pionParent3) continue;}
2939 else {if(!pionParent2 && !pionParent3) continue;}
be9ef9f9 2940 for(Int_t Riter=0; Riter<fRVALUES; Riter++){
78c3bd48 2941 Float_t Rvalue = fRstartMC+Riter;
be9ef9f9 2942 Float_t WInput = MCWeight3(term, Rvalue, 1.0, chGroup3, parentQinvGroup3, parentkTGroup3);
2943 Float_t WInputParentFSI = MCWeightFSI3(term, Rvalue, 1.0, chGroup3, parentQinvGroup3);
2944 Float_t WInputFSI = MCWeightFSI3(term, Rvalue, 1.0, chGroup3, QinvMCGroup3);
4bf06935 2945 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[0].EDB[0].ThreePT[term-1].fMuonSmeared->Fill(1, Rvalue, q3MC, WInput);
2946 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[0].EDB[0].ThreePT[term-1].fMuonIdeal->Fill(1, Rvalue, parentQ3, WInput);
2947 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[0].EDB[0].ThreePT[term-1].fMuonPionK3->Fill(1, Rvalue, q3MC, WInputFSI);
2948 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[0].EDB[0].ThreePT[term-1].fPionPionK3->Fill(1, Rvalue, parentQ3, WInputParentFSI);
5591748e 2949 //
4bf06935 2950 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[0].EDB[0].ThreePT[term-1].fMuonSmeared->Fill(2, Rvalue, q3MC);
2951 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[0].EDB[0].ThreePT[term-1].fMuonIdeal->Fill(2, Rvalue, parentQ3);
2952 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[0].EDB[0].ThreePT[term-1].fMuonPionK3->Fill(2, Rvalue, q3MC);
2953 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[0].EDB[0].ThreePT[term-1].fPionPionK3->Fill(2, Rvalue, parentQ3);
be9ef9f9 2954 }// Riter
2955 }// term loop
2956
2957 }// pion parent check
2958 }// parentQ check (muon correction)
4bf06935 2959
0207c034 2960
2961 Int_t indexq3 = q3 / 0.005;
2962 if(indexq3 >=35) indexq3=34;
78c3bd48 2963 Float_t WSpectrum = 1;
2964 if(fPbPbcase){
2965 WSpectrum = HIJINGq3WeightsSC[indexq3];
2966 if(ch1!=ch2 || ch1!=ch3) WSpectrum = HIJINGq3WeightsMC[indexq3];
2967 }
be9ef9f9 2968 // 3-pion momentum resolution
2969 for(Int_t term=1; term<=5; term++){
2970 for(Int_t Riter=0; Riter<fRVALUES; Riter++){
78c3bd48 2971 Float_t Rvalue = fRstartMC+Riter;
80507acf 2972 Float_t WInput = MCWeight3(term, Rvalue, ffcSqMRC, chGroup3, QinvMCGroup3, kTGroup3);
0207c034 2973 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[0].EDB[KT3index].ThreePT[term-1].fIdeal->Fill(Rvalue, q3MC, WInput*WSpectrum);
2974 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[0].EDB[KT3index].ThreePT[term-1].fSmeared->Fill(Rvalue, q3, WInput*WSpectrum);
be9ef9f9 2975 }
2976 }
2977
2978 }// 3rd particle label check
2979 }// MCcase and ENsum==6
2980
5591748e 2981
be9ef9f9 2982
2983
5591748e 2984 /////////////////////////////////////////////////////////////
be9ef9f9 2985 for (Int_t l=k+1; l<(fEvt+en4)->fNtracks; l++) {// 4th particle
b71263d0 2986 if(en4==0){
2987 if(fLowQPairSwitch_E0E0[i]->At(l)=='0') continue;
2988 if(fLowQPairSwitch_E0E0[j]->At(l)=='0') continue;
2989 if(fLowQPairSwitch_E0E0[k]->At(l)=='0') continue;
2990 }else if(en4==1){
6bb6954b 2991 if(en3==0){
2992 if(fLowQPairSwitch_E0E1[i]->At(l)=='0') continue;
2993 if(fLowQPairSwitch_E0E1[j]->At(l)=='0') continue;
2994 if(fLowQPairSwitch_E0E1[k]->At(l)=='0') continue;
2995 }else{
2996 if(fLowQPairSwitch_E0E1[i]->At(l)=='0') continue;
2997 if(fLowQPairSwitch_E0E1[j]->At(l)=='0') continue;
2998 if(fLowQPairSwitch_E1E1[k]->At(l)=='0') continue;
2999 }
b71263d0 3000 }else if(en4==2){
3001 if(fLowQPairSwitch_E0E2[i]->At(l)=='0') continue;
3002 if(fLowQPairSwitch_E0E2[j]->At(l)=='0') continue;
3003 if(fLowQPairSwitch_E1E2[k]->At(l)=='0') continue;
3004 }else{
3005 if(fLowQPairSwitch_E0E3[i]->At(l)=='0') continue;
3006 if(fLowQPairSwitch_E1E3[j]->At(l)=='0') continue;
3007 if(fLowQPairSwitch_E2E3[k]->At(l)=='0') continue;
be9ef9f9 3008 }
86528e76 3009 if((fEvt+en4)->fTracks[l].fPt < fMinPt) continue;
3010 if((fEvt+en4)->fTracks[l].fPt > fMaxPt) continue;
3011
be9ef9f9 3012 pVect4[0]=(fEvt+en4)->fTracks[l].fEaccepted;
3013 pVect4[1]=(fEvt+en4)->fTracks[l].fP[0];
3014 pVect4[2]=(fEvt+en4)->fTracks[l].fP[1];
3015 pVect4[3]=(fEvt+en4)->fTracks[l].fP[2];
3016 ch4 = Int_t(((fEvt+en4)->fTracks[l].fCharge + 1)/2.);
3017 qinv14 = GetQinv(pVect1, pVect4);
3018 qinv24 = GetQinv(pVect2, pVect4);
3019 qinv34 = GetQinv(pVect3, pVect4);
3020 q4 = sqrt(pow(q3,2) + pow(qinv14,2) + pow(qinv24,2) + pow(qinv34,2));
86528e76 3021 Int_t chGroup4[4]={ch1,ch2,ch3,ch4};
3022 Float_t QinvMCGroup4[6]={0};
3023 Float_t kTGroup4[6]={0};
3024
0207c034 3025 if(fMCcase){// for momentum resolution and muon correction
86528e76 3026 if((fEvt+en4)->fTracks[l].fLabel == (fEvt+en3)->fTracks[k].fLabel) continue;
3027 if((fEvt+en4)->fTracks[l].fLabel == (fEvt+en2)->fTracks[j].fLabel) continue;
3028 if((fEvt+en4)->fTracks[l].fLabel == (fEvt)->fTracks[i].fLabel) continue;
3029
3030 pVect4MC[0]=sqrt(pow((fEvt+en4)->fMCtracks[abs((fEvt+en4)->fTracks[l].fLabel)].fPtot,2)+pow(fTrueMassPi,2));
3031 pVect4MC[1]=(fEvt+en4)->fMCtracks[abs((fEvt+en4)->fTracks[l].fLabel)].fPx;
3032 pVect4MC[2]=(fEvt+en4)->fMCtracks[abs((fEvt+en4)->fTracks[l].fLabel)].fPy;
3033 pVect4MC[3]=(fEvt+en4)->fMCtracks[abs((fEvt+en4)->fTracks[l].fLabel)].fPz;
3034 qinv14MC = GetQinv(pVect1MC, pVect4MC);
3035 qinv24MC = GetQinv(pVect2MC, pVect4MC);
3036 qinv34MC = GetQinv(pVect3MC, pVect4MC);
3037
3038 QinvMCGroup4[0] = qinv12MC; QinvMCGroup4[1] = qinv13MC; QinvMCGroup4[2] = qinv14MC;
3039 QinvMCGroup4[3] = qinv23MC; QinvMCGroup4[4] = qinv24MC; QinvMCGroup4[5] = qinv34MC;
3040 //if(q4<0.1 && ENsum==0 && bin1==bin2 && bin1==bin3 && bin1==bin4) cout<<q4<<" "<<fRMax<<" "<<ffcSqMRC<<" "<<chGroup4[0]<<" "<<chGroup4[1]<<" "<<chGroup4[2]<<" "<<chGroup4[3]<<" "<<QinvMCGroup4[0]<<" "<<QinvMCGroup4[1]<<" "<<QinvMCGroup4[2]<<" "<<QinvMCGroup4[3]<<" "<<QinvMCGroup4[4]<<" "<<QinvMCGroup4[5]<<endl;
be9ef9f9 3041
86528e76 3042 }
be9ef9f9 3043 if(ch1==ch2 && ch1==ch3 && ch1==ch4 && ENsum==6){
3044 ((TH2D*)fOutputList->FindObject("DistQinv4pion"))->Fill(1, qinv12); ((TH2D*)fOutputList->FindObject("DistQinv4pion"))->Fill(2, qinv13);
3045 ((TH2D*)fOutputList->FindObject("DistQinv4pion"))->Fill(3, qinv14); ((TH2D*)fOutputList->FindObject("DistQinv4pion"))->Fill(4, qinv23);
3046 ((TH2D*)fOutputList->FindObject("DistQinv4pion"))->Fill(5, qinv24); ((TH2D*)fOutputList->FindObject("DistQinv4pion"))->Fill(6, qinv34);
3047 }
3048
3049 Float_t KT4 = sqrt(pow(pVect1[1]+pVect2[1]+pVect3[1]+pVect4[1],2) + pow(pVect1[2]+pVect2[2]+pVect3[2]+pVect4[2],2))/4.;
3050 if(KT4<=fKT4transition) KT4index=0;
3051 else KT4index=1;
3052
3053 FSICorr14 = FSICorrelation(ch1,ch4, qinv14);
3054 FSICorr24 = FSICorrelation(ch2,ch4, qinv24);
3055 FSICorr34 = FSICorrelation(ch3,ch4, qinv34);
80507acf 3056
3057 if(!fGenerateSignal && !fMCcase) {
3058 momBin14 = fMomResC2SC->GetYaxis()->FindBin(qinv14);
3059 momBin24 = fMomResC2SC->GetYaxis()->FindBin(qinv24);
3060 momBin34 = fMomResC2SC->GetYaxis()->FindBin(qinv34);
3061 if(momBin14 >= 20) momBin14 = 19;
3062 if(momBin24 >= 20) momBin24 = 19;
3063 if(momBin34 >= 20) momBin34 = 19;
3064 //
3065 if(ch1==ch4) MomResCorr14 = fMomResC2SC->GetBinContent(rBinForTPNMomRes, momBin14);
3066 else MomResCorr14 = fMomResC2MC->GetBinContent(rBinForTPNMomRes, momBin14);
3067 if(ch2==ch4) MomResCorr24 = fMomResC2SC->GetBinContent(rBinForTPNMomRes, momBin24);
3068 else MomResCorr24 = fMomResC2MC->GetBinContent(rBinForTPNMomRes, momBin24);
3069 if(ch3==ch4) MomResCorr34 = fMomResC2SC->GetBinContent(rBinForTPNMomRes, momBin34);
3070 else MomResCorr34 = fMomResC2MC->GetBinContent(rBinForTPNMomRes, momBin34);
3071 }
3072
6bb6954b 3073 Bool_t FillTerms[13]={kFALSE};
be9ef9f9 3074 SetFillBins4(ch1, ch2, ch3, ch4, bin1, bin2, bin3, bin4, ENsum, FillTerms);
3075 //
6bb6954b 3076 for(int ft=0; ft<13; ft++) {
be9ef9f9 3077 Float_t FSIfactor = 1.0;
80507acf 3078 Float_t MomResWeight = 1.0;
86528e76 3079 Float_t WInput = 1.0;
3080 if(fMCcase && fGenerateSignal) WInput = MCWeight4(ft+1, fRMax, ffcSqMRC, chGroup4, QinvMCGroup4, kTGroup4);
80507acf 3081 if(ft==0) {
3082 FSIfactor = 1/(FSICorr12 * FSICorr13 * FSICorr14 * FSICorr23 * FSICorr24 * FSICorr34);
3083 MomResWeight = MomResCorr12 * MomResCorr13 * MomResCorr14 * MomResCorr23 * MomResCorr24 * MomResCorr34;
3084 }else if(ft<=4) {
3085 FSIfactor = 1/(FSICorr12 * FSICorr13 * FSICorr23);
3086 MomResWeight = MomResCorr12 * MomResCorr13 * MomResCorr23;
3087 }else if(ft<=10) {
3088 FSIfactor = 1/(FSICorr12);
3089 MomResWeight = MomResCorr12;
3090 }else if(ft==11) {
3091 FSIfactor = 1/(FSICorr12 * FSICorr34);
3092 MomResWeight = MomResCorr12 * MomResCorr34;
3093 }else {FSIfactor = 1.0; MomResWeight = 1.0;}
be9ef9f9 3094 if(FillTerms[ft]) {
86528e76 3095 Charge1[bin1].Charge2[bin2].Charge3[bin3].Charge4[bin4].MB[fMbin].EDB[KT4index].FourPT[ft].fTerms4->Fill(q4, WInput);
3096 Charge1[bin1].Charge2[bin2].Charge3[bin3].Charge4[bin4].MB[fMbin].EDB[KT4index].FourPT[ft].fKfactor->Fill(q4, FSIfactor, WInput);
3097 Charge1[bin1].Charge2[bin2].Charge3[bin3].Charge4[bin4].MB[fMbin].EDB[KT4index].FourPT[ft].fKfactorWeighted->Fill(q4, FSIfactor, MomResWeight*WInput);
be9ef9f9 3098 }
3099 }
3100
3101 /////////////////////////////////////////////////////////////
3102 // r4{2}
0207c034 3103 if(ch1==ch2 && ch1==ch3 && ch1==ch4 && ENsum==6 && fPbPbcase){
6432c081 3104 Positive2ndTripletWeights=kTRUE;
3105 //
be9ef9f9 3106 GetWeight(pVect1, pVect4, weight14, weight14Err);
3107 GetWeight(pVect2, pVect4, weight24, weight24Err);
3108 GetWeight(pVect3, pVect4, weight34, weight34Err);
3109
5591748e 3110 Float_t MuonCorr14=1.0, MuonCorr24=1.0, MuonCorr34=1.0;
be9ef9f9 3111 if(!fGenerateSignal && !fMCcase) {
5591748e 3112 MuonCorr14 = fWeightmuonCorrection->GetBinContent(rBinForTPNMomRes, momBin14);
3113 MuonCorr24 = fWeightmuonCorrection->GetBinContent(rBinForTPNMomRes, momBin24);
3114 MuonCorr34 = fWeightmuonCorrection->GetBinContent(rBinForTPNMomRes, momBin34);
be9ef9f9 3115 }
5591748e 3116
3117 // no MRC, no Muon Correction
3118 weight14CC[0] = ((weight14+1) - ffcSq*FSICorr14 - (1-ffcSq));
3119 weight14CC[0] /= FSICorr14*ffcSq;
3120 weight24CC[0] = ((weight24+1) - ffcSq*FSICorr24 - (1-ffcSq));
3121 weight24CC[0] /= FSICorr24*ffcSq;
3122 weight34CC[0] = ((weight34+1) - ffcSq*FSICorr34 - (1-ffcSq));
3123 weight34CC[0] /= FSICorr34*ffcSq;
3124 if(weight14CC[0] > 0 && weight24CC[0] > 0 && weight34CC[0] > 0 && weight12CC[0] > 0 && weight13CC[0] > 0 && weight23CC[0] > 0){
3125 weightTotal = sqrt(weight12CC[0]*weight13CC[0]*weight24CC[0]*weight34CC[0]);
3126 weightTotal += sqrt(weight12CC[0]*weight14CC[0]*weight23CC[0]*weight34CC[0]);
3127 weightTotal += sqrt(weight13CC[0]*weight14CC[0]*weight23CC[0]*weight24CC[0]);
3128 weightTotal /= 3.;
3129 Charge1[bin1].Charge2[bin2].Charge3[bin3].Charge4[bin4].MB[fMbin].EDB[KT4index].FourPT[12].fTwoPartNorm->Fill(1, q4, weightTotal);
3130 }
3131 // no Muon Correction
3132 weight14CC[1] = ((weight14+1)*MomResCorr14 - ffcSq*FSICorr14 - (1-ffcSq));
3133 weight14CC[1] /= FSICorr14*ffcSq;
3134 weight24CC[1] = ((weight24+1)*MomResCorr24 - ffcSq*FSICorr24 - (1-ffcSq));
3135 weight24CC[1] /= FSICorr24*ffcSq;
3136 weight34CC[1] = ((weight34+1)*MomResCorr34 - ffcSq*FSICorr34 - (1-ffcSq));
3137 weight34CC[1] /= FSICorr34*ffcSq;
3138 if(weight14CC[1] > 0 && weight24CC[1] > 0 && weight34CC[1] > 0 && weight12CC[1] > 0 && weight13CC[1] > 0 && weight23CC[1] > 0){
3139 weightTotal = sqrt(weight12CC[1]*weight13CC[1]*weight24CC[1]*weight34CC[1]);
3140 weightTotal += sqrt(weight12CC[1]*weight14CC[1]*weight23CC[1]*weight34CC[1]);
3141 weightTotal += sqrt(weight13CC[1]*weight14CC[1]*weight23CC[1]*weight24CC[1]);
3142 weightTotal /= 3.;
3143 Charge1[bin1].Charge2[bin2].Charge3[bin3].Charge4[bin4].MB[fMbin].EDB[KT4index].FourPT[12].fTwoPartNorm->Fill(2, q4, weightTotal);
3144 }
3145 // both corrections
3146 weight14CC[2] = ((weight14+1)*MomResCorr14 - ffcSq*FSICorr14 - (1-ffcSq));
3147 weight14CC[2] /= FSICorr14*ffcSq;
3148 weight14CC[2] *= MuonCorr14;
3149 weight24CC[2] = ((weight24+1)*MomResCorr24 - ffcSq*FSICorr24 - (1-ffcSq));
3150 weight24CC[2] /= FSICorr24*ffcSq;
3151 weight24CC[2] *= MuonCorr24;
3152 weight34CC[2] = ((weight34+1)*MomResCorr34 - ffcSq*FSICorr34 - (1-ffcSq));
3153 weight34CC[2] /= FSICorr34*ffcSq;
3154 weight34CC[2] *= MuonCorr34;
3155
3156 if(weight14CC[2] < 0 || weight24CC[2] < 0 || weight34CC[2] < 0) {// C2^QS can never be less than unity
3157 if(fMbin==0 && bin1==0 && KT4index==0) {
3158 ((TH1D*)fOutputList->FindObject("fTPNRejects4pion1"))->Fill(q4, sqrt(fabs(weight12CC[2]*weight23CC[2]*weight34CC[2]*weight14CC[2])));
be9ef9f9 3159 }
6432c081 3160 if(weight14CC[2] < 0) weight14CC[2]=0;
3161 if(weight24CC[2] < 0) weight24CC[2]=0;
3162 if(weight34CC[2] < 0) weight34CC[2]=0;
3163 Positive2ndTripletWeights=kFALSE;
3164 }
3165 /////////////////////////////////////////////////////
3166 weightTotal = sqrt(weight12CC[2]*weight13CC[2]*weight24CC[2]*weight34CC[2]);
3167 weightTotal += sqrt(weight12CC[2]*weight14CC[2]*weight23CC[2]*weight34CC[2]);
3168 weightTotal += sqrt(weight13CC[2]*weight14CC[2]*weight23CC[2]*weight24CC[2]);
3169 weightTotal /= 3.;
3170 if(Positive1stTripletWeights && Positive2ndTripletWeights){
5591748e 3171 Charge1[bin1].Charge2[bin2].Charge3[bin3].Charge4[bin4].MB[fMbin].EDB[KT4index].FourPT[12].fTwoPartNorm->Fill(3, q4, weightTotal);
ab890ec3 3172 Charge1[bin1].Charge2[bin2].Charge3[bin3].Charge4[bin4].MB[fMbin].EDB[KT4index].FourPT[12].fTwoPartNorm->Fill(4, q4, 1);
6432c081 3173 }else{
3174 Charge1[bin1].Charge2[bin2].Charge3[bin3].Charge4[bin4].MB[fMbin].EDB[KT4index].FourPT[12].fTwoPartNegNorm->Fill(4, q4, 1);
3175 }
3176 // Full Weight reconstruction
3177 for(Int_t RcohIndex=0; RcohIndex<2; RcohIndex++){// Rcoh=0, then Rcoh=Rch
86528e76 3178 for(Int_t GIndex=0; GIndex<50; GIndex++){// 20 is enough
9c0557fb 3179 Int_t FillBin = 5 + RcohIndex*50 + GIndex;
6432c081 3180 Float_t G = 0.02*GIndex;
3181 if(RcohIndex==0){// Rcoh=0
3182 Float_t a = pow(1-G,2);
3183 Float_t b = 2*G*(1-G);
3184 T12 = (-b + sqrt(pow(b,2) + 4*a*weight12CC[2])) / (2*a);
3185 T13 = (-b + sqrt(pow(b,2) + 4*a*weight13CC[2])) / (2*a);
3186 T14 = (-b + sqrt(pow(b,2) + 4*a*weight14CC[2])) / (2*a);
3187 T23 = (-b + sqrt(pow(b,2) + 4*a*weight23CC[2])) / (2*a);
3188 T24 = (-b + sqrt(pow(b,2) + 4*a*weight24CC[2])) / (2*a);
3189 T34 = (-b + sqrt(pow(b,2) + 4*a*weight34CC[2])) / (2*a);
3190 weightTotal = 2*G*(1-G)*(T12 + T13 + T14 + T23 + T24 + T34) + pow(1-G,2)*(T12*T12 + T13*T13 + T14*T14 + T23*T23 + T24*T24 + T34*T34);// 2-pion
3191 weightTotal += 2*G*pow(1-G,3)*(T12*T34*T34 + T12*T12*T34 + T13*T24*T24 + T13*T13*T24 + T14*T23*T23 + T14*T14*T23);// 2-pair
3192 weightTotal += pow(1-G,4)*(pow(T12,2)*pow(T34,2) + pow(T13,2)*pow(T24,2) + pow(T14,2)*pow(T23,2));// 2-pair fully chaotic
3193 weightTotal += 2*G*pow(1-G,2)*(T12*T13 + T12*T23 + T13*T23 + T12*T14 + T12*T24 + T14*T24);// 3-pion
3194 weightTotal += 2*G*pow(1-G,2)*(T13*T14 + T13*T34 + T14*T34 + T23*T24 + T23*T34 + T24*T34);// 3-pion
3195 weightTotal += 2*pow(1-G,3)*(T12*T13*T23 + T12*T14*T24 + T13*T14*T34 + T23*T24*T34);// 3-pion fully chaotic
3196 weightTotal += 2*G*pow(1-G,3)*(T12*T14*T34 + T12*T14*T23 + T12*T23*T34 + T14*T23*T34);// 4-pion
3197 weightTotal += 2*G*pow(1-G,3)*(T12*T13*T34 + T12*T34*T24 + T12*T24*T13 + T13*T24*T34);// 4-pion
3198 weightTotal += 2*G*pow(1-G,3)*(T14*T13*T23 + T14*T13*T24 + T13*T23*T24 + T14*T24*T23);// 4-pion
3199 weightTotal += 2*pow(1-G,4)*(T12*T13*T24*T34 + T12*T14*T23*T34 + T13*T14*T23*T24);// 4-pion fully chaotic
3200 }else{// Rcoh=Rch
95567836 3201 T12 = sqrt(weight12CC[2] / (1-G*G));
3202 T13 = sqrt(weight13CC[2] / (1-G*G));
3203 T14 = sqrt(weight14CC[2] / (1-G*G));
3204 T23 = sqrt(weight23CC[2] / (1-G*G));
3205 T24 = sqrt(weight24CC[2] / (1-G*G));
3206 T34 = sqrt(weight34CC[2] / (1-G*G));
3207 weightTotal = (1-G*G)*(T12*T12 + T13*T13 + T14*T14 + T23*T23 + T24*T24 + T34*T34);// 2-pion
3208 weightTotal += (4*G*pow(1-G,3)+pow(1-G,4))*(pow(T12,2)*pow(T34,2) + pow(T13,2)*pow(T24,2) + pow(T14,2)*pow(T23,2));// 2-pair
3209 weightTotal += (6*G*pow(1-G,2) + 2*pow(1-G,3))*(T12*T13*T23);// 3-pion
3210 weightTotal += (6*G*pow(1-G,2) + 2*pow(1-G,3))*(T12*T14*T24);// 3-pion
3211 weightTotal += (6*G*pow(1-G,2) + 2*pow(1-G,3))*(T13*T14*T34);// 3-pion
3212 weightTotal += (6*G*pow(1-G,2) + 2*pow(1-G,3))*(T23*T24*T34);// 3-pion
3213 weightTotal += (8*G*pow(1-G,3) + 2*pow(1-G,4))*(T12*T13*T24*T34);// 4-pion
3214 weightTotal += (8*G*pow(1-G,3) + 2*pow(1-G,4))*(T12*T14*T23*T34);// 4-pion
3215 weightTotal += (8*G*pow(1-G,3) + 2*pow(1-G,4))*(T13*T14*T23*T24);// 4-pion
6432c081 3216 }
3217 if(Positive1stTripletWeights && Positive2ndTripletWeights){
ab890ec3 3218 Charge1[bin1].Charge2[bin2].Charge3[bin3].Charge4[bin4].MB[fMbin].EDB[KT4index].FourPT[12].fTwoPartNorm->Fill(FillBin, q4, weightTotal);
6432c081 3219 }else{
3220 Charge1[bin1].Charge2[bin2].Charge3[bin3].Charge4[bin4].MB[fMbin].EDB[KT4index].FourPT[12].fTwoPartNegNorm->Fill(FillBin, q4, weightTotal);
ab890ec3 3221 }
3222 }
6432c081 3223 }
3224 // stat errors
3225 /*weight14CC_e = weight14Err*MomResCorr14 / FSICorr14 / ffcSq * MuonCorr14;
43046300 3226 weight24CC_e = weight24Err*MomResCorr24 / FSICorr24 / ffcSq * MuonCorr24;
3227 weight34CC_e = weight34Err*MomResCorr34 / FSICorr34 / ffcSq * MuonCorr34;
3228 if(weight12CC[2]*weight13CC[2]*weight24CC[2]*weight34CC[2] > 0){
6432c081 3229 weightTotalErr = pow( 6 * 2 * weight12CC_e*weight13CC[2]*weight24CC[2]*weight34CC[2] / sqrt(weight12CC[2]*weight13CC[2]*weight24CC[2]*weight34CC[2]),2);
43046300 3230 }
3231 if(weight12CC[2]*weight13CC[2]*weight23CC[2] > 0){
6432c081 3232 weightTotalErr += pow( 8 * sqrt(3) * weight12CC_e*weight13CC[2]*weight23CC[2] / sqrt(weight12CC[2]*weight13CC[2]*weight23CC[2]),2);
43046300 3233 }
3234 weightTotalErr += 2*(pow(weight12CC_e*weight34CC[2],2) + pow(weight13CC_e*weight24CC[2],2) + pow(weight14CC_e*weight23CC[2],2));
3235 weightTotalErr += pow(weight12CC_e,2) + pow(weight13CC_e,2) + pow(weight14CC_e,2) + pow(weight23CC_e,2) + pow(weight24CC_e,2) + pow(weight34CC_e,2);
3236 Charge1[bin1].Charge2[bin2].Charge3[bin3].Charge4[bin4].MB[fMbin].EDB[KT4index].FourPT[12].fTwoPartNormErr->Fill(4, q4, weightTotalErr);
6432c081 3237 */
42802bba 3238 if(fMbin==0 && KT4index==0){
3239 for(Int_t Rindex=0; Rindex<7; Rindex++){
3240 Float_t R = (6. + Rindex)/FmToGeV;
3241 Float_t arg12=qinv12*R;
3242 Float_t arg13=qinv13*R;
3243 Float_t arg14=qinv14*R;
3244 Float_t arg23=qinv23*R;
3245 Float_t arg24=qinv24*R;
3246 Float_t arg34=qinv34*R;
3247 // Exchange Amplitudes
3248 Float_t EA12 = exp(-pow(arg12,2)/2.)*(1 + kappa3Fit/(6.*pow(2.,1.5))*(8.*pow(arg12,3) - 12.*arg12) + kappa4Fit/(24.*pow(2.,2))*(16.*pow(arg12,4) -48.*pow(arg12,2) + 12));
3249 Float_t EA13 = exp(-pow(arg13,2)/2.)*(1 + kappa3Fit/(6.*pow(2.,1.5))*(8.*pow(arg13,3) - 12.*arg13) + kappa4Fit/(24.*pow(2.,2))*(16.*pow(arg13,4) -48.*pow(arg13,2) + 12));
3250 Float_t EA14 = exp(-pow(arg14,2)/2.)*(1 + kappa3Fit/(6.*pow(2.,1.5))*(8.*pow(arg14,3) - 12.*arg14) + kappa4Fit/(24.*pow(2.,2))*(16.*pow(arg14,4) -48.*pow(arg14,2) + 12));
3251 Float_t EA23 = exp(-pow(arg23,2)/2.)*(1 + kappa3Fit/(6.*pow(2.,1.5))*(8.*pow(arg23,3) - 12.*arg23) + kappa4Fit/(24.*pow(2.,2))*(16.*pow(arg23,4) -48.*pow(arg23,2) + 12));
3252 Float_t EA24 = exp(-pow(arg24,2)/2.)*(1 + kappa3Fit/(6.*pow(2.,1.5))*(8.*pow(arg24,3) - 12.*arg24) + kappa4Fit/(24.*pow(2.,2))*(16.*pow(arg24,4) -48.*pow(arg24,2) + 12));
3253 Float_t EA34 = exp(-pow(arg34,2)/2.)*(1 + kappa3Fit/(6.*pow(2.,1.5))*(8.*pow(arg34,3) - 12.*arg34) + kappa4Fit/(24.*pow(2.,2))*(16.*pow(arg34,4) -48.*pow(arg34,2) + 12));
3254 //
3255 Float_t TotalCorrelation = 1 + 2*(EA12*EA13*EA24*EA34 + EA12*EA14*EA23*EA34 + EA13*EA14*EA23*EA24);
3256 ((TH2D*)fOutputList->FindObject("fc4QSFitNum"))->Fill(Rindex+1, q4, TotalCorrelation);
3257 ((TH2D*)fOutputList->FindObject("fc4QSFitDen"))->Fill(Rindex+1, q4);
3258 }
3259 }
3260 }// SC and ENsum=6
be9ef9f9 3261 /////////////////////////////////////////////////////////////
6bb6954b 3262
4bf06935 3263 if(ch1==ch2 && ch1==ch3 && ch1==ch4){
3264 Float_t pt1=sqrt(pow(pVect1[1],2)+pow(pVect1[2],2));
3265 Float_t pt2=sqrt(pow(pVect2[1],2)+pow(pVect2[2],2));
3266 Float_t pt3=sqrt(pow(pVect3[1],2)+pow(pVect3[2],2));
3267 Float_t pt4=sqrt(pow(pVect4[1],2)+pow(pVect4[2],2));
3268 if(ENsum==0){
3269 ((TH3D*)fOutputList->FindObject("fKT4DistTerm1"))->Fill(fMbin+1, KT4, q4);
3270 if(q4<0.105){
3271 ((TProfile2D*)fOutputList->FindObject("fKT4AvgpT"))->Fill(fMbin+1, KT4index, pt1);
3272 ((TProfile2D*)fOutputList->FindObject("fKT4AvgpT"))->Fill(fMbin+1, KT4index, pt2);
3273 ((TProfile2D*)fOutputList->FindObject("fKT4AvgpT"))->Fill(fMbin+1, KT4index, pt3);
3274 ((TProfile2D*)fOutputList->FindObject("fKT4AvgpT"))->Fill(fMbin+1, KT4index, pt4);
9c0557fb 3275 }
be9ef9f9 3276 }
4bf06935 3277 if(fMbin==0){
3278 if(ENsum==0){
3279 ((TH3D*)fOutputList->FindObject("fQ4AvgpTENsum0"))->Fill(KT4index, q4, pt1);
3280 ((TH3D*)fOutputList->FindObject("fQ4AvgpTENsum0"))->Fill(KT4index, q4, pt2);
3281 ((TH3D*)fOutputList->FindObject("fQ4AvgpTENsum0"))->Fill(KT4index, q4, pt3);
3282 ((TH3D*)fOutputList->FindObject("fQ4AvgpTENsum0"))->Fill(KT4index, q4, pt4);
3283 }else if(ENsum==1){
3284 ((TH3D*)fOutputList->FindObject("fQ4AvgpTENsum1"))->Fill(KT4index, q4, pt1);
3285 ((TH3D*)fOutputList->FindObject("fQ4AvgpTENsum1"))->Fill(KT4index, q4, pt2);
3286 ((TH3D*)fOutputList->FindObject("fQ4AvgpTENsum1"))->Fill(KT4index, q4, pt3);
3287 ((TH3D*)fOutputList->FindObject("fQ4AvgpTENsum1"))->Fill(KT4index, q4, pt4);
3288 }else if(ENsum==2){
3289 ((TH3D*)fOutputList->FindObject("fQ4AvgpTENsum2"))->Fill(KT4index, q4, pt1);
3290 ((TH3D*)fOutputList->FindObject("fQ4AvgpTENsum2"))->Fill(KT4index, q4, pt2);
3291 ((TH3D*)fOutputList->FindObject("fQ4AvgpTENsum2"))->Fill(KT4index, q4, pt3);
3292 ((TH3D*)fOutputList->FindObject("fQ4AvgpTENsum2"))->Fill(KT4index, q4, pt4);
3293 }else if(ENsum==3){
3294 ((TH3D*)fOutputList->FindObject("fQ4AvgpTENsum3"))->Fill(KT4index, q4, pt1);
3295 ((TH3D*)fOutputList->FindObject("fQ4AvgpTENsum3"))->Fill(KT4index, q4, pt2);
3296 ((TH3D*)fOutputList->FindObject("fQ4AvgpTENsum3"))->Fill(KT4index, q4, pt3);
3297 ((TH3D*)fOutputList->FindObject("fQ4AvgpTENsum3"))->Fill(KT4index, q4, pt4);
3298 }else{// 6
3299 ((TH3D*)fOutputList->FindObject("fQ4AvgpTENsum6"))->Fill(KT4index, q4, pt1);
3300 ((TH3D*)fOutputList->FindObject("fQ4AvgpTENsum6"))->Fill(KT4index, q4, pt2);
3301 ((TH3D*)fOutputList->FindObject("fQ4AvgpTENsum6"))->Fill(KT4index, q4, pt3);
3302 ((TH3D*)fOutputList->FindObject("fQ4AvgpTENsum6"))->Fill(KT4index, q4, pt4);
3303 }
3304
3305 }
be9ef9f9 3306 }
4bf06935 3307
6bb6954b 3308 if(ch1==ch2 && ch1==ch3 && ch1==ch4 && ENsum==6) ((TH3D*)fOutputList->FindObject("fKT4DistTerm13"))->Fill(fMbin+1, KT4, q4);
3309
be9ef9f9 3310
3311 // momenumtum resolution and muon corrections
3312 if(fMCcase && ENsum==6 && FilledMCtriplet123){// for momentum resolution and muon correction
3313 if((fEvt+en4)->fTracks[l].fLabel < (fEvt+en4)->fMCarraySize){
3314
3315 pVect4MC[0]=sqrt(pow((fEvt+en4)->fMCtracks[abs((fEvt+en4)->fTracks[l].fLabel)].fPtot,2)+pow(fTrueMassPi,2));
3316 pVect4MC[1]=(fEvt+en4)->fMCtracks[abs((fEvt+en4)->fTracks[l].fLabel)].fPx;
3317 pVect4MC[2]=(fEvt+en4)->fMCtracks[abs((fEvt+en4)->fTracks[l].fLabel)].fPy;
3318 pVect4MC[3]=(fEvt+en4)->fMCtracks[abs((fEvt+en4)->fTracks[l].fLabel)].fPz;
3319 qinv14MC = GetQinv(pVect1MC, pVect4MC);
3320 qinv24MC = GetQinv(pVect2MC, pVect4MC);
3321 qinv34MC = GetQinv(pVect3MC, pVect4MC);
3322
3323 q4MC = sqrt(pow(q3MC,2) + pow(qinv14MC,2) + pow(qinv24MC,2) + pow(qinv34MC,2));
3324 if(q4<0.1 && ch1==ch2 && ch1==ch3 && ch1==ch4) ((TH2D*)fOutputList->FindObject("fQ4Res"))->Fill(KT4, q4-q4MC);
3325 if(ch1==ch2 && ch1==ch3 && ch1==ch4) {
5591748e 3326 ((TH2D*)fOutputList->FindObject("DistQinvMC4pion"))->Fill(1, qinv12MC); ((TH2D*)fOutputList->FindObject("DistQinvMC4pion"))->Fill(2, qinv13MC);
3327 ((TH2D*)fOutputList->FindObject("DistQinvMC4pion"))->Fill(3, qinv14MC); ((TH2D*)fOutputList->FindObject("DistQinvMC4pion"))->Fill(4, qinv23MC);
be9ef9f9 3328 ((TH2D*)fOutputList->FindObject("DistQinvMC4pion"))->Fill(5, qinv24MC); ((TH2D*)fOutputList->FindObject("DistQinvMC4pion"))->Fill(6, qinv34MC);
3329 }
fac2d84b 3330
4bf06935 3331 //Float_t QuadWeightTTC=1.0;// same-charge weights to mimic two-track depletion of same-charge pairs
fac2d84b 3332 //if(ch1==ch2 && qinv12>0.006) QuadWeightTTC *= SCpairWeight->Eval(qinv12);
3333 //if(ch1==ch3 && qinv13>0.006) QuadWeightTTC *= SCpairWeight->Eval(qinv13);
3334 //if(ch1==ch4 && qinv14>0.006) QuadWeightTTC *= SCpairWeight->Eval(qinv14);
3335 //if(ch2==ch3 && qinv23>0.006) QuadWeightTTC *= SCpairWeight->Eval(qinv23);
3336 //if(ch2==ch4 && qinv24>0.006) QuadWeightTTC *= SCpairWeight->Eval(qinv24);
3337 //if(ch3==ch4 && qinv34>0.006) QuadWeightTTC *= SCpairWeight->Eval(qinv34);
3338
3339
86528e76 3340
be9ef9f9 3341 Pparent4[0]=pVect4MC[0]; Pparent4[1]=pVect4MC[1]; Pparent4[2]=pVect4MC[2]; Pparent4[3]=pVect4MC[3];
3342 pionParent4=kFALSE;
3343 if(abs((fEvt+en4)->fMCtracks[abs((fEvt+en4)->fTracks[l].fLabel)].fPdgCode)==13){// muon check
3344 Int_t MotherLabel4 = (fEvt+en4)->fMCtracks[abs((fEvt+en4)->fTracks[l].fLabel)].fMotherLabel;
3345 if(abs((fEvt+en4)->fMCtracks[MotherLabel4].fPdgCode)==211) {
3346 pionParent4=kTRUE;
3347 Pparent4[1] = (fEvt+en4)->fMCtracks[MotherLabel4].fPx; Pparent4[2] = (fEvt+en4)->fMCtracks[MotherLabel4].fPy; Pparent4[3] = (fEvt+en4)->fMCtracks[MotherLabel4].fPz;
3348 Pparent4[0] = sqrt(pow(Pparent4[1],2)+pow(Pparent4[2],2)+pow(Pparent4[3],2)+pow(fTrueMassPi,2));
3349 }
3350 }
3351
3352 parentQinv14 = GetQinv(Pparent1, Pparent4);
3353 parentQinv24 = GetQinv(Pparent2, Pparent4);
3354 parentQinv34 = GetQinv(Pparent3, Pparent4);
3355 Float_t parentQ4 = sqrt(pow(parentQ3,2) + pow(parentQinv14,2) + pow(parentQinv24,2) + pow(parentQinv34,2));
3356
3357 if(parentQinv14 > 0.001 && parentQinv24 > 0.001 && parentQinv34 > 0.001 && parentQ4 < 0.5){
3358 if(pionParent1 || pionParent2 || pionParent3 || pionParent4) {// want at least one pion-->muon
3359
5591748e 3360 if(pionParent1) ((TH1D*)fOutputList->FindObject("fDistPionParents4"))->Fill(1);
3361 if(pionParent2) ((TH1D*)fOutputList->FindObject("fDistPionParents4"))->Fill(2);
3362 if(pionParent3) ((TH1D*)fOutputList->FindObject("fDistPionParents4"))->Fill(3);
3363 if(pionParent4) ((TH1D*)fOutputList->FindObject("fDistPionParents4"))->Fill(4);
be9ef9f9 3364 Float_t parentQinvGroup4[6]={parentQinv12, parentQinv13, parentQinv14, parentQinv23, parentQinv24, parentQinv34};
3365 Float_t parentkTGroup4[6]={0};
3366
5591748e 3367 for(Int_t term=1; term<=12; term++){
3368 if(term==1) {}
3369 else if(term==2) {if(!pionParent1 && !pionParent2 && !pionParent3) continue;}
3370 else if(term==3) {if(!pionParent1 && !pionParent2 && !pionParent4) continue;}
3371 else if(term==4) {if(!pionParent1 && !pionParent3 && !pionParent4) continue;}
3372 else if(term==5) {if(!pionParent2 && !pionParent3 && !pionParent4) continue;}
3373 else if(term==6) {if(!pionParent1 && !pionParent2) continue;}
3374 else if(term==7) {if(!pionParent1 && !pionParent3) continue;}
3375 else if(term==8) {if(!pionParent1 && !pionParent4) continue;}
3376 else if(term==9) {if(!pionParent2 && !pionParent3) continue;}
3377 else if(term==10) {if(!pionParent2 && !pionParent4) continue;}
3378 else if(term==11) {if(!pionParent3 && !pionParent4) continue;}
3379 else {}
be9ef9f9 3380 for(Int_t Riter=0; Riter<fRVALUES; Riter++){
78c3bd48 3381 Float_t Rvalue = fRstartMC+Riter;
be9ef9f9 3382 Float_t WInput = MCWeight4(term, Rvalue, 1.0, chGroup4, parentQinvGroup4, parentkTGroup4);
3383 Float_t WInputParentFSI = MCWeightFSI4(term, Rvalue, 1.0, chGroup4, parentQinvGroup4);
3384 Float_t WInputFSI = MCWeightFSI4(term, Rvalue, 1.0, chGroup4, QinvMCGroup4);
4bf06935 3385 Charge1[bin1].Charge2[bin2].Charge3[bin3].Charge4[bin4].MB[0].EDB[0].FourPT[term-1].fMuonSmeared->Fill(1, Rvalue, q4MC, WInput);
3386 Charge1[bin1].Charge2[bin2].Charge3[bin3].Charge4[bin4].MB[0].EDB[0].FourPT[term-1].fMuonIdeal->Fill(1, Rvalue, parentQ4, WInput);
3387 Charge1[bin1].Charge2[bin2].Charge3[bin3].Charge4[bin4].MB[0].EDB[0].FourPT[term-1].fMuonPionK4->Fill(1, Rvalue, q4MC, WInputFSI);
3388 Charge1[bin1].Charge2[bin2].Charge3[bin3].Charge4[bin4].MB[0].EDB[0].FourPT[term-1].fPionPionK4->Fill(1, Rvalue, parentQ4, WInputParentFSI);
5591748e 3389 //
4bf06935 3390 Charge1[bin1].Charge2[bin2].Charge3[bin3].Charge4[bin4].MB[0].EDB[0].FourPT[term-1].fMuonSmeared->Fill(2, Rvalue, q4MC);
3391 Charge1[bin1].Charge2[bin2].Charge3[bin3].Charge4[bin4].MB[0].EDB[0].FourPT[term-1].fMuonIdeal->Fill(2, Rvalue, parentQ4);
3392 Charge1[bin1].Charge2[bin2].Charge3[bin3].Charge4[bin4].MB[0].EDB[0].FourPT[term-1].fMuonPionK4->Fill(2, Rvalue, q4MC);
3393 Charge1[bin1].Charge2[bin2].Charge3[bin3].Charge4[bin4].MB[0].EDB[0].FourPT[term-1].fPionPionK4->Fill(2, Rvalue, parentQ4);
be9ef9f9 3394 }// Riter
3395 }// term loop
3396
3397 }// pion parent check
3398 }// parentQ check (muon correction)
4bf06935 3399
0207c034 3400 Int_t indexq4 = q4 / 0.005;
3401 if(indexq4 >=50) indexq4=49;
78c3bd48 3402 Float_t WSpectrum = 1.0;
3403 if(fPbPbcase){
3404 WSpectrum = HIJINGq4WeightsSC[indexq4];
3405 if((ch1+ch2+ch3+ch4)==3 || (ch1+ch2+ch3+ch4)==1) WSpectrum = HIJINGq4WeightsMC1[indexq4];
3406 if((ch1+ch2+ch3+ch4)==2) WSpectrum = HIJINGq4WeightsMC2[indexq4];
3407 }
be9ef9f9 3408 // 4-pion momentum resolution
6bb6954b 3409 for(Int_t term=1; term<=13; term++){
be9ef9f9 3410 for(Int_t Riter=0; Riter<fRVALUES; Riter++){
78c3bd48 3411 Float_t Rvalue = fRstartMC+Riter;
80507acf 3412 Float_t WInput = MCWeight4(term, Rvalue, ffcSqMRC, chGroup4, QinvMCGroup4, kTGroup4);
0207c034 3413 Charge1[bin1].Charge2[bin2].Charge3[bin3].Charge4[bin4].MB[0].EDB[KT4index].FourPT[term-1].fIdeal->Fill(Rvalue, q4MC, WInput*WSpectrum);
3414 Charge1[bin1].Charge2[bin2].Charge3[bin3].Charge4[bin4].MB[0].EDB[KT4index].FourPT[term-1].fSmeared->Fill(Rvalue, q4, WInput*WSpectrum);
be9ef9f9 3415 }
3416 }
0207c034 3417
be9ef9f9 3418 }// label check particle 4
3419 }// MCcase
3420
3421 }// 4th particle
3422 }// 3rd particle
3423 }// 2nd particle
3424 }// 1st particle
3425
3426 }// en4
3427 }// en3
3428 }// en2
3429
3430
3431
3432
3433
3434
3435
3436 // Post output data.
3437 PostData(1, fOutputList);
3438
3439}
3440//________________________________________________________________________
3441void AliFourPion::Terminate(Option_t *)
3442{
3443 // Called once at the end of the query
3444
3445 cout<<"Done"<<endl;
3446
3447}
3448//________________________________________________________________________
3449Bool_t AliFourPion::AcceptPair(AliFourPionTrackStruct first, AliFourPionTrackStruct second)
3450{
3451
3452 if(fabs(first.fEta-second.fEta) > fMinSepPairEta) return kTRUE;
3453
3454 // propagate through B field to r=1m
3455 Float_t phi1 = first.fPhi - asin(first.fCharge*(0.1*fBfield)*0.15/first.fPt);// 0.15 for D=1m
3456 if(phi1 > 2*PI) phi1 -= 2*PI;
3457 if(phi1 < 0) phi1 += 2*PI;
3458 Float_t phi2 = second.fPhi - asin(second.fCharge*(0.1*fBfield)*0.15/second.fPt);// 0.15 for D=1m
3459 if(phi2 > 2*PI) phi2 -= 2*PI;
3460 if(phi2 < 0) phi2 += 2*PI;
3461
3462 Float_t deltaphi = phi1 - phi2;
3463 if(deltaphi > PI) deltaphi -= 2*PI;
3464 if(deltaphi < -PI) deltaphi += 2*PI;
3465 deltaphi = fabs(deltaphi);
3466
3467 if(deltaphi < fMinSepPairPhi) return kFALSE;// Min Separation
3468
3469
3470 // propagate through B field to r=1.6m
3471 phi1 = first.fPhi - asin(first.fCharge*(0.1*fBfield)*0.24/first.fPt);// mine. 0.24 for D=1.6m
3472 if(phi1 > 2*PI) phi1 -= 2*PI;
3473 if(phi1 < 0) phi1 += 2*PI;
3474 phi2 = second.fPhi - asin(second.fCharge*(0.1*fBfield)*0.24/second.fPt);// mine. 0.24 for D=1.6m
3475 if(phi2 > 2*PI) phi2 -= 2*PI;
3476 if(phi2 < 0) phi2 += 2*PI;
3477
3478 deltaphi = phi1 - phi2;
3479 if(deltaphi > PI) deltaphi -= 2*PI;
3480 if(deltaphi < -PI) deltaphi += 2*PI;
3481 deltaphi = fabs(deltaphi);
3482
3483 if(deltaphi < fMinSepPairPhi) return kFALSE;// Min Separation
3484
3485
3486
3487 //
3488
42802bba 3489 /* Int_t ncl1 = first.fClusterMap.GetNbits();
be9ef9f9 3490 Int_t ncl2 = second.fClusterMap.GetNbits();
3491 Int_t sumCls = 0; Int_t sumSha = 0; Int_t sumQ = 0;
3492 Double_t shfrac = 0; Double_t qfactor = 0;
3493 for(Int_t imap = 0; imap < ncl1 && imap < ncl2; imap++) {
3494 if (first.fClusterMap.TestBitNumber(imap) && second.fClusterMap.TestBitNumber(imap)) {// Both clusters
3495 if (first.fSharedMap.TestBitNumber(imap) && second.fSharedMap.TestBitNumber(imap)) { // Shared
3496 sumQ++;
3497 sumCls+=2;
3498 sumSha+=2;}
3499 else {sumQ--; sumCls+=2;}
3500 }
3501 else if (first.fClusterMap.TestBitNumber(imap) || second.fClusterMap.TestBitNumber(imap)) {// Non shared
3502 sumQ++;
3503 sumCls++;}
3504 }
3505 if (sumCls>0) {
3506 qfactor = sumQ*1.0/sumCls;
3507 shfrac = sumSha*1.0/sumCls;
3508 }
3509
3510 if(qfactor > fShareQuality || shfrac > fShareFraction) return kFALSE;
42802bba 3511 */
be9ef9f9 3512
3513 return kTRUE;
3514
3515
fac2d84b 3516}
3517//________________________________________________________________________
3518Bool_t AliFourPion::AcceptPairPM(AliFourPionTrackStruct first, AliFourPionTrackStruct second)
3519{// optional pair cuts for +- pairs
3520
3521 if(fabs(first.fEta-second.fEta) > fMinSepPairEta) return kTRUE;
3522
3523 // propagate through B field to r=1m
3524 Float_t phi1 = first.fPhi - asin(1.*(0.1*fBfield)*0.15/first.fPt);// 0.15 for D=1m
3525 if(phi1 > 2*PI) phi1 -= 2*PI;
3526 if(phi1 < 0) phi1 += 2*PI;
3527 Float_t phi2 = second.fPhi - asin(1.*(0.1*fBfield)*0.15/second.fPt);// 0.15 for D=1m
3528 if(phi2 > 2*PI) phi2 -= 2*PI;
3529 if(phi2 < 0) phi2 += 2*PI;
3530
3531 Float_t deltaphi = phi1 - phi2;
3532 if(deltaphi > PI) deltaphi -= 2*PI;
3533 if(deltaphi < -PI) deltaphi += 2*PI;
3534 deltaphi = fabs(deltaphi);
3535
3536 if(deltaphi < fMinSepPairPhi) return kFALSE;// Min Separation
3537
3538
3539 // propagate through B field to r=1.6m
3540 phi1 = first.fPhi - asin(1.*(0.1*fBfield)*0.24/first.fPt);// mine. 0.24 for D=1.6m
3541 if(phi1 > 2*PI) phi1 -= 2*PI;
3542 if(phi1 < 0) phi1 += 2*PI;
3543 phi2 = second.fPhi - asin(1.*(0.1*fBfield)*0.24/second.fPt);// mine. 0.24 for D=1.6m
3544 if(phi2 > 2*PI) phi2 -= 2*PI;
3545 if(phi2 < 0) phi2 += 2*PI;
3546
3547 deltaphi = phi1 - phi2;
3548 if(deltaphi > PI) deltaphi -= 2*PI;
3549 if(deltaphi < -PI) deltaphi += 2*PI;
3550 deltaphi = fabs(deltaphi);
3551
3552 if(deltaphi < fMinSepPairPhi) return kFALSE;// Min Separation
3553
3554 return kTRUE;
3555
be9ef9f9 3556}
3557//________________________________________________________________________
fcb16ac9 3558Float_t AliFourPion::Gamov(Int_t chargeBin1, Int_t chargeBin2, Float_t qinv)
be9ef9f9 3559{
3560 Float_t arg = G_Coeff/qinv;
3561
3562 if(chargeBin1==chargeBin2) return (exp(arg)-1)/(arg);
3563 else {return (exp(-arg)-1)/(-arg);}
3564
3565}
3566//________________________________________________________________________
3567void AliFourPion::Shuffle(Int_t *iarr, Int_t i1, Int_t i2)
3568{
3569 Int_t j, k;
3570 Int_t a = i2 - i1;
3571 for (Int_t i = i1; i < i2+1; i++) {
3572 j = (Int_t) (gRandom->Rndm() * a);
3573 k = iarr[j];
3574 iarr[j] = iarr[i];
3575 iarr[i] = k;
3576 }
3577}
3578
3579
3580//________________________________________________________________________
3581Float_t AliFourPion::GetQinv(Float_t track1[], Float_t track2[]){
3582
3583 Float_t qinv = sqrt( fabs(pow(track1[1]-track2[1],2) + pow(track1[2]-track2[2],2) + pow(track1[3]-track2[3],2) - pow(track1[0]-track2[0],2)) );
3584 return qinv;
3585
3586}
3587//________________________________________________________________________
3588void AliFourPion::GetQosl(Float_t track1[], Float_t track2[], Float_t& qout, Float_t& qside, Float_t& qlong){
3589
3590 Float_t p0 = track1[0] + track2[0];
3591 Float_t px = track1[1] + track2[1];
3592 Float_t py = track1[2] + track2[2];
3593 Float_t pz = track1[3] + track2[3];
3594
3595 Float_t mt = sqrt(p0*p0 - pz*pz);
3596 Float_t pt = sqrt(px*px + py*py);
3597
3598 Float_t v0 = track1[0] - track2[0];
3599 Float_t vx = track1[1] - track2[1];
3600 Float_t vy = track1[2] - track2[2];
3601 Float_t vz = track1[3] - track2[3];
3602
3603 qout = (px*vx + py*vy)/pt;
3604 qside = (px*vy - py*vx)/pt;
3605 qlong = (p0*vz - pz*v0)/mt;
3606}
3607//________________________________________________________________________
3608void AliFourPion::SetWeightArrays(Bool_t legoCase, TH3F *histos[AliFourPion::fKbinsT][AliFourPion::fCentBins]){
3609
3610 if(legoCase){
3611 cout<<"LEGO call to SetWeightArrays"<<endl;
3612
3613 for(Int_t tKbin=0; tKbin<fKbinsT; tKbin++){
3614 for(Int_t mb=0; mb<fCentBins; mb++){
3615 fNormWeight[tKbin][mb] = (TH3F*)histos[tKbin][mb]->Clone();
3616 fNormWeight[tKbin][mb]->SetDirectory(0);
3617 }
3618 }
3619
3620 }else{
3621
3622 TFile *wFile = new TFile("WeightFile.root","READ");
3623 if(!wFile->IsOpen()) {cout<<"No Weight File!!!!!!!!!!"<<endl; return;}
3624 else cout<<"Good Weight File Found!"<<endl;
3625
3626 for(Int_t tKbin=0; tKbin<fKbinsT; tKbin++){
3627 for(Int_t mb=0; mb<fCentBins; mb++){
3628
3629 TString *name = new TString("Weight_Kt_");
3630 *name += tKbin;
3631 name->Append("_Ky_0");
3632 name->Append("_M_");
3633 *name += mb;
3634 name->Append("_ED_0");
3635
3636
3637 fNormWeight[tKbin][mb] = (TH3F*)wFile->Get(name->Data());
3638 fNormWeight[tKbin][mb]->SetDirectory(0);
3639
3640
3641 }//mb
3642 }//kt
3643
3644 wFile->Close();
3645 }
3646
3647 cout<<"Done reading weight file"<<endl;
3648
3649}
3650//________________________________________________________________________
3651void AliFourPion::GetWeight(Float_t track1[], Float_t track2[], Float_t& wgt, Float_t& wgtErr){
3652
3653 Float_t kt=sqrt( pow(track1[1]+track2[1],2) + pow(track1[2]+track2[2],2))/2.;
3654 //
3655 Float_t qOut=0,qSide=0,qLong=0;
3656 GetQosl(track1, track2, qOut, qSide, qLong);
3657 qOut = fabs(qOut);
3658 qSide = fabs(qSide);
3659 qLong = fabs(qLong);
3660 Float_t wd=0, xd=0, yd=0, zd=0;
3661 //Float_t qinvtemp=GetQinv(0,track1, track2);
3662 //
3663
3664 if(kt < fKmeanT[0]) {fKtIndexL=0; fKtIndexH=1;}
3665 else if(kt >= fKmeanT[fKbinsT-1]) {fKtIndexL=fKbinsT-2; fKtIndexH=fKbinsT-1;}
3666 else {
3667 for(Int_t i=0; i<fKbinsT-1; i++){
3668 if((kt >= fKmeanT[i]) && (kt < fKmeanT[i+1])) {fKtIndexL=i; fKtIndexH=i+1; break;}
3669 }
3670 }
3671 wd = (kt-fKmeanT[fKtIndexL])/(fKmeanT[fKtIndexH]-fKmeanT[fKtIndexL]);
4e2838bf 3672 if(fMaxPt<=0.251) {fKtIndexL=0; fKtIndexH=0; wd=0;}
3673 if(fMinPt>0.249 && fKtIndexL==0) {fKtIndexL=1; wd=0;}
be9ef9f9 3674 //
be9ef9f9 3675 if(qOut < fQmean[0]) {fQoIndexL=0; fQoIndexH=0; xd=0;}
3676 else if(qOut >= fQmean[kQbinsWeights-1]) {fQoIndexL=kQbinsWeights-1; fQoIndexH=kQbinsWeights-1; xd=1;}
3677 else {
3678 for(Int_t i=0; i<kQbinsWeights-1; i++){
3679 if((qOut >= fQmean[i]) && (qOut < fQmean[i+1])) {fQoIndexL=i; fQoIndexH=i+1; break;}
95567836 3680 }
be9ef9f9 3681 xd = (qOut-fQmean[fQoIndexL])/(fQmean[fQoIndexH]-fQmean[fQoIndexL]);
3682 }
3683 //
3684 if(qSide < fQmean[0]) {fQsIndexL=0; fQsIndexH=0; yd=0;}
3685 else if(qSide >= fQmean[kQbinsWeights-1]) {fQsIndexL=kQbinsWeights-1; fQsIndexH=kQbinsWeights-1; yd=1;}
3686 else {
3687 for(Int_t i=0; i<kQbinsWeights-1; i++){
3688 if((qSide >= fQmean[i]) && (qSide < fQmean[i+1])) {fQsIndexL=i; fQsIndexH=i+1; break;}
3689 }
3690 yd = (qSide-fQmean[fQsIndexL])/(fQmean[fQsIndexH]-fQmean[fQsIndexL]);
3691 }
3692 //
3693 if(qLong < fQmean[0]) {fQlIndexL=0; fQlIndexH=0; zd=0;}
3694 else if(qLong >= fQmean[kQbinsWeights-1]) {fQlIndexL=kQbinsWeights-1; fQlIndexH=kQbinsWeights-1; zd=1;}
3695 else {
3696 for(Int_t i=0; i<kQbinsWeights-1; i++){
3697 if((qLong >= fQmean[i]) && (qLong < fQmean[i+1])) {fQlIndexL=i; fQlIndexH=i+1; break;}
3698 }
3699 zd = (qLong-fQmean[fQlIndexL])/(fQmean[fQlIndexH]-fQmean[fQlIndexL]);
3700 }
3701 //
95567836 3702 if(fLinearInterpolation){// Linear Interpolation of osl
3703 // w interpolation (kt)
3704 Float_t c000 = fNormWeight[fKtIndexL][fMbin]->GetBinContent(fQoIndexL+1, fQsIndexL+1, fQlIndexL+1)*(1-wd) + fNormWeight[fKtIndexH][fMbin]->GetBinContent(fQoIndexL+1, fQsIndexL+1, fQlIndexL+1)*wd;
3705 Float_t c100 = fNormWeight[fKtIndexL][fMbin]->GetBinContent(fQoIndexH+1, fQsIndexL+1, fQlIndexL+1)*(1-wd) + fNormWeight[fKtIndexH][fMbin]->GetBinContent(fQoIndexH+1, fQsIndexL+1, fQlIndexL+1)*wd;
3706 Float_t c010 = fNormWeight[fKtIndexL][fMbin]->GetBinContent(fQoIndexL+1, fQsIndexH+1, fQlIndexL+1)*(1-wd) + fNormWeight[fKtIndexH][fMbin]->GetBinContent(fQoIndexL+1, fQsIndexH+1, fQlIndexL+1)*wd;
3707 Float_t c001 = fNormWeight[fKtIndexL][fMbin]->GetBinContent(fQoIndexL+1, fQsIndexL+1, fQlIndexH+1)*(1-wd) + fNormWeight[fKtIndexH][fMbin]->GetBinContent(fQoIndexL+1, fQsIndexL+1, fQlIndexH+1)*wd;
3708 Float_t c110 = fNormWeight[fKtIndexL][fMbin]->GetBinContent(fQoIndexH+1, fQsIndexH+1, fQlIndexL+1)*(1-wd) + fNormWeight[fKtIndexH][fMbin]->GetBinContent(fQoIndexH+1, fQsIndexH+1, fQlIndexL+1)*wd;
3709 Float_t c101 = fNormWeight[fKtIndexL][fMbin]->GetBinContent(fQoIndexH+1, fQsIndexL+1, fQlIndexH+1)*(1-wd) + fNormWeight[fKtIndexH][fMbin]->GetBinContent(fQoIndexH+1, fQsIndexL+1, fQlIndexH+1)*wd;
3710 Float_t c011 = fNormWeight[fKtIndexL][fMbin]->GetBinContent(fQoIndexL+1, fQsIndexH+1, fQlIndexH+1)*(1-wd) + fNormWeight[fKtIndexH][fMbin]->GetBinContent(fQoIndexL+1, fQsIndexH+1, fQlIndexH+1)*wd;
3711 Float_t c111 = fNormWeight[fKtIndexL][fMbin]->GetBinContent(fQoIndexH+1, fQsIndexH+1, fQlIndexH+1)*(1-wd) + fNormWeight[fKtIndexH][fMbin]->GetBinContent(fQoIndexH+1, fQsIndexH+1, fQlIndexH+1)*wd;
3712 // x interpolation (qOut)
3713 Float_t c00 = c000*(1-xd) + c100*xd;
3714 Float_t c10 = c010*(1-xd) + c110*xd;
3715 Float_t c01 = c001*(1-xd) + c101*xd;
3716 Float_t c11 = c011*(1-xd) + c111*xd;
3717 // y interpolation (qSide)
3718 Float_t c0 = c00*(1-yd) + c10*yd;
3719 Float_t c1 = c01*(1-yd) + c11*yd;
3720 // z interpolation (qLong)
3721 wgt = (c0*(1-zd) + c1*zd);
3722 }else{// cubic interpolation of osl
3723
3724 for(Int_t x=0; x<4; x++){
3725 for(Int_t y=0; y<4; y++){
3726 for(Int_t z=0; z<4; z++){
3727 Int_t binO = fQoIndexL + x;
3728 Int_t binS = fQsIndexL + y;
3729 Int_t binL = fQlIndexL + z;
3730 if(binO<=0) binO = 1;
3731 if(binS<=0) binS = 1;
3732 if(binL<=0) binL = 1;
3733 if(binO>kQbinsWeights) binO = kQbinsWeights;
3734 if(binS>kQbinsWeights) binS = kQbinsWeights;
3735 if(binL>kQbinsWeights) binL = kQbinsWeights;
3736 farrP1[x][y][z] = fNormWeight[fKtIndexL][fMbin]->GetBinContent(binO,binS,binL);
3737 farrP2[x][y][z] = fNormWeight[fKtIndexH][fMbin]->GetBinContent(binO,binS,binL);
3738 }
3739 }
3740 }
3741 Float_t coord[3]={xd, yd, zd};
3742 Float_t c0 = nCubicInterpolate(3, (Float_t*) farrP1, coord);
3743 Float_t c1 = nCubicInterpolate(3, (Float_t*) farrP2, coord);
3744 // kT interpolation
3745 wgt = c0*(1-wd) + c1*wd;
3746 }
be9ef9f9 3747 ////
3748
43046300 3749 // simplified stat error
3750 Float_t avgErr = fNormWeight[fKtIndexL][fMbin]->GetBinError(fQoIndexH+1,fQsIndexH+1,fQlIndexH+1);
3751 avgErr += fNormWeight[fKtIndexH][fMbin]->GetBinError(fQoIndexL+1,fQsIndexL+1,fQlIndexL+1);
3752 avgErr /= 2.;
3753 //
3754 wgtErr = avgErr;
be9ef9f9 3755
3756
3757}
3758//________________________________________________________________________
3759Float_t AliFourPion::MCWeight(Int_t c[2], Float_t R, Float_t fcSq, Float_t qinv, Float_t k12){
3760
3761 Float_t radius = R/0.19733;// convert to GeV (starts at 5 fm, was 3 fm)
3762 Float_t r12=radius*(1-k12/2.0);
3763 SetFSIindex(R);
3764 Float_t coulCorr12 = FSICorrelation(c[0], c[1], qinv);
3765 if(c[0]==c[1]){
3766 Float_t arg=qinv*r12;
3767 Float_t EW = 1 + kappa3/(6.*pow(2.,1.5))*(8.*pow(arg,3) - 12.*arg);
3768 EW += kappa4/(24.*pow(2.,2))*(16.*pow(arg,4) -48.*pow(arg,2) + 12);
3769 return ((1-fcSq) + fcSq*(1 + exp(-pow(qinv*r12,2))*pow(EW,2))*coulCorr12);
3770 }else {
3771 return ((1-fcSq) + fcSq*coulCorr12);
3772 }
3773
3774}
3775//________________________________________________________________________
3776Float_t AliFourPion::MCWeightOSL(Int_t charge1, Int_t charge2, Int_t r, Int_t dampIndex, Float_t qinv, Float_t qo, Float_t qs, Float_t ql){
3777
3778 Float_t radiusOut = Float_t(r)/0.19733;// convert to GeV (starts at 5 fm, was 3 fm)
3779 Float_t radiusSide = radiusOut;
3780 Float_t radiusLong = radiusOut;
3781 Float_t myDamp = fDampStart + (fDampStep)*dampIndex;
3782 Float_t coulCorr12 = FSICorrelation(charge1, charge2, qinv);
3783 if(charge1==charge2){
3784 return ((1-myDamp) + myDamp*(1 + exp(-pow(qo*radiusOut,2)) * exp(-pow(qs*radiusSide,2)) * exp(-pow(ql*radiusLong,2)))*coulCorr12);
3785 }else {
3786 return ((1-myDamp) + myDamp*coulCorr12);
3787 }
3788
3789}
3790
3791//________________________________________________________________________
3792Float_t AliFourPion::MCWeight3(Int_t term, Float_t R, Float_t fcSq, Int_t c[3], Float_t qinv[3], Float_t kT[3]){
3793 // FSI + QS correlations
3794 if(term==5) return 1.0;
3795
3796 Float_t radius=R/0.19733;
3797 Float_t r12=radius*(1-kT[0]/2.0);
3798 Float_t r13=radius*(1-kT[1]/2.0);
3799 Float_t r23=radius*(1-kT[2]/2.0);
3800
3801 Float_t fc = sqrt(fcSq);
3802
3803 SetFSIindex(R);
3804 Float_t Kfactor12 = FSICorrelation(c[0],c[1], qinv[0]);// K2
3805 Float_t Kfactor13 = FSICorrelation(c[0],c[2], qinv[1]);// K2
3806 Float_t Kfactor23 = FSICorrelation(c[1],c[2], qinv[2]);// K2
3807
3808 if(c[0]==c[1] && c[0]==c[2]){// all three of the same charge
3809 Float_t arg12=qinv[0]*r12;
3810 Float_t arg13=qinv[1]*r13;
3811 Float_t arg23=qinv[2]*r23;
3812 Float_t EW12 = 1 + kappa3/(6.*pow(2.,1.5))*(8.*pow(arg12,3) - 12.*arg12);
3813 EW12 += kappa4/(24.*pow(2.,2))*(16.*pow(arg12,4) -48.*pow(arg12,2) + 12);
3814 Float_t EW13 = 1 + kappa3/(6.*pow(2.,1.5))*(8.*pow(arg13,3) - 12.*arg13);
3815 EW13 += kappa4/(24.*pow(2.,2))*(16.*pow(arg13,4) -48.*pow(arg13,2) + 12);
3816 Float_t EW23 = 1 + kappa3/(6.*pow(2.,1.5))*(8.*pow(arg23,3) - 12.*arg23);
3817 EW23 += kappa4/(24.*pow(2.,2))*(16.*pow(arg23,4) -48.*pow(arg23,2) + 12);
3818 if(term==1){
3819 Float_t C3QS = 1 + exp(-pow(qinv[0]*r12,2))*pow(EW12,2) + exp(-pow(qinv[1]*r13,2))*pow(EW13,2) + exp(-pow(qinv[2]*r23,2))*pow(EW23,2);
3820 C3QS += 2*exp(-(pow(r12,2)*pow(qinv[0],2) + pow(r13,2)*pow(qinv[1],2) + pow(r23,2)*pow(qinv[2],2))/2.)*EW12*EW13*EW23;
3821 Float_t C3 = pow(1-fc,3) + 3*fc*pow(1-fc,2);
3822 C3 += pow(fc,2)*(1-fc)*(1+exp(-pow(qinv[0]*r12,2))*pow(EW12,2))*Kfactor12;
3823 C3 += pow(fc,2)*(1-fc)*(1+exp(-pow(qinv[1]*r13,2))*pow(EW13,2))*Kfactor13;
3824 C3 += pow(fc,2)*(1-fc)*(1+exp(-pow(qinv[2]*r23,2))*pow(EW23,2))*Kfactor23;
3825 C3 += pow(fc,3)*C3QS*Kfactor12*Kfactor13*Kfactor23;
3826 return C3;
3827 }else if(term==2){
3828 return ((1-fcSq) + fcSq*(1 + exp(-pow(qinv[0]*r12,2))*pow(EW12,2))*Kfactor12);
3829 }else if(term==3){
3830 return ((1-fcSq) + fcSq*(1 + exp(-pow(qinv[1]*r13,2))*pow(EW13,2))*Kfactor13);
3831 }else if(term==4){
3832 return ((1-fcSq) + fcSq*(1 + exp(-pow(qinv[2]*r23,2))*pow(EW23,2))*Kfactor23);
3833 }else return 1.0;
3834
3835 }else{// mixed charge case
3836 Float_t arg=qinv[0]*r12;
3837 Float_t KfactorSC = Kfactor12;
3838 Float_t KfactorMC1 = Kfactor13;
3839 Float_t KfactorMC2 = Kfactor23;
3840 if(c[0]==c[2]) {arg=qinv[1]*r13; KfactorSC = Kfactor13; KfactorMC1 = Kfactor12; KfactorMC2 = Kfactor23;}
3841 if(c[1]==c[2]) {arg=qinv[2]*r23; KfactorSC = Kfactor23; KfactorMC1 = Kfactor12; KfactorMC2 = Kfactor13;}
3842 Float_t EW = 1 + kappa3/(6.*pow(2.,1.5))*(8.*pow(arg,3) - 12.*arg);
3843 EW += kappa4/(24.*pow(2.,2))*(16.*pow(arg,4) -48.*pow(arg,2) + 12);
3844 if(term==1){
3845 Float_t C3QS = 1 + exp(-pow(arg,2))*pow(EW,2);
3846 Float_t C3 = pow(1-fc,3) + 3*fc*pow(1-fc,2);
3847 C3 += pow(fc,2)*(1-fc)*(1+exp(-pow(arg,2))*pow(EW,2))*KfactorSC;
3848 C3 += pow(fc,2)*(1-fc)*KfactorMC1;
3849 C3 += pow(fc,2)*(1-fc)*KfactorMC2;
3850 C3 += pow(fc,3)*C3QS*KfactorSC*KfactorMC1*KfactorMC2;
3851 return C3;
3852 }else if(term==2){
3853 if( (c[0]+c[1]+c[2])==1) return ((1-fcSq) + fcSq*(1 + exp(-pow(arg,2))*pow(EW,2))*KfactorSC);
3854 else return ((1-fcSq) + fcSq*KfactorMC1);// doesn't matter MC1 or MC2
3855 }else if(term==3){
3856 return ((1-fcSq) + fcSq*KfactorMC1);// doesn't matter MC1 or MC2
3857 }else if(term==4){
3858 if( (c[0]+c[1]+c[2])==2) return ((1-fcSq) + fcSq*(1 + exp(-pow(arg,2))*pow(EW,2))*KfactorSC);
3859 else return ((1-fcSq) + fcSq*KfactorMC1);// doesn't matter MC1 or MC2
3860 }else return 1.0;
3861 }
3862
3863}
3864//________________________________________________________________________
3865Float_t AliFourPion::MCWeightFSI3(Int_t term, Float_t R, Float_t fcSq, Int_t c[3], Float_t qinv[3]){
3866 // FSI only (no QS correlations)
3867 if(term==5) return 1.0;
3868
3869 Float_t fc = sqrt(fcSq);
3870 SetFSIindex(R);
3871 Float_t Kfactor12 = FSICorrelation(c[0],c[1], qinv[0]);// K2
3872 Float_t Kfactor13 = FSICorrelation(c[0],c[2], qinv[1]);// K2
3873 Float_t Kfactor23 = FSICorrelation(c[1],c[2], qinv[2]);// K2
3874
3875 if(c[0]==c[1] && c[0]==c[2]){// all three of the same charge
3876 if(term==1){
3877 Float_t C3 = pow(1-fc,3) + 3*fc*pow(1-fc,2);
3878 C3 += pow(fc,2)*(1-fc)*Kfactor12;
3879 C3 += pow(fc,2)*(1-fc)*Kfactor13;
3880 C3 += pow(fc,2)*(1-fc)*Kfactor23;
3881 C3 += pow(fc,3)*Kfactor12*Kfactor13*Kfactor23;
3882 return C3;
3883 }else if(term==2){
3884 return ((1-fcSq) + fcSq*Kfactor12);
3885 }else if(term==3){
3886 return ((1-fcSq) + fcSq*Kfactor13);
3887 }else if(term==4){
3888 return ((1-fcSq) + fcSq*Kfactor23);
3889 }else return 1.0;
3890
3891 }else{// mixed charge case
3892 Float_t KfactorSC = Kfactor12;
3893 Float_t KfactorMC1 = Kfactor13;
3894 Float_t KfactorMC2 = Kfactor23;
3895 if(c[0]==c[2]) {KfactorSC = Kfactor13; KfactorMC1 = Kfactor12; KfactorMC2 = Kfactor23;}
3896 if(c[1]==c[2]) {KfactorSC = Kfactor23; KfactorMC1 = Kfactor12; KfactorMC2 = Kfactor13;}
3897 if(term==1){
3898 Float_t C3 = pow(1-fc,3) + 3*fc*pow(1-fc,2);
3899 C3 += pow(fc,2)*(1-fc)*KfactorSC;
3900 C3 += pow(fc,2)*(1-fc)*KfactorMC1;
3901 C3 += pow(fc,2)*(1-fc)*KfactorMC2;
3902 C3 += pow(fc,3)*KfactorSC*KfactorMC1*KfactorMC2;
3903 return C3;
3904 }else if(term==2){
3905 if( (c[0]+c[1]+c[2])==1) return ((1-fcSq) + fcSq*KfactorSC);
3906 else return ((1-fcSq) + fcSq*KfactorMC1);// doesn't matter MC1 or MC2
3907 }else if(term==3){
3908 return ((1-fcSq) + fcSq*KfactorMC1);// doesn't matter MC1 or MC2
3909 }else if(term==4){
3910 if( (c[0]+c[1]+c[2])==2) return ((1-fcSq) + fcSq*KfactorSC);
3911 else return ((1-fcSq) + fcSq*KfactorMC1);// doesn't matter MC1 or MC2
3912 }else return 1.0;
3913 }
3914
3915}
3916//________________________________________________________________________
3917Float_t AliFourPion::MCWeight4(Int_t term, Float_t R, Float_t fcSq, Int_t c[4], Float_t qinv[6], Float_t kT[6]){
6bb6954b 3918 if(term==13) return 1.0;
be9ef9f9 3919
3920 // Charge ordering:
3921 // ----, ---+, --++, -+++, ++++
3922 //
3923 // term ordering:
3924 // Term 1: 1-2-3-4 (all same-event)
3925 // Term 2: 1-2-3 4 (particle 4 from different event)
3926 // Term 3: 1-2-4 3 (particle 3 from different event)
3927 // Term 4: 1-3-4 2 (particle 2 from different event)
3928 // Term 5: 2-3-4 1 (particle 1 from different event)
3929 // Term 6: 1-2 3 4 (particle 1 and 2 from same event)
3930 // Term 7: 1-3 2 4
3931 // Term 8: 1-4 2 3
3932 // Term 9: 2-3 1 4
3933 // Term 10: 2-4 1 3
3934 // Term 11: 3-4 1 2
3935 // Term 12: 1 2 3 4 (all from different events)
3936
3937 Float_t radius = R/0.19733;
3938 Float_t r[6]={0};
3939 r[0]=radius*(1-kT[0]/2.0);
3940 r[1]=radius*(1-kT[1]/2.0);
3941 r[2]=radius*(1-kT[2]/2.0);
3942 r[3]=radius*(1-kT[3]/2.0);
3943 r[4]=radius*(1-kT[4]/2.0);
3944 r[5]=radius*(1-kT[5]/2.0);
3945
3946 Int_t ChargeSum=c[0]+c[1]+c[2]+c[3];
3947
3948 Float_t fc = sqrt(fcSq);
3949 SetFSIindex(R);
3950 Float_t Kfactor12 = FSICorrelation(c[0],c[1], qinv[0]);// K2
3951 Float_t Kfactor13 = FSICorrelation(c[0],c[2], qinv[1]);// K2
3952 Float_t Kfactor14 = FSICorrelation(c[0],c[3], qinv[2]);// K2
3953 Float_t Kfactor23 = FSICorrelation(c[1],c[2], qinv[3]);// K2
3954 Float_t Kfactor24 = FSICorrelation(c[1],c[3], qinv[4]);// K2
3955 Float_t Kfactor34 = FSICorrelation(c[2],c[3], qinv[5]);// K2
3956 Float_t arg12=qinv[0]*r[0];
3957 Float_t arg13=qinv[1]*r[1];
3958 Float_t arg14=qinv[2]*r[2];
3959 Float_t arg23=qinv[3]*r[3];
3960 Float_t arg24=qinv[4]*r[4];
3961 Float_t arg34=qinv[5]*r[5];
3962 // Exchange Amplitudes
3963 Float_t EA12 = exp(-pow(arg12,2)/2.)*(1 + kappa3/(6.*pow(2.,1.5))*(8.*pow(arg12,3) - 12.*arg12) + kappa4/(24.*pow(2.,2))*(16.*pow(arg12,4) -48.*pow(arg12,2) + 12));
3964 Float_t EA13 = exp(-pow(arg13,2)/2.)*(1 + kappa3/(6.*pow(2.,1.5))*(8.*pow(arg13,3) - 12.*arg13) + kappa4/(24.*pow(2.,2))*(16.*pow(arg13,4) -48.*pow(arg13,2) + 12));
3965 Float_t EA14 = exp(-pow(arg14,2)/2.)*(1 + kappa3/(6.*pow(2.,1.5))*(8.*pow(arg14,3) - 12.*arg14) + kappa4/(24.*pow(2.,2))*(16.*pow(arg14,4) -48.*pow(arg14,2) + 12));
3966 Float_t EA23 = exp(-pow(arg23,2)/2.)*(1 + kappa3/(6.*pow(2.,1.5))*(8.*pow(arg23,3) - 12.*arg23) + kappa4/(24.*pow(2.,2))*(16.*pow(arg23,4) -48.*pow(arg23,2) + 12));
3967 Float_t EA24 = exp(-pow(arg24,2)/2.)*(1 + kappa3/(6.*pow(2.,1.5))*(8.*pow(arg24,3) - 12.*arg24) + kappa4/(24.*pow(2.,2))*(16.*pow(arg24,4) -48.*pow(arg24,2) + 12));
3968 Float_t EA34 = exp(-pow(arg34,2)/2.)*(1 + kappa3/(6.*pow(2.,1.5))*(8.*pow(arg34,3) - 12.*arg34) + kappa4/(24.*pow(2.,2))*(16.*pow(arg34,4) -48.*pow(arg34,2) + 12));
3969
3970 if(c[0]==c[1] && c[0]==c[2] && c[0]==c[3]){// ---- and ++++ configuration
3971
3972 if(term==1){
3973 Float_t C4QS = 1 + pow(EA12,2) + pow(EA13,2) + pow(EA14,2) + pow(EA23,2) + pow(EA24,2) + pow(EA34,2);// baseline + single pairs
3974 C4QS += pow(EA12,2) * pow(EA34,2);// 2-pairs
3975 C4QS += pow(EA13,2) * pow(EA24,2);// 2-pairs
3976 C4QS += pow(EA14,2) * pow(EA23,2);// 2-pairs
3977 C4QS += 2*EA12*EA13*EA23 + 2*EA12*EA14*EA24 + 2*EA13*EA14*EA34 + 2*EA23*EA24*EA34;// 3-particle exhange
3978 C4QS += 3*EA12*EA23*EA34*EA14 + 3*EA12*EA13*EA34*EA24;// 4-particle exchange
3979 Float_t C4 = pow(1-fc,4) + 4*fc*pow(1-fc,3);
3980 C4 += pow(fc,2)*pow(1-fc,2)*( (1 + pow(EA12,2))*Kfactor12 + (1 + pow(EA13,2))*Kfactor13 + (1 + pow(EA14,2))*Kfactor14 );
3981 C4 += pow(fc,2)*pow(1-fc,2)*( (1 + pow(EA23,2))*Kfactor23 + (1 + pow(EA24,2))*Kfactor24 + (1 + pow(EA34,2))*Kfactor34);
3982 C4 += pow(fc,3)*(1-fc)*(1 + pow(EA12,2) + pow(EA13,2) + pow(EA23,2) + 2*EA12*EA13*EA23) * Kfactor12*Kfactor13*Kfactor23;
3983 C4 += pow(fc,3)*(1-fc)*(1 + pow(EA12,2) + pow(EA14,2) + pow(EA24,2) + 2*EA12*EA14*EA24) * Kfactor12*Kfactor14*Kfactor24;
3984 C4 += pow(fc,3)*(1-fc)*(1 + pow(EA13,2) + pow(EA14,2) + pow(EA34,2) + 2*EA13*EA14*EA34) * Kfactor13*Kfactor14*Kfactor34;
3985 C4 += pow(fc,3)*(1-fc)*(1 + pow(EA23,2) + pow(EA24,2) + pow(EA34,2) + 2*EA23*EA24*EA34) * Kfactor23*Kfactor24*Kfactor34;
3986 C4 += pow(fc,4)*C4QS*Kfactor12*Kfactor13*Kfactor14*Kfactor23*Kfactor24*Kfactor34;
3987 return C4;
3988 }else if(term<=5){
3989 Float_t EA1=0, EA2=0, EA3=0, Kpair1=0, Kpair2=0, Kpair3=0;
3990 if(term==2) {EA1=EA12; EA2=EA13; EA3=EA23; Kpair1=Kfactor12; Kpair2=Kfactor13; Kpair3=Kfactor23;}
3991 else if(term==3) {EA1=EA12; EA2=EA14; EA3=EA24; Kpair1=Kfactor12; Kpair2=Kfactor14; Kpair3=Kfactor24;}
3992 else if(term==4) {EA1=EA13; EA2=EA14; EA3=EA34; Kpair1=Kfactor13; Kpair2=Kfactor14; Kpair3=Kfactor34;}
3993 else {EA1=EA23; EA2=EA24; EA3=EA34; Kpair1=Kfactor23; Kpair2=Kfactor24; Kpair3=Kfactor34;}
3994 Float_t C3QS = 1 + pow(EA1,2) + pow(EA2,2) + pow(EA3,2);
3995 C3QS += 2*EA1*EA2*EA3;
3996 Float_t C3 = pow(1-fc,3) + 3*fc*pow(1-fc,2);
3997 C3 += pow(fc,2)*(1-fc)*( (1+pow(EA1,2))*Kpair1 + (1+pow(EA2,2))*Kpair2 + (1+pow(EA3,2))*Kpair3 );
3998 C3 += pow(fc,3)*C3QS*Kpair1*Kpair2*Kpair3;
3999 return C3;
4000 }else if(term<=11){
4001 if(term==6) return ((1-fcSq) + fcSq*(1 + pow(EA12,2))*Kfactor12);
4002 else if(term==7) return ((1-fcSq) + fcSq*(1 + pow(EA13,2))*Kfactor13);
4003 else if(term==8) return ((1-fcSq) + fcSq*(1 + pow(EA14,2))*Kfactor14);
4004 else if(term==9) return ((1-fcSq) + fcSq*(1 + pow(EA23,2))*Kfactor23);
4005 else if(term==10) return ((1-fcSq) + fcSq*(1 + pow(EA24,2))*Kfactor24);
4006 else return ((1-fcSq) + fcSq*(1 + pow(EA34,2))*Kfactor34);
6bb6954b 4007 }else if(term==12){
5591748e 4008 Float_t C22 = (1-fcSq) + fcSq*(1 + pow(EA12,2))*Kfactor12;
4009 C22 *= (1-fcSq) + fcSq*(1 + pow(EA34,2))*Kfactor34;
6bb6954b 4010 return C22;
be9ef9f9 4011 }else return 1.0;
4012
4013 }else{// mixed charge case
4014 if( ChargeSum==1 || ChargeSum==3){// ---+ and -+++ configuration
4015 Float_t EA1=0, EA2=0, EA3=0, Kpair1=0, Kpair2=0, Kpair3=0, Kpair4=0, Kpair5=0, Kpair6=0;
4016 Int_t c_OddOneOut = 1;
4017 if(ChargeSum==3) c_OddOneOut = 0;
4018 //
4019 if(c[0]==c_OddOneOut) {EA1=EA23; EA2=EA24; EA3=EA34; Kpair1=Kfactor23; Kpair2=Kfactor24; Kpair3=Kfactor34; Kpair4=Kfactor12; Kpair5=Kfactor13; Kpair6=Kfactor14;}
4020 else if(c[1]==c_OddOneOut) {EA1=EA13; EA2=EA14; EA3=EA34; Kpair1=Kfactor13; Kpair2=Kfactor14; Kpair3=Kfactor34; Kpair4=Kfactor12; Kpair5=Kfactor23; Kpair6=Kfactor24;}
4021 else if(c[2]==c_OddOneOut) {EA1=EA12; EA2=EA14; EA3=EA24; Kpair1=Kfactor12; Kpair2=Kfactor14; Kpair3=Kfactor24; Kpair4=Kfactor13; Kpair5=Kfactor23; Kpair6=Kfactor34;}
4022 else {EA1=EA12; EA2=EA13; EA3=EA23; Kpair1=Kfactor12; Kpair2=Kfactor13; Kpair3=Kfactor23; Kpair4=Kfactor14; Kpair5=Kfactor24; Kpair6=Kfactor34;}
4023
4024 if(term==1){
4025 Float_t C3QS = 1 + pow(EA1,2) + pow(EA2,2) + pow(EA3,2) + 2*EA1*EA2*EA3;
4026 Float_t C4 = pow(1-fc,4) + 4*fc*pow(1-fc,3);
4027 C4 += pow(fc,2)*pow(1-fc,2)*( (1 + pow(EA1,2))*Kpair1 + (1 + pow(EA2,2))*Kpair2 + (1 + pow(EA3,2))*Kpair3 );
4028 C4 += pow(fc,2)*pow(1-fc,2)*( Kpair4 + Kpair5 + Kpair6 );
4029 C4 += pow(fc,3)*(1-fc)*(1 + pow(EA1,2) + pow(EA2,2) + pow(EA3,2) + 2*EA1*EA2*EA3) * Kpair1*Kpair2*Kpair3;
4030 C4 += pow(fc,3)*(1-fc)*( (1 + pow(EA1,2))*Kpair1*Kpair4*Kpair5 + (1+pow(EA2,2))*Kpair2*Kpair4*Kpair6 + (1+pow(EA3,2))*Kpair3*Kpair5*Kpair6);// doesn't matter which MC K's
4031 C4 += pow(fc,4)*C3QS*Kfactor12*Kfactor13*Kfactor14*Kfactor23*Kfactor24*Kfactor34;
4032 return C4;
4033 }else if( (term==2 && ChargeSum==1) || (term==5 && ChargeSum==3)){
4034 Float_t C3QS = 1 + pow(EA1,2) + pow(EA2,2) + pow(EA3,2) + 2*EA1*EA2*EA3;
4035 Float_t C3 = pow(1-fc,3) + 3*fc*pow(1-fc,2);
4036 C3 += pow(fc,2)*(1-fc)*(1+pow(EA1,2))*Kpair1;
4037 C3 += pow(fc,2)*(1-fc)*(1+pow(EA2,2))*Kpair2;
4038 C3 += pow(fc,2)*(1-fc)*(1+pow(EA3,2))*Kpair3;
4039 C3 += pow(fc,3)*C3QS*Kpair1*Kpair2*Kpair3;
4040 return C3;
4041 }else if(term<=5){// one SC pair, two MC pairs
4042 Float_t C3 = pow(1-fc,3) + 3*fc*pow(1-fc,2);
4043 C3 += pow(fc,2)*(1-fc)*(1+pow(EA1,2))*Kpair1;// any SC pair will do
4044 C3 += pow(fc,2)*(1-fc)*Kpair4;// any MC pair will do
4045 C3 += pow(fc,2)*(1-fc)*Kpair5;// any MC pair will do
4046 C3 += pow(fc,3)*(1+pow(EA1,2))*Kpair1*Kpair4*Kpair5;
4047 return C3;
4048 }else if(term==6 || term==7){
4049 if(ChargeSum==1) return ((1-fcSq) + fcSq*(1 + pow(EA1,2))*Kpair1);// any SC pair will do
4050 else return ((1-fcSq) + fcSq*Kpair4);// any MC pair will do
4051 }else if(term==8){
4052 return ((1-fcSq) + fcSq*Kpair4);// any MC pair will do
4053 }else if(term==9){
4054 return ((1-fcSq) + fcSq*(1 + pow(EA1,2))*Kpair1);// any SC pair will do
6bb6954b 4055 }else if(term==10 || term==11){
be9ef9f9 4056 if(ChargeSum==3) return ((1-fcSq) + fcSq*(1 + pow(EA1,2))*Kpair1);// any SC pair will do
4057 else return ((1-fcSq) + fcSq*Kpair4);// any MC pair will do
6bb6954b 4058 }else return 1.0;// for 12 and 13
be9ef9f9 4059 }else{// --++ configuration
4060 Float_t EA1=0, EA2=0, Kpair1=0, Kpair2=0, Kpair3=0, Kpair4=0, Kpair5=0, Kpair6=0;
4061 if(c[0]==c[1]) {EA1=EA12; EA2=EA34; Kpair1=Kfactor12; Kpair2=Kfactor34; Kpair3=Kfactor13; Kpair4=Kfactor14; Kpair5=Kfactor23; Kpair6=Kfactor24;}
4062 else if(c[0]==c[2]) {EA1=EA13; EA2=EA24; Kpair1=Kfactor13; Kpair2=Kfactor24; Kpair3=Kfactor12; Kpair4=Kfactor14; Kpair5=Kfactor23; Kpair6=Kfactor34;}
4063 else {EA1=EA14; EA2=EA23; Kpair1=Kfactor14; Kpair2=Kfactor23; Kpair3=Kfactor12; Kpair4=Kfactor13; Kpair5=Kfactor24; Kpair6=Kfactor34;}
4064 //
4065 if(term==1){
4066 Float_t C2QS = 1 + pow(EA1,2)*pow(EA2,2);
4067 Float_t C4 = pow(1-fc,4) + 4*fc*pow(1-fc,3);
4068 C4 += pow(fc,2)*pow(1-fc,2)*( (1 + pow(EA1,2))*Kpair1 + (1 + pow(EA2,2))*Kpair2 );
4069 C4 += pow(fc,2)*pow(1-fc,2)*( Kpair3 + Kpair4 + Kpair5 + Kpair6 );
4070 C4 += pow(fc,3)*(1-fc)*( (1 + pow(EA1,2))*Kpair1*Kpair3*Kpair4 + (1 + pow(EA2,2))*Kpair2*Kpair3*Kpair4);
4071 C4 += pow(fc,3)*(1-fc)*( (1 + pow(EA1,2))*Kpair1*Kpair5*Kpair6 + (1 + pow(EA2,2))*Kpair2*Kpair5*Kpair6);// doesn't matter which two MC K's used
4072 C4 += pow(fc,4)*C2QS*Kfactor12*Kfactor13*Kfactor14*Kfactor23*Kfactor24*Kfactor34;
4073 return C4;
4074 }else if(term<=5){
4075 Float_t C3 = pow(1-fc,3) + 3*fc*pow(1-fc,2);
4076 C3 += pow(fc,2)*(1-fc)*(1+pow(EA1,2))*Kpair1;// any SC pair will do
4077 C3 += pow(fc,2)*(1-fc)*Kpair4;// any MC pair will do
4078 C3 += pow(fc,2)*(1-fc)*Kpair6;// any MC pair will do
4079 C3 += pow(fc,3)*(1+pow(EA1,2))*Kpair1*Kpair4*Kpair6;
4080 return C3;
4081 }else if(term==6 || term==11){
4082 return ((1-fcSq) + fcSq*(1 + pow(EA1,2))*Kpair1);// any SC pair will do
fcb16ac9 4083 }else if(term!=12 && term !=13){
be9ef9f9 4084 return ((1-fcSq) + fcSq*Kpair3);// any MC pair will do
fcb16ac9 4085 }else if(term==12){
4086 Float_t C22 = (1-fcSq) + fcSq*(1 + pow(EA1,2))*Kpair1;
4087 C22 *= (1-fcSq) + fcSq*(1 + pow(EA2,2))*Kpair2;
4088 return C22;
be9ef9f9 4089 }else return 1.0;
4090 }
4091 }
4092
4093}
4094//________________________________________________________________________
4095Float_t AliFourPion::MCWeightFSI4(Int_t term, Float_t R, Float_t fcSq, Int_t c[4], Float_t qinv[6]){
6bb6954b 4096 if(term==13) return 1.0;
be9ef9f9 4097
4098 Int_t ChargeSum=c[0]+c[1]+c[2]+c[3];
4099
4100 Float_t fc = sqrt(fcSq);
4101 SetFSIindex(R);
4102 Float_t Kfactor12 = FSICorrelation(c[0],c[1], qinv[0]);// K2
4103 Float_t Kfactor13 = FSICorrelation(c[0],c[2], qinv[1]);// K2
4104 Float_t Kfactor14 = FSICorrelation(c[0],c[3], qinv[2]);// K2
4105 Float_t Kfactor23 = FSICorrelation(c[1],c[2], qinv[3]);// K2
4106 Float_t Kfactor24 = FSICorrelation(c[1],c[3], qinv[4]);// K2
4107 Float_t Kfactor34 = FSICorrelation(c[2],c[3], qinv[5]);// K2
4108
4109 if(c[0]==c[1] && c[0]==c[2] && c[0]==c[3]){// ---- and ++++ configuration
4110
4111 if(term==1){
4112 Float_t C4 = pow(1-fc,4) + 4*fc*pow(1-fc,3);
4113 C4 += pow(fc,2)*pow(1-fc,2)*( Kfactor12 + Kfactor13 + Kfactor14 );
4114 C4 += pow(fc,2)*pow(1-fc,2)*( Kfactor23 + Kfactor24 + Kfactor34 );
4115 C4 += pow(fc,3)*(1-fc) * Kfactor12*Kfactor13*Kfactor23;
4116 C4 += pow(fc,3)*(1-fc) * Kfactor12*Kfactor14*Kfactor24;
4117 C4 += pow(fc,3)*(1-fc) * Kfactor13*Kfactor14*Kfactor34;
4118 C4 += pow(fc,3)*(1-fc) * Kfactor23*Kfactor24*Kfactor34;
4119 C4 += pow(fc,4) * Kfactor12*Kfactor13*Kfactor14*Kfactor23*Kfactor24*Kfactor34;
4120 return C4;
4121 }else if(term<=5){
4122 Float_t Kpair1=0, Kpair2=0, Kpair3=0;
4123 if(term==2) {Kpair1=Kfactor12; Kpair2=Kfactor13; Kpair3=Kfactor23;}
4124 else if(term==3) {Kpair1=Kfactor12; Kpair2=Kfactor14; Kpair3=Kfactor24;}
4125 else if(term==4) {Kpair1=Kfactor13; Kpair2=Kfactor14; Kpair3=Kfactor34;}
4126 else {Kpair1=Kfactor23; Kpair2=Kfactor24; Kpair3=Kfactor34;}
4127 Float_t C3 = pow(1-fc,3) + 3*fc*pow(1-fc,2);
4128 C3 += pow(fc,2)*(1-fc)*( Kpair1 + Kpair2 + Kpair3 );
4129 C3 += pow(fc,3)*Kpair1*Kpair2*Kpair3;
4130 return C3;
4131 }else if(term<=11){
4132 if(term==6) return ((1-fcSq) + fcSq*Kfactor12);
4133 else if(term==7) return ((1-fcSq) + fcSq*Kfactor13);
4134 else if(term==8) return ((1-fcSq) + fcSq*Kfactor14);
4135 else if(term==9) return ((1-fcSq) + fcSq*Kfactor23);
4136 else if(term==10) return ((1-fcSq) + fcSq*Kfactor24);
4137 else return ((1-fcSq) + fcSq*Kfactor34);
6bb6954b 4138 }else if(term==12){
5591748e 4139 Float_t C22 = (1-fcSq) + fcSq*Kfactor12;
4140 C22 *= (1-fcSq) + fcSq*Kfactor34;
6bb6954b 4141 return C22;
be9ef9f9 4142 }else return 1.0;
4143
4144 }else{// mixed charge case
4145 if( ChargeSum==1 || ChargeSum==3){// ---+ and -+++ configuration
4146 Float_t Kpair1=0, Kpair2=0, Kpair3=0, Kpair4=0, Kpair5=0, Kpair6=0;
4147 Int_t c_OddOneOut = 1;
4148 if(ChargeSum==3) c_OddOneOut = 0;
4149 //
4150 if(c[0]==c_OddOneOut) {Kpair1=Kfactor23; Kpair2=Kfactor24; Kpair3=Kfactor34; Kpair4=Kfactor12; Kpair5=Kfactor13; Kpair6=Kfactor14;}
4151 else if(c[1]==c_OddOneOut) {Kpair1=Kfactor13; Kpair2=Kfactor14; Kpair3=Kfactor34; Kpair4=Kfactor12; Kpair5=Kfactor23; Kpair6=Kfactor24;}
4152 else if(c[2]==c_OddOneOut) {Kpair1=Kfactor12; Kpair2=Kfactor14; Kpair3=Kfactor24; Kpair4=Kfactor13; Kpair5=Kfactor23; Kpair6=Kfactor34;}
4153 else {Kpair1=Kfactor12; Kpair2=Kfactor13; Kpair3=Kfactor23; Kpair4=Kfactor14; Kpair5=Kfactor24; Kpair6=Kfactor34;}
4154
4155 if(term==1){
4156 Float_t C4 = pow(1-fc,4) + 4*fc*pow(1-fc,3);
4157 C4 += pow(fc,2)*pow(1-fc,2)*( Kpair1 + Kpair2 + Kpair3 );
4158 C4 += pow(fc,2)*pow(1-fc,2)*( Kpair4 + Kpair5 + Kpair6 );
4159 C4 += pow(fc,3)*(1-fc)*Kpair1*Kpair2*Kpair3;
4160 C4 += pow(fc,3)*(1-fc)*(Kpair1*Kpair4*Kpair5 + Kpair2*Kpair4*Kpair6 + Kpair3*Kpair5*Kpair6);// doesn't matter which two MC K's used
4161 C4 += pow(fc,4)*Kfactor12*Kfactor13*Kfactor14*Kfactor23*Kfactor24*Kfactor34;
4162 return C4;
4163 }else if( (term==2 && ChargeSum==1) || (term==5 && ChargeSum==3)){
4164 Float_t C3 = pow(1-fc,3) + 3*fc*pow(1-fc,2);
4165 C3 += pow(fc,2)*(1-fc)*Kpair1;
4166 C3 += pow(fc,2)*(1-fc)*Kpair2;
4167 C3 += pow(fc,2)*(1-fc)*Kpair3;
4168 C3 += pow(fc,3)*Kpair1*Kpair2*Kpair3;
4169 return C3;
4170 }else if(term<=5){// one SC pair, two MC pairs
4171 Float_t C3 = pow(1-fc,3) + 3*fc*pow(1-fc,2);
4172 C3 += pow(fc,2)*(1-fc)*Kpair1;// any SC pair will do
4173 C3 += pow(fc,2)*(1-fc)*Kpair4;// any MC pair will do
4174 C3 += pow(fc,2)*(1-fc)*Kpair5;// any MC pair will do
4175 C3 += pow(fc,3)*Kpair1*Kpair4*Kpair5;
4176 return C3;
4177 }else if(term==6 || term==7){
4178 if(ChargeSum==1) return ((1-fcSq) + fcSq*Kpair1);// any SC pair will do
4179 else return ((1-fcSq) + fcSq*Kpair4);// any MC pair will do
4180 }else if(term==8){
4181 return ((1-fcSq) + fcSq*Kpair4);// any MC pair will do
4182 }else if(term==9){
4183 return ((1-fcSq) + fcSq*Kpair1);// any SC pair will do
6bb6954b 4184 }else if(term==10 || term==11){
be9ef9f9 4185 if(ChargeSum==3) return ((1-fcSq) + fcSq*Kpair1);// any SC pair will do
4186 else return ((1-fcSq) + fcSq*Kpair4);// any MC pair will do
6bb6954b 4187 }else return 1.0;// 12 and 13
be9ef9f9 4188 }else{// --++ configuration
4189 Float_t Kpair1=0, Kpair2=0, Kpair3=0, Kpair4=0, Kpair5=0, Kpair6=0;
4190 if(c[0]==c[1]) {Kpair1=Kfactor12; Kpair2=Kfactor34; Kpair3=Kfactor13; Kpair4=Kfactor14; Kpair5=Kfactor23; Kpair6=Kfactor24;}
4191 else if(c[0]==c[2]) {Kpair1=Kfactor13; Kpair2=Kfactor24; Kpair3=Kfactor12; Kpair4=Kfactor14; Kpair5=Kfactor23; Kpair6=Kfactor34;}
4192 else {Kpair1=Kfactor14; Kpair2=Kfactor23; Kpair3=Kfactor12; Kpair4=Kfactor13; Kpair5=Kfactor24; Kpair6=Kfactor34;}
4193 //
4194 if(term==1){
4195 Float_t C4 = pow(1-fc,4) + 4*fc*pow(1-fc,3);
4196 C4 += pow(fc,2)*pow(1-fc,2)*( Kpair1 + Kpair2 + Kpair3 + Kpair4 + Kpair5 + Kpair6);
4197 C4 += pow(fc,3)*(1-fc)*( Kpair1*Kpair3*Kpair4 + Kpair2*Kpair3*Kpair4 + Kpair1*Kpair5*Kpair6 + Kpair2*Kpair5*Kpair6);
4198 C4 += pow(fc,4)*Kfactor12*Kfactor13*Kfactor14*Kfactor23*Kfactor24*Kfactor34;
4199 return C4;
4200 }else if(term<=5){
4201 Float_t C3 = pow(1-fc,3) + 3*fc*pow(1-fc,2);
4202 C3 += pow(fc,2)*(1-fc)*Kpair1;// any SC pair will do
4203 C3 += pow(fc,2)*(1-fc)*Kpair4;// any MC pair will do
4204 C3 += pow(fc,2)*(1-fc)*Kpair6;// any MC pair will do
4205 C3 += pow(fc,3)*Kpair1*Kpair4*Kpair6;
4206 return C3;
4207 }else if(term==6 || term==11){
4208 return ((1-fcSq) + fcSq*Kpair1);// any SC pair will do
6bb6954b 4209 }else if(term !=12 && term !=13){
be9ef9f9 4210 return ((1-fcSq) + fcSq*Kpair3);// any MC pair will do
fcb16ac9 4211 }else if(term==12){
4212 Float_t C22 = (1-fcSq) + fcSq*Kpair1;
4213 C22 *= (1-fcSq) + fcSq*Kpair2;
4214 return C22;
be9ef9f9 4215 }else return 1.0;
4216 }
4217 }
4218
4219}
4220//________________________________________________________________________
80507acf 4221void AliFourPion::SetMomResCorrections(Bool_t legoCase, TH2D *temp2DSC, TH2D *temp2DMC){
be9ef9f9 4222
4223
4224 if(legoCase){
4225 cout<<"LEGO call to SetMomResCorrections"<<endl;
80507acf 4226 fMomResC2SC = (TH2D*)temp2DSC->Clone();
4227 fMomResC2SC->SetDirectory(0);
4228 fMomResC2MC = (TH2D*)temp2DMC->Clone();
4229 fMomResC2MC->SetDirectory(0);
be9ef9f9 4230 }else {
4231 TFile *momResFile = new TFile("MomResFile.root","READ");
4232 if(!momResFile->IsOpen()) {
4233 cout<<"No momentum resolution file found"<<endl;
4234 AliFatal("No momentum resolution file found. Kill process.");
4235 }else {cout<<"Good Momentum Resolution File Found!"<<endl;}
4236
80507acf 4237 TH2D *temp2DSC2 = (TH2D*)momResFile->Get("MRC_C2_SC");
4238 fMomResC2SC = (TH2D*)temp2DSC2->Clone();
4239 fMomResC2SC->SetDirectory(0);
4240 //
4241 TH2D *temp2DMC2 = (TH2D*)momResFile->Get("MRC_C2_MC");
4242 fMomResC2MC = (TH2D*)temp2DMC2->Clone();
4243 fMomResC2MC->SetDirectory(0);
4244 //
be9ef9f9 4245 momResFile->Close();
4246 }
4247
4248
80507acf 4249 for(Int_t bx=1; bx<=fMomResC2SC->GetNbinsX(); bx++){
4250 for(Int_t by=1; by<=fMomResC2SC->GetNbinsY(); by++){
4251 if(fMomResC2SC->GetBinContent(bx,by) > 1.5) fMomResC2SC->SetBinContent(bx,by, 1.0);// Maximum is ~1.02
4252 if(fMomResC2SC->GetBinContent(bx,by) < 0.8) fMomResC2SC->SetBinContent(bx,by, 1.0);// Minimum is ~0.8
4253 if(fMomResC2MC->GetBinContent(bx,by) > 1.5) fMomResC2MC->SetBinContent(bx,by, 1.0);// Maximum is ~1.02
4254 if(fMomResC2MC->GetBinContent(bx,by) < 0.8) fMomResC2MC->SetBinContent(bx,by, 1.0);// Minimum is ~0.8
be9ef9f9 4255 }
4256 }
80507acf 4257
be9ef9f9 4258 cout<<"Done reading momentum resolution file"<<endl;
4259}
4260//________________________________________________________________________
4261void AliFourPion::SetFSICorrelations(Bool_t legoCase, TH1D *tempss[12], TH1D *tempos[12]){
4262 // read in 2-particle and 3-particle FSI correlations = K2 & K3
4263 // 2-particle input histo from file is binned in qinv. 3-particle in qinv of each pair
4264 if(legoCase){
4265 cout<<"LEGO call to SetFSICorrelations"<<endl;
4266 for(Int_t MB=0; MB<12; MB++) {
4267 fFSIss[MB] = (TH1D*)tempss[MB]->Clone();
4268 fFSIos[MB] = (TH1D*)tempos[MB]->Clone();
4269 //
4270 fFSIss[MB]->SetDirectory(0);
4271 fFSIos[MB]->SetDirectory(0);
4272 }
4273 }else {
4274 cout<<"non LEGO call to SetFSICorrelations"<<endl;
4275 TFile *fsifile = new TFile("KFile.root","READ");
4276 if(!fsifile->IsOpen()) {
4277 cout<<"No FSI file found"<<endl;
4278 AliFatal("No FSI file found. Kill process.");
4279 }else {cout<<"Good FSI File Found!"<<endl;}
4280
4281 TH1D *temphistoSS[12];
4282 TH1D *temphistoOS[12];
4283 for(Int_t MB=0; MB<12; MB++) {
4284 TString *nameK2SS = new TString("K2ss_");
4285 *nameK2SS += MB;
4286 temphistoSS[MB] = (TH1D*)fsifile->Get(nameK2SS->Data());
4287 //
4288 TString *nameK2OS = new TString("K2os_");
4289 *nameK2OS += MB;
4290 temphistoOS[MB] = (TH1D*)fsifile->Get(nameK2OS->Data());
4291 //
4292 fFSIss[MB] = (TH1D*)temphistoSS[MB]->Clone();
4293 fFSIos[MB] = (TH1D*)temphistoOS[MB]->Clone();
4294 fFSIss[MB]->SetDirectory(0);
4295 fFSIos[MB]->SetDirectory(0);
4296 }
4297 //
4298
4299 fsifile->Close();
4300 }
4301
4302 cout<<"Done reading FSI file"<<endl;
4303}
4304//________________________________________________________________________
4305Float_t AliFourPion::FSICorrelation(Int_t charge1, Int_t charge2, Float_t qinv){
4306 // returns 2-particle Coulomb correlations = K2
4307 Int_t qbinL = fFSIss[fFSIindex]->GetXaxis()->FindBin(qinv-fFSIss[fFSIindex]->GetXaxis()->GetBinWidth(1)/2.);
4308 Int_t qbinH = qbinL+1;
4309 if(qbinL <= 0) return 1.0;
fcb16ac9 4310 if(qbinH > fFSIss[fFSIindex]->GetNbinsX()) {
4311 if(charge1!=charge2) {
4312 Float_t ScaleFac = (fFSIos[fFSIindex]->GetBinContent(fFSIos[fFSIindex]->GetNbinsX()-1) - 1);
4313 ScaleFac /= (Gamov(charge1, charge2, fFSIos[fFSIindex]->GetXaxis()->GetBinCenter(fFSIos[fFSIindex]->GetNbinsX()-1)) - 1);
4314 return ( (Gamov(charge1, charge2, qinv)-1)*ScaleFac + 1);
4315 }else{
4316 Float_t ScaleFac = (fFSIss[fFSIindex]->GetBinContent(fFSIss[fFSIindex]->GetNbinsX()-1) - 1);
4317 ScaleFac /= (Gamov(charge1, charge2, fFSIss[fFSIindex]->GetXaxis()->GetBinCenter(fFSIss[fFSIindex]->GetNbinsX()-1)) - 1);
4318 return ( (Gamov(charge1, charge2, qinv)-1)*ScaleFac + 1);
4319 }
4320 }
be9ef9f9 4321
4322 Float_t slope=0;
4323 if(charge1==charge2){
4324 slope = fFSIss[fFSIindex]->GetBinContent(qbinL) - fFSIss[fFSIindex]->GetBinContent(qbinH);
4325 slope /= fFSIss[fFSIindex]->GetXaxis()->GetBinCenter(qbinL) - fFSIss[fFSIindex]->GetXaxis()->GetBinCenter(qbinH);
4326 return (slope*(qinv - fFSIss[fFSIindex]->GetXaxis()->GetBinCenter(qbinL)) + fFSIss[fFSIindex]->GetBinContent(qbinL));
4327 }else {
4328 slope = fFSIos[fFSIindex]->GetBinContent(qbinL) - fFSIos[fFSIindex]->GetBinContent(qbinH);
4329 slope /= fFSIos[fFSIindex]->GetXaxis()->GetBinCenter(qbinL) - fFSIos[fFSIindex]->GetXaxis()->GetBinCenter(qbinH);
4330 return (slope*(qinv - fFSIos[fFSIindex]->GetXaxis()->GetBinCenter(qbinL)) + fFSIos[fFSIindex]->GetBinContent(qbinL));
4331 }
4332}
4333//________________________________________________________________________
4334void AliFourPion::SetFillBins2(Int_t c1, Int_t c2, Int_t &b1, Int_t &b2){
4335 if((c1+c2)==1) {b1=0; b2=1;}// Re-assign to merge degenerate histos
4336 else {b1=c1; b2=c2;}
4337}
4338//________________________________________________________________________
4339void AliFourPion::SetFillBins3(Int_t c1, Int_t c2, Int_t c3, Short_t part, Int_t &b1, Int_t &b2, Int_t &b3, Bool_t &fill2, Bool_t &fill3, Bool_t &fill4){
4340
4341 // "part" specifies which pair is from the same event. Only relevant for terms 2-4
4342 Bool_t seSS=kFALSE;
4343 if(part==1) {// default case (irrelevant for term 1 and term 5)
4344 if(c1==c2) seSS=kTRUE;
4345 }
4346 if(part==2){
4347 if(c1==c3) seSS=kTRUE;
4348 }
4349
4350
4351 // fill2, fill3, fill4 are only used for Cumulant Terms 2,3,4
4352 if( (c1+c2+c3)==1) {
4353 b1=0; b2=0; b3=1;// Re-assign to merge degenerate histos
4354 //
4355 if(seSS) fill2=kTRUE;
4356 else {fill3=kTRUE; fill4=kTRUE;}
4357 //
4358 }else if( (c1+c2+c3)==2) {
4359 b1=0; b2=1; b3=1;
4360 //
4361 if(!seSS) {fill2=kTRUE; fill3=kTRUE;}
4362 else fill4=kTRUE;
4363 //
4364 }else {
4365 b1=c1; b2=c2; b3=c3;
4366 fill2=kTRUE; fill3=kTRUE; fill4=kTRUE;
4367 }
4368
4369}
4370//________________________________________________________________________
6bb6954b 4371void AliFourPion::SetFillBins4(Int_t c1, Int_t c2, Int_t c3, Int_t c4, Int_t &b1, Int_t &b2, Int_t &b3, Int_t &b4, Int_t ENsum, Bool_t fillTerm[13]){
be9ef9f9 4372
4373 // fill2, fill3, fill4 are only used for Cumulant Terms 2,3,4
4374 if( (c1+c2+c3+c4)==0 || (c1+c2+c3+c4)==4) {// all of the same charge: ---- or ++++
4375
4376 b1=c1; b2=c2; b3=c3; b4=c4;
4377 if(ENsum==0) fillTerm[0]=kTRUE;
4378 else if(ENsum==1) {fillTerm[1]=kTRUE; fillTerm[2]=kTRUE; fillTerm[3]=kTRUE; fillTerm[4]=kTRUE;}
6bb6954b 4379 else if(ENsum==2) {fillTerm[11]=kTRUE;}
be9ef9f9 4380 else if(ENsum==3) {fillTerm[5]=kTRUE; fillTerm[6]=kTRUE; fillTerm[7]=kTRUE; fillTerm[8]=kTRUE; fillTerm[9]=kTRUE; fillTerm[10]=kTRUE;}
6bb6954b 4381 else fillTerm[12]=kTRUE;
be9ef9f9 4382
4383 }else if( (c1+c2+c3+c4)==1) {// one positive charge: ---+
4384
4385 b1=0; b2=0; b3=0; b4=1;// Re-assign to merge degenerate histos
4386 if(ENsum==0) fillTerm[0]=kTRUE;
4387 else if(ENsum==1){
4388 if(c4==1) fillTerm[1]=kTRUE;
4389 else {fillTerm[2]=kTRUE; fillTerm[3]=kTRUE; fillTerm[4]=kTRUE;}
6bb6954b 4390 }else if(ENsum==2){
4391 fillTerm[11]=kTRUE;
be9ef9f9 4392 }else if(ENsum==3){
4393 if(c3==1 || c4==1) {fillTerm[5]=kTRUE; fillTerm[6]=kTRUE; fillTerm[8]=kTRUE;}
4394 else {fillTerm[7]=kTRUE; fillTerm[9]=kTRUE; fillTerm[10]=kTRUE;}
6bb6954b 4395 }else fillTerm[12]=kTRUE;
be9ef9f9 4396
4397 }else if( (c1+c2+c3+c4)==2) {// two positive charges: --++
4398
4399 b1=0; b2=0; b3=1; b4=1;// Re-assign to merge degenerate histos
4400 if(ENsum==0) fillTerm[0]=kTRUE;
4401 else if(ENsum==1){
4402 if(c4==1) {fillTerm[1]=kTRUE; fillTerm[2]=kTRUE;}
4403 else {fillTerm[3]=kTRUE; fillTerm[4]=kTRUE;}
6bb6954b 4404 }else if(ENsum==2){
4405 if( (c1+c2)==0) fillTerm[11]=kTRUE;
be9ef9f9 4406 }else if(ENsum==3){
4407 if( (c1+c2)==0) fillTerm[5]=kTRUE;
4408 else if( (c1+c2)==1) {fillTerm[6]=kTRUE; fillTerm[7]=kTRUE; fillTerm[8]=kTRUE; fillTerm[9]=kTRUE;}
4409 else fillTerm[10]=kTRUE;
6bb6954b 4410 }else fillTerm[12]=kTRUE;
be9ef9f9 4411
4412 }else{// three positive charges
4413
4414 b1=0; b2=1; b3=1; b4=1;// Re-assign to merge degenerate histos
4415 if(ENsum==0) fillTerm[0]=kTRUE;
4416 else if(ENsum==1){
4417 if(c4==0) fillTerm[4]=kTRUE;
4418 else {fillTerm[1]=kTRUE; fillTerm[2]=kTRUE; fillTerm[3]=kTRUE;}
6bb6954b 4419 }else if(ENsum==2){
4420 fillTerm[11]=kTRUE;
be9ef9f9 4421 }else if(ENsum==3){
4422 if(c3==0 || c4==0) {fillTerm[8]=kTRUE; fillTerm[9]=kTRUE; fillTerm[10]=kTRUE;}
4423 else {fillTerm[5]=kTRUE; fillTerm[6]=kTRUE; fillTerm[7]=kTRUE;}
6bb6954b 4424 }else fillTerm[12]=kTRUE;
be9ef9f9 4425
4426 }
4427
4428}
4429//________________________________________________________________________
4430void AliFourPion::SetFSIindex(Float_t R){
4431 if(!fMCcase){
4432 if(fPbPbcase){
4433 if(fMbin==0) fFSIindex = 0;//0-5%
4434 else if(fMbin==1) fFSIindex = 1;//5-10%
4435 else if(fMbin<=3) fFSIindex = 2;//10-20%
4436 else if(fMbin<=5) fFSIindex = 3;//20-30%
4437 else if(fMbin<=7) fFSIindex = 4;//30-40%
4438 else if(fMbin<=9) fFSIindex = 5;//40-50%
4439 else if(fMbin<=12) fFSIindex = 6;//40-50%
4440 else if(fMbin<=15) fFSIindex = 7;//40-50%
4441 else if(fMbin<=18) fFSIindex = 8;//40-50%
4442 else fFSIindex = 8;//90-100%
4443 }else fFSIindex = 9;// pp and pPb
4444 }else{// FSI binning for MC
4445 if(R>=10.) fFSIindex = 0;
4446 else if(R>=9.) fFSIindex = 1;
4447 else if(R>=8.) fFSIindex = 2;
4448 else if(R>=7.) fFSIindex = 3;
4449 else if(R>=6.) fFSIindex = 4;
4450 else if(R>=5.) fFSIindex = 5;
4451 else if(R>=4.) fFSIindex = 6;
4452 else if(R>=3.) fFSIindex = 7;
4453 else if(R>=2.) fFSIindex = 8;
4454 else fFSIindex = 9;
4455 }
4456}
5591748e 4457//________________________________________________________________________
4458void AliFourPion::SetMuonCorrections(Bool_t legoCase, TH2D *tempMuon){
4459 if(legoCase){
4460 cout<<"LEGO call to SetMuonCorrections"<<endl;
4461 fWeightmuonCorrection = (TH2D*)tempMuon->Clone();
4462 fWeightmuonCorrection->SetDirectory(0);
4463 }else {
4464 cout<<"non LEGO call to SetMuonCorrections"<<endl;
4465 TFile *MuonFile=new TFile("MuonCorrection.root","READ");
4466 if(!MuonFile->IsOpen()) {
4467 cout<<"No Muon file found"<<endl;
4468 AliFatal("No Muon file found. Kill process.");
4469 }else {cout<<"Good Muon File Found!"<<endl;}
4470
4471 fWeightmuonCorrection = (TH2D*)MuonFile->Get("WeightmuonCorrection");
4472 fWeightmuonCorrection->SetDirectory(0);
4473 //
4474 MuonFile->Close();
4475 }
4476 cout<<"Done reading Muon file"<<endl;
4477}
95567836 4478//________________________________________________________________________
4479Float_t AliFourPion::cubicInterpolate (Float_t p[4], Float_t x) {
4480 return p[1] + 0.5 * x*(p[2] - p[0] + x*(2.0*p[0] - 5.0*p[1] + 4.0*p[2] - p[3] + x*(3.0*(p[1] - p[2]) + p[3] - p[0])));// Paulinternet
4481}
4482//________________________________________________________________________
4483Float_t AliFourPion::nCubicInterpolate (Int_t n, Float_t* p, Float_t coordinates[]) {
4484
4485 if (n == 1) {
4486 return cubicInterpolate(p, *coordinates);
4487 }
4488 else {
4489 Float_t arr[4];
4490 Int_t skip = 1 << (n - 1) * 2;
4491 arr[0] = nCubicInterpolate(n - 1, p, coordinates + 1);
4492 arr[1] = nCubicInterpolate(n - 1, p + skip, coordinates + 1);
4493 arr[2] = nCubicInterpolate(n - 1, p + 2*skip, coordinates + 1);
4494 arr[3] = nCubicInterpolate(n - 1, p + 3*skip, coordinates + 1);
4495 return cubicInterpolate(arr, *coordinates);
4496 }
4497}