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"
32 #include "AliChaoticity.h"
35 #define G_Coeff 0.006399 // 2*pi*alpha*M_pion
38 // Author: Dhevan Gangadharan
40 ClassImp(AliChaoticity)
42 //________________________________________________________________________
43 AliChaoticity::AliChaoticity():
58 fPdensityExplicitLoop(kFALSE),
59 fPdensityPairCut(kTRUE),
60 fTabulatePairs(kFALSE),
78 fQupperBoundWeights(0),
100 fMinSepTPCEntrancePhi(0),
101 fMinSepTPCEntranceEta(0),
130 fOtherPairLocation1(),
131 fOtherPairLocation2(),
140 // Default constructor
141 for(Int_t mb=0; mb<fMbins; mb++){
142 for(Int_t edB=0; edB<kEDbins; edB++){
143 for(Int_t c1=0; c1<2; c1++){
144 for(Int_t c2=0; c2<2; c2++){
145 for(Int_t sc=0; sc<kSCLimit2; sc++){
146 for(Int_t term=0; term<2; term++){
148 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fExplicit2=0x0;
150 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fIdeal = 0x0;
151 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fSmeared = 0x0;
152 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[0].fExplicit2OSL = 0x0;
153 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[0].fExplicit2OSLQW = 0x0;
154 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[1].fExplicit2OSL = 0x0;
155 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[1].fExplicit2OSLQW = 0x0;
160 for(Int_t c3=0; c3<2; c3++){
161 for(Int_t sc=0; sc<kSCLimit3; sc++){
162 for(Int_t term=0; term<5; term++){
164 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fExplicit3 = 0x0;
165 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fNormEx3 = 0x0;
166 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fNorm3 = 0x0;
167 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fTerms3 = 0x0;
168 for(Int_t dt=0; dt<kDENtypes; dt++){
169 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].DT[dt].fTwoPartNorm = 0x0;
177 for(Int_t tKbin=0; tKbin<kKbinsT; tKbin++){
178 for(Int_t yKbin=0; yKbin<kKbinsY; yKbin++){
179 KT[tKbin].KY[yKbin].MB[mb].EDB[edB].TwoPT[0].fExplicit2ThreeD = 0x0;
180 KT[tKbin].KY[yKbin].MB[mb].EDB[edB].TwoPT[1].fExplicit2ThreeD = 0x0;
188 //________________________________________________________________________
189 AliChaoticity::AliChaoticity(const Char_t *name, Bool_t MCdecision, Bool_t Tabulatedecision, Bool_t PbPbdecision, Int_t lowCentBin, Int_t highCentBin, Bool_t lego)
190 : AliAnalysisTaskSE(name),
203 fPbPbcase(PbPbdecision),
204 fPdensityExplicitLoop(kFALSE),
205 fPdensityPairCut(kTRUE),
206 fTabulatePairs(Tabulatedecision),
212 fCentBinLowLimit(lowCentBin),
213 fCentBinHighLimit(highCentBin),
224 fQupperBoundWeights(0),
246 fMinSepTPCEntrancePhi(0),
247 fMinSepTPCEntranceEta(0),
276 fOtherPairLocation1(),
277 fOtherPairLocation2(),
290 fTabulatePairs=Tabulatedecision;
291 fPbPbcase=PbPbdecision;
292 fPdensityExplicitLoop = kFALSE;
293 fPdensityPairCut = kTRUE;
294 fCentBinLowLimit = lowCentBin;
295 fCentBinHighLimit = highCentBin;
297 for(Int_t mb=0; mb<fMbins; mb++){
298 for(Int_t edB=0; edB<kEDbins; edB++){
299 for(Int_t c1=0; c1<2; c1++){
300 for(Int_t c2=0; c2<2; c2++){
301 for(Int_t sc=0; sc<kSCLimit2; sc++){
302 for(Int_t term=0; term<2; term++){
304 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fExplicit2=0x0;
306 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fIdeal = 0x0;
307 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fSmeared = 0x0;
308 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[0].fExplicit2OSL = 0x0;
309 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[0].fExplicit2OSLQW = 0x0;
310 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[1].fExplicit2OSL = 0x0;
311 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[1].fExplicit2OSLQW = 0x0;
316 for(Int_t c3=0; c3<2; c3++){
317 for(Int_t sc=0; sc<kSCLimit3; sc++){
318 for(Int_t term=0; term<5; term++){
320 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fExplicit3 = 0x0;
321 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fNormEx3 = 0x0;
322 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fNorm3 = 0x0;
323 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fTerms3 = 0x0;
324 for(Int_t dt=0; dt<kDENtypes; dt++){
325 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].DT[dt].fTwoPartNorm = 0x0;
333 for(Int_t tKbin=0; tKbin<kKbinsT; tKbin++){
334 for(Int_t yKbin=0; yKbin<kKbinsY; yKbin++){
335 KT[tKbin].KY[yKbin].MB[mb].EDB[edB].TwoPT[0].fExplicit2ThreeD = 0x0;
336 KT[tKbin].KY[yKbin].MB[mb].EDB[edB].TwoPT[1].fExplicit2ThreeD = 0x0;
344 DefineOutput(1, TList::Class());
346 //________________________________________________________________________
347 AliChaoticity::AliChaoticity(const AliChaoticity &obj)
348 : AliAnalysisTaskSE(obj.fname),
352 fOutputList(obj.fOutputList),
353 fPIDResponse(obj.fPIDResponse),
356 fTempStruct(obj.fTempStruct),
357 fRandomNumber(obj.fRandomNumber),
359 fMCcase(obj.fMCcase),
360 fAODcase(obj.fAODcase),
361 fPbPbcase(obj.fPbPbcase),
362 fPdensityExplicitLoop(obj.fPdensityExplicitLoop),
363 fPdensityPairCut(obj.fPdensityPairCut),
364 fTabulatePairs(obj.fTabulatePairs),
365 fBfield(obj.fBfield),
369 fMultLimit(obj.fMultLimit),
370 fCentBinLowLimit(obj.fCentBinLowLimit),
371 fCentBinHighLimit(obj.fCentBinHighLimit),
372 fEventCounter(obj.fEventCounter),
373 fEventsToMix(obj.fEventsToMix),
374 fZvertexBins(obj.fZvertexBins),
377 fQLowerCut(obj.fQLowerCut),
380 fKupperBound(obj.fKupperBound),
381 fQupperBound(obj.fQupperBound),
382 fQupperBoundWeights(obj.fQupperBoundWeights),
390 fQstepWeights(obj.fQstepWeights),
392 fDampStart(obj.fDampStart),
393 fDampStep(obj.fDampStep),
400 fTPCTOFboundry(obj.fTPCTOFboundry),
401 fTOFboundry(obj.fTOFboundry),
402 fSigmaCutTPC(obj.fSigmaCutTPC),
403 fSigmaCutTOF(obj.fSigmaCutTOF),
404 fMinSepTPCEntrancePhi(obj.fMinSepTPCEntrancePhi),
405 fMinSepTPCEntranceEta(obj.fMinSepTPCEntranceEta),
406 fShareQuality(obj.fShareQuality),
407 fShareFraction(obj.fShareFraction),
408 fTrueMassP(obj.fTrueMassP),
409 fTrueMassPi(obj.fTrueMassPi),
410 fTrueMassK(obj.fTrueMassK),
411 fTrueMassKs(obj.fTrueMassKs),
412 fTrueMassLam(obj.fTrueMassLam),
413 fKtbinL(obj.fKtbinL),
414 fKtbinH(obj.fKtbinH),
415 fKybinL(obj.fKybinL),
416 fKybinH(obj.fKybinH),
417 fQobinL(obj.fQobinL),
418 fQobinH(obj.fQobinH),
419 fQsbinL(obj.fQsbinL),
420 fQsbinH(obj.fQsbinH),
421 fQlbinL(obj.fQlbinL),
422 fQlbinH(obj.fQlbinH),
423 fDummyB(obj.fDummyB),
434 fOtherPairLocation1(),
435 fOtherPairLocation2(),
446 //________________________________________________________________________
447 AliChaoticity &AliChaoticity::operator=(const AliChaoticity &obj)
449 // Assignment operator
456 fOutputList = obj.fOutputList;
457 fPIDResponse = obj.fPIDResponse;
460 fTempStruct = obj.fTempStruct;
461 fRandomNumber = obj.fRandomNumber;
463 fMCcase = obj.fMCcase;
464 fAODcase = obj.fAODcase;
465 fPbPbcase = obj.fPbPbcase;
466 fPdensityExplicitLoop = obj.fPdensityExplicitLoop;
467 fPdensityPairCut = obj.fPdensityPairCut;
468 fTabulatePairs = obj.fTabulatePairs;
469 fBfield = obj.fBfield;
473 fMultLimit = obj.fMultLimit;
474 fCentBinLowLimit = obj.fCentBinLowLimit;
475 fCentBinHighLimit = obj.fCentBinHighLimit;
476 fEventCounter = obj.fEventCounter;
477 fEventsToMix = obj.fEventsToMix;
478 fZvertexBins = obj.fZvertexBins;
481 fQLowerCut = obj.fQLowerCut;
484 fKupperBound = obj.fKupperBound;
485 fQupperBound = obj.fQupperBound;
486 fQupperBoundWeights = obj.fQupperBoundWeights;
494 fQstepWeights = obj.fQstepWeights;
496 fDampStart = obj.fDampStart;
497 fDampStep = obj.fDampStep;
498 fTPCTOFboundry = obj.fTPCTOFboundry;
499 fTOFboundry = obj.fTOFboundry;
500 fSigmaCutTPC = obj.fSigmaCutTPC;
501 fSigmaCutTOF = obj.fSigmaCutTOF;
502 fMinSepTPCEntrancePhi = obj.fMinSepTPCEntrancePhi;
503 fMinSepTPCEntranceEta = obj.fMinSepTPCEntranceEta;
504 fShareQuality = obj.fShareQuality;
505 fShareFraction = obj.fShareFraction;
506 fTrueMassP = obj.fTrueMassP;
507 fTrueMassPi = obj.fTrueMassPi;
508 fTrueMassK = obj.fTrueMassK;
509 fTrueMassKs = obj.fTrueMassKs;
510 fTrueMassLam = obj.fTrueMassLam;
511 fKtbinL = obj.fKtbinL;
512 fKtbinH = obj.fKtbinH;
513 fKybinL = obj.fKybinL;
514 fKybinH = obj.fKybinH;
515 fQobinL = obj.fQobinL;
516 fQobinH = obj.fQobinH;
517 fQsbinL = obj.fQsbinL;
518 fQsbinH = obj.fQsbinH;
519 fQlbinL = obj.fQlbinL;
520 fQlbinH = obj.fQlbinH;
521 fDummyB = obj.fDummyB;
522 fNormWeight = obj.fNormWeight;
523 fNormWeightErr = obj.fNormWeightErr;
527 //________________________________________________________________________
528 AliChaoticity::~AliChaoticity()
531 if(fAOD) delete fAOD;
532 //if(fESD) delete fESD;
533 if(fOutputList) delete fOutputList;
534 if(fPIDResponse) delete fPIDResponse;
536 if(fEvt) delete fEvt;
537 if(fTempStruct) delete [] fTempStruct;
538 if(fRandomNumber) delete fRandomNumber;
539 if(fFSI2SS) delete fFSI2SS;
540 if(fFSI2OS) delete fFSI2OS;
541 if(fFSIOmega0SS) delete fFSIOmega0SS;
542 if(fFSIOmega0OS) delete fFSIOmega0OS;
543 if(fMomResC2) delete fMomResC2;
544 if(fMomRes3DTerm1) delete fMomRes3DTerm1;
545 if(fMomRes3DTerm2) delete fMomRes3DTerm2;
546 if(fMomRes3DTerm3) delete fMomRes3DTerm3;
547 if(fMomRes3DTerm4) delete fMomRes3DTerm4;
548 if(fMomRes3DTerm5) delete fMomRes3DTerm5;
550 for(int i=0; i<fMultLimit; i++){
551 if(fPairLocationSE[i]) delete [] fPairLocationSE[i];
552 if(fPairLocationME[i]) delete [] fPairLocationME[i];
553 for(int j=0; j<2; j++){
554 if(fOtherPairLocation1[j][i]) delete [] fOtherPairLocation1[j][i];
555 if(fOtherPairLocation2[j][i]) delete [] fOtherPairLocation2[j][i];
557 for(int j=0; j<3; j++) if(fNormPairSwitch[j][i]) delete [] fNormPairSwitch[j][i];
558 for(int j=0; j<4; j++) if(fPairSplitCut[j][i]) delete [] fPairSplitCut[j][i];
560 for(int i=0; i<kPairLimit; i++) if(fTripletSkip1[i]) delete [] fTripletSkip1[i];
561 for(int i=0; i<2*kPairLimit; i++) if(fTripletSkip2[i]) delete [] fTripletSkip2[i];
562 for(int i=0; i<3; i++) if(fNormPairs[i]) delete [] fNormPairs[i];
564 for(Int_t mb=0; mb<fMbins; mb++){
565 for(Int_t edB=0; edB<kEDbins; edB++){
566 for(Int_t c1=0; c1<2; c1++){
567 for(Int_t c2=0; c2<2; c2++){
568 for(Int_t sc=0; sc<kSCLimit2; sc++){
569 for(Int_t term=0; term<2; term++){
571 if(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fExplicit2) delete Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fExplicit2;
573 if(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fIdeal) delete Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fIdeal;
574 if(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fSmeared) delete Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fSmeared;
575 if(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[0].fExplicit2OSL) delete Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[0].fExplicit2OSL;
576 if(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[0].fExplicit2OSLQW) delete Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[0].fExplicit2OSLQW;
577 if(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[1].fExplicit2OSL) delete Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[1].fExplicit2OSL;
578 if(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[1].fExplicit2OSLQW) delete Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[1].fExplicit2OSLQW;
583 for(Int_t c3=0; c3<2; c3++){
584 for(Int_t sc=0; sc<kSCLimit3; sc++){
585 for(Int_t term=0; term<5; term++){
587 if(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fExplicit3) delete Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fExplicit3;
588 if(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fNormEx3) delete Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fNormEx3;
589 if(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fNorm3) delete Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fNorm3;
590 if(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fTerms3) delete Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fTerms3;
591 for(Int_t dt=0; dt<kDENtypes; dt++){
592 if(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].DT[dt].fTwoPartNorm) delete Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].DT[dt].fTwoPartNorm;
600 for(Int_t tKbin=0; tKbin<kKbinsT; tKbin++){
601 for(Int_t yKbin=0; yKbin<kKbinsY; yKbin++){
602 if(KT[tKbin].KY[yKbin].MB[mb].EDB[edB].TwoPT[0].fExplicit2ThreeD) delete KT[tKbin].KY[yKbin].MB[mb].EDB[edB].TwoPT[0].fExplicit2ThreeD;
603 if(KT[tKbin].KY[yKbin].MB[mb].EDB[edB].TwoPT[1].fExplicit2ThreeD) delete KT[tKbin].KY[yKbin].MB[mb].EDB[edB].TwoPT[1].fExplicit2ThreeD;
612 //________________________________________________________________________
613 void AliChaoticity::ParInit()
615 cout<<"AliChaoticity MyInit() call"<<endl;
617 fRandomNumber = new TRandom3();
618 fRandomNumber->SetSeed(0);
622 if(fPdensityExplicitLoop) fEventsToMix=3;
623 else if(fPdensityPairCut && !fPdensityExplicitLoop) fEventsToMix=2;
627 fTPCTOFboundry = 0.6;// TPC pid used below this momentum, TOF above but below TOF_boundry
628 fTOFboundry = 2.1;// TOF pid used below this momentum
629 fSigmaCutTPC = 2.0;// 2.0 (norm). 1.5 Sys Deviation
630 fSigmaCutTOF = 2.0;// 2.0 (norm). 1.5 Sys Deviation
632 ////////////////////////////////////////////////
634 fMinSepTPCEntrancePhi = 0.035;// 0.035(norm). 0.04 Sys Deviation
635 fMinSepTPCEntranceEta = 0.035;// 0.035(norm). 0.04 Sys Deviation
636 fShareQuality = .5;// max
637 fShareFraction = .05;// max
638 ////////////////////////////////////////////////
641 fMultLimits[0]=0, fMultLimits[1]=2, fMultLimits[2]=4, fMultLimits[3]=6, fMultLimits[4]=8, fMultLimits[5]=10;
642 fMultLimits[6]=12, fMultLimits[7]=14, fMultLimits[8]=16, fMultLimits[9]=18, fMultLimits[10]=20, fMultLimits[11]=150;
646 if(fPbPbcase) {// PbPb
647 fMultLimit=kMultLimitPbPb;
652 fNormQcutLow[0] = 0.15;//1.06 (test also at 0.15)
653 fNormQcutHigh[0] = 0.175;//1.1 (test also at 0.175)
654 fNormQcutLow[1] = 1.34;//1.34
655 fNormQcutHigh[1] = 1.4;//1.4
656 fNormQcutLow[2] = 1.1;//1.1
657 fNormQcutHigh[2] = 1.4;//1.4
660 fMultLimit=kMultLimitpp;
665 fNormQcutLow[0] = 1.0;
666 fNormQcutHigh[0] = 1.5;
667 fNormQcutLow[1] = 1.0;
668 fNormQcutHigh[1] = 1.5;
669 fNormQcutLow[2] = 1.0;
670 fNormQcutHigh[2] = 1.5;
673 fQLowerCut = 0.005;// was 0.002
676 // 4x1 (Kt: 0-0.2, 0.2-0.4, 0.4-0.6, 0.6-1.0)
677 //fKstepT[0] = 0.2; fKstepT[1] = 0.2; fKstepT[2] = 0.2; fKstepT[3] = 0.4;
678 //fKstepY[0] = 1.6;// -0.8 to +0.8
679 //fKmeanT[0] = 0.1; fKmeanT[1] = 0.3; fKmeanT[2] = 0.5; fKmeanT[3] = 0.8;
680 //fKmeanY[0] = 0;// central y
681 //fKmiddleT[0] = 0.1; fKmiddleT[1] = 0.3; fKmiddleT[2] = 0.5; fKmiddleT[3] = 0.8;
683 // 3x1 (Kt: 0-0.3, 0.3-0.45, 0.45-1.0)
684 fKstepT[0] = 0.3; fKstepT[1] = 0.15; fKstepT[2] = 0.55;
685 fKstepY[0] = 1.6;// -0.8 to +0.8
686 fKmeanT[0] = 0.241; fKmeanT[1] = 0.369; fKmeanT[2] = 0.573;
687 fKmeanY[0] = 0;// central y
688 fKmiddleT[0] = 0.15; fKmiddleT[1] = 0.375; fKmiddleT[2] = 0.725;
690 // 2x1 (Kt: 0-0.4, 0.4-1.0)
691 //fKstepT[0] = 0.4; fKstepT[1] = 0.6;
692 //fKstepY[0] = 1.6;// -0.8 to +0.8
693 //fKmeanT[0] = 0.255; fKmeanT[1] = 0.505;
694 //fKmiddleT[0] = 0.2; fKmiddleT[1] = 0.7;
695 //fKmeanY[0] = 0;// central y
699 //fKstepY[0] = 1.6;// -0.8 to +0.8
700 //fKmeanT[0] = 0.306;
701 //fKmiddleT[0] = 0.5;
702 //fKmeanY[0] = 0;// central y
705 fQupperBoundWeights = 0.2;
707 fQstep = fQupperBound/Float_t(kQbins);
708 fQstepWeights = fQupperBoundWeights/Float_t(kQbinsWeights);
709 for(Int_t i=0; i<kQbinsWeights; i++) {fQmean[i]=(i+0.5)*fQstepWeights;}
716 fEC = new AliChaoticityEventCollection **[fZvertexBins];
717 for(UShort_t i=0; i<fZvertexBins; i++){
719 fEC[i] = new AliChaoticityEventCollection *[fMbins];
721 for(UShort_t j=0; j<fMbins; j++){
723 fEC[i][j] = new AliChaoticityEventCollection(fEventsToMix+1, fMultLimit, kPairLimit, fMCcase);
728 for(Int_t i=0; i<fMultLimit; i++) fDefaultsCharMult[i]='0';
729 for(Int_t i=0; i<kPairLimit; i++) fDefaultsCharSE[i]='0';
730 for(Int_t i=0; i<2*kPairLimit; i++) fDefaultsCharME[i]='0';
731 for(Int_t i=0; i<fMultLimit; i++) fDefaultsInt[i]=-1;
732 for(Int_t i=0; i<fMultLimit; i++) fPairLocationSE[i] = new TArrayI(fMultLimit,fDefaultsInt);
733 for(Int_t i=0; i<fMultLimit; i++) fPairLocationME[i] = new TArrayI(fMultLimit,fDefaultsInt);
734 for(Int_t i=0; i<kPairLimit; i++) fTripletSkip1[i] = new TArrayC(fMultLimit,fDefaultsCharSE);
735 for(Int_t i=0; i<2*kPairLimit; i++) fTripletSkip2[i] = new TArrayC(fMultLimit,fDefaultsCharME);
738 // Normalization utilities
739 for(Int_t i=0; i<fMultLimit; i++) fOtherPairLocation1[0][i] = new TArrayI(fMultLimit,fDefaultsInt);
740 for(Int_t i=0; i<fMultLimit; i++) fOtherPairLocation1[1][i] = new TArrayI(fMultLimit,fDefaultsInt);
741 for(Int_t i=0; i<fMultLimit; i++) fOtherPairLocation2[0][i] = new TArrayI(fMultLimit,fDefaultsInt);
742 for(Int_t i=0; i<fMultLimit; i++) fOtherPairLocation2[1][i] = new TArrayI(fMultLimit,fDefaultsInt);
743 for(Int_t i=0; i<fMultLimit; i++) fNormPairSwitch[0][i] = new TArrayC(fMultLimit,fDefaultsCharMult);
744 for(Int_t i=0; i<fMultLimit; i++) fNormPairSwitch[1][i] = new TArrayC(fMultLimit,fDefaultsCharMult);
745 for(Int_t i=0; i<fMultLimit; i++) fNormPairSwitch[2][i] = new TArrayC(fMultLimit,fDefaultsCharMult);
747 // Track Merging/Splitting utilities
748 for(Int_t i=0; i<fMultLimit; i++) fPairSplitCut[0][i] = new TArrayC(fMultLimit,fDefaultsCharMult);// P11
749 for(Int_t i=0; i<fMultLimit; i++) fPairSplitCut[1][i] = new TArrayC(fMultLimit,fDefaultsCharMult);// P12
750 for(Int_t i=0; i<fMultLimit; i++) fPairSplitCut[2][i] = new TArrayC(fMultLimit,fDefaultsCharMult);// P13
751 for(Int_t i=0; i<fMultLimit; i++) fPairSplitCut[3][i] = new TArrayC(fMultLimit,fDefaultsCharMult);// P23
754 fNormPairs[0] = new AliChaoticityNormPairStruct[kNormPairLimit];
755 fNormPairs[1] = new AliChaoticityNormPairStruct[kNormPairLimit];
758 fTempStruct = new AliChaoticityTrackStruct[fMultLimit];
761 fTrueMassP=0.93827, fTrueMassPi=0.13957, fTrueMassK=0.493677, fTrueMassKs=0.497614, fTrueMassLam=1.11568;
764 // Initialize Weight Array
765 fNormWeight = new Float_t******[fMbins];// fMbin
766 fNormWeightErr = new Float_t******[fMbins];// fMbin
767 for(Int_t i=0; i<fMbins; i++){// Mbin iterator
768 fNormWeight[i] = new Float_t*****[kEDbins];// create ED bins
769 fNormWeightErr[i] = new Float_t*****[kEDbins];// create ED bins
771 for(Int_t j=0; j<kEDbins; j++){// ED iterator
772 fNormWeight[i][j] = new Float_t****[kKbinsT];// create Kt bins
773 fNormWeightErr[i][j] = new Float_t****[kKbinsT];// create Kt bins
775 for(Int_t k=0; k<kKbinsT; k++){// Kt iterator
776 fNormWeight[i][j][k] = new Float_t***[kKbinsY];// create Ky bins
777 fNormWeightErr[i][j][k] = new Float_t***[kKbinsY];// create Ky bins
779 for(Int_t l=0; l<kKbinsY; l++){// Ky iterator
780 fNormWeight[i][j][k][l] = new Float_t**[kQbinsWeights];// create Qout bins
781 fNormWeightErr[i][j][k][l] = new Float_t**[kQbinsWeights];// create Qout bins
783 for(Int_t m=0; m<kQbinsWeights; m++){// Qout iterator
784 fNormWeight[i][j][k][l][m] = new Float_t*[kQbinsWeights];// create Qside bins
785 fNormWeightErr[i][j][k][l][m] = new Float_t*[kQbinsWeights];// create Qside bins
787 for(Int_t n=0; n<kQbinsWeights; n++){// Qside iterator
788 fNormWeight[i][j][k][l][m][n] = new Float_t[kQbinsWeights];// create Qlong bins
789 fNormWeightErr[i][j][k][l][m][n] = new Float_t[kQbinsWeights];// create Qlong bins
799 // Set weights, Coulomb corrections, and Momentum resolution corrections manually if not on LEGO
800 if(!fLEGO && !fTabulatePairs) {
801 SetWeightArrays(fLEGO);// Set Weight Array
802 SetFSICorrelations(fLEGO);// Read in 2-particle and 3-particle FSI correlations
803 if(!fMCcase) SetMomResCorrections(fLEGO);// Read Momentum resolution file
807 //________________________________________________________________________
808 void AliChaoticity::UserCreateOutputObjects()
813 ParInit();// Initialize my settings
816 fOutputList = new TList();
817 fOutputList->SetOwner();
819 TH3F *fVertexDist = new TH3F("fVertexDist","Vertex Distribution",20,-1,1, 20,-1,1, 600,-30,30);
820 fVertexDist->GetXaxis()->SetTitle("X Vertex (cm)");
821 fVertexDist->GetYaxis()->SetTitle("Y Vertex (cm)");
822 fVertexDist->GetZaxis()->SetTitle("Z Vertex (cm)");
823 fOutputList->Add(fVertexDist);
826 TH2F *fDCAxyDistPlus = new TH2F("fDCAxyDistPlus","DCA distribution",300,0,3., 50,0,5);
827 fOutputList->Add(fDCAxyDistPlus);
828 TH2F *fDCAzDistPlus = new TH2F("fDCAzDistPlus","DCA distribution",300,0,3., 50,0,5);
829 fOutputList->Add(fDCAzDistPlus);
830 TH2F *fDCAxyDistMinus = new TH2F("fDCAxyDistMinus","DCA distribution",300,0,3., 50,0,5);
831 fOutputList->Add(fDCAxyDistMinus);
832 TH2F *fDCAzDistMinus = new TH2F("fDCAzDistMinus","DCA distribution",300,0,3., 50,0,5);
833 fOutputList->Add(fDCAzDistMinus);
836 TH1F *fEvents1 = new TH1F("fEvents1","Events vs. fMbin",fMbins,.5,fMbins+.5);
837 fOutputList->Add(fEvents1);
838 TH1F *fEvents2 = new TH1F("fEvents2","Events vs. fMbin",fMbins,.5,fMbins+.5);
839 fOutputList->Add(fEvents2);
841 TH1F *fMultDist1 = new TH1F("fMultDist1","Multiplicity Distribution",fMultLimit,-.5,fMultLimit-.5);
842 fMultDist1->GetXaxis()->SetTitle("Multiplicity");
843 fOutputList->Add(fMultDist1);
845 TH1F *fMultDist2 = new TH1F("fMultDist2","Multiplicity Distribution",fMultLimit,-.5,fMultLimit-.5);
846 fMultDist2->GetXaxis()->SetTitle("Multiplicity");
847 fOutputList->Add(fMultDist2);
849 TH1F *fMultDist3 = new TH1F("fMultDist3","Multiplicity Distribution",fMultLimit,-.5,fMultLimit-.5);
850 fMultDist3->GetXaxis()->SetTitle("Multiplicity");
851 fOutputList->Add(fMultDist3);
853 TH3F *fPtEtaDist = new TH3F("fPtEtaDist","fPtEtaDist",2,-1.1,1.1, 300,0,3., 28,-1.4,1.4);
854 fOutputList->Add(fPtEtaDist);
856 TH3F *fPhiPtDist = new TH3F("fPhiPtDist","fPhiPtDist",2,-1.1,1.1, 120,0,2*PI, 300,0,3.);
857 fOutputList->Add(fPhiPtDist);
859 TH3F *fTOFResponse = new TH3F("fTOFResponse","TOF relative time",20,0,100, 200,0,2, 4000,-20000,20000);
860 fOutputList->Add(fTOFResponse);
861 TH3F *fTPCResponse = new TH3F("fTPCResponse","TPCsignal",20,0,100, 200,0,2, 1000,0,1000);
862 fOutputList->Add(fTPCResponse);
864 TH1F *fRejectedPairs = new TH1F("fRejectedPairs","",200,0,2);
865 fOutputList->Add(fRejectedPairs);
866 TH1I *fRejectedEvents = new TH1I("fRejectedEvents","",fMbins,0.5,fMbins+.5);
867 fOutputList->Add(fRejectedEvents);
869 TH3F *fPairsDetaDPhiNum = new TH3F("fPairsDetaDPhiNum","",10,-.5,9.5, 200,-0.2,0.2, 600,-0.3,0.3);
870 if(fMCcase) fOutputList->Add(fPairsDetaDPhiNum);
871 TH3F *fPairsDetaDPhiDen = new TH3F("fPairsDetaDPhiDen","",10,-.5,9.5, 200,-0.2,0.2, 600,-0.3,0.3);
872 if(fMCcase) fOutputList->Add(fPairsDetaDPhiDen);
874 TH2D *fResonanceOSPairs = new TH2D("fResonanceOSPairs","",fMbins,.5,fMbins+.5, 1000,0,2);
875 if(fMCcase) fOutputList->Add(fResonanceOSPairs);
876 TH2D *fAllOSPairs = new TH2D("fAllOSPairs","",fMbins,.5,fMbins+.5, 1000,0,2);
877 if(fMCcase) fOutputList->Add(fAllOSPairs);
879 TProfile *fAvgMult = new TProfile("fAvgMult","",fMbins,.5,fMbins+.5, 0,1500,"");
880 fOutputList->Add(fAvgMult);
882 TH3D *fTPNRejects = new TH3D("fTPNRejects","",kQbins,0,fQupperBound, kQbins,0,fQupperBound, kQbins,0,fQupperBound);
883 fOutputList->Add(fTPNRejects);
885 TH2D *fKt3Dist = new TH2D("fKt3Dist","",fMbins,.5,fMbins+.5, 10,0,1);
886 fOutputList->Add(fKt3Dist);
890 if(fPdensityExplicitLoop || fPdensityPairCut){
892 for(Int_t mb=0; mb<fMbins; mb++){
893 if((mb < fCentBinLowLimit) || (mb > fCentBinHighLimit)) continue;
895 for(Int_t edB=0; edB<kEDbins; edB++){
896 for(Int_t c1=0; c1<2; c1++){
897 for(Int_t c2=0; c2<2; c2++){
898 for(Int_t sc=0; sc<kSCLimit2; sc++){
899 for(Int_t term=0; term<2; term++){
901 TString *nameEx2 = new TString("Explicit2_Charge1_");
903 nameEx2->Append("_Charge2_");
905 nameEx2->Append("_SC_");
907 nameEx2->Append("_M_");
909 nameEx2->Append("_ED_");
911 nameEx2->Append("_Term_");
914 if(sc==0 || sc==3 || sc==5){
915 if( (c1+c2)==1 ) {if(c1!=0) continue;}// skip degenerate histogram
918 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fExplicit2 = new TH2D(nameEx2->Data(),"Two Particle Distribution",20,0,1, 400,0,2);
919 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fExplicit2);
920 TString *nameEx2QW=new TString(nameEx2->Data());
921 nameEx2QW->Append("_QW");
922 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fExplicit2QW = new TH2D(nameEx2QW->Data(),"Two Particle Distribution",20,0,1, 400,0,2);
923 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fExplicit2QW);
924 // Momentum resolution histos
925 if(fMCcase && sc==0){
926 TString *nameIdeal = new TString(nameEx2->Data());
927 nameIdeal->Append("_Ideal");
928 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fIdeal = new TH2D(nameIdeal->Data(),"Two Particle Distribution",kDENtypes,-0.5,kDENtypes-0.5, kQbinsWeights,0,fQupperBoundWeights);
929 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fIdeal);
930 TString *nameSmeared = new TString(nameEx2->Data());
931 nameSmeared->Append("_Smeared");
932 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fSmeared = new TH2D(nameSmeared->Data(),"Two Particle Distribution",kDENtypes,-0.5,kDENtypes-0.5, kQbinsWeights,0,fQupperBoundWeights);
933 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fSmeared);
937 TString *nameEx2OSLB1 = new TString(nameEx2->Data());
938 nameEx2OSLB1->Append("_osl_b1");
939 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[0].fExplicit2OSL = new TH3D(nameEx2OSLB1->Data(),"Two Particle Distribution",50,0,.2, 50,0,.2, 50,0,.2);
940 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[0].fExplicit2OSL);
941 nameEx2OSLB1->Append("_QW");
942 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[0].fExplicit2OSLQW = new TH3D(nameEx2OSLB1->Data(),"Two Particle Distribution",50,0,.2, 50,0,.2, 50,0,.2);
943 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[0].fExplicit2OSLQW);
945 TString *nameEx2OSLB2 = new TString(nameEx2->Data());
946 nameEx2OSLB2->Append("_osl_b2");
947 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[1].fExplicit2OSL = new TH3D(nameEx2OSLB2->Data(),"Two Particle Distribution",50,0,.2, 50,0,.2, 50,0,.2);
948 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[1].fExplicit2OSL);
949 nameEx2OSLB2->Append("_QW");
950 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[1].fExplicit2OSLQW = new TH3D(nameEx2OSLB2->Data(),"Two Particle Distribution",50,0,.2, 50,0,.2, 50,0,.2);
951 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].OSL_ktbin[1].fExplicit2OSLQW);
958 // skip 3-particle if Tabulate6DPairs is true
959 if(fTabulatePairs) continue;
961 for(Int_t c3=0; c3<2; c3++){
962 for(Int_t sc=0; sc<kSCLimit3; sc++){
963 for(Int_t term=0; term<5; term++){
964 TString *nameEx3 = new TString("Explicit3_Charge1_");
966 nameEx3->Append("_Charge2_");
968 nameEx3->Append("_Charge3_");
970 nameEx3->Append("_SC_");
972 nameEx3->Append("_M_");
974 nameEx3->Append("_ED_");
976 nameEx3->Append("_Term_");
979 TString *namePC3 = new TString("PairCut3_Charge1_");
981 namePC3->Append("_Charge2_");
983 namePC3->Append("_Charge3_");
985 namePC3->Append("_SC_");
987 namePC3->Append("_M_");
989 namePC3->Append("_ED_");
991 namePC3->Append("_Term_");
994 ///////////////////////////////////////
995 // skip degenerate histograms
996 if(sc==0 || sc==6 || sc==9){// Identical species
997 if( (c1+c2+c3)==1) {if(c3!=1) continue;}
998 if( (c1+c2+c3)==2) {if(c1!=0) continue;}
1000 if( (c1+c2)==1) {if(c1!=0) continue;}
1001 }else {}// do nothing for pi-k-p case
1003 /////////////////////////////////////////
1005 if(fPdensityExplicitLoop){
1006 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fExplicit3 = new TH1D(nameEx3->Data(),"Three Particle Distribution",200,0,2);
1007 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fExplicit3);
1009 nameEx3->Append("_Norm");
1010 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fNormEx3 = new TH1D(nameEx3->Data(),"Explicit_3 Norm",1,-0.5,0.5);
1011 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fNormEx3);
1013 if(fPdensityPairCut){
1014 TString *nameNorm=new TString(namePC3->Data());
1015 nameNorm->Append("_Norm");
1016 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fNorm3 = new TH1D(nameNorm->Data(),"Norm",1,-0.5,0.5);
1017 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fNorm3);
1020 TString *name3DQ=new TString(namePC3->Data());
1021 name3DQ->Append("_3D");
1022 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fTerms3 = new TH3D(name3DQ->Data(),"", kQbins,0,fQupperBound, kQbins,0,fQupperBound, kQbins,0,fQupperBound);
1023 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fTerms3);
1025 if(c1==c2 && c1==c3 && sc==0 && fMCcase==kFALSE){
1026 TString *name4vectCC3=new TString(namePC3->Data());
1027 name4vectCC3->Append("_4VectProdCC3");
1028 // use 3.75e6 MeV^4 as the resolution on QprodSum
1029 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProdTermsCC3 = new TH2D(name4vectCC3->Data(),"",200,0,0.0003, 200,0,0.0003);
1030 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProdTermsCC3);
1032 TString *name4vectCC2=new TString(namePC3->Data());
1033 name4vectCC2->Append("_4VectProdCC2");
1034 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProdTermsCC2 = new TH2D(name4vectCC2->Data(),"",200,0,0.0003, 200,0,0.0003);
1035 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProdTermsCC2);
1038 TString *name4vectCC0=new TString(namePC3->Data());
1039 name4vectCC0->Append("_4VectProdCC0");
1040 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProdTermsCC0 = new TH2D(name4vectCC0->Data(),"",200,0,0.0003, 200,0,0.0003);
1041 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].f4VectProdTermsCC0);
1044 if(sc==0 && fMCcase==kTRUE){
1045 TString *name3DMomResIdeal=new TString(namePC3->Data());
1046 name3DMomResIdeal->Append("_Ideal");
1047 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fIdeal = new TH3D(name3DMomResIdeal->Data(),"", kQbins,0,fQupperBound, kQbins,0,fQupperBound, kQbins,0,fQupperBound);
1048 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fIdeal);
1049 TString *name3DMomResSmeared=new TString(namePC3->Data());
1050 name3DMomResSmeared->Append("_Smeared");
1051 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fSmeared = new TH3D(name3DMomResSmeared->Data(),"", kQbins,0,fQupperBound, kQbins,0,fQupperBound, kQbins,0,fQupperBound);
1052 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fSmeared);
1056 if(c1==c2 && c1==c3 && term==4 && sc==0 && fMCcase==kFALSE){
1057 for(Int_t dt=0; dt<kDENtypes; dt++){
1058 TString *nameDenType=new TString("PairCut3_Charge1_");
1060 nameDenType->Append("_Charge2_");
1062 nameDenType->Append("_Charge3_");
1064 nameDenType->Append("_SC_");
1066 nameDenType->Append("_M_");
1068 nameDenType->Append("_ED_");
1069 *nameDenType += edB;
1070 nameDenType->Append("_TPN_");
1073 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].DT[dt].fTwoPartNorm = new TH3D(nameDenType->Data(),"",kQbins,0,fQupperBound, kQbins,0,fQupperBound, kQbins,0,fQupperBound);
1074 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].DT[dt].fTwoPartNorm);
1075 // neglect errors for TPN
1076 //nameDenType->Append("_Err");
1077 //Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].DT[dt].fTwoPartNormErr = new TH3D(nameDenType->Data(),"",kQbins,0,fQupperBound, kQbins,0,fQupperBound, kQbins,0,fQupperBound);
1078 //fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].DT[dt].fTwoPartNormErr);
1080 TString *name4vectTPN=new TString(nameDenType->Data());
1081 name4vectTPN->Append("_4VectProd");
1082 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].DT[dt].f4VectProdTwoPartNorm = new TH2D(name4vectTPN->Data(),"",200,0,0.0003, 200,0,0.0003);
1083 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].DT[dt].f4VectProdTwoPartNorm);
1088 }// c and sc exclusion
1102 for(Int_t tKbin=0; tKbin<kKbinsT; tKbin++){
1103 for(Int_t yKbin=0; yKbin<kKbinsY; yKbin++){
1104 for(Int_t mb=0; mb<fMbins; mb++){
1105 for(Int_t edB=0; edB<kEDbins; edB++){
1107 TString *nameNum = new TString("TwoPart_num_Kt_");
1109 nameNum->Append("_Ky_");
1111 nameNum->Append("_M_");
1113 nameNum->Append("_ED_");
1116 TString *nameDen = new TString("TwoPart_den_Kt_");
1118 nameDen->Append("_Ky_");
1120 nameDen->Append("_M_");
1122 nameDen->Append("_ED_");
1126 KT[tKbin].KY[yKbin].MB[mb].EDB[edB].TwoPT[0].fExplicit2ThreeD = new TH3I(nameNum->Data(),"", kQbinsWeights,0,fQupperBoundWeights, kQbinsWeights,0,fQupperBoundWeights, kQbinsWeights,0,fQupperBoundWeights);
1127 fOutputList->Add(KT[tKbin].KY[yKbin].MB[mb].EDB[edB].TwoPT[0].fExplicit2ThreeD);
1129 KT[tKbin].KY[yKbin].MB[mb].EDB[edB].TwoPT[1].fExplicit2ThreeD = new TH3I(nameDen->Data(),"", kQbinsWeights,0,fQupperBoundWeights, kQbinsWeights,0,fQupperBoundWeights, kQbinsWeights,0,fQupperBoundWeights);
1130 fOutputList->Add(KT[tKbin].KY[yKbin].MB[mb].EDB[edB].TwoPT[1].fExplicit2ThreeD);
1139 TProfile *fQsmearMean = new TProfile("fQsmearMean","",2,0.5,2.5, -0.2,0.2,"");
1140 fOutputList->Add(fQsmearMean);
1141 TProfile *fQsmearSq = new TProfile("fQsmearSq","",2,0.5,2.5, -2,2,"");
1142 fOutputList->Add(fQsmearSq);
1143 TH1D *fQDist = new TH1D("fQDist","",200,-.2,.2);
1144 fOutputList->Add(fQDist);
1147 ////////////////////////////////////
1148 ///////////////////////////////////
1150 PostData(1, fOutputList);
1153 //________________________________________________________________________
1154 void AliChaoticity::Exec(Option_t *)
1157 // Called for each event
1158 //cout<<"=========== Event # "<<fEventCounter+1<<" ==========="<<endl;
1161 if(!fAODcase) {cout<<"ESDs not supported"<<endl; return;}
1163 fAOD = dynamic_cast<AliAODEvent*> (InputEvent());
1164 if (!fAOD) {Printf("ERROR: fAOD not available"); return;}
1168 if(fAOD->GetRunNumber() >= 136851 && fAOD->GetRunNumber() <= 139517){// 10h data
1169 Bool_t isSelected1 = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kMB);
1170 if(!isSelected1 && !fMCcase) {/*cout<<"Event Rejected"<<endl;*/ return;}
1171 }else if(fAOD->GetRunNumber() >= 167693 && fAOD->GetRunNumber() <= 170593){// 11h data
1172 Bool_t isSelected1 = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kCentral);
1173 Bool_t isSelected2 = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kSemiCentral);
1174 if(!isSelected1 && !isSelected2 && !fMCcase) {/*cout<<"Event Rejected"<<endl;*/ return;}
1175 }else {/*cout<<"Event Rejected"<<endl;*/ return;}
1177 ///////////////////////////////////////////////////////////
1178 const AliAODVertex *primaryVertexAOD;
1179 AliCentrality *centrality;// for AODs and ESDs
1182 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
1183 AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
1184 fPIDResponse = inputHandler->GetPIDResponse();
1187 TClonesArray *mcArray = 0x0;
1190 mcArray = (TClonesArray*)fAOD->FindListObject(AliAODMCParticle::StdBranchName());
1191 if(!mcArray || mcArray->GetEntriesFast() >= 110000){
1192 cout<<"No MC particle branch found or Array too large!!"<<endl;
1193 cout<<mcArray->GetEntriesFast()<<endl;
1201 Int_t positiveTracks=0, negativeTracks=0;
1202 Int_t myTracks=0, pionCount=0, kaonCount=0, protonCount=0;
1204 Double_t vertex[3]={0};
1206 Double_t zstep=2*10/Double_t(fZvertexBins), zstart=-10.;
1207 /////////////////////////////////////////////////
1210 Float_t centralityPercentile=0;
1211 Float_t cStep=5.0, cStart=0;
1214 if(fAODcase){// AOD case
1217 centrality = fAOD->GetCentrality();
1218 centralityPercentile = centrality->GetCentralityPercentile("V0M");
1219 if(centralityPercentile == 0) {cout<<"Centrality = 0, skipping event"<<endl; return;}
1220 if((centralityPercentile < 5*fCentBinLowLimit) || (centralityPercentile>= 5*(fCentBinHighLimit+1))) {/*cout<<"Centrality out of Range. Skipping Event"<<endl;*/ return;}
1221 cout<<"Centrality % = "<<centralityPercentile<<endl;
1227 ////////////////////////////////
1229 ((TH1F*)fOutputList->FindObject("fMultDist1"))->Fill(fAOD->GetNumberOfTracks());
1230 primaryVertexAOD = fAOD->GetPrimaryVertex();
1231 vertex[0]=primaryVertexAOD->GetX(); vertex[1]=primaryVertexAOD->GetY(); vertex[2]=primaryVertexAOD->GetZ();
1233 if(fabs(vertex[2]) > 10) {cout<<"Zvertex Out of Range. Skip Event"<<endl; return;} // Z-Vertex Cut
1234 ((TH3F*)fOutputList->FindObject("fVertexDist"))->Fill(vertex[0], vertex[1], vertex[2]);
1236 if(fAOD->IsPileupFromSPD()) {cout<<"PileUpEvent. Skip Event"<<endl; return;} // Reject Pile-up events
1237 if(primaryVertexAOD->GetNContributors() < 1) {cout<<"Bad Vertex. Skip Event"<<endl; return;}
1239 ((TH1F*)fOutputList->FindObject("fMultDist2"))->Fill(fAOD->GetNumberOfTracks());
1241 fBfield = fAOD->GetMagneticField();
1243 for(Int_t i=0; i<fZvertexBins; i++){
1244 if( (vertex[2] >= zstart+i*zstep) && (vertex[2] < zstart+(i+1)*zstep) ){
1252 /////////////////////////////
1253 // Create Shuffled index list
1254 Int_t randomIndex[fAOD->GetNumberOfTracks()];
1255 for (Int_t i = 0; i < fAOD->GetNumberOfTracks(); i++) randomIndex[i]=i;
1256 Shuffle(randomIndex,0,fAOD->GetNumberOfTracks()-1);
1257 /////////////////////////////
1260 for (Int_t i = 0; i < fAOD->GetNumberOfTracks(); i++) {
1261 AliAODTrack* aodtrack = fAOD->GetTrack(randomIndex[i]);
1262 if (!aodtrack) continue;
1263 if(myTracks >= fMultLimit) {cout<<"More tracks than Track Limit"<<endl; return;}
1265 status=aodtrack->GetStatus();
1267 if((Bool_t)(((1<<7) & aodtrack->GetFilterMap()) == 0)) continue;// AOD filterBit cut
1268 // 1<<5 is for "standard cuts with tight dca cut"
1269 // 1<<7 is for TPC only tracking
1270 if(aodtrack->Pt() < 0.16) continue;
1271 if(fabs(aodtrack->Eta()) > 0.8) continue;
1274 Bool_t goodMomentum = aodtrack->GetPxPyPz( fTempStruct[myTracks].fP);
1275 if(!goodMomentum) continue;
1276 aodtrack->GetXYZ( fTempStruct[myTracks].fX);
1281 dca2[0] = sqrt( pow(fTempStruct[myTracks].fX[0] - vertex[0],2) + pow(fTempStruct[myTracks].fX[1] - vertex[1],2));
1282 dca2[1] = sqrt( pow(fTempStruct[myTracks].fX[2] - vertex[2],2));
1283 dca3d = sqrt( pow(dca2[0],2) + pow(dca2[1],2));
1285 fTempStruct[myTracks].fStatus = status;
1286 fTempStruct[myTracks].fFiltermap = aodtrack->GetFilterMap();
1287 fTempStruct[myTracks].fId = aodtrack->GetID();
1288 fTempStruct[myTracks].fLabel = aodtrack->GetLabel();
1289 fTempStruct[myTracks].fPhi = atan2(fTempStruct[myTracks].fP[1], fTempStruct[myTracks].fP[0]);
1290 if(fTempStruct[myTracks].fPhi < 0) fTempStruct[myTracks].fPhi += 2*PI;
1291 fTempStruct[myTracks].fPt = sqrt(pow(fTempStruct[myTracks].fP[0],2) + pow(fTempStruct[myTracks].fP[1],2));
1292 fTempStruct[myTracks].fMom = sqrt( pow(fTempStruct[myTracks].fPt,2) + pow(fTempStruct[myTracks].fP[2],2) );
1293 fTempStruct[myTracks].fEta = aodtrack->Eta();
1294 fTempStruct[myTracks].fCharge = aodtrack->Charge();
1295 fTempStruct[myTracks].fDCAXY = dca2[0];
1296 fTempStruct[myTracks].fDCAZ = dca2[1];
1297 fTempStruct[myTracks].fDCA = dca3d;
1298 fTempStruct[myTracks].fClusterMap = aodtrack->GetTPCClusterMap();
1299 fTempStruct[myTracks].fSharedMap = aodtrack->GetTPCSharedMap();
1303 if(fTempStruct[myTracks].fMom > 0.9999) continue;// upper P bound
1304 if(fTempStruct[myTracks].fPt > 0.9999) continue;// upper P bound
1305 if(fTempStruct[myTracks].fP[2] > 0.9999) continue;// upper P bound
1307 if(fTempStruct[myTracks].fCharge==+1) {
1308 ((TH2F*)fOutputList->FindObject("fDCAxyDistPlus"))->Fill(fTempStruct[myTracks].fPt, dca2[0]);
1309 ((TH2F*)fOutputList->FindObject("fDCAzDistPlus"))->Fill(fTempStruct[myTracks].fPt, dca2[1]);
1311 ((TH2F*)fOutputList->FindObject("fDCAxyDistMinus"))->Fill(fTempStruct[myTracks].fPt, dca2[0]);
1312 ((TH2F*)fOutputList->FindObject("fDCAzDistMinus"))->Fill(fTempStruct[myTracks].fPt, dca2[1]);
1315 ((TH3F*)fOutputList->FindObject("fPhiPtDist"))->Fill(aodtrack->Charge(), aodtrack->Phi(), aodtrack->Pt());
1316 ((TH3F*)fOutputList->FindObject("fPtEtaDist"))->Fill(aodtrack->Charge(), aodtrack->Pt(), aodtrack->Eta());
1319 // nSimga PID workaround
1320 fTempStruct[myTracks].fElectron = kFALSE;
1321 fTempStruct[myTracks].fPion = kFALSE;
1322 fTempStruct[myTracks].fKaon = kFALSE;
1323 fTempStruct[myTracks].fProton = kFALSE;
1325 Float_t nSigmaTPC[5];
1326 Float_t nSigmaTOF[5];
1327 nSigmaTPC[0]=10; nSigmaTPC[1]=10; nSigmaTPC[2]=10; nSigmaTPC[3]=10; nSigmaTPC[4]=10;
1328 nSigmaTOF[0]=10; nSigmaTOF[1]=10; nSigmaTOF[2]=10; nSigmaTOF[3]=10; nSigmaTOF[4]=10;
1329 fTempStruct[myTracks].fTOFhit = kFALSE;// default
1330 Float_t signalTPC=0, signalTOF=0;
1331 Double_t integratedTimesTOF[10]={0};
1332 for(Int_t j = 0; j < fAOD->GetNumberOfTracks(); j++) {
1333 AliAODTrack* aodTrack2 = fAOD->GetTrack(j);
1334 if (!aodTrack2) continue;
1335 if(aodtrack->GetID() != (-aodTrack2->GetID() - 1)) continue;// (-aodTrack2->GetID() - 1)
1337 UInt_t status2=aodTrack2->GetStatus();
1339 nSigmaTPC[0]=fabs(fPIDResponse->NumberOfSigmasTPC(aodTrack2,AliPID::kElectron));
1340 nSigmaTPC[1]=fabs(fPIDResponse->NumberOfSigmasTPC(aodTrack2,AliPID::kMuon));
1341 nSigmaTPC[2]=fabs(fPIDResponse->NumberOfSigmasTPC(aodTrack2,AliPID::kPion));
1342 nSigmaTPC[3]=fabs(fPIDResponse->NumberOfSigmasTPC(aodTrack2,AliPID::kKaon));
1343 nSigmaTPC[4]=fabs(fPIDResponse->NumberOfSigmasTPC(aodTrack2,AliPID::kProton));
1345 nSigmaTOF[0]=fabs(fPIDResponse->NumberOfSigmasTOF(aodTrack2,AliPID::kElectron));
1346 nSigmaTOF[1]=fabs(fPIDResponse->NumberOfSigmasTOF(aodTrack2,AliPID::kMuon));
1347 nSigmaTOF[2]=fabs(fPIDResponse->NumberOfSigmasTOF(aodTrack2,AliPID::kPion));
1348 nSigmaTOF[3]=fabs(fPIDResponse->NumberOfSigmasTOF(aodTrack2,AliPID::kKaon));
1349 nSigmaTOF[4]=fabs(fPIDResponse->NumberOfSigmasTOF(aodTrack2,AliPID::kProton));
1350 signalTPC = aodTrack2->GetTPCsignal();
1352 if( (status2&AliESDtrack::kTOFpid)!=0 && (status2&AliESDtrack::kTIME)!=0 && (status2&AliESDtrack::kTOFout)!=0 && (status2&AliESDtrack::kTOFmismatch)<=0){// good tof hit
1353 fTempStruct[myTracks].fTOFhit = kTRUE;
1354 signalTOF = aodTrack2->GetTOFsignal();
1355 aodTrack2->GetIntegratedTimes(integratedTimesTOF);
1356 }else fTempStruct[myTracks].fTOFhit = kFALSE;
1361 ((TH3F*)fOutputList->FindObject("fTPCResponse"))->Fill(centralityPercentile, fTempStruct[myTracks].fMom, signalTPC);
1362 if(fTempStruct[myTracks].fTOFhit) {
1363 ((TH3F*)fOutputList->FindObject("fTOFResponse"))->Fill(centralityPercentile, fTempStruct[myTracks].fMom, signalTOF - integratedTimesTOF[3]);
1367 // Use TOF if good hit and above threshold
1368 if(fTempStruct[myTracks].fTOFhit && fTempStruct[myTracks].fMom > fTPCTOFboundry){
1369 if(nSigmaTOF[0]<fSigmaCutTOF) fTempStruct[myTracks].fElectron = kTRUE;// Electron candidate
1370 if(nSigmaTOF[2]<fSigmaCutTOF) fTempStruct[myTracks].fPion = kTRUE;// Pion candidate
1371 if(nSigmaTOF[3]<fSigmaCutTOF) fTempStruct[myTracks].fKaon = kTRUE;// Kaon candidate
1372 if(nSigmaTOF[4]<fSigmaCutTOF) fTempStruct[myTracks].fProton = kTRUE;// Proton candidate
1373 }else {// TPC info instead
1374 if(nSigmaTPC[0]<fSigmaCutTPC) fTempStruct[myTracks].fElectron = kTRUE;// Electron candidate
1375 if(nSigmaTPC[2]<fSigmaCutTPC) fTempStruct[myTracks].fPion = kTRUE;// Pion candidate
1376 if(nSigmaTPC[3]<fSigmaCutTPC) fTempStruct[myTracks].fKaon = kTRUE;// Kaon candidate
1377 if(nSigmaTPC[4]<fSigmaCutTPC) fTempStruct[myTracks].fProton = kTRUE;// Proton candidate
1381 //////////////////////////////////////
1382 // Bayesian PIDs for TPC only tracking
1383 //const Double_t* PID = aodtrack->PID();
1384 //fTempStruct[myTracks].fElectron = kFALSE;
1385 //fTempStruct[myTracks].Pion = kFALSE;
1386 //fTempStruct[myTracks].Kaon = kFALSE;
1387 //fTempStruct[myTracks].Proton = kFALSE;
1390 //if(PID[2] > 0.2) fTempStruct[myTracks].Pion = kTRUE;// pions: 0.2 --> 0.5
1393 //if(PID[3] <= 0.5) fTempStruct[myTracks].Kaon = kFALSE;// kaons
1396 //if(PID[4] <= 0.5) fTempStruct[myTracks].Proton = kFALSE;// protons
1397 //////////////////////////////////////
1400 // Ensure there is only 1 candidate per track
1401 if(fTempStruct[myTracks].fElectron && fTempStruct[myTracks].fMom < 0.45) continue;// Remove electron band
1402 if(!fTempStruct[myTracks].fPion && !fTempStruct[myTracks].fKaon && !fTempStruct[myTracks].fProton) continue;
1403 if(fTempStruct[myTracks].fPion && fTempStruct[myTracks].fKaon) continue;
1404 if(fTempStruct[myTracks].fPion && fTempStruct[myTracks].fProton) continue;
1405 if(fTempStruct[myTracks].fKaon && fTempStruct[myTracks].fProton) continue;
1406 if(fTempStruct[myTracks].fPion && fTempStruct[myTracks].fKaon && fTempStruct[myTracks].fProton) continue;
1407 ////////////////////////
1408 if(fTempStruct[myTracks].fProton && fTempStruct[myTracks].fMom < 0.25) continue;//extra cut for protons
1410 if(!fTempStruct[myTracks].fPion) continue;// only pions
1415 if(fTempStruct[myTracks].fPion) {// pions
1416 fTempStruct[myTracks].fEaccepted = sqrt(pow(fTempStruct[myTracks].fMom,2) + pow(fTrueMassPi,2));
1417 fTempStruct[myTracks].fKey = 1;
1418 }else if(fTempStruct[myTracks].fKaon){// kaons
1419 fTempStruct[myTracks].fEaccepted = sqrt(pow(fTempStruct[myTracks].fMom,2) + pow(fTrueMassK,2));;
1420 fTempStruct[myTracks].fKey = 10;
1422 fTempStruct[myTracks].fEaccepted = sqrt(pow(fTempStruct[myTracks].fMom,2) + pow(fTrueMassP,2));;
1423 fTempStruct[myTracks].fKey = 100;
1428 if(aodtrack->Charge() > 0) positiveTracks++;
1429 else negativeTracks++;
1431 if(fTempStruct[myTracks].fPion) pionCount++;
1432 if(fTempStruct[myTracks].fKaon) kaonCount++;
1433 if(fTempStruct[myTracks].fProton) protonCount++;
1438 }else {// ESD tracks
1439 cout<<"ESDs not supported currently"<<endl;
1445 ((TH1F*)fOutputList->FindObject("fMultDist3"))->Fill(myTracks);
1449 //cout<<"There are "<<myTracks<<" myTracks"<<endl;
1450 //cout<<"pionCount = "<<pionCount<<" kaonCount = "<<kaonCount<<" protonCount = "<<protonCount<<endl;
1452 /////////////////////////////////////////
1453 // Pion Multiplicity Cut (To ensure all Correlation orders are present in each event)
1454 if(myTracks < 3) {cout<<"Less than 3 tracks. Skipping Event."<<endl; return;}
1455 /////////////////////////////////////////
1458 ////////////////////////////////
1459 ///////////////////////////////
1460 // Mbin determination
1462 // Mbin set to Pion Count Only for pp!!!!!!!
1465 for(Int_t i=0; i<kMultBinspp; i++){
1466 if( ( pionCount > fMultLimits[i]) && ( pionCount <= fMultLimits[i+1]) ) { fMbin=i; break;}
1467 // Mbin 0 has 1 pion
1470 for(Int_t i=0; i<kCentBins; i++){
1471 if( (centralityPercentile >= cStart+i*cStep) && (centralityPercentile < cStart+(i+1)*cStep) ){
1472 fMbin=i;// 0 = most central
1478 if(fMbin==-1) {cout<<"Bad Mbin+++++++++++++++++++++++++++++++++++++++++++++++++++"<<endl; return;}
1480 //////////////////////////////////////////////////
1481 fEDbin=0;// Extra Dimension bin (Kt, (Kt-Psi),....)
1482 //////////////////////////////////////////////////
1486 ((TH1F*)fOutputList->FindObject("fEvents1"))->Fill(fMbin+1);
1487 ((TProfile*)fOutputList->FindObject("fAvgMult"))->Fill(fMbin+1., pionCount);
1489 ////////////////////////////////////
1490 // Add event to buffer if > 0 tracks
1492 fEC[zbin][fMbin]->FIFOShift();
1493 (fEvt) = fEC[zbin][fMbin]->fEvtStr;
1494 (fEvt)->fNtracks = myTracks;
1495 (fEvt)->fFillStatus = 1;
1496 for(Int_t i=0; i<myTracks; i++) (fEvt)->fTracks[i] = fTempStruct[i];
1498 (fEvt)->fMCarraySize = mcArray->GetEntriesFast();
1499 for(Int_t i=0; i<mcArray->GetEntriesFast(); i++) {
1500 AliAODMCParticle *tempMCTrack = (AliAODMCParticle*)mcArray->At(i);
1501 (fEvt)->fMCtracks[i].fPx = tempMCTrack->Px();
1502 (fEvt)->fMCtracks[i].fPy = tempMCTrack->Py();
1503 (fEvt)->fMCtracks[i].fPz = tempMCTrack->Pz();
1504 (fEvt)->fMCtracks[i].fPtot = sqrt(pow(tempMCTrack->Px(),2)+pow(tempMCTrack->Py(),2)+pow(tempMCTrack->Pz(),2));
1511 Float_t qinv12=0, qinv13=0, qinv23=0;
1512 Int_t qinv12Bin=0, qinv13Bin=0, qinv23Bin=0;
1513 Float_t qout=0, qside=0, qlong=0;
1514 Float_t qoutMC=0, qsideMC=0, qlongMC=0;
1515 Float_t transK12=0, rapK12=0, transK3=0;
1516 Int_t transKbin=0, rapKbin=0;
1518 Int_t ch1=0, ch2=0, ch3=0;
1519 Short_t key1=0, key2=0, key3=0;
1520 Int_t bin1=0, bin2=0, bin3=0;
1521 Float_t pVect1[4]={0};
1522 Float_t pVect2[4]={0};
1523 Float_t pVect3[4]={0};
1524 Float_t pVect1MC[4]={0};
1525 Float_t pVect2MC[4]={0};
1526 Float_t pVect3MC[4]={0};
1527 Int_t index1=0, index2=0, index3=0;
1528 Float_t weight12=0, weight13=0, weight23=0;
1529 Float_t weight12Err=0, weight13Err=0, weight23Err=0;
1530 Float_t weight12CC=0, weight13CC=0, weight23CC=0;
1531 Float_t weightTotal=0;//, weightTotalErr=0;
1533 Float_t qinv12MC=0, qinv13MC=0, qinv23MC=0;
1534 AliAODMCParticle *mcParticle1=0x0;
1535 AliAODMCParticle *mcParticle2=0x0;
1538 if(fPdensityPairCut){
1539 ////////////////////
1540 Int_t pairCountSE=0, pairCountME=0;
1541 Int_t normPairCount[2]={0};
1542 Int_t numOtherPairs1[2][fMultLimit];
1543 Int_t numOtherPairs2[2][fMultLimit];
1544 Bool_t exitCode=kFALSE;
1545 Int_t tempNormFillCount[2][2][2][10][5];
1548 // reset to defaults
1549 for(Int_t i=0; i<fMultLimit; i++) {
1550 fPairLocationSE[i]->Set(fMultLimit,fDefaultsInt);
1551 fPairLocationME[i]->Set(fMultLimit,fDefaultsInt);
1553 // Normalization Utilities
1554 fOtherPairLocation1[0][i]->Set(fMultLimit,fDefaultsInt);
1555 fOtherPairLocation1[1][i]->Set(fMultLimit,fDefaultsInt);
1556 fOtherPairLocation2[0][i]->Set(fMultLimit,fDefaultsInt);
1557 fOtherPairLocation2[1][i]->Set(fMultLimit,fDefaultsInt);
1558 fNormPairSwitch[0][i]->Set(fMultLimit,fDefaultsCharMult);
1559 fNormPairSwitch[1][i]->Set(fMultLimit,fDefaultsCharMult);
1560 fNormPairSwitch[2][i]->Set(fMultLimit,fDefaultsCharMult);
1561 numOtherPairs1[0][i]=0;
1562 numOtherPairs1[1][i]=0;
1563 numOtherPairs2[0][i]=0;
1564 numOtherPairs2[1][i]=0;
1566 // Track Merging/Splitting Utilities
1567 fPairSplitCut[0][i]->Set(fMultLimit,fDefaultsCharMult);// P11
1568 fPairSplitCut[1][i]->Set(fMultLimit,fDefaultsCharMult);// P12
1569 fPairSplitCut[2][i]->Set(fMultLimit,fDefaultsCharMult);// P13
1570 fPairSplitCut[3][i]->Set(fMultLimit,fDefaultsCharMult);// P23
1573 // Reset the temp Normalization counters
1574 for(Int_t i=0; i<2; i++){// Charge1
1575 for(Int_t j=0; j<2; j++){// Charge2
1576 for(Int_t k=0; k<2; k++){// Charge3
1577 for(Int_t l=0; l<10; l++){// FillIndex (species Combination)
1578 for(Int_t m=0; m<5; m++){// Term (Cumulant term)
1579 tempNormFillCount[i][j][k][l][m] = 0;
1587 ///////////////////////////////////////////////////////
1588 // Start the pairing process
1592 for (Int_t i=0; i<myTracks; i++) {
1597 for (Int_t j=i+1; j<(fEvt+en2)->fNtracks; j++) {
1599 key1 = (fEvt)->fTracks[i].fKey;
1600 key2 = (fEvt+en2)->fTracks[j].fKey;
1601 Short_t fillIndex2 = FillIndex2part(key1+key2);
1602 Short_t qCutBin = SetQcutBin(fillIndex2);
1603 Short_t normBin = SetNormBin(fillIndex2);
1604 pVect1[0]=(fEvt)->fTracks[i].fEaccepted; pVect2[0]=(fEvt+en2)->fTracks[j].fEaccepted;
1605 pVect1[1]=(fEvt)->fTracks[i].fP[0]; pVect2[1]=(fEvt+en2)->fTracks[j].fP[0];
1606 pVect1[2]=(fEvt)->fTracks[i].fP[1]; pVect2[2]=(fEvt+en2)->fTracks[j].fP[1];
1607 pVect1[3]=(fEvt)->fTracks[i].fP[2]; pVect2[3]=(fEvt+en2)->fTracks[j].fP[2];
1610 qinv12 = GetQinv(fillIndex2, pVect1, pVect2);
1611 GetQosl(pVect1, pVect2, qout, qside, qlong);
1612 transK12 = sqrt(pow(pVect1[1]+pVect2[1],2) + pow(pVect1[2]+pVect2[2],2))/2.;
1614 if(qinv12 < fQLowerCut) continue;// remove unwanted low-q pairs (also a type of track splitting/merging cut)
1616 ///////////////////////////////
1617 ch1 = Int_t(((fEvt)->fTracks[i].fCharge + 1)/2.);
1618 ch2 = Int_t(((fEvt+en2)->fTracks[j].fCharge + 1)/2.);
1619 SetFillBins2(fillIndex2, key1, key2, ch1, ch2, bin1, bin2);
1621 if(fMCcase && ch1==ch2 && fMbin==0){
1622 for(Int_t rstep=0; rstep<10; rstep++){
1623 Float_t coeff = (rstep)*0.2*(0.18/1.2);
1624 // propagate through B field to r=1.2m
1625 Float_t phi1 = (fEvt)->fTracks[i].fPhi - asin((fEvt)->fTracks[i].fCharge*(0.1*fBfield)*coeff/(fEvt)->fTracks[i].fPt);
1626 if(phi1 > 2*PI) phi1 -= 2*PI;
1627 if(phi1 < 0) phi1 += 2*PI;
1628 Float_t phi2 = (fEvt+en2)->fTracks[j].fPhi - asin((fEvt+en2)->fTracks[j].fCharge*(0.1*fBfield)*coeff/(fEvt+en2)->fTracks[j].fPt);
1629 if(phi2 > 2*PI) phi2 -= 2*PI;
1630 if(phi2 < 0) phi2 += 2*PI;
1631 Float_t deltaphi = phi1 - phi2;
1632 if(deltaphi > PI) deltaphi -= PI;
1633 if(deltaphi < -PI) deltaphi += PI;
1634 ((TH3F*)fOutputList->FindObject("fPairsDetaDPhiNum"))->Fill(rstep, (fEvt)->fTracks[i].fEta-(fEvt+en2)->fTracks[j].fEta, deltaphi);
1638 // Pair Splitting/Merging cut
1640 if(!AcceptPair((fEvt)->fTracks[i], (fEvt+en2)->fTracks[j])) {
1641 fPairSplitCut[0][i]->AddAt('1',j);
1642 ((TH1F*)fOutputList->FindObject("fRejectedPairs"))->Fill(qinv12);
1648 if(fMCcase && fillIndex2==0){
1650 // Check that label does not exceed stack size
1651 if((fEvt)->fTracks[i].fLabel < (fEvt)->fMCarraySize && (fEvt+en2)->fTracks[j].fLabel < (fEvt+en2)->fMCarraySize){
1652 pVect1MC[0]=sqrt(pow((fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPtot,2)+pow(fTrueMassPi,2));
1653 pVect2MC[0]=sqrt(pow((fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPtot,2)+pow(fTrueMassPi,2));
1654 pVect1MC[1]=(fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPx; pVect2MC[1]=(fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPx;
1655 pVect1MC[2]=(fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPy; pVect2MC[2]=(fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPy;
1656 pVect1MC[3]=(fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPz; pVect2MC[3]=(fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPz;
1657 qinv12MC = GetQinv(fillIndex2, pVect1MC, pVect2MC);
1658 GetQosl(pVect1MC, pVect2MC, qoutMC, qsideMC, qlongMC);
1659 if(qinv12<0.1 && ch1==ch2) {
1660 ((TProfile*)fOutputList->FindObject("fQsmearMean"))->Fill(1.,qinv12-qinv12MC);
1661 ((TProfile*)fOutputList->FindObject("fQsmearSq"))->Fill(1.,1000.*pow(qinv12-qinv12MC,2));
1662 ((TH1D*)fOutputList->FindObject("fQDist"))->Fill(qinv12-qinv12MC);
1666 for(Int_t rIter=0; rIter<kRVALUES; rIter++){// 3fm to 8fm + 1 Therminator setting
1667 for(Int_t myDampIt=0; myDampIt<kNDampValues; myDampIt++){
1668 Int_t denIndex = rIter*kNDampValues + myDampIt;
1669 Float_t WInput = MCWeight(ch1,ch2, rIter, myDampIt, qinv12MC);
1670 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[0].fIdeal->Fill(denIndex, qinv12MC, WInput);
1671 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[1].fIdeal->Fill(denIndex, qinv12MC);
1672 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[0].fSmeared->Fill(denIndex, qinv12, WInput);
1673 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[1].fSmeared->Fill(denIndex, qinv12);
1677 //HIJING resonance test
1679 mcParticle1 = (AliAODMCParticle*)mcArray->At(abs((fEvt)->fTracks[i].fLabel));
1680 mcParticle2 = (AliAODMCParticle*)mcArray->At(abs((fEvt+en2)->fTracks[j].fLabel));
1681 ((TH1F*)fOutputList->FindObject("fAllOSPairs"))->Fill(fMbin+1, qinv12);
1682 if(abs(mcParticle1->GetPdgCode())==211 && abs(mcParticle2->GetPdgCode())==211){
1683 if(mcParticle1->GetMother() == mcParticle2->GetMother() && mcParticle1->GetMother() >=0){
1684 ((TH1F*)fOutputList->FindObject("fResonanceOSPairs"))->Fill(fMbin+1, qinv12);
1691 //////////////////////////////////////////
1693 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].fExplicit2->Fill(transK12, qinv12);
1694 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].fExplicit2QW->Fill(transK12, qinv12, qinv12);
1697 if(bin1==bin2 && fillIndex2==0){
1698 if((transK12 > 0.2) && (transK12 < 0.3)){
1699 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].OSL_ktbin[0].fExplicit2OSL->Fill(fabs(qout), fabs(qside), fabs(qlong));
1700 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].OSL_ktbin[0].fExplicit2OSLQW->Fill(fabs(qout), fabs(qside), fabs(qlong), qinv12);
1702 if((transK12 > 0.6) && (transK12 < 0.7)){
1703 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].OSL_ktbin[1].fExplicit2OSL->Fill(fabs(qout), fabs(qside), fabs(qlong));
1704 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].OSL_ktbin[1].fExplicit2OSLQW->Fill(fabs(qout), fabs(qside), fabs(qlong), qinv12);
1708 //////////////////////////////////////////
1710 if(fillIndex2==0 && bin1==bin2){
1712 transKbin=-1; rapKbin=-1;
1713 for(Int_t kIt=0; kIt<kKbinsT; kIt++) {if(transK12 < (fKmiddleT[kIt] + fKstepT[kIt]/2.)) {transKbin = kIt; break;}}
1714 for(Int_t kIt=0; kIt<kKbinsY; kIt++) {if(rapK12 < (fKmiddleY[kIt] + fKstepY[kIt]/2.)) {rapKbin = kIt; break;}}
1715 if((transKbin<0) || (rapKbin<0)) {cout<<"problem!!!!!!!!!!!!!!!!!!!!!!!!!!!!"<<endl; continue;}
1716 if((transKbin>=kKbinsT) || (rapKbin>=kKbinsY)) {cout<<"problem!!!!!!!!!!!!!!!!!!!!!!!!!!!!"<<endl; continue;}
1717 KT[transKbin].KY[rapKbin].MB[fMbin].EDB[fEDbin].TwoPT[en2].fExplicit2ThreeD->Fill(fabs(qout), fabs(qside), fabs(qlong));
1723 // exit out of loop if there are too many pairs
1724 if(pairCountSE >= kPairLimit) {cout<<"Too many SE pairs"<<endl; exitCode=kTRUE; continue;}
1725 if(exitCode) continue;
1727 //////////////////////////
1729 if(qinv12 <= fQcut[qCutBin]) {
1731 ///////////////////////////
1733 (fEvt)->fPairsSE[pairCountSE].fP1[0] = (fEvt)->fTracks[i].fP[0];
1734 (fEvt)->fPairsSE[pairCountSE].fP1[1] = (fEvt)->fTracks[i].fP[1];
1735 (fEvt)->fPairsSE[pairCountSE].fP1[2] = (fEvt)->fTracks[i].fP[2];
1736 (fEvt)->fPairsSE[pairCountSE].fE1 = (fEvt)->fTracks[i].fEaccepted;
1737 (fEvt)->fPairsSE[pairCountSE].fCharge1 = (fEvt)->fTracks[i].fCharge;
1738 (fEvt)->fPairsSE[pairCountSE].fIndex1 = i;
1739 (fEvt)->fPairsSE[pairCountSE].fKey1 = key1;
1740 (fEvt)->fPairsSE[pairCountSE].fLabel1 = (fEvt)->fTracks[i].fLabel;
1741 if(fMCcase && ((fEvt)->fTracks[i].fLabel < (fEvt)->fMCarraySize)){
1742 (fEvt)->fPairsSE[pairCountSE].fP1MC[0] = (fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPx;
1743 (fEvt)->fPairsSE[pairCountSE].fP1MC[1] = (fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPy;
1744 (fEvt)->fPairsSE[pairCountSE].fP1MC[2] = (fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPz;
1747 (fEvt)->fPairsSE[pairCountSE].fP2[0] = (fEvt+en2)->fTracks[j].fP[0];
1748 (fEvt)->fPairsSE[pairCountSE].fP2[1] = (fEvt+en2)->fTracks[j].fP[1];
1749 (fEvt)->fPairsSE[pairCountSE].fP2[2] = (fEvt+en2)->fTracks[j].fP[2];
1750 (fEvt)->fPairsSE[pairCountSE].fE2 = (fEvt+en2)->fTracks[j].fEaccepted;
1751 (fEvt)->fPairsSE[pairCountSE].fCharge2 = (fEvt+en2)->fTracks[j].fCharge;
1752 (fEvt)->fPairsSE[pairCountSE].fIndex2 = j;
1753 (fEvt)->fPairsSE[pairCountSE].fKey2 = key2;
1754 (fEvt)->fPairsSE[pairCountSE].fLabel2 = (fEvt+en2)->fTracks[j].fLabel;
1755 if(fMCcase && ((fEvt+en2)->fTracks[j].fLabel < (fEvt+en2)->fMCarraySize)){
1756 (fEvt)->fPairsSE[pairCountSE].fP2MC[0] = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPx;
1757 (fEvt)->fPairsSE[pairCountSE].fP2MC[1] = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPy;
1758 (fEvt)->fPairsSE[pairCountSE].fP2MC[2] = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPz;
1761 (fEvt)->fPairsSE[pairCountSE].fQinv = qinv12;
1763 fPairLocationSE[i]->AddAt(pairCountSE,j);
1770 /////////////////////////////////////////////////////////
1771 // Normalization Region
1773 if((qinv12 >= fNormQcutLow[normBin]) && (qinv12 < fNormQcutHigh[normBin])){
1775 fNormPairs[en2][normPairCount[en2]].fCharge1 = (fEvt)->fTracks[i].fCharge;
1776 fNormPairs[en2][normPairCount[en2]].fIndex1 = i;
1777 fNormPairs[en2][normPairCount[en2]].fKey1 = (fEvt)->fTracks[i].fKey;
1779 fNormPairs[en2][normPairCount[en2]].fCharge2 = (fEvt+en2)->fTracks[j].fCharge;
1780 fNormPairs[en2][normPairCount[en2]].fIndex2 = j;
1781 fNormPairs[en2][normPairCount[en2]].fKey2 = (fEvt+en2)->fTracks[j].fKey;
1784 //other past pairs with particle j
1785 for(Int_t pastpair=0; pastpair<numOtherPairs2[0][j]; pastpair++){
1786 Int_t locationOtherPair = fOtherPairLocation2[0][j]->At(pastpair);
1787 if(locationOtherPair < 0) continue;// no pair there
1788 Int_t indexOther1 = i;
1789 Int_t indexOther2 = fNormPairs[0][ locationOtherPair ].fIndex1;
1791 // Both possible orderings of other indexes
1792 if( (fNormPairSwitch[0][indexOther1]->At(indexOther2)=='1') || (fNormPairSwitch[0][indexOther2]->At(indexOther1)=='1')) {
1794 // 1 and 2 are from SE
1795 ch3 = Int_t((fNormPairs[0][ locationOtherPair ].fCharge1 + 1)/2.);
1796 key3 = fNormPairs[0][ locationOtherPair ].fKey1;
1797 Short_t fillIndex3 = FillIndex3part(key1+key2+key3);
1798 SetFillBins3(fillIndex3, key1, key2, key3, ch1, ch2, ch3, 0, bin1, bin2, bin3, fDummyB, fDummyB, fDummyB);
1800 tempNormFillCount[bin1][bin2][bin3][fillIndex3][0]++;
1803 }// pastpair P11 loop
1806 fNormPairSwitch[en2][i]->AddAt('1',j);
1807 fOtherPairLocation1[en2][i]->AddAt(normPairCount[en2], numOtherPairs1[en2][i]);// location of otherpair with i as 1st particle
1808 fOtherPairLocation2[en2][j]->AddAt(normPairCount[en2], numOtherPairs2[en2][j]);// location of otherpair with j as 2nd particle
1810 numOtherPairs1[en2][i]++;
1811 numOtherPairs2[en2][j]++;
1814 normPairCount[en2]++;
1815 if(normPairCount[en2] >= kNormPairLimit) exitCode=kTRUE;
1824 //////////////////////////////////////////////
1827 for (Int_t i=0; i<myTracks; i++) {
1832 for (Int_t j=0; j<(fEvt+en2)->fNtracks; j++) {
1834 key1 = (fEvt)->fTracks[i].fKey;
1835 key2 = (fEvt+en2)->fTracks[j].fKey;
1836 Short_t fillIndex2 = FillIndex2part(key1+key2);
1837 Short_t qCutBin = SetQcutBin(fillIndex2);
1838 Short_t normBin = SetNormBin(fillIndex2);
1839 pVect1[0]=(fEvt)->fTracks[i].fEaccepted; pVect2[0]=(fEvt+en2)->fTracks[j].fEaccepted;
1840 pVect1[1]=(fEvt)->fTracks[i].fP[0]; pVect2[1]=(fEvt+en2)->fTracks[j].fP[0];
1841 pVect1[2]=(fEvt)->fTracks[i].fP[1]; pVect2[2]=(fEvt+en2)->fTracks[j].fP[1];
1842 pVect1[3]=(fEvt)->fTracks[i].fP[2]; pVect2[3]=(fEvt+en2)->fTracks[j].fP[2];
1844 qinv12 = GetQinv(fillIndex2, pVect1, pVect2);
1845 GetQosl(pVect1, pVect2, qout, qside, qlong);
1846 transK12 = sqrt(pow(pVect1[1]+pVect2[1],2) + pow(pVect1[2]+pVect2[2],2))/2.;
1848 if(qinv12 < fQLowerCut) continue;// remove unwanted low-q pairs (also a type of track splitting cut)
1850 ///////////////////////////////
1851 ch1 = Int_t(((fEvt)->fTracks[i].fCharge + 1)/2.);
1852 ch2 = Int_t(((fEvt+en2)->fTracks[j].fCharge + 1)/2.);
1853 SetFillBins2(fillIndex2, key1, key2, ch1, ch2, bin1, bin2);
1855 if(fMCcase && ch1==ch2 && fMbin==0){
1856 for(Int_t rstep=0; rstep<10; rstep++){
1857 Float_t coeff = (rstep)*0.2*(0.18/1.2);
1858 // propagate through B field to r=1.2m
1859 Float_t phi1 = (fEvt)->fTracks[i].fPhi - asin((fEvt)->fTracks[i].fCharge*(0.1*fBfield)*coeff/(fEvt)->fTracks[i].fPt);
1860 if(phi1 > 2*PI) phi1 -= 2*PI;
1861 if(phi1 < 0) phi1 += 2*PI;
1862 Float_t phi2 = (fEvt+en2)->fTracks[j].fPhi - asin((fEvt+en2)->fTracks[j].fCharge*(0.1*fBfield)*coeff/(fEvt+en2)->fTracks[j].fPt);
1863 if(phi2 > 2*PI) phi2 -= 2*PI;
1864 if(phi2 < 0) phi2 += 2*PI;
1865 Float_t deltaphi = phi1 - phi2;
1866 if(deltaphi > PI) deltaphi -= PI;
1867 if(deltaphi < -PI) deltaphi += PI;
1868 ((TH3F*)fOutputList->FindObject("fPairsDetaDPhiDen"))->Fill(rstep, (fEvt)->fTracks[i].fEta-(fEvt+en2)->fTracks[j].fEta, deltaphi);
1873 if(!AcceptPair((fEvt)->fTracks[i], (fEvt+en2)->fTracks[j])) {
1874 fPairSplitCut[1][i]->AddAt('1',j);
1879 //////////////////////////////////////////
1881 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].fExplicit2->Fill(transK12, qinv12);
1882 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].fExplicit2QW->Fill(transK12, qinv12, qinv12);
1885 if(bin1==bin2 && fillIndex2==0){
1886 if((transK12 > 0.2) && (transK12 < 0.3)){
1887 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].OSL_ktbin[0].fExplicit2OSL->Fill(fabs(qout), fabs(qside), fabs(qlong));
1888 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].OSL_ktbin[0].fExplicit2OSLQW->Fill(fabs(qout), fabs(qside), fabs(qlong), qinv12);
1890 if((transK12 > 0.6) && (transK12 < 0.7)){
1891 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].OSL_ktbin[1].fExplicit2OSL->Fill(fabs(qout), fabs(qside), fabs(qlong));
1892 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].OSL_ktbin[1].fExplicit2OSLQW->Fill(fabs(qout), fabs(qside), fabs(qlong), qinv12);
1895 //////////////////////////////////////////
1897 if(fillIndex2==0 && bin1==bin2){
1899 transKbin=-1; rapKbin=-1;
1900 for(Int_t kIt=0; kIt<kKbinsT; kIt++) {if(transK12 < (fKmiddleT[kIt] + fKstepT[kIt]/2.)) {transKbin = kIt; break;}}
1901 for(Int_t kIt=0; kIt<kKbinsY; kIt++) {if(rapK12 < (fKmiddleY[kIt] + fKstepY[kIt]/2.)) {rapKbin = kIt; break;}}
1902 if((transKbin<0) || (rapKbin<0)) {cout<<"problem!!!!!!!!!!!!!!!!!!!!!!!!!!!!"<<endl; continue;}
1903 if((transKbin>=kKbinsT) || (rapKbin>=kKbinsY)) {cout<<"problem!!!!!!!!!!!!!!!!!!!!!!!!!!!!"<<endl; continue;}
1904 KT[transKbin].KY[rapKbin].MB[fMbin].EDB[fEDbin].TwoPT[en2].fExplicit2ThreeD->Fill(fabs(qout), fabs(qside), fabs(qlong));
1910 if(pairCountME >= 2*kPairLimit) {cout<<"Too many ME pairs"<<endl; exitCode=kTRUE; continue;}
1911 if(exitCode) continue;
1913 if(qinv12 <= fQcut[qCutBin]) {
1914 ///////////////////////////
1917 (fEvt)->fPairsME[pairCountME].fP1[0] = (fEvt)->fTracks[i].fP[0];
1918 (fEvt)->fPairsME[pairCountME].fP1[1] = (fEvt)->fTracks[i].fP[1];
1919 (fEvt)->fPairsME[pairCountME].fP1[2] = (fEvt)->fTracks[i].fP[2];
1920 (fEvt)->fPairsME[pairCountME].fE1 = (fEvt)->fTracks[i].fEaccepted;
1921 (fEvt)->fPairsME[pairCountME].fCharge1 = (fEvt)->fTracks[i].fCharge;
1922 (fEvt)->fPairsME[pairCountME].fIndex1 = i;
1923 (fEvt)->fPairsME[pairCountME].fKey1 = key1;
1924 (fEvt)->fPairsME[pairCountME].fLabel1 = (fEvt)->fTracks[i].fLabel;
1925 if(fMCcase && ((fEvt)->fTracks[i].fLabel < (fEvt)->fMCarraySize)){
1926 (fEvt)->fPairsME[pairCountME].fP1MC[0] = (fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPx;
1927 (fEvt)->fPairsME[pairCountME].fP1MC[1] = (fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPy;
1928 (fEvt)->fPairsME[pairCountME].fP1MC[2] = (fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPz;
1931 (fEvt)->fPairsME[pairCountME].fP2[0] = (fEvt+en2)->fTracks[j].fP[0];
1932 (fEvt)->fPairsME[pairCountME].fP2[1] = (fEvt+en2)->fTracks[j].fP[1];
1933 (fEvt)->fPairsME[pairCountME].fP2[2] = (fEvt+en2)->fTracks[j].fP[2];
1934 (fEvt)->fPairsME[pairCountME].fE2 = (fEvt+en2)->fTracks[j].fEaccepted;
1935 (fEvt)->fPairsME[pairCountME].fCharge2 = (fEvt+en2)->fTracks[j].fCharge;
1936 (fEvt)->fPairsME[pairCountME].fIndex2 = j;
1937 (fEvt)->fPairsME[pairCountME].fKey2 = key2;
1938 (fEvt)->fPairsME[pairCountME].fLabel2 = (fEvt+en2)->fTracks[j].fLabel;
1939 if(fMCcase && ((fEvt+en2)->fTracks[j].fLabel < (fEvt+en2)->fMCarraySize)){
1940 (fEvt)->fPairsME[pairCountME].fP2MC[0] = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPx;
1941 (fEvt)->fPairsME[pairCountME].fP2MC[1] = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPy;
1942 (fEvt)->fPairsME[pairCountME].fP2MC[2] = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPz;
1945 (fEvt)->fPairsME[pairCountME].fQinv = qinv12;
1947 fPairLocationME[i]->AddAt(Int_t(pairCountME),j);
1953 if((qinv12 >= fNormQcutLow[normBin]) && (qinv12 < fNormQcutHigh[normBin])){
1955 fNormPairs[en2][normPairCount[en2]].fCharge1 = (fEvt)->fTracks[i].fCharge;
1956 fNormPairs[en2][normPairCount[en2]].fIndex1 = i;
1957 fNormPairs[en2][normPairCount[en2]].fKey1 = (fEvt)->fTracks[i].fKey;
1959 fNormPairs[en2][normPairCount[en2]].fCharge2 = (fEvt+en2)->fTracks[j].fCharge;
1960 fNormPairs[en2][normPairCount[en2]].fIndex2 = j;
1961 fNormPairs[en2][normPairCount[en2]].fKey2 = (fEvt+en2)->fTracks[j].fKey;
1963 //other past pairs in P11 with particle i
1964 for(Int_t pastpairP11=0; pastpairP11<numOtherPairs2[0][i]; pastpairP11++){// past pair in P11 with i as 1st and 2nd particle
1965 Int_t locationOtherPairP11 = fOtherPairLocation2[0][i]->At(pastpairP11);// i is 2nd particle
1966 if(locationOtherPairP11 < 0) continue;// no pair there
1967 Int_t indexOther1P11 = fNormPairs[0][ locationOtherPairP11 ].fIndex1;
1969 //Check other past pairs in P12
1970 if( (fNormPairSwitch[1][indexOther1P11]->At(j)=='0')) continue;
1972 // 1 and 3 are from SE
1973 ch3 = Int_t((fNormPairs[0][ locationOtherPairP11 ].fCharge1 + 1)/2.);// charge of second particle in P11
1974 key3 = fNormPairs[0][ locationOtherPairP11 ].fKey1;
1975 Short_t fillIndex3 = FillIndex3part(key1+key2+key3);
1976 Bool_t fill2=kFALSE, fill3=kFALSE, fill4=kFALSE;
1977 SetFillBins3(fillIndex3, key1, key2, key3, ch1, ch2, ch3, 2, bin1, bin2, bin3, fill2, fill3, fill4);
1980 if(fill2) tempNormFillCount[bin1][bin2][bin3][fillIndex3][1]++;
1981 if(fill3) tempNormFillCount[bin1][bin2][bin3][fillIndex3][2]++;
1982 if(fill4) tempNormFillCount[bin1][bin2][bin3][fillIndex3][3]++;
1988 fNormPairSwitch[en2][i]->AddAt('1',j);
1989 fOtherPairLocation1[en2][i]->AddAt(normPairCount[en2], numOtherPairs1[en2][i]);// location of otherpair with i as 1st particle
1990 fOtherPairLocation2[en2][j]->AddAt(normPairCount[en2], numOtherPairs2[en2][j]);// location of otherpair with j as 2nd particle
1992 numOtherPairs1[en2][i]++;
1993 numOtherPairs2[en2][j]++;
1995 normPairCount[en2]++;
1996 if(normPairCount[en2] >= kNormPairLimit) exitCode=kTRUE;
2005 ///////////////////////////////////////
2006 // P13 pairing (just for Norm counting of term5)
2007 for (Int_t i=0; i<myTracks; i++) {
2009 // exit out of loop if there are too many pairs
2010 // dont bother with this loop if exitCode is set.
2016 for (Int_t j=0; j<(fEvt+en2)->fNtracks; j++) {
2018 key1 = (fEvt)->fTracks[i].fKey;
2019 key2 = (fEvt+en2)->fTracks[j].fKey;
2020 Short_t fillIndex2 = FillIndex2part(key1+key2);
2021 Short_t normBin = SetNormBin(fillIndex2);
2022 pVect1[0]=(fEvt)->fTracks[i].fEaccepted; pVect2[0]=(fEvt+en2)->fTracks[j].fEaccepted;
2023 pVect1[1]=(fEvt)->fTracks[i].fP[0]; pVect2[1]=(fEvt+en2)->fTracks[j].fP[0];
2024 pVect1[2]=(fEvt)->fTracks[i].fP[1]; pVect2[2]=(fEvt+en2)->fTracks[j].fP[1];
2025 pVect1[3]=(fEvt)->fTracks[i].fP[2]; pVect2[3]=(fEvt+en2)->fTracks[j].fP[2];
2027 qinv12 = GetQinv(fillIndex2, pVect1, pVect2);
2029 if(qinv12 < fQLowerCut) continue;// remove unwanted low-q pairs (also a type of track splitting cut)
2031 ch1 = Int_t(((fEvt)->fTracks[i].fCharge + 1)/2.);
2032 ch2 = Int_t(((fEvt+en2)->fTracks[j].fCharge + 1)/2.);
2035 if(!AcceptPair((fEvt)->fTracks[i], (fEvt+en2)->fTracks[j])) {
2036 fPairSplitCut[2][i]->AddAt('1',j);
2041 /////////////////////////////////////////////////////////
2042 // Normalization Region
2044 if((qinv12 >= fNormQcutLow[normBin]) && (qinv12 < fNormQcutHigh[normBin])){
2046 fNormPairSwitch[en2][i]->AddAt('1',j);
2054 ///////////////////////////////////////
2055 // P23 pairing (just for Norm counting of term5)
2057 for (Int_t i=0; i<(fEvt+en1)->fNtracks; i++) {
2059 // exit out of loop if there are too many pairs
2060 // dont bother with this loop if exitCode is set.
2066 for (Int_t j=0; j<(fEvt+en2)->fNtracks; j++) {
2070 key1 = (fEvt+en1)->fTracks[i].fKey;
2071 key2 = (fEvt+en2)->fTracks[j].fKey;
2072 Short_t fillIndex2 = FillIndex2part(key1+key2);
2073 Short_t normBin = SetNormBin(fillIndex2);
2074 pVect1[0]=(fEvt+en1)->fTracks[i].fEaccepted; pVect2[0]=(fEvt+en2)->fTracks[j].fEaccepted;
2075 pVect1[1]=(fEvt+en1)->fTracks[i].fP[0]; pVect2[1]=(fEvt+en2)->fTracks[j].fP[0];
2076 pVect1[2]=(fEvt+en1)->fTracks[i].fP[1]; pVect2[2]=(fEvt+en2)->fTracks[j].fP[1];
2077 pVect1[3]=(fEvt+en1)->fTracks[i].fP[2]; pVect2[3]=(fEvt+en2)->fTracks[j].fP[2];
2079 qinv12 = GetQinv(fillIndex2, pVect1, pVect2);
2081 if(qinv12 < fQLowerCut) continue;// remove unwanted low-q pairs (also a type of track splitting cut)
2083 ///////////////////////////////
2084 ch1 = Int_t(((fEvt+en1)->fTracks[i].fCharge + 1)/2.);
2085 ch2 = Int_t(((fEvt+en2)->fTracks[j].fCharge + 1)/2.);
2088 if(!AcceptPair((fEvt+en1)->fTracks[i], (fEvt+en2)->fTracks[j])) {
2089 fPairSplitCut[3][i]->AddAt('1',j);
2094 if((qinv12 < fNormQcutLow[normBin]) || (qinv12 >= fNormQcutHigh[normBin])) continue;
2096 Int_t index1P23 = i;
2097 Int_t index2P23 = j;
2099 for(Int_t pastpairP12=0; pastpairP12<numOtherPairs2[1][index1P23]; pastpairP12++){// loop in P12 with i as 2nd particle
2100 Int_t locationOtherPairP12 = fOtherPairLocation2[1][index1P23]->At(pastpairP12);
2101 if(locationOtherPairP12 < 0) continue; // no pair there
2102 Int_t index1P12 = fNormPairs[1][ locationOtherPairP12 ].fIndex1;
2105 //Check other past pair status in P13
2106 if( (fNormPairSwitch[2][index1P12]->At(index2P23)=='0')) continue;
2108 // all from different event
2109 ch3 = Int_t((fNormPairs[1][ locationOtherPairP12 ].fCharge1 + 1)/2.);// charge of first particle in P12
2110 key3 = fNormPairs[1][ locationOtherPairP12 ].fKey1;
2111 Short_t fillIndex3 = FillIndex3part(key1+key2+key3);
2112 SetFillBins3(fillIndex3, key1, key2, key3, ch1, ch2, ch3, 3, bin1, bin2, bin3, fDummyB, fDummyB, fDummyB);
2114 tempNormFillCount[bin1][bin2][bin3][fillIndex3][4]++;
2122 ///////////////////////////////////////////////////
2123 // Do not use pairs from events with too many pairs
2125 cout<<"SE or ME or Norm PairCount too large. Discarding all pairs and skipping event"<<endl;
2126 (fEvt)->fNpairsSE = 0;
2127 (fEvt)->fNpairsME = 0;
2128 ((TH1F*)fOutputList->FindObject("fRejectedEvents"))->Fill(fMbin+1);
2129 return;// Skip event
2131 (fEvt)->fNpairsSE = pairCountSE;
2132 (fEvt)->fNpairsME = pairCountME;
2133 ((TH1F*)fOutputList->FindObject("fEvents2"))->Fill(fMbin+1);
2135 ///////////////////////////////////////////////////
2139 //cout<<"pairCountSE = "<<pairCountSE<<" pairCountME = "<<pairCountME<<endl;
2140 //cout<<"Start Main analysis"<<endl;
2142 ///////////////////////////////////////////////////////////////////////
2143 ///////////////////////////////////////////////////////////////////////
2144 ///////////////////////////////////////////////////////////////////////
2147 // Start the Main Correlation Analysis
2150 ///////////////////////////////////////////////////////////////////////
2153 /////////////////////////////////////////////////////////
2154 // Skip 3-particle part if Tabulate6DPairs is set to true
2155 if(fTabulatePairs) return;
2156 /////////////////////////////////////////////////////////
2158 // Set the Normalization counters
2159 for(Int_t termN=0; termN<5; termN++){
2162 if((fEvt)->fNtracks ==0) continue;
2164 if((fEvt)->fNtracks ==0) continue;
2165 if((fEvt+1)->fNtracks ==0) continue;
2167 if((fEvt)->fNtracks ==0) continue;
2168 if((fEvt+1)->fNtracks ==0) continue;
2169 if((fEvt+2)->fNtracks ==0) continue;
2172 for(Int_t sc=0; sc<kSCLimit3; sc++){
2174 for(Int_t c1=0; c1<2; c1++){
2175 for(Int_t c2=0; c2<2; c2++){
2176 for(Int_t c3=0; c3<2; c3++){
2178 if(sc==0 || sc==6 || sc==9){// Identical species
2179 if( (c1+c2+c3)==1) {if(c1!=0 || c2!=0 || c3!=1) continue;}
2180 if( (c1+c2+c3)==2) {if(c1!=0) continue;}
2182 if( (c1+c2)==1) {if(c1!=0) continue;}
2183 }else {}// do nothing for pi-k-p case
2184 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[fMbin].EDB[fEDbin].ThreePT[termN].fNorm3->Fill(0.,tempNormFillCount[c1][c2][c3][sc][termN]);
2193 /////////////////////////////////////////////
2194 // Calculate Pair-Cut Correlations
2195 for(Int_t en1case=0; en1case<2; en1case++){// limit at 2 (normal)
2198 if(en1case==0) nump1 = (fEvt)->fNpairsSE;
2199 if(en1case==1) nump1 = (fEvt)->fNpairsME;
2202 for(Int_t p1=0; p1<nump1; p1++){
2205 ch1 = Int_t(((fEvt)->fPairsSE[p1].fCharge1 + 1)/2.);
2206 ch2 = Int_t(((fEvt)->fPairsSE[p1].fCharge2 + 1)/2.);
2207 pVect1[0] = (fEvt)->fPairsSE[p1].fE1; pVect2[0] = (fEvt)->fPairsSE[p1].fE2;
2208 pVect1[1] = (fEvt)->fPairsSE[p1].fP1[0]; pVect2[1] = (fEvt)->fPairsSE[p1].fP2[0];
2209 pVect1[2] = (fEvt)->fPairsSE[p1].fP1[1]; pVect2[2] = (fEvt)->fPairsSE[p1].fP2[1];
2210 pVect1[3] = (fEvt)->fPairsSE[p1].fP1[2]; pVect2[3] = (fEvt)->fPairsSE[p1].fP2[2];
2211 index1 = (fEvt)->fPairsSE[p1].fIndex1; index2 = (fEvt)->fPairsSE[p1].fIndex2;
2212 key1 = (fEvt)->fPairsSE[p1].fKey1; key2 = (fEvt)->fPairsSE[p1].fKey2;
2213 pVect1MC[1] = (fEvt)->fPairsSE[p1].fP1MC[0]; pVect2MC[1] = (fEvt)->fPairsSE[p1].fP2MC[0];
2214 pVect1MC[2] = (fEvt)->fPairsSE[p1].fP1MC[1]; pVect2MC[2] = (fEvt)->fPairsSE[p1].fP2MC[1];
2215 pVect1MC[3] = (fEvt)->fPairsSE[p1].fP1MC[2]; pVect2MC[3] = (fEvt)->fPairsSE[p1].fP2MC[2];
2216 pVect1MC[0] = sqrt(pow(pVect1MC[1],2)+pow(pVect1MC[2],2)+pow(pVect1MC[3],2)+pow(fTrueMassPi,2));
2217 pVect2MC[0] = sqrt(pow(pVect2MC[1],2)+pow(pVect2MC[2],2)+pow(pVect2MC[3],2)+pow(fTrueMassPi,2));
2219 qinv12 = (fEvt)->fPairsSE[p1].fQinv;
2222 ch1 = Int_t(((fEvt)->fPairsME[p1].fCharge1 + 1)/2.);
2223 ch2 = Int_t(((fEvt)->fPairsME[p1].fCharge2 + 1)/2.);
2224 pVect1[0] = (fEvt)->fPairsME[p1].fE1; pVect2[0] = (fEvt)->fPairsME[p1].fE2;
2225 pVect1[1] = (fEvt)->fPairsME[p1].fP1[0]; pVect2[1] = (fEvt)->fPairsME[p1].fP2[0];
2226 pVect1[2] = (fEvt)->fPairsME[p1].fP1[1]; pVect2[2] = (fEvt)->fPairsME[p1].fP2[1];
2227 pVect1[3] = (fEvt)->fPairsME[p1].fP1[2]; pVect2[3] = (fEvt)->fPairsME[p1].fP2[2];
2228 index1 = (fEvt)->fPairsME[p1].fIndex1; index2 = (fEvt)->fPairsME[p1].fIndex2;
2229 key1 = (fEvt)->fPairsME[p1].fKey1; key2 = (fEvt)->fPairsME[p1].fKey2;
2230 pVect1MC[1] = (fEvt)->fPairsME[p1].fP1MC[0]; pVect2MC[1] = (fEvt)->fPairsME[p1].fP2MC[0];
2231 pVect1MC[2] = (fEvt)->fPairsME[p1].fP1MC[1]; pVect2MC[2] = (fEvt)->fPairsME[p1].fP2MC[1];
2232 pVect1MC[3] = (fEvt)->fPairsME[p1].fP1MC[2]; pVect2MC[3] = (fEvt)->fPairsME[p1].fP2MC[2];
2233 pVect1MC[0] = sqrt(pow(pVect1MC[1],2)+pow(pVect1MC[2],2)+pow(pVect1MC[3],2)+pow(fTrueMassPi,2));
2234 pVect2MC[0] = sqrt(pow(pVect2MC[1],2)+pow(pVect2MC[2],2)+pow(pVect2MC[3],2)+pow(fTrueMassPi,2));
2236 qinv12 = (fEvt)->fPairsME[p1].fQinv;
2241 for(Int_t en2=0; en2<3; en2++){
2242 //////////////////////////////////////
2244 Bool_t skipcase=kTRUE;
2245 Short_t config=-1, part=-1;
2246 if(en1case==0 && en2==0) {skipcase=kFALSE; config=1; part=0;}// P11T1
2247 if(en1case==0 && en2==1) {skipcase=kFALSE; config=2; part=1;}// P11T2
2248 if(en1case==1 && en2==0) {skipcase=kFALSE; config=2; part=2;}// P12T1
2249 if(en1case==1 && en2==2) {skipcase=kFALSE; config=3; part=3;}// P12T3
2251 if(skipcase) continue;
2256 for(Int_t k=0; k<(fEvt+en2)->fNtracks; k++){
2260 // remove auto-correlations and duplicate triplets
2262 if( index1 == index3) continue;
2263 if( index2 == index3) continue;
2264 if(fPairSplitCut[0][index1]->At(index2)=='1') continue;// Track splitting/merging
2266 // skip the switched off triplets
2267 if(fTripletSkip1[fPairLocationSE[index1]->At(index2)]->At(index3)=='1') {
2268 fTripletSkip1[fPairLocationSE[index1]->At(index2)]->AddAt('0',index3);// Reset
2271 ///////////////////////////////
2272 // Turn off 1st possible degenerate triplet
2273 if(index1 < index3){// verify correct id ordering ( index1 < k )
2274 if(fPairLocationSE[index1]->At(index3) >= 0){
2275 fTripletSkip1[fPairLocationSE[index1]->At(index3)]->AddAt('1',index2);
2277 if(fPairSplitCut[0][index1]->At(index3)=='1') continue;// Track splitting/merging
2278 }else {// or k < index1
2279 if(fPairLocationSE[index3]->At(index1) >= 0){
2280 fTripletSkip1[fPairLocationSE[index3]->At(index1)]->AddAt('1',index2);
2282 if(fPairSplitCut[0][index3]->At(index1)=='1') continue;// Track splitting/merging
2284 // turn off 2nd possible degenerate triplet
2285 if(index2 < index3){// verify correct id ordering (index2 < k)
2286 if(fPairLocationSE[index2]->At(index3) >= 0){
2287 fTripletSkip1[fPairLocationSE[index2]->At(index3)]->AddAt('1',index1);
2289 if(fPairSplitCut[0][index2]->At(index3)=='1') continue;// Track splitting/merging
2290 }else {// or k < index2
2291 if(fPairLocationSE[index3]->At(index2) >= 0){
2292 fTripletSkip1[fPairLocationSE[index3]->At(index2)]->AddAt('1',index1);
2294 if(fPairSplitCut[0][index3]->At(index2)=='1') continue;// Track splitting/merging
2299 if(config==2 && part==1){// SE pair and third particle from next event. P11T2
2300 ///////////////////////////////
2301 // Turn off 1st possible degenerate triplet
2302 if(fPairLocationME[index1]->At(index3) >= 0){
2303 fTripletSkip2[fPairLocationME[index1]->At(index3)]->AddAt('1',index2);
2306 // turn off 2nd possible degenerate triplet
2307 if(fPairLocationME[index2]->At(index3) >= 0){
2308 fTripletSkip2[fPairLocationME[index2]->At(index3)]->AddAt('1',index1);
2311 if(fPairSplitCut[0][index1]->At(index2)=='1') continue;// Track splitting/merging
2312 if(fPairSplitCut[1][index1]->At(index3)=='1') continue;// Track splitting/merging
2313 if(fPairSplitCut[1][index2]->At(index3)=='1') continue;// Track splitting/merging
2314 }// end config 2 part 1
2316 if(config==2 && part==2){// P12T1
2317 if( index1 == index3) continue;
2319 // skip the switched off triplets
2320 if(fTripletSkip2[fPairLocationME[index1]->At(index2)]->At(index3)=='1') {
2321 fTripletSkip2[fPairLocationME[index1]->At(index2)]->AddAt('0',index3);// Reset
2324 // turn off another possible degenerate
2325 if(fPairLocationME[index3]->At(index2) >= 0){
2326 fTripletSkip2[fPairLocationME[index3]->At(index2)]->AddAt('1',index1);
2327 }// end config 2 part 2
2329 if(fPairSplitCut[1][index1]->At(index2)=='1') continue;// Track splitting/merging
2330 if(index1 < index3) {if(fPairSplitCut[0][index1]->At(index3)=='1') continue;}// Track splitting/merging
2331 else {if(fPairSplitCut[0][index3]->At(index1)=='1') continue;}// Track splitting/merging
2332 if(fPairSplitCut[1][index3]->At(index2)=='1') continue;// Track splitting/merging
2334 if(config==3){// P12T3
2335 if(fPairSplitCut[1][index1]->At(index2)=='1') continue;// Track splitting/merging
2336 if(fPairSplitCut[2][index1]->At(index3)=='1') continue;// Track splitting/merging
2337 if(fPairSplitCut[3][index2]->At(index3)=='1') continue;// Track splitting/merging
2342 ch3 = Int_t(((fEvt+en2)->fTracks[k].fCharge + 1)/2.);
2343 key3 = (fEvt+en2)->fTracks[k].fKey;
2344 Short_t fillIndex3 = FillIndex3part(key1+key2+key3);
2345 Short_t fillIndex13 = FillIndex2part(key1+key3);
2346 Short_t fillIndex23 = FillIndex2part(key2+key3);
2347 Short_t qCutBin13 = SetQcutBin(fillIndex13);
2348 Short_t qCutBin23 = SetQcutBin(fillIndex23);
2349 pVect3[0] = (fEvt+en2)->fTracks[k].fEaccepted;
2350 pVect3[1] = (fEvt+en2)->fTracks[k].fP[0];
2351 pVect3[2] = (fEvt+en2)->fTracks[k].fP[1];
2352 pVect3[3] = (fEvt+en2)->fTracks[k].fP[2];
2354 pVect3MC[1] = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[k].fLabel)].fPx;
2355 pVect3MC[2] = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[k].fLabel)].fPy;
2356 pVect3MC[3] = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[k].fLabel)].fPz;
2357 pVect3MC[0] = sqrt(pow(pVect3MC[1],2)+pow(pVect3MC[2],2)+pow(pVect3MC[3],2)+pow(fTrueMassPi,2));
2358 qinv12MC = GetQinv(0, pVect1MC, pVect2MC);
2359 qinv13MC = GetQinv(0, pVect1MC, pVect3MC);
2360 qinv23MC = GetQinv(0, pVect2MC, pVect3MC);
2362 qinv13 = GetQinv(fillIndex13, pVect1, pVect3);
2363 qinv23 = GetQinv(fillIndex23, pVect2, pVect3);
2366 if(qinv13 < fQLowerCut) continue;
2367 if(qinv23 < fQLowerCut) continue;
2368 if(qinv13 > fQcut[qCutBin13]) continue;// cut value was 3x higher before
2369 if(qinv23 > fQcut[qCutBin23]) continue;// cut value was 3x higher before
2370 // if all three pair cuts are the same then the case (config=2 && term=2) never reaches here.
2372 q3 = sqrt(pow(qinv12,2) + pow(qinv13,2) + pow(qinv23,2));
2373 transK3 = sqrt( pow(pVect1[1]+pVect2[1]+pVect3[1],2) + pow(pVect1[2]+pVect2[2]+pVect3[2],2))/3.;
2374 Float_t firstQ=0, secondQ=0, thirdQ=0;
2377 qinv12Bin = fMomRes3DTerm1->GetXaxis()->FindBin(qinv12);
2378 qinv13Bin = fMomRes3DTerm1->GetYaxis()->FindBin(qinv13);
2379 qinv23Bin = fMomRes3DTerm1->GetZaxis()->FindBin(qinv23);
2381 //4-vector product sums
2382 Double_t Qsum = (pVect1[0]-pVect2[0])*(pVect2[1]-pVect3[1]) - (pVect1[1]-pVect2[1])*(pVect2[0]-pVect3[0]);
2383 Qsum += (pVect1[0]-pVect2[0])*(pVect2[2]-pVect3[2]) - (pVect1[2]-pVect2[2])*(pVect2[0]-pVect3[0]);
2384 Qsum += (pVect1[0]-pVect2[0])*(pVect2[3]-pVect3[3]) - (pVect1[3]-pVect2[3])*(pVect2[0]-pVect3[0]);
2385 Qsum += (pVect1[1]-pVect2[1])*(pVect2[2]-pVect3[2]) - (pVect1[2]-pVect2[2])*(pVect2[1]-pVect3[1]);
2386 Qsum += (pVect1[1]-pVect2[1])*(pVect2[3]-pVect3[3]) - (pVect1[3]-pVect2[3])*(pVect2[1]-pVect3[1]);
2387 Qsum += (pVect1[2]-pVect2[2])*(pVect2[3]-pVect3[3]) - (pVect1[3]-pVect2[3])*(pVect2[2]-pVect3[2]);
2389 // 4-vector inner product test
2390 Double_t QsumIn = (pVect1[0]-pVect2[0])*(pVect2[0]-pVect3[0]) - (pVect1[1]-pVect2[1])*(pVect2[1]-pVect3[1]);
2391 QsumIn += -(pVect1[2]-pVect2[2])*(pVect2[2]-pVect3[2]) - (pVect1[3]-pVect2[3])*(pVect2[3]-pVect3[3]);
2395 if(config==1) {// 123
2396 SetFillBins3(fillIndex3, key1, key2, key3, ch1, ch2, ch3, 0, bin1, bin2, bin3, fDummyB, fDummyB, fDummyB);
2398 if(fillIndex3 <= 2){
2399 ArrangeQs(fillIndex3, key1, key2, key3, ch1, ch2, ch3, qinv12, qinv13, qinv23, 0, 1, firstQ, secondQ, thirdQ);
2400 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[0].fTerms3->Fill(firstQ, secondQ, thirdQ);
2401 ((TH2F*)fOutputList->FindObject("fKt3Dist"))->Fill(fMbin+1, transK3);
2403 if(fillIndex3==0 && ch1==ch2 && ch1==ch3 && fMCcase==kFALSE){
2404 Float_t MomRes3 = fMomRes3DTerm1->GetBinContent(qinv12Bin, qinv13Bin, qinv23Bin);
2405 Double_t K3 = FSICorrelationOmega0(kTRUE, firstQ, secondQ, thirdQ);// K3
2406 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[0].f4VectProdTermsCC3->Fill(Qsum, QsumIn, MomRes3/K3);
2408 //////////////////////////////////////
2409 // Momentum resolution calculation
2410 if(fillIndex3==0 && fMCcase){
2411 Float_t firstQMC=0, secondQMC=0, thirdQMC=0;
2412 ArrangeQs(fillIndex3, key1, key2, key3, ch1, ch2, ch3, qinv12MC, qinv13MC, qinv23MC, 0, 1, firstQMC, secondQMC, thirdQMC);
2413 if(ch1==ch2 && ch1==ch3){// same charge
2414 Float_t WInput = MCWeight3D(kTRUE, 1, kMCfixedRbin, kMCfixedLambdabin, firstQMC, secondQMC, thirdQMC);
2415 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[0].fIdeal->Fill(firstQMC, secondQMC, thirdQMC, WInput);
2416 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[0].fSmeared->Fill(firstQ, secondQ, thirdQ, WInput);
2417 }else {// mixed charge
2419 if(bin1==bin2) WInput = MCWeight3D(kFALSE, 1, kMCfixedRbin, kMCfixedLambdabin, firstQMC, secondQMC, thirdQMC);
2420 else WInput = MCWeight3D(kFALSE, 1, kMCfixedRbin, kMCfixedLambdabin, thirdQMC, secondQMC, firstQMC);// thirdQMC is ss
2421 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[0].fIdeal->Fill(firstQMC, secondQMC, thirdQMC, WInput);
2422 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[0].fSmeared->Fill(firstQ, secondQ, thirdQ, WInput);
2428 }else if(config==2){// 12, 13, 23
2430 Bool_t fill2=kFALSE, fill3=kFALSE, fill4=kFALSE;
2431 SetFillBins3(fillIndex3, key1, key2, key3, ch1, ch2, ch3, part, bin1, bin2, bin3, fill2, fill3, fill4);
2433 // loop over terms 2-4
2434 for(Int_t jj=2; jj<5; jj++){
2435 if(jj==2) {if(!fill2) continue;}//12
2436 if(jj==3) {if(!fill3) continue;}//13
2437 if(jj==4) {if(!fill4) continue;}//23
2439 if(fillIndex3 <= 2){
2440 ArrangeQs(fillIndex3, key1, key2, key3, ch1, ch2, ch3, qinv12, qinv13, qinv23, part, jj, firstQ, secondQ, thirdQ);
2441 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[jj-1].fTerms3->Fill(firstQ, secondQ, thirdQ);
2442 if(fillIndex3==0 && ch1==ch2 && ch1==ch3 && fMCcase==kFALSE){
2443 Float_t InteractingQ=0;
2444 if(part==1) {InteractingQ=qinv12;}// 12 from SE
2445 else {InteractingQ=qinv13;}// 13 from SE
2446 Float_t MomRes3 = fMomRes3DTerm1->GetBinContent(qinv12Bin, qinv13Bin, qinv23Bin);
2447 Double_t K3 = FSICorrelationOmega0(kTRUE, qinv12, qinv13, qinv23);// K3
2448 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[jj-1].f4VectProdTermsCC3->Fill(Qsum, QsumIn, MomRes3/K3);
2450 if(jj==2) MomRes3 = fMomRes3DTerm2->GetBinContent(qinv12Bin, qinv13Bin, qinv23Bin);
2451 else if(jj==3) MomRes3 = fMomRes3DTerm3->GetBinContent(qinv12Bin, qinv13Bin, qinv23Bin);
2452 else MomRes3 = fMomRes3DTerm4->GetBinContent(qinv12Bin, qinv13Bin, qinv23Bin);
2453 Float_t K2 = FSICorrelation2(+1,+1, kRVALUES-1, InteractingQ);// K2 from Therminator source
2454 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[jj-1].f4VectProdTermsCC2->Fill(Qsum, QsumIn, MomRes3/K2);
2456 //////////////////////////////////////
2457 // Momentum resolution calculation
2458 if(fillIndex3==0 && fMCcase){
2459 Float_t firstQMC=0, secondQMC=0, thirdQMC=0;
2460 ArrangeQs(fillIndex3, key1, key2, key3, ch1, ch2, ch3, qinv12MC, qinv13MC, qinv23MC, part, jj, firstQMC, secondQMC, thirdQMC);
2461 if(ch1==ch2 && ch1==ch3){// same charge
2462 Float_t WInput = MCWeight3D(kTRUE, jj, kMCfixedRbin, kMCfixedLambdabin, firstQMC, secondQMC, thirdQMC);
2463 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[jj-1].fIdeal->Fill(firstQMC, secondQMC, thirdQMC, WInput);
2464 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[jj-1].fSmeared->Fill(firstQ, secondQ, thirdQ, WInput);
2465 }else {// mixed charge
2467 if(bin1==bin2) WInput = MCWeight3D(kFALSE, jj, kMCfixedRbin, kMCfixedLambdabin, firstQMC, secondQMC, thirdQMC);
2468 else WInput = MCWeight3D(kFALSE, 6-jj, kMCfixedRbin, kMCfixedLambdabin, thirdQMC, secondQMC, firstQMC);// thirdQMC is ss
2469 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[jj-1].fIdeal->Fill(firstQMC, secondQMC, thirdQMC, WInput);
2470 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[jj-1].fSmeared->Fill(firstQ, secondQ, thirdQ, WInput);
2477 }else {// config 3: All particles from different events
2478 //Simulate Filling of other event-mixed lowQ pairs
2480 Float_t enhancement=1.0;
2482 if(qinv13<fQcut[qCutBin13]) nUnderCut++;
2483 if(qinv23<fQcut[qCutBin23]) nUnderCut++;
2485 if(nUnderCut==0) enhancement = (1+1+1)/1.;// 1 LowQ pair
2486 if(nUnderCut==1) enhancement = (1+2)/2.;// 2 LowQ pair
2487 if(nUnderCut==2) enhancement = 1.;// 3 LowQ pair
2489 SetFillBins3(fillIndex3, key1, key2, key3, ch1, ch2, ch3, 3, bin1, bin2, bin3, fDummyB, fDummyB, fDummyB);
2492 if(fillIndex3 <= 2){
2493 ArrangeQs(fillIndex3, key1, key2, key3, ch1, ch2, ch3, qinv12, qinv13, qinv23, part, 5, firstQ, secondQ, thirdQ);
2494 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[4].fTerms3->Fill(firstQ, secondQ, thirdQ, enhancement);
2495 if(fillIndex3==0 && ch1==ch2 && ch1==ch3 && fMCcase==kFALSE){
2496 Float_t MomRes3 = fMomRes3DTerm1->GetBinContent(qinv12Bin, qinv13Bin, qinv23Bin);
2497 Double_t K3 = FSICorrelationOmega0(kTRUE, firstQ, secondQ, thirdQ);// K3
2498 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[4].f4VectProdTermsCC3->Fill(Qsum, QsumIn, MomRes3/K3);
2500 MomRes3 = fMomRes3DTerm2->GetBinContent(qinv12Bin, qinv13Bin, qinv23Bin);// Term2 used but equivalent to 3 and 4
2501 Float_t K2 = FSICorrelation2(+1,+1, kRVALUES-1, firstQ);// firstQ used but any Q can be used here since all are on equal footing.
2502 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[4].f4VectProdTermsCC2->Fill(Qsum, QsumIn, MomRes3/K2);
2504 MomRes3 = fMomRes3DTerm5->GetBinContent(qinv12Bin, qinv13Bin, qinv23Bin);
2505 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[4].f4VectProdTermsCC0->Fill(Qsum, QsumIn, MomRes3);// untouched version
2507 //////////////////////////////////////
2508 // Momentum resolution calculation
2509 if(fillIndex3==0 && fMCcase){
2510 Float_t firstQMC=0, secondQMC=0, thirdQMC=0;
2511 ArrangeQs(fillIndex3, key1, key2, key3, ch1, ch2, ch3, qinv12MC, qinv13MC, qinv23MC, part, 5, firstQMC, secondQMC, thirdQMC);
2512 if(ch1==ch2 && ch1==ch3){// same charge
2513 Float_t WInput = MCWeight3D(kTRUE, 5, kMCfixedRbin, kMCfixedLambdabin, firstQMC, secondQMC, thirdQMC);
2514 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[4].fIdeal->Fill(firstQMC, secondQMC, thirdQMC, WInput);
2515 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[4].fSmeared->Fill(firstQ, secondQ, thirdQ, WInput);
2516 }else {// mixed charge
2518 if(bin1==bin2) WInput = MCWeight3D(kFALSE, 5, kMCfixedRbin, kMCfixedLambdabin, firstQMC, secondQMC, thirdQMC);
2519 else WInput = MCWeight3D(kFALSE, 5, kMCfixedRbin, kMCfixedLambdabin, thirdQMC, secondQMC, firstQMC);// thirdQMC is ss in this case. 1st Q argument is ss
2520 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[4].fIdeal->Fill(firstQMC, secondQMC, thirdQMC, WInput);
2521 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[4].fSmeared->Fill(firstQ, secondQ, thirdQ, WInput);
2527 if(fillIndex3 !=0) continue;// only calculate TPN for pi-pi-pi
2528 if(ch1!=ch2 || ch1!=ch3) continue;// only calcualte TPN for ss
2530 if(fMCcase) continue;// only calcualte TPN for real data
2532 GetWeight(pVect1, pVect2, weight12, weight12Err);
2533 GetWeight(pVect1, pVect3, weight13, weight13Err);
2534 GetWeight(pVect2, pVect3, weight23, weight23Err);
2535 if(sqrt(fabs(weight12*weight13*weight23)) > 1.0) continue;// weight should never be larger than 1
2538 // Coul correlations from Wave-functions
2539 for(Int_t rIter=0; rIter<kRVALUES; rIter++){// 3fm to 8fm
2540 for(Int_t myDampIt=0; myDampIt<kNDampValues; myDampIt++){// 0.3 to 0.6
2541 Float_t myDamp = fDampStart + (fDampStep)*myDampIt;
2542 Int_t denIndex = rIter*kNDampValues + myDampIt;
2543 Int_t momResIndex = denIndex;
2545 Float_t coulCorr12 = FSICorrelation2(+1,+1, rIter, qinv12);
2546 Float_t coulCorr13 = FSICorrelation2(+1,+1, rIter, qinv13);
2547 Float_t coulCorr23 = FSICorrelation2(+1,+1, rIter, qinv23);
2548 Int_t momBin12 = fMomResC2->GetYaxis()->FindBin(qinv12);
2549 Int_t momBin13 = fMomResC2->GetYaxis()->FindBin(qinv13);
2550 Int_t momBin23 = fMomResC2->GetYaxis()->FindBin(qinv23);
2552 if(momBin12 >= kQbins) momBin12 = kQbins-1;
2553 if(momBin13 >= kQbins) momBin13 = kQbins-1;
2554 if(momBin23 >= kQbins) momBin23 = kQbins-1;
2556 weight12CC = ((weight12+1)*fMomResC2->GetBinContent(momResIndex+1, momBin12) - myDamp*coulCorr12 - (1-myDamp));
2557 weight12CC /= coulCorr12*myDamp;
2558 weight13CC = ((weight13+1)*fMomResC2->GetBinContent(momResIndex+1, momBin13) - myDamp*coulCorr13 - (1-myDamp));
2559 weight13CC /= coulCorr13*myDamp;
2560 weight23CC = ((weight23+1)*fMomResC2->GetBinContent(momResIndex+1, momBin23) - myDamp*coulCorr23 - (1-myDamp));
2561 weight23CC /= coulCorr23*myDamp;
2563 if(weight12CC < 0 || weight13CC < 0 || weight23CC < 0) {// testing purposes only
2564 if(denIndex==71 && fMbin==0 && ch1==-1) {
2565 weightTotal = sqrt(fabs(weight12CC*weight13CC*weight23CC));
2566 ((TH3F*)fOutputList->FindObject("fTPNRejects"))->Fill(qinv12, qinv13, qinv23, enhancement*weightTotal);
2568 continue;// C2^QS can never be less than unity
2571 weightTotal = sqrt(weight12CC*weight13CC*weight23CC);
2572 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[4].DT[denIndex].fTwoPartNorm->Fill(qinv12, qinv13, qinv23, enhancement*weightTotal);
2573 weightTotal *= fMomRes3DTerm5->GetBinContent(qinv12Bin, qinv13Bin, qinv23Bin);
2574 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[4].DT[denIndex].f4VectProdTwoPartNorm->Fill(Qsum, QsumIn, enhancement*weightTotal);
2577 // Save cpu time and memory by skipping r3 denominator calculation below. den errors are negligible compared to num errors.
2579 if(weightTotal > 0.0001){// tiny numbers cause a Float_ting point exception below
2580 weightTotalErr = pow((weight12Err*coulCorr12)*weight13CC*weight23CC,2);
2581 weightTotalErr += pow(weight12CC*(weight13Err*coulCorr13)*weight23CC,2);
2582 weightTotalErr += pow(weight12CC*weight13CC*(weight23Err*coulCorr23),2);
2583 weightTotalErr /= pow(2*weightTotal,2);
2585 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[4].TwoPartNormErr->Fill(denIndex, q3, enhancement*weightTotalErr);
2595 }// end 3rd particle
2604 }// end of PdensityPairs
2612 ////////////////////////////////////////////////////////
2613 // Pdensity Method with Explicit Loops
2614 if(fPdensityExplicitLoop){
2616 ////////////////////////////////////
2617 // 2nd, 3rd, and 4th order Correlations
2620 for (Int_t i=0; i<myTracks; i++) {
2621 ch1 = Int_t( ((fEvt)->fTracks[i].fCharge + 1)/2. );
2622 pVect1[0] = (fEvt)->fTracks[i].fEaccepted;
2623 pVect1[1] = (fEvt)->fTracks[i].fP[0];
2624 pVect1[2] = (fEvt)->fTracks[i].fP[1];
2625 pVect1[3] = (fEvt)->fTracks[i].fP[2];
2626 key1 = (fEvt)->fTracks[i].fKey;
2629 for(Int_t en2=0; en2<fEventsToMix+1; en2++){
2631 if(en2==0) startbin2=i+1;
2634 for (Int_t j=startbin2; j<(fEvt+en2)->fNtracks; j++) {
2635 ch2 = Int_t( ((fEvt+en2)->fTracks[j].fCharge + 1)/2. );
2636 pVect2[0] = (fEvt+en2)->fTracks[j].fEaccepted;
2637 pVect2[1] = (fEvt+en2)->fTracks[j].fP[0];
2638 pVect2[2] = (fEvt+en2)->fTracks[j].fP[1];
2639 pVect2[3] = (fEvt+en2)->fTracks[j].fP[2];
2640 key2 = (fEvt+en2)->fTracks[j].fKey;
2642 Short_t fillIndex12 = FillIndex2part(key1+key2);
2643 qinv12 = GetQinv(fillIndex12, pVect1, pVect2);
2645 if(qinv12 < fQLowerCut) continue;
2648 // 2-particle part is filled always during pair creator
2651 for(Int_t en3=en2; en3<fEventsToMix+1; en3++){
2653 if(en3==en2) startbin3=j+1;
2658 for (Int_t k=startbin3; k<(fEvt+en3)->fNtracks; k++) {
2659 ch3 = Int_t( ((fEvt+en3)->fTracks[k].fCharge + 1)/2. );
2660 pVect3[0] = (fEvt+en3)->fTracks[k].fEaccepted;
2661 pVect3[1] = (fEvt+en3)->fTracks[k].fP[0];
2662 pVect3[2] = (fEvt+en3)->fTracks[k].fP[1];
2663 pVect3[3] = (fEvt+en3)->fTracks[k].fP[2];
2664 key3 = (fEvt+en3)->fTracks[k].fKey;
2666 Short_t fillIndex3 = FillIndex3part(key1+key2+key3);
2667 Short_t fillIndex13 = FillIndex2part(key1+key3);
2668 qinv13 = GetQinv(fillIndex13, pVect1, pVect3);
2669 Short_t fillIndex23 = FillIndex2part(key2+key3);
2670 qinv23 = GetQinv(fillIndex23, pVect2, pVect3);
2673 if(qinv13 < fQLowerCut) continue;
2674 if(qinv23 < fQLowerCut) continue;
2677 q3 = sqrt(pow(qinv12,2) + pow(qinv13,2) + pow(qinv23,2));
2679 Short_t normBin12 = SetNormBin(fillIndex12);
2680 Short_t normBin13 = SetNormBin(fillIndex13);
2681 Short_t normBin23 = SetNormBin(fillIndex23);
2684 if(en3==0 && en2==0) {// 123
2685 SetFillBins3(fillIndex3, key1, key2, key3, ch1, ch2, ch3, 0, bin1, bin2, bin3, fDummyB, fDummyB, fDummyB);
2687 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[0].fExplicit3->Fill(q3);// 123
2689 if((qinv12>=fNormQcutLow[normBin12]) && (qinv13>=fNormQcutLow[normBin13]) && (qinv23>=fNormQcutLow[normBin23])) {
2690 if((qinv12<fNormQcutHigh[normBin12]) && (qinv13<fNormQcutHigh[normBin13]) && (qinv23<fNormQcutHigh[normBin23])) {
2691 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[0].fNormEx3->Fill(0.);
2695 }else if((en2==0 && en3==1) ) {// 12-3, 13-2, 23-1
2698 Bool_t fill2=kFALSE, fill3=kFALSE, fill4=kFALSE;
2699 SetFillBins3(fillIndex3, key1, key2, key3, ch1, ch2, ch3, 1, bin1, bin2, bin3, fill2, fill3, fill4);
2703 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[1].fExplicit3->Fill(q3, gFact);// 12
2704 if((qinv12>=fNormQcutLow[normBin12]) && (qinv13>=fNormQcutLow[normBin13]) && (qinv23>=fNormQcutLow[normBin23])) {
2705 if((qinv12<fNormQcutHigh[normBin12]) && (qinv13<fNormQcutHigh[normBin13]) && (qinv23<fNormQcutHigh[normBin23])) {
2706 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[1].fNormEx3->Fill(0.);
2711 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[2].fExplicit3->Fill(q3, gFact);// 12
2712 if((qinv12>=fNormQcutLow[normBin12]) && (qinv13>=fNormQcutLow[normBin13]) && (qinv23>=fNormQcutLow[normBin23])) {
2713 if((qinv12<fNormQcutHigh[normBin12]) && (qinv13<fNormQcutHigh[normBin13]) && (qinv23<fNormQcutHigh[normBin23])) {
2714 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[2].fNormEx3->Fill(0.);
2719 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[3].fExplicit3->Fill(q3, gFact);// 12
2720 if((qinv12>=fNormQcutLow[normBin12]) && (qinv13>=fNormQcutLow[normBin13]) && (qinv23>=fNormQcutLow[normBin23])) {
2721 if((qinv12<fNormQcutHigh[normBin12]) && (qinv13<fNormQcutHigh[normBin13]) && (qinv23<fNormQcutHigh[normBin23])) {
2722 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[3].fNormEx3->Fill(0.);
2727 }else if(en2==1 && en3==2){// all uncorrelated events
2728 SetFillBins3(fillIndex3, key1, key2, key3, ch1, ch2, ch3, 3, bin1, bin2, bin3, fDummyB, fDummyB, fDummyB);
2730 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[4].fExplicit3->Fill(q3);
2731 if((qinv12>=fNormQcutLow[normBin12]) && (qinv13>=fNormQcutLow[normBin13]) && (qinv23>=fNormQcutLow[normBin23])) {
2732 if((qinv12<fNormQcutHigh[normBin12]) && (qinv13<fNormQcutHigh[normBin13]) && (qinv23<fNormQcutHigh[normBin23])) {
2733 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[4].fNormEx3->Fill(0.);
2736 Short_t qCutBin12 = SetQcutBin(fillIndex12);
2737 Short_t qCutBin13 = SetQcutBin(fillIndex13);
2738 Short_t qCutBin23 = SetQcutBin(fillIndex23);
2740 if( (qinv12 < fQcut[qCutBin12]) || (qinv13 < fQcut[qCutBin13]) || (qinv23 < fQcut[qCutBin23])){
2743 if(qinv12<fQcut[qCutBin12]) nUnderCut++;
2744 if(qinv13<fQcut[qCutBin13]) nUnderCut++;
2745 if(qinv23<fQcut[qCutBin23]) nUnderCut++;
2763 }// End of PdensityExplicit
2768 // Post output data.
2769 PostData(1, fOutputList);
2772 //________________________________________________________________________
2773 void AliChaoticity::Terminate(Option_t *)
2775 // Called once at the end of the query
2780 //________________________________________________________________________
2781 Bool_t AliChaoticity::AcceptPair(AliChaoticityTrackStruct first, AliChaoticityTrackStruct second)
2784 if(fabs(first.fEta-second.fEta) > fMinSepTPCEntranceEta) return kTRUE;
2786 // propagate through B field to r=1m
2787 Float_t phi1 = first.fPhi - asin(first.fCharge*(0.1*fBfield)*0.15/first.fPt);// 0.15 for D=1m
2788 if(phi1 > 2*PI) phi1 -= 2*PI;
2789 if(phi1 < 0) phi1 += 2*PI;
2790 Float_t phi2 = second.fPhi - asin(second.fCharge*(0.1*fBfield)*0.15/second.fPt);// 0.15 for D=1m
2791 if(phi2 > 2*PI) phi2 -= 2*PI;
2792 if(phi2 < 0) phi2 += 2*PI;
2794 Float_t deltaphi = phi1 - phi2;
2795 if(deltaphi > PI) deltaphi -= 2*PI;
2796 if(deltaphi < -PI) deltaphi += 2*PI;
2797 deltaphi = fabs(deltaphi);
2799 //cout<<deltaphi<<" "<<fMinSepTPCEntrancePhi<<" "<<fMinSepTPCEntranceEta<<endl;
2800 if(deltaphi < fMinSepTPCEntrancePhi) return kFALSE;// Min Separation
2802 // propagate through B field to r=1.6m
2803 phi1 = first.fPhi - asin(first.fCharge*(0.1*fBfield)*0.24/first.fPt);// mine. 0.24 for D=1.6m
2804 if(phi1 > 2*PI) phi1 -= 2*PI;
2805 if(phi1 < 0) phi1 += 2*PI;
2806 phi2 = second.fPhi - asin(second.fCharge*(0.1*fBfield)*0.24/second.fPt);// mine. 0.24 for D=1.6m
2807 if(phi2 > 2*PI) phi2 -= 2*PI;
2808 if(phi2 < 0) phi2 += 2*PI;
2810 deltaphi = phi1 - phi2;
2811 if(deltaphi > PI) deltaphi -= 2*PI;
2812 if(deltaphi < -PI) deltaphi += 2*PI;
2813 deltaphi = fabs(deltaphi);
2815 if(deltaphi < fMinSepTPCEntrancePhi) return kFALSE;// Min Separation
2820 Int_t ncl1 = first.fClusterMap.GetNbits();
2821 Int_t ncl2 = second.fClusterMap.GetNbits();
2822 Int_t sumCls = 0; Int_t sumSha = 0; Int_t sumQ = 0;
2823 Double_t shfrac = 0; Double_t qfactor = 0;
2824 for(Int_t imap = 0; imap < ncl1 && imap < ncl2; imap++) {
2825 if (first.fClusterMap.TestBitNumber(imap) && second.fClusterMap.TestBitNumber(imap)) {// Both clusters
2826 if (first.fSharedMap.TestBitNumber(imap) && second.fSharedMap.TestBitNumber(imap)) { // Shared
2830 else {sumQ--; sumCls+=2;}
2832 else if (first.fClusterMap.TestBitNumber(imap) || second.fClusterMap.TestBitNumber(imap)) {// Non shared
2837 qfactor = sumQ*1.0/sumCls;
2838 shfrac = sumSha*1.0/sumCls;
2841 if(qfactor > fShareQuality || shfrac > fShareFraction) return kFALSE;
2848 //________________________________________________________________________
2849 Float_t AliChaoticity::GamovFactor(Int_t chargeBin1, Int_t chargeBin2, Float_t qinv)
2851 Float_t arg = G_Coeff/qinv;
2853 if(chargeBin1==chargeBin2) return (exp(arg)-1)/(arg);
2854 else {return (exp(-arg)-1)/(-arg);}
2857 //________________________________________________________________________
2858 void AliChaoticity::Shuffle(Int_t *iarr, Int_t i1, Int_t i2)
2862 for (Int_t i = i1; i < i2+1; i++) {
2863 j = (Int_t) (gRandom->Rndm() * a);
2869 //________________________________________________________________________
2870 Short_t AliChaoticity::FillIndex2part(Short_t key){
2872 if(key==2) return 0;// pi-pi
2873 else if(key==11) return 1;// pi-k
2874 else if(key==101) return 2;// pi-p
2875 else if(key==20) return 3;// k-k
2876 else if(key==110) return 4;// k-p
2877 else return 5;// p-p
2879 //________________________________________________________________________
2880 Short_t AliChaoticity::FillIndex3part(Short_t key){
2882 if(key==3) return 0;// pi-pi-pi
2883 else if(key==12) return 1;// pi-pi-k
2884 else if(key==21) return 2;// k-k-pi
2885 else if(key==102) return 3;// pi-pi-p
2886 else if(key==201) return 4;// p-p-pi
2887 else if(key==111) return 5;// pi-k-p
2888 else if(key==30) return 6;// k-k-k
2889 else if(key==120) return 7;// k-k-p
2890 else if(key==210) return 8;// p-p-k
2891 else return 9;// p-p-p
2894 //________________________________________________________________________
2895 Short_t AliChaoticity::SetQcutBin(Short_t fi){// fi=FillIndex
2896 if(fi <= 2) return 0;
2897 else if(fi==3) return 1;
2900 //________________________________________________________________________
2901 Short_t AliChaoticity::SetNormBin(Short_t fi){// fi=FillIndex
2903 else if(fi <= 2) return 1;
2906 //________________________________________________________________________
2907 void AliChaoticity::SetFillBins2(Short_t fi, Short_t key1, Short_t key2, Int_t c1, Int_t c2, Int_t &b1, Int_t &b2){
2909 if(fi==0 || fi==3 || fi==5){// Identical species
2910 if((c1+c2)==1) {b1=0; b2=1;}// Re-assign to merge degenerate histos
2911 else {b1=c1; b2=c2;}
2912 }else {// Mixed species
2913 if(key1 < key2) { b1=c1; b2=c2;}
2914 else {b1=c2; b2=c1;}
2918 //________________________________________________________________________
2919 void AliChaoticity::SetFillBins3(Short_t fi, Short_t key1, Short_t key2, Short_t key3, 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){
2922 // seSS, seSK, SE_keysum only used to determine which terms to fill (only used for terms 2-4)
2925 Short_t seKeySum=0;// only used for pi-k-p case
2926 if(part==1) {// default case (irrelevant for term 1 and term 5)
2927 if(c1==c2) seSS=kTRUE;
2928 if(key1==key2) seSK=kTRUE;
2929 seKeySum = key1+key2;
2932 if(c1==c3) seSS=kTRUE;
2933 if(key1==key3) seSK=kTRUE;
2934 seKeySum = key1+key3;
2938 // fill2, fill3, fill4 are only used for Cumulant Terms 2,3,4
2940 if(fi==0 || fi==6 || fi==9){// Identical species
2941 if( (c1+c2+c3)==1) {
2942 b1=0; b2=0; b3=1;// Re-assign to merge degenerate histos
2944 if(seSS) fill2=kTRUE;
2945 else {fill3=kTRUE; fill4=kTRUE;}
2947 }else if( (c1+c2+c3)==2) {
2950 if(!seSS) {fill2=kTRUE; fill3=kTRUE;}
2954 b1=c1; b2=c2; b3=c3;
2955 fill2=kTRUE; fill3=kTRUE; fill4=kTRUE;
2957 }else if(fi != 5){// all the rest except pi-k-p
2960 if( (c1+c2)==1) {b1=0; b2=1;}
2961 else {b1=c1; b2=c2;}
2962 }else if(key1==key3){
2964 if( (c1+c3)==1) {b1=0; b2=1;}
2965 else {b1=c1; b2=c3;}
2966 }else {// Key2==Key3
2968 if( (c2+c3)==1) {b1=0; b2=1;}
2969 else {b1=c2; b2=c3;}
2971 //////////////////////////////
2972 if(seSK) fill2=kTRUE;// Same keys from Same Event
2973 else {// Different keys from Same Event
2974 if( (c1+c2+c3)==1) {
2976 if(seSS) fill3=kTRUE;
2978 }else{fill3=kTRUE; fill4=kTRUE;}// b3=1 so fill both
2979 }else if( (c1+c2+c3)==2) {
2981 if(seSS) fill4=kTRUE;
2983 }else{fill3=kTRUE; fill4=kTRUE;}// b3=0 so fill both
2984 }else{fill3=kTRUE; fill4=kTRUE;}// all same charge so fill both
2986 /////////////////////////////
2987 }else {// pi-k-p (no charge ordering applies since all are unique)
2989 if(key2==10) {b1=c1; b2=c2; b3=c3;}// pi-k-p
2990 else {b1=c1; b2=c3; b3=c2;}// pi-p-k
2992 if(key2==1) {b1=c2; b2=c1; b3=c3;}// k-pi-p
2993 else {b1=c3; b2=c1; b3=c2;}// k-p-pi
2995 if(key2==1) {b1=c2; b2=c3; b3=c1;}// p-pi-k
2996 else {b1=c3; b2=c2; b3=c1;}// p-k-pi
2998 ////////////////////////////////////
2999 if(seKeySum==11) fill2=kTRUE;
3000 else if(seKeySum==101) fill3=kTRUE;
3002 ////////////////////////////////////
3006 //________________________________________________________________________
3007 void AliChaoticity::ArrangeQs(Short_t fi, Short_t key1, Short_t key2, Short_t key3, Int_t c1, Int_t c2, Int_t c3, Float_t q12, Float_t q13, Float_t q23, Short_t part, Short_t term, Float_t &fQ, Float_t &sQ, Float_t &tQ){
3009 // for terms 2-4: start by setting q12(part 1) or q13(part 2)
3010 if(fi==0 || fi==6 || fi==9){// Identical species
3011 if( (c1+c2+c3)==1) {// fQ=ss, sQ=os, tQ=os
3012 if(term==1 || term==5){
3013 if(c1==c2) {fQ=q12; sQ=q13; tQ=q23;}
3014 else if(c1==c3) {fQ=q13; sQ=q12; tQ=q23;}
3015 else {fQ=q23; sQ=q12; tQ=q13;}
3016 }else if(term==2 && part==1){
3017 fQ=q12; sQ=q13; tQ=q23;
3018 }else if(term==2 && part==2){
3019 fQ=q13; sQ=q12; tQ=q23;
3020 }else if(term==3 && part==1){
3022 if(c1==c3) {fQ=q13; tQ=q23;}
3023 else {fQ=q23; tQ=q13;}
3024 }else if(term==3 && part==2){
3026 if(c1==c2) {fQ=q12; tQ=q23;}
3027 else {fQ=q23; tQ=q12;}
3028 }else if(term==4 && part==1){
3030 if(c1==c3) {fQ=q13; sQ=q23;}
3031 else {fQ=q23; sQ=q13;}
3032 }else if(term==4 && part==2){
3034 if(c1==c2) {fQ=q12; sQ=q23;}
3035 else {fQ=q23; sQ=q12;}
3036 }else cout<<"problem!!!!!!!!!!!!!"<<endl;
3037 }else if( (c1+c2+c3)==2) {// fQ=os, sQ=os, tQ=ss
3038 if(term==1 || term==5){
3039 if(c1==c2) {tQ=q12; sQ=q13; fQ=q23;}
3040 else if(c1==c3) {tQ=q13; sQ=q12; fQ=q23;}
3041 else {tQ=q23; sQ=q12; fQ=q13;}
3042 }else if(term==2 && part==1){
3044 if(c1==c3) {tQ=q13; sQ=q23;}
3045 else {tQ=q23; sQ=q13;}
3046 }else if(term==2 && part==2){
3048 if(c1==c2) {tQ=q12; sQ=q23;}
3049 else {tQ=q23; sQ=q12;}
3050 }else if(term==3 && part==1){
3052 if(c1==c3) {tQ=q13; fQ=q23;}
3053 else {tQ=q23; fQ=q13;}
3054 }else if(term==3 && part==2){
3056 if(c1==c2) {tQ=q12; fQ=q23;}
3057 else {tQ=q23; fQ=q12;}
3058 }else if(term==4 && part==1){
3059 tQ=q12; sQ=q13; fQ=q23;
3060 }else if(term==4 && part==2){
3061 tQ=q13; sQ=q12; fQ=q23;
3062 }else cout<<"problem!!!!!!!!!!!!!"<<endl;
3063 }else {// fQ=ss, sQ=ss, tQ=ss
3064 if(term==1 || term==5) {fQ=q12; sQ=q13; tQ=q23;}
3065 else if(term==2 && part==1) {fQ=q12; sQ=q13; tQ=q23;}
3066 else if(term==2 && part==2) {fQ=q13; sQ=q12; tQ=q23;}
3067 else if(term==3 && part==1) {sQ=q12; fQ=q13; tQ=q23;}
3068 else if(term==3 && part==2) {sQ=q13; fQ=q12; tQ=q23;}
3069 else if(term==4 && part==1) {tQ=q12; fQ=q13; sQ=q23;}
3070 else if(term==4 && part==2) {tQ=q13; fQ=q12; sQ=q23;}
3072 }else if(fi != 5){// all the rest except pi-k-p
3076 // cases not explicity shown below are not possible
3077 if(term==1 || term==5) {sQ=q13; tQ=q23;}
3078 else if(term==2 && part==1) {sQ=q13; tQ=q23;}
3079 else if(term==3 && part==2) {sQ=q13; tQ=q23;}
3080 else if(term==4 && part==2) {tQ=q13; sQ=q23;}
3081 else cout<<"problem!!!!!!!!!!!!!"<<endl;
3083 if(c1==c3) {sQ=q13; tQ=q23;}
3084 else {sQ=q23; tQ=q13;}
3086 if(c1==c3) {tQ=q13; sQ=q23;}
3087 else {tQ=q23; sQ=q13;}
3089 }else if(key1==key3){
3092 // cases not explicity shown below are not possible
3093 if(term==1 || term==5) {sQ=q12; tQ=q23;}
3094 else if(term==2 && part==2) {sQ=q12; tQ=q23;}
3095 else if(term==3 && part==1) {sQ=q12; tQ=q23;}
3096 else if(term==4 && part==1) {tQ=q12; sQ=q23;}
3097 else cout<<"problem!!!!!!!!!!!!!!!!!!!!!!"<<endl;
3099 if(c1==c2) {sQ=q12; tQ=q23;}
3100 else {sQ=q23; tQ=q12;}
3102 if(c1==c2) {tQ=q12; sQ=q23;}
3103 else {tQ=q23; sQ=q12;}
3105 }else {// key2==key3
3108 // cases not explicity shown below are not possible
3109 if(term==1 || term==5) {sQ=q12; tQ=q13;}
3110 else if(term==3 && part==1) {sQ=q12; tQ=q13;}
3111 else if(term==3 && part==2) {sQ=q13; tQ=q12;}
3112 else if(term==4 && part==1) {tQ=q12; sQ=q13;}
3113 else if(term==4 && part==2) {tQ=q13; sQ=q12;}
3114 else cout<<"problem!!!!!!!!!!!!!!!!!!!!!!"<<endl;
3116 if(c1==c2) {sQ=q12; tQ=q13;}
3117 else {sQ=q13; tQ=q12;}
3119 if(c1==c2) {tQ=q12; sQ=q13;}
3120 else {tQ=q13; sQ=q12;}
3125 if(key2==10) {fQ=q12; sQ=q13; tQ=q23;}// pi-k-p
3126 else {fQ=q13; sQ=q12; tQ=q23;}// pi-p-k
3128 if(key2==1) {fQ=q12; sQ=q23; tQ=q13;}// k-pi-p
3129 else {fQ=q13; sQ=q23; tQ=q12;}// k-p-pi
3131 if(key2==1) {fQ=q23; sQ=q12; tQ=q13;}// p-pi-k
3132 else {fQ=q23; sQ=q13; tQ=q12;}// p-k-pi
3139 //________________________________________________________________________
3140 Float_t AliChaoticity::GetQinv(Short_t fi, Float_t track1[], Float_t track2[]){
3144 if(fi==0 || fi==3 || fi==5){// identical masses
3145 qinv = sqrt( pow(track1[1]-track2[1],2) + pow(track1[2]-track2[2],2) + pow(track1[3]-track2[3],2) - pow(track1[0]-track2[0],2));
3146 }else{// different masses
3147 Float_t px = track1[1] + track2[1];
3148 Float_t py = track1[2] + track2[2];
3149 Float_t pz = track1[3] + track2[3];
3150 Float_t pSquared = pow(track1[0]+track2[0],2) - px*px - py*py - pz*pz;
3151 Float_t deltaDOTsum = (track1[0]-track2[0])*(track1[0]+track2[0]);
3152 deltaDOTsum -= (track1[1]-track2[1])*px + (track1[2]-track2[2])*py + (track1[3]-track2[3])*pz;
3154 qinv = pow( (track1[1]-track2[1]) - deltaDOTsum*px/(pSquared),2);
3155 qinv += pow( (track1[2]-track2[2]) - deltaDOTsum*py/(pSquared),2);
3156 qinv += pow( (track1[3]-track2[3]) - deltaDOTsum*pz/(pSquared),2);
3157 qinv -= pow( (track1[0]-track2[0]) - deltaDOTsum*(track1[0]+track2[0])/(pSquared),2);
3164 //________________________________________________________________________
3165 void AliChaoticity::GetQosl(Float_t track1[], Float_t track2[], Float_t& qout, Float_t& qside, Float_t& qlong){
3167 Float_t p0 = track1[0] + track2[0];
3168 Float_t px = track1[1] + track2[1];
3169 Float_t py = track1[2] + track2[2];
3170 Float_t pz = track1[3] + track2[3];
3172 Float_t mt = sqrt(p0*p0 - pz*pz);
3173 Float_t pt = sqrt(px*px + py*py);
3175 Float_t v0 = track1[0] - track2[0];
3176 Float_t vx = track1[1] - track2[1];
3177 Float_t vy = track1[2] - track2[2];
3178 Float_t vz = track1[3] - track2[3];
3180 qout = (px*vx + py*vy)/pt;
3181 qside = (px*vy - py*vx)/pt;
3182 qlong = (p0*vz - pz*v0)/mt;
3184 //________________________________________________________________________
3185 void AliChaoticity::SetWeightArrays(Bool_t legoCase, TH3F *histos[kKbinsT][kCentBins]){
3188 for(Int_t mb=0; mb<fMbins; mb++){
3189 for(Int_t edB=0; edB<kEDbins; edB++){
3190 for(Int_t tKbin=0; tKbin<kKbinsT; tKbin++){
3191 for(Int_t yKbin=0; yKbin<kKbinsY; yKbin++){
3193 for(Int_t qobin=1; qobin<=kQbinsWeights; qobin++){
3194 for(Int_t qsbin=1; qsbin<=kQbinsWeights; qsbin++){
3195 for(Int_t qlbin=1; qlbin<=kQbinsWeights; qlbin++){
3197 fNormWeight[mb][edB][tKbin][yKbin][qobin-1][qsbin-1][qlbin-1] = histos[tKbin][mb]->GetBinContent(qobin, qsbin, qlbin);
3198 fNormWeightErr[mb][edB][tKbin][yKbin][qobin-1][qsbin-1][qlbin-1] = histos[tKbin][mb]->GetBinError(qobin, qsbin, qlbin);
3210 for(Int_t mb=0; mb<fMbins; mb++){
3211 for(Int_t edB=0; edB<kEDbins; edB++){
3212 for(Int_t tKbin=0; tKbin<kKbinsT; tKbin++){
3213 for(Int_t yKbin=0; yKbin<kKbinsY; yKbin++){
3215 for(Int_t qobin=1; qobin<=kQbinsWeights; qobin++){
3216 for(Int_t qsbin=1; qsbin<=kQbinsWeights; qsbin++){
3217 for(Int_t qlbin=1; qlbin<=kQbinsWeights; qlbin++){
3219 fNormWeight[mb][edB][tKbin][yKbin][qobin-1][qsbin-1][qlbin-1] = 0;
3220 fNormWeightErr[mb][edB][tKbin][yKbin][qobin-1][qsbin-1][qlbin-1] = 0;
3232 TFile *wFile = new TFile("WeightFile.root","READ");
3233 if(!wFile->IsOpen()) {cout<<"No Weight File!!!!!!!!!!"<<endl; return;}
3234 else cout<<"Good Weight File Found!"<<endl;
3236 for(Int_t tKbin=0; tKbin<kKbinsT; tKbin++){
3237 for(Int_t yKbin=0; yKbin<kKbinsY; yKbin++){
3238 for(Int_t mb=0; mb<fMbins; mb++){
3239 for(Int_t edB=0; edB<kEDbins; edB++){
3241 TString *name = new TString("Weight_Kt_");
3243 name->Append("_Ky_");
3245 name->Append("_M_");
3247 name->Append("_ED_");
3250 TH3F *fTempHisto = (TH3F*)wFile->Get(name->Data());
3252 for(Int_t qobin=1; qobin<=kQbinsWeights; qobin++){
3253 for(Int_t qsbin=1; qsbin<=kQbinsWeights; qsbin++){
3254 for(Int_t qlbin=1; qlbin<=kQbinsWeights; qlbin++){
3256 fNormWeight[mb][edB][tKbin][yKbin][qobin-1][qsbin-1][qlbin-1] = fTempHisto->GetBinContent(qobin, qsbin, qlbin);
3257 fNormWeightErr[mb][edB][tKbin][yKbin][qobin-1][qsbin-1][qlbin-1] = fTempHisto->GetBinError(qobin, qsbin, qlbin);
3270 cout<<"Done reading weight file"<<endl;
3273 //________________________________________________________________________
3274 void AliChaoticity::GetWeight(Float_t track1[], Float_t track2[], Float_t& wgt, Float_t& wgtErr){
3276 Float_t kt=sqrt( pow(track1[1]+track2[1],2) + pow(track1[2]+track2[2],2))/2.;
3277 Float_t ky=0;// central rapidity
3279 Float_t qOut=0,qSide=0,qLong=0;
3280 GetQosl(track1, track2, qOut, qSide, qLong);
3282 qSide = fabs(qSide);
3283 qLong = fabs(qLong);
3286 if(kt < fKmeanT[0]) {fKtbinL=0; fKtbinH=0;}
3287 else if(kt >= fKmeanT[kKbinsT-1]) {fKtbinL=kKbinsT-1; fKtbinH=kKbinsT-1;}
3289 for(Int_t i=0; i<kKbinsT-1; i++){
3290 if((kt >= fKmeanT[i]) && (kt < fKmeanT[i+1])) {fKtbinL=i; fKtbinH=i+1; break;}
3294 if(ky < fKmeanY[0]) {fKybinL=0; fKybinH=0;}
3295 else if(ky >= fKmeanY[kKbinsY-1]) {fKybinL=kKbinsY-1; fKybinH=kKbinsY-1;}
3297 for(Int_t i=0; i<kKbinsY-1; i++){
3298 if((ky >= fKmeanY[i]) && (ky < fKmeanY[i+1])) {fKybinL=i; fKybinH=i+1; break;}
3303 if(qOut < fQmean[0]) {fQobinL=0; fQobinH=0;}
3304 else if(qOut >= fQmean[kQbinsWeights-1]) {fQobinL=kQbinsWeights-1; fQobinH=kQbinsWeights-1;}
3306 for(Int_t i=0; i<kQbinsWeights-1; i++){
3307 if((qOut >= fQmean[i]) && (qOut < fQmean[i+1])) {fQobinL=i; fQobinH=i+1; break;}
3311 if(qSide < fQmean[0]) {fQsbinL=0; fQsbinH=0;}
3312 else if(qSide >= fQmean[kQbinsWeights-1]) {fQsbinL=kQbinsWeights-1; fQsbinH=kQbinsWeights-1;}
3314 for(Int_t i=0; i<kQbinsWeights-1; i++){
3315 if((qSide >= fQmean[i]) && (qSide < fQmean[i+1])) {fQsbinL=i; fQsbinH=i+1; break;}
3319 if(qLong < fQmean[0]) {fQlbinL=0; fQlbinH=0;}
3320 else if(qLong >= fQmean[kQbinsWeights-1]) {fQlbinL=kQbinsWeights-1; fQlbinH=kQbinsWeights-1;}
3322 for(Int_t i=0; i<kQbinsWeights-1; i++){
3323 if((qLong >= fQmean[i]) && (qLong < fQmean[i+1])) {fQlbinL=i; fQlbinH=i+1; break;}
3329 Float_t min = fNormWeight[fMbin][0][fKtbinL][fKybinL][fQobinH][fQsbinH][fQlbinH];
3330 Float_t minErr = fNormWeightErr[fMbin][0][fKtbinL][fKybinL][fQobinH][fQsbinH][fQlbinH];
3335 deltaW += (fNormWeight[fMbin][0][fKtbinH][fKybinL][fQobinH][fQsbinH][fQlbinH] - min)*(kt-fKmeanT[fKtbinL])/((fKstepT[fKtbinL]+fKstepT[fKtbinH])/2.);
3337 deltaW += (fNormWeight[fMbin][0][fKtbinL][fKybinH][fQobinH][fQsbinH][fQlbinH] - min)*(ky-fKmeanY[fKybinL])/((fKstepY[fKybinL]+fKstepY[fKybinH])/2.);
3339 deltaW += (fNormWeight[fMbin][0][fKtbinL][fKybinL][fQobinL][fQsbinH][fQlbinH] - min)*(qOut-fQmean[fQobinL])/fQstepWeights;
3341 deltaW += (fNormWeight[fMbin][0][fKtbinL][fKybinL][fQobinH][fQsbinL][fQlbinH] - min)*(qSide-fQmean[fQsbinL])/fQstepWeights;
3343 deltaW += (fNormWeight[fMbin][0][fKtbinL][fKybinL][fQobinH][fQsbinH][fQlbinL] - min)*(qLong-fQmean[fQlbinL])/fQstepWeights;
3351 // Denominator errors negligible compared to numerator so do not waste cpu time below.
3352 Float_t deltaWErr=0;
3355 deltaWErr += (fNormWeightErr[fMbin][0][fKtbinH][fKybinL][fQobinH][fQsbinH][fQlbinH] - minErr)*(kt-fKmeanT[fKtbinL])/((fKstepT[fKtbinL]+fKstepT[fKtbinH])/2.);
3357 deltaWErr += (fNormWeightErr[fMbin][0][fKtbinL][fKybinH][fQobinH][fQsbinH][fQlbinH] - minErr)*(ky-fKmeanY[fKybinL])/((fKstepY[fKybinL]+fKstepY[fKybinH])/2.);
3359 deltaWErr += (fNormWeightErr[fMbin][0][fKtbinL][fKybinL][fQobinL][fQsbinH][fQlbinH] - minErr)*(qOut-fQmean[fQobinL])/fQstepWeights;
3361 deltaWErr += (fNormWeightErr[fMbin][0][fKtbinL][fKybinL][fQobinH][fQsbinL][fQlbinH] - minErr)*(qSide-fQmean[fQsbinL])/fQstepWeights;
3363 deltaWErr += (fNormWeightErr[fMbin][0][fKtbinL][fKybinL][fQobinH][fQsbinH][fQlbinL] - minErr)*(qLong-fQmean[fQlbinL])/fQstepWeights;
3365 wgtErr = minErr + deltaWErr;
3370 //________________________________________________________________________
3371 Float_t AliChaoticity::MCWeight(Int_t charge1, Int_t charge2, Int_t rIndex, Int_t dampIndex, Float_t qinv){
3373 Float_t radius = Float_t(rIndex+3.)/0.19733;// convert to GeV
3374 if(rIndex==kRVALUES-1) radius = 6.0/0.19733;// Therminator default radius
3375 Float_t myDamp = fDampStart + (fDampStep)*dampIndex;
3376 Float_t coulCorr12 = FSICorrelation2(charge1, charge2, rIndex, qinv);
3377 if(charge1==charge2){
3378 return ((1-myDamp) + myDamp*(1 + exp(-pow(qinv*radius,2)))*coulCorr12);
3380 return ((1-myDamp) + myDamp*coulCorr12);
3384 //________________________________________________________________________
3385 Float_t AliChaoticity::MCWeight3D(Bool_t SameCharge, Int_t term, Int_t rIndex, Int_t dampIndex, Float_t q12, Float_t q13, Float_t q23){
3386 if(term==5) return 1.0;
3388 Float_t radius = (3. + rIndex)/0.19733;//starts at 5fm. convert to GeV
3389 Float_t myDamp = fDampStart + (fDampStep)*dampIndex;
3390 Float_t fc = sqrt(myDamp);
3391 if(SameCharge){// all three of the same charge
3392 Float_t coulCorr12 = FSICorrelation2(+1,+1, rIndex, q12);// K2
3393 Float_t coulCorr13 = FSICorrelation2(+1,+1, rIndex, q13);// K2
3394 Float_t coulCorr23 = FSICorrelation2(+1,+1, rIndex, q23);// K2
3397 Float_t c3QS = 1 + exp(-pow(q12*radius,2)) + exp(-pow(q13*radius,2)) + exp(-pow(q23*radius,2));
3398 c3QS += 2*exp(-pow(radius,2)*(pow(q12,2) + pow(q13,2) + pow(q23,2))/2.);
3399 Float_t w123 = pow(1-fc,3) + 3*fc*pow(1-fc,2);
3400 w123 += pow(fc,2)*(1-fc)*(1+exp(-pow(q12*radius,2)))*coulCorr12;
3401 w123 += pow(fc,2)*(1-fc)*(1+exp(-pow(q13*radius,2)))*coulCorr13;
3402 w123 += pow(fc,2)*(1-fc)*(1+exp(-pow(q23*radius,2)))*coulCorr23;
3403 w123 += pow(fc,3)*c3QS*FSICorrelationOmega0(kTRUE, q12, q13, q23);
3406 return ((1-myDamp) + myDamp*(1 + exp(-pow(q12*radius,2)))*coulCorr12);
3408 return ((1-myDamp) + myDamp*(1 + exp(-pow(q13*radius,2)))*coulCorr13);
3410 return ((1-myDamp) + myDamp*(1 + exp(-pow(q23*radius,2)))*coulCorr23);
3413 }else{// mixed charge case pair 12 always treated as ss
3414 Float_t coulCorr12 = FSICorrelation2(+1,+1, rIndex, q12);// K2 ss
3415 Float_t coulCorr13 = FSICorrelation2(+1,-1, rIndex, q13);// K2 os
3416 Float_t coulCorr23 = FSICorrelation2(+1,-1, rIndex, q23);// K2 os
3418 Float_t c3QS = 1 + exp(-pow(q12*radius,2));
3419 Float_t w123 = pow(1-fc,3) + 3*fc*pow(1-fc,2);
3420 w123 += pow(fc,2)*(1-fc)*(1+exp(-pow(q12*radius,2)))*coulCorr12;
3421 w123 += pow(fc,2)*(1-fc)*coulCorr13;
3422 w123 += pow(fc,2)*(1-fc)*coulCorr23;
3423 w123 += pow(fc,3)*c3QS*FSICorrelationOmega0(kFALSE, q12, q13, q23);
3426 return ((1-myDamp) + myDamp*(1 + exp(-pow(q12*radius,2)))*coulCorr12);
3428 return ((1-myDamp) + myDamp*coulCorr13);
3430 return ((1-myDamp) + myDamp*coulCorr23);
3435 //________________________________________________________________________
3436 Float_t AliChaoticity::MCWeightOSL(Float_t radius, Float_t myDamp, Float_t Q_out, Float_t Q_side, Float_t Q_long, Float_t qinv){
3437 Int_t rIndex = Int_t(radius+0.001-3);
3438 Float_t coulCorr12 = FSICorrelation2(+1,+1, rIndex, qinv);
3440 return ((1-myDamp) + myDamp*(1 + exp(-pow(radius/0.19733,2)*(Q_out*Q_out+Q_side*Q_side+Q_long*Q_long)))*coulCorr12);
3443 //________________________________________________________________________
3444 void AliChaoticity::SetMomResCorrections(Bool_t legoCase, TH2D *temp2D, TH3D *temp3D[5]){
3448 fMomResC2 = (TH2D*)temp2D->Clone();
3449 fMomRes3DTerm1=(TH3D*)temp3D[0]->Clone();
3450 fMomRes3DTerm2=(TH3D*)temp3D[1]->Clone();
3451 fMomRes3DTerm3=(TH3D*)temp3D[2]->Clone();
3452 fMomRes3DTerm4=(TH3D*)temp3D[3]->Clone();
3453 fMomRes3DTerm5=(TH3D*)temp3D[4]->Clone();
3455 fMomResC2->SetDirectory(0);
3456 fMomRes3DTerm1->SetDirectory(0);
3457 fMomRes3DTerm2->SetDirectory(0);
3458 fMomRes3DTerm3->SetDirectory(0);
3459 fMomRes3DTerm4->SetDirectory(0);
3460 fMomRes3DTerm5->SetDirectory(0);
3463 TFile *momResFile = new TFile("MomResFile.root","READ");
3464 if(!momResFile->IsOpen()) {
3465 cout<<"No momentum resolution file found"<<endl;
3466 AliFatal("No momentum resolution file found. Kill process.");
3467 }else {cout<<"Good Momentum Resolution File Found!"<<endl;}
3469 TH2D *temp2D2 = (TH2D*)momResFile->Get("MomResHisto_pp");
3470 TH3D *temp3Dterm1 = (TH3D*)momResFile->Get("MomResHisto_3d_ppp_term1");
3471 TH3D *temp3Dterm2 = (TH3D*)momResFile->Get("MomResHisto_3d_ppp_term2");
3472 TH3D *temp3Dterm3 = (TH3D*)momResFile->Get("MomResHisto_3d_ppp_term3");
3473 TH3D *temp3Dterm4 = (TH3D*)momResFile->Get("MomResHisto_3d_ppp_term4");
3474 TH3D *temp3Dterm5 = (TH3D*)momResFile->Get("MomResHisto_3d_ppp_term5");
3476 fMomResC2 = (TH2D*)temp2D2->Clone();
3477 fMomRes3DTerm1=(TH3D*)temp3Dterm1->Clone();
3478 fMomRes3DTerm2=(TH3D*)temp3Dterm2->Clone();
3479 fMomRes3DTerm3=(TH3D*)temp3Dterm3->Clone();
3480 fMomRes3DTerm4=(TH3D*)temp3Dterm4->Clone();
3481 fMomRes3DTerm5=(TH3D*)temp3Dterm5->Clone();
3483 fMomResC2->SetDirectory(0);
3484 fMomRes3DTerm1->SetDirectory(0);
3485 fMomRes3DTerm2->SetDirectory(0);
3486 fMomRes3DTerm3->SetDirectory(0);
3487 fMomRes3DTerm4->SetDirectory(0);
3488 fMomRes3DTerm5->SetDirectory(0);
3490 momResFile->Close();
3493 cout<<"Done reading momentum resolution file"<<endl;
3495 //________________________________________________________________________
3496 void AliChaoticity::SetFSICorrelations(Bool_t legoCase, TH2D *temp2D[2], TH3D *temp3D[2]){
3497 // read in 2-particle and 3-particle FSI correlations = K2 & K3
3498 // 2-particle input histo from file is binned in qinv. 3-particle in qinv of each pair
3500 fFSI2SS = (TH2D*)temp2D[0]->Clone();
3501 fFSI2OS = (TH2D*)temp2D[1]->Clone();
3502 fFSIOmega0SS = (TH3D*)temp3D[0]->Clone();
3503 fFSIOmega0OS = (TH3D*)temp3D[1]->Clone();
3505 fFSI2SS->SetDirectory(0);
3506 fFSI2OS->SetDirectory(0);
3507 fFSIOmega0SS->SetDirectory(0);
3508 fFSIOmega0OS->SetDirectory(0);
3510 TFile *fsifile = new TFile("KFile.root","READ");
3511 if(!fsifile->IsOpen()) {
3512 cout<<"No FSI file found"<<endl;
3513 AliFatal("No FSI file found. Kill process.");
3514 }else {cout<<"Good FSI File Found!"<<endl;}
3516 TH2D *temphisto2SS = (TH2D*)fsifile->Get("K2ss");
3517 TH2D *temphisto2OS = (TH2D*)fsifile->Get("K2os");
3518 TH3D *temphisto3SS = (TH3D*)fsifile->Get("K3ss");
3519 TH3D *temphisto3OS = (TH3D*)fsifile->Get("K3os");
3521 fFSI2SS = (TH2D*)temphisto2SS->Clone();
3522 fFSI2OS = (TH2D*)temphisto2OS->Clone();
3523 fFSIOmega0SS = (TH3D*)temphisto3SS->Clone();
3524 fFSIOmega0OS = (TH3D*)temphisto3OS->Clone();
3526 fFSI2SS->SetDirectory(0);
3527 fFSI2SS->SetDirectory(0);
3528 fFSIOmega0SS->SetDirectory(0);
3529 fFSIOmega0OS->SetDirectory(0);
3534 // condition FSI histogram for edge effects
3535 for(Int_t ii=1; ii<=fFSIOmega0SS->GetNbinsX(); ii++){
3536 for(Int_t jj=1; jj<=fFSIOmega0SS->GetNbinsY(); jj++){
3537 for(Int_t kk=1; kk<=fFSIOmega0SS->GetNbinsZ(); kk++){
3539 if(fFSIOmega0SS->GetBinContent(ii,jj,kk) <=0){
3540 Double_t Q12 = fFSIOmega0SS->GetXaxis()->GetBinCenter(ii);
3541 Double_t Q23 = fFSIOmega0SS->GetYaxis()->GetBinCenter(jj);
3542 Double_t Q13 = fFSIOmega0SS->GetZaxis()->GetBinCenter(kk);
3547 Int_t AC=0;//Adjust Counter
3548 Int_t AClimit=10;// maximum bin shift
3549 if(Q12 < sqrt(pow(Q13,2)+pow(Q23,2) - 2*Q13*Q23)) {while(fFSIOmega0SS->GetBinContent(Q12bin, Q23bin, Q13bin) <=0 && AC<AClimit) {Q12bin++; AC++;}}
3550 if(Q12 > sqrt(pow(Q13,2)+pow(Q23,2) + 2*Q13*Q23)) {while(fFSIOmega0SS->GetBinContent(Q12bin, Q23bin, Q13bin) <=0 && AC<AClimit) {Q12bin--; AC++;}}
3552 if(Q13 < sqrt(pow(Q12,2)+pow(Q23,2) - 2*Q12*Q23)) {while(fFSIOmega0SS->GetBinContent(Q12bin, Q23bin, Q13bin) <=0 && AC<AClimit) {Q13bin++; AC++;}}
3553 if(Q13 > sqrt(pow(Q12,2)+pow(Q23,2) + 2*Q12*Q23)) {while(fFSIOmega0SS->GetBinContent(Q12bin, Q23bin, Q13bin) <=0 && AC<AClimit) {Q13bin--; AC++;}}
3555 if(Q23 < sqrt(pow(Q12,2)+pow(Q13,2) - 2*Q12*Q13)) {while(fFSIOmega0SS->GetBinContent(Q12bin, Q23bin, Q13bin) <=0 && AC<AClimit) {Q23bin++; AC++;}}
3556 if(Q23 > sqrt(pow(Q12,2)+pow(Q13,2) + 2*Q12*Q13)) {while(fFSIOmega0SS->GetBinContent(Q12bin, Q23bin, Q13bin) <=0 && AC<AClimit) {Q23bin--; AC++;}}
3558 // Save cpu time by setting empty cell contents (edge effects) to nearest non-zero cell (these cells are not used very often anyway.)
3560 fFSIOmega0SS->SetBinContent(ii,jj,kk, 1.0);
3561 fFSIOmega0OS->SetBinContent(ii,jj,kk, 1.0);
3563 fFSIOmega0SS->SetBinContent(ii,jj,kk, fFSIOmega0SS->GetBinContent(Q12bin, Q23bin, Q13bin));
3564 fFSIOmega0OS->SetBinContent(ii,jj,kk, fFSIOmega0OS->GetBinContent(Q12bin, Q23bin, Q13bin));
3572 cout<<"Done reading FSI file"<<endl;
3574 //________________________________________________________________________
3575 Float_t AliChaoticity::FSICorrelation2(Int_t charge1, Int_t charge2, Int_t rIndex, Float_t qinv){
3576 // returns 2-particle Coulomb correlations = K2
3577 if(rIndex >= kRVALUES) return 1.0;
3578 Int_t qbinL = fFSI2SS->GetYaxis()->FindBin(qinv-fFSI2SS->GetYaxis()->GetBinWidth(1)/2.);
3579 Int_t qbinH = qbinL+1;
3580 if(qbinL <= 0) return 1.0;
3581 if(qbinH > fFSI2SS->GetNbinsY()) return 1.0;
3584 if(charge1==charge2){
3585 slope = fFSI2SS->GetBinContent(rIndex+1, qbinL) - fFSI2SS->GetBinContent(rIndex+1, qbinH);
3586 slope /= fFSI2SS->GetYaxis()->GetBinCenter(qbinL) - fFSI2SS->GetYaxis()->GetBinCenter(qbinH);
3587 return (slope*(qinv - fFSI2SS->GetYaxis()->GetBinCenter(qbinL)) + fFSI2SS->GetBinContent(rIndex+1, qbinL));
3589 slope = fFSI2OS->GetBinContent(rIndex+1, qbinL) - fFSI2OS->GetBinContent(rIndex+1, qbinH);
3590 slope /= fFSI2OS->GetYaxis()->GetBinCenter(qbinL) - fFSI2OS->GetYaxis()->GetBinCenter(qbinH);
3591 return (slope*(qinv - fFSI2OS->GetYaxis()->GetBinCenter(qbinL)) + fFSI2OS->GetBinContent(rIndex+1, qbinL));
3594 //________________________________________________________________________
3595 Double_t AliChaoticity::FSICorrelationOmega0(Bool_t SameCharge, Double_t Q12, Double_t Q13, Double_t Q23){
3596 // remember: Omega0 histogram is in the following order (Q12, Q23, Q13)
3597 // returns 3d 3-particle Coulomb Correlation = K3
3598 Int_t Q12bin = fFSIOmega0SS->GetXaxis()->FindBin(Q12);
3599 Int_t Q13bin = fFSIOmega0SS->GetZaxis()->FindBin(Q13);
3600 Int_t Q23bin = fFSIOmega0SS->GetYaxis()->FindBin(Q23);
3603 if(fFSIOmega0SS->GetBinContent(Q12bin, Q23bin, Q13bin) <=0) return 1.0;
3604 else return fFSIOmega0SS->GetBinContent(Q12bin, Q23bin, Q13bin);// K3
3605 }else{// mixed charge
3606 if(fFSIOmega0OS->GetBinContent(Q12bin, Q23bin, Q13bin) <=0) return 1.0;
3607 else return fFSIOmega0OS->GetBinContent(Q12bin, Q23bin, Q13bin);// K3
3610 //________________________________________________________________________