7 #include "TObjString.h"
15 #include "TProfile2D.h"
20 #include "AliAnalysisTask.h"
21 #include "AliAnalysisManager.h"
24 #include "AliESDEvent.h"
25 #include "AliESDInputHandler.h"
26 #include "AliESDtrackCuts.h"
28 #include "AliAODEvent.h"
29 #include "AliAODInputHandler.h"
30 #include "AliAODMCParticle.h"
31 #include "AliAnalysisUtils.h"
33 #include "AliFourPion.h"
36 #define G_Coeff 0.006399 // 2*pi*alpha*M_pion
37 #define kappa3 0.1 // kappa3 Edgeworth coefficient (non-Gaussian features of C2)
38 #define kappa4 0.5 // kappa4 Edgeworth coefficient (non-Gaussian features of C2)
41 // Author: Dhevan Gangadharan
45 //________________________________________________________________________
46 AliFourPion::AliFourPion():
60 fGenerateSignal(kFALSE),
61 fGeneratorOnly(kFALSE),
62 fPdensityPairCut(kTRUE),
63 fTabulatePairs(kFALSE),
92 fQupperBoundWeights(0),
108 fMinSepPairEta(0.03),
109 fMinSepPairPhi(0.04),
128 fDefaultsCharSwitch(),
129 fLowQPairSwitch_E0E0(),
130 fLowQPairSwitch_E0E1(),
131 fLowQPairSwitch_E0E2(),
132 fLowQPairSwitch_E0E3(),
133 fLowQPairSwitch_E1E1(),
134 fLowQPairSwitch_E1E2(),
135 fLowQPairSwitch_E1E3(),
136 fLowQPairSwitch_E2E3(),
137 fNormQPairSwitch_E0E0(),
138 fNormQPairSwitch_E0E1(),
139 fNormQPairSwitch_E0E2(),
140 fNormQPairSwitch_E0E3(),
141 fNormQPairSwitch_E1E1(),
142 fNormQPairSwitch_E1E2(),
143 fNormQPairSwitch_E1E3(),
144 fNormQPairSwitch_E2E3(),
146 fWeightmuonCorrection(0x0)
148 // Default constructor
149 for(Int_t mb=0; mb<fMbins; mb++){
150 for(Int_t edB=0; edB<fEDbins; edB++){
151 for(Int_t c1=0; c1<2; c1++){
152 for(Int_t c2=0; c2<2; c2++){
153 for(Int_t term=0; term<2; term++){
155 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fTerms2=0x0;
157 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fIdeal = 0x0;
158 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fSmeared = 0x0;
159 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[0].fTerms2OSL = 0x0;
160 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[0].fTerms2OSLQW = 0x0;
161 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[1].fTerms2OSL = 0x0;
162 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[1].fTerms2OSLQW = 0x0;
167 for(Int_t c3=0; c3<2; c3++){
168 for(Int_t term=0; term<5; term++){
170 Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fNorm3 = 0x0;
171 Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fTerms3 = 0x0;
172 Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fKfactor = 0x0;
173 Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fTwoPartNorm = 0x0;
177 for(Int_t c4=0; c4<2; c4++){
178 for(Int_t term=0; term<13; term++){
180 Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fNorm4 = 0x0;
181 Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fTerms4 = 0x0;
182 Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fKfactor = 0x0;
183 Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fTwoPartNorm = 0x0;
191 for(Int_t tKbin=0; tKbin<fKbinsT; tKbin++){
192 for(Int_t yKbin=0; yKbin<fKbinsY; yKbin++){
193 KT[tKbin].KY[yKbin].MB[mb].EDB[edB].TwoPT[0].fTerms2ThreeD = 0x0;
194 KT[tKbin].KY[yKbin].MB[mb].EDB[edB].TwoPT[1].fTerms2ThreeD = 0x0;
201 // Initialize FSI histograms
202 for(Int_t i=0; i<12; i++){
208 // Initialize fNormWeight and fNormWeightErr to 0
209 for(Int_t i=0; i<3; i++){// Kt iterator
210 for(Int_t j=0; j<10; j++){// Mbin iterator
211 fNormWeight[i][j]=0x0;
217 //________________________________________________________________________
218 AliFourPion::AliFourPion(const Char_t *name)
219 : AliAnalysisTaskSE(name),
232 fGenerateSignal(kFALSE),
233 fGeneratorOnly(kFALSE),
234 fPdensityPairCut(kTRUE),
235 fTabulatePairs(kFALSE),
248 fCentBinHighLimit(1),
264 fQupperBoundWeights(0),
280 fMinSepPairEta(0.03),
281 fMinSepPairPhi(0.04),
300 fDefaultsCharSwitch(),
301 fLowQPairSwitch_E0E0(),
302 fLowQPairSwitch_E0E1(),
303 fLowQPairSwitch_E0E2(),
304 fLowQPairSwitch_E0E3(),
305 fLowQPairSwitch_E1E1(),
306 fLowQPairSwitch_E1E2(),
307 fLowQPairSwitch_E1E3(),
308 fLowQPairSwitch_E2E3(),
309 fNormQPairSwitch_E0E0(),
310 fNormQPairSwitch_E0E1(),
311 fNormQPairSwitch_E0E2(),
312 fNormQPairSwitch_E0E3(),
313 fNormQPairSwitch_E1E1(),
314 fNormQPairSwitch_E1E2(),
315 fNormQPairSwitch_E1E3(),
316 fNormQPairSwitch_E2E3(),
318 fWeightmuonCorrection(0x0)
322 fPdensityPairCut = kTRUE;
325 for(Int_t mb=0; mb<fMbins; mb++){
326 for(Int_t edB=0; edB<fEDbins; edB++){
327 for(Int_t c1=0; c1<2; c1++){
328 for(Int_t c2=0; c2<2; c2++){
329 for(Int_t term=0; term<2; term++){
331 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fTerms2=0x0;
333 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fIdeal = 0x0;
334 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fSmeared = 0x0;
335 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[0].fTerms2OSL = 0x0;
336 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[0].fTerms2OSLQW = 0x0;
337 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[1].fTerms2OSL = 0x0;
338 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[1].fTerms2OSLQW = 0x0;
342 for(Int_t c3=0; c3<2; c3++){
343 for(Int_t term=0; term<5; term++){
345 Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fNorm3 = 0x0;
346 Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fTerms3 = 0x0;
347 Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fKfactor = 0x0;
348 Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fTwoPartNorm = 0x0;
352 for(Int_t c4=0; c4<2; c4++){
353 for(Int_t term=0; term<13; term++){
355 Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fNorm4 = 0x0;
356 Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fTerms4 = 0x0;
357 Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fKfactor = 0x0;
358 Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fTwoPartNorm = 0x0;
366 for(Int_t tKbin=0; tKbin<fKbinsT; tKbin++){
367 for(Int_t yKbin=0; yKbin<fKbinsY; yKbin++){
368 KT[tKbin].KY[yKbin].MB[mb].EDB[edB].TwoPT[0].fTerms2ThreeD = 0x0;
369 KT[tKbin].KY[yKbin].MB[mb].EDB[edB].TwoPT[1].fTerms2ThreeD = 0x0;
376 // Initialize FSI histograms
377 for(Int_t i=0; i<12; i++){
382 // Initialize fNormWeight and fNormWeightErr to 0
383 for(Int_t i=0; i<3; i++){// Kt iterator
384 for(Int_t j=0; j<10; j++){// Mbin iterator
385 fNormWeight[i][j]=0x0;
390 DefineOutput(1, TList::Class());
392 //________________________________________________________________________
393 AliFourPion::AliFourPion(const AliFourPion &obj)
394 : AliAnalysisTaskSE(obj.fname),
398 fOutputList(obj.fOutputList),
399 fPIDResponse(obj.fPIDResponse),
402 fTempStruct(obj.fTempStruct),
403 fRandomNumber(obj.fRandomNumber),
405 fMCcase(obj.fMCcase),
406 fAODcase(obj.fAODcase),
407 fPbPbcase(obj.fPbPbcase),
408 fGenerateSignal(obj.fGenerateSignal),
409 fGeneratorOnly(obj.fGeneratorOnly),
410 fPdensityPairCut(obj.fPdensityPairCut),
411 fTabulatePairs(obj.fTabulatePairs),
414 fFilterBit(obj.fFilterBit),
415 fMaxChi2NDF(obj.fMaxChi2NDF),
416 fMinTPCncls(obj.fMinTPCncls),
417 fBfield(obj.fBfield),
419 fFSIindex(obj.fFSIindex),
422 fMultLimit(obj.fMultLimit),
423 fCentBinLowLimit(obj.fCentBinLowLimit),
424 fCentBinHighLimit(obj.fCentBinHighLimit),
425 fEventCounter(obj.fEventCounter),
426 fEventsToMix(obj.fEventsToMix),
427 fZvertexBins(obj.fZvertexBins),
430 fQLowerCut(obj.fQLowerCut),
433 fKupperBound(obj.fKupperBound),
434 fQupperBoundQ2(obj.fQupperBoundQ2),
435 fQupperBoundQ3(obj.fQupperBoundQ3),
436 fQupperBoundQ4(obj.fQupperBoundQ4),
437 fQbinsQ2(obj.fQbinsQ2),
438 fQbinsQ3(obj.fQbinsQ3),
439 fQbinsQ4(obj.fQbinsQ4),
440 fQupperBoundWeights(obj.fQupperBoundWeights),
448 fQstepWeights(obj.fQstepWeights),
450 fDampStart(obj.fDampStart),
451 fDampStep(obj.fDampStep),
452 fTPCTOFboundry(obj.fTPCTOFboundry),
453 fTOFboundry(obj.fTOFboundry),
454 fSigmaCutTPC(obj.fSigmaCutTPC),
455 fSigmaCutTOF(obj.fSigmaCutTOF),
456 fMinSepPairEta(obj.fMinSepPairEta),
457 fMinSepPairPhi(obj.fMinSepPairPhi),
458 fShareQuality(obj.fShareQuality),
459 fShareFraction(obj.fShareFraction),
460 fTrueMassP(obj.fTrueMassP),
461 fTrueMassPi(obj.fTrueMassPi),
462 fTrueMassK(obj.fTrueMassK),
463 fTrueMassKs(obj.fTrueMassKs),
464 fTrueMassLam(obj.fTrueMassLam),
465 fKtIndexL(obj.fKtIndexL),
466 fKtIndexH(obj.fKtIndexH),
467 fQoIndexL(obj.fQoIndexL),
468 fQoIndexH(obj.fQoIndexH),
469 fQsIndexL(obj.fQsIndexL),
470 fQsIndexH(obj.fQsIndexH),
471 fQlIndexL(obj.fQlIndexL),
472 fQlIndexH(obj.fQlIndexH),
473 fDummyB(obj.fDummyB),
474 fKT3transition(obj.fKT3transition),
475 fKT4transition(obj.fKT4transition),
476 fDefaultsCharSwitch(),
477 fLowQPairSwitch_E0E0(),
478 fLowQPairSwitch_E0E1(),
479 fLowQPairSwitch_E0E2(),
480 fLowQPairSwitch_E0E3(),
481 fLowQPairSwitch_E1E1(),
482 fLowQPairSwitch_E1E2(),
483 fLowQPairSwitch_E1E3(),
484 fLowQPairSwitch_E2E3(),
485 fNormQPairSwitch_E0E0(),
486 fNormQPairSwitch_E0E1(),
487 fNormQPairSwitch_E0E2(),
488 fNormQPairSwitch_E0E3(),
489 fNormQPairSwitch_E1E1(),
490 fNormQPairSwitch_E1E2(),
491 fNormQPairSwitch_E1E3(),
492 fNormQPairSwitch_E2E3(),
493 fMomResC2(obj.fMomResC2),
494 fWeightmuonCorrection(obj.fWeightmuonCorrection)
498 for(Int_t i=0; i<12; i++){
499 fFSIss[i]=obj.fFSIss[i];
500 fFSIos[i]=obj.fFSIos[i];
503 // Initialize fNormWeight and fNormWeightErr to 0
504 for(Int_t i=0; i<3; i++){// Kt iterator
505 for(Int_t j=0; j<10; j++){// Mbin iterator
506 fNormWeight[i][j]=0x0;
512 //________________________________________________________________________
513 AliFourPion &AliFourPion::operator=(const AliFourPion &obj)
515 // Assignment operator
521 fOutputList = obj.fOutputList;
522 fPIDResponse = obj.fPIDResponse;
525 fTempStruct = obj.fTempStruct;
526 fRandomNumber = obj.fRandomNumber;
528 fMCcase = obj.fMCcase;
529 fAODcase = obj.fAODcase;
530 fPbPbcase = obj.fPbPbcase;
531 fGenerateSignal = obj.fGenerateSignal;
532 fGeneratorOnly = obj.fGeneratorOnly;
533 fPdensityPairCut = obj.fPdensityPairCut;
534 fTabulatePairs = obj.fTabulatePairs;
537 fFilterBit = obj.fFilterBit;
538 fMaxChi2NDF = obj.fMaxChi2NDF;
539 fMinTPCncls = obj.fMinTPCncls;
540 fBfield = obj.fBfield;
542 fFSIindex = obj.fFSIindex;
545 fMultLimit = obj.fMultLimit;
546 fCentBinLowLimit = obj.fCentBinLowLimit;
547 fCentBinHighLimit = obj.fCentBinHighLimit;
548 fEventCounter = obj.fEventCounter;
549 fEventsToMix = obj.fEventsToMix;
550 fZvertexBins = obj.fZvertexBins;
551 fQLowerCut = obj.fQLowerCut;
552 fKupperBound = obj.fKupperBound;
553 fQupperBoundQ2 = obj.fQupperBoundQ2;
554 fQupperBoundQ3 = obj.fQupperBoundQ3;
555 fQupperBoundQ4 = obj.fQupperBoundQ4;
556 fQbinsQ2 = obj.fQbinsQ2;
557 fQbinsQ3 = obj.fQbinsQ3;
558 fQbinsQ4 = obj.fQbinsQ4;
559 fQupperBoundWeights = obj.fQupperBoundWeights;
561 fQstepWeights = obj.fQstepWeights;
562 fDampStart = obj.fDampStart;
563 fDampStep = obj.fDampStep;
564 fTPCTOFboundry = obj.fTPCTOFboundry;
565 fTOFboundry = obj.fTOFboundry;
566 fSigmaCutTPC = obj.fSigmaCutTPC;
567 fSigmaCutTOF = obj.fSigmaCutTOF;
568 fMinSepPairEta = obj.fMinSepPairEta;
569 fMinSepPairPhi = obj.fMinSepPairPhi;
570 fShareQuality = obj.fShareQuality;
571 fShareFraction = obj.fShareFraction;
572 fTrueMassP = obj.fTrueMassP;
573 fTrueMassPi = obj.fTrueMassPi;
574 fTrueMassK = obj.fTrueMassK;
575 fTrueMassKs = obj.fTrueMassKs;
576 fTrueMassLam = obj.fTrueMassLam;
577 fKtIndexL = obj.fKtIndexL;
578 fKtIndexH = obj.fKtIndexH;
579 fQoIndexL = obj.fQoIndexL;
580 fQoIndexH = obj.fQoIndexH;
581 fQsIndexL = obj.fQsIndexL;
582 fQsIndexH = obj.fQsIndexH;
583 fQlIndexL = obj.fQlIndexL;
584 fQlIndexH = obj.fQlIndexH;
585 fDummyB = obj.fDummyB;
586 fKT3transition = obj.fKT3transition;
587 fKT4transition = obj.fKT4transition;
588 fMomResC2 = obj.fMomResC2;
589 fWeightmuonCorrection = obj.fWeightmuonCorrection;
591 for(Int_t i=0; i<12; i++){
592 fFSIss[i]=obj.fFSIss[i];
593 fFSIos[i]=obj.fFSIos[i];
595 for(Int_t i=0; i<3; i++){// Kt iterator
596 for(Int_t j=0; j<10; j++){// Mbin iterator
597 fNormWeight[i][j]=obj.fNormWeight[i][j];
603 //________________________________________________________________________
604 AliFourPion::~AliFourPion()
607 if(fAOD) delete fAOD;
608 //if(fESD) delete fESD;
609 if(fOutputList) delete fOutputList;
610 if(fPIDResponse) delete fPIDResponse;
612 if(fEvt) delete fEvt;
613 if(fTempStruct) delete [] fTempStruct;
614 if(fRandomNumber) delete fRandomNumber;
615 if(fMomResC2) delete fMomResC2;
616 if(fWeightmuonCorrection) delete fWeightmuonCorrection;
618 for(Int_t j=0; j<kMultLimitPbPb; j++){
619 if(fLowQPairSwitch_E0E0[j]) delete [] fLowQPairSwitch_E0E0[j];
620 if(fLowQPairSwitch_E0E1[j]) delete [] fLowQPairSwitch_E0E1[j];
621 if(fLowQPairSwitch_E0E2[j]) delete [] fLowQPairSwitch_E0E2[j];
622 if(fLowQPairSwitch_E0E3[j]) delete [] fLowQPairSwitch_E0E3[j];
623 if(fLowQPairSwitch_E1E1[j]) delete [] fLowQPairSwitch_E1E1[j];
624 if(fLowQPairSwitch_E1E2[j]) delete [] fLowQPairSwitch_E1E2[j];
625 if(fLowQPairSwitch_E1E3[j]) delete [] fLowQPairSwitch_E1E3[j];
626 if(fLowQPairSwitch_E2E3[j]) delete [] fLowQPairSwitch_E2E3[j];
628 if(fNormQPairSwitch_E0E0[j]) delete [] fNormQPairSwitch_E0E0[j];
629 if(fNormQPairSwitch_E0E1[j]) delete [] fNormQPairSwitch_E0E1[j];
630 if(fNormQPairSwitch_E0E2[j]) delete [] fNormQPairSwitch_E0E2[j];
631 if(fNormQPairSwitch_E0E3[j]) delete [] fNormQPairSwitch_E0E3[j];
632 if(fNormQPairSwitch_E1E1[j]) delete [] fNormQPairSwitch_E1E1[j];
633 if(fNormQPairSwitch_E1E2[j]) delete [] fNormQPairSwitch_E1E2[j];
634 if(fNormQPairSwitch_E1E3[j]) delete [] fNormQPairSwitch_E1E3[j];
635 if(fNormQPairSwitch_E2E3[j]) delete [] fNormQPairSwitch_E2E3[j];
639 for(Int_t mb=0; mb<fMbins; mb++){
640 for(Int_t edB=0; edB<fEDbins; edB++){
641 for(Int_t c1=0; c1<2; c1++){
642 for(Int_t c2=0; c2<2; c2++){
643 for(Int_t term=0; term<2; term++){
645 if(Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fTerms2) delete Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fTerms2;
647 if(Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fIdeal) delete Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fIdeal;
648 if(Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fSmeared) delete Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fSmeared;
649 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;
650 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;
651 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;
652 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;
654 if(Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fMCqinv) delete Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fMCqinv;
655 if(Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fMCqinvQW) delete Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fMCqinvQW;
658 for(Int_t c3=0; c3<2; c3++){
659 for(Int_t term=0; term<5; term++){
661 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;
662 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;
663 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;
665 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;
669 for(Int_t c4=0; c4<2; c4++){
670 for(Int_t term=0; term<13; term++){
672 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;
673 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;
674 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;
676 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;
683 for(Int_t tKbin=0; tKbin<fKbinsT; tKbin++){
684 for(Int_t yKbin=0; yKbin<fKbinsY; yKbin++){
685 if(KT[tKbin].KY[yKbin].MB[mb].EDB[edB].TwoPT[0].fTerms2ThreeD) delete KT[tKbin].KY[yKbin].MB[mb].EDB[edB].TwoPT[0].fTerms2ThreeD;
686 if(KT[tKbin].KY[yKbin].MB[mb].EDB[edB].TwoPT[1].fTerms2ThreeD) delete KT[tKbin].KY[yKbin].MB[mb].EDB[edB].TwoPT[1].fTerms2ThreeD;
694 for(Int_t i=0; i<12; i++){
695 if(fFSIss[i]) delete fFSIss[i];
696 if(fFSIos[i]) delete fFSIos[i];
698 for(Int_t i=0; i<3; i++){// Kt iterator
699 for(Int_t j=0; j<10; j++){// Mbin iterator
700 if(fNormWeight[i][j]) delete fNormWeight[i][j];
705 //________________________________________________________________________
706 void AliFourPion::ParInit()
708 cout<<"AliFourPion MyInit() call"<<endl;
709 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;
711 fRandomNumber = new TRandom3();
712 fRandomNumber->SetSeed(0);
719 fTPCTOFboundry = 0.6;// TPC pid used below this momentum, TOF above but below TOF_boundry
720 fTOFboundry = 2.1;// TOF pid used below this momentum
722 ////////////////////////////////////////////////
724 fShareQuality = .5;// max
725 fShareFraction = .05;// max
726 ////////////////////////////////////////////////
729 fMultLimits[0]=0, fMultLimits[1]=2, fMultLimits[2]=4, fMultLimits[3]=6, fMultLimits[4]=8, fMultLimits[5]=10;
730 fMultLimits[6]=12, fMultLimits[7]=14, fMultLimits[8]=16, fMultLimits[9]=18, fMultLimits[10]=20, fMultLimits[11]=150;
734 if(fPbPbcase) {// PbPb
735 fMultLimit=kMultLimitPbPb;
738 fNormQcutLow = 0.15;// 0.15
739 fNormQcutHigh = 0.2;// 0.175
741 fMultLimit=kMultLimitpp;
748 fQLowerCut = 0.005;// was 0.005
752 fKmeanY[0] = 0;// central y
755 // 4x1 (Kt: 0-0.25, 0.25-0.35, 0.35-0.45, 0.45-1.0)
757 fKstepT[0] = 0.25; fKstepT[1] = 0.1; fKstepT[2] = 0.1; fKstepT[3] = 0.55;
758 fKmeanT[0] = 0.212; fKmeanT[1] = 0.299; fKmeanT[2] = 0.398; fKmeanT[3] = 0.576;
759 fKmiddleT[0] = 0.125; fKmiddleT[1] = 0.3; fKmiddleT[2] = 0.4; fKmiddleT[3] = 0.725;
761 // 3x1 (Kt: 0-0.3, 0.3-0.45, 0.45-1.0)
763 fKstepT[0] = 0.3; fKstepT[1] = 0.15; fKstepT[2] = 0.55;
764 fKmeanT[0] = 0.240; fKmeanT[1] = 0.369; fKmeanT[2] = 0.576;
765 fKmiddleT[0] = 0.15; fKmiddleT[1] = 0.375; fKmiddleT[2] = 0.725;
767 // 2x1 (Kt: 0-0.35, 0.35-1.0)
769 fKstepT[0] = 0.35; fKstepT[1] = 0.65;
770 fKmeanT[0] = 0.264; fKmeanT[1] = 0.500;
771 fKmiddleT[0] = 0.175; fKmiddleT[1] = 0.675;
775 fQupperBoundWeights = 0.2;
776 fQupperBoundQ2 = 2.0;
777 fQupperBoundQ3 = 0.6;
778 fQupperBoundQ4 = 0.6;
779 fQbinsQ2 = fQupperBoundQ2/0.005;
780 fQbinsQ3 = fQupperBoundQ3/0.005;
781 fQbinsQ4 = fQupperBoundQ4/0.005;
782 fQstepWeights = fQupperBoundWeights/Float_t(kQbinsWeights);
783 for(Int_t i=0; i<kQbinsWeights; i++) {fQmean[i]=(i+0.5)*fQstepWeights;}
785 fDampStart = 0.5;// was 0.3, then 0.5
789 fKT3transition = 0.3;
790 fKT4transition = 0.3;
792 fEC = new AliFourPionEventCollection **[fZvertexBins];
793 for(UShort_t i=0; i<fZvertexBins; i++){
795 fEC[i] = new AliFourPionEventCollection *[fMbins];
797 for(UShort_t j=0; j<fMbins; j++){
799 fEC[i][j] = new AliFourPionEventCollection(fEventsToMix+1, fMultLimit, kMCarrayLimit, fMCcase);
803 for(Int_t i=0; i<kMultLimitPbPb; i++) fDefaultsCharSwitch[i]='0';
804 for(Int_t i=0; i<kMultLimitPbPb; i++) {
805 fLowQPairSwitch_E0E0[i] = new TArrayC(kMultLimitPbPb,fDefaultsCharSwitch);
806 fLowQPairSwitch_E0E1[i] = new TArrayC(kMultLimitPbPb,fDefaultsCharSwitch);
807 fLowQPairSwitch_E0E2[i] = new TArrayC(kMultLimitPbPb,fDefaultsCharSwitch);
808 fLowQPairSwitch_E0E3[i] = new TArrayC(kMultLimitPbPb,fDefaultsCharSwitch);
809 fLowQPairSwitch_E1E1[i] = new TArrayC(kMultLimitPbPb,fDefaultsCharSwitch);
810 fLowQPairSwitch_E1E2[i] = new TArrayC(kMultLimitPbPb,fDefaultsCharSwitch);
811 fLowQPairSwitch_E1E3[i] = new TArrayC(kMultLimitPbPb,fDefaultsCharSwitch);
812 fLowQPairSwitch_E2E3[i] = new TArrayC(kMultLimitPbPb,fDefaultsCharSwitch);
814 fNormQPairSwitch_E0E0[i] = new TArrayC(kMultLimitPbPb,fDefaultsCharSwitch);
815 fNormQPairSwitch_E0E1[i] = new TArrayC(kMultLimitPbPb,fDefaultsCharSwitch);
816 fNormQPairSwitch_E0E2[i] = new TArrayC(kMultLimitPbPb,fDefaultsCharSwitch);
817 fNormQPairSwitch_E0E3[i] = new TArrayC(kMultLimitPbPb,fDefaultsCharSwitch);
818 fNormQPairSwitch_E1E1[i] = new TArrayC(kMultLimitPbPb,fDefaultsCharSwitch);
819 fNormQPairSwitch_E1E2[i] = new TArrayC(kMultLimitPbPb,fDefaultsCharSwitch);
820 fNormQPairSwitch_E1E3[i] = new TArrayC(kMultLimitPbPb,fDefaultsCharSwitch);
821 fNormQPairSwitch_E2E3[i] = new TArrayC(kMultLimitPbPb,fDefaultsCharSwitch);
824 fTempStruct = new AliFourPionTrackStruct[fMultLimit];
827 fTrueMassP=0.93827, fTrueMassPi=0.13957, fTrueMassK=0.493677, fTrueMassKs=0.497614, fTrueMassLam=1.11568;
831 // Set weights, Coulomb corrections, and Momentum resolution corrections manually if not on LEGO
833 SetFSICorrelations(fLEGO);// Read in 2-particle and 3-particle FSI correlations
834 if(!fTabulatePairs) SetWeightArrays(fLEGO);// Set Weight Array
835 if(!fMCcase && !fTabulatePairs) SetMomResCorrections(fLEGO);// Read Momentum resolution file
836 if(!fMCcase && !fTabulatePairs) SetMuonCorrections(fLEGO);// Read Muon corrections
839 /////////////////////////////////////////////
840 /////////////////////////////////////////////
843 //________________________________________________________________________
844 void AliFourPion::UserCreateOutputObjects()
849 ParInit();// Initialize my settings
852 fOutputList = new TList();
853 fOutputList->SetOwner();
855 TH3F *fVertexDist = new TH3F("fVertexDist","Vertex Distribution",20,-1,1, 20,-1,1, 600,-30,30);
856 fVertexDist->GetXaxis()->SetTitle("X Vertex (cm)");
857 fVertexDist->GetYaxis()->SetTitle("Y Vertex (cm)");
858 fVertexDist->GetZaxis()->SetTitle("Z Vertex (cm)");
859 fOutputList->Add(fVertexDist);
862 TH2F *fDCAxyDistPlus = new TH2F("fDCAxyDistPlus","DCA distribution",300,0,3., 50,0,5);
863 fOutputList->Add(fDCAxyDistPlus);
864 TH2F *fDCAzDistPlus = new TH2F("fDCAzDistPlus","DCA distribution",300,0,3., 50,0,5);
865 fOutputList->Add(fDCAzDistPlus);
866 TH2F *fDCAxyDistMinus = new TH2F("fDCAxyDistMinus","DCA distribution",300,0,3., 50,0,5);
867 fOutputList->Add(fDCAxyDistMinus);
868 TH2F *fDCAzDistMinus = new TH2F("fDCAzDistMinus","DCA distribution",300,0,3., 50,0,5);
869 fOutputList->Add(fDCAzDistMinus);
872 TH1F *fEvents1 = new TH1F("fEvents1","Events vs. fMbin",fMbins,.5,fMbins+.5);
873 fOutputList->Add(fEvents1);
874 TH1F *fEvents2 = new TH1F("fEvents2","Events vs. fMbin",fMbins,.5,fMbins+.5);
875 fOutputList->Add(fEvents2);
877 TH1F *fMultDist0 = new TH1F("fMultDist0","Multiplicity Distribution",fMultLimit,-.5,fMultLimit-.5);
878 fMultDist0->GetXaxis()->SetTitle("Multiplicity");
879 fOutputList->Add(fMultDist0);
881 TH1F *fMultDist1 = new TH1F("fMultDist1","Multiplicity Distribution",fMultLimit,-.5,fMultLimit-.5);
882 fMultDist1->GetXaxis()->SetTitle("Multiplicity");
883 fOutputList->Add(fMultDist1);
885 TH1F *fMultDist2 = new TH1F("fMultDist2","Multiplicity Distribution",fMultLimit,-.5,fMultLimit-.5);
886 fMultDist2->GetXaxis()->SetTitle("Multiplicity");
887 fOutputList->Add(fMultDist2);
889 TH1F *fMultDist3 = new TH1F("fMultDist3","Multiplicity Distribution",fMultLimit,-.5,fMultLimit-.5);
890 fMultDist3->GetXaxis()->SetTitle("Multiplicity");
891 fOutputList->Add(fMultDist3);
893 TH3F *fPtEtaDist = new TH3F("fPtEtaDist","fPtEtaDist",2,-1.1,1.1, 300,0,3., 28,-1.4,1.4);
894 fOutputList->Add(fPtEtaDist);
896 TH3F *fPhiPtDist = new TH3F("fPhiPtDist","fPhiPtDist",2,-1.1,1.1, 120,0,2*PI, 300,0,3.);
897 fOutputList->Add(fPhiPtDist);
899 TH3F *fTOFResponse = new TH3F("fTOFResponse","TOF relative time",20,0,100, 200,0,2, 4000,-20000,20000);
900 fOutputList->Add(fTOFResponse);
901 TH3F *fTPCResponse = new TH3F("fTPCResponse","TPCsignal",20,0,100, 200,0,2, 1000,0,1000);
902 fOutputList->Add(fTPCResponse);
904 TH1F *fRejectedPairs = new TH1F("fRejectedPairs","",200,0,2);
905 fOutputList->Add(fRejectedPairs);
906 TH1I *fRejectedEvents = new TH1I("fRejectedEvents","",fMbins,0.5,fMbins+.5);
907 fOutputList->Add(fRejectedEvents);
909 TH3F *fPairsDetaDPhiNum = new TH3F("fPairsDetaDPhiNum","",10,-.5,9.5, 200,-0.2,0.2, 600,-0.3,0.3);
910 if(fMCcase) fOutputList->Add(fPairsDetaDPhiNum);
911 TH3F *fPairsDetaDPhiDen = new TH3F("fPairsDetaDPhiDen","",10,-.5,9.5, 200,-0.2,0.2, 600,-0.3,0.3);
912 if(fMCcase) fOutputList->Add(fPairsDetaDPhiDen);
913 TH3F *fPairsShareFracDPhiNum = new TH3F("fPairsShareFracDPhiNum","",10,-.5,9.5, 159,0,1, 600,-0.3,0.3);
914 if(fMCcase) fOutputList->Add(fPairsShareFracDPhiNum);
915 TH3F *fPairsShareFracDPhiDen = new TH3F("fPairsShareFracDPhiDen","",10,-.5,9.5, 159,0,1, 600,-0.3,0.3);
916 if(fMCcase) fOutputList->Add(fPairsShareFracDPhiDen);
917 TH3D* fPairsPadRowNum = new TH3D("fPairsPadRowNum","", 20,0,1, 159,0,1, 40,0,0.2);
918 if(fMCcase) fOutputList->Add(fPairsPadRowNum);
919 TH3D* fPairsPadRowDen = new TH3D("fPairsPadRowDen","", 20,0,1, 159,0,1, 40,0,0.2);
920 if(fMCcase) fOutputList->Add(fPairsPadRowDen);
924 TH2D *fResonanceOSPairs = new TH2D("fResonanceOSPairs","",fMbins,.5,fMbins+.5, 1000,0,2);
925 if(fMCcase) fOutputList->Add(fResonanceOSPairs);
926 TH2D *fAllOSPairs = new TH2D("fAllOSPairs","",fMbins,.5,fMbins+.5, 1000,0,2);
927 if(fMCcase) fOutputList->Add(fAllOSPairs);
929 TH3D *fPrimarySCPionPairs = new TH3D("fPrimarySCPionPairs","",fMbins,.5,fMbins+.5, 20,0,1, 20,0,0.2);
930 if(fMCcase) fOutputList->Add(fPrimarySCPionPairs);
931 TH3D *fAllSCPionPairs = new TH3D("fAllSCPionPairs","",fMbins,.5,fMbins+.5, 20,0,1, 20,0,0.2);
932 if(fMCcase) fOutputList->Add(fAllSCPionPairs);
933 TH3D *fPrimaryMCPionPairs = new TH3D("fPrimaryMCPionPairs","",fMbins,.5,fMbins+.5, 20,0,1, 20,0,0.2);
934 if(fMCcase) fOutputList->Add(fPrimaryMCPionPairs);
935 TH3D *fAllMCPionPairs = new TH3D("fAllMCPionPairs","",fMbins,.5,fMbins+.5, 20,0,1, 20,0,0.2);
936 if(fMCcase) fOutputList->Add(fAllMCPionPairs);
939 TH1D *fMuonParents = new TH1D("fMuonParents","",500,0.5,500.5);
940 if(fMCcase) fOutputList->Add(fMuonParents);
941 TH1D *fSecondaryMuonParents = new TH1D("fSecondaryMuonParents","",500,0.5,500.5);
942 if(fMCcase) fOutputList->Add(fSecondaryMuonParents);
943 TH3D *fMuonPionDeltaQinv = new TH3D("fMuonPionDeltaQinv","",2,-0.5,1.5, 20,0,1, 100,-0.2,0.2);
944 if(fMCcase) fOutputList->Add(fMuonPionDeltaQinv);
945 TH1D *fPionCandidates = new TH1D("fPionCandidates","",500,0.5,500.5);
946 if(fMCcase) fOutputList->Add(fPionCandidates);
950 TProfile *fAvgMult = new TProfile("fAvgMult","",fMbins,.5,fMbins+.5, 0,1500,"");
951 fOutputList->Add(fAvgMult);
953 TH2D *fTrackChi2NDF = new TH2D("fTrackChi2NDF","",20,0,100, 100,0,10);
954 fOutputList->Add(fTrackChi2NDF);
955 TH2D *fTrackTPCncls = new TH2D("fTrackTPCncls","",20,0,100, 110,50,160);
956 fOutputList->Add(fTrackTPCncls);
959 TH1D *fTPNRejects3pion1 = new TH1D("fTPNRejects3pion1","",fQbinsQ3,0,fQupperBoundQ3);
960 fOutputList->Add(fTPNRejects3pion1);
961 TH1D *fTPNRejects3pion2 = new TH1D("fTPNRejects3pion2","",fQbinsQ3,0,fQupperBoundQ3);
962 fOutputList->Add(fTPNRejects3pion2);
963 TH1D *fTPNRejects4pion1 = new TH1D("fTPNRejects4pion1","",fQbinsQ4,0,fQupperBoundQ4);
964 fOutputList->Add(fTPNRejects4pion1);
966 TH3D *fKT3DistTerm1 = new TH3D("fKT3DistTerm1","",fMbins,.5,fMbins+.5, 20,0,1, 20,0,0.2);
967 TH3D *fKT3DistTerm5 = new TH3D("fKT3DistTerm5","",fMbins,.5,fMbins+.5, 20,0,1, 20,0,0.2);
968 fOutputList->Add(fKT3DistTerm1);
969 fOutputList->Add(fKT3DistTerm5);
970 TH3D *fKT4DistTerm1 = new TH3D("fKT4DistTerm1","",fMbins,.5,fMbins+.5, 20,0,1, 20,0,0.2);
971 TH3D *fKT4DistTerm13 = new TH3D("fKT4DistTerm13","",fMbins,.5,fMbins+.5, 20,0,1, 20,0,0.2);
972 fOutputList->Add(fKT4DistTerm1);
973 fOutputList->Add(fKT4DistTerm13);
976 TProfile2D *fKT3AvgpT = new TProfile2D("fKT3AvgpT","",fMbins,.5,fMbins+.5, 2,-0.5,1.5, 0.,1.0,"");
977 fOutputList->Add(fKT3AvgpT);
978 TProfile2D *fKT4AvgpT = new TProfile2D("fKT4AvgpT","",fMbins,.5,fMbins+.5, 2,-0.5,1.5, 0.,1.0,"");
979 fOutputList->Add(fKT4AvgpT);
982 TH1D *fMCWeight3DTerm1SC = new TH1D("fMCWeight3DTerm1SC","", 20,0,0.2);
983 TH1D *fMCWeight3DTerm1SCden = new TH1D("fMCWeight3DTerm1SCden","", 20,0,0.2);
984 TH1D *fMCWeight3DTerm2SC = new TH1D("fMCWeight3DTerm2SC","", 20,0,0.2);
985 TH1D *fMCWeight3DTerm2SCden = new TH1D("fMCWeight3DTerm2SCden","", 20,0,0.2);
986 TH1D *fMCWeight3DTerm1MC = new TH1D("fMCWeight3DTerm1MC","", 20,0,0.2);
987 TH1D *fMCWeight3DTerm1MCden = new TH1D("fMCWeight3DTerm1MCden","", 20,0,0.2);
988 TH1D *fMCWeight3DTerm2MC = new TH1D("fMCWeight3DTerm2MC","", 20,0,0.2);
989 TH1D *fMCWeight3DTerm2MCden = new TH1D("fMCWeight3DTerm2MCden","", 20,0,0.2);
990 TH1D *fMCWeight3DTerm3MC = new TH1D("fMCWeight3DTerm3MC","", 20,0,0.2);
991 TH1D *fMCWeight3DTerm3MCden = new TH1D("fMCWeight3DTerm3MCden","", 20,0,0.2);
992 TH1D *fMCWeight3DTerm4MC = new TH1D("fMCWeight3DTerm4MC","", 20,0,0.2);
993 TH1D *fMCWeight3DTerm4MCden = new TH1D("fMCWeight3DTerm4MCden","", 20,0,0.2);
994 fOutputList->Add(fMCWeight3DTerm1SC);
995 fOutputList->Add(fMCWeight3DTerm1SCden);
996 fOutputList->Add(fMCWeight3DTerm2SC);
997 fOutputList->Add(fMCWeight3DTerm2SCden);
998 fOutputList->Add(fMCWeight3DTerm1MC);
999 fOutputList->Add(fMCWeight3DTerm1MCden);
1000 fOutputList->Add(fMCWeight3DTerm2MC);
1001 fOutputList->Add(fMCWeight3DTerm2MCden);
1002 fOutputList->Add(fMCWeight3DTerm3MC);
1003 fOutputList->Add(fMCWeight3DTerm3MCden);
1004 fOutputList->Add(fMCWeight3DTerm4MC);
1005 fOutputList->Add(fMCWeight3DTerm4MCden);
1008 if(fPdensityPairCut){
1010 for(Int_t mb=0; mb<fMbins; mb++){
1011 if((mb < fCentBinLowLimit) || (mb > fCentBinHighLimit)) continue;
1013 for(Int_t edB=0; edB<fEDbins; edB++){
1014 for(Int_t c1=0; c1<2; c1++){
1015 for(Int_t c2=0; c2<2; c2++){
1016 for(Int_t term=0; term<2; term++){
1018 TString *nameEx2 = new TString("TwoParticle_Charge1_");
1020 nameEx2->Append("_Charge2_");
1022 nameEx2->Append("_M_");
1024 nameEx2->Append("_ED_");
1026 nameEx2->Append("_Term_");
1029 if( (c1+c2)==1 ) {if(c1!=0) continue;}// skip degenerate histogram
1032 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fTerms2 = new TH2D(nameEx2->Data(),"Two Particle Distribution",20,0,1, fQbinsQ2,0,fQupperBoundQ2);
1033 fOutputList->Add(Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fTerms2);
1034 TString *nameEx2QW=new TString(nameEx2->Data());
1035 nameEx2QW->Append("_QW");
1036 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fTerms2QW = new TH2D(nameEx2QW->Data(),"Two Particle Distribution",20,0,1, fQbinsQ2,0,fQupperBoundQ2);
1037 fOutputList->Add(Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fTerms2QW);
1038 TString *nameAvgP=new TString(nameEx2->Data());
1039 nameAvgP->Append("_AvgP");
1040 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fAvgP = new TProfile2D(nameAvgP->Data(),"",10,0,1, fQbinsQ2,0,fQupperBoundQ2, 0.,1.0,"");
1041 fOutputList->Add(Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fAvgP);
1043 TString *nameUnitMult=new TString(nameEx2->Data());
1044 nameUnitMult->Append("_UnitMult");
1045 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);
1046 fOutputList->Add(Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fUnitMultBin);
1049 // Momentum resolution histos
1050 TString *nameIdeal = new TString(nameEx2->Data());
1051 nameIdeal->Append("_Ideal");
1052 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);
1053 if(mb==0) fOutputList->Add(Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fIdeal);
1054 TString *nameSmeared = new TString(nameEx2->Data());
1055 nameSmeared->Append("_Smeared");
1056 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);
1057 if(mb==0) fOutputList->Add(Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fSmeared);
1059 // Muon correction histos
1060 TString *nameMuonIdeal=new TString(nameEx2->Data());
1061 nameMuonIdeal->Append("_MuonIdeal");
1062 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fMuonIdeal = new TH2D(nameMuonIdeal->Data(),"", 11,0.5,11.5, fQbinsQ2,0,fQupperBoundQ2);
1063 if(mb==0 && edB==0) fOutputList->Add(Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fMuonIdeal);
1064 TString *nameMuonSmeared=new TString(nameEx2->Data());
1065 nameMuonSmeared->Append("_MuonSmeared");
1066 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fMuonSmeared = new TH2D(nameMuonSmeared->Data(),"", 11,0.5,11.5, fQbinsQ2,0,fQupperBoundQ2);
1067 if(mb==0 && edB==0) fOutputList->Add(Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fMuonSmeared);
1069 TString *nameMuonPionK2=new TString(nameEx2->Data());
1070 nameMuonPionK2->Append("_MuonPionK2");
1071 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fMuonPionK2 = new TH2D(nameMuonPionK2->Data(),"", 11,0.5,11.5, fQbinsQ2,0,fQupperBoundQ2);
1072 if(mb==0 && edB==0) fOutputList->Add(Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fMuonPionK2);
1074 TString *namePionPionK2=new TString(nameEx2->Data());
1075 namePionPionK2->Append("_PionPionK2");
1076 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fPionPionK2 = new TH2D(namePionPionK2->Data(),"", 11,0.5,11.5, fQbinsQ2,0,fQupperBoundQ2);
1077 if(mb==0 && edB==0) fOutputList->Add(Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fPionPionK2);
1080 TString *nameEx2MC=new TString(nameEx2->Data());
1081 nameEx2MC->Append("_MCqinv");
1082 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fMCqinv = new TH1D(nameEx2MC->Data(),"", fQbinsQ2,0,fQupperBoundQ2);
1083 fOutputList->Add(Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fMCqinv);
1084 TString *nameEx2MCQW=new TString(nameEx2->Data());
1085 nameEx2MCQW->Append("_MCqinvQW");
1086 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fMCqinvQW = new TH1D(nameEx2MCQW->Data(),"", fQbinsQ2,0,fQupperBoundQ2);
1087 fOutputList->Add(Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fMCqinvQW);
1089 TString *nameEx2PIDpurityDen=new TString(nameEx2->Data());
1090 nameEx2PIDpurityDen->Append("_PIDpurityDen");
1091 Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fPIDpurityDen = new TH2D(nameEx2PIDpurityDen->Data(),"Two Particle Distribution",20,0,1, fQbinsQ2,0,fQupperBoundQ2);
1092 fOutputList->Add(Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fPIDpurityDen);
1093 TString *nameEx2PIDpurityNum=new TString(nameEx2->Data());
1094 nameEx2PIDpurityNum->Append("_PIDpurityNum");
1095 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);
1096 fOutputList->Add(Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].fPIDpurityNum);
1098 TString *nameEx2OSLB1 = new TString(nameEx2->Data());
1099 nameEx2OSLB1->Append("_osl_b1");
1100 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);
1101 fOutputList->Add(Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[0].fTerms2OSL);
1102 nameEx2OSLB1->Append("_QW");
1103 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);
1104 fOutputList->Add(Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[0].fTerms2OSLQW);
1106 TString *nameEx2OSLB2 = new TString(nameEx2->Data());
1107 nameEx2OSLB2->Append("_osl_b2");
1108 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);
1109 fOutputList->Add(Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[1].fTerms2OSL);
1110 nameEx2OSLB2->Append("_QW");
1111 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);
1112 fOutputList->Add(Charge1[c1].Charge2[c2].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[1].fTerms2OSLQW);
1118 // skip 3-particle if Tabulate6DPairs is true
1119 if(fTabulatePairs) continue;
1121 for(Int_t c3=0; c3<2; c3++){
1122 for(Int_t term=0; term<5; term++){
1124 TString *namePC3 = new TString("ThreeParticle_Charge1_");
1126 namePC3->Append("_Charge2_");
1128 namePC3->Append("_Charge3_");
1130 namePC3->Append("_M_");
1132 namePC3->Append("_ED_");
1134 namePC3->Append("_Term_");
1137 ///////////////////////////////////////
1138 // skip degenerate histograms
1139 if( (c1+c2+c3)==1) {if(c3!=1) continue;}
1140 if( (c1+c2+c3)==2) {if(c1!=0) continue;}
1141 /////////////////////////////////////////
1144 TString *nameNorm=new TString(namePC3->Data());
1145 nameNorm->Append("_Norm");
1146 Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fNorm3 = new TH1D(nameNorm->Data(),"Norm",1,-0.5,0.5);
1147 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fNorm3);
1150 TString *name1DQ=new TString(namePC3->Data());
1151 name1DQ->Append("_1D");
1152 Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fTerms3 = new TH1D(name1DQ->Data(),"", fQbinsQ3,0,fQupperBoundQ3);
1153 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fTerms3);
1155 TString *nameKfactor=new TString(namePC3->Data());
1156 nameKfactor->Append("_Kfactor");
1157 Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fKfactor = new TProfile(nameKfactor->Data(),"", fQbinsQ3,0,fQupperBoundQ3, 0,100, "");
1158 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fKfactor);
1160 TString *nameMeanQinv=new TString(namePC3->Data());
1161 nameMeanQinv->Append("_MeanQinv");
1162 Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fMeanQinv = new TProfile(nameMeanQinv->Data(),"", fQbinsQ3,0,fQupperBoundQ3, 0,.2, "");
1163 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fMeanQinv);
1166 // Momentum resolution correction histos
1167 TString *nameMomResIdeal=new TString(namePC3->Data());
1168 nameMomResIdeal->Append("_Ideal");
1169 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);
1170 if(mb==0) fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fIdeal);
1171 TString *nameMomResSmeared=new TString(namePC3->Data());
1172 nameMomResSmeared->Append("_Smeared");
1173 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);
1174 if(mb==0) fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fSmeared);
1175 // Muon correction histos
1176 TString *nameMuonIdeal=new TString(namePC3->Data());
1177 nameMuonIdeal->Append("_MuonIdeal");
1178 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);
1179 if(mb==0 && edB==0 && term<4) fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fMuonIdeal);
1180 TString *nameMuonSmeared=new TString(namePC3->Data());
1181 nameMuonSmeared->Append("_MuonSmeared");
1182 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);
1183 if(mb==0 && edB==0 && term<4) fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fMuonSmeared);
1185 TString *nameMuonPionK3=new TString(namePC3->Data());
1186 nameMuonPionK3->Append("_MuonPionK3");
1187 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);
1188 if(mb==0 && edB==0 && term<4) fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fMuonPionK3);
1190 TString *namePionPionK3=new TString(namePC3->Data());
1191 namePionPionK3->Append("_PionPionK3");
1192 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);
1193 if(mb==0 && edB==0 && term<4) fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fPionPionK3);
1197 if(c1==c2 && c1==c3 && term==4 ){
1198 TString *nameTwoPartNorm=new TString(namePC3->Data());
1199 nameTwoPartNorm->Append("_TwoPartNorm");
1200 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);
1201 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].MB[mb].EDB[edB].ThreePT[term].fTwoPartNorm);
1206 for(Int_t c4=0; c4<2; c4++){
1207 for(Int_t term=0; term<13; term++){
1209 TString *namePC4 = new TString("FourParticle_Charge1_");
1211 namePC4->Append("_Charge2_");
1213 namePC4->Append("_Charge3_");
1215 namePC4->Append("_Charge4_");
1217 namePC4->Append("_M_");
1219 namePC4->Append("_ED_");
1221 namePC4->Append("_Term_");
1224 ///////////////////////////////////////
1225 // skip degenerate histograms
1226 if( (c1+c2+c3+c4)==1) {if(c4!=1) continue;}
1227 if( (c1+c2+c3+c4)==2) {if(c3+c4!=2) continue;}
1228 if( (c1+c2+c3+c4)==3) {if(c1!=0) continue;}
1229 /////////////////////////////////////////
1231 TString *nameNorm=new TString(namePC4->Data());
1232 nameNorm->Append("_Norm");
1233 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);
1234 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fNorm4);
1236 TString *name1DQ=new TString(namePC4->Data());
1237 name1DQ->Append("_1D");
1238 Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fTerms4 = new TH1D(name1DQ->Data(),"", fQbinsQ4,0,fQupperBoundQ4);
1239 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fTerms4);
1241 TString *nameKfactor=new TString(namePC4->Data());
1242 nameKfactor->Append("_Kfactor");
1243 Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fKfactor = new TProfile(nameKfactor->Data(),"", fQbinsQ4,0,fQupperBoundQ4, 0,100, "");
1244 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fKfactor);
1246 if(c1==c2 && c1==c3 && c1==c4 && term==12 ){
1247 TString *nameTwoPartNorm=new TString(namePC4->Data());
1248 nameTwoPartNorm->Append("_TwoPartNorm");
1249 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);
1250 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fTwoPartNorm);
1254 // Momentum resolution correction histos
1255 TString *nameMomResIdeal=new TString(namePC4->Data());
1256 nameMomResIdeal->Append("_Ideal");
1257 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);
1258 if(mb==0) fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fIdeal);
1259 TString *nameMomResSmeared=new TString(namePC4->Data());
1260 nameMomResSmeared->Append("_Smeared");
1261 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);
1262 if(mb==0) fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fSmeared);
1263 // Muon correction histos
1264 TString *nameMuonIdeal=new TString(namePC4->Data());
1265 nameMuonIdeal->Append("_MuonIdeal");
1266 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);
1267 if(mb==0 && edB==0 && term<12) fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fMuonIdeal);
1268 TString *nameMuonSmeared=new TString(namePC4->Data());
1269 nameMuonSmeared->Append("_MuonSmeared");
1270 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);
1271 if(mb==0 && edB==0 && term<12) fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fMuonSmeared);
1273 TString *nameMuonPionK4=new TString(namePC4->Data());
1274 nameMuonPionK4->Append("_MuonPionK4");
1275 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);
1276 if(mb==0 && edB==0 && term<12) fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fMuonPionK4);
1278 TString *namePionPionK4=new TString(namePC4->Data());
1279 namePionPionK4->Append("_PionPionK4");
1280 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);
1281 if(mb==0 && edB==0 && term<12) fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].Charge4[c4].MB[mb].EDB[edB].FourPT[term].fPionPionK4);
1299 for(Int_t tKbin=0; tKbin<fKbinsT; tKbin++){
1300 for(Int_t yKbin=0; yKbin<fKbinsY; yKbin++){
1301 for(Int_t mb=0; mb<fMbins; mb++){
1302 for(Int_t edB=0; edB<fEDbins; edB++){
1304 TString *nameNum = new TString("TPN_num_Kt_");
1306 nameNum->Append("_Ky_");
1308 nameNum->Append("_M_");
1310 nameNum->Append("_ED_");
1313 TString *nameDen = new TString("TPN_den_Kt_");
1315 nameDen->Append("_Ky_");
1317 nameDen->Append("_M_");
1319 nameDen->Append("_ED_");
1323 KT[tKbin].KY[yKbin].MB[mb].EDB[edB].TwoPT[0].fTerms2ThreeD = new TH3D(nameNum->Data(),"", kQbinsWeights,0,fQupperBoundWeights, kQbinsWeights,0,fQupperBoundWeights, kQbinsWeights,0,fQupperBoundWeights);
1324 fOutputList->Add(KT[tKbin].KY[yKbin].MB[mb].EDB[edB].TwoPT[0].fTerms2ThreeD);
1326 KT[tKbin].KY[yKbin].MB[mb].EDB[edB].TwoPT[1].fTerms2ThreeD = new TH3D(nameDen->Data(),"", kQbinsWeights,0,fQupperBoundWeights, kQbinsWeights,0,fQupperBoundWeights, kQbinsWeights,0,fQupperBoundWeights);
1327 fOutputList->Add(KT[tKbin].KY[yKbin].MB[mb].EDB[edB].TwoPT[1].fTerms2ThreeD);
1338 TProfile *fQsmearMean = new TProfile("fQsmearMean","",2,0.5,2.5, -0.2,0.2,"");
1339 fOutputList->Add(fQsmearMean);
1340 TProfile *fQsmearSq = new TProfile("fQsmearSq","",2,0.5,2.5, -2,2,"");
1341 fOutputList->Add(fQsmearSq);
1342 TH2D *fQ2Res = new TH2D("fQ2Res","",20,0,1, 200,-.2,.2);
1343 fOutputList->Add(fQ2Res);
1344 TH2D *fQ3Res = new TH2D("fQ3Res","",20,0,1, 200,-.3,.3);
1345 fOutputList->Add(fQ3Res);
1346 TH2D *fQ4Res = new TH2D("fQ4Res","",20,0,1, 200,-.4,.4);
1347 fOutputList->Add(fQ4Res);
1349 TH2D *DistQinv4pion = new TH2D("DistQinv4pion","",6,0.5,6.5, 20,0,0.1);
1350 fOutputList->Add(DistQinv4pion);
1351 TH2D *DistQinvMC4pion = new TH2D("DistQinvMC4pion","",6,0.5,6.5, 20,0,0.1);
1352 if(fMCcase) fOutputList->Add(DistQinvMC4pion);
1354 TH2D *fAvgQ12VersusQ3 = new TH2D("fAvgQ12VersusQ3","",10,0,0.1, 20,0,0.1);
1355 fOutputList->Add(fAvgQ12VersusQ3);
1356 TH2D *fAvgQ13VersusQ3 = new TH2D("fAvgQ13VersusQ3","",10,0,0.1, 20,0,0.1);
1357 fOutputList->Add(fAvgQ13VersusQ3);
1358 TH2D *fAvgQ23VersusQ3 = new TH2D("fAvgQ23VersusQ3","",10,0,0.1, 20,0,0.1);
1359 fOutputList->Add(fAvgQ23VersusQ3);
1361 TH1D *fDistPionParents4 = new TH1D("fDistPionParents4","",4,0.5,4.5);
1362 fOutputList->Add(fDistPionParents4);
1364 ////////////////////////////////////
1365 ///////////////////////////////////
1367 PostData(1, fOutputList);
1370 //________________________________________________________________________
1371 void AliFourPion::UserExec(Option_t *)
1374 // Called for each event
1375 //cout<<"=========== Event # "<<fEventCounter+1<<" ==========="<<endl;
1378 if(!fAODcase) {cout<<"ESDs not supported"<<endl; return;}
1380 fAOD = dynamic_cast<AliAODEvent*> (InputEvent());
1381 if (!fAOD) {Printf("ERROR: fAOD not available"); return;}
1385 if(fAOD->GetRunNumber() >= 136851 && fAOD->GetRunNumber() <= 139517){// 10h data
1386 Bool_t isSelected1 = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kMB);
1387 if(!isSelected1 && !fMCcase) {return;}
1388 }else if(fAOD->GetRunNumber() >= 167693 && fAOD->GetRunNumber() <= 170593){// 11h data
1389 Bool_t isSelected1 = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kCentral);
1390 Bool_t isSelected2 = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kSemiCentral);
1391 if(!isSelected1 && !isSelected2 && !fMCcase) {return;}
1394 ///////////////////////////////////////////////////////////
1395 const AliAODVertex *primaryVertexAOD;
1396 AliCentrality *centrality;// for AODs and ESDs
1399 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
1400 AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
1401 fPIDResponse = inputHandler->GetPIDResponse();
1404 TClonesArray *mcArray = 0x0;
1407 mcArray = (TClonesArray*)fAOD->FindListObject(AliAODMCParticle::StdBranchName());
1408 if(!mcArray || mcArray->GetEntriesFast() >= kMCarrayLimit){
1409 cout<<"No MC particle branch found or Array too large!!"<<endl;
1417 Int_t positiveTracks=0, negativeTracks=0;
1418 Int_t myTracks=0, pionCount=0, kaonCount=0, protonCount=0;
1420 Double_t vertex[3]={0};
1422 Double_t zstep=2*10/Double_t(fZvertexBins), zstart=-10.;
1423 /////////////////////////////////////////////////
1426 Float_t centralityPercentile=0;
1427 Float_t cStep=5.0, cStart=0;
1430 if(fAODcase){// AOD case
1433 centrality = fAOD->GetCentrality();
1434 centralityPercentile = centrality->GetCentralityPercentile("V0M");
1435 if(centralityPercentile == 0) {cout<<"Centrality = 0, skipping event"<<endl; return;}
1436 if((centralityPercentile < 5*fCentBinLowLimit) || (centralityPercentile>= 5*(fCentBinHighLimit+1))) {/*cout<<"Centrality out of Range. Skipping Event"<<endl;*/ return;}
1437 cout<<"Centrality % = "<<centralityPercentile<<endl;
1441 ((TH1F*)fOutputList->FindObject("fMultDist0"))->Fill(fAOD->GetNumberOfTracks());
1443 // Pile-up rejection
1444 AliAnalysisUtils *AnaUtil=new AliAnalysisUtils();
1445 if(!fPbPbcase) AnaUtil->SetUseMVPlpSelection(kTRUE);// use Multi-Vertex tool for pp and pPb
1446 else AnaUtil->SetUseMVPlpSelection(kFALSE);
1447 Bool_t pileUpCase=AnaUtil->IsPileUpEvent(fAOD);
1448 if(pileUpCase) return;
1450 ////////////////////////////////
1452 ((TH1F*)fOutputList->FindObject("fMultDist1"))->Fill(fAOD->GetNumberOfTracks());
1453 primaryVertexAOD = fAOD->GetPrimaryVertex();
1454 vertex[0]=primaryVertexAOD->GetX(); vertex[1]=primaryVertexAOD->GetY(); vertex[2]=primaryVertexAOD->GetZ();
1456 if(fabs(vertex[2]) > 10) {cout<<"Zvertex Out of Range. Skip Event"<<endl; return;} // Z-Vertex Cut
1457 ((TH3F*)fOutputList->FindObject("fVertexDist"))->Fill(vertex[0], vertex[1], vertex[2]);
1459 if(!fMCcase && primaryVertexAOD->GetNContributors() < 1) {cout<<"Bad Vertex. Skip Event"<<endl; return;}
1461 ((TH1F*)fOutputList->FindObject("fMultDist2"))->Fill(fAOD->GetNumberOfTracks());
1463 fBfield = fAOD->GetMagneticField();
1465 for(Int_t i=0; i<fZvertexBins; i++){
1466 if( (vertex[2] >= zstart+i*zstep) && (vertex[2] < zstart+(i+1)*zstep) ){
1474 /////////////////////////////
1475 // Create Shuffled index list
1476 Int_t randomIndex[fAOD->GetNumberOfTracks()];
1477 for (Int_t i = 0; i < fAOD->GetNumberOfTracks(); i++) randomIndex[i]=i;
1478 Shuffle(randomIndex,0,fAOD->GetNumberOfTracks()-1);
1479 /////////////////////////////
1483 for (Int_t i = 0; i < fAOD->GetNumberOfTracks(); i++) {
1484 AliAODTrack* aodtrack = fAOD->GetTrack(randomIndex[i]);
1485 if (!aodtrack) continue;
1486 if(myTracks >= fMultLimit) {cout<<"More tracks than Track Limit"<<endl; return;}
1488 status=aodtrack->GetStatus();
1490 if(!aodtrack->TestFilterBit(BIT(fFilterBit))) continue;// AOD filterBit cut
1491 ((TH2D*)fOutputList->FindObject("fTrackChi2NDF"))->Fill(centralityPercentile, aodtrack->Chi2perNDF());
1492 ((TH2D*)fOutputList->FindObject("fTrackTPCncls"))->Fill(centralityPercentile, aodtrack->GetTPCncls());
1493 if(aodtrack->GetTPCNcls() < fMinTPCncls) continue;// TPC nCluster cut
1494 if(aodtrack->Chi2perNDF() > fMaxChi2NDF) continue;
1496 if(fFilterBit != 7){
1497 Bool_t goodTrackOtherFB = kFALSE;
1498 for (Int_t j = 0; j < fAOD->GetNumberOfTracks(); j++) {
1499 AliAODTrack* aodtrack2 = fAOD->GetTrack(randomIndex[j]);
1500 if(!aodtrack2) continue;
1501 if(!aodtrack2->TestFilterBit(BIT(fFilterBit))) continue;
1503 if(-(aodtrack->GetID()+1)==aodtrack2->GetID()) {goodTrackOtherFB=kTRUE; break;}
1506 if(!goodTrackOtherFB) continue;
1510 if(aodtrack->Pt() < 0.16) continue;
1511 if(fabs(aodtrack->Eta()) > 0.8) continue;
1514 Bool_t goodMomentum = aodtrack->GetPxPyPz( fTempStruct[myTracks].fP);
1515 if(!goodMomentum) continue;
1516 aodtrack->GetXYZ( fTempStruct[myTracks].fX);
1519 Double_t dca2[2]={0};
1520 dca2[0] = sqrt( pow(fTempStruct[myTracks].fX[0] - vertex[0],2) + pow(fTempStruct[myTracks].fX[1] - vertex[1],2));
1521 dca2[1] = sqrt( pow(fTempStruct[myTracks].fX[2] - vertex[2],2));
1522 Double_t dca3d = sqrt( pow(dca2[0],2) + pow(dca2[1],2));
1524 fTempStruct[myTracks].fStatus = status;
1525 fTempStruct[myTracks].fFiltermap = aodtrack->GetFilterMap();
1526 fTempStruct[myTracks].fId = aodtrack->GetID();
1528 fTempStruct[myTracks].fLabel = aodtrack->GetLabel();
1529 fTempStruct[myTracks].fPhi = atan2(fTempStruct[myTracks].fP[1], fTempStruct[myTracks].fP[0]);
1530 if(fTempStruct[myTracks].fPhi < 0) fTempStruct[myTracks].fPhi += 2*PI;
1531 fTempStruct[myTracks].fPt = sqrt(pow(fTempStruct[myTracks].fP[0],2) + pow(fTempStruct[myTracks].fP[1],2));
1532 fTempStruct[myTracks].fMom = sqrt( pow(fTempStruct[myTracks].fPt,2) + pow(fTempStruct[myTracks].fP[2],2) );
1533 fTempStruct[myTracks].fEta = aodtrack->Eta();
1534 fTempStruct[myTracks].fCharge = aodtrack->Charge();
1535 fTempStruct[myTracks].fDCAXY = dca2[0];
1536 fTempStruct[myTracks].fDCAZ = dca2[1];
1537 fTempStruct[myTracks].fDCA = dca3d;
1538 fTempStruct[myTracks].fClusterMap = aodtrack->GetTPCClusterMap();
1539 fTempStruct[myTracks].fSharedMap = aodtrack->GetTPCSharedMap();
1543 if(fTempStruct[myTracks].fMom > 0.9999) continue;// upper P bound
1544 //if(fTempStruct[myTracks].fPt > 0.9999) continue;// upper P bound
1545 //if(fTempStruct[myTracks].fP[2] > 0.9999) continue;// upper P bound
1549 fTempStruct[myTracks].fElectron = kFALSE;
1550 fTempStruct[myTracks].fPion = kFALSE;
1551 fTempStruct[myTracks].fKaon = kFALSE;
1552 fTempStruct[myTracks].fProton = kFALSE;
1554 Float_t nSigmaTPC[5];
1555 Float_t nSigmaTOF[5];
1556 nSigmaTPC[0]=10; nSigmaTPC[1]=10; nSigmaTPC[2]=10; nSigmaTPC[3]=10; nSigmaTPC[4]=10;
1557 nSigmaTOF[0]=10; nSigmaTOF[1]=10; nSigmaTOF[2]=10; nSigmaTOF[3]=10; nSigmaTOF[4]=10;
1558 fTempStruct[myTracks].fTOFhit = kFALSE;// default
1559 Float_t signalTPC=0, signalTOF=0;
1560 Double_t integratedTimesTOF[10]={0};
1563 Bool_t DoPIDWorkAround=kTRUE;
1564 //if(fFilterBit == 7) DoPIDWorkAround=kTRUE;
1565 if(fMCcase && !fPbPbcase) DoPIDWorkAround=kFALSE;
1566 if(DoPIDWorkAround==kFALSE && fabs(fPIDResponse->NumberOfSigmasTPC(aodtrack,AliPID::kPion)) < 900) {
1567 nSigmaTPC[0]=fPIDResponse->NumberOfSigmasTPC(aodtrack,AliPID::kElectron);
1568 nSigmaTPC[1]=fPIDResponse->NumberOfSigmasTPC(aodtrack,AliPID::kMuon);
1569 nSigmaTPC[2]=fPIDResponse->NumberOfSigmasTPC(aodtrack,AliPID::kPion);
1570 nSigmaTPC[3]=fPIDResponse->NumberOfSigmasTPC(aodtrack,AliPID::kKaon);
1571 nSigmaTPC[4]=fPIDResponse->NumberOfSigmasTPC(aodtrack,AliPID::kProton);
1573 nSigmaTOF[0]=fPIDResponse->NumberOfSigmasTOF(aodtrack,AliPID::kElectron);
1574 nSigmaTOF[1]=fPIDResponse->NumberOfSigmasTOF(aodtrack,AliPID::kMuon);
1575 nSigmaTOF[2]=fPIDResponse->NumberOfSigmasTOF(aodtrack,AliPID::kPion);
1576 nSigmaTOF[3]=fPIDResponse->NumberOfSigmasTOF(aodtrack,AliPID::kKaon);
1577 nSigmaTOF[4]=fPIDResponse->NumberOfSigmasTOF(aodtrack,AliPID::kProton);
1578 signalTPC = aodtrack->GetTPCsignal();
1579 if( (status&AliESDtrack::kTOFpid)!=0 && (status&AliESDtrack::kTIME)!=0 && (status&AliESDtrack::kTOFout)!=0 && (status&AliESDtrack::kTOFmismatch)<=0){// good tof hit
1580 fTempStruct[myTracks].fTOFhit = kTRUE;
1581 signalTOF = aodtrack->GetTOFsignal();
1582 aodtrack->GetIntegratedTimes(integratedTimesTOF);
1583 }else fTempStruct[myTracks].fTOFhit = kFALSE;
1585 }else {// FilterBit 7 PID workaround
1587 for(Int_t j = 0; j < fAOD->GetNumberOfTracks(); j++) {
1588 AliAODTrack* aodTrack2 = fAOD->GetTrack(j);
1589 if (!aodTrack2) continue;
1590 if(aodtrack->GetID() != (-aodTrack2->GetID() - 1)) continue;// (-aodTrack2->GetID() - 1)
1592 UInt_t status2=aodTrack2->GetStatus();
1594 nSigmaTPC[0]=fPIDResponse->NumberOfSigmasTPC(aodTrack2,AliPID::kElectron);
1595 nSigmaTPC[1]=fPIDResponse->NumberOfSigmasTPC(aodTrack2,AliPID::kMuon);
1596 nSigmaTPC[2]=fPIDResponse->NumberOfSigmasTPC(aodTrack2,AliPID::kPion);
1597 nSigmaTPC[3]=fPIDResponse->NumberOfSigmasTPC(aodTrack2,AliPID::kKaon);
1598 nSigmaTPC[4]=fPIDResponse->NumberOfSigmasTPC(aodTrack2,AliPID::kProton);
1600 nSigmaTOF[0]=fPIDResponse->NumberOfSigmasTOF(aodTrack2,AliPID::kElectron);
1601 nSigmaTOF[1]=fPIDResponse->NumberOfSigmasTOF(aodTrack2,AliPID::kMuon);
1602 nSigmaTOF[2]=fPIDResponse->NumberOfSigmasTOF(aodTrack2,AliPID::kPion);
1603 nSigmaTOF[3]=fPIDResponse->NumberOfSigmasTOF(aodTrack2,AliPID::kKaon);
1604 nSigmaTOF[4]=fPIDResponse->NumberOfSigmasTOF(aodTrack2,AliPID::kProton);
1605 signalTPC = aodTrack2->GetTPCsignal();
1607 if( (status2&AliESDtrack::kTOFpid)!=0 && (status2&AliESDtrack::kTIME)!=0 && (status2&AliESDtrack::kTOFout)!=0 && (status2&AliESDtrack::kTOFmismatch)<=0){// good tof hit
1608 fTempStruct[myTracks].fTOFhit = kTRUE;
1609 signalTOF = aodTrack2->GetTOFsignal();
1610 aodTrack2->GetIntegratedTimes(integratedTimesTOF);
1611 }else fTempStruct[myTracks].fTOFhit = kFALSE;
1614 }// FilterBit 7 PID workaround
1618 ((TH3F*)fOutputList->FindObject("fTPCResponse"))->Fill(centralityPercentile, fTempStruct[myTracks].fMom, signalTPC);
1619 if(fTempStruct[myTracks].fTOFhit) {
1620 ((TH3F*)fOutputList->FindObject("fTOFResponse"))->Fill(centralityPercentile, fTempStruct[myTracks].fMom, signalTOF - integratedTimesTOF[3]);
1624 // Use TOF if good hit and above threshold
1625 if(fTempStruct[myTracks].fTOFhit && fTempStruct[myTracks].fMom > fTPCTOFboundry){
1626 if(fabs(nSigmaTOF[0])<fSigmaCutTOF) fTempStruct[myTracks].fElectron = kTRUE;// Electron candidate
1627 if(fabs(nSigmaTOF[2])<fSigmaCutTOF) fTempStruct[myTracks].fPion = kTRUE;// Pion candidate
1628 if(fabs(nSigmaTOF[3])<fSigmaCutTOF) fTempStruct[myTracks].fKaon = kTRUE;// Kaon candidate
1629 if(fabs(nSigmaTOF[4])<fSigmaCutTOF) fTempStruct[myTracks].fProton = kTRUE;// Proton candidate
1630 }else {// TPC info instead
1631 if(fabs(nSigmaTPC[0])<fSigmaCutTPC) fTempStruct[myTracks].fElectron = kTRUE;// Electron candidate
1632 if(fabs(nSigmaTPC[2])<fSigmaCutTPC) fTempStruct[myTracks].fPion = kTRUE;// Pion candidate
1633 if(fabs(nSigmaTPC[3])<fSigmaCutTPC) fTempStruct[myTracks].fKaon = kTRUE;// Kaon candidate
1634 if(fabs(nSigmaTPC[4])<fSigmaCutTPC) fTempStruct[myTracks].fProton = kTRUE;// Proton candidate
1638 // Ensure there is only 1 candidate per track
1639 if(fTempStruct[myTracks].fElectron && fTempStruct[myTracks].fMom < 0.45) continue;// Remove electron band
1640 if(!fTempStruct[myTracks].fPion && !fTempStruct[myTracks].fKaon && !fTempStruct[myTracks].fProton) continue;
1641 if(!fTempStruct[myTracks].fPion) continue;// only pions
1642 if(fTempStruct[myTracks].fPion && fTempStruct[myTracks].fKaon) continue;
1643 if(fTempStruct[myTracks].fPion && fTempStruct[myTracks].fProton) continue;
1644 if(fTempStruct[myTracks].fKaon && fTempStruct[myTracks].fProton) continue;
1645 //if(fTempStruct[myTracks].fPion && fTempStruct[myTracks].fKaon && fTempStruct[myTracks].fProton) continue;// superfluous
1646 ////////////////////////
1647 //if(fTempStruct[myTracks].fProton && fTempStruct[myTracks].fMom < 0.25) continue;//extra cut for protons// superfluous
1651 if(fTempStruct[myTracks].fCharge==+1) {
1652 ((TH2F*)fOutputList->FindObject("fDCAxyDistPlus"))->Fill(fTempStruct[myTracks].fPt, dca2[0]);
1653 ((TH2F*)fOutputList->FindObject("fDCAzDistPlus"))->Fill(fTempStruct[myTracks].fPt, dca2[1]);
1655 ((TH2F*)fOutputList->FindObject("fDCAxyDistMinus"))->Fill(fTempStruct[myTracks].fPt, dca2[0]);
1656 ((TH2F*)fOutputList->FindObject("fDCAzDistMinus"))->Fill(fTempStruct[myTracks].fPt, dca2[1]);
1659 ((TH3F*)fOutputList->FindObject("fPhiPtDist"))->Fill(aodtrack->Charge(), aodtrack->Phi(), aodtrack->Pt());
1660 ((TH3F*)fOutputList->FindObject("fPtEtaDist"))->Fill(aodtrack->Charge(), aodtrack->Pt(), aodtrack->Eta());
1664 if(fTempStruct[myTracks].fPion) {// pions
1665 fTempStruct[myTracks].fEaccepted = sqrt(pow(fTempStruct[myTracks].fMom,2) + pow(fTrueMassPi,2));
1666 fTempStruct[myTracks].fKey = 1;
1667 }else if(fTempStruct[myTracks].fKaon){// kaons
1668 fTempStruct[myTracks].fEaccepted = sqrt(pow(fTempStruct[myTracks].fMom,2) + pow(fTrueMassK,2));;
1669 fTempStruct[myTracks].fKey = 10;
1671 fTempStruct[myTracks].fEaccepted = sqrt(pow(fTempStruct[myTracks].fMom,2) + pow(fTrueMassP,2));;
1672 fTempStruct[myTracks].fKey = 100;
1677 if(aodtrack->Charge() > 0) positiveTracks++;
1678 else negativeTracks++;
1680 if(fTempStruct[myTracks].fPion) pionCount++;
1681 if(fTempStruct[myTracks].fKaon) kaonCount++;
1682 if(fTempStruct[myTracks].fProton) protonCount++;
1686 if(fMCcase){// muon mothers
1687 AliAODMCParticle *tempMCTrack=(AliAODMCParticle*)mcArray->At(abs(aodtrack->GetLabel()));
1688 if(abs(tempMCTrack->GetPdgCode())==13 && tempMCTrack->GetMother()>0){// muons
1689 AliAODMCParticle *parent=(AliAODMCParticle*)mcArray->At(tempMCTrack->GetMother());
1690 if(parent->IsPhysicalPrimary()){
1691 ((TH1D*)fOutputList->FindObject("fMuonParents"))->Fill(abs(parent->GetPdgCode()));
1692 }else ((TH1D*)fOutputList->FindObject("fSecondaryMuonParents"))->Fill(abs(parent->GetPdgCode()));
1694 ((TH1D*)fOutputList->FindObject("fPionCandidates"))->Fill(abs(tempMCTrack->GetPdgCode()));
1697 //cout<<"kinkcount = "<<kinkcount<<" pionkinks = "<<pionkinks<<" primarypionkinks = "<<primarypionkinks<<endl;
1698 }else {// ESD tracks
1699 cout<<"ESDs not supported currently"<<endl;
1703 // Generator info only
1704 if(fMCcase && fGeneratorOnly){
1705 myTracks=0; pionCount=0; kaonCount=0; protonCount=0;// reset track counters
1706 for(Int_t mctrackN=0; mctrackN<mcArray->GetEntriesFast(); mctrackN++){
1707 if(myTracks >= fMultLimit) {cout<<"More tracks than Track Limit"<<endl; return;}
1708 if(myTracks >= 1300) continue;// additional cut to limit high mult events which exceed pair # limits
1710 AliAODMCParticle *mcParticle = (AliAODMCParticle*)mcArray->At(mctrackN);
1711 if(!mcParticle) continue;
1712 if(fabs(mcParticle->Eta())>0.8) continue;
1713 if(mcParticle->Charge()!=-3 && mcParticle->Charge()!=+3) continue;// x3 by convention
1714 if(mcParticle->Pt() < 0.16 || mcParticle->Pt() > 1.0) continue;
1715 if(!mcParticle->IsPrimary()) continue;
1716 if(!mcParticle->IsPhysicalPrimary()) continue;
1717 if(abs(mcParticle->GetPdgCode())!=211) continue;
1719 fTempStruct[myTracks].fP[0] = mcParticle->Px();
1720 fTempStruct[myTracks].fP[1] = mcParticle->Py();
1721 fTempStruct[myTracks].fP[2] = mcParticle->Pz();
1722 fTempStruct[myTracks].fX[0] = 0.; fTempStruct[myTracks].fX[1] = 0.; fTempStruct[myTracks].fX[2] = 0.;
1724 fTempStruct[myTracks].fId = myTracks;// use my track counter
1725 fTempStruct[myTracks].fLabel = mctrackN;
1726 fTempStruct[myTracks].fPhi = atan2(fTempStruct[myTracks].fP[1], fTempStruct[myTracks].fP[0]);
1727 if(fTempStruct[myTracks].fPhi < 0) fTempStruct[myTracks].fPhi += 2*PI;
1728 fTempStruct[myTracks].fPt = sqrt(pow(fTempStruct[myTracks].fP[0],2) + pow(fTempStruct[myTracks].fP[1],2));
1729 fTempStruct[myTracks].fMom = sqrt( pow(fTempStruct[myTracks].fPt,2) + pow(fTempStruct[myTracks].fP[2],2) );
1730 fTempStruct[myTracks].fEta = mcParticle->Eta();
1731 fTempStruct[myTracks].fCharge = int(mcParticle->Charge()/3.);
1732 fTempStruct[myTracks].fDCAXY = 0.;
1733 fTempStruct[myTracks].fDCAZ = 0.;
1734 fTempStruct[myTracks].fDCA = 0.;
1735 fTempStruct[myTracks].fPion = kTRUE;
1736 fTempStruct[myTracks].fEaccepted = sqrt(pow(fTempStruct[myTracks].fMom,2) + pow(fTrueMassPi,2));
1737 fTempStruct[myTracks].fKey = 1;
1745 ((TH1F*)fOutputList->FindObject("fMultDist3"))->Fill(myTracks);
1749 //cout<<"There are "<<myTracks<<" myTracks"<<endl;
1750 //cout<<"pionCount = "<<pionCount<<" kaonCount = "<<kaonCount<<" protonCount = "<<protonCount<<endl;
1753 /////////////////////////////////////////
1754 // Pion Multiplicity Cut (To ensure all Correlation orders are present in each event)
1755 if(myTracks < 4) {cout<<"Less than 4 tracks. Skipping Event."<<endl; return;}
1756 /////////////////////////////////////////
1759 ////////////////////////////////
1760 ///////////////////////////////
1761 // Mbin determination
1763 // Mbin set to Pion Count Only for pp!!!!!!!
1766 for(Int_t i=0; i<kMultBinspp; i++){
1767 if( ( pionCount > fMultLimits[i]) && ( pionCount <= fMultLimits[i+1]) ) { fMbin=i; break;}
1768 // Mbin 0 has 1 pion
1771 for(Int_t i=0; i<fCentBins; i++){
1772 if( (centralityPercentile >= cStart+i*cStep) && (centralityPercentile < cStart+(i+1)*cStep) ){
1773 fMbin=i;// 0 = most central
1779 if(fMbin==-1) {cout<<"Bad Mbin+++++++++++++++++++++++++++++++++++++++++++++++++++"<<endl; return;}
1782 // can only be called after fMbin has been set
1783 // Radius parameter only matters for Monte-Carlo data
1787 Int_t rBinForTPNMomRes = 10;
1788 if(fMbin==0) {rBinForTPNMomRes=10;}// 10 fm with EW (fRMax should be 11 for normal running)
1789 else if(fMbin==1) {rBinForTPNMomRes=9;}
1790 else if(fMbin<=3) {rBinForTPNMomRes=8;}
1791 else if(fMbin<=5) {rBinForTPNMomRes=7;}
1792 else {rBinForTPNMomRes=6;}
1794 //////////////////////////////////////////////////
1795 fEDbin=0;// Extra Dimension bin (Kt, (Kt-Psi),....)
1796 //////////////////////////////////////////////////
1800 ((TH1F*)fOutputList->FindObject("fEvents1"))->Fill(fMbin+1);
1801 ((TProfile*)fOutputList->FindObject("fAvgMult"))->Fill(fMbin+1., pionCount);
1803 ////////////////////////////////////
1804 // Add event to buffer if > 0 tracks
1806 fEC[zbin][fMbin]->FIFOShift();
1807 (fEvt) = fEC[zbin][fMbin]->fEvtStr;
1808 (fEvt)->fNtracks = myTracks;
1809 (fEvt)->fFillStatus = 1;
1810 for(Int_t i=0; i<myTracks; i++) (fEvt)->fTracks[i] = fTempStruct[i];
1812 (fEvt)->fMCarraySize = mcArray->GetEntriesFast();
1813 for(Int_t i=0; i<mcArray->GetEntriesFast(); i++) {
1814 AliAODMCParticle *tempMCTrack = (AliAODMCParticle*)mcArray->At(i);
1815 (fEvt)->fMCtracks[i].fPx = tempMCTrack->Px();
1816 (fEvt)->fMCtracks[i].fPy = tempMCTrack->Py();
1817 (fEvt)->fMCtracks[i].fPz = tempMCTrack->Pz();
1818 (fEvt)->fMCtracks[i].fPtot = sqrt(pow(tempMCTrack->Px(),2)+pow(tempMCTrack->Py(),2)+pow(tempMCTrack->Pz(),2));
1819 (fEvt)->fMCtracks[i].fPdgCode = tempMCTrack->GetPdgCode();
1820 (fEvt)->fMCtracks[i].fMotherLabel = tempMCTrack->GetMother();
1827 Float_t qinv12=0, qinv13=0, qinv14=0, qinv23=0, qinv24=0, qinv34=0;
1828 Float_t qout=0, qside=0, qlong=0;
1830 Float_t q3=0, q3MC=0;
1831 Float_t q4=0, q4MC=0;
1832 Int_t ch1=0, ch2=0, ch3=0, ch4=0;
1833 Int_t bin1=0, bin2=0, bin3=0, bin4=0;
1834 Float_t pVect1[4]={0};
1835 Float_t pVect2[4]={0};
1836 Float_t pVect3[4]={0};
1837 Float_t pVect4[4]={0};
1838 Float_t pVect1MC[4]={0};
1839 Float_t pVect2MC[4]={0};
1840 Float_t pVect3MC[4]={0};
1841 Float_t pVect4MC[4]={0};
1842 Float_t Pparent1[4]={0};
1843 Float_t Pparent2[4]={0};
1844 Float_t Pparent3[4]={0};
1845 Float_t Pparent4[4]={0};
1846 Float_t weight12=0, weight13=0, weight14=0, weight23=0, weight24=0, weight34=0;
1847 Float_t weight12Err=0, weight13Err=0, weight14Err=0, weight23Err=0, weight24Err=0, weight34Err=0;
1848 Float_t weight12CC[3]={0};
1849 Float_t weight13CC[3]={0};
1850 Float_t weight14CC[3]={0};
1851 Float_t weight23CC[3]={0};
1852 Float_t weight24CC[3]={0};
1853 Float_t weight34CC[3]={0};
1854 Float_t weightTotal=0;//, weightTotalErr=0;
1855 Float_t qinv12MC=0, qinv13MC=0, qinv14MC=0, qinv23MC=0, qinv24MC=0, qinv34MC=0;
1856 Float_t parentQinv12=0, parentQinv13=0, parentQinv14=0, parentQinv23=0, parentQinv24=0, parentQinv34=0;
1858 Float_t FSICorr12=0, FSICorr13=0, FSICorr14=0, FSICorr23=0, FSICorr24=0, FSICorr34=0;
1859 Bool_t pionParent1=kFALSE, pionParent2=kFALSE, pionParent3=kFALSE, pionParent4=kFALSE;
1860 Bool_t FilledMCpair12=kFALSE, FilledMCtriplet123=kFALSE;
1861 Bool_t GoodTripletWeights=kFALSE;
1863 AliAODMCParticle *mcParticle1=0x0;
1864 AliAODMCParticle *mcParticle2=0x0;
1867 ////////////////////
1868 //Int_t PairCount[7]={0};
1869 //Int_t NormPairCount[7]={0};
1870 Int_t KT3index=0, KT4index=0;
1872 // reset to defaults
1873 for(Int_t i=0; i<kMultLimitPbPb; i++) {
1874 fLowQPairSwitch_E0E0[i]->Set(kMultLimitPbPb,fDefaultsCharSwitch);
1875 fLowQPairSwitch_E0E1[i]->Set(kMultLimitPbPb,fDefaultsCharSwitch);
1876 fLowQPairSwitch_E0E2[i]->Set(kMultLimitPbPb,fDefaultsCharSwitch);
1877 fLowQPairSwitch_E0E3[i]->Set(kMultLimitPbPb,fDefaultsCharSwitch);
1878 fLowQPairSwitch_E1E1[i]->Set(kMultLimitPbPb,fDefaultsCharSwitch);
1879 fLowQPairSwitch_E1E2[i]->Set(kMultLimitPbPb,fDefaultsCharSwitch);
1880 fLowQPairSwitch_E1E3[i]->Set(kMultLimitPbPb,fDefaultsCharSwitch);
1881 fLowQPairSwitch_E2E3[i]->Set(kMultLimitPbPb,fDefaultsCharSwitch);
1883 fNormQPairSwitch_E0E0[i]->Set(kMultLimitPbPb,fDefaultsCharSwitch);
1884 fNormQPairSwitch_E0E1[i]->Set(kMultLimitPbPb,fDefaultsCharSwitch);
1885 fNormQPairSwitch_E0E2[i]->Set(kMultLimitPbPb,fDefaultsCharSwitch);
1886 fNormQPairSwitch_E0E3[i]->Set(kMultLimitPbPb,fDefaultsCharSwitch);
1887 fNormQPairSwitch_E1E1[i]->Set(kMultLimitPbPb,fDefaultsCharSwitch);
1888 fNormQPairSwitch_E1E2[i]->Set(kMultLimitPbPb,fDefaultsCharSwitch);
1889 fNormQPairSwitch_E1E3[i]->Set(kMultLimitPbPb,fDefaultsCharSwitch);
1890 fNormQPairSwitch_E2E3[i]->Set(kMultLimitPbPb,fDefaultsCharSwitch);
1894 //////////////////////////////////////////
1895 // make low-q pair storage and normalization-pair storage
1897 for(Int_t en1=0; en1<=2; en1++){// 1st event number (en1=0 is the same event as current event)
1898 for(Int_t en2=en1; en2<=3; en2++){// 2nd event number (en2=0 is the same event as current event)
1899 if(en1>1 && en1==en2) continue;
1901 for (Int_t i=0; i<(fEvt+en1)->fNtracks; i++) {// 1st particle
1902 for (Int_t j=i+1; j<(fEvt+en2)->fNtracks; j++) {// 2nd particle
1905 pVect1[0]=(fEvt+en1)->fTracks[i].fEaccepted; pVect2[0]=(fEvt+en2)->fTracks[j].fEaccepted;
1906 pVect1[1]=(fEvt+en1)->fTracks[i].fP[0]; pVect2[1]=(fEvt+en2)->fTracks[j].fP[0];
1907 pVect1[2]=(fEvt+en1)->fTracks[i].fP[1]; pVect2[2]=(fEvt+en2)->fTracks[j].fP[1];
1908 pVect1[3]=(fEvt+en1)->fTracks[i].fP[2]; pVect2[3]=(fEvt+en2)->fTracks[j].fP[2];
1909 ch1 = Int_t(((fEvt+en1)->fTracks[i].fCharge + 1)/2.);
1910 ch2 = Int_t(((fEvt+en2)->fTracks[j].fCharge + 1)/2.);
1912 qinv12 = GetQinv(pVect1, pVect2);
1913 kT12 = sqrt(pow(pVect1[1]+pVect2[1],2) + pow(pVect1[2]+pVect2[2],2))/2.;
1914 SetFillBins2(ch1, ch2, bin1, bin2);
1916 if(qinv12 < fQLowerCut) continue;// remove unwanted low-q pairs (also a type of track splitting/merging cut)
1917 if(ch1 == ch2 && !fGeneratorOnly){
1918 if(!AcceptPair((fEvt+en1)->fTracks[i], (fEvt+en2)->fTracks[j])) {
1919 if(en1==0 && en2==0) ((TH1F*)fOutputList->FindObject("fRejectedPairs"))->Fill(qinv12);
1924 GetQosl(pVect1, pVect2, qout, qside, qlong);
1926 Charge1[bin1].Charge2[bin2].MB[fMbin].EDB[0].TwoPT[0].fTerms2->Fill(kT12, qinv12);
1927 Charge1[bin1].Charge2[bin2].MB[fMbin].EDB[0].TwoPT[0].fTerms2QW->Fill(kT12, qinv12, qinv12);
1929 if((kT12 > 0.2) && (kT12 < 0.3)){
1930 Charge1[bin1].Charge2[bin2].MB[fMbin].EDB[0].TwoPT[en2].OSL_ktbin[0].fTerms2OSL->Fill(fabs(qout), fabs(qside), fabs(qlong));
1931 Charge1[bin1].Charge2[bin2].MB[fMbin].EDB[0].TwoPT[en2].OSL_ktbin[0].fTerms2OSLQW->Fill(fabs(qout), fabs(qside), fabs(qlong), qinv12);
1933 if((kT12 > 0.6) && (kT12 < 0.7)){
1934 Charge1[bin1].Charge2[bin2].MB[fMbin].EDB[0].TwoPT[en2].OSL_ktbin[1].fTerms2OSL->Fill(fabs(qout), fabs(qside), fabs(qlong));
1935 Charge1[bin1].Charge2[bin2].MB[fMbin].EDB[0].TwoPT[en2].OSL_ktbin[1].fTerms2OSLQW->Fill(fabs(qout), fabs(qside), fabs(qlong), qinv12);
1938 if( (fEvt+en1)->fNtracks%100==0){
1940 if(kT12>0.3) kTindex=1;
1941 Int_t UnitMultBin = int((fEvt+en1)->fNtracks / 100.) + 1;
1942 Charge1[bin1].Charge2[bin2].MB[fMbin].EDB[kTindex].TwoPT[0].fUnitMultBin->Fill(UnitMultBin, qinv12);
1947 Charge1[bin1].Charge2[bin2].MB[fMbin].EDB[0].TwoPT[1].fTerms2->Fill(kT12, qinv12);
1948 Charge1[bin1].Charge2[bin2].MB[fMbin].EDB[0].TwoPT[1].fTerms2QW->Fill(kT12, qinv12, qinv12);
1950 if((kT12 > 0.2) && (kT12 < 0.3)){
1951 Charge1[bin1].Charge2[bin2].MB[fMbin].EDB[fEDbin].TwoPT[en2].OSL_ktbin[0].fTerms2OSL->Fill(fabs(qout), fabs(qside), fabs(qlong));
1952 Charge1[bin1].Charge2[bin2].MB[fMbin].EDB[fEDbin].TwoPT[en2].OSL_ktbin[0].fTerms2OSLQW->Fill(fabs(qout), fabs(qside), fabs(qlong), qinv12);
1954 if((kT12 > 0.6) && (kT12 < 0.7)){
1955 Charge1[bin1].Charge2[bin2].MB[fMbin].EDB[fEDbin].TwoPT[en2].OSL_ktbin[1].fTerms2OSL->Fill(fabs(qout), fabs(qside), fabs(qlong));
1956 Charge1[bin1].Charge2[bin2].MB[fMbin].EDB[fEDbin].TwoPT[en2].OSL_ktbin[1].fTerms2OSLQW->Fill(fabs(qout), fabs(qside), fabs(qlong), qinv12);
1959 if( (fEvt+en1)->fNtracks%100==0){
1961 if(kT12>0.3) kTindex=1;
1962 Int_t UnitMultBin = int((fEvt+en1)->fNtracks / 100.) + 1;
1963 Charge1[bin1].Charge2[bin2].MB[fMbin].EDB[kTindex].TwoPT[1].fUnitMultBin->Fill(UnitMultBin, qinv12);
1966 //////////////////////////////////////////
1967 if(fTabulatePairs && en1==0 && en2<=1 && bin1==bin2){
1969 Int_t kTbin=-1, kYbin=-1;
1971 for(Int_t kIt=0; kIt<fKbinsT; kIt++) {if(kT12 < (fKmiddleT[kIt] + fKstepT[kIt]/2.)) {kTbin = kIt; break;}}
1972 for(Int_t kIt=0; kIt<fKbinsY; kIt++) {if(kY < (fKmiddleY[kIt] + fKstepY[kIt]/2.)) {kYbin = kIt; break;}}
1973 if((kTbin<0) || (kYbin<0)) {cout<<"problem!!!!!!!!!!!!!!!!!!!!!!!!!!!!"<<endl; continue;}
1974 if((kTbin>=fKbinsT) || (kYbin>=fKbinsY)) {cout<<"problem!!!!!!!!!!!!!!!!!!!!!!!!!!!!"<<endl; continue;}
1975 if(fGenerateSignal && en2==0) {
1976 Int_t chGroup2[2]={ch1,ch2};
1977 Float_t WInput = MCWeight(chGroup2, fRMax, 0.7, qinv12, kT12);
1978 KT[kTbin].KY[kYbin].MB[fMbin].EDB[0].TwoPT[en2].fTerms2ThreeD->Fill(fabs(qout), fabs(qside), fabs(qlong), WInput);
1979 }else KT[kTbin].KY[kYbin].MB[fMbin].EDB[0].TwoPT[en2].fTerms2ThreeD->Fill(fabs(qout), fabs(qside), fabs(qlong));
1982 //////////////////////////////////////////////////////////////////////////////
1984 if(qinv12 <= fQcut) {
1985 if(en1==0 && en2==0) {fLowQPairSwitch_E0E0[i]->AddAt('1',j);}
1986 if(en1==0 && en2==1) {fLowQPairSwitch_E0E1[i]->AddAt('1',j);}
1987 if(en1==0 && en2==2) {fLowQPairSwitch_E0E2[i]->AddAt('1',j);}
1988 if(en1==0 && en2==3) {fLowQPairSwitch_E0E3[i]->AddAt('1',j);}
1989 if(en1==1 && en2==1) {fLowQPairSwitch_E1E1[i]->AddAt('1',j);}
1990 if(en1==1 && en2==2) {fLowQPairSwitch_E1E2[i]->AddAt('1',j);}
1991 if(en1==1 && en2==3) {fLowQPairSwitch_E1E3[i]->AddAt('1',j);}
1992 if(en1==2 && en2==3) {fLowQPairSwitch_E2E3[i]->AddAt('1',j);}
1994 if((qinv12 >= fNormQcutLow) && (qinv12 < fNormQcutHigh)) {
1995 if(en1==0 && en2==0) {fNormQPairSwitch_E0E0[i]->AddAt('1',j);}
1996 if(en1==0 && en2==1) {fNormQPairSwitch_E0E1[i]->AddAt('1',j);}
1997 if(en1==0 && en2==2) {fNormQPairSwitch_E0E2[i]->AddAt('1',j);}
1998 if(en1==0 && en2==3) {fNormQPairSwitch_E0E3[i]->AddAt('1',j);}
1999 if(en1==1 && en2==1) {fNormQPairSwitch_E1E1[i]->AddAt('1',j);}
2000 if(en1==1 && en2==2) {fNormQPairSwitch_E1E2[i]->AddAt('1',j);}
2001 if(en1==1 && en2==3) {fNormQPairSwitch_E1E3[i]->AddAt('1',j);}
2002 if(en1==2 && en2==3) {fNormQPairSwitch_E2E3[i]->AddAt('1',j);}
2010 //cout<<PairCount[0]<<" "<<PairCount[1]<<" "<<PairCount[2]<<" "<<PairCount[3]<<" "<<PairCount[4]<<" "<<PairCount[5]<<" "<<PairCount[6]<<endl;
2011 //cout<<NormPairCount[0]<<" "<<NormPairCount[1]<<" "<<NormPairCount[2]<<" "<<NormPairCount[3]<<" "<<NormPairCount[4]<<" "<<NormPairCount[5]<<" "<<NormPairCount[6]<<endl;
2012 ///////////////////////////////////////////////////
2013 // Do not use pairs from events with too many pairs
2015 ((TH1F*)fOutputList->FindObject("fEvents2"))->Fill(fMbin+1);
2017 ///////////////////////////////////////////////////
2020 if(fTabulatePairs) return;
2024 ////////////////////////////////////////////////////
2025 ////////////////////////////////////////////////////
2026 // Normalization counting of 3- and 4-particle terms
2027 for(Int_t en2=0; en2<=1; en2++){// 2nd event number (en2=0 is the same event as current event)
2028 for(Int_t en3=en2; en3<=2; en3++){// 3rd event number
2029 if(en2==0 && en3>2) continue;// not needed config
2030 if(en2==1 && en3==en2) continue;// not needed config
2031 for(Int_t en4=en3; en4<=3; en4++){// 4th event number
2032 if(en3==0 && en4>1) continue;// not needed config
2033 if(en3==1 && en4==3) continue;// not needed configs
2034 if(en3==2 && (en2+en3+en4)!=6) continue;// not needed configs
2036 for (Int_t i=0; i<myTracks; i++) {// 1st particle
2037 pVect1[1]=(fEvt)->fTracks[i].fP[0];
2038 pVect1[2]=(fEvt)->fTracks[i].fP[1];
2039 pVect1[3]=(fEvt)->fTracks[i].fP[2];
2040 ch1 = Int_t(((fEvt)->fTracks[i].fCharge + 1)/2.);
2042 for (Int_t j=i+1; j<(fEvt+en2)->fNtracks; j++) {// 2nd particle
2043 if(en2==0) {if(fNormQPairSwitch_E0E0[i]->At(j)=='0') continue;}
2044 else {if(fNormQPairSwitch_E0E1[i]->At(j)=='0') continue;}
2046 pVect2[1]=(fEvt+en2)->fTracks[j].fP[0];
2047 pVect2[2]=(fEvt+en2)->fTracks[j].fP[1];
2048 pVect2[3]=(fEvt+en2)->fTracks[j].fP[2];
2049 ch2 = Int_t(((fEvt+en2)->fTracks[j].fCharge + 1)/2.);
2051 for (Int_t k=j+1; k<(fEvt+en3)->fNtracks; k++) {// 3rd particle
2053 if(fNormQPairSwitch_E0E0[i]->At(k)=='0') continue;
2054 if(fNormQPairSwitch_E0E0[j]->At(k)=='0') continue;
2056 if(fNormQPairSwitch_E0E1[i]->At(k)=='0') continue;
2057 if(fNormQPairSwitch_E0E1[j]->At(k)=='0') continue;
2059 if(fNormQPairSwitch_E0E2[i]->At(k)=='0') continue;
2060 if(fNormQPairSwitch_E1E2[j]->At(k)=='0') continue;
2063 pVect3[1]=(fEvt+en3)->fTracks[k].fP[0];
2064 pVect3[2]=(fEvt+en3)->fTracks[k].fP[1];
2065 pVect3[3]=(fEvt+en3)->fTracks[k].fP[2];
2066 ch3 = Int_t(((fEvt+en3)->fTracks[k].fCharge + 1)/2.);
2067 Bool_t fill2=kFALSE, fill3=kFALSE, fill4=kFALSE;
2068 SetFillBins3(ch1, ch2, ch3, 1, bin1, bin2, bin3, fill2, fill3, fill4);
2070 Float_t KT3 = sqrt(pow(pVect1[1]+pVect2[1]+pVect3[1],2) + pow(pVect1[2]+pVect2[2]+pVect3[2],2))/3.;
2071 if(KT3<=fKT3transition) KT3index=0;
2074 if(en2==0 && en3==0 && en4==0) Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[0].fNorm3->Fill(0);
2075 if(en2==1 && en3==2 && en4==3) Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[4].fNorm3->Fill(0);
2076 if(en2==0 && en3==1 && en4==2) {
2077 if(fill2) Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[1].fNorm3->Fill(0);
2078 if(fill3) Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[2].fNorm3->Fill(0);
2079 if(fill4) Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[3].fNorm3->Fill(0);
2083 for (Int_t l=k+1; l<(fEvt+en4)->fNtracks; l++) {// 4th particle
2085 if(fNormQPairSwitch_E0E0[i]->At(l)=='0') continue;
2086 if(fNormQPairSwitch_E0E0[j]->At(l)=='0') continue;
2087 if(fNormQPairSwitch_E0E0[k]->At(l)=='0') continue;
2090 if(fNormQPairSwitch_E0E1[i]->At(l)=='0') continue;
2091 if(fNormQPairSwitch_E0E1[j]->At(l)=='0') continue;
2092 if(fNormQPairSwitch_E0E1[k]->At(l)=='0') continue;
2094 if(fNormQPairSwitch_E0E1[i]->At(l)=='0') continue;
2095 if(fNormQPairSwitch_E0E1[j]->At(l)=='0') continue;
2096 if(fNormQPairSwitch_E1E1[k]->At(l)=='0') continue;
2099 if(fNormQPairSwitch_E0E2[i]->At(l)=='0') continue;
2100 if(fNormQPairSwitch_E0E2[j]->At(l)=='0') continue;
2101 if(fNormQPairSwitch_E1E2[k]->At(l)=='0') continue;
2103 if(fNormQPairSwitch_E0E3[i]->At(l)=='0') continue;
2104 if(fNormQPairSwitch_E1E3[j]->At(l)=='0') continue;
2105 if(fNormQPairSwitch_E2E3[k]->At(l)=='0') continue;
2108 pVect4[1]=(fEvt+en4)->fTracks[l].fP[0];
2109 pVect4[2]=(fEvt+en4)->fTracks[l].fP[1];
2110 pVect4[3]=(fEvt+en4)->fTracks[l].fP[2];
2111 ch4 = Int_t(((fEvt+en4)->fTracks[l].fCharge + 1)/2.);
2112 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.;
2113 if(KT4<=fKT4transition) KT4index=0;
2116 Bool_t FillTerms[13]={kFALSE};
2117 SetFillBins4(ch1, ch2, ch3, ch4, bin1, bin2, bin3, bin4, en2+en3+en4, FillTerms);
2119 for(int ft=0; ft<13; ft++) {
2120 if(FillTerms[ft]) Charge1[bin1].Charge2[bin2].Charge3[bin3].Charge4[bin4].MB[fMbin].EDB[KT4index].FourPT[ft].fNorm4->Fill(0.);
2136 ///////////////////////////////////////////////////////////////////////
2137 ///////////////////////////////////////////////////////////////////////
2138 ///////////////////////////////////////////////////////////////////////
2141 // Start the Main Correlation Analysis
2144 ///////////////////////////////////////////////////////////////////////
2148 ////////////////////////////////////////////////////
2149 ////////////////////////////////////////////////////
2150 for(Int_t en2=0; en2<=1; en2++){// 2nd event number (en2=0 is the same event as current event)
2151 for(Int_t en3=en2; en3<=2; en3++){// 3rd event number
2152 if(en2==0 && en3>2) continue;// not needed config
2153 if(en2==1 && en3==en2) continue;// not needed config
2154 for(Int_t en4=en3; en4<=3; en4++){// 4th event number
2155 if(en3==0 && en4>1) continue;// not needed config
2156 if(en3==1 && en4==3) continue;// not needed configs
2157 if(en3==2 && (en2+en3+en4)!=6) continue;// not needed configs
2159 Int_t ENsum=en2+en3+en4;// 0 or 1 or 3 or 6
2161 /////////////////////////////////////////////////////////////
2162 for (Int_t i=0; i<myTracks; i++) {// 1st particle
2163 pVect1[0]=(fEvt)->fTracks[i].fEaccepted;
2164 pVect1[1]=(fEvt)->fTracks[i].fP[0];
2165 pVect1[2]=(fEvt)->fTracks[i].fP[1];
2166 pVect1[3]=(fEvt)->fTracks[i].fP[2];
2167 ch1 = Int_t(((fEvt)->fTracks[i].fCharge + 1)/2.);
2169 /////////////////////////////////////////////////////////////
2170 for (Int_t j=i+1; j<(fEvt+en2)->fNtracks; j++) {// 2nd particle
2171 if(en2==0) {if(fLowQPairSwitch_E0E0[i]->At(j)=='0') continue;}
2172 else {if(fLowQPairSwitch_E0E1[i]->At(j)=='0') continue;}
2174 pVect2[0]=(fEvt+en2)->fTracks[j].fEaccepted;
2175 pVect2[1]=(fEvt+en2)->fTracks[j].fP[0];
2176 pVect2[2]=(fEvt+en2)->fTracks[j].fP[1];
2177 pVect2[3]=(fEvt+en2)->fTracks[j].fP[2];
2178 ch2 = Int_t(((fEvt+en2)->fTracks[j].fCharge + 1)/2.);
2179 qinv12 = GetQinv(pVect1, pVect2);
2180 kT12 = sqrt(pow(pVect1[1]+pVect2[1],2) + pow(pVect1[2]+pVect2[2],2))/2.;
2181 SetFillBins2(ch1, ch2, bin1, bin2);
2183 if(kT12<=0.3) kTindex=0;
2186 FSICorr12 = FSICorrelation(ch1,ch2, qinv12);
2188 // two particle terms filled during tabulation of low-q pairs
2192 FilledMCpair12=kFALSE;
2194 if(ch1==ch2 && fMbin==0 && qinv12<0.2 && ENsum!=2 && ENsum!=3 && ENsum!=6){
2195 for(Int_t rstep=0; rstep<10; rstep++){
2196 Float_t coeff = (rstep)*0.2*(0.18/1.2);
2197 Float_t phi1 = (fEvt)->fTracks[i].fPhi - asin((fEvt)->fTracks[i].fCharge*(0.1*fBfield)*coeff/(fEvt)->fTracks[i].fPt);
2198 if(phi1 > 2*PI) phi1 -= 2*PI;
2199 if(phi1 < 0) phi1 += 2*PI;
2200 Float_t phi2 = (fEvt+en2)->fTracks[j].fPhi - asin((fEvt+en2)->fTracks[j].fCharge*(0.1*fBfield)*coeff/(fEvt+en2)->fTracks[j].fPt);
2201 if(phi2 > 2*PI) phi2 -= 2*PI;
2202 if(phi2 < 0) phi2 += 2*PI;
2203 Float_t deltaphi = phi1 - phi2;
2204 if(deltaphi > PI) deltaphi -= PI;
2205 if(deltaphi < -PI) deltaphi += PI;
2207 if(ENsum==0) ((TH3F*)fOutputList->FindObject("fPairsDetaDPhiNum"))->Fill(rstep, (fEvt)->fTracks[i].fEta-(fEvt+en2)->fTracks[j].fEta, deltaphi);
2208 else ((TH3F*)fOutputList->FindObject("fPairsDetaDPhiDen"))->Fill(rstep, (fEvt)->fTracks[i].fEta-(fEvt+en2)->fTracks[j].fEta, deltaphi);
2213 // Check that label does not exceed stack size
2214 if((fEvt)->fTracks[i].fLabel < (fEvt)->fMCarraySize && (fEvt+en2)->fTracks[j].fLabel < (fEvt+en2)->fMCarraySize){
2215 if(ENsum==0 && abs((fEvt+en2)->fTracks[j].fLabel) == abs((fEvt)->fTracks[i].fLabel)) continue;
2216 pVect1MC[0]=sqrt(pow((fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPtot,2)+pow(fTrueMassPi,2));
2217 pVect2MC[0]=sqrt(pow((fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPtot,2)+pow(fTrueMassPi,2));
2218 pVect1MC[1]=(fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPx; pVect2MC[1]=(fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPx;
2219 pVect1MC[2]=(fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPy; pVect2MC[2]=(fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPy;
2220 pVect1MC[3]=(fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPz; pVect2MC[3]=(fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPz;
2221 qinv12MC = GetQinv(pVect1MC, pVect2MC);
2223 if(qinv12<0.1 && ch1==ch2 && ENsum==0) {
2224 ((TProfile*)fOutputList->FindObject("fQsmearMean"))->Fill(1.,qinv12-qinv12MC);
2225 ((TProfile*)fOutputList->FindObject("fQsmearSq"))->Fill(1.,1000.*pow(qinv12-qinv12MC,2));
2226 ((TH2D*)fOutputList->FindObject("fQ2Res"))->Fill(kT12, qinv12-qinv12MC);
2229 // secondary contamination
2231 mcParticle1 = (AliAODMCParticle*)mcArray->At(abs((fEvt)->fTracks[i].fLabel));
2232 mcParticle2 = (AliAODMCParticle*)mcArray->At(abs((fEvt+en2)->fTracks[j].fLabel));
2233 if(!mcParticle1 || !mcParticle2) continue;
2234 if(abs(mcParticle1->GetPdgCode())==211 && abs(mcParticle2->GetPdgCode())==211){
2236 ((TH3D*)fOutputList->FindObject("fAllSCPionPairs"))->Fill(fMbin+1, kT12, qinv12);
2237 if(!mcParticle1->IsSecondaryFromWeakDecay() && !mcParticle2->IsSecondaryFromWeakDecay()) {
2238 ((TH3D*)fOutputList->FindObject("fPrimarySCPionPairs"))->Fill(fMbin+1, kT12, qinv12);
2241 ((TH3D*)fOutputList->FindObject("fAllMCPionPairs"))->Fill(fMbin+1, kT12, qinv12);
2242 if(!mcParticle1->IsSecondaryFromWeakDecay() && !mcParticle2->IsSecondaryFromWeakDecay()) {
2243 ((TH3D*)fOutputList->FindObject("fPrimaryMCPionPairs"))->Fill(fMbin+1, kT12, qinv12);
2249 if(ENsum==6){// all mixed events
2250 Int_t chGroup2[2]={ch1,ch2};
2253 if(fFSIindex<=1) rForQW=10;
2254 else if(fFSIindex==2) rForQW=9;
2255 else if(fFSIindex==3) rForQW=8;
2256 else if(fFSIindex==4) rForQW=7;
2257 else if(fFSIindex==5) rForQW=6;
2258 else if(fFSIindex==6) rForQW=5;
2259 else if(fFSIindex==7) rForQW=4;
2260 else if(fFSIindex==8) rForQW=3;
2264 Charge1[bin1].Charge2[bin2].MB[fMbin].EDB[0].TwoPT[1].fMCqinv->Fill(qinv12MC, MCWeight(chGroup2, rForQW, 0.7, qinv12MC, 0.));// was 4,5
2265 Charge1[bin1].Charge2[bin2].MB[fMbin].EDB[0].TwoPT[1].fMCqinvQW->Fill(qinv12MC, qinv12MC*MCWeight(chGroup2, rForQW, 0.7, qinv12MC, 0.));// was 4,5
2267 Charge1[bin1].Charge2[bin2].MB[fMbin].EDB[0].TwoPT[1].fPIDpurityDen->Fill(kT12, qinv12);
2269 Int_t PdgCodeSum = abs((fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPdgCode) + abs((fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPdgCode);
2270 if(PdgCodeSum==22) SCNumber=1;// e-e
2271 else if(PdgCodeSum==24) SCNumber=2;// e-mu
2272 else if(PdgCodeSum==222) SCNumber=3;// e-pi
2273 else if(PdgCodeSum==332) SCNumber=4;// e-k
2274 else if(PdgCodeSum==2223) SCNumber=5;// e-p
2275 else if(PdgCodeSum==26) SCNumber=6;// mu-mu
2276 else if(PdgCodeSum==224) SCNumber=7;// mu-pi
2277 else if(PdgCodeSum==334) SCNumber=8;// mu-k
2278 else if(PdgCodeSum==2225) SCNumber=9;// mu-p
2279 else if(PdgCodeSum==422) SCNumber=10;// pi-pi
2280 else if(PdgCodeSum==532) SCNumber=11;// pi-k
2281 else if(PdgCodeSum==2423) SCNumber=12;// pi-p
2282 else if(PdgCodeSum==642) SCNumber=13;// k-k
2283 else if(PdgCodeSum==2533) SCNumber=14;// k-p
2284 else if(PdgCodeSum==4424) SCNumber=15;// p-p
2287 Charge1[bin1].Charge2[bin2].MB[fMbin].EDB[0].TwoPT[1].fPIDpurityNum->Fill(SCNumber, kT12, qinv12);
2289 ///////////////////////
2290 // muon contamination
2291 Pparent1[0]=pVect1MC[0]; Pparent1[1]=pVect1MC[1]; Pparent1[2]=pVect1MC[2]; Pparent1[3]=pVect1MC[3];
2292 Pparent2[0]=pVect2MC[0]; Pparent2[1]=pVect2MC[1]; Pparent2[2]=pVect2MC[2]; Pparent2[3]=pVect2MC[3];
2293 pionParent1=kFALSE; pionParent2=kFALSE;
2294 FilledMCpair12=kTRUE;
2296 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
2297 Int_t MotherLabel1 = (fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fMotherLabel;
2298 if(abs((fEvt)->fMCtracks[MotherLabel1].fPdgCode)==211) {
2300 Pparent1[1] = (fEvt)->fMCtracks[MotherLabel1].fPx; Pparent1[2] = (fEvt)->fMCtracks[MotherLabel1].fPy; Pparent1[3] = (fEvt)->fMCtracks[MotherLabel1].fPz;
2301 Pparent1[0] = sqrt(pow(Pparent1[1],2)+pow(Pparent1[2],2)+pow(Pparent1[3],2)+pow(fTrueMassPi,2));
2304 if(abs((fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPdgCode)==13) {
2305 Int_t MotherLabel2 = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fMotherLabel;
2306 if(abs((fEvt+en2)->fMCtracks[MotherLabel2].fPdgCode)==211) {
2308 Pparent2[1] = (fEvt+en2)->fMCtracks[MotherLabel2].fPx; Pparent2[2] = (fEvt+en2)->fMCtracks[MotherLabel2].fPy; Pparent2[3] = (fEvt+en2)->fMCtracks[MotherLabel2].fPz;
2309 Pparent2[0] = sqrt(pow(Pparent2[1],2)+pow(Pparent2[2],2)+pow(Pparent2[3],2)+pow(fTrueMassPi,2));
2313 parentQinv12 = GetQinv(Pparent1, Pparent2);
2315 if(pionParent1 || pionParent2){
2316 if(parentQinv12 > 0.001 && parentQinv12 < 0.3){
2317 Float_t muonPionK12 = FSICorrelation(ch1, ch2, qinv12MC);
2318 Float_t pionPionK12 = FSICorrelation(ch1, ch2, parentQinv12);
2319 for(Int_t term=1; term<=2; term++){
2320 for(Int_t Riter=0; Riter<fRVALUES; Riter++){
2321 Float_t Rvalue = 5+Riter;
2322 Float_t WInput = 1.0;
2324 WInput = MCWeight(chGroup2, Rvalue, 1.0, parentQinv12, 0.);
2326 muonPionK12 = 1.0; pionPionK12=1.0;
2329 Charge1[bin1].Charge2[bin2].MB[0].EDB[0].TwoPT[term-1].fMuonSmeared->Fill(Rvalue, qinv12MC, WInput);
2330 Charge1[bin1].Charge2[bin2].MB[0].EDB[0].TwoPT[term-1].fMuonIdeal->Fill(Rvalue, parentQinv12, WInput);
2331 Charge1[bin1].Charge2[bin2].MB[0].EDB[0].TwoPT[term-1].fMuonPionK2->Fill(Rvalue, qinv12MC, muonPionK12);
2332 Charge1[bin1].Charge2[bin2].MB[0].EDB[0].TwoPT[term-1].fPionPionK2->Fill(Rvalue, parentQinv12, pionPionK12);
2336 if(ch1==ch2) ((TH3D*)fOutputList->FindObject("fMuonPionDeltaQinv"))->Fill(0., kT12, qinv12MC-parentQinv12);
2337 else ((TH3D*)fOutputList->FindObject("fMuonPionDeltaQinv"))->Fill(1., kT12, qinv12MC-parentQinv12);
2339 }// pion parent check
2343 // momentum resolution
2344 for(Int_t Riter=0; Riter<fRVALUES; Riter++){
2345 Float_t Rvalue = 5+Riter;
2346 Float_t WInput = MCWeight(chGroup2, Rvalue, 0.7, qinv12MC, 0.);
2347 Charge1[bin1].Charge2[bin2].MB[0].EDB[kTindex].TwoPT[0].fIdeal->Fill(Rvalue, qinv12MC, WInput);
2348 Charge1[bin1].Charge2[bin2].MB[0].EDB[kTindex].TwoPT[1].fIdeal->Fill(Rvalue, qinv12MC);
2349 Charge1[bin1].Charge2[bin2].MB[0].EDB[kTindex].TwoPT[0].fSmeared->Fill(Rvalue, qinv12, WInput);
2350 Charge1[bin1].Charge2[bin2].MB[0].EDB[kTindex].TwoPT[1].fSmeared->Fill(Rvalue, qinv12);
2359 /////////////////////////////////////////////////////////////
2360 for (Int_t k=j+1; k<(fEvt+en3)->fNtracks; k++) {// 3rd particle
2362 if(fLowQPairSwitch_E0E0[i]->At(k)=='0') continue;
2363 if(fLowQPairSwitch_E0E0[j]->At(k)=='0') continue;
2365 if(fLowQPairSwitch_E0E1[i]->At(k)=='0') continue;
2366 if(fLowQPairSwitch_E0E1[j]->At(k)=='0') continue;
2368 if(fLowQPairSwitch_E0E2[i]->At(k)=='0') continue;
2369 if(fLowQPairSwitch_E1E2[j]->At(k)=='0') continue;
2372 pVect3[0]=(fEvt+en3)->fTracks[k].fEaccepted;
2373 pVect3[1]=(fEvt+en3)->fTracks[k].fP[0];
2374 pVect3[2]=(fEvt+en3)->fTracks[k].fP[1];
2375 pVect3[3]=(fEvt+en3)->fTracks[k].fP[2];
2376 ch3 = Int_t(((fEvt+en3)->fTracks[k].fCharge + 1)/2.);
2377 qinv13 = GetQinv(pVect1, pVect3);
2378 qinv23 = GetQinv(pVect2, pVect3);
2379 q3 = sqrt(pow(qinv12,2) + pow(qinv13,2) + pow(qinv23,2));
2381 FilledMCtriplet123 = kFALSE;
2383 Bool_t fill2=kFALSE, fill3=kFALSE, fill4=kFALSE;
2384 SetFillBins3(ch1, ch2, ch3, 1, bin1, bin2, bin3, fill2, fill3, fill4);
2386 Float_t KT3 = sqrt(pow(pVect1[1]+pVect2[1]+pVect3[1],2) + pow(pVect1[2]+pVect2[2]+pVect3[2],2))/3.;
2387 if(KT3<=fKT3transition) KT3index=0;
2390 FSICorr13 = FSICorrelation(ch1,ch3, qinv13);
2391 FSICorr23 = FSICorrelation(ch2,ch3, qinv23);
2394 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[0].fTerms3->Fill(q3);
2395 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[0].fKfactor->Fill(q3, 1/(FSICorr12*FSICorr13*FSICorr23));
2396 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[0].fMeanQinv->Fill(q3, qinv12);
2397 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[0].fMeanQinv->Fill(q3, qinv13);
2398 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[0].fMeanQinv->Fill(q3, qinv23);
2401 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[4].fTerms3->Fill(q3);
2402 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[4].fMeanQinv->Fill(q3, qinv12);
2403 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[4].fMeanQinv->Fill(q3, qinv13);
2404 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[4].fMeanQinv->Fill(q3, qinv23);
2408 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[1].fTerms3->Fill(q3);
2409 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[1].fKfactor->Fill(q3, 1/(FSICorr12));
2410 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[1].fMeanQinv->Fill(q3, qinv12);
2411 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[1].fMeanQinv->Fill(q3, qinv13);
2412 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[1].fMeanQinv->Fill(q3, qinv23);
2414 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[2].fTerms3->Fill(q3);
2415 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[2].fKfactor->Fill(q3, 1/(FSICorr12));
2416 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[2].fMeanQinv->Fill(q3, qinv12);
2417 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[2].fMeanQinv->Fill(q3, qinv13);
2418 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[2].fMeanQinv->Fill(q3, qinv23);
2420 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[3].fTerms3->Fill(q3);
2421 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[3].fKfactor->Fill(q3, 1/(FSICorr12));
2422 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[3].fMeanQinv->Fill(q3, qinv12);
2423 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[3].fMeanQinv->Fill(q3, qinv13);
2424 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[3].fMeanQinv->Fill(q3, qinv23);
2429 if(ENsum==6 && ch1==ch2 && ch1==ch3){
2430 GoodTripletWeights = kFALSE;
2432 GetWeight(pVect1, pVect2, weight12, weight12Err);
2433 GetWeight(pVect1, pVect3, weight13, weight13Err);
2434 GetWeight(pVect2, pVect3, weight23, weight23Err);
2436 if(sqrt(fabs(weight12*weight13*weight23)) > 1.0) {// weight should never be larger than 1
2437 if(fMbin==0 && bin1==0) {
2438 ((TH1D*)fOutputList->FindObject("fTPNRejects3pion1"))->Fill(q3, sqrt(fabs(weight12*weight13*weight23)));
2442 Float_t MomResCorr12=1.0, MomResCorr13=1.0, MomResCorr23=1.0;
2443 Float_t MuonCorr12=1.0, MuonCorr13=1.0, MuonCorr23=1.0;
2444 if(!fGenerateSignal && !fMCcase) {
2445 Int_t momBin12 = fMomResC2->GetYaxis()->FindBin(qinv12);
2446 Int_t momBin13 = fMomResC2->GetYaxis()->FindBin(qinv13);
2447 Int_t momBin23 = fMomResC2->GetYaxis()->FindBin(qinv23);
2448 if(momBin12 >= 20) momBin12 = 19;
2449 if(momBin13 >= 20) momBin13 = 19;
2450 if(momBin23 >= 20) momBin23 = 19;
2451 MomResCorr12 = fMomResC2->GetBinContent(rBinForTPNMomRes, momBin12);
2452 MomResCorr13 = fMomResC2->GetBinContent(rBinForTPNMomRes, momBin13);
2453 MomResCorr23 = fMomResC2->GetBinContent(rBinForTPNMomRes, momBin23);
2454 MuonCorr12 = fWeightmuonCorrection->GetBinContent(rBinForTPNMomRes, momBin12);
2455 MuonCorr13 = fWeightmuonCorrection->GetBinContent(rBinForTPNMomRes, momBin13);
2456 MuonCorr23 = fWeightmuonCorrection->GetBinContent(rBinForTPNMomRes, momBin23);
2458 // no MRC, no Muon Correction
2459 weight12CC[0] = ((weight12+1) - ffcSq*FSICorr12 - (1-ffcSq));
2460 weight12CC[0] /= FSICorr12*ffcSq;
2461 weight13CC[0] = ((weight13+1) - ffcSq*FSICorr13 - (1-ffcSq));
2462 weight13CC[0] /= FSICorr13*ffcSq;
2463 weight23CC[0] = ((weight23+1) - ffcSq*FSICorr23 - (1-ffcSq));
2464 weight23CC[0] /= FSICorr23*ffcSq;
2465 if(weight12CC[0] > 0 && weight13CC[0] > 0 && weight23CC[0] > 0){
2466 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[4].fTwoPartNorm->Fill(1, q3, sqrt(weight12CC[0]*weight13CC[0]*weight23CC[0]));
2468 // no Muon Correction
2469 weight12CC[1] = ((weight12+1)*MomResCorr12 - ffcSq*FSICorr12 - (1-ffcSq));
2470 weight12CC[1] /= FSICorr12*ffcSq;
2471 weight13CC[1] = ((weight13+1)*MomResCorr13 - ffcSq*FSICorr13 - (1-ffcSq));
2472 weight13CC[1] /= FSICorr13*ffcSq;
2473 weight23CC[1] = ((weight23+1)*MomResCorr23 - ffcSq*FSICorr23 - (1-ffcSq));
2474 weight23CC[1] /= FSICorr23*ffcSq;
2475 if(weight12CC[1] > 0 && weight13CC[1] > 0 && weight23CC[1] > 0){
2476 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[4].fTwoPartNorm->Fill(2, q3, sqrt(weight12CC[1]*weight13CC[1]*weight23CC[1]));
2479 weight12CC[2] = ((weight12+1)*MomResCorr12 - ffcSq*FSICorr12 - (1-ffcSq));
2480 weight12CC[2] /= FSICorr12*ffcSq;
2481 weight12CC[2] *= MuonCorr12;
2482 weight13CC[2] = ((weight13+1)*MomResCorr13 - ffcSq*FSICorr13 - (1-ffcSq));
2483 weight13CC[2] /= FSICorr13*ffcSq;
2484 weight13CC[2] *= MuonCorr13;
2485 weight23CC[2] = ((weight23+1)*MomResCorr23 - ffcSq*FSICorr23 - (1-ffcSq));
2486 weight23CC[2] /= FSICorr23*ffcSq;
2487 weight23CC[2] *= MuonCorr23;
2488 if(weight12CC[2] < 0 || weight13CC[2] < 0 || weight23CC[2] < 0) {// C2^QS can never be less than unity
2489 if(fMbin==0 && bin1==0) {
2490 ((TH1D*)fOutputList->FindObject("fTPNRejects3pion2"))->Fill(q3, sqrt(fabs(weight12CC[2]*weight13CC[2]*weight23CC[2])));
2493 GoodTripletWeights = kTRUE;
2494 /////////////////////////////////////////////////////
2495 weightTotal = sqrt(weight12CC[2]*weight13CC[2]*weight23CC[2]);
2496 /////////////////////////////////////////////////////
2497 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[fMbin].EDB[KT3index].ThreePT[4].fTwoPartNorm->Fill(3, q3, weightTotal);
2498 }// 2nd r3 den check
2501 }// 1st r3 den check
2506 if(ch1==ch2 && ch1==ch3 && ENsum==0){
2507 ((TH3D*)fOutputList->FindObject("fKT3DistTerm1"))->Fill(fMbin+1, KT3, q3);
2509 Float_t pt1=sqrt(pow(pVect1[1],2)+pow(pVect1[2],2));
2510 Float_t pt2=sqrt(pow(pVect2[1],2)+pow(pVect2[2],2));
2511 Float_t pt3=sqrt(pow(pVect3[1],2)+pow(pVect3[2],2));
2512 ((TProfile2D*)fOutputList->FindObject("fKT3AvgpT"))->Fill(fMbin+1, KT3index, pt1);
2513 ((TProfile2D*)fOutputList->FindObject("fKT3AvgpT"))->Fill(fMbin+1, KT3index, pt2);
2514 ((TProfile2D*)fOutputList->FindObject("fKT3AvgpT"))->Fill(fMbin+1, KT3index, pt3);
2517 if(ch1==ch2 && ch1==ch3 && ENsum==6) ((TH3D*)fOutputList->FindObject("fKT3DistTerm5"))->Fill(fMbin+1, KT3, q3);
2522 if(fMCcase && ENsum==6 && FilledMCpair12){// for momentum resolution and muon correction
2523 if((fEvt+en3)->fTracks[k].fLabel < (fEvt+en3)->fMCarraySize){
2525 pVect3MC[0]=sqrt(pow((fEvt+en3)->fMCtracks[abs((fEvt+en3)->fTracks[k].fLabel)].fPtot,2)+pow(fTrueMassPi,2));
2526 pVect3MC[1]=(fEvt+en3)->fMCtracks[abs((fEvt+en3)->fTracks[k].fLabel)].fPx;
2527 pVect3MC[2]=(fEvt+en3)->fMCtracks[abs((fEvt+en3)->fTracks[k].fLabel)].fPy;
2528 pVect3MC[3]=(fEvt+en3)->fMCtracks[abs((fEvt+en3)->fTracks[k].fLabel)].fPz;
2529 qinv13MC = GetQinv(pVect1MC, pVect3MC);
2530 qinv23MC = GetQinv(pVect2MC, pVect3MC);
2532 q3MC = sqrt(pow(qinv12MC,2)+pow(qinv13MC,2)+pow(qinv23MC,2));
2533 if(q3<0.1 && ch1==ch2 && ch1==ch3) ((TH2D*)fOutputList->FindObject("fQ3Res"))->Fill(KT3, q3-q3MC);
2535 Int_t chGroup3[3]={ch1,ch2,ch3};
2536 Float_t QinvMCGroup3[3]={qinv12MC,qinv13MC,qinv23MC};
2537 //Float_t kTGroup3[3]={float(sqrt(pow(pVect1MC[1]+pVect2MC[1],2) + pow(pVect1MC[2]+pVect2MC[2],2))/2.),
2538 //float(sqrt(pow(pVect1MC[1]+pVect3MC[1],2) + pow(pVect1MC[2]+pVect3MC[2],2))/2.),
2539 //float(sqrt(pow(pVect2MC[1]+pVect3MC[1],2) + pow(pVect2MC[2]+pVect3MC[2],2))/2.)};
2540 Float_t kTGroup3[3]={0};
2542 Pparent3[0]=pVect3MC[0]; Pparent3[1]=pVect3MC[1]; Pparent3[2]=pVect3MC[2]; Pparent3[3]=pVect3MC[3];
2545 if(abs((fEvt+en3)->fMCtracks[abs((fEvt+en3)->fTracks[k].fLabel)].fPdgCode)==13){// muon check
2546 Int_t MotherLabel3 = (fEvt+en3)->fMCtracks[abs((fEvt+en3)->fTracks[k].fLabel)].fMotherLabel;
2547 if(abs((fEvt+en3)->fMCtracks[MotherLabel3].fPdgCode)==211) {
2549 Pparent3[1] = (fEvt+en3)->fMCtracks[MotherLabel3].fPx; Pparent3[2] = (fEvt+en3)->fMCtracks[MotherLabel3].fPy; Pparent3[3] = (fEvt+en3)->fMCtracks[MotherLabel3].fPz;
2550 Pparent3[0] = sqrt(pow(Pparent3[1],2)+pow(Pparent3[2],2)+pow(Pparent3[3],2)+pow(fTrueMassPi,2));
2554 parentQinv13 = GetQinv(Pparent1, Pparent3);
2555 parentQinv23 = GetQinv(Pparent2, Pparent3);
2556 parentQ3 = sqrt(pow(parentQinv12,2) + pow(parentQinv13,2) + pow(parentQinv23,2));
2558 if(parentQinv12 > 0.001 && parentQinv13 > 0.001 && parentQinv23 > 0.001 && parentQ3 < 0.5){
2559 FilledMCtriplet123=kTRUE;
2560 if(pionParent1 || pionParent2 || pionParent3) {// want at least one pion-->muon
2562 Float_t parentQinvGroup3[3]={parentQinv12, parentQinv13, parentQinv23};
2563 //Float_t parentkTGroup3[3]={float(sqrt(pow(Pparent1[1]+Pparent2[1],2) + pow(Pparent1[2]+Pparent2[2],2))/2.),
2564 //float(sqrt(pow(Pparent1[1]+Pparent3[1],2) + pow(Pparent1[2]+Pparent3[2],2))/2.),
2565 //float(sqrt(pow(Pparent2[1]+Pparent3[1],2) + pow(Pparent2[2]+Pparent3[2],2))/2.)};
2566 Float_t parentkTGroup3[3]={0};
2568 ((TH2D*)fOutputList->FindObject("fAvgQ12VersusQ3"))->Fill(parentQ3, parentQinv12);
2569 ((TH2D*)fOutputList->FindObject("fAvgQ13VersusQ3"))->Fill(parentQ3, parentQinv13);
2570 ((TH2D*)fOutputList->FindObject("fAvgQ23VersusQ3"))->Fill(parentQ3, parentQinv23);
2572 for(Int_t term=1; term<=4; term++){
2574 else if(term==2) {if(!pionParent1 && !pionParent2) continue;}
2575 else if(term==3) {if(!pionParent1 && !pionParent3) continue;}
2576 else {if(!pionParent2 && !pionParent3) continue;}
2577 for(Int_t Riter=0; Riter<fRVALUES; Riter++){
2578 Float_t Rvalue = 5+Riter;
2579 Float_t WInput = MCWeight3(term, Rvalue, 1.0, chGroup3, parentQinvGroup3, parentkTGroup3);
2580 Float_t WInputParentFSI = MCWeightFSI3(term, Rvalue, 1.0, chGroup3, parentQinvGroup3);
2581 Float_t WInputFSI = MCWeightFSI3(term, Rvalue, 1.0, chGroup3, QinvMCGroup3);
2582 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[0].EDB[0].ThreePT[term-1].fMuonSmeared->Fill(1, Rvalue, q3MC, WInput);
2583 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[0].EDB[0].ThreePT[term-1].fMuonIdeal->Fill(1, Rvalue, parentQ3, WInput);
2584 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[0].EDB[0].ThreePT[term-1].fMuonPionK3->Fill(1, Rvalue, q3MC, WInputFSI);
2585 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[0].EDB[0].ThreePT[term-1].fPionPionK3->Fill(1, Rvalue, parentQ3, WInputParentFSI);
2587 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[0].EDB[0].ThreePT[term-1].fMuonSmeared->Fill(2, Rvalue, q3MC);
2588 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[0].EDB[0].ThreePT[term-1].fMuonIdeal->Fill(2, Rvalue, parentQ3);
2589 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[0].EDB[0].ThreePT[term-1].fMuonPionK3->Fill(2, Rvalue, q3MC);
2590 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[0].EDB[0].ThreePT[term-1].fPionPionK3->Fill(2, Rvalue, parentQ3);
2594 }// pion parent check
2595 }// parentQ check (muon correction)
2597 // 3-pion momentum resolution
2598 for(Int_t term=1; term<=5; term++){
2599 for(Int_t Riter=0; Riter<fRVALUES; Riter++){
2600 Float_t Rvalue = 5+Riter;
2601 Float_t WInput = MCWeight3(term, Rvalue, 0.7, chGroup3, QinvMCGroup3, kTGroup3);
2602 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[0].EDB[KT3index].ThreePT[term-1].fIdeal->Fill(Rvalue, q3MC, WInput);
2603 Charge1[bin1].Charge2[bin2].Charge3[bin3].MB[0].EDB[KT3index].ThreePT[term-1].fSmeared->Fill(Rvalue, q3, WInput);
2607 }// 3rd particle label check
2608 }// MCcase and ENsum==6
2613 /////////////////////////////////////////////////////////////
2614 for (Int_t l=k+1; l<(fEvt+en4)->fNtracks; l++) {// 4th particle
2616 if(fLowQPairSwitch_E0E0[i]->At(l)=='0') continue;
2617 if(fLowQPairSwitch_E0E0[j]->At(l)=='0') continue;
2618 if(fLowQPairSwitch_E0E0[k]->At(l)=='0') continue;
2621 if(fLowQPairSwitch_E0E1[i]->At(l)=='0') continue;
2622 if(fLowQPairSwitch_E0E1[j]->At(l)=='0') continue;
2623 if(fLowQPairSwitch_E0E1[k]->At(l)=='0') continue;
2625 if(fLowQPairSwitch_E0E1[i]->At(l)=='0') continue;
2626 if(fLowQPairSwitch_E0E1[j]->At(l)=='0') continue;
2627 if(fLowQPairSwitch_E1E1[k]->At(l)=='0') continue;
2630 if(fLowQPairSwitch_E0E2[i]->At(l)=='0') continue;
2631 if(fLowQPairSwitch_E0E2[j]->At(l)=='0') continue;
2632 if(fLowQPairSwitch_E1E2[k]->At(l)=='0') continue;
2634 if(fLowQPairSwitch_E0E3[i]->At(l)=='0') continue;
2635 if(fLowQPairSwitch_E1E3[j]->At(l)=='0') continue;
2636 if(fLowQPairSwitch_E2E3[k]->At(l)=='0') continue;
2639 pVect4[0]=(fEvt+en4)->fTracks[l].fEaccepted;
2640 pVect4[1]=(fEvt+en4)->fTracks[l].fP[0];
2641 pVect4[2]=(fEvt+en4)->fTracks[l].fP[1];
2642 pVect4[3]=(fEvt+en4)->fTracks[l].fP[2];
2643 ch4 = Int_t(((fEvt+en4)->fTracks[l].fCharge + 1)/2.);
2644 qinv14 = GetQinv(pVect1, pVect4);
2645 qinv24 = GetQinv(pVect2, pVect4);
2646 qinv34 = GetQinv(pVect3, pVect4);
2647 q4 = sqrt(pow(q3,2) + pow(qinv14,2) + pow(qinv24,2) + pow(qinv34,2));
2649 if(ch1==ch2 && ch1==ch3 && ch1==ch4 && ENsum==6){
2650 ((TH2D*)fOutputList->FindObject("DistQinv4pion"))->Fill(1, qinv12); ((TH2D*)fOutputList->FindObject("DistQinv4pion"))->Fill(2, qinv13);
2651 ((TH2D*)fOutputList->FindObject("DistQinv4pion"))->Fill(3, qinv14); ((TH2D*)fOutputList->FindObject("DistQinv4pion"))->Fill(4, qinv23);
2652 ((TH2D*)fOutputList->FindObject("DistQinv4pion"))->Fill(5, qinv24); ((TH2D*)fOutputList->FindObject("DistQinv4pion"))->Fill(6, qinv34);
2655 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.;
2656 if(KT4<=fKT4transition) KT4index=0;
2659 FSICorr14 = FSICorrelation(ch1,ch4, qinv14);
2660 FSICorr24 = FSICorrelation(ch2,ch4, qinv24);
2661 FSICorr34 = FSICorrelation(ch3,ch4, qinv34);
2663 Bool_t FillTerms[13]={kFALSE};
2664 SetFillBins4(ch1, ch2, ch3, ch4, bin1, bin2, bin3, bin4, ENsum, FillTerms);
2666 for(int ft=0; ft<13; ft++) {
2667 Float_t FSIfactor = 1.0;
2668 if(ft==0) FSIfactor = 1/(FSICorr12 * FSICorr13 * FSICorr14 * FSICorr23 * FSICorr24 * FSICorr34);
2669 else if(ft<=4) FSIfactor = 1/(FSICorr12 * FSICorr13 * FSICorr23);
2670 else if(ft<=10) FSIfactor = 1/(FSICorr12);
2671 else if(ft==11) FSIfactor = 1/(FSICorr12 * FSICorr34);
2672 else FSIfactor = 1.0;
2674 Charge1[bin1].Charge2[bin2].Charge3[bin3].Charge4[bin4].MB[fMbin].EDB[KT4index].FourPT[ft].fTerms4->Fill(q4);
2675 Charge1[bin1].Charge2[bin2].Charge3[bin3].Charge4[bin4].MB[fMbin].EDB[KT4index].FourPT[ft].fKfactor->Fill(q4, FSIfactor);
2679 /////////////////////////////////////////////////////////////
2681 if(ch1==ch2 && ch1==ch3 && ch1==ch4 && ENsum==6 && GoodTripletWeights){
2682 GetWeight(pVect1, pVect4, weight14, weight14Err);
2683 GetWeight(pVect2, pVect4, weight24, weight24Err);
2684 GetWeight(pVect3, pVect4, weight34, weight34Err);
2686 Float_t MomResCorr14=1.0, MomResCorr24=1.0, MomResCorr34=1.0;
2687 Float_t MuonCorr14=1.0, MuonCorr24=1.0, MuonCorr34=1.0;
2688 if(!fGenerateSignal && !fMCcase) {
2689 Int_t momBin14 = fMomResC2->GetYaxis()->FindBin(qinv14);
2690 Int_t momBin24 = fMomResC2->GetYaxis()->FindBin(qinv24);
2691 Int_t momBin34 = fMomResC2->GetYaxis()->FindBin(qinv34);
2692 if(momBin14 >= 20) momBin14 = 19;
2693 if(momBin24 >= 20) momBin24 = 19;
2694 if(momBin34 >= 20) momBin34 = 19;
2695 MomResCorr14 = fMomResC2->GetBinContent(rBinForTPNMomRes, momBin14);
2696 MomResCorr24 = fMomResC2->GetBinContent(rBinForTPNMomRes, momBin24);
2697 MomResCorr34 = fMomResC2->GetBinContent(rBinForTPNMomRes, momBin34);
2698 MuonCorr14 = fWeightmuonCorrection->GetBinContent(rBinForTPNMomRes, momBin14);
2699 MuonCorr24 = fWeightmuonCorrection->GetBinContent(rBinForTPNMomRes, momBin24);
2700 MuonCorr34 = fWeightmuonCorrection->GetBinContent(rBinForTPNMomRes, momBin34);
2703 // no MRC, no Muon Correction
2704 weight14CC[0] = ((weight14+1) - ffcSq*FSICorr14 - (1-ffcSq));
2705 weight14CC[0] /= FSICorr14*ffcSq;
2706 weight24CC[0] = ((weight24+1) - ffcSq*FSICorr24 - (1-ffcSq));
2707 weight24CC[0] /= FSICorr24*ffcSq;
2708 weight34CC[0] = ((weight34+1) - ffcSq*FSICorr34 - (1-ffcSq));
2709 weight34CC[0] /= FSICorr34*ffcSq;
2710 if(weight14CC[0] > 0 && weight24CC[0] > 0 && weight34CC[0] > 0 && weight12CC[0] > 0 && weight13CC[0] > 0 && weight23CC[0] > 0){
2711 weightTotal = sqrt(weight12CC[0]*weight13CC[0]*weight24CC[0]*weight34CC[0]);
2712 weightTotal += sqrt(weight12CC[0]*weight14CC[0]*weight23CC[0]*weight34CC[0]);
2713 weightTotal += sqrt(weight13CC[0]*weight14CC[0]*weight23CC[0]*weight24CC[0]);
2715 Charge1[bin1].Charge2[bin2].Charge3[bin3].Charge4[bin4].MB[fMbin].EDB[KT4index].FourPT[12].fTwoPartNorm->Fill(1, q4, weightTotal);
2717 // no Muon Correction
2718 weight14CC[1] = ((weight14+1)*MomResCorr14 - ffcSq*FSICorr14 - (1-ffcSq));
2719 weight14CC[1] /= FSICorr14*ffcSq;
2720 weight24CC[1] = ((weight24+1)*MomResCorr24 - ffcSq*FSICorr24 - (1-ffcSq));
2721 weight24CC[1] /= FSICorr24*ffcSq;
2722 weight34CC[1] = ((weight34+1)*MomResCorr34 - ffcSq*FSICorr34 - (1-ffcSq));
2723 weight34CC[1] /= FSICorr34*ffcSq;
2724 if(weight14CC[1] > 0 && weight24CC[1] > 0 && weight34CC[1] > 0 && weight12CC[1] > 0 && weight13CC[1] > 0 && weight23CC[1] > 0){
2725 weightTotal = sqrt(weight12CC[1]*weight13CC[1]*weight24CC[1]*weight34CC[1]);
2726 weightTotal += sqrt(weight12CC[1]*weight14CC[1]*weight23CC[1]*weight34CC[1]);
2727 weightTotal += sqrt(weight13CC[1]*weight14CC[1]*weight23CC[1]*weight24CC[1]);
2729 Charge1[bin1].Charge2[bin2].Charge3[bin3].Charge4[bin4].MB[fMbin].EDB[KT4index].FourPT[12].fTwoPartNorm->Fill(2, q4, weightTotal);
2732 weight14CC[2] = ((weight14+1)*MomResCorr14 - ffcSq*FSICorr14 - (1-ffcSq));
2733 weight14CC[2] /= FSICorr14*ffcSq;
2734 weight14CC[2] *= MuonCorr14;
2735 weight24CC[2] = ((weight24+1)*MomResCorr24 - ffcSq*FSICorr24 - (1-ffcSq));
2736 weight24CC[2] /= FSICorr24*ffcSq;
2737 weight24CC[2] *= MuonCorr24;
2738 weight34CC[2] = ((weight34+1)*MomResCorr34 - ffcSq*FSICorr34 - (1-ffcSq));
2739 weight34CC[2] /= FSICorr34*ffcSq;
2740 weight34CC[2] *= MuonCorr34;
2742 if(weight14CC[2] < 0 || weight24CC[2] < 0 || weight34CC[2] < 0) {// C2^QS can never be less than unity
2743 if(fMbin==0 && bin1==0 && KT4index==0) {
2744 ((TH1D*)fOutputList->FindObject("fTPNRejects4pion1"))->Fill(q4, sqrt(fabs(weight12CC[2]*weight23CC[2]*weight34CC[2]*weight14CC[2])));
2747 /////////////////////////////////////////////////////
2748 weightTotal = sqrt(weight12CC[2]*weight13CC[2]*weight24CC[2]*weight34CC[2]);
2749 weightTotal += sqrt(weight12CC[2]*weight14CC[2]*weight23CC[2]*weight34CC[2]);
2750 weightTotal += sqrt(weight13CC[2]*weight14CC[2]*weight23CC[2]*weight24CC[2]);
2752 /////////////////////////////////////////////////////
2753 Charge1[bin1].Charge2[bin2].Charge3[bin3].Charge4[bin4].MB[fMbin].EDB[KT4index].FourPT[12].fTwoPartNorm->Fill(3, q4, weightTotal);
2756 /////////////////////////////////////////////////////////////
2758 if(ch1==ch2 && ch1==ch3 && ch1==ch4 && ENsum==0){
2759 ((TH3D*)fOutputList->FindObject("fKT4DistTerm1"))->Fill(fMbin+1, KT4, q4);
2761 Float_t pt1=sqrt(pow(pVect1[1],2)+pow(pVect1[2],2));
2762 Float_t pt2=sqrt(pow(pVect2[1],2)+pow(pVect2[2],2));
2763 Float_t pt3=sqrt(pow(pVect3[1],2)+pow(pVect3[2],2));
2764 Float_t pt4=sqrt(pow(pVect4[1],2)+pow(pVect4[2],2));
2765 ((TProfile2D*)fOutputList->FindObject("fKT4AvgpT"))->Fill(fMbin+1, KT4index, pt1);
2766 ((TProfile2D*)fOutputList->FindObject("fKT4AvgpT"))->Fill(fMbin+1, KT4index, pt2);
2767 ((TProfile2D*)fOutputList->FindObject("fKT4AvgpT"))->Fill(fMbin+1, KT4index, pt3);
2768 ((TProfile2D*)fOutputList->FindObject("fKT4AvgpT"))->Fill(fMbin+1, KT4index, pt4);
2771 if(ch1==ch2 && ch1==ch3 && ch1==ch4 && ENsum==6) ((TH3D*)fOutputList->FindObject("fKT4DistTerm13"))->Fill(fMbin+1, KT4, q4);
2774 // momenumtum resolution and muon corrections
2775 if(fMCcase && ENsum==6 && FilledMCtriplet123){// for momentum resolution and muon correction
2776 if((fEvt+en4)->fTracks[l].fLabel < (fEvt+en4)->fMCarraySize){
2778 pVect4MC[0]=sqrt(pow((fEvt+en4)->fMCtracks[abs((fEvt+en4)->fTracks[l].fLabel)].fPtot,2)+pow(fTrueMassPi,2));
2779 pVect4MC[1]=(fEvt+en4)->fMCtracks[abs((fEvt+en4)->fTracks[l].fLabel)].fPx;
2780 pVect4MC[2]=(fEvt+en4)->fMCtracks[abs((fEvt+en4)->fTracks[l].fLabel)].fPy;
2781 pVect4MC[3]=(fEvt+en4)->fMCtracks[abs((fEvt+en4)->fTracks[l].fLabel)].fPz;
2782 qinv14MC = GetQinv(pVect1MC, pVect4MC);
2783 qinv24MC = GetQinv(pVect2MC, pVect4MC);
2784 qinv34MC = GetQinv(pVect3MC, pVect4MC);
2786 q4MC = sqrt(pow(q3MC,2) + pow(qinv14MC,2) + pow(qinv24MC,2) + pow(qinv34MC,2));
2787 if(q4<0.1 && ch1==ch2 && ch1==ch3 && ch1==ch4) ((TH2D*)fOutputList->FindObject("fQ4Res"))->Fill(KT4, q4-q4MC);
2788 if(ch1==ch2 && ch1==ch3 && ch1==ch4) {
2789 ((TH2D*)fOutputList->FindObject("DistQinvMC4pion"))->Fill(1, qinv12MC); ((TH2D*)fOutputList->FindObject("DistQinvMC4pion"))->Fill(2, qinv13MC);
2790 ((TH2D*)fOutputList->FindObject("DistQinvMC4pion"))->Fill(3, qinv14MC); ((TH2D*)fOutputList->FindObject("DistQinvMC4pion"))->Fill(4, qinv23MC);
2791 ((TH2D*)fOutputList->FindObject("DistQinvMC4pion"))->Fill(5, qinv24MC); ((TH2D*)fOutputList->FindObject("DistQinvMC4pion"))->Fill(6, qinv34MC);
2793 Int_t chGroup4[4]={ch1,ch2,ch3,ch4};
2794 Float_t QinvMCGroup4[6]={qinv12MC, qinv13MC, qinv14MC, qinv23MC, qinv24MC, qinv34MC};
2795 Float_t kTGroup4[6]={0};
2797 Pparent4[0]=pVect4MC[0]; Pparent4[1]=pVect4MC[1]; Pparent4[2]=pVect4MC[2]; Pparent4[3]=pVect4MC[3];
2799 if(abs((fEvt+en4)->fMCtracks[abs((fEvt+en4)->fTracks[l].fLabel)].fPdgCode)==13){// muon check
2800 Int_t MotherLabel4 = (fEvt+en4)->fMCtracks[abs((fEvt+en4)->fTracks[l].fLabel)].fMotherLabel;
2801 if(abs((fEvt+en4)->fMCtracks[MotherLabel4].fPdgCode)==211) {
2803 Pparent4[1] = (fEvt+en4)->fMCtracks[MotherLabel4].fPx; Pparent4[2] = (fEvt+en4)->fMCtracks[MotherLabel4].fPy; Pparent4[3] = (fEvt+en4)->fMCtracks[MotherLabel4].fPz;
2804 Pparent4[0] = sqrt(pow(Pparent4[1],2)+pow(Pparent4[2],2)+pow(Pparent4[3],2)+pow(fTrueMassPi,2));
2808 parentQinv14 = GetQinv(Pparent1, Pparent4);
2809 parentQinv24 = GetQinv(Pparent2, Pparent4);
2810 parentQinv34 = GetQinv(Pparent3, Pparent4);
2811 Float_t parentQ4 = sqrt(pow(parentQ3,2) + pow(parentQinv14,2) + pow(parentQinv24,2) + pow(parentQinv34,2));
2813 if(parentQinv14 > 0.001 && parentQinv24 > 0.001 && parentQinv34 > 0.001 && parentQ4 < 0.5){
2814 if(pionParent1 || pionParent2 || pionParent3 || pionParent4) {// want at least one pion-->muon
2816 if(pionParent1) ((TH1D*)fOutputList->FindObject("fDistPionParents4"))->Fill(1);
2817 if(pionParent2) ((TH1D*)fOutputList->FindObject("fDistPionParents4"))->Fill(2);
2818 if(pionParent3) ((TH1D*)fOutputList->FindObject("fDistPionParents4"))->Fill(3);
2819 if(pionParent4) ((TH1D*)fOutputList->FindObject("fDistPionParents4"))->Fill(4);
2820 Float_t parentQinvGroup4[6]={parentQinv12, parentQinv13, parentQinv14, parentQinv23, parentQinv24, parentQinv34};
2821 Float_t parentkTGroup4[6]={0};
2823 for(Int_t term=1; term<=12; term++){
2825 else if(term==2) {if(!pionParent1 && !pionParent2 && !pionParent3) continue;}
2826 else if(term==3) {if(!pionParent1 && !pionParent2 && !pionParent4) continue;}
2827 else if(term==4) {if(!pionParent1 && !pionParent3 && !pionParent4) continue;}
2828 else if(term==5) {if(!pionParent2 && !pionParent3 && !pionParent4) continue;}
2829 else if(term==6) {if(!pionParent1 && !pionParent2) continue;}
2830 else if(term==7) {if(!pionParent1 && !pionParent3) continue;}
2831 else if(term==8) {if(!pionParent1 && !pionParent4) continue;}
2832 else if(term==9) {if(!pionParent2 && !pionParent3) continue;}
2833 else if(term==10) {if(!pionParent2 && !pionParent4) continue;}
2834 else if(term==11) {if(!pionParent3 && !pionParent4) continue;}
2836 for(Int_t Riter=0; Riter<fRVALUES; Riter++){
2837 Float_t Rvalue = 5+Riter;
2838 Float_t WInput = MCWeight4(term, Rvalue, 1.0, chGroup4, parentQinvGroup4, parentkTGroup4);
2839 Float_t WInputParentFSI = MCWeightFSI4(term, Rvalue, 1.0, chGroup4, parentQinvGroup4);
2840 Float_t WInputFSI = MCWeightFSI4(term, Rvalue, 1.0, chGroup4, QinvMCGroup4);
2841 Charge1[bin1].Charge2[bin2].Charge3[bin3].Charge4[bin4].MB[0].EDB[0].FourPT[term-1].fMuonSmeared->Fill(1, Rvalue, q4MC, WInput);
2842 Charge1[bin1].Charge2[bin2].Charge3[bin3].Charge4[bin4].MB[0].EDB[0].FourPT[term-1].fMuonIdeal->Fill(1, Rvalue, parentQ4, WInput);
2843 Charge1[bin1].Charge2[bin2].Charge3[bin3].Charge4[bin4].MB[0].EDB[0].FourPT[term-1].fMuonPionK4->Fill(1, Rvalue, q4MC, WInputFSI);
2844 Charge1[bin1].Charge2[bin2].Charge3[bin3].Charge4[bin4].MB[0].EDB[0].FourPT[term-1].fPionPionK4->Fill(1, Rvalue, parentQ4, WInputParentFSI);
2846 Charge1[bin1].Charge2[bin2].Charge3[bin3].Charge4[bin4].MB[0].EDB[0].FourPT[term-1].fMuonSmeared->Fill(2, Rvalue, q4MC);
2847 Charge1[bin1].Charge2[bin2].Charge3[bin3].Charge4[bin4].MB[0].EDB[0].FourPT[term-1].fMuonIdeal->Fill(2, Rvalue, parentQ4);
2848 Charge1[bin1].Charge2[bin2].Charge3[bin3].Charge4[bin4].MB[0].EDB[0].FourPT[term-1].fMuonPionK4->Fill(2, Rvalue, q4MC);
2849 Charge1[bin1].Charge2[bin2].Charge3[bin3].Charge4[bin4].MB[0].EDB[0].FourPT[term-1].fPionPionK4->Fill(2, Rvalue, parentQ4);
2853 }// pion parent check
2854 }// parentQ check (muon correction)
2856 // 4-pion momentum resolution
2857 for(Int_t term=1; term<=13; term++){
2858 for(Int_t Riter=0; Riter<fRVALUES; Riter++){
2859 Float_t Rvalue = 5+Riter;
2860 Float_t WInput = MCWeight4(term, Rvalue, 0.7, chGroup4, QinvMCGroup4, kTGroup4);
2861 Charge1[bin1].Charge2[bin2].Charge3[bin3].Charge4[bin4].MB[0].EDB[KT4index].FourPT[term-1].fIdeal->Fill(Rvalue, q4MC, WInput);
2862 Charge1[bin1].Charge2[bin2].Charge3[bin3].Charge4[bin4].MB[0].EDB[KT4index].FourPT[term-1].fSmeared->Fill(Rvalue, q4, WInput);
2866 }// label check particle 4
2884 // Post output data.
2885 PostData(1, fOutputList);
2888 //________________________________________________________________________
2889 void AliFourPion::Terminate(Option_t *)
2891 // Called once at the end of the query
2896 //________________________________________________________________________
2897 Bool_t AliFourPion::AcceptPair(AliFourPionTrackStruct first, AliFourPionTrackStruct second)
2900 if(fabs(first.fEta-second.fEta) > fMinSepPairEta) return kTRUE;
2902 // propagate through B field to r=1m
2903 Float_t phi1 = first.fPhi - asin(first.fCharge*(0.1*fBfield)*0.15/first.fPt);// 0.15 for D=1m
2904 if(phi1 > 2*PI) phi1 -= 2*PI;
2905 if(phi1 < 0) phi1 += 2*PI;
2906 Float_t phi2 = second.fPhi - asin(second.fCharge*(0.1*fBfield)*0.15/second.fPt);// 0.15 for D=1m
2907 if(phi2 > 2*PI) phi2 -= 2*PI;
2908 if(phi2 < 0) phi2 += 2*PI;
2910 Float_t deltaphi = phi1 - phi2;
2911 if(deltaphi > PI) deltaphi -= 2*PI;
2912 if(deltaphi < -PI) deltaphi += 2*PI;
2913 deltaphi = fabs(deltaphi);
2915 if(deltaphi < fMinSepPairPhi) return kFALSE;// Min Separation
2918 // propagate through B field to r=1.6m
2919 phi1 = first.fPhi - asin(first.fCharge*(0.1*fBfield)*0.24/first.fPt);// mine. 0.24 for D=1.6m
2920 if(phi1 > 2*PI) phi1 -= 2*PI;
2921 if(phi1 < 0) phi1 += 2*PI;
2922 phi2 = second.fPhi - asin(second.fCharge*(0.1*fBfield)*0.24/second.fPt);// mine. 0.24 for D=1.6m
2923 if(phi2 > 2*PI) phi2 -= 2*PI;
2924 if(phi2 < 0) phi2 += 2*PI;
2926 deltaphi = phi1 - phi2;
2927 if(deltaphi > PI) deltaphi -= 2*PI;
2928 if(deltaphi < -PI) deltaphi += 2*PI;
2929 deltaphi = fabs(deltaphi);
2931 if(deltaphi < fMinSepPairPhi) return kFALSE;// Min Separation
2937 Int_t ncl1 = first.fClusterMap.GetNbits();
2938 Int_t ncl2 = second.fClusterMap.GetNbits();
2939 Int_t sumCls = 0; Int_t sumSha = 0; Int_t sumQ = 0;
2940 Double_t shfrac = 0; Double_t qfactor = 0;
2941 for(Int_t imap = 0; imap < ncl1 && imap < ncl2; imap++) {
2942 if (first.fClusterMap.TestBitNumber(imap) && second.fClusterMap.TestBitNumber(imap)) {// Both clusters
2943 if (first.fSharedMap.TestBitNumber(imap) && second.fSharedMap.TestBitNumber(imap)) { // Shared
2947 else {sumQ--; sumCls+=2;}
2949 else if (first.fClusterMap.TestBitNumber(imap) || second.fClusterMap.TestBitNumber(imap)) {// Non shared
2954 qfactor = sumQ*1.0/sumCls;
2955 shfrac = sumSha*1.0/sumCls;
2958 if(qfactor > fShareQuality || shfrac > fShareFraction) return kFALSE;
2965 //________________________________________________________________________
2966 Float_t AliFourPion::GamovFactor(Int_t chargeBin1, Int_t chargeBin2, Float_t qinv)
2968 Float_t arg = G_Coeff/qinv;
2970 if(chargeBin1==chargeBin2) return (exp(arg)-1)/(arg);
2971 else {return (exp(-arg)-1)/(-arg);}
2974 //________________________________________________________________________
2975 void AliFourPion::Shuffle(Int_t *iarr, Int_t i1, Int_t i2)
2979 for (Int_t i = i1; i < i2+1; i++) {
2980 j = (Int_t) (gRandom->Rndm() * a);
2988 //________________________________________________________________________
2989 Float_t AliFourPion::GetQinv(Float_t track1[], Float_t track2[]){
2991 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)) );
2995 //________________________________________________________________________
2996 void AliFourPion::GetQosl(Float_t track1[], Float_t track2[], Float_t& qout, Float_t& qside, Float_t& qlong){
2998 Float_t p0 = track1[0] + track2[0];
2999 Float_t px = track1[1] + track2[1];
3000 Float_t py = track1[2] + track2[2];
3001 Float_t pz = track1[3] + track2[3];
3003 Float_t mt = sqrt(p0*p0 - pz*pz);
3004 Float_t pt = sqrt(px*px + py*py);
3006 Float_t v0 = track1[0] - track2[0];
3007 Float_t vx = track1[1] - track2[1];
3008 Float_t vy = track1[2] - track2[2];
3009 Float_t vz = track1[3] - track2[3];
3011 qout = (px*vx + py*vy)/pt;
3012 qside = (px*vy - py*vx)/pt;
3013 qlong = (p0*vz - pz*v0)/mt;
3015 //________________________________________________________________________
3016 void AliFourPion::SetWeightArrays(Bool_t legoCase, TH3F *histos[AliFourPion::fKbinsT][AliFourPion::fCentBins]){
3019 cout<<"LEGO call to SetWeightArrays"<<endl;
3021 for(Int_t tKbin=0; tKbin<fKbinsT; tKbin++){
3022 for(Int_t mb=0; mb<fCentBins; mb++){
3023 fNormWeight[tKbin][mb] = (TH3F*)histos[tKbin][mb]->Clone();
3024 fNormWeight[tKbin][mb]->SetDirectory(0);
3030 TFile *wFile = new TFile("WeightFile.root","READ");
3031 if(!wFile->IsOpen()) {cout<<"No Weight File!!!!!!!!!!"<<endl; return;}
3032 else cout<<"Good Weight File Found!"<<endl;
3034 for(Int_t tKbin=0; tKbin<fKbinsT; tKbin++){
3035 for(Int_t mb=0; mb<fCentBins; mb++){
3037 TString *name = new TString("Weight_Kt_");
3039 name->Append("_Ky_0");
3040 name->Append("_M_");
3042 name->Append("_ED_0");
3045 fNormWeight[tKbin][mb] = (TH3F*)wFile->Get(name->Data());
3046 fNormWeight[tKbin][mb]->SetDirectory(0);
3055 cout<<"Done reading weight file"<<endl;
3058 //________________________________________________________________________
3059 void AliFourPion::GetWeight(Float_t track1[], Float_t track2[], Float_t& wgt, Float_t& wgtErr){
3061 Float_t kt=sqrt( pow(track1[1]+track2[1],2) + pow(track1[2]+track2[2],2))/2.;
3063 Float_t qOut=0,qSide=0,qLong=0;
3064 GetQosl(track1, track2, qOut, qSide, qLong);
3066 qSide = fabs(qSide);
3067 qLong = fabs(qLong);
3068 Float_t wd=0, xd=0, yd=0, zd=0;
3069 //Float_t qinvtemp=GetQinv(0,track1, track2);
3072 if(kt < fKmeanT[0]) {fKtIndexL=0; fKtIndexH=1;}
3073 else if(kt >= fKmeanT[fKbinsT-1]) {fKtIndexL=fKbinsT-2; fKtIndexH=fKbinsT-1;}
3075 for(Int_t i=0; i<fKbinsT-1; i++){
3076 if((kt >= fKmeanT[i]) && (kt < fKmeanT[i+1])) {fKtIndexL=i; fKtIndexH=i+1; break;}
3079 wd = (kt-fKmeanT[fKtIndexL])/(fKmeanT[fKtIndexH]-fKmeanT[fKtIndexL]);
3082 if(qOut < fQmean[0]) {fQoIndexL=0; fQoIndexH=0; xd=0;}
3083 else if(qOut >= fQmean[kQbinsWeights-1]) {fQoIndexL=kQbinsWeights-1; fQoIndexH=kQbinsWeights-1; xd=1;}
3085 for(Int_t i=0; i<kQbinsWeights-1; i++){
3086 if((qOut >= fQmean[i]) && (qOut < fQmean[i+1])) {fQoIndexL=i; fQoIndexH=i+1; break;}
3088 xd = (qOut-fQmean[fQoIndexL])/(fQmean[fQoIndexH]-fQmean[fQoIndexL]);
3091 if(qSide < fQmean[0]) {fQsIndexL=0; fQsIndexH=0; yd=0;}
3092 else if(qSide >= fQmean[kQbinsWeights-1]) {fQsIndexL=kQbinsWeights-1; fQsIndexH=kQbinsWeights-1; yd=1;}
3094 for(Int_t i=0; i<kQbinsWeights-1; i++){
3095 if((qSide >= fQmean[i]) && (qSide < fQmean[i+1])) {fQsIndexL=i; fQsIndexH=i+1; break;}
3097 yd = (qSide-fQmean[fQsIndexL])/(fQmean[fQsIndexH]-fQmean[fQsIndexL]);
3100 if(qLong < fQmean[0]) {fQlIndexL=0; fQlIndexH=0; zd=0;}
3101 else if(qLong >= fQmean[kQbinsWeights-1]) {fQlIndexL=kQbinsWeights-1; fQlIndexH=kQbinsWeights-1; zd=1;}
3103 for(Int_t i=0; i<kQbinsWeights-1; i++){
3104 if((qLong >= fQmean[i]) && (qLong < fQmean[i+1])) {fQlIndexL=i; fQlIndexH=i+1; break;}
3106 zd = (qLong-fQmean[fQlIndexL])/(fQmean[fQlIndexH]-fQmean[fQlIndexL]);
3111 //Float_t min = fNormWeight[fKtIndexL][fMbin]->GetBinContent(fQoIndexH+1,fQsIndexH+1,fQlIndexH+1);
3112 Float_t minErr = fNormWeight[fKtIndexL][fMbin]->GetBinError(fQoIndexH+1,fQsIndexH+1,fQlIndexH+1);
3116 deltaW += (fNormWeight[fKtIndexH][fMbin]->GetBinContent(fQoIndexH+1, fQsIndexH+1, fQlIndexH+1) - min)*(kt-fKmeanT[fKtIndexL])/((fKstepT[fKtIndexL]+fKstepT[fKtIndexH])/2.);
3118 deltaW += (fNormWeight[fKtIndexL][fMbin]->GetBinContent(fQoIndexL+1, fQsIndexH+1, fQlIndexH+1) - min)*(qOut-fQmean[fQoIndexL])/fQstepWeights;
3120 deltaW += (fNormWeight[fKtIndexL][fMbin]->GetBinContent(fQoIndexH+1, fQsIndexL+1, fQlIndexH+1) - min)*(qSide-fQmean[fQsIndexL])/fQstepWeights;
3122 deltaW += (fNormWeight[fKtIndexL][fMbin]->GetBinContent(fQoIndexH+1, fQsIndexH+1, fQlIndexL+1) - min)*(qLong-fQmean[fQlIndexL])/fQstepWeights;
3129 // w interpolation (kt)
3130 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;
3131 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;
3132 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;
3133 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;
3134 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;
3135 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;
3136 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;
3137 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;
3138 // x interpolation (qOut)
3139 Float_t c00 = c000*(1-xd) + c100*xd;
3140 Float_t c10 = c010*(1-xd) + c110*xd;
3141 Float_t c01 = c001*(1-xd) + c101*xd;
3142 Float_t c11 = c011*(1-xd) + c111*xd;
3143 // y interpolation (qSide)
3144 Float_t c0 = c00*(1-yd) + c10*yd;
3145 Float_t c1 = c01*(1-yd) + c11*yd;
3146 // z interpolation (qLong)
3147 wgt = (c0*(1-zd) + c1*zd);
3151 // Denominator errors negligible compared to numerator so do not waste cpu time below.
3152 //Float_t deltaWErr=0;
3155 deltaWErr += (fNormWeight[fKtIndexH][fMbin]->GetBinContent(fQoIndexH+1, fQsIndexH+1, fQlIndexH+1) - minErr)*(kt-fKmeanT[fKtIndexL])/((fKstepT[fKtIndexL]+fKstepT[fKtIndexH])/2.);
3157 deltaWErr += (fNormWeight[fKtIndexL][fMbin]->GetBinContent(fQoIndexL+1, fQsIndexH+1, fQlIndexH+1) - minErr)*(qOut-fQmean[fQoIndexL])/fQstepWeights;
3159 deltaWErr += (fNormWeight[fKtIndexL][fMbin]->GetBinContent(fQoIndexH+1, fQsIndexL+1, fQlIndexH+1) - minErr)*(qSide-fQmean[fQsIndexL])/fQstepWeights;
3161 deltaWErr += (fNormWeight[fKtIndexL][fMbin]->GetBinContent(fQoIndexH+1, fQsIndexH+1, fQlIndexL+1) - minErr)*(qLong-fQmean[fQlIndexL])/fQstepWeights;
3167 //________________________________________________________________________
3168 Float_t AliFourPion::MCWeight(Int_t c[2], Float_t R, Float_t fcSq, Float_t qinv, Float_t k12){
3170 Float_t radius = R/0.19733;// convert to GeV (starts at 5 fm, was 3 fm)
3171 Float_t r12=radius*(1-k12/2.0);
3173 Float_t coulCorr12 = FSICorrelation(c[0], c[1], qinv);
3175 Float_t arg=qinv*r12;
3176 Float_t EW = 1 + kappa3/(6.*pow(2.,1.5))*(8.*pow(arg,3) - 12.*arg);
3177 EW += kappa4/(24.*pow(2.,2))*(16.*pow(arg,4) -48.*pow(arg,2) + 12);
3178 return ((1-fcSq) + fcSq*(1 + exp(-pow(qinv*r12,2))*pow(EW,2))*coulCorr12);
3180 return ((1-fcSq) + fcSq*coulCorr12);
3184 //________________________________________________________________________
3185 Float_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){
3187 Float_t radiusOut = Float_t(r)/0.19733;// convert to GeV (starts at 5 fm, was 3 fm)
3188 Float_t radiusSide = radiusOut;
3189 Float_t radiusLong = radiusOut;
3190 Float_t myDamp = fDampStart + (fDampStep)*dampIndex;
3191 Float_t coulCorr12 = FSICorrelation(charge1, charge2, qinv);
3192 if(charge1==charge2){
3193 return ((1-myDamp) + myDamp*(1 + exp(-pow(qo*radiusOut,2)) * exp(-pow(qs*radiusSide,2)) * exp(-pow(ql*radiusLong,2)))*coulCorr12);
3195 return ((1-myDamp) + myDamp*coulCorr12);
3200 //________________________________________________________________________
3201 Float_t AliFourPion::MCWeight3(Int_t term, Float_t R, Float_t fcSq, Int_t c[3], Float_t qinv[3], Float_t kT[3]){
3202 // FSI + QS correlations
3203 if(term==5) return 1.0;
3205 Float_t radius=R/0.19733;
3206 Float_t r12=radius*(1-kT[0]/2.0);
3207 Float_t r13=radius*(1-kT[1]/2.0);
3208 Float_t r23=radius*(1-kT[2]/2.0);
3210 Float_t fc = sqrt(fcSq);
3213 Float_t Kfactor12 = FSICorrelation(c[0],c[1], qinv[0]);// K2
3214 Float_t Kfactor13 = FSICorrelation(c[0],c[2], qinv[1]);// K2
3215 Float_t Kfactor23 = FSICorrelation(c[1],c[2], qinv[2]);// K2
3217 if(c[0]==c[1] && c[0]==c[2]){// all three of the same charge
3218 Float_t arg12=qinv[0]*r12;
3219 Float_t arg13=qinv[1]*r13;
3220 Float_t arg23=qinv[2]*r23;
3221 Float_t EW12 = 1 + kappa3/(6.*pow(2.,1.5))*(8.*pow(arg12,3) - 12.*arg12);
3222 EW12 += kappa4/(24.*pow(2.,2))*(16.*pow(arg12,4) -48.*pow(arg12,2) + 12);
3223 Float_t EW13 = 1 + kappa3/(6.*pow(2.,1.5))*(8.*pow(arg13,3) - 12.*arg13);
3224 EW13 += kappa4/(24.*pow(2.,2))*(16.*pow(arg13,4) -48.*pow(arg13,2) + 12);
3225 Float_t EW23 = 1 + kappa3/(6.*pow(2.,1.5))*(8.*pow(arg23,3) - 12.*arg23);
3226 EW23 += kappa4/(24.*pow(2.,2))*(16.*pow(arg23,4) -48.*pow(arg23,2) + 12);
3228 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);
3229 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;
3230 Float_t C3 = pow(1-fc,3) + 3*fc*pow(1-fc,2);
3231 C3 += pow(fc,2)*(1-fc)*(1+exp(-pow(qinv[0]*r12,2))*pow(EW12,2))*Kfactor12;
3232 C3 += pow(fc,2)*(1-fc)*(1+exp(-pow(qinv[1]*r13,2))*pow(EW13,2))*Kfactor13;
3233 C3 += pow(fc,2)*(1-fc)*(1+exp(-pow(qinv[2]*r23,2))*pow(EW23,2))*Kfactor23;
3234 C3 += pow(fc,3)*C3QS*Kfactor12*Kfactor13*Kfactor23;
3237 return ((1-fcSq) + fcSq*(1 + exp(-pow(qinv[0]*r12,2))*pow(EW12,2))*Kfactor12);
3239 return ((1-fcSq) + fcSq*(1 + exp(-pow(qinv[1]*r13,2))*pow(EW13,2))*Kfactor13);
3241 return ((1-fcSq) + fcSq*(1 + exp(-pow(qinv[2]*r23,2))*pow(EW23,2))*Kfactor23);
3244 }else{// mixed charge case
3245 Float_t arg=qinv[0]*r12;
3246 Float_t KfactorSC = Kfactor12;
3247 Float_t KfactorMC1 = Kfactor13;
3248 Float_t KfactorMC2 = Kfactor23;
3249 if(c[0]==c[2]) {arg=qinv[1]*r13; KfactorSC = Kfactor13; KfactorMC1 = Kfactor12; KfactorMC2 = Kfactor23;}
3250 if(c[1]==c[2]) {arg=qinv[2]*r23; KfactorSC = Kfactor23; KfactorMC1 = Kfactor12; KfactorMC2 = Kfactor13;}
3251 Float_t EW = 1 + kappa3/(6.*pow(2.,1.5))*(8.*pow(arg,3) - 12.*arg);
3252 EW += kappa4/(24.*pow(2.,2))*(16.*pow(arg,4) -48.*pow(arg,2) + 12);
3254 Float_t C3QS = 1 + exp(-pow(arg,2))*pow(EW,2);
3255 Float_t C3 = pow(1-fc,3) + 3*fc*pow(1-fc,2);
3256 C3 += pow(fc,2)*(1-fc)*(1+exp(-pow(arg,2))*pow(EW,2))*KfactorSC;
3257 C3 += pow(fc,2)*(1-fc)*KfactorMC1;
3258 C3 += pow(fc,2)*(1-fc)*KfactorMC2;
3259 C3 += pow(fc,3)*C3QS*KfactorSC*KfactorMC1*KfactorMC2;
3262 if( (c[0]+c[1]+c[2])==1) return ((1-fcSq) + fcSq*(1 + exp(-pow(arg,2))*pow(EW,2))*KfactorSC);
3263 else return ((1-fcSq) + fcSq*KfactorMC1);// doesn't matter MC1 or MC2
3265 return ((1-fcSq) + fcSq*KfactorMC1);// doesn't matter MC1 or MC2
3267 if( (c[0]+c[1]+c[2])==2) return ((1-fcSq) + fcSq*(1 + exp(-pow(arg,2))*pow(EW,2))*KfactorSC);
3268 else return ((1-fcSq) + fcSq*KfactorMC1);// doesn't matter MC1 or MC2
3273 //________________________________________________________________________
3274 Float_t AliFourPion::MCWeightFSI3(Int_t term, Float_t R, Float_t fcSq, Int_t c[3], Float_t qinv[3]){
3275 // FSI only (no QS correlations)
3276 if(term==5) return 1.0;
3278 Float_t fc = sqrt(fcSq);
3280 Float_t Kfactor12 = FSICorrelation(c[0],c[1], qinv[0]);// K2
3281 Float_t Kfactor13 = FSICorrelation(c[0],c[2], qinv[1]);// K2
3282 Float_t Kfactor23 = FSICorrelation(c[1],c[2], qinv[2]);// K2
3284 if(c[0]==c[1] && c[0]==c[2]){// all three of the same charge
3286 Float_t C3 = pow(1-fc,3) + 3*fc*pow(1-fc,2);
3287 C3 += pow(fc,2)*(1-fc)*Kfactor12;
3288 C3 += pow(fc,2)*(1-fc)*Kfactor13;
3289 C3 += pow(fc,2)*(1-fc)*Kfactor23;
3290 C3 += pow(fc,3)*Kfactor12*Kfactor13*Kfactor23;
3293 return ((1-fcSq) + fcSq*Kfactor12);
3295 return ((1-fcSq) + fcSq*Kfactor13);
3297 return ((1-fcSq) + fcSq*Kfactor23);
3300 }else{// mixed charge case
3301 Float_t KfactorSC = Kfactor12;
3302 Float_t KfactorMC1 = Kfactor13;
3303 Float_t KfactorMC2 = Kfactor23;
3304 if(c[0]==c[2]) {KfactorSC = Kfactor13; KfactorMC1 = Kfactor12; KfactorMC2 = Kfactor23;}
3305 if(c[1]==c[2]) {KfactorSC = Kfactor23; KfactorMC1 = Kfactor12; KfactorMC2 = Kfactor13;}
3307 Float_t C3 = pow(1-fc,3) + 3*fc*pow(1-fc,2);
3308 C3 += pow(fc,2)*(1-fc)*KfactorSC;
3309 C3 += pow(fc,2)*(1-fc)*KfactorMC1;
3310 C3 += pow(fc,2)*(1-fc)*KfactorMC2;
3311 C3 += pow(fc,3)*KfactorSC*KfactorMC1*KfactorMC2;
3314 if( (c[0]+c[1]+c[2])==1) return ((1-fcSq) + fcSq*KfactorSC);
3315 else return ((1-fcSq) + fcSq*KfactorMC1);// doesn't matter MC1 or MC2
3317 return ((1-fcSq) + fcSq*KfactorMC1);// doesn't matter MC1 or MC2
3319 if( (c[0]+c[1]+c[2])==2) return ((1-fcSq) + fcSq*KfactorSC);
3320 else return ((1-fcSq) + fcSq*KfactorMC1);// doesn't matter MC1 or MC2
3325 //________________________________________________________________________
3326 Float_t AliFourPion::MCWeight4(Int_t term, Float_t R, Float_t fcSq, Int_t c[4], Float_t qinv[6], Float_t kT[6]){
3327 if(term==13) return 1.0;
3330 // ----, ---+, --++, -+++, ++++
3333 // Term 1: 1-2-3-4 (all same-event)
3334 // Term 2: 1-2-3 4 (particle 4 from different event)
3335 // Term 3: 1-2-4 3 (particle 3 from different event)
3336 // Term 4: 1-3-4 2 (particle 2 from different event)
3337 // Term 5: 2-3-4 1 (particle 1 from different event)
3338 // Term 6: 1-2 3 4 (particle 1 and 2 from same event)
3344 // Term 12: 1 2 3 4 (all from different events)
3346 Float_t radius = R/0.19733;
3348 r[0]=radius*(1-kT[0]/2.0);
3349 r[1]=radius*(1-kT[1]/2.0);
3350 r[2]=radius*(1-kT[2]/2.0);
3351 r[3]=radius*(1-kT[3]/2.0);
3352 r[4]=radius*(1-kT[4]/2.0);
3353 r[5]=radius*(1-kT[5]/2.0);
3355 Int_t ChargeSum=c[0]+c[1]+c[2]+c[3];
3357 Float_t fc = sqrt(fcSq);
3359 Float_t Kfactor12 = FSICorrelation(c[0],c[1], qinv[0]);// K2
3360 Float_t Kfactor13 = FSICorrelation(c[0],c[2], qinv[1]);// K2
3361 Float_t Kfactor14 = FSICorrelation(c[0],c[3], qinv[2]);// K2
3362 Float_t Kfactor23 = FSICorrelation(c[1],c[2], qinv[3]);// K2
3363 Float_t Kfactor24 = FSICorrelation(c[1],c[3], qinv[4]);// K2
3364 Float_t Kfactor34 = FSICorrelation(c[2],c[3], qinv[5]);// K2
3365 Float_t arg12=qinv[0]*r[0];
3366 Float_t arg13=qinv[1]*r[1];
3367 Float_t arg14=qinv[2]*r[2];
3368 Float_t arg23=qinv[3]*r[3];
3369 Float_t arg24=qinv[4]*r[4];
3370 Float_t arg34=qinv[5]*r[5];
3371 // Exchange Amplitudes
3372 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));
3373 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));
3374 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));
3375 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));
3376 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));
3377 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));
3379 if(c[0]==c[1] && c[0]==c[2] && c[0]==c[3]){// ---- and ++++ configuration
3382 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
3383 C4QS += pow(EA12,2) * pow(EA34,2);// 2-pairs
3384 C4QS += pow(EA13,2) * pow(EA24,2);// 2-pairs
3385 C4QS += pow(EA14,2) * pow(EA23,2);// 2-pairs
3386 C4QS += 2*EA12*EA13*EA23 + 2*EA12*EA14*EA24 + 2*EA13*EA14*EA34 + 2*EA23*EA24*EA34;// 3-particle exhange
3387 C4QS += 3*EA12*EA23*EA34*EA14 + 3*EA12*EA13*EA34*EA24;// 4-particle exchange
3388 Float_t C4 = pow(1-fc,4) + 4*fc*pow(1-fc,3);
3389 C4 += pow(fc,2)*pow(1-fc,2)*( (1 + pow(EA12,2))*Kfactor12 + (1 + pow(EA13,2))*Kfactor13 + (1 + pow(EA14,2))*Kfactor14 );
3390 C4 += pow(fc,2)*pow(1-fc,2)*( (1 + pow(EA23,2))*Kfactor23 + (1 + pow(EA24,2))*Kfactor24 + (1 + pow(EA34,2))*Kfactor34);
3391 C4 += pow(fc,3)*(1-fc)*(1 + pow(EA12,2) + pow(EA13,2) + pow(EA23,2) + 2*EA12*EA13*EA23) * Kfactor12*Kfactor13*Kfactor23;
3392 C4 += pow(fc,3)*(1-fc)*(1 + pow(EA12,2) + pow(EA14,2) + pow(EA24,2) + 2*EA12*EA14*EA24) * Kfactor12*Kfactor14*Kfactor24;
3393 C4 += pow(fc,3)*(1-fc)*(1 + pow(EA13,2) + pow(EA14,2) + pow(EA34,2) + 2*EA13*EA14*EA34) * Kfactor13*Kfactor14*Kfactor34;
3394 C4 += pow(fc,3)*(1-fc)*(1 + pow(EA23,2) + pow(EA24,2) + pow(EA34,2) + 2*EA23*EA24*EA34) * Kfactor23*Kfactor24*Kfactor34;
3395 C4 += pow(fc,4)*C4QS*Kfactor12*Kfactor13*Kfactor14*Kfactor23*Kfactor24*Kfactor34;
3398 Float_t EA1=0, EA2=0, EA3=0, Kpair1=0, Kpair2=0, Kpair3=0;
3399 if(term==2) {EA1=EA12; EA2=EA13; EA3=EA23; Kpair1=Kfactor12; Kpair2=Kfactor13; Kpair3=Kfactor23;}
3400 else if(term==3) {EA1=EA12; EA2=EA14; EA3=EA24; Kpair1=Kfactor12; Kpair2=Kfactor14; Kpair3=Kfactor24;}
3401 else if(term==4) {EA1=EA13; EA2=EA14; EA3=EA34; Kpair1=Kfactor13; Kpair2=Kfactor14; Kpair3=Kfactor34;}
3402 else {EA1=EA23; EA2=EA24; EA3=EA34; Kpair1=Kfactor23; Kpair2=Kfactor24; Kpair3=Kfactor34;}
3403 Float_t C3QS = 1 + pow(EA1,2) + pow(EA2,2) + pow(EA3,2);
3404 C3QS += 2*EA1*EA2*EA3;
3405 Float_t C3 = pow(1-fc,3) + 3*fc*pow(1-fc,2);
3406 C3 += pow(fc,2)*(1-fc)*( (1+pow(EA1,2))*Kpair1 + (1+pow(EA2,2))*Kpair2 + (1+pow(EA3,2))*Kpair3 );
3407 C3 += pow(fc,3)*C3QS*Kpair1*Kpair2*Kpair3;
3410 if(term==6) return ((1-fcSq) + fcSq*(1 + pow(EA12,2))*Kfactor12);
3411 else if(term==7) return ((1-fcSq) + fcSq*(1 + pow(EA13,2))*Kfactor13);
3412 else if(term==8) return ((1-fcSq) + fcSq*(1 + pow(EA14,2))*Kfactor14);
3413 else if(term==9) return ((1-fcSq) + fcSq*(1 + pow(EA23,2))*Kfactor23);
3414 else if(term==10) return ((1-fcSq) + fcSq*(1 + pow(EA24,2))*Kfactor24);
3415 else return ((1-fcSq) + fcSq*(1 + pow(EA34,2))*Kfactor34);
3417 Float_t C22 = (1-fcSq) + fcSq*(1 + pow(EA12,2))*Kfactor12;
3418 C22 *= (1-fcSq) + fcSq*(1 + pow(EA34,2))*Kfactor34;
3422 }else{// mixed charge case
3423 if( ChargeSum==1 || ChargeSum==3){// ---+ and -+++ configuration
3424 Float_t EA1=0, EA2=0, EA3=0, Kpair1=0, Kpair2=0, Kpair3=0, Kpair4=0, Kpair5=0, Kpair6=0;
3425 Int_t c_OddOneOut = 1;
3426 if(ChargeSum==3) c_OddOneOut = 0;
3428 if(c[0]==c_OddOneOut) {EA1=EA23; EA2=EA24; EA3=EA34; Kpair1=Kfactor23; Kpair2=Kfactor24; Kpair3=Kfactor34; Kpair4=Kfactor12; Kpair5=Kfactor13; Kpair6=Kfactor14;}
3429 else if(c[1]==c_OddOneOut) {EA1=EA13; EA2=EA14; EA3=EA34; Kpair1=Kfactor13; Kpair2=Kfactor14; Kpair3=Kfactor34; Kpair4=Kfactor12; Kpair5=Kfactor23; Kpair6=Kfactor24;}
3430 else if(c[2]==c_OddOneOut) {EA1=EA12; EA2=EA14; EA3=EA24; Kpair1=Kfactor12; Kpair2=Kfactor14; Kpair3=Kfactor24; Kpair4=Kfactor13; Kpair5=Kfactor23; Kpair6=Kfactor34;}
3431 else {EA1=EA12; EA2=EA13; EA3=EA23; Kpair1=Kfactor12; Kpair2=Kfactor13; Kpair3=Kfactor23; Kpair4=Kfactor14; Kpair5=Kfactor24; Kpair6=Kfactor34;}
3434 Float_t C3QS = 1 + pow(EA1,2) + pow(EA2,2) + pow(EA3,2) + 2*EA1*EA2*EA3;
3435 Float_t C4 = pow(1-fc,4) + 4*fc*pow(1-fc,3);
3436 C4 += pow(fc,2)*pow(1-fc,2)*( (1 + pow(EA1,2))*Kpair1 + (1 + pow(EA2,2))*Kpair2 + (1 + pow(EA3,2))*Kpair3 );
3437 C4 += pow(fc,2)*pow(1-fc,2)*( Kpair4 + Kpair5 + Kpair6 );
3438 C4 += pow(fc,3)*(1-fc)*(1 + pow(EA1,2) + pow(EA2,2) + pow(EA3,2) + 2*EA1*EA2*EA3) * Kpair1*Kpair2*Kpair3;
3439 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
3440 C4 += pow(fc,4)*C3QS*Kfactor12*Kfactor13*Kfactor14*Kfactor23*Kfactor24*Kfactor34;
3442 }else if( (term==2 && ChargeSum==1) || (term==5 && ChargeSum==3)){
3443 Float_t C3QS = 1 + pow(EA1,2) + pow(EA2,2) + pow(EA3,2) + 2*EA1*EA2*EA3;
3444 Float_t C3 = pow(1-fc,3) + 3*fc*pow(1-fc,2);
3445 C3 += pow(fc,2)*(1-fc)*(1+pow(EA1,2))*Kpair1;
3446 C3 += pow(fc,2)*(1-fc)*(1+pow(EA2,2))*Kpair2;
3447 C3 += pow(fc,2)*(1-fc)*(1+pow(EA3,2))*Kpair3;
3448 C3 += pow(fc,3)*C3QS*Kpair1*Kpair2*Kpair3;
3450 }else if(term<=5){// one SC pair, two MC pairs
3451 Float_t C3 = pow(1-fc,3) + 3*fc*pow(1-fc,2);
3452 C3 += pow(fc,2)*(1-fc)*(1+pow(EA1,2))*Kpair1;// any SC pair will do
3453 C3 += pow(fc,2)*(1-fc)*Kpair4;// any MC pair will do
3454 C3 += pow(fc,2)*(1-fc)*Kpair5;// any MC pair will do
3455 C3 += pow(fc,3)*(1+pow(EA1,2))*Kpair1*Kpair4*Kpair5;
3457 }else if(term==6 || term==7){
3458 if(ChargeSum==1) return ((1-fcSq) + fcSq*(1 + pow(EA1,2))*Kpair1);// any SC pair will do
3459 else return ((1-fcSq) + fcSq*Kpair4);// any MC pair will do
3461 return ((1-fcSq) + fcSq*Kpair4);// any MC pair will do
3463 return ((1-fcSq) + fcSq*(1 + pow(EA1,2))*Kpair1);// any SC pair will do
3464 }else if(term==10 || term==11){
3465 if(ChargeSum==3) return ((1-fcSq) + fcSq*(1 + pow(EA1,2))*Kpair1);// any SC pair will do
3466 else return ((1-fcSq) + fcSq*Kpair4);// any MC pair will do
3467 }else return 1.0;// for 12 and 13
3468 }else{// --++ configuration
3469 Float_t EA1=0, EA2=0, Kpair1=0, Kpair2=0, Kpair3=0, Kpair4=0, Kpair5=0, Kpair6=0;
3470 if(c[0]==c[1]) {EA1=EA12; EA2=EA34; Kpair1=Kfactor12; Kpair2=Kfactor34; Kpair3=Kfactor13; Kpair4=Kfactor14; Kpair5=Kfactor23; Kpair6=Kfactor24;}
3471 else if(c[0]==c[2]) {EA1=EA13; EA2=EA24; Kpair1=Kfactor13; Kpair2=Kfactor24; Kpair3=Kfactor12; Kpair4=Kfactor14; Kpair5=Kfactor23; Kpair6=Kfactor34;}
3472 else {EA1=EA14; EA2=EA23; Kpair1=Kfactor14; Kpair2=Kfactor23; Kpair3=Kfactor12; Kpair4=Kfactor13; Kpair5=Kfactor24; Kpair6=Kfactor34;}
3475 Float_t C2QS = 1 + pow(EA1,2)*pow(EA2,2);
3476 Float_t C4 = pow(1-fc,4) + 4*fc*pow(1-fc,3);
3477 C4 += pow(fc,2)*pow(1-fc,2)*( (1 + pow(EA1,2))*Kpair1 + (1 + pow(EA2,2))*Kpair2 );
3478 C4 += pow(fc,2)*pow(1-fc,2)*( Kpair3 + Kpair4 + Kpair5 + Kpair6 );
3479 C4 += pow(fc,3)*(1-fc)*( (1 + pow(EA1,2))*Kpair1*Kpair3*Kpair4 + (1 + pow(EA2,2))*Kpair2*Kpair3*Kpair4);
3480 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
3481 C4 += pow(fc,4)*C2QS*Kfactor12*Kfactor13*Kfactor14*Kfactor23*Kfactor24*Kfactor34;
3484 Float_t C3 = pow(1-fc,3) + 3*fc*pow(1-fc,2);
3485 C3 += pow(fc,2)*(1-fc)*(1+pow(EA1,2))*Kpair1;// any SC pair will do
3486 C3 += pow(fc,2)*(1-fc)*Kpair4;// any MC pair will do
3487 C3 += pow(fc,2)*(1-fc)*Kpair6;// any MC pair will do
3488 C3 += pow(fc,3)*(1+pow(EA1,2))*Kpair1*Kpair4*Kpair6;
3490 }else if(term==6 || term==11){
3491 return ((1-fcSq) + fcSq*(1 + pow(EA1,2))*Kpair1);// any SC pair will do
3492 }else if(term !=12 && term !=13){
3493 return ((1-fcSq) + fcSq*Kpair3);// any MC pair will do
3499 //________________________________________________________________________
3500 Float_t AliFourPion::MCWeightFSI4(Int_t term, Float_t R, Float_t fcSq, Int_t c[4], Float_t qinv[6]){
3501 if(term==13) return 1.0;
3503 Int_t ChargeSum=c[0]+c[1]+c[2]+c[3];
3505 Float_t fc = sqrt(fcSq);
3507 Float_t Kfactor12 = FSICorrelation(c[0],c[1], qinv[0]);// K2
3508 Float_t Kfactor13 = FSICorrelation(c[0],c[2], qinv[1]);// K2
3509 Float_t Kfactor14 = FSICorrelation(c[0],c[3], qinv[2]);// K2
3510 Float_t Kfactor23 = FSICorrelation(c[1],c[2], qinv[3]);// K2
3511 Float_t Kfactor24 = FSICorrelation(c[1],c[3], qinv[4]);// K2
3512 Float_t Kfactor34 = FSICorrelation(c[2],c[3], qinv[5]);// K2
3514 if(c[0]==c[1] && c[0]==c[2] && c[0]==c[3]){// ---- and ++++ configuration
3517 Float_t C4 = pow(1-fc,4) + 4*fc*pow(1-fc,3);
3518 C4 += pow(fc,2)*pow(1-fc,2)*( Kfactor12 + Kfactor13 + Kfactor14 );
3519 C4 += pow(fc,2)*pow(1-fc,2)*( Kfactor23 + Kfactor24 + Kfactor34 );
3520 C4 += pow(fc,3)*(1-fc) * Kfactor12*Kfactor13*Kfactor23;
3521 C4 += pow(fc,3)*(1-fc) * Kfactor12*Kfactor14*Kfactor24;
3522 C4 += pow(fc,3)*(1-fc) * Kfactor13*Kfactor14*Kfactor34;
3523 C4 += pow(fc,3)*(1-fc) * Kfactor23*Kfactor24*Kfactor34;
3524 C4 += pow(fc,4) * Kfactor12*Kfactor13*Kfactor14*Kfactor23*Kfactor24*Kfactor34;
3527 Float_t Kpair1=0, Kpair2=0, Kpair3=0;
3528 if(term==2) {Kpair1=Kfactor12; Kpair2=Kfactor13; Kpair3=Kfactor23;}
3529 else if(term==3) {Kpair1=Kfactor12; Kpair2=Kfactor14; Kpair3=Kfactor24;}
3530 else if(term==4) {Kpair1=Kfactor13; Kpair2=Kfactor14; Kpair3=Kfactor34;}
3531 else {Kpair1=Kfactor23; Kpair2=Kfactor24; Kpair3=Kfactor34;}
3532 Float_t C3 = pow(1-fc,3) + 3*fc*pow(1-fc,2);
3533 C3 += pow(fc,2)*(1-fc)*( Kpair1 + Kpair2 + Kpair3 );
3534 C3 += pow(fc,3)*Kpair1*Kpair2*Kpair3;
3537 if(term==6) return ((1-fcSq) + fcSq*Kfactor12);
3538 else if(term==7) return ((1-fcSq) + fcSq*Kfactor13);
3539 else if(term==8) return ((1-fcSq) + fcSq*Kfactor14);
3540 else if(term==9) return ((1-fcSq) + fcSq*Kfactor23);
3541 else if(term==10) return ((1-fcSq) + fcSq*Kfactor24);
3542 else return ((1-fcSq) + fcSq*Kfactor34);
3544 Float_t C22 = (1-fcSq) + fcSq*Kfactor12;
3545 C22 *= (1-fcSq) + fcSq*Kfactor34;
3549 }else{// mixed charge case
3550 if( ChargeSum==1 || ChargeSum==3){// ---+ and -+++ configuration
3551 Float_t Kpair1=0, Kpair2=0, Kpair3=0, Kpair4=0, Kpair5=0, Kpair6=0;
3552 Int_t c_OddOneOut = 1;
3553 if(ChargeSum==3) c_OddOneOut = 0;
3555 if(c[0]==c_OddOneOut) {Kpair1=Kfactor23; Kpair2=Kfactor24; Kpair3=Kfactor34; Kpair4=Kfactor12; Kpair5=Kfactor13; Kpair6=Kfactor14;}
3556 else if(c[1]==c_OddOneOut) {Kpair1=Kfactor13; Kpair2=Kfactor14; Kpair3=Kfactor34; Kpair4=Kfactor12; Kpair5=Kfactor23; Kpair6=Kfactor24;}
3557 else if(c[2]==c_OddOneOut) {Kpair1=Kfactor12; Kpair2=Kfactor14; Kpair3=Kfactor24; Kpair4=Kfactor13; Kpair5=Kfactor23; Kpair6=Kfactor34;}
3558 else {Kpair1=Kfactor12; Kpair2=Kfactor13; Kpair3=Kfactor23; Kpair4=Kfactor14; Kpair5=Kfactor24; Kpair6=Kfactor34;}
3561 Float_t C4 = pow(1-fc,4) + 4*fc*pow(1-fc,3);
3562 C4 += pow(fc,2)*pow(1-fc,2)*( Kpair1 + Kpair2 + Kpair3 );
3563 C4 += pow(fc,2)*pow(1-fc,2)*( Kpair4 + Kpair5 + Kpair6 );
3564 C4 += pow(fc,3)*(1-fc)*Kpair1*Kpair2*Kpair3;
3565 C4 += pow(fc,3)*(1-fc)*(Kpair1*Kpair4*Kpair5 + Kpair2*Kpair4*Kpair6 + Kpair3*Kpair5*Kpair6);// doesn't matter which two MC K's used
3566 C4 += pow(fc,4)*Kfactor12*Kfactor13*Kfactor14*Kfactor23*Kfactor24*Kfactor34;
3568 }else if( (term==2 && ChargeSum==1) || (term==5 && ChargeSum==3)){
3569 Float_t C3 = pow(1-fc,3) + 3*fc*pow(1-fc,2);
3570 C3 += pow(fc,2)*(1-fc)*Kpair1;
3571 C3 += pow(fc,2)*(1-fc)*Kpair2;
3572 C3 += pow(fc,2)*(1-fc)*Kpair3;
3573 C3 += pow(fc,3)*Kpair1*Kpair2*Kpair3;
3575 }else if(term<=5){// one SC pair, two MC pairs
3576 Float_t C3 = pow(1-fc,3) + 3*fc*pow(1-fc,2);
3577 C3 += pow(fc,2)*(1-fc)*Kpair1;// any SC pair will do
3578 C3 += pow(fc,2)*(1-fc)*Kpair4;// any MC pair will do
3579 C3 += pow(fc,2)*(1-fc)*Kpair5;// any MC pair will do
3580 C3 += pow(fc,3)*Kpair1*Kpair4*Kpair5;
3582 }else if(term==6 || term==7){
3583 if(ChargeSum==1) return ((1-fcSq) + fcSq*Kpair1);// any SC pair will do
3584 else return ((1-fcSq) + fcSq*Kpair4);// any MC pair will do
3586 return ((1-fcSq) + fcSq*Kpair4);// any MC pair will do
3588 return ((1-fcSq) + fcSq*Kpair1);// any SC pair will do
3589 }else if(term==10 || term==11){
3590 if(ChargeSum==3) return ((1-fcSq) + fcSq*Kpair1);// any SC pair will do
3591 else return ((1-fcSq) + fcSq*Kpair4);// any MC pair will do
3592 }else return 1.0;// 12 and 13
3593 }else{// --++ configuration
3594 Float_t Kpair1=0, Kpair2=0, Kpair3=0, Kpair4=0, Kpair5=0, Kpair6=0;
3595 if(c[0]==c[1]) {Kpair1=Kfactor12; Kpair2=Kfactor34; Kpair3=Kfactor13; Kpair4=Kfactor14; Kpair5=Kfactor23; Kpair6=Kfactor24;}
3596 else if(c[0]==c[2]) {Kpair1=Kfactor13; Kpair2=Kfactor24; Kpair3=Kfactor12; Kpair4=Kfactor14; Kpair5=Kfactor23; Kpair6=Kfactor34;}
3597 else {Kpair1=Kfactor14; Kpair2=Kfactor23; Kpair3=Kfactor12; Kpair4=Kfactor13; Kpair5=Kfactor24; Kpair6=Kfactor34;}
3600 Float_t C4 = pow(1-fc,4) + 4*fc*pow(1-fc,3);
3601 C4 += pow(fc,2)*pow(1-fc,2)*( Kpair1 + Kpair2 + Kpair3 + Kpair4 + Kpair5 + Kpair6);
3602 C4 += pow(fc,3)*(1-fc)*( Kpair1*Kpair3*Kpair4 + Kpair2*Kpair3*Kpair4 + Kpair1*Kpair5*Kpair6 + Kpair2*Kpair5*Kpair6);
3603 C4 += pow(fc,4)*Kfactor12*Kfactor13*Kfactor14*Kfactor23*Kfactor24*Kfactor34;
3606 Float_t C3 = pow(1-fc,3) + 3*fc*pow(1-fc,2);
3607 C3 += pow(fc,2)*(1-fc)*Kpair1;// any SC pair will do
3608 C3 += pow(fc,2)*(1-fc)*Kpair4;// any MC pair will do
3609 C3 += pow(fc,2)*(1-fc)*Kpair6;// any MC pair will do
3610 C3 += pow(fc,3)*Kpair1*Kpair4*Kpair6;
3612 }else if(term==6 || term==11){
3613 return ((1-fcSq) + fcSq*Kpair1);// any SC pair will do
3614 }else if(term !=12 && term !=13){
3615 return ((1-fcSq) + fcSq*Kpair3);// any MC pair will do
3621 //________________________________________________________________________
3622 void AliFourPion::SetMomResCorrections(Bool_t legoCase, TH2D *temp2D){
3626 cout<<"LEGO call to SetMomResCorrections"<<endl;
3627 fMomResC2 = (TH2D*)temp2D->Clone();
3628 fMomResC2->SetDirectory(0);
3630 TFile *momResFile = new TFile("MomResFile.root","READ");
3631 if(!momResFile->IsOpen()) {
3632 cout<<"No momentum resolution file found"<<endl;
3633 AliFatal("No momentum resolution file found. Kill process.");
3634 }else {cout<<"Good Momentum Resolution File Found!"<<endl;}
3636 TH2D *temp2D2 = (TH2D*)momResFile->Get("MRC_C2_SC");
3637 fMomResC2 = (TH2D*)temp2D2->Clone();
3638 fMomResC2->SetDirectory(0);
3640 momResFile->Close();
3644 for(Int_t bx=1; bx<=fMomResC2->GetNbinsX(); bx++){
3645 for(Int_t by=1; by<=fMomResC2->GetNbinsY(); by++){
3646 if(fMomResC2->GetBinContent(bx,by) > 1.5) fMomResC2->SetBinContent(bx,by, 1.5);// Maximum is ~1.02
3647 if(fMomResC2->GetBinContent(bx,by) < 0.95) fMomResC2->SetBinContent(bx,by, 0.95);// Minimum is ~0.98
3651 cout<<"Done reading momentum resolution file"<<endl;
3653 //________________________________________________________________________
3654 void AliFourPion::SetFSICorrelations(Bool_t legoCase, TH1D *tempss[12], TH1D *tempos[12]){
3655 // read in 2-particle and 3-particle FSI correlations = K2 & K3
3656 // 2-particle input histo from file is binned in qinv. 3-particle in qinv of each pair
3658 cout<<"LEGO call to SetFSICorrelations"<<endl;
3659 for(Int_t MB=0; MB<12; MB++) {
3660 fFSIss[MB] = (TH1D*)tempss[MB]->Clone();
3661 fFSIos[MB] = (TH1D*)tempos[MB]->Clone();
3663 fFSIss[MB]->SetDirectory(0);
3664 fFSIos[MB]->SetDirectory(0);
3667 cout<<"non LEGO call to SetFSICorrelations"<<endl;
3668 TFile *fsifile = new TFile("KFile.root","READ");
3669 if(!fsifile->IsOpen()) {
3670 cout<<"No FSI file found"<<endl;
3671 AliFatal("No FSI file found. Kill process.");
3672 }else {cout<<"Good FSI File Found!"<<endl;}
3674 TH1D *temphistoSS[12];
3675 TH1D *temphistoOS[12];
3676 for(Int_t MB=0; MB<12; MB++) {
3677 TString *nameK2SS = new TString("K2ss_");
3679 temphistoSS[MB] = (TH1D*)fsifile->Get(nameK2SS->Data());
3681 TString *nameK2OS = new TString("K2os_");
3683 temphistoOS[MB] = (TH1D*)fsifile->Get(nameK2OS->Data());
3685 fFSIss[MB] = (TH1D*)temphistoSS[MB]->Clone();
3686 fFSIos[MB] = (TH1D*)temphistoOS[MB]->Clone();
3687 fFSIss[MB]->SetDirectory(0);
3688 fFSIos[MB]->SetDirectory(0);
3695 cout<<"Done reading FSI file"<<endl;
3697 //________________________________________________________________________
3698 Float_t AliFourPion::FSICorrelation(Int_t charge1, Int_t charge2, Float_t qinv){
3699 // returns 2-particle Coulomb correlations = K2
3700 Int_t qbinL = fFSIss[fFSIindex]->GetXaxis()->FindBin(qinv-fFSIss[fFSIindex]->GetXaxis()->GetBinWidth(1)/2.);
3701 Int_t qbinH = qbinL+1;
3702 if(qbinL <= 0) return 1.0;
3703 if(qbinH > fFSIss[fFSIindex]->GetNbinsX()) return 1.0;
3706 if(charge1==charge2){
3707 slope = fFSIss[fFSIindex]->GetBinContent(qbinL) - fFSIss[fFSIindex]->GetBinContent(qbinH);
3708 slope /= fFSIss[fFSIindex]->GetXaxis()->GetBinCenter(qbinL) - fFSIss[fFSIindex]->GetXaxis()->GetBinCenter(qbinH);
3709 return (slope*(qinv - fFSIss[fFSIindex]->GetXaxis()->GetBinCenter(qbinL)) + fFSIss[fFSIindex]->GetBinContent(qbinL));
3711 slope = fFSIos[fFSIindex]->GetBinContent(qbinL) - fFSIos[fFSIindex]->GetBinContent(qbinH);
3712 slope /= fFSIos[fFSIindex]->GetXaxis()->GetBinCenter(qbinL) - fFSIos[fFSIindex]->GetXaxis()->GetBinCenter(qbinH);
3713 return (slope*(qinv - fFSIos[fFSIindex]->GetXaxis()->GetBinCenter(qbinL)) + fFSIos[fFSIindex]->GetBinContent(qbinL));
3716 //________________________________________________________________________
3717 void AliFourPion::SetFillBins2(Int_t c1, Int_t c2, Int_t &b1, Int_t &b2){
3718 if((c1+c2)==1) {b1=0; b2=1;}// Re-assign to merge degenerate histos
3719 else {b1=c1; b2=c2;}
3721 //________________________________________________________________________
3722 void 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){
3724 // "part" specifies which pair is from the same event. Only relevant for terms 2-4
3726 if(part==1) {// default case (irrelevant for term 1 and term 5)
3727 if(c1==c2) seSS=kTRUE;
3730 if(c1==c3) seSS=kTRUE;
3734 // fill2, fill3, fill4 are only used for Cumulant Terms 2,3,4
3735 if( (c1+c2+c3)==1) {
3736 b1=0; b2=0; b3=1;// Re-assign to merge degenerate histos
3738 if(seSS) fill2=kTRUE;
3739 else {fill3=kTRUE; fill4=kTRUE;}
3741 }else if( (c1+c2+c3)==2) {
3744 if(!seSS) {fill2=kTRUE; fill3=kTRUE;}
3748 b1=c1; b2=c2; b3=c3;
3749 fill2=kTRUE; fill3=kTRUE; fill4=kTRUE;
3753 //________________________________________________________________________
3754 void 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]){
3756 // fill2, fill3, fill4 are only used for Cumulant Terms 2,3,4
3757 if( (c1+c2+c3+c4)==0 || (c1+c2+c3+c4)==4) {// all of the same charge: ---- or ++++
3759 b1=c1; b2=c2; b3=c3; b4=c4;
3760 if(ENsum==0) fillTerm[0]=kTRUE;
3761 else if(ENsum==1) {fillTerm[1]=kTRUE; fillTerm[2]=kTRUE; fillTerm[3]=kTRUE; fillTerm[4]=kTRUE;}
3762 else if(ENsum==2) {fillTerm[11]=kTRUE;}
3763 else if(ENsum==3) {fillTerm[5]=kTRUE; fillTerm[6]=kTRUE; fillTerm[7]=kTRUE; fillTerm[8]=kTRUE; fillTerm[9]=kTRUE; fillTerm[10]=kTRUE;}
3764 else fillTerm[12]=kTRUE;
3766 }else if( (c1+c2+c3+c4)==1) {// one positive charge: ---+
3768 b1=0; b2=0; b3=0; b4=1;// Re-assign to merge degenerate histos
3769 if(ENsum==0) fillTerm[0]=kTRUE;
3771 if(c4==1) fillTerm[1]=kTRUE;
3772 else {fillTerm[2]=kTRUE; fillTerm[3]=kTRUE; fillTerm[4]=kTRUE;}
3776 if(c3==1 || c4==1) {fillTerm[5]=kTRUE; fillTerm[6]=kTRUE; fillTerm[8]=kTRUE;}
3777 else {fillTerm[7]=kTRUE; fillTerm[9]=kTRUE; fillTerm[10]=kTRUE;}
3778 }else fillTerm[12]=kTRUE;
3780 }else if( (c1+c2+c3+c4)==2) {// two positive charges: --++
3782 b1=0; b2=0; b3=1; b4=1;// Re-assign to merge degenerate histos
3783 if(ENsum==0) fillTerm[0]=kTRUE;
3785 if(c4==1) {fillTerm[1]=kTRUE; fillTerm[2]=kTRUE;}
3786 else {fillTerm[3]=kTRUE; fillTerm[4]=kTRUE;}
3788 if( (c1+c2)==0) fillTerm[11]=kTRUE;
3790 if( (c1+c2)==0) fillTerm[5]=kTRUE;
3791 else if( (c1+c2)==1) {fillTerm[6]=kTRUE; fillTerm[7]=kTRUE; fillTerm[8]=kTRUE; fillTerm[9]=kTRUE;}
3792 else fillTerm[10]=kTRUE;
3793 }else fillTerm[12]=kTRUE;
3795 }else{// three positive charges
3797 b1=0; b2=1; b3=1; b4=1;// Re-assign to merge degenerate histos
3798 if(ENsum==0) fillTerm[0]=kTRUE;
3800 if(c4==0) fillTerm[4]=kTRUE;
3801 else {fillTerm[1]=kTRUE; fillTerm[2]=kTRUE; fillTerm[3]=kTRUE;}
3805 if(c3==0 || c4==0) {fillTerm[8]=kTRUE; fillTerm[9]=kTRUE; fillTerm[10]=kTRUE;}
3806 else {fillTerm[5]=kTRUE; fillTerm[6]=kTRUE; fillTerm[7]=kTRUE;}
3807 }else fillTerm[12]=kTRUE;
3812 //________________________________________________________________________
3813 void AliFourPion::SetFSIindex(Float_t R){
3816 if(fMbin==0) fFSIindex = 0;//0-5%
3817 else if(fMbin==1) fFSIindex = 1;//5-10%
3818 else if(fMbin<=3) fFSIindex = 2;//10-20%
3819 else if(fMbin<=5) fFSIindex = 3;//20-30%
3820 else if(fMbin<=7) fFSIindex = 4;//30-40%
3821 else if(fMbin<=9) fFSIindex = 5;//40-50%
3822 else if(fMbin<=12) fFSIindex = 6;//40-50%
3823 else if(fMbin<=15) fFSIindex = 7;//40-50%
3824 else if(fMbin<=18) fFSIindex = 8;//40-50%
3825 else fFSIindex = 8;//90-100%
3826 }else fFSIindex = 9;// pp and pPb
3827 }else{// FSI binning for MC
3828 if(R>=10.) fFSIindex = 0;
3829 else if(R>=9.) fFSIindex = 1;
3830 else if(R>=8.) fFSIindex = 2;
3831 else if(R>=7.) fFSIindex = 3;
3832 else if(R>=6.) fFSIindex = 4;
3833 else if(R>=5.) fFSIindex = 5;
3834 else if(R>=4.) fFSIindex = 6;
3835 else if(R>=3.) fFSIindex = 7;
3836 else if(R>=2.) fFSIindex = 8;
3840 //________________________________________________________________________
3841 void AliFourPion::SetMuonCorrections(Bool_t legoCase, TH2D *tempMuon){
3843 cout<<"LEGO call to SetMuonCorrections"<<endl;
3844 fWeightmuonCorrection = (TH2D*)tempMuon->Clone();
3845 fWeightmuonCorrection->SetDirectory(0);
3847 cout<<"non LEGO call to SetMuonCorrections"<<endl;
3848 TFile *MuonFile=new TFile("MuonCorrection.root","READ");
3849 if(!MuonFile->IsOpen()) {
3850 cout<<"No Muon file found"<<endl;
3851 AliFatal("No Muon file found. Kill process.");
3852 }else {cout<<"Good Muon File Found!"<<endl;}
3854 fWeightmuonCorrection = (TH2D*)MuonFile->Get("WeightmuonCorrection");
3855 fWeightmuonCorrection->SetDirectory(0);
3859 cout<<"Done reading Muon file"<<endl;