7 #include "TObjString.h"
15 #include "TProfile2D.h"
20 #include "AliAnalysisTask.h"
21 #include "AliAnalysisManager.h"
24 #include "AliESDEvent.h"
25 #include "AliESDInputHandler.h"
26 #include "AliESDtrackCuts.h"
28 #include "AliAODEvent.h"
29 #include "AliAODInputHandler.h"
30 #include "AliAODMCParticle.h"
31 #include "AliAODTracklets.h"
32 #include "AliAnalysisUtils.h"
34 #include "AliThreePionRadii.h"
37 #define G_Coeff 0.006399 // 2*pi*alpha*M_pion
38 #define kappa3 0.2 // kappa3 Edgeworth coefficient (non-Gaussian features of C2)
39 #define kappa4 0.45 // kappa4 Edgeworth coefficient (non-Gaussian features of C2)
42 // Author: Dhevan Gangadharan
44 ClassImp(AliThreePionRadii)
46 //________________________________________________________________________
47 AliThreePionRadii::AliThreePionRadii():
61 fGenerateSignal(kFALSE),
62 fGeneratorOnly(kFALSE),
63 fPdensityPairCut(kTRUE),
116 fOtherPairLocation1(),
117 fOtherPairLocation2(),
122 // Default constructor
123 for(Int_t mb=0; mb<fMbins; mb++){
124 for(Int_t edB=0; edB<fEDbins; edB++){
125 for(Int_t c1=0; c1<2; c1++){
126 for(Int_t c2=0; c2<2; c2++){
127 for(Int_t sc=0; sc<kSCLimit2; sc++){
128 for(Int_t term=0; term<2; term++){
130 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fExplicit2 = 0x0;
131 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fExplicit2QW = 0x0;
132 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fAvgP = 0x0;
133 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fIdeal = 0x0;
134 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fSmeared = 0x0;
136 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fMCqinv = 0x0;
137 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fMCqinvQW = 0x0;
138 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fPIDpurityDen = 0x0;
139 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fPIDpurityNum = 0x0;
144 for(Int_t c3=0; c3<2; c3++){
145 for(Int_t sc=0; sc<kSCLimit3; sc++){
146 for(Int_t term=0; term<5; term++){
148 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fNorm3 = 0x0;
149 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fTerms3 = 0x0;
150 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fTermsQ3 = 0x0;
151 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fIdeal = 0x0;
152 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fSmeared = 0x0;
163 // Initialize 3-pion FSI histograms
164 for(Int_t i=0; i<10; i++){
170 //________________________________________________________________________
171 AliThreePionRadii::AliThreePionRadii(const Char_t *name)
172 : AliAnalysisTaskSE(name),
185 fGenerateSignal(kFALSE),
186 fGeneratorOnly(kFALSE),
187 fPdensityPairCut(kTRUE),
201 fCentBinHighLimit(1),
222 fMinSepPairEta(0.03),
223 fMinSepPairPhi(0.04),
240 fOtherPairLocation1(),
241 fOtherPairLocation2(),
248 fPdensityPairCut = kTRUE;
251 for(Int_t mb=0; mb<fMbins; mb++){
252 for(Int_t edB=0; edB<fEDbins; edB++){
253 for(Int_t c1=0; c1<2; c1++){
254 for(Int_t c2=0; c2<2; c2++){
255 for(Int_t sc=0; sc<kSCLimit2; sc++){
256 for(Int_t term=0; term<2; term++){
258 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fExplicit2 = 0x0;
259 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fExplicit2QW = 0x0;
260 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fAvgP = 0x0;
261 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fIdeal = 0x0;
262 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fSmeared = 0x0;
264 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fMCqinv = 0x0;
265 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fMCqinvQW = 0x0;
266 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fPIDpurityDen = 0x0;
267 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fPIDpurityNum = 0x0;
271 for(Int_t c3=0; c3<2; c3++){
272 for(Int_t sc=0; sc<kSCLimit3; sc++){
273 for(Int_t term=0; term<5; term++){
275 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fNorm3 = 0x0;
276 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fTerms3 = 0x0;
277 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fTermsQ3 = 0x0;
278 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fIdeal = 0x0;
279 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fSmeared = 0x0;
289 // Initialize 3-pion FSI histograms
290 for(Int_t i=0; i<10; i++){
296 DefineOutput(1, TList::Class());
298 //________________________________________________________________________
299 AliThreePionRadii::AliThreePionRadii(const AliThreePionRadii &obj)
300 : AliAnalysisTaskSE(obj.fname),
304 fOutputList(obj.fOutputList),
305 fPIDResponse(obj.fPIDResponse),
308 fTempStruct(obj.fTempStruct),
309 fRandomNumber(obj.fRandomNumber),
311 fMCcase(obj.fMCcase),
312 fAODcase(obj.fAODcase),
313 fPbPbcase(obj.fPbPbcase),
314 fGenerateSignal(obj.fGenerateSignal),
315 fGeneratorOnly(obj.fGeneratorOnly),
316 fPdensityPairCut(obj.fPdensityPairCut),
318 fFilterBit(obj.fFilterBit),
319 fMaxChi2NDF(obj.fMaxChi2NDF),
320 fMinTPCncls(obj.fMinTPCncls),
321 fBfield(obj.fBfield),
323 fFSIindex(obj.fFSIindex),
326 fMultLimit(obj.fMultLimit),
327 fKt3bins(obj.fKt3bins),
328 fV0Mbinning(obj.fV0Mbinning),
329 fCentBinLowLimit(obj.fCentBinLowLimit),
330 fCentBinHighLimit(obj.fCentBinHighLimit),
331 fTriggerType(obj.fTriggerType),
332 fEventCounter(obj.fEventCounter),
333 fEventsToMix(obj.fEventsToMix),
334 fZvertexBins(obj.fZvertexBins),
337 fQLowerCut(obj.fQLowerCut),
338 fQlimitC2(obj.fQlimitC2),
339 fQbinsC2(obj.fQbinsC2),
342 fKupperBound(obj.fKupperBound),
343 fQupperBound(obj.fQupperBound),
345 fDampStart(obj.fDampStart),
346 fDampStep(obj.fDampStep),
347 fTPCTOFboundry(obj.fTPCTOFboundry),
348 fTOFboundry(obj.fTOFboundry),
349 fSigmaCutTPC(obj.fSigmaCutTPC),
350 fSigmaCutTOF(obj.fSigmaCutTOF),
351 fMinSepPairEta(obj.fMinSepPairEta),
352 fMinSepPairPhi(obj.fMinSepPairPhi),
353 fShareQuality(obj.fShareQuality),
354 fShareFraction(obj.fShareFraction),
355 fTrueMassP(obj.fTrueMassP),
356 fTrueMassPi(obj.fTrueMassPi),
357 fTrueMassK(obj.fTrueMassK),
358 fTrueMassKs(obj.fTrueMassKs),
359 fTrueMassLam(obj.fTrueMassLam),
360 fDummyB(obj.fDummyB),
369 fOtherPairLocation1(),
370 fOtherPairLocation2(),
377 for(Int_t i=0; i<10; i++){
378 fFSI2SS[i]=obj.fFSI2SS[i];
379 fFSI2OS[i]=obj.fFSI2OS[i];
383 //________________________________________________________________________
384 AliThreePionRadii &AliThreePionRadii::operator=(const AliThreePionRadii &obj)
386 // Assignment operator
392 fOutputList = obj.fOutputList;
393 fPIDResponse = obj.fPIDResponse;
396 fTempStruct = obj.fTempStruct;
397 fRandomNumber = obj.fRandomNumber;
399 fMCcase = obj.fMCcase;
400 fAODcase = obj.fAODcase;
401 fPbPbcase = obj.fPbPbcase;
402 fGenerateSignal = obj.fGenerateSignal;
403 fGeneratorOnly = obj.fGeneratorOnly;
404 fPdensityPairCut = obj.fPdensityPairCut;
406 fFilterBit = obj.fFilterBit;
407 fMaxChi2NDF = obj.fMaxChi2NDF;
408 fMinTPCncls = obj.fMinTPCncls;
409 fBfield = obj.fBfield;
411 fFSIindex = obj.fFSIindex;
414 fMultLimit = obj.fMultLimit;
415 fKt3bins = obj.fKt3bins;
416 fV0Mbinning = obj.fV0Mbinning;
417 fCentBinLowLimit = obj.fCentBinLowLimit;
418 fCentBinHighLimit = obj.fCentBinHighLimit;
419 fTriggerType = obj.fTriggerType;
420 fEventCounter = obj.fEventCounter;
421 fEventsToMix = obj.fEventsToMix;
422 fZvertexBins = obj.fZvertexBins;
423 fQLowerCut = obj.fQLowerCut;
424 fQlimitC2 = obj.fQlimitC2;
425 fQbinsC2 = obj.fQbinsC2;
426 fKupperBound = obj.fKupperBound;
427 fQupperBound = obj.fQupperBound;
429 fDampStart = obj.fDampStart;
430 fDampStep = obj.fDampStep;
431 fTPCTOFboundry = obj.fTPCTOFboundry;
432 fTOFboundry = obj.fTOFboundry;
433 fSigmaCutTPC = obj.fSigmaCutTPC;
434 fSigmaCutTOF = obj.fSigmaCutTOF;
435 fMinSepPairEta = obj.fMinSepPairEta;
436 fMinSepPairPhi = obj.fMinSepPairPhi;
437 fShareQuality = obj.fShareQuality;
438 fShareFraction = obj.fShareFraction;
439 fTrueMassP = obj.fTrueMassP;
440 fTrueMassPi = obj.fTrueMassPi;
441 fTrueMassK = obj.fTrueMassK;
442 fTrueMassKs = obj.fTrueMassKs;
443 fTrueMassLam = obj.fTrueMassLam;
444 fDummyB = obj.fDummyB;
447 for(Int_t i=0; i<10; i++){
448 fFSI2SS[i]=obj.fFSI2SS[i];
449 fFSI2OS[i]=obj.fFSI2OS[i];
454 //________________________________________________________________________
455 AliThreePionRadii::~AliThreePionRadii()
458 if(fAOD) delete fAOD;
459 //if(fESD) delete fESD;
460 if(fOutputList) delete fOutputList;
461 if(fPIDResponse) delete fPIDResponse;
463 if(fEvt) delete fEvt;
464 if(fTempStruct) delete [] fTempStruct;
465 if(fRandomNumber) delete fRandomNumber;
467 for(Int_t i=0; i<fMultLimit; i++){
468 if(fPairLocationSE[i]) delete [] fPairLocationSE[i];
469 if(fPairLocationME[i]) delete [] fPairLocationME[i];
470 for(Int_t j=0; j<2; j++){
471 if(fOtherPairLocation1[j][i]) delete [] fOtherPairLocation1[j][i];
472 if(fOtherPairLocation2[j][i]) delete [] fOtherPairLocation2[j][i];
474 for(Int_t j=0; j<3; j++) if(fNormPairSwitch[j][i]) delete [] fNormPairSwitch[j][i];
475 for(Int_t j=0; j<4; j++) if(fPairSplitCut[j][i]) delete [] fPairSplitCut[j][i];
477 for(Int_t i=0; i<kPairLimit; i++) if(fTripletSkip1[i]) delete [] fTripletSkip1[i];
478 for(Int_t i=0; i<2*kPairLimit; i++) if(fTripletSkip2[i]) delete [] fTripletSkip2[i];
479 for(Int_t i=0; i<3; i++) if(fNormPairs[i]) delete [] fNormPairs[i];
481 for(Int_t mb=0; mb<fMbins; mb++){
482 if(fPbPbcase && ((mb < fCentBinLowLimit) || (mb > fCentBinHighLimit))) continue;
483 for(Int_t edB=0; edB<fEDbins; edB++){
484 for(Int_t c1=0; c1<2; c1++){
485 for(Int_t c2=0; c2<2; c2++){
486 for(Int_t sc=0; sc<kSCLimit2; sc++){
487 for(Int_t term=0; term<2; term++){
489 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;
490 if(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fExplicit2QW) delete Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fExplicit2QW;
492 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;
493 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;
495 if(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fMCqinv) delete Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fMCqinv;
496 if(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fMCqinvQW) delete Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fMCqinvQW;
500 for(Int_t c3=0; c3<2; c3++){
501 for(Int_t sc=0; sc<kSCLimit3; sc++){
502 for(Int_t term=0; term<5; term++){
504 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;
505 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;
517 for(Int_t i=0; i<10; i++){
518 if(fFSI2SS[i]) delete fFSI2SS[i];
519 if(fFSI2OS[i]) delete fFSI2OS[i];
523 //________________________________________________________________________
524 void AliThreePionRadii::ParInit()
526 cout<<"AliThreePionRadii MyInit() call"<<endl;
527 cout<<"lego:"<<fLEGO<<" MCcase:"<<fMCcase<<" PbPbcase:"<<fPbPbcase<<" GenSignal:"<<fGenerateSignal<<" CentLow:"<<fCentBinLowLimit<<" CentHigh:"<<fCentBinHighLimit<<" RMax:"<<fRMax<<" FB:"<<fFilterBit<<" MaxChi2/NDF:"<<fMaxChi2NDF<<" MinTPCncls:"<<fMinTPCncls<<" MinPairSepEta:"<<fMinSepPairEta<<" MinPairSepPhi:"<<fMinSepPairPhi<<" NsigTPC:"<<fSigmaCutTPC<<" NsigTOF:"<<fSigmaCutTOF<<endl;
529 fRandomNumber = new TRandom3();
530 fRandomNumber->SetSeed(0);
534 if(fPdensityPairCut) fEventsToMix=2;
538 fTPCTOFboundry = 0.6;// TPC pid used below this momentum, TOF above but below TOF_boundry
539 fTOFboundry = 2.1;// TOF pid used below this momentum
541 ////////////////////////////////////////////////
543 fShareQuality = .5;// max
544 fShareFraction = .05;// max
545 ////////////////////////////////////////////////
548 //fMultLimits[0]=0, fMultLimits[1]=5, fMultLimits[2]=10, fMultLimits[3]=15, fMultLimits[4]=20, fMultLimits[5]=25;
549 //fMultLimits[6]=30, fMultLimits[7]=35, fMultLimits[8]=40, fMultLimits[9]=45, fMultLimits[10]=kMultLimitPP;
551 fMultLimits[0]=0, fMultLimits[1]=5; fMultLimits[2]=10; fMultLimits[3]=15; fMultLimits[4]=20;
552 fMultLimits[5]=30, fMultLimits[6]=40; fMultLimits[7]=50; fMultLimits[8]=70; fMultLimits[9]=100;
553 fMultLimits[10]=150, fMultLimits[11]=200; fMultLimits[12]=260; fMultLimits[13]=320; fMultLimits[14]=400;
554 fMultLimits[15]=500, fMultLimits[16]=600; fMultLimits[17]=700; fMultLimits[18]=850; fMultLimits[19]=1050;
555 fMultLimits[20]=2000;
558 if(fPbPbcase && fCentBinLowLimit < 6) {// PbPb 0-30%, was 0-50%
559 fMultLimit=kMultLimitPbPb;
561 fQcut[0]=0.1;//pi-pi, pi-k, pi-p
563 fQcut[2]=0.6;//the rest
564 fNormQcutLow[0] = 0.15;//0.15
565 fNormQcutHigh[0] = 0.175;//0.175
566 fNormQcutLow[1] = 1.34;//1.34
567 fNormQcutHigh[1] = 1.4;//1.4
568 fNormQcutLow[2] = 1.1;//1.1
569 fNormQcutHigh[2] = 1.4;//1.4
573 fQupperBound = fQcut[0];
578 }else if(fPbPbcase && fCentBinLowLimit >= 6) {// PbPb 30-100%, was 50-100%
579 fMultLimit=kMultLimitPbPb;
581 fQcut[0]=0.2;//pi-pi, pi-k, pi-p
583 fQcut[2]=1.2;//the rest
584 fNormQcutLow[0] = 0.3;//0.15
585 fNormQcutHigh[0] = 0.35;//0.175
586 fNormQcutLow[1] = 1.34;//1.34
587 fNormQcutHigh[1] = 1.4;//1.4
588 fNormQcutLow[2] = 1.1;//1.1
589 fNormQcutHigh[2] = 1.4;//1.4
593 fQupperBound = fQcut[0];
599 fMultLimit=kMultLimitPP;
604 fNormQcutLow[0] = 1.0;
605 fNormQcutHigh[0] = 1.2;// 1.5
606 fNormQcutLow[1] = 1.0;
607 fNormQcutHigh[1] = 1.2;
608 fNormQcutLow[2] = 1.0;
609 fNormQcutHigh[2] = 1.2;
613 fQupperBound = 0.4;// was 0.4
625 fEC = new AliChaoticityEventCollection **[fZvertexBins];
626 for(UShort_t i=0; i<fZvertexBins; i++){
628 fEC[i] = new AliChaoticityEventCollection *[fMbins];
630 for(UShort_t j=0; j<fMbins; j++){
632 fEC[i][j] = new AliChaoticityEventCollection(fEventsToMix+1, fMultLimit, kPairLimit, kMCarrayLimit, fMCcase);
637 for(Int_t i=0; i<fMultLimit; i++) fDefaultsCharMult[i]='0';
638 for(Int_t i=0; i<kPairLimit; i++) fDefaultsCharSE[i]='0';
639 for(Int_t i=0; i<2*kPairLimit; i++) fDefaultsCharME[i]='0';
640 for(Int_t i=0; i<fMultLimit; i++) fDefaultsInt[i]=-1;
641 for(Int_t i=0; i<fMultLimit; i++) fPairLocationSE[i] = new TArrayI(fMultLimit,fDefaultsInt);
642 for(Int_t i=0; i<fMultLimit; i++) fPairLocationME[i] = new TArrayI(fMultLimit,fDefaultsInt);
643 for(Int_t i=0; i<kPairLimit; i++) fTripletSkip1[i] = new TArrayC(fMultLimit,fDefaultsCharSE);
644 for(Int_t i=0; i<2*kPairLimit; i++) fTripletSkip2[i] = new TArrayC(fMultLimit,fDefaultsCharME);
647 // Normalization utilities
648 for(Int_t i=0; i<fMultLimit; i++) fOtherPairLocation1[0][i] = new TArrayI(fMultLimit,fDefaultsInt);
649 for(Int_t i=0; i<fMultLimit; i++) fOtherPairLocation1[1][i] = new TArrayI(fMultLimit,fDefaultsInt);
650 for(Int_t i=0; i<fMultLimit; i++) fOtherPairLocation2[0][i] = new TArrayI(fMultLimit,fDefaultsInt);
651 for(Int_t i=0; i<fMultLimit; i++) fOtherPairLocation2[1][i] = new TArrayI(fMultLimit,fDefaultsInt);
652 for(Int_t i=0; i<fMultLimit; i++) fNormPairSwitch[0][i] = new TArrayC(fMultLimit,fDefaultsCharMult);
653 for(Int_t i=0; i<fMultLimit; i++) fNormPairSwitch[1][i] = new TArrayC(fMultLimit,fDefaultsCharMult);
654 for(Int_t i=0; i<fMultLimit; i++) fNormPairSwitch[2][i] = new TArrayC(fMultLimit,fDefaultsCharMult);
656 // Track Merging/Splitting utilities
657 for(Int_t i=0; i<fMultLimit; i++) fPairSplitCut[0][i] = new TArrayC(fMultLimit,fDefaultsCharMult);// P11
658 for(Int_t i=0; i<fMultLimit; i++) fPairSplitCut[1][i] = new TArrayC(fMultLimit,fDefaultsCharMult);// P12
659 for(Int_t i=0; i<fMultLimit; i++) fPairSplitCut[2][i] = new TArrayC(fMultLimit,fDefaultsCharMult);// P13
660 for(Int_t i=0; i<fMultLimit; i++) fPairSplitCut[3][i] = new TArrayC(fMultLimit,fDefaultsCharMult);// P23
663 fNormPairs[0] = new AliChaoticityNormPairStruct[kNormPairLimit];
664 fNormPairs[1] = new AliChaoticityNormPairStruct[kNormPairLimit];
667 fTempStruct = new AliChaoticityTrackStruct[fMultLimit];
670 fTrueMassP=0.93827, fTrueMassPi=0.13957, fTrueMassK=0.493677, fTrueMassKs=0.497614, fTrueMassLam=1.11568;
674 // Set weights, Coulomb corrections, and Momentum resolution corrections manually if not on LEGO
676 SetFSICorrelations(fLEGO);// Read in 2-particle and 3-particle FSI correlations
679 /////////////////////////////////////////////
680 /////////////////////////////////////////////
683 //________________________________________________________________________
684 void AliThreePionRadii::UserCreateOutputObjects()
689 ParInit();// Initialize my settings
692 fOutputList = new TList();
693 fOutputList->SetOwner();
695 TH3F *fVertexDist = new TH3F("fVertexDist","Vertex Distribution",20,-1,1, 20,-1,1, 600,-30,30);
696 fVertexDist->GetXaxis()->SetTitle("X Vertex (cm)");
697 fVertexDist->GetYaxis()->SetTitle("Y Vertex (cm)");
698 fVertexDist->GetZaxis()->SetTitle("Z Vertex (cm)");
699 fOutputList->Add(fVertexDist);
702 TH2F *fDCAxyDistPlus = new TH2F("fDCAxyDistPlus","DCA distribution",300,0,3., 50,0,5);
703 fOutputList->Add(fDCAxyDistPlus);
704 TH2F *fDCAzDistPlus = new TH2F("fDCAzDistPlus","DCA distribution",300,0,3., 50,0,5);
705 fOutputList->Add(fDCAzDistPlus);
706 TH2F *fDCAxyDistMinus = new TH2F("fDCAxyDistMinus","DCA distribution",300,0,3., 50,0,5);
707 fOutputList->Add(fDCAxyDistMinus);
708 TH2F *fDCAzDistMinus = new TH2F("fDCAzDistMinus","DCA distribution",300,0,3., 50,0,5);
709 fOutputList->Add(fDCAzDistMinus);
712 TH1F *fEvents1 = new TH1F("fEvents1","Events vs. fMbin",fMbins,.5,fMbins+.5);
713 fOutputList->Add(fEvents1);
714 TH1F *fEvents2 = new TH1F("fEvents2","Events vs. fMbin",fMbins,.5,fMbins+.5);
715 fOutputList->Add(fEvents2);
717 TH1F *fMultDist1 = new TH1F("fMultDist1","Multiplicity Distribution",fMultLimit,-.5,fMultLimit-.5);
718 fMultDist1->GetXaxis()->SetTitle("Multiplicity");
719 fOutputList->Add(fMultDist1);
721 TH1F *fMultDist2 = new TH1F("fMultDist2","Multiplicity Distribution",fMultLimit,-.5,fMultLimit-.5);
722 fMultDist2->GetXaxis()->SetTitle("Multiplicity");
723 fOutputList->Add(fMultDist2);
725 TH1F *fMultDist3 = new TH1F("fMultDist3","Multiplicity Distribution",fMultLimit,-.5,fMultLimit-.5);
726 fMultDist3->GetXaxis()->SetTitle("Multiplicity");
727 fOutputList->Add(fMultDist3);
729 TH1F *fMultDist4 = new TH1F("fMultDist4","Multiplicity Distribution",fMultLimit,-.5,fMultLimit-.5);
730 fMultDist4->GetXaxis()->SetTitle("Multiplicity");
731 fOutputList->Add(fMultDist4);
733 TH3F *fPtEtaDist = new TH3F("fPtEtaDist","fPtEtaDist",2,-1.1,1.1, 300,0,3., 28,-1.4,1.4);
734 fOutputList->Add(fPtEtaDist);
736 TH3F *fPhiPtDist = new TH3F("fPhiPtDist","fPhiPtDist",2,-1.1,1.1, 120,0,2*PI, 300,0,3.);
737 fOutputList->Add(fPhiPtDist);
739 TH3F *fTOFResponse = new TH3F("fTOFResponse","TOF relative time",20,0,100, 200,0,2, 4000,-20000,20000);
740 fOutputList->Add(fTOFResponse);
741 TH3F *fTPCResponse = new TH3F("fTPCResponse","TPCsignal",20,0,100, 200,0,2, 1000,0,1000);
742 fOutputList->Add(fTPCResponse);
744 TH1F *fRejectedPairs = new TH1F("fRejectedPairs","",200,0,2);
745 fOutputList->Add(fRejectedPairs);
746 TH1I *fRejectedEvents = new TH1I("fRejectedEvents","",fMbins,0.5,fMbins+.5);
747 fOutputList->Add(fRejectedEvents);
749 TH3F *fPairsDetaDPhiNum = new TH3F("fPairsDetaDPhiNum","",10,-.5,9.5, 200,-0.2,0.2, 600,-0.3,0.3);
750 if(fMCcase) fOutputList->Add(fPairsDetaDPhiNum);
751 TH3F *fPairsDetaDPhiDen = new TH3F("fPairsDetaDPhiDen","",10,-.5,9.5, 200,-0.2,0.2, 600,-0.3,0.3);
752 if(fMCcase) fOutputList->Add(fPairsDetaDPhiDen);
753 TH3F *fPairsShareFracDPhiNum = new TH3F("fPairsShareFracDPhiNum","",10,-.5,9.5, 159,0,1, 600,-0.3,0.3);
754 if(fMCcase) fOutputList->Add(fPairsShareFracDPhiNum);
755 TH3F *fPairsShareFracDPhiDen = new TH3F("fPairsShareFracDPhiDen","",10,-.5,9.5, 159,0,1, 600,-0.3,0.3);
756 if(fMCcase) fOutputList->Add(fPairsShareFracDPhiDen);
757 TH3D* fPairsPadRowNum = new TH3D("fPairsPadRowNum","", 20,0,1, 159,0,1, 40,0,0.2);
758 if(fMCcase) fOutputList->Add(fPairsPadRowNum);
759 TH3D* fPairsPadRowDen = new TH3D("fPairsPadRowDen","", 20,0,1, 159,0,1, 40,0,0.2);
760 if(fMCcase) fOutputList->Add(fPairsPadRowDen);
764 TH3D *fPrimarySCPionPairs = new TH3D("fPrimarySCPionPairs","",fMbins,.5,fMbins+.5, 20,0,1, 20,0,0.2);
765 if(fMCcase) fOutputList->Add(fPrimarySCPionPairs);
766 TH3D *fAllSCPionPairs = new TH3D("fAllSCPionPairs","",fMbins,.5,fMbins+.5, 20,0,1, 20,0,0.2);
767 if(fMCcase) fOutputList->Add(fAllSCPionPairs);
768 TH3D *fPrimaryMCPionPairs = new TH3D("fPrimaryMCPionPairs","",fMbins,.5,fMbins+.5, 20,0,1, 20,0,0.2);
769 if(fMCcase) fOutputList->Add(fPrimaryMCPionPairs);
770 TH3D *fAllMCPionPairs = new TH3D("fAllMCPionPairs","",fMbins,.5,fMbins+.5, 20,0,1, 20,0,0.2);
771 if(fMCcase) fOutputList->Add(fAllMCPionPairs);
773 TH3D *fMuonContamSmearedNum2 = new TH3D("fMuonContamSmearedNum2","",2,-0.5,1.5, 20,0,1, 40,0,0.2);
774 if(fMCcase) fOutputList->Add(fMuonContamSmearedNum2);
775 TH3D *fMuonContamSmearedDen2 = new TH3D("fMuonContamSmearedDen2","",2,-0.5,1.5, 20,0,1, 40,0,0.2);
776 if(fMCcase) fOutputList->Add(fMuonContamSmearedDen2);
777 TH3D *fMuonContamIdealNum2 = new TH3D("fMuonContamIdealNum2","",2,-0.5,1.5, 20,0,1, 40,0,0.2);
778 if(fMCcase) fOutputList->Add(fMuonContamIdealNum2);
779 TH3D *fMuonContamIdealDen2 = new TH3D("fMuonContamIdealDen2","",2,-0.5,1.5, 20,0,1, 40,0,0.2);
780 if(fMCcase) fOutputList->Add(fMuonContamIdealDen2);
782 TH3D *fMuonContamSmearedNum3 = new TH3D("fMuonContamSmearedNum3","",2,-0.5,1.5, 2,-0.5,1.5, 20,0,0.2);
783 if(fMCcase) fOutputList->Add(fMuonContamSmearedNum3);
784 TH3D *fMuonContamSmearedDen3 = new TH3D("fMuonContamSmearedDen3","",2,-0.5,1.5, 2,-0.5,1.5, 20,0,0.2);
785 if(fMCcase) fOutputList->Add(fMuonContamSmearedDen3);
786 TH3D *fMuonContamIdealNum3 = new TH3D("fMuonContamIdealNum3","",2,-0.5,1.5, 2,-0.5,1.5, 20,0,0.2);
787 if(fMCcase) fOutputList->Add(fMuonContamIdealNum3);
788 TH3D *fMuonContamIdealDen3 = new TH3D("fMuonContamIdealDen3","",2,-0.5,1.5, 2,-0.5,1.5, 20,0,0.2);
789 if(fMCcase) fOutputList->Add(fMuonContamIdealDen3);
791 TH1D *fMuonParents = new TH1D("fMuonParents","",500,0.5,500.5);
792 if(fMCcase) fOutputList->Add(fMuonParents);
793 TH1D *fSecondaryMuonParents = new TH1D("fSecondaryMuonParents","",500,0.5,500.5);
794 if(fMCcase) fOutputList->Add(fSecondaryMuonParents);
795 TH3D *fMuonPionDeltaQinv = new TH3D("fMuonPionDeltaQinv","",2,-0.5,1.5, 20,0,1, 100,-0.2,0.2);
796 if(fMCcase) fOutputList->Add(fMuonPionDeltaQinv);
797 TH1D *fPionCandidates = new TH1D("fPionCandidates","",500,0.5,500.5);
798 if(fMCcase) fOutputList->Add(fPionCandidates);
800 TH3D *fMuonPionK2 = new TH3D("fMuonPionK2","",2,-0.5,1.5, 20,0,1, 40,0,0.2);
801 TH3D *fPionPionK2 = new TH3D("fPionPionK2","",2,-0.5,1.5, 20,0,1, 40,0,0.2);
802 TH3D *fMuonPionK3 = new TH3D("fMuonPionK3","",2,-0.5,1.5, 2,-0.5,1.5, 20,0,0.2);
803 TH3D *fPionPionK3 = new TH3D("fPionPionK3","",2,-0.5,1.5, 2,-0.5,1.5, 20,0,0.2);
804 if(fMCcase) fOutputList->Add(fMuonPionK2);
805 if(fMCcase) fOutputList->Add(fPionPionK2);
806 if(fMCcase) fOutputList->Add(fMuonPionK3);
807 if(fMCcase) fOutputList->Add(fPionPionK3);
809 TProfile *fAvgMult = new TProfile("fAvgMult","",fMbins,.5,fMbins+.5, 0,1500,"");
810 fOutputList->Add(fAvgMult);
811 TH2D *fAvgMultHisto2D = new TH2D("fAvgMultHisto2D","",fMbins,.5,fMbins+.5, 1000,0.5,2000.5);
812 fOutputList->Add(fAvgMultHisto2D);
813 TH2D *fAvgMultHisto2DV0C = new TH2D("fAvgMultHisto2DV0C","",fMbins,.5,fMbins+.5, 1000,0.5,2000.5);
814 fOutputList->Add(fAvgMultHisto2DV0C);
815 TH2D *fAvgMultHisto2DV0AplusC = new TH2D("fAvgMultHisto2DV0AplusC","",fMbins,.5,fMbins+.5, 1000,0.5,2000.5);
816 fOutputList->Add(fAvgMultHisto2DV0AplusC);
818 TH2D *fTrackChi2NDF = new TH2D("fTrackChi2NDF","",20,0,100, 100,0,10);
819 fOutputList->Add(fTrackChi2NDF);
820 TH2D *fTrackTPCncls = new TH2D("fTrackTPCncls","",20,0,100, 110,50,160);
821 fOutputList->Add(fTrackTPCncls);
825 TH3D *fKt3DistTerm1 = new TH3D("fKt3DistTerm1","",fMbins,.5,fMbins+.5, 20,0,1, 20,0,0.2);
826 TH3D *fKt3DistTerm5 = new TH3D("fKt3DistTerm5","",fMbins,.5,fMbins+.5, 20,0,1, 20,0,0.2);
827 fOutputList->Add(fKt3DistTerm1);
828 fOutputList->Add(fKt3DistTerm5);
830 TH1D *fMCWeight3DTerm1SC = new TH1D("fMCWeight3DTerm1SC","", 20,0,0.2);
831 TH1D *fMCWeight3DTerm1SCden = new TH1D("fMCWeight3DTerm1SCden","", 20,0,0.2);
832 TH1D *fMCWeight3DTerm2SC = new TH1D("fMCWeight3DTerm2SC","", 20,0,0.2);
833 TH1D *fMCWeight3DTerm2SCden = new TH1D("fMCWeight3DTerm2SCden","", 20,0,0.2);
834 TH1D *fMCWeight3DTerm1MC = new TH1D("fMCWeight3DTerm1MC","", 20,0,0.2);
835 TH1D *fMCWeight3DTerm1MCden = new TH1D("fMCWeight3DTerm1MCden","", 20,0,0.2);
836 TH1D *fMCWeight3DTerm2MC = new TH1D("fMCWeight3DTerm2MC","", 20,0,0.2);
837 TH1D *fMCWeight3DTerm2MCden = new TH1D("fMCWeight3DTerm2MCden","", 20,0,0.2);
838 TH1D *fMCWeight3DTerm3MC = new TH1D("fMCWeight3DTerm3MC","", 20,0,0.2);
839 TH1D *fMCWeight3DTerm3MCden = new TH1D("fMCWeight3DTerm3MCden","", 20,0,0.2);
840 TH1D *fMCWeight3DTerm4MC = new TH1D("fMCWeight3DTerm4MC","", 20,0,0.2);
841 TH1D *fMCWeight3DTerm4MCden = new TH1D("fMCWeight3DTerm4MCden","", 20,0,0.2);
842 fOutputList->Add(fMCWeight3DTerm1SC);
843 fOutputList->Add(fMCWeight3DTerm1SCden);
844 fOutputList->Add(fMCWeight3DTerm2SC);
845 fOutputList->Add(fMCWeight3DTerm2SCden);
846 fOutputList->Add(fMCWeight3DTerm1MC);
847 fOutputList->Add(fMCWeight3DTerm1MCden);
848 fOutputList->Add(fMCWeight3DTerm2MC);
849 fOutputList->Add(fMCWeight3DTerm2MCden);
850 fOutputList->Add(fMCWeight3DTerm3MC);
851 fOutputList->Add(fMCWeight3DTerm3MCden);
852 fOutputList->Add(fMCWeight3DTerm4MC);
853 fOutputList->Add(fMCWeight3DTerm4MCden);
855 TH2D *fdNchdEtaResponse = new TH2D("fdNchdEtaResponse","",15,0,15, 15,0,15);
856 TH2D *fNpionTrueDist = new TH2D("fNpionTrueDist","",fMbins,.5,fMbins+.5, 3000,0.5,3000.5);
857 TH2D *fNchTrueDist = new TH2D("fNchTrueDist","",fMbins,.5,fMbins+.5, 3000,0.5,3000.5);// default Nch mapping
858 TH2D *fNchTrueDistFullPt = new TH2D("fNchTrueDistFullPt","",fMbins,.5,fMbins+.5, 3000,0.5,3000.5);// full Pt Nch range mapping
859 TH2D *fNchTrueDistPubMethod = new TH2D("fNchTrueDistPubMethod","",fMbins,.5,fMbins+.5, 3000,0.5,3000.5);// Published pp Nch mapping
860 Float_t PubBins[9]={1.,12.,17.,23.,29.,35.,42.,52.,152.};
861 TProfile *fAvgNchTrueDistvsPubMethodBin = new TProfile("fAvgNchTrueDistvsPubMethodBin","",8,PubBins,"");
862 TProfile *fAvgRecRate = new TProfile("fAvgRecRate","",3000,0.5,3000.5, 0,3000, "");
863 if(fMCcase) fOutputList->Add(fdNchdEtaResponse);
864 if(fMCcase) fOutputList->Add(fNpionTrueDist);
865 if(fMCcase) fOutputList->Add(fNchTrueDist);
866 if(fMCcase) fOutputList->Add(fNchTrueDistFullPt);
867 if(fMCcase) fOutputList->Add(fNchTrueDistPubMethod);
868 if(fMCcase) fOutputList->Add(fAvgRecRate);
869 if(fMCcase) fOutputList->Add(fAvgNchTrueDistvsPubMethodBin);
870 TH2D *fdCentVsNchdEta = new TH2D("fdCentVsNchdEta","",fMbins,.5,fMbins+.5, 15,0,15);
871 if(fPbPbcase) fOutputList->Add(fdCentVsNchdEta);
873 TH1D *fV0TotSignal = new TH1D("fV0TotSignal","",3000, 0,30000);
874 if(fV0Mbinning) fOutputList->Add(fV0TotSignal);
876 TH2D *fMultBinVsCent = new TH2D("fMultBinVsCent","",fMbins,.5,fMbins+.5, 100,0,100);
877 fOutputList->Add(fMultBinVsCent);
879 TH1D *fExtendedQ3Histo_term1 = new TH1D("fExtendedQ3Histo_term1","",50,0,0.5);
880 TH1D *fExtendedQ3Histo_term2 = new TH1D("fExtendedQ3Histo_term2","",50,0,0.5);
881 TH1D *fExtendedQ3Histo_term5 = new TH1D("fExtendedQ3Histo_term5","",50,0,0.5);
882 fOutputList->Add(fExtendedQ3Histo_term1);
883 fOutputList->Add(fExtendedQ3Histo_term2);
884 fOutputList->Add(fExtendedQ3Histo_term5);
886 if(fPdensityPairCut){
888 for(Int_t mb=0; mb<fMbins; mb++){
889 if((mb < fCentBinLowLimit) || (mb > fCentBinHighLimit)) continue;
891 for(Int_t edB=0; edB<fEDbins; edB++){
892 if(edB >= fKt3bins) continue;
894 for(Int_t c1=0; c1<2; c1++){
895 for(Int_t c2=0; c2<2; c2++){
896 for(Int_t sc=0; sc<kSCLimit2; sc++){
897 for(Int_t term=0; term<2; term++){
899 TString *nameEx2 = new TString("Explicit2_Charge1_");
901 nameEx2->Append("_Charge2_");
903 nameEx2->Append("_SC_");
905 nameEx2->Append("_M_");
907 nameEx2->Append("_ED_");
909 nameEx2->Append("_Term_");
912 if(sc==0 || sc==3 || sc==5){
913 if( (c1+c2)==1 ) {if(c1!=0) continue;}// skip degenerate histogram
916 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fExplicit2 = new TH2D(nameEx2->Data(),"Two Particle Distribution",20,0,1, fQbinsC2,0,fQlimitC2);
917 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fExplicit2);
919 TString *nameMeanKt=new TString(nameEx2->Data());
920 nameMeanKt->Append("_MeanKt");
921 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fMeanKt = new TH1D(nameMeanKt->Data(),"Two Particle Distribution",200,0,1);
922 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fMeanKt);
924 TString *nameEx2QW=new TString(nameEx2->Data());
925 nameEx2QW->Append("_QW");
926 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fExplicit2QW = new TH2D(nameEx2QW->Data(),"Two Particle Distribution",20,0,1, fQbinsC2,0,fQlimitC2);
927 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fExplicit2QW);
928 TString *nameAvgP=new TString(nameEx2->Data());
929 nameAvgP->Append("_AvgP");
930 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fAvgP = new TProfile2D(nameAvgP->Data(),"",10,0,1, fQbinsC2,0,fQlimitC2, 0.,1.0,"");
931 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fAvgP);
933 // Momentum resolution histos
934 if(fMCcase && sc==0){
935 TString *nameIdeal = new TString(nameEx2->Data());
936 nameIdeal->Append("_Ideal");
937 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fIdeal = new TH2D(nameIdeal->Data(),"Two Particle Distribution",fRVALUES*kNDampValues,-0.5,fRVALUES*kNDampValues-0.5, fQbins,0,fQupperBound);
938 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fIdeal);
939 TString *nameSmeared = new TString(nameEx2->Data());
940 nameSmeared->Append("_Smeared");
941 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fSmeared = new TH2D(nameSmeared->Data(),"Two Particle Distribution",fRVALUES*kNDampValues,-0.5,fRVALUES*kNDampValues-0.5, fQbins,0,fQupperBound);
942 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fSmeared);
944 TString *nameEx2MC=new TString(nameEx2->Data());
945 nameEx2MC->Append("_MCqinv");
946 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fMCqinv = new TH1D(nameEx2MC->Data(),"",fQbinsC2,0,fQlimitC2);
947 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fMCqinv);
948 TString *nameEx2MCQW=new TString(nameEx2->Data());
949 nameEx2MCQW->Append("_MCqinvQW");
950 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fMCqinvQW = new TH1D(nameEx2MCQW->Data(),"",fQbinsC2,0,fQlimitC2);
951 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fMCqinvQW);
953 TString *nameEx2PIDpurityDen=new TString(nameEx2->Data());
954 nameEx2PIDpurityDen->Append("_PIDpurityDen");
955 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fPIDpurityDen = new TH2D(nameEx2PIDpurityDen->Data(),"Two Particle Distribution",20,0,1, fQbinsC2,0,fQlimitC2);
956 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fPIDpurityDen);
957 TString *nameEx2PIDpurityNum=new TString(nameEx2->Data());
958 nameEx2PIDpurityNum->Append("_PIDpurityNum");
959 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fPIDpurityNum = new TH3D(nameEx2PIDpurityNum->Data(),"Two Particle Distribution",16,0.5,16.5, 20,0,1, fQbinsC2,0,fQlimitC2);
960 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fPIDpurityNum);
968 for(Int_t c3=0; c3<2; c3++){
969 for(Int_t sc=0; sc<kSCLimit3; sc++){
970 for(Int_t term=0; term<5; term++){
971 TString *nameEx3 = new TString("Explicit3_Charge1_");
973 nameEx3->Append("_Charge2_");
975 nameEx3->Append("_Charge3_");
977 nameEx3->Append("_SC_");
979 nameEx3->Append("_M_");
981 nameEx3->Append("_ED_");
983 nameEx3->Append("_Term_");
986 TString *namePC3 = new TString("PairCut3_Charge1_");
988 namePC3->Append("_Charge2_");
990 namePC3->Append("_Charge3_");
992 namePC3->Append("_SC_");
994 namePC3->Append("_M_");
996 namePC3->Append("_ED_");
998 namePC3->Append("_Term_");
1001 ///////////////////////////////////////
1002 // skip degenerate histograms
1003 if(sc==0 || sc==6 || sc==9){// Identical species
1004 if( (c1+c2+c3)==1) {if(c3!=1) continue;}
1005 if( (c1+c2+c3)==2) {if(c1!=0) continue;}
1007 if( (c1+c2)==1) {if(c1!=0) continue;}
1008 }else {}// do nothing for pi-k-p case
1010 /////////////////////////////////////////
1015 if(fPdensityPairCut){
1016 TString *nameNorm=new TString(namePC3->Data());
1017 nameNorm->Append("_Norm");
1018 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);
1019 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fNorm3);
1022 TString *nameQ3=new TString(namePC3->Data());
1023 nameQ3->Append("_Q3");
1024 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fTermsQ3 = new TH1D(nameQ3->Data(),"", 200,0,2.0);
1025 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fTermsQ3);
1027 TString *name3DQ=new TString(namePC3->Data());
1028 name3DQ->Append("_3D");
1029 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fTerms3 = new TH3D(name3DQ->Data(),"", fQbins,0,fQupperBound, fQbins,0,fQupperBound, fQbins,0,fQupperBound);
1030 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fTerms3);
1032 TString *nameMeanKt=new TString(namePC3->Data());
1033 nameMeanKt->Append("_MeanKt");
1034 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fMeanKt = new TH1D(nameMeanKt->Data(),"", 200,0,1);
1035 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fMeanKt);
1037 if(sc==0 && fMCcase==kTRUE){
1038 TString *name3DMomResIdeal=new TString(namePC3->Data());
1039 name3DMomResIdeal->Append("_Ideal");
1040 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fIdeal = new TH1D(name3DMomResIdeal->Data(),"", 200,0,2.0);
1041 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fIdeal);
1042 TString *name3DMomResSmeared=new TString(namePC3->Data());
1043 name3DMomResSmeared->Append("_Smeared");
1044 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fSmeared = new TH1D(name3DMomResSmeared->Data(),"", 200,0,2.0);
1045 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fSmeared);
1065 TProfile *fQsmearMean = new TProfile("fQsmearMean","",2,0.5,2.5, -0.2,0.2,"");
1066 fOutputList->Add(fQsmearMean);
1067 TProfile *fQsmearSq = new TProfile("fQsmearSq","",2,0.5,2.5, -2,2,"");
1068 fOutputList->Add(fQsmearSq);
1069 TH1D *fQDist = new TH1D("fQDist","",200,-.2,.2);
1070 fOutputList->Add(fQDist);
1074 ////////////////////////////////////
1075 ///////////////////////////////////
1077 PostData(1, fOutputList);
1080 //________________________________________________________________________
1081 void AliThreePionRadii::UserExec(Option_t *)
1084 // Called for each event
1086 if(fEventCounter%1000==0) cout<<"=========== Event # "<<fEventCounter<<" ==========="<<endl;
1088 if(!fAODcase) {cout<<"ESDs not supported"<<endl; return;}
1090 fAOD = dynamic_cast<AliAODEvent*> (InputEvent());
1091 if (!fAOD) {Printf("ERROR: fAOD not available"); return;}
1096 if(fAOD->GetRunNumber() >= 136851 && fAOD->GetRunNumber() <= 139517){// 10h data
1097 Bool_t isSelected1 = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kMB);
1098 if(!isSelected1 && !fMCcase) {return;}
1100 if(fAOD->GetRunNumber() >= 167693 && fAOD->GetRunNumber() <= 170593){// 11h data
1101 Bool_t isSelected1 = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kMB);
1102 Bool_t isSelected2 = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kCentral);
1103 Bool_t isSelected3 = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kSemiCentral);
1104 if(!isSelected1 && !isSelected2 && !isSelected3 && !fMCcase) {return;}
1107 Bool_t isSelected[4]={kFALSE};
1108 isSelected[0] = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kMB);
1109 isSelected[1] = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kAny);
1110 isSelected[2] = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kINT7);
1111 isSelected[3] = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kHighMult);
1112 if(!isSelected[fTriggerType] && !fMCcase) return;
1116 ///////////////////////////////////////////////////////////
1117 const AliAODVertex *primaryVertexAOD;
1118 AliCentrality *centrality;// for AODs and ESDs
1121 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
1122 AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
1123 fPIDResponse = inputHandler->GetPIDResponse();
1126 TClonesArray *mcArray = 0x0;
1127 Int_t mcNch=0, mcNchFullPt=0, mcNchPubMethod=0;
1131 mcArray = (TClonesArray*)fAOD->FindListObject(AliAODMCParticle::StdBranchName());
1132 if(!mcArray || mcArray->GetEntriesFast() >= kMCarrayLimit){
1133 cout<<"No MC particle branch found or Array too large!!"<<endl;
1137 // Count true Nch at mid-rapidity
1138 for(Int_t mctrackN=0; mctrackN<mcArray->GetEntriesFast(); mctrackN++){
1139 AliAODMCParticle *mcParticle = (AliAODMCParticle*)mcArray->At(mctrackN);
1140 if(!mcParticle) continue;
1141 if(mcParticle->Charge()!=-3 && mcParticle->Charge()!=+3) continue;// x3 by convention
1142 if(!mcParticle->IsPrimary()) continue;
1143 if(!mcParticle->IsPhysicalPrimary()) continue;
1145 if(fabs(mcParticle->Eta())>0.8) continue;
1146 if(fabs(mcParticle->Eta())<=0.5) mcNchPubMethod++;// Published pp binning
1147 mcNchFullPt++;// My binning in full Pt range
1148 if(mcParticle->Pt() < 0.16 || mcParticle->Pt() > 1.0) continue;
1149 mcNch++;// My binning in my pt range
1150 if(abs(mcParticle->GetPdgCode())==211) mcNpion++;
1157 Int_t positiveTracks=0, negativeTracks=0;
1158 Int_t myTracks=0, pionCount=0, kaonCount=0, protonCount=0;
1159 Int_t FBTracks=0, AODTracks=0;
1161 Double_t vertex[3]={0};
1163 Double_t zstep=2*10/Double_t(fZvertexBins), zstart=-10.;
1164 /////////////////////////////////////////////////
1166 Float_t centralityPercentile=0;
1167 //Float_t cStep=5.0, cStart=0;
1168 Int_t trackletMult = 0;
1170 if(fAODcase){// AOD case
1173 centrality = fAOD->GetCentrality();
1174 centralityPercentile = centrality->GetCentralityPercentile("V0M");
1175 if(centralityPercentile == 0) {/*cout<<"Centrality = 0, skipping event"<<endl;*/ return;}
1176 //if((centralityPercentile < 5*fCentBinLowLimit) || (centralityPercentile>= 5*(fCentBinHighLimit+1))) {/*cout<<"Centrality out of Range. Skipping Event"<<endl;*/ return;}
1177 cout<<"Centrality % = "<<centralityPercentile<<endl;
1179 //cout<<"AOD multiplicity = "<<fAOD->GetNumberOfTracks()<<endl;
1182 AliAnalysisUtils *AnaUtil=new AliAnalysisUtils();
1183 if(fAOD->GetRunNumber() >= 195344 && fAOD->GetRunNumber() <= 195873) AnaUtil->SetUseMVPlpSelection(kTRUE);// use Multi-Vertex tool for pPb
1184 Bool_t pileUpCase=AnaUtil->IsPileUpEvent(fAOD);
1185 if(pileUpCase) return;
1187 ////////////////////////////////
1189 ((TH1F*)fOutputList->FindObject("fMultDist1"))->Fill(fAOD->GetNumberOfTracks());
1190 primaryVertexAOD = fAOD->GetPrimaryVertex();
1191 vertex[0]=primaryVertexAOD->GetX(); vertex[1]=primaryVertexAOD->GetY(); vertex[2]=primaryVertexAOD->GetZ();
1193 if(fabs(vertex[2]) > 10) {/*cout<<"Zvertex Out of Range. Skip Event"<<endl;*/ return;} // Z-Vertex Cut
1194 ((TH3F*)fOutputList->FindObject("fVertexDist"))->Fill(vertex[0], vertex[1], vertex[2]);
1196 for (Int_t i = 0; i < fAOD->GetNumberOfTracks(); i++) {
1197 AliAODTrack* aodtrack = fAOD->GetTrack(i);
1198 if (!aodtrack) continue;
1200 if(!aodtrack->TestFilterBit(BIT(fFilterBit))) continue;// AOD filterBit cut
1203 ((TH1F*)fOutputList->FindObject("fMultDist2"))->Fill(FBTracks);
1205 if(fAOD->IsPileupFromSPD()) {/*cout<<"PileUpEvent. Skip Event"<<endl;*/ return;} // Reject Pile-up events
1206 if(primaryVertexAOD->GetNContributors() < 1) {/*cout<<"Bad Vertex. Skip Event"<<endl;*/ return;}
1208 ((TH1F*)fOutputList->FindObject("fMultDist3"))->Fill(FBTracks);
1210 fBfield = fAOD->GetMagneticField();
1212 for(Int_t i=0; i<fZvertexBins; i++){
1213 if( (vertex[2] >= zstart+i*zstep) && (vertex[2] < zstart+(i+1)*zstep) ){
1219 AliAODTracklets *tracklets = (AliAODTracklets*)fAOD->GetTracklets();
1220 for(Int_t trackletN=0; trackletN<tracklets->GetNumberOfTracklets(); trackletN++){
1221 if(tracklets->GetTheta(trackletN) > 1.0904 && tracklets->GetTheta(trackletN) < 2.0512) trackletMult++;// |eta|<0.5 tracklets
1224 //cout<<fAOD->GetFiredTriggerClasses()<<endl;
1225 /////////////////////////////
1226 // Create Shuffled index list
1227 Int_t randomIndex[fAOD->GetNumberOfTracks()];
1228 for (Int_t i = 0; i < fAOD->GetNumberOfTracks(); i++) randomIndex[i]=i;
1229 Shuffle(randomIndex,0,fAOD->GetNumberOfTracks()-1);
1230 /////////////////////////////
1233 for (Int_t i = 0; i < fAOD->GetNumberOfTracks(); i++) {
1234 AliAODTrack* aodtrack = fAOD->GetTrack(randomIndex[i]);
1235 if (!aodtrack) continue;
1236 if(myTracks >= fMultLimit) {cout<<"More tracks than Track Limit"<<endl; return;}
1238 status=aodtrack->GetStatus();
1240 if(!aodtrack->TestFilterBit(BIT(7))) continue;// AOD filterBit cut
1242 // FilterBit Overlap Check
1243 if(fFilterBit != 7){
1244 Bool_t goodTrackOtherFB = kFALSE;
1245 if(fMCcase && fAOD->GetRunNumber()<=126437) goodTrackOtherFB=kTRUE;// FB7 to FB5 mapping in 10f6a MC does not work
1247 for (Int_t j = 0; j < fAOD->GetNumberOfTracks(); j++) {
1248 AliAODTrack* aodtrack2 = fAOD->GetTrack(randomIndex[j]);
1249 if(!aodtrack2) continue;
1250 if(!aodtrack2->TestFilterBit(BIT(fFilterBit))) continue;
1252 if(-(aodtrack->GetID()+1)==aodtrack2->GetID()) {goodTrackOtherFB=kTRUE; break;}
1255 if(!goodTrackOtherFB) continue;
1259 if(aodtrack->Pt() < 0.16) continue;
1260 if(fabs(aodtrack->Eta()) > 0.8) continue;
1263 Bool_t goodMomentum = aodtrack->GetPxPyPz( fTempStruct[myTracks].fP);
1264 if(!goodMomentum) continue;
1265 aodtrack->GetXYZ( fTempStruct[myTracks].fX);
1270 dca2[0] = sqrt( pow(fTempStruct[myTracks].fX[0] - vertex[0],2) + pow(fTempStruct[myTracks].fX[1] - vertex[1],2));
1271 dca2[1] = sqrt( pow(fTempStruct[myTracks].fX[2] - vertex[2],2));
1272 dca3d = sqrt( pow(dca2[0],2) + pow(dca2[1],2));
1274 fTempStruct[myTracks].fStatus = status;
1275 fTempStruct[myTracks].fFiltermap = aodtrack->GetFilterMap();
1276 fTempStruct[myTracks].fId = aodtrack->GetID();
1277 fTempStruct[myTracks].fLabel = aodtrack->GetLabel();
1278 fTempStruct[myTracks].fPhi = atan2(fTempStruct[myTracks].fP[1], fTempStruct[myTracks].fP[0]);
1279 if(fTempStruct[myTracks].fPhi < 0) fTempStruct[myTracks].fPhi += 2*PI;
1280 fTempStruct[myTracks].fPt = sqrt(pow(fTempStruct[myTracks].fP[0],2) + pow(fTempStruct[myTracks].fP[1],2));
1281 fTempStruct[myTracks].fMom = sqrt( pow(fTempStruct[myTracks].fPt,2) + pow(fTempStruct[myTracks].fP[2],2) );
1282 fTempStruct[myTracks].fEta = aodtrack->Eta();
1283 fTempStruct[myTracks].fCharge = aodtrack->Charge();
1284 fTempStruct[myTracks].fDCAXY = dca2[0];
1285 fTempStruct[myTracks].fDCAZ = dca2[1];
1286 fTempStruct[myTracks].fDCA = dca3d;
1287 fTempStruct[myTracks].fClusterMap = aodtrack->GetTPCClusterMap();
1288 fTempStruct[myTracks].fSharedMap = aodtrack->GetTPCSharedMap();
1292 if(fTempStruct[myTracks].fMom > 0.9999) continue;// upper P bound
1293 if(fTempStruct[myTracks].fPt > 0.9999) continue;// upper P bound
1294 if(fTempStruct[myTracks].fP[2] > 0.9999) continue;// upper P bound
1299 fTempStruct[myTracks].fElectron = kFALSE;
1300 fTempStruct[myTracks].fPion = kFALSE;
1301 fTempStruct[myTracks].fKaon = kFALSE;
1302 fTempStruct[myTracks].fProton = kFALSE;
1304 Float_t nSigmaTPC[5];
1305 Float_t nSigmaTOF[5];
1306 nSigmaTPC[0]=10; nSigmaTPC[1]=10; nSigmaTPC[2]=10; nSigmaTPC[3]=10; nSigmaTPC[4]=10;
1307 nSigmaTOF[0]=10; nSigmaTOF[1]=10; nSigmaTOF[2]=10; nSigmaTOF[3]=10; nSigmaTOF[4]=10;
1308 fTempStruct[myTracks].fTOFhit = kFALSE;// default
1309 Float_t signalTPC=0, signalTOF=0;
1310 Double_t integratedTimesTOF[10]={0};
1312 Bool_t DoPIDWorkAround=kTRUE;
1313 //if(fFilterBit == 7) DoPIDWorkAround=kTRUE;
1314 if(fMCcase && !fPbPbcase) DoPIDWorkAround=kFALSE;
1315 if(DoPIDWorkAround==kFALSE && fabs(fPIDResponse->NumberOfSigmasTPC(aodtrack,AliPID::kPion)) < 900) {
1316 nSigmaTPC[0]=fabs(fPIDResponse->NumberOfSigmasTPC(aodtrack,AliPID::kElectron));
1317 nSigmaTPC[1]=fabs(fPIDResponse->NumberOfSigmasTPC(aodtrack,AliPID::kMuon));
1318 nSigmaTPC[2]=fabs(fPIDResponse->NumberOfSigmasTPC(aodtrack,AliPID::kPion));
1319 nSigmaTPC[3]=fabs(fPIDResponse->NumberOfSigmasTPC(aodtrack,AliPID::kKaon));
1320 nSigmaTPC[4]=fabs(fPIDResponse->NumberOfSigmasTPC(aodtrack,AliPID::kProton));
1322 nSigmaTOF[0]=fabs(fPIDResponse->NumberOfSigmasTOF(aodtrack,AliPID::kElectron));
1323 nSigmaTOF[1]=fabs(fPIDResponse->NumberOfSigmasTOF(aodtrack,AliPID::kMuon));
1324 nSigmaTOF[2]=fabs(fPIDResponse->NumberOfSigmasTOF(aodtrack,AliPID::kPion));
1325 nSigmaTOF[3]=fabs(fPIDResponse->NumberOfSigmasTOF(aodtrack,AliPID::kKaon));
1326 nSigmaTOF[4]=fabs(fPIDResponse->NumberOfSigmasTOF(aodtrack,AliPID::kProton));
1327 signalTPC = aodtrack->GetTPCsignal();
1328 if( (status&AliESDtrack::kTOFpid)!=0 && (status&AliESDtrack::kTIME)!=0 && (status&AliESDtrack::kTOFout)!=0 && (status&AliESDtrack::kTOFmismatch)<=0){// good tof hit
1329 fTempStruct[myTracks].fTOFhit = kTRUE;
1330 signalTOF = aodtrack->GetTOFsignal();
1331 aodtrack->GetIntegratedTimes(integratedTimesTOF);
1332 }else fTempStruct[myTracks].fTOFhit = kFALSE;
1334 }else {// FilterBit 7 PID workaround
1336 for(Int_t j = 0; j < fAOD->GetNumberOfTracks(); j++) {
1337 AliAODTrack* aodTrack2 = fAOD->GetTrack(j);
1338 if (!aodTrack2) continue;
1339 if(aodtrack->GetID() != (-aodTrack2->GetID() - 1)) continue;// (-aodTrack2->GetID() - 1)
1341 UInt_t status2=aodTrack2->GetStatus();
1343 nSigmaTPC[0]=fabs(fPIDResponse->NumberOfSigmasTPC(aodTrack2,AliPID::kElectron));
1344 nSigmaTPC[1]=fabs(fPIDResponse->NumberOfSigmasTPC(aodTrack2,AliPID::kMuon));
1345 nSigmaTPC[2]=fabs(fPIDResponse->NumberOfSigmasTPC(aodTrack2,AliPID::kPion));
1346 nSigmaTPC[3]=fabs(fPIDResponse->NumberOfSigmasTPC(aodTrack2,AliPID::kKaon));
1347 nSigmaTPC[4]=fabs(fPIDResponse->NumberOfSigmasTPC(aodTrack2,AliPID::kProton));
1349 nSigmaTOF[0]=fabs(fPIDResponse->NumberOfSigmasTOF(aodTrack2,AliPID::kElectron));
1350 nSigmaTOF[1]=fabs(fPIDResponse->NumberOfSigmasTOF(aodTrack2,AliPID::kMuon));
1351 nSigmaTOF[2]=fabs(fPIDResponse->NumberOfSigmasTOF(aodTrack2,AliPID::kPion));
1352 nSigmaTOF[3]=fabs(fPIDResponse->NumberOfSigmasTOF(aodTrack2,AliPID::kKaon));
1353 nSigmaTOF[4]=fabs(fPIDResponse->NumberOfSigmasTOF(aodTrack2,AliPID::kProton));
1354 signalTPC = aodTrack2->GetTPCsignal();
1356 if( (status2&AliESDtrack::kTOFpid)!=0 && (status2&AliESDtrack::kTIME)!=0 && (status2&AliESDtrack::kTOFout)!=0 && (status2&AliESDtrack::kTOFmismatch)<=0){// good tof hit
1357 fTempStruct[myTracks].fTOFhit = kTRUE;
1358 signalTOF = aodTrack2->GetTOFsignal();
1359 aodTrack2->GetIntegratedTimes(integratedTimesTOF);
1360 }else fTempStruct[myTracks].fTOFhit = kFALSE;
1363 }// FilterBit 7 PID workaround
1365 //cout<<nSigmaTPC[2]<<endl;
1367 ((TH3F*)fOutputList->FindObject("fTPCResponse"))->Fill(centralityPercentile, fTempStruct[myTracks].fMom, signalTPC);
1368 if(fTempStruct[myTracks].fTOFhit) {
1369 ((TH3F*)fOutputList->FindObject("fTOFResponse"))->Fill(centralityPercentile, fTempStruct[myTracks].fMom, signalTOF - integratedTimesTOF[3]);
1373 // Use TOF if good hit and above threshold
1374 if(fTempStruct[myTracks].fTOFhit && fTempStruct[myTracks].fMom > fTPCTOFboundry){
1375 if(nSigmaTOF[0]<fSigmaCutTOF) fTempStruct[myTracks].fElectron = kTRUE;// Electron candidate
1376 if(nSigmaTOF[2]<fSigmaCutTOF) fTempStruct[myTracks].fPion = kTRUE;// Pion candidate
1377 if(nSigmaTOF[3]<fSigmaCutTOF) fTempStruct[myTracks].fKaon = kTRUE;// Kaon candidate
1378 if(nSigmaTOF[4]<fSigmaCutTOF) fTempStruct[myTracks].fProton = kTRUE;// Proton candidate
1379 }else {// TPC info instead
1380 if(nSigmaTPC[0]<fSigmaCutTPC) fTempStruct[myTracks].fElectron = kTRUE;// Electron candidate
1381 if(nSigmaTPC[2]<fSigmaCutTPC) fTempStruct[myTracks].fPion = kTRUE;// Pion candidate
1382 if(nSigmaTPC[3]<fSigmaCutTPC) fTempStruct[myTracks].fKaon = kTRUE;// Kaon candidate
1383 if(nSigmaTPC[4]<fSigmaCutTPC) fTempStruct[myTracks].fProton = kTRUE;// Proton candidate
1387 // Ensure there is only 1 candidate per track
1388 if(fTempStruct[myTracks].fElectron && fTempStruct[myTracks].fMom < 0.45) continue;// Remove electron band
1389 if(!fTempStruct[myTracks].fPion && !fTempStruct[myTracks].fKaon && !fTempStruct[myTracks].fProton) continue;
1390 if(fTempStruct[myTracks].fPion && fTempStruct[myTracks].fKaon) continue;
1391 if(fTempStruct[myTracks].fPion && fTempStruct[myTracks].fProton) continue;
1392 if(fTempStruct[myTracks].fKaon && fTempStruct[myTracks].fProton) continue;
1393 if(fTempStruct[myTracks].fPion && fTempStruct[myTracks].fKaon && fTempStruct[myTracks].fProton) continue;
1394 ////////////////////////
1395 if(fTempStruct[myTracks].fProton && fTempStruct[myTracks].fMom < 0.25) continue;//extra cut for protons
1397 if(!fTempStruct[myTracks].fPion) continue;// only pions
1402 if(fTempStruct[myTracks].fCharge==+1) {
1403 ((TH2F*)fOutputList->FindObject("fDCAxyDistPlus"))->Fill(fTempStruct[myTracks].fPt, dca2[0]);
1404 ((TH2F*)fOutputList->FindObject("fDCAzDistPlus"))->Fill(fTempStruct[myTracks].fPt, dca2[1]);
1406 ((TH2F*)fOutputList->FindObject("fDCAxyDistMinus"))->Fill(fTempStruct[myTracks].fPt, dca2[0]);
1407 ((TH2F*)fOutputList->FindObject("fDCAzDistMinus"))->Fill(fTempStruct[myTracks].fPt, dca2[1]);
1410 ((TH3F*)fOutputList->FindObject("fPhiPtDist"))->Fill(aodtrack->Charge(), aodtrack->Phi(), aodtrack->Pt());
1411 ((TH3F*)fOutputList->FindObject("fPtEtaDist"))->Fill(aodtrack->Charge(), aodtrack->Pt(), aodtrack->Eta());
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;
1427 ((TH2D*)fOutputList->FindObject("fTrackChi2NDF"))->Fill(centralityPercentile, aodtrack->Chi2perNDF());
1428 ((TH2D*)fOutputList->FindObject("fTrackTPCncls"))->Fill(centralityPercentile, aodtrack->GetTPCncls());
1429 if(aodtrack->Chi2perNDF() > fMaxChi2NDF) continue;
1430 if(aodtrack->GetTPCncls() < fMinTPCncls) continue;
1433 if(aodtrack->Charge() > 0) positiveTracks++;
1434 else negativeTracks++;
1436 if(fTempStruct[myTracks].fPion) pionCount++;
1437 if(fTempStruct[myTracks].fKaon) kaonCount++;
1438 if(fTempStruct[myTracks].fProton) protonCount++;
1442 if(fMCcase){// muon mothers
1443 AliAODMCParticle *tempMCTrack=(AliAODMCParticle*)mcArray->At(abs(aodtrack->GetLabel()));
1444 if(abs(tempMCTrack->GetPdgCode())==13 && tempMCTrack->GetMother()>0){// muons
1445 AliAODMCParticle *parent=(AliAODMCParticle*)mcArray->At(tempMCTrack->GetMother());
1446 if(parent->IsPhysicalPrimary()){
1447 ((TH1D*)fOutputList->FindObject("fMuonParents"))->Fill(abs(parent->GetPdgCode()));
1448 }else ((TH1D*)fOutputList->FindObject("fSecondaryMuonParents"))->Fill(abs(parent->GetPdgCode()));
1450 ((TH1D*)fOutputList->FindObject("fPionCandidates"))->Fill(abs(tempMCTrack->GetPdgCode()));
1453 }else {// ESD tracks
1454 cout<<"ESDs not supported currently"<<endl;
1458 // Generator info only
1459 if(fMCcase && fGeneratorOnly){
1460 myTracks=0; pionCount=0; kaonCount=0; protonCount=0;// reset track counters
1461 for(Int_t mctrackN=0; mctrackN<mcArray->GetEntriesFast(); mctrackN++){
1462 if(myTracks >= fMultLimit) {cout<<"More tracks than Track Limit"<<endl; return;}
1463 if(myTracks >= 1300) continue;// additional cut to limit high mult events which exceed pair # limits
1465 AliAODMCParticle *mcParticle = (AliAODMCParticle*)mcArray->At(mctrackN);
1466 if(!mcParticle) continue;
1467 if(fabs(mcParticle->Eta())>0.8) continue;
1468 if(mcParticle->Charge()!=-3 && mcParticle->Charge()!=+3) continue;// x3 by convention
1469 if(mcParticle->Pt() < 0.16 || mcParticle->Pt() > 1.0) continue;
1470 if(!mcParticle->IsPrimary()) continue;
1471 if(!mcParticle->IsPhysicalPrimary()) continue;
1472 if(abs(mcParticle->GetPdgCode())!=211) continue;
1474 fTempStruct[myTracks].fP[0] = mcParticle->Px();
1475 fTempStruct[myTracks].fP[1] = mcParticle->Py();
1476 fTempStruct[myTracks].fP[2] = mcParticle->Pz();
1477 fTempStruct[myTracks].fX[0] = 0.; fTempStruct[myTracks].fX[1] = 0.; fTempStruct[myTracks].fX[2] = 0.;
1479 fTempStruct[myTracks].fId = myTracks;// use my track counter
1480 fTempStruct[myTracks].fLabel = mctrackN;
1481 fTempStruct[myTracks].fPhi = atan2(fTempStruct[myTracks].fP[1], fTempStruct[myTracks].fP[0]);
1482 if(fTempStruct[myTracks].fPhi < 0) fTempStruct[myTracks].fPhi += 2*PI;
1483 fTempStruct[myTracks].fPt = sqrt(pow(fTempStruct[myTracks].fP[0],2) + pow(fTempStruct[myTracks].fP[1],2));
1484 fTempStruct[myTracks].fMom = sqrt( pow(fTempStruct[myTracks].fPt,2) + pow(fTempStruct[myTracks].fP[2],2) );
1485 fTempStruct[myTracks].fEta = mcParticle->Eta();
1486 fTempStruct[myTracks].fCharge = int(mcParticle->Charge()/3.);
1487 fTempStruct[myTracks].fDCAXY = 0.;
1488 fTempStruct[myTracks].fDCAZ = 0.;
1489 fTempStruct[myTracks].fDCA = 0.;
1490 fTempStruct[myTracks].fPion = kTRUE;
1491 fTempStruct[myTracks].fEaccepted = sqrt(pow(fTempStruct[myTracks].fMom,2) + pow(fTrueMassPi,2));
1492 fTempStruct[myTracks].fKey = 1;
1502 ((TH1F*)fOutputList->FindObject("fMultDist4"))->Fill(myTracks);
1506 //cout<<"There are "<<myTracks<<" myTracks"<<endl;
1507 //cout<<"pionCount = "<<pionCount<<" kaonCount = "<<kaonCount<<" protonCount = "<<protonCount<<endl;
1509 /////////////////////////////////////////
1510 // Pion Multiplicity Cut (To ensure all Correlation orders are present in each event)
1511 if(myTracks < 3) {/*cout<<"Less than 3 tracks. Skipping Event."<<endl;*/ return;}
1512 /////////////////////////////////////////
1515 ////////////////////////////////
1516 ///////////////////////////////
1517 // Mbin determination
1520 for(Int_t i=0; i<fCentBins; i++){
1521 if( pionCount >= fMultLimits[i] && pionCount < fMultLimits[i+1]) {fMbin = fCentBins-i-1; break;}
1527 if(fMbin==0) fFSIindex = 0;//0-5%
1528 else if(fMbin==1) fFSIindex = 1;//5-10%
1529 else if(fMbin<=3) fFSIindex = 2;//10-20%
1530 else if(fMbin<=5) fFSIindex = 3;//20-30%
1531 else if(fMbin<=7) fFSIindex = 4;//30-40%
1532 else if(fMbin<=9) fFSIindex = 5;//40-50%
1533 else if(fMbin<=12) fFSIindex = 6;//40-50%
1534 else if(fMbin<=15) fFSIindex = 7;//40-50%
1535 else if(fMbin<=18) fFSIindex = 8;//40-50%
1536 else fFSIindex = 8;//90-100%
1537 }else fFSIindex = 9;// pp and pPb
1539 if(fMCcase){// FSI binning for MC
1540 if(fRMax>=10) fFSIindex = 0;
1541 else if(fRMax>=9) fFSIindex = 1;
1542 else if(fRMax>=8) fFSIindex = 2;
1543 else if(fRMax>=7) fFSIindex = 3;
1544 else if(fRMax>=6) fFSIindex = 4;
1545 else if(fRMax>=5) fFSIindex = 5;
1546 else if(fRMax>=4) fFSIindex = 6;
1547 else if(fRMax>=3) fFSIindex = 7;
1548 else if(fRMax>=2) fFSIindex = 8;
1553 Bool_t useV0=kFALSE;
1554 if(fPbPbcase) useV0=kTRUE;
1555 if(!fPbPbcase && fAOD->GetRunNumber() >= 195344 && fAOD->GetRunNumber() <= 195677) useV0=kTRUE;
1557 AliAODVZERO *vZero = fAOD->GetVZEROData();
1558 Float_t vZeroAmp = vZero->GetMTotV0A();
1559 centrality = fAOD->GetCentrality();
1560 centralityPercentile = centrality->GetCentralityPercentile("V0M");
1561 for(Int_t i=0; i<fCentBins; i++){
1562 if(vZeroAmp/4.4 >= fMultLimits[i] && vZeroAmp/4.4 < fMultLimits[i+1]) {fMbin = fCentBins-i-1; break;}
1564 ((TH1D*)fOutputList->FindObject("fV0TotSignal"))->Fill(vZeroAmp);
1565 //cout<<centralityPercentile<<" "<<vZeroAmp<<" "<<fMbin<<endl;
1568 vZeroAmp = vZero->GetMTotV0C();
1569 for(Int_t i=0; i<fCentBins; i++){
1570 if(vZeroAmp/4.4 >= fMultLimits[i] && vZeroAmp/4.4 < fMultLimits[i+1]) {fMbinV0C = fCentBins-i-1; break;}
1573 Int_t fMbinV0AplusC=-1;
1574 vZeroAmp = vZero->GetMTotV0A() + vZero->GetMTotV0C();
1575 for(Int_t i=0; i<fCentBins; i++){
1576 if(vZeroAmp/4.4 >= fMultLimits[i] && vZeroAmp/4.4 < fMultLimits[i+1]) {fMbinV0AplusC = fCentBins-i-1; break;}
1578 ((TH2D*)fOutputList->FindObject("fAvgMultHisto2DV0C"))->Fill(fMbinV0C+1., pionCount);
1579 ((TH2D*)fOutputList->FindObject("fAvgMultHisto2DV0AplusC"))->Fill(fMbinV0AplusC+1., pionCount);
1583 if(fMbin==-1) {cout<<pionCount<<" Bad Mbin+++++++++++++++++++++++++++++++++++++++++++++++++++"<<endl; return;}
1585 ((TH1F*)fOutputList->FindObject("fEvents1"))->Fill(fMbin+1);
1586 ((TProfile*)fOutputList->FindObject("fAvgMult"))->Fill(fMbin+1., pionCount);
1587 ((TH2D*)fOutputList->FindObject("fAvgMultHisto2D"))->Fill(fMbin+1., pionCount);
1589 ((TH2D*)fOutputList->FindObject("fdNchdEtaResponse"))->Fill(pow(trackletMult,1/3.), pow(mcNch,1/3.));
1590 ((TH2D*)fOutputList->FindObject("fNpionTrueDist"))->Fill(fMbin+1., mcNpion);
1591 ((TH2D*)fOutputList->FindObject("fNchTrueDist"))->Fill(fMbin+1., mcNch);// default Nch mapping
1592 ((TH2D*)fOutputList->FindObject("fNchTrueDistFullPt"))->Fill(fMbin+1., mcNchFullPt);// full Pt Nch range mapping
1593 ((TH2D*)fOutputList->FindObject("fNchTrueDistPubMethod"))->Fill(fMbin+1., mcNchPubMethod);// Published pp Method Nch mapping
1594 ((TProfile*)fOutputList->FindObject("fAvgNchTrueDistvsPubMethodBin"))->Fill(mcNchPubMethod, mcNch);// Mapping of Published bins to default Nch bins
1595 ((TProfile*)fOutputList->FindObject("fAvgRecRate"))->Fill(mcNpion, pionCount);
1598 ((TH2D*)fOutputList->FindObject("fdCentVsNchdEta"))->Fill(fMbin+1, pow(trackletMult,1/3.));
1599 centrality = fAOD->GetCentrality();
1600 centralityPercentile = centrality->GetCentralityPercentile("V0M");
1601 ((TH2D*)fOutputList->FindObject("fMultBinVsCent"))->Fill(fMbin+1, centralityPercentile);
1605 if(fMbin < fCentBinLowLimit || fMbin > fCentBinHighLimit) {cout<<"Mult out of range"<<endl; return;}
1607 //////////////////////////////////////////////////
1608 fEDbin=0;// Extra Dimension bin (Kt, (Kt-Psi),....)
1609 //////////////////////////////////////////////////
1613 //return;// un-comment for a run to calculate Nrec to Nch Mapping
1614 // to test the eta dependence of radii
1615 /*Int_t firstTrackCount=myTracks;
1616 Int_t newTrackCount=0;
1617 myTracks=0; pionCount=0; kaonCount=0; protonCount=0;// reset track counters
1618 for(Int_t newTracks=0; newTracks<firstTrackCount; newTracks++){
1620 if(fTempStruct[newTracks].fEta > -0.4) continue;
1622 fTempStruct[newTrackCount]=fTempStruct[newTracks];
1627 myTracks=newTrackCount;// re-assign main counter
1630 ////////////////////////////////////
1631 // Add event to buffer if > 0 tracks
1633 fEC[zbin][fMbin]->FIFOShift();
1634 (fEvt) = fEC[zbin][fMbin]->fEvtStr;
1635 (fEvt)->fNtracks = myTracks;
1636 (fEvt)->fFillStatus = 1;
1637 for(Int_t i=0; i<myTracks; i++) (fEvt)->fTracks[i] = fTempStruct[i];
1639 (fEvt)->fMCarraySize = mcArray->GetEntriesFast();
1640 for(Int_t i=0; i<mcArray->GetEntriesFast(); i++) {
1641 AliAODMCParticle *tempMCTrack = (AliAODMCParticle*)mcArray->At(i);
1642 (fEvt)->fMCtracks[i].fPx = tempMCTrack->Px();
1643 (fEvt)->fMCtracks[i].fPy = tempMCTrack->Py();
1644 (fEvt)->fMCtracks[i].fPz = tempMCTrack->Pz();
1645 (fEvt)->fMCtracks[i].fPtot = sqrt(pow(tempMCTrack->Px(),2)+pow(tempMCTrack->Py(),2)+pow(tempMCTrack->Pz(),2));
1651 Float_t qinv12=0, qinv13=0, qinv23=0;
1652 Float_t qout=0, qside=0, qlong=0;
1653 Float_t qoutMC=0, qsideMC=0, qlongMC=0;
1654 Float_t firstQ=0, secondQ=0, thirdQ=0;
1655 Float_t firstQMC=0, secondQMC=0, thirdQMC=0;
1656 Float_t transK12=0, transK3=0;
1657 Float_t q3=0, q3MC=0;
1658 Int_t ch1=0, ch2=0, ch3=0;
1659 Short_t key1=0, key2=0, key3=0;
1660 Int_t bin1=0, bin2=0, bin3=0;
1661 Float_t pVect1[4]={0};
1662 Float_t pVect2[4]={0};
1663 Float_t pVect3[4]={0};
1664 Float_t pVect1MC[4]={0};
1665 Float_t pVect2MC[4]={0};
1666 Float_t pVect3MC[4]={0};
1667 Int_t index1=0, index2=0, index3=0;
1668 Float_t qinv12MC=0, qinv13MC=0, qinv23MC=0;
1670 AliAODMCParticle *mcParticle1=0x0;
1671 AliAODMCParticle *mcParticle2=0x0;
1673 if(fPdensityPairCut){
1674 ////////////////////
1675 Int_t pairCountSE=0, pairCountME=0;
1676 Int_t normPairCount[2]={0};
1677 Int_t numOtherPairs1[2][fMultLimit];
1678 Int_t numOtherPairs2[2][fMultLimit];
1679 Bool_t exitCode=kFALSE;
1680 Int_t tempNormFillCount[2][2][2][10][5];
1683 // reset to defaults
1684 for(Int_t i=0; i<fMultLimit; i++) {
1685 fPairLocationSE[i]->Set(fMultLimit,fDefaultsInt);
1686 fPairLocationME[i]->Set(fMultLimit,fDefaultsInt);
1688 // Normalization Utilities
1689 fOtherPairLocation1[0][i]->Set(fMultLimit,fDefaultsInt);
1690 fOtherPairLocation1[1][i]->Set(fMultLimit,fDefaultsInt);
1691 fOtherPairLocation2[0][i]->Set(fMultLimit,fDefaultsInt);
1692 fOtherPairLocation2[1][i]->Set(fMultLimit,fDefaultsInt);
1693 fNormPairSwitch[0][i]->Set(fMultLimit,fDefaultsCharMult);
1694 fNormPairSwitch[1][i]->Set(fMultLimit,fDefaultsCharMult);
1695 fNormPairSwitch[2][i]->Set(fMultLimit,fDefaultsCharMult);
1696 numOtherPairs1[0][i]=0;
1697 numOtherPairs1[1][i]=0;
1698 numOtherPairs2[0][i]=0;
1699 numOtherPairs2[1][i]=0;
1701 // Track Merging/Splitting Utilities
1702 fPairSplitCut[0][i]->Set(fMultLimit,fDefaultsCharMult);// P11
1703 fPairSplitCut[1][i]->Set(fMultLimit,fDefaultsCharMult);// P12
1704 fPairSplitCut[2][i]->Set(fMultLimit,fDefaultsCharMult);// P13
1705 fPairSplitCut[3][i]->Set(fMultLimit,fDefaultsCharMult);// P23
1708 // Reset the temp Normalization counters
1709 for(Int_t i=0; i<2; i++){// Charge1
1710 for(Int_t j=0; j<2; j++){// Charge2
1711 for(Int_t k=0; k<2; k++){// Charge3
1712 for(Int_t l=0; l<10; l++){// FillIndex (species Combination)
1713 for(Int_t m=0; m<5; m++){// Term (Cumulant term)
1714 tempNormFillCount[i][j][k][l][m] = 0;
1723 /////////////////////////////////////////////////////////////////
1724 // extended range Q3 baseline
1725 /*for(Int_t iter=0; iter<3; iter++){
1726 for (Int_t i=0; i<myTracks; i++) {
1731 if(en2!=0) start2=0;
1733 for (Int_t j=start2; j<(fEvt+en2)->fNtracks; j++) {
1734 if((fEvt)->fTracks[i].fCharge != (fEvt+en2)->fTracks[j].fCharge) continue;
1735 key1 = (fEvt)->fTracks[i].fKey;
1736 key2 = (fEvt+en2)->fTracks[j].fKey;
1737 Short_t fillIndex2 = FillIndex2part(key1+key2);
1738 pVect1[0]=(fEvt)->fTracks[i].fEaccepted; pVect2[0]=(fEvt+en2)->fTracks[j].fEaccepted;
1739 pVect1[1]=(fEvt)->fTracks[i].fP[0]; pVect2[1]=(fEvt+en2)->fTracks[j].fP[0];
1740 pVect1[2]=(fEvt)->fTracks[i].fP[1]; pVect2[2]=(fEvt+en2)->fTracks[j].fP[1];
1741 pVect1[3]=(fEvt)->fTracks[i].fP[2]; pVect2[3]=(fEvt+en2)->fTracks[j].fP[2];
1742 qinv12 = GetQinv(fillIndex2, pVect1, pVect2);
1744 if(qinv12>0.5) continue;
1745 if(!AcceptPair(&((fEvt)->fTracks[i]), &((fEvt+en2)->fTracks[j]))) continue;
1751 if(iter>0) start3=0;
1753 for (Int_t k=start3; k<(fEvt+en3)->fNtracks; k++) {
1754 if((fEvt)->fTracks[i].fCharge != (fEvt+en3)->fTracks[k].fCharge) continue;
1755 pVect3[0]=(fEvt+en3)->fTracks[k].fEaccepted;
1756 pVect3[1]=(fEvt+en3)->fTracks[k].fP[0];
1757 pVect3[2]=(fEvt+en3)->fTracks[k].fP[1];
1758 pVect3[3]=(fEvt+en3)->fTracks[k].fP[2];
1759 qinv13 = GetQinv(fillIndex2, pVect1, pVect3);
1760 if(qinv13>0.5) continue;
1761 qinv23 = GetQinv(fillIndex2, pVect2, pVect3);
1762 if(qinv23>0.5) continue;
1763 if(!AcceptPair(&((fEvt)->fTracks[i]), &((fEvt+en3)->fTracks[k]))) continue;
1764 if(!AcceptPair(&((fEvt+en2)->fTracks[j]), &((fEvt+en3)->fTracks[k]))) continue;
1766 q3 = sqrt(pow(qinv12,2) + pow(qinv13,2) + pow(qinv23,2));
1768 if(iter==0) ((TH1D*)fOutputList->FindObject("fExtendedQ3Histo_term1"))->Fill(q3);
1769 if(iter==1) ((TH1D*)fOutputList->FindObject("fExtendedQ3Histo_term2"))->Fill(q3);
1770 if(iter==2) ((TH1D*)fOutputList->FindObject("fExtendedQ3Histo_term5"))->Fill(q3);
1777 ///////////////////////////////////////////////////////
1778 // Start the pairing process
1782 for (Int_t i=0; i<myTracks; i++) {
1787 for (Int_t j=i+1; j<(fEvt+en2)->fNtracks; j++) {
1789 key1 = (fEvt)->fTracks[i].fKey;
1790 key2 = (fEvt+en2)->fTracks[j].fKey;
1791 Short_t fillIndex2 = FillIndex2part(key1+key2);
1792 Short_t qCutBin = SetQcutBin(fillIndex2);
1793 Short_t normBin = SetNormBin(fillIndex2);
1794 pVect1[0]=(fEvt)->fTracks[i].fEaccepted; pVect2[0]=(fEvt+en2)->fTracks[j].fEaccepted;
1795 pVect1[1]=(fEvt)->fTracks[i].fP[0]; pVect2[1]=(fEvt+en2)->fTracks[j].fP[0];
1796 pVect1[2]=(fEvt)->fTracks[i].fP[1]; pVect2[2]=(fEvt+en2)->fTracks[j].fP[1];
1797 pVect1[3]=(fEvt)->fTracks[i].fP[2]; pVect2[3]=(fEvt+en2)->fTracks[j].fP[2];
1801 qinv12 = GetQinv(fillIndex2, pVect1, pVect2);
1802 GetQosl(pVect1, pVect2, qout, qside, qlong);
1803 transK12 = sqrt(pow(pVect1[1]+pVect2[1],2) + pow(pVect1[2]+pVect2[2],2))/2.;
1808 ///////////////////////////////
1809 ch1 = Int_t(((fEvt)->fTracks[i].fCharge + 1)/2.);
1810 ch2 = Int_t(((fEvt+en2)->fTracks[j].fCharge + 1)/2.);
1811 SetFillBins2(fillIndex2, key1, key2, ch1, ch2, bin1, bin2);
1813 if(fMCcase && ch1==ch2 && fMbin==0 && qinv12<0.2){
1814 //////////////////////////
1815 // pad-row method testing
1816 Float_t coeff = (5)*0.2*(0.18/1.2);// 5 to evaluate at 1.0m in TPC
1817 Float_t phi1 = (fEvt)->fTracks[i].fPhi - asin((fEvt)->fTracks[i].fCharge*(0.1*fBfield)*coeff/(fEvt)->fTracks[i].fPt);
1818 if(phi1 > 2*PI) phi1 -= 2*PI;
1819 if(phi1 < 0) phi1 += 2*PI;
1820 Float_t phi2 = (fEvt+en2)->fTracks[j].fPhi - asin((fEvt+en2)->fTracks[j].fCharge*(0.1*fBfield)*coeff/(fEvt+en2)->fTracks[j].fPt);
1821 if(phi2 > 2*PI) phi2 -= 2*PI;
1822 if(phi2 < 0) phi2 += 2*PI;
1823 Float_t deltaphi = phi1 - phi2;
1824 if(deltaphi > PI) deltaphi -= PI;
1825 if(deltaphi < -PI) deltaphi += PI;
1827 Int_t ncl1 = (fEvt)->fTracks[i].fClusterMap.GetNbits();
1828 Int_t ncl2 = (fEvt+en2)->fTracks[j].fClusterMap.GetNbits();
1829 Float_t sumCls = 0; Float_t sumSha = 0; Float_t sumQ = 0;
1830 Double_t shfrac = 0; //Double_t qfactor = 0;
1831 for(Int_t imap = 0; imap < ncl1 && imap < ncl2; imap++) {
1832 if ((fEvt)->fTracks[i].fClusterMap.TestBitNumber(imap) && (fEvt+en2)->fTracks[j].fClusterMap.TestBitNumber(imap)) {// Both clusters
1833 if ((fEvt)->fTracks[i].fSharedMap.TestBitNumber(imap) && (fEvt+en2)->fTracks[j].fSharedMap.TestBitNumber(imap)) { // Shared
1837 else {sumQ--; sumCls+=2;}
1839 else if ((fEvt)->fTracks[i].fClusterMap.TestBitNumber(imap) || (fEvt+en2)->fTracks[j].fClusterMap.TestBitNumber(imap)) {// Non shared
1844 //qfactor = sumQ*1.0/sumCls;
1845 shfrac = sumSha*1.0/sumCls;
1847 if(fabs(deltaphi)<0.07 && fabs((fEvt)->fTracks[i].fEta-(fEvt+en2)->fTracks[j].fEta) < 0.03){
1848 ((TH3D*)fOutputList->FindObject("fPairsPadRowNum"))->Fill(transK12, shfrac, qinv12);
1851 for(Int_t rstep=0; rstep<10; rstep++){
1852 coeff = (rstep)*0.2*(0.18/1.2);
1853 phi1 = (fEvt)->fTracks[i].fPhi - asin((fEvt)->fTracks[i].fCharge*(0.1*fBfield)*coeff/(fEvt)->fTracks[i].fPt);
1854 if(phi1 > 2*PI) phi1 -= 2*PI;
1855 if(phi1 < 0) phi1 += 2*PI;
1856 phi2 = (fEvt+en2)->fTracks[j].fPhi - asin((fEvt+en2)->fTracks[j].fCharge*(0.1*fBfield)*coeff/(fEvt+en2)->fTracks[j].fPt);
1857 if(phi2 > 2*PI) phi2 -= 2*PI;
1858 if(phi2 < 0) phi2 += 2*PI;
1859 deltaphi = phi1 - phi2;
1860 if(deltaphi > PI) deltaphi -= PI;
1861 if(deltaphi < -PI) deltaphi += PI;
1863 if(fabs((fEvt)->fTracks[i].fEta-(fEvt+en2)->fTracks[j].fEta) < 0.03){
1864 ((TH3F*)fOutputList->FindObject("fPairsShareFracDPhiNum"))->Fill(rstep, shfrac, deltaphi);
1866 //if(shfrac < 0.05){
1867 ((TH3F*)fOutputList->FindObject("fPairsDetaDPhiNum"))->Fill(rstep, (fEvt)->fTracks[i].fEta-(fEvt+en2)->fTracks[j].fEta, deltaphi);
1872 }// MCcase and pair selection
1874 // Pair Splitting/Merging cut
1875 if(qinv12 < fQLowerCut) continue;// remove unwanted low-q pairs (also a type of track splitting/merging cut)
1876 if(ch1 == ch2 && !fGeneratorOnly){
1877 if(!AcceptPair(&((fEvt)->fTracks[i]), &((fEvt+en2)->fTracks[j]))) {
1878 fPairSplitCut[0][i]->AddAt('1',j);
1879 ((TH1F*)fOutputList->FindObject("fRejectedPairs"))->Fill(qinv12);
1885 if(fMCcase && fillIndex2==0){
1887 // Check that label does not exceed stack size
1888 if((fEvt)->fTracks[i].fLabel < (fEvt)->fMCarraySize && (fEvt+en2)->fTracks[j].fLabel < (fEvt+en2)->fMCarraySize){
1889 pVect1MC[0]=sqrt(pow((fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPtot,2)+pow(fTrueMassPi,2));
1890 pVect2MC[0]=sqrt(pow((fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPtot,2)+pow(fTrueMassPi,2));
1891 pVect1MC[1]=(fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPx; pVect2MC[1]=(fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPx;
1892 pVect1MC[2]=(fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPy; pVect2MC[2]=(fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPy;
1893 pVect1MC[3]=(fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPz; pVect2MC[3]=(fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPz;
1894 qinv12MC = GetQinv(fillIndex2, pVect1MC, pVect2MC);
1895 GetQosl(pVect1MC, pVect2MC, qoutMC, qsideMC, qlongMC);
1896 if(qinv12<0.1 && ch1==ch2) {
1897 ((TProfile*)fOutputList->FindObject("fQsmearMean"))->Fill(1.,qinv12-qinv12MC);
1898 ((TProfile*)fOutputList->FindObject("fQsmearSq"))->Fill(1.,1000.*pow(qinv12-qinv12MC,2));
1899 ((TH1D*)fOutputList->FindObject("fQDist"))->Fill(qinv12-qinv12MC);
1904 mcParticle1 = (AliAODMCParticle*)mcArray->At(abs((fEvt)->fTracks[i].fLabel));
1905 mcParticle2 = (AliAODMCParticle*)mcArray->At(abs((fEvt+en2)->fTracks[j].fLabel));
1908 // secondary contamination
1909 if(abs(mcParticle1->GetPdgCode())==211 && abs(mcParticle2->GetPdgCode())==211){
1911 ((TH3D*)fOutputList->FindObject("fAllSCPionPairs"))->Fill(fMbin+1, transK12, qinv12);
1912 if(!mcParticle1->IsSecondaryFromWeakDecay() && !mcParticle2->IsSecondaryFromWeakDecay()) {
1913 ((TH3D*)fOutputList->FindObject("fPrimarySCPionPairs"))->Fill(fMbin+1, transK12, qinv12);
1916 ((TH3D*)fOutputList->FindObject("fAllMCPionPairs"))->Fill(fMbin+1, transK12, qinv12);
1917 if(!mcParticle1->IsSecondaryFromWeakDecay() && !mcParticle2->IsSecondaryFromWeakDecay()) {
1918 ((TH3D*)fOutputList->FindObject("fPrimaryMCPionPairs"))->Fill(fMbin+1, transK12, qinv12);
1924 if(fFSIindex<=1) rForQW=10;
1925 else if(fFSIindex==2) rForQW=9;
1926 else if(fFSIindex==3) rForQW=8;
1927 else if(fFSIindex==4) rForQW=7;
1928 else if(fFSIindex==5) rForQW=6;
1929 else if(fFSIindex==6) rForQW=5;
1930 else if(fFSIindex==7) rForQW=4;
1931 else if(fFSIindex==8) rForQW=3;
1934 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].fMCqinv->Fill(qinv12MC, MCWeight(ch1,ch2,rForQW,10,qinv12MC));// was 4,5
1935 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].fMCqinvQW->Fill(qinv12MC, qinv12MC*MCWeight(ch1,ch2,rForQW,10,qinv12MC));// was 4,5
1937 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].fPIDpurityDen->Fill(transK12, qinv12);
1940 if((abs(mcParticle1->GetPdgCode()) + abs(mcParticle2->GetPdgCode()))==22) SCNumber=1;// e-e
1941 else if((abs(mcParticle1->GetPdgCode()) + abs(mcParticle2->GetPdgCode()))==24) SCNumber=2;// e-mu
1942 else if((abs(mcParticle1->GetPdgCode()) + abs(mcParticle2->GetPdgCode()))==222) SCNumber=3;// e-pi
1943 else if((abs(mcParticle1->GetPdgCode()) + abs(mcParticle2->GetPdgCode()))==332) SCNumber=4;// e-k
1944 else if((abs(mcParticle1->GetPdgCode()) + abs(mcParticle2->GetPdgCode()))==2223) SCNumber=5;// e-p
1945 else if((abs(mcParticle1->GetPdgCode()) + abs(mcParticle2->GetPdgCode()))==26) SCNumber=6;// mu-mu
1946 else if((abs(mcParticle1->GetPdgCode()) + abs(mcParticle2->GetPdgCode()))==224) SCNumber=7;// mu-pi
1947 else if((abs(mcParticle1->GetPdgCode()) + abs(mcParticle2->GetPdgCode()))==334) SCNumber=8;// mu-k
1948 else if((abs(mcParticle1->GetPdgCode()) + abs(mcParticle2->GetPdgCode()))==2225) SCNumber=9;// mu-p
1949 else if((abs(mcParticle1->GetPdgCode()) + abs(mcParticle2->GetPdgCode()))==422) SCNumber=10;// pi-pi
1950 else if((abs(mcParticle1->GetPdgCode()) + abs(mcParticle2->GetPdgCode()))==532) SCNumber=11;// pi-k
1951 else if((abs(mcParticle1->GetPdgCode()) + abs(mcParticle2->GetPdgCode()))==2423) SCNumber=12;// pi-p
1952 else if((abs(mcParticle1->GetPdgCode()) + abs(mcParticle2->GetPdgCode()))==642) SCNumber=13;// k-k
1953 else if((abs(mcParticle1->GetPdgCode()) + abs(mcParticle2->GetPdgCode()))==2533) SCNumber=14;// k-p
1954 else if((abs(mcParticle1->GetPdgCode()) + abs(mcParticle2->GetPdgCode()))==4424) SCNumber=15;// p-p
1957 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].fPIDpurityNum->Fill(SCNumber, transK12, qinv12);
1959 ///////////////////////
1960 // muon contamination
1961 if(qinv12 < fQcut[0] && ((fEvt)->fTracks[i].fLabel != (fEvt+en2)->fTracks[j].fLabel)){
1962 if(abs(mcParticle1->GetPdgCode())==13 || abs(mcParticle2->GetPdgCode())==13){// muon check
1963 Float_t Pparent1[4]={pVect1MC[0],pVect1MC[1],pVect1MC[2],pVect1MC[3]};
1964 Float_t Pparent2[4]={pVect2MC[0],pVect2MC[1],pVect2MC[2],pVect2MC[3]};
1965 Bool_t pionParent1=kFALSE, pionParent2=kFALSE;
1966 if(abs(mcParticle1->GetPdgCode())==13) {
1967 AliAODMCParticle *parent1=(AliAODMCParticle*)mcArray->At(mcParticle1->GetMother());
1968 if(abs(parent1->GetPdgCode())==211) {
1970 Pparent1[1] = parent1->Px(); Pparent1[2] = parent1->Py(); Pparent1[3] = parent1->Pz();
1971 Pparent1[0] = sqrt(pow(Pparent1[1],2)+pow(Pparent1[2],2)+pow(Pparent1[3],2)+pow(fTrueMassPi,2));
1975 if(abs(mcParticle2->GetPdgCode())==13) {
1976 AliAODMCParticle *parent2=(AliAODMCParticle*)mcArray->At(mcParticle2->GetMother());
1977 if(abs(parent2->GetPdgCode())==211) {
1979 Pparent2[1] = parent2->Px(); Pparent2[2] = parent2->Py(); Pparent2[3] = parent2->Pz();
1980 Pparent2[0] = sqrt(pow(Pparent2[1],2)+pow(Pparent2[2],2)+pow(Pparent2[3],2)+pow(fTrueMassPi,2));
1984 Float_t parentQinv12 = GetQinv(0, Pparent1, Pparent2);
1985 Float_t WInput = 1.0, muonPionK12=1.0, pionPionK12=1.0;
1986 if(parentQinv12 > 0.001 && parentQinv12 < 0.2) {
1987 WInput = MCWeight(ch1,ch2, fRMax, 25, parentQinv12);
1988 muonPionK12 = FSICorrelation2(ch1, ch2, qinv12MC);
1989 pionPionK12 = FSICorrelation2(ch1, ch2, parentQinv12);
1992 if(ch1 != ch2) ChComb=1;
1993 if(pionParent1 || pionParent2){
1994 ((TH3D*)fOutputList->FindObject("fMuonContamSmearedNum2"))->Fill(ChComb, transK12, qinv12MC, WInput);
1995 ((TH3D*)fOutputList->FindObject("fMuonContamSmearedDen2"))->Fill(ChComb, transK12, qinv12MC);
1996 ((TH3D*)fOutputList->FindObject("fMuonContamIdealNum2"))->Fill(ChComb, transK12, parentQinv12, WInput);
1997 ((TH3D*)fOutputList->FindObject("fMuonContamIdealDen2"))->Fill(ChComb, transK12, parentQinv12);
1998 ((TH3D*)fOutputList->FindObject("fMuonPionDeltaQinv"))->Fill(ChComb, transK12, qinv12MC-parentQinv12);
1999 ((TH3D*)fOutputList->FindObject("fMuonPionK2"))->Fill(ChComb, transK12, qinv12MC, muonPionK12);
2000 ((TH3D*)fOutputList->FindObject("fPionPionK2"))->Fill(ChComb, transK12, parentQinv12, pionPionK12);
2002 ////////////////////////////////////
2005 for (Int_t k=j+1; k<(fEvt+en3)->fNtracks; k++) {
2006 pVect3[0]=(fEvt+en3)->fTracks[k].fEaccepted;
2007 pVect3[1]=(fEvt+en3)->fTracks[k].fP[0];
2008 pVect3[2]=(fEvt+en3)->fTracks[k].fP[1];
2009 pVect3[3]=(fEvt+en3)->fTracks[k].fP[2];
2011 qinv13 = GetQinv(0, pVect1, pVect3);
2012 qinv23 = GetQinv(0, pVect2, pVect3);
2013 if(qinv13 > fQcut[0] || qinv23 > fQcut[0]) continue;
2015 if(qinv13 < fQLowerCut || qinv23 < fQLowerCut) continue;// remove unwanted low-q pairs (also a type of track splitting/merging cut)
2016 if(ch1 == ch3 && !fGeneratorOnly){
2017 if(!AcceptPair(&((fEvt)->fTracks[i]), &((fEvt+en3)->fTracks[k]))) {
2021 if(ch2 == ch3 && !fGeneratorOnly){
2022 if(!AcceptPair(&((fEvt+en2)->fTracks[j]), &((fEvt+en3)->fTracks[k]))) {
2027 if((fEvt+en3)->fTracks[k].fLabel == (fEvt+en2)->fTracks[j].fLabel) continue;
2028 if((fEvt+en3)->fTracks[k].fLabel == (fEvt)->fTracks[i].fLabel) continue;
2030 if((fEvt+en3)->fTracks[k].fLabel < (fEvt+en3)->fMCarraySize){
2031 AliAODMCParticle *mcParticle3 = (AliAODMCParticle*)mcArray->At(abs((fEvt+en3)->fTracks[k].fLabel));
2033 ch3 = Int_t(((fEvt+en3)->fTracks[k].fCharge + 1)/2.);
2034 pVect3MC[0]=sqrt(pow((fEvt+en3)->fMCtracks[abs((fEvt+en3)->fTracks[k].fLabel)].fPtot,2)+pow(fTrueMassPi,2));
2035 pVect3MC[1]=(fEvt+en3)->fMCtracks[abs((fEvt+en3)->fTracks[k].fLabel)].fPx;
2036 pVect3MC[2]=(fEvt+en3)->fMCtracks[abs((fEvt+en3)->fTracks[k].fLabel)].fPy;
2037 pVect3MC[3]=(fEvt+en3)->fMCtracks[abs((fEvt+en3)->fTracks[k].fLabel)].fPz;
2038 qinv13MC = GetQinv(0, pVect1MC, pVect3MC);
2039 qinv23MC = GetQinv(0, pVect2MC, pVect3MC);
2041 q3MC = sqrt(pow(qinv12MC,2)+pow(qinv13MC,2)+pow(qinv23MC,2));
2042 transK3 = sqrt( pow(pVect1[1]+pVect2[1]+pVect3[1],2) + pow(pVect1[2]+pVect2[2]+pVect3[2],2))/3.;
2044 if(transK3>0.3) K3index=1;
2046 Float_t Pparent3[4]={pVect3MC[0],pVect3MC[1],pVect3MC[2],pVect3MC[3]};
2047 Bool_t pionParent3=kFALSE;
2048 if(abs(mcParticle3->GetPdgCode())==13){// muon check
2049 AliAODMCParticle *parent3=(AliAODMCParticle*)mcArray->At(mcParticle3->GetMother());
2050 if(abs(parent3->GetPdgCode())==211) {
2052 Pparent3[1] = parent3->Px(); Pparent3[2] = parent3->Py(); Pparent3[3] = parent3->Pz();
2053 Pparent3[0] = sqrt(pow(Pparent3[1],2)+pow(Pparent3[2],2)+pow(Pparent3[3],2)+pow(fTrueMassPi,2));
2057 Float_t parentQinv13 = GetQinv(0, Pparent1, Pparent3);
2058 Float_t parentQinv23 = GetQinv(0, Pparent2, Pparent3);
2059 Float_t parentQ3 = sqrt(pow(parentQinv12,2) + pow(parentQinv13,2) + pow(parentQinv23,2));
2060 if(parentQ3 >= 0.2) continue;
2061 if(parentQinv12 < 0.001) continue;
2062 if(parentQinv13 < 0.001) continue;
2063 if(parentQinv23 < 0.001) continue;
2065 if(!pionParent1 && !pionParent2 && !pionParent3) continue;// want at least one pion-->muon
2067 Int_t ChCombtriplet=0;
2068 if(ch1!=ch2 || ch1!=ch3 || ch2!=ch3) ChCombtriplet=1;
2069 Float_t WInput3=1.0;
2070 Float_t muonPionK13=1.0, muonPionK23=1.0;
2071 Float_t pionPionK13=1.0, pionPionK23=1.0;
2072 muonPionK13 = FSICorrelation2(ch1, ch3, qinv13MC);
2073 pionPionK13 = FSICorrelation2(ch1, ch3, parentQinv13);
2074 muonPionK23 = FSICorrelation2(ch2, ch3, qinv23MC);
2075 pionPionK23 = FSICorrelation2(ch2, ch3, parentQinv23);
2076 if(ChCombtriplet==0) WInput3 = MCWeight3D(kTRUE, 1, 25, parentQinv12, parentQinv13, parentQinv23);
2078 if(ch1==ch2) WInput3 = MCWeight3D(kFALSE, 1, 25, parentQinv12, parentQinv13, parentQinv23);
2079 else if(ch1==ch3) WInput3 = MCWeight3D(kFALSE, 1, 25, parentQinv13, parentQinv12, parentQinv23);
2080 else WInput3 = MCWeight3D(kFALSE, 1, 25, parentQinv23, parentQinv12, parentQinv13);
2082 if(WInput3>0 && WInput3<10.) {
2083 ((TH3D*)fOutputList->FindObject("fMuonContamSmearedNum3"))->Fill(ChCombtriplet, K3index, q3MC, WInput3);
2084 ((TH3D*)fOutputList->FindObject("fMuonContamSmearedDen3"))->Fill(ChCombtriplet, K3index, q3MC);
2085 ((TH3D*)fOutputList->FindObject("fMuonContamIdealNum3"))->Fill(ChCombtriplet, K3index, parentQ3, WInput3);
2086 ((TH3D*)fOutputList->FindObject("fMuonContamIdealDen3"))->Fill(ChCombtriplet, K3index, parentQ3);
2087 ((TH3D*)fOutputList->FindObject("fMuonPionK3"))->Fill(ChCombtriplet, K3index, q3MC, muonPionK12*muonPionK13*muonPionK23);
2088 ((TH3D*)fOutputList->FindObject("fPionPionK3"))->Fill(ChCombtriplet, K3index, parentQ3, pionPionK12*pionPionK13*pionPionK23);
2092 }// muon code check of 1 and 2
2097 //////////////////////////////////////////
2099 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].fExplicit2->Fill(transK12, qinv12);
2100 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].fExplicit2QW->Fill(transK12, qinv12, qinv12);
2101 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].fAvgP->Fill(transK12, qinv12, (fEvt)->fTracks[i].fMom);
2102 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].fAvgP->Fill(transK12, qinv12, (fEvt+en2)->fTracks[j].fMom);
2104 if(qinv12<fQupperBound) Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].fMeanKt->Fill(transK12);
2106 //////////////////////////////////////////
2110 // exit out of loop if there are too many pairs
2111 if(pairCountSE >= kPairLimit) {exitCode=kTRUE; continue;}// Too many SE pairs
2112 if(exitCode) continue;
2114 //////////////////////////
2116 if(qinv12 <= fQcut[qCutBin]) {
2118 ///////////////////////////
2120 (fEvt)->fPairsSE[pairCountSE].fP1[0] = (fEvt)->fTracks[i].fP[0];
2121 (fEvt)->fPairsSE[pairCountSE].fP1[1] = (fEvt)->fTracks[i].fP[1];
2122 (fEvt)->fPairsSE[pairCountSE].fP1[2] = (fEvt)->fTracks[i].fP[2];
2123 (fEvt)->fPairsSE[pairCountSE].fE1 = (fEvt)->fTracks[i].fEaccepted;
2124 (fEvt)->fPairsSE[pairCountSE].fCharge1 = (fEvt)->fTracks[i].fCharge;
2125 (fEvt)->fPairsSE[pairCountSE].fIndex1 = i;
2126 (fEvt)->fPairsSE[pairCountSE].fKey1 = key1;
2127 (fEvt)->fPairsSE[pairCountSE].fLabel1 = (fEvt)->fTracks[i].fLabel;
2128 if(fMCcase && ((fEvt)->fTracks[i].fLabel < (fEvt)->fMCarraySize)){
2129 (fEvt)->fPairsSE[pairCountSE].fP1MC[0] = (fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPx;
2130 (fEvt)->fPairsSE[pairCountSE].fP1MC[1] = (fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPy;
2131 (fEvt)->fPairsSE[pairCountSE].fP1MC[2] = (fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPz;
2134 (fEvt)->fPairsSE[pairCountSE].fP2[0] = (fEvt+en2)->fTracks[j].fP[0];
2135 (fEvt)->fPairsSE[pairCountSE].fP2[1] = (fEvt+en2)->fTracks[j].fP[1];
2136 (fEvt)->fPairsSE[pairCountSE].fP2[2] = (fEvt+en2)->fTracks[j].fP[2];
2137 (fEvt)->fPairsSE[pairCountSE].fE2 = (fEvt+en2)->fTracks[j].fEaccepted;
2138 (fEvt)->fPairsSE[pairCountSE].fCharge2 = (fEvt+en2)->fTracks[j].fCharge;
2139 (fEvt)->fPairsSE[pairCountSE].fIndex2 = j;
2140 (fEvt)->fPairsSE[pairCountSE].fKey2 = key2;
2141 (fEvt)->fPairsSE[pairCountSE].fLabel2 = (fEvt+en2)->fTracks[j].fLabel;
2142 if(fMCcase && ((fEvt+en2)->fTracks[j].fLabel < (fEvt+en2)->fMCarraySize)){
2143 (fEvt)->fPairsSE[pairCountSE].fP2MC[0] = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPx;
2144 (fEvt)->fPairsSE[pairCountSE].fP2MC[1] = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPy;
2145 (fEvt)->fPairsSE[pairCountSE].fP2MC[2] = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPz;
2148 (fEvt)->fPairsSE[pairCountSE].fQinv = qinv12;
2150 fPairLocationSE[i]->AddAt(pairCountSE,j);
2157 /////////////////////////////////////////////////////////
2158 // Normalization Region
2160 if((qinv12 >= fNormQcutLow[normBin]) && (qinv12 < fNormQcutHigh[normBin])){
2162 fNormPairs[en2][normPairCount[en2]].fCharge1 = (fEvt)->fTracks[i].fCharge;
2163 fNormPairs[en2][normPairCount[en2]].fIndex1 = i;
2164 fNormPairs[en2][normPairCount[en2]].fKey1 = (fEvt)->fTracks[i].fKey;
2166 fNormPairs[en2][normPairCount[en2]].fCharge2 = (fEvt+en2)->fTracks[j].fCharge;
2167 fNormPairs[en2][normPairCount[en2]].fIndex2 = j;
2168 fNormPairs[en2][normPairCount[en2]].fKey2 = (fEvt+en2)->fTracks[j].fKey;
2171 //other past pairs with particle j
2172 for(Int_t pastpair=0; pastpair<numOtherPairs2[0][j]; pastpair++){
2173 Int_t locationOtherPair = fOtherPairLocation2[0][j]->At(pastpair);
2174 if(locationOtherPair < 0) continue;// no pair there
2175 Int_t indexOther1 = i;
2176 Int_t indexOther2 = fNormPairs[0][ locationOtherPair ].fIndex1;
2178 // Both possible orderings of other indexes
2179 if( (fNormPairSwitch[0][indexOther1]->At(indexOther2)=='1') || (fNormPairSwitch[0][indexOther2]->At(indexOther1)=='1')) {
2181 // 1 and 2 are from SE
2182 ch3 = Int_t((fNormPairs[0][ locationOtherPair ].fCharge1 + 1)/2.);
2183 key3 = fNormPairs[0][ locationOtherPair ].fKey1;
2184 Short_t fillIndex3 = FillIndex3part(key1+key2+key3);
2185 SetFillBins3(fillIndex3, key1, key2, key3, ch1, ch2, ch3, 0, bin1, bin2, bin3, fDummyB, fDummyB, fDummyB);
2187 tempNormFillCount[bin1][bin2][bin3][fillIndex3][0]++;
2190 }// pastpair P11 loop
2193 fNormPairSwitch[en2][i]->AddAt('1',j);
2194 fOtherPairLocation1[en2][i]->AddAt(normPairCount[en2], numOtherPairs1[en2][i]);// location of otherpair with i as 1st particle
2195 fOtherPairLocation2[en2][j]->AddAt(normPairCount[en2], numOtherPairs2[en2][j]);// location of otherpair with j as 2nd particle
2197 numOtherPairs1[en2][i]++;
2198 numOtherPairs2[en2][j]++;
2201 normPairCount[en2]++;
2202 if(normPairCount[en2] >= kNormPairLimit) exitCode=kTRUE;
2211 //////////////////////////////////////////////
2214 for (Int_t i=0; i<myTracks; i++) {
2219 for (Int_t j=0; j<(fEvt+en2)->fNtracks; j++) {
2221 key1 = (fEvt)->fTracks[i].fKey;
2222 key2 = (fEvt+en2)->fTracks[j].fKey;
2223 Short_t fillIndex2 = FillIndex2part(key1+key2);
2224 Short_t qCutBin = SetQcutBin(fillIndex2);
2225 Short_t normBin = SetNormBin(fillIndex2);
2226 pVect1[0]=(fEvt)->fTracks[i].fEaccepted; pVect2[0]=(fEvt+en2)->fTracks[j].fEaccepted;
2227 pVect1[1]=(fEvt)->fTracks[i].fP[0]; pVect2[1]=(fEvt+en2)->fTracks[j].fP[0];
2228 pVect1[2]=(fEvt)->fTracks[i].fP[1]; pVect2[2]=(fEvt+en2)->fTracks[j].fP[1];
2229 pVect1[3]=(fEvt)->fTracks[i].fP[2]; pVect2[3]=(fEvt+en2)->fTracks[j].fP[2];
2231 qinv12 = GetQinv(fillIndex2, pVect1, pVect2);
2232 GetQosl(pVect1, pVect2, qout, qside, qlong);
2233 transK12 = sqrt(pow(pVect1[1]+pVect2[1],2) + pow(pVect1[2]+pVect2[2],2))/2.;
2234 //if(transK12 <= 0.35) fEDbin=0;
2238 ///////////////////////////////
2239 ch1 = Int_t(((fEvt)->fTracks[i].fCharge + 1)/2.);
2240 ch2 = Int_t(((fEvt+en2)->fTracks[j].fCharge + 1)/2.);
2241 SetFillBins2(fillIndex2, key1, key2, ch1, ch2, bin1, bin2);
2244 if((fEvt)->fTracks[i].fLabel < (fEvt)->fMCarraySize && (fEvt+en2)->fTracks[j].fLabel < (fEvt+en2)->fMCarraySize){
2245 pVect1MC[0]=sqrt(pow((fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPtot,2)+pow(fTrueMassPi,2));
2246 pVect2MC[0]=sqrt(pow((fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPtot,2)+pow(fTrueMassPi,2));
2247 pVect1MC[1]=(fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPx; pVect2MC[1]=(fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPx;
2248 pVect1MC[2]=(fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPy; pVect2MC[2]=(fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPy;
2249 pVect1MC[3]=(fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPz; pVect2MC[3]=(fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPz;
2250 qinv12MC = GetQinv(fillIndex2, pVect1MC, pVect2MC);
2253 for(Int_t rIter=0; rIter<fRVALUES; rIter++){
2254 for(Int_t myDampIt=0; myDampIt<kNDampValues; myDampIt++){
2255 Int_t denIndex = rIter*kNDampValues + myDampIt;
2256 Float_t WInput = MCWeight(ch1,ch2, rIter+kRmin, myDampIt, qinv12MC);
2257 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[0].fIdeal->Fill(denIndex, qinv12MC, WInput);
2258 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[1].fIdeal->Fill(denIndex, qinv12MC);
2259 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[0].fSmeared->Fill(denIndex, qinv12, WInput);
2260 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[1].fSmeared->Fill(denIndex, qinv12);
2264 /////////////////////////////////////////////////////
2265 if(qinv12 <= fQcut[qCutBin]) {// 3-particle MRC
2268 Short_t fillIndex3 = 0;
2269 key1=1; key2=1; key3=1;
2272 for (Int_t k=0; k<(fEvt+en3)->fNtracks; k++) {
2273 if((fEvt+en3)->fTracks[k].fLabel < (fEvt+en3)->fMCarraySize){
2274 ch3 = Int_t(((fEvt+en3)->fTracks[k].fCharge + 1)/2.);
2275 pVect3[0]=(fEvt+en3)->fTracks[k].fEaccepted;
2276 pVect3[1]=(fEvt+en3)->fTracks[k].fP[0];
2277 pVect3[2]=(fEvt+en3)->fTracks[k].fP[1];
2278 pVect3[3]=(fEvt+en3)->fTracks[k].fP[2];
2279 qinv13 = GetQinv(0, pVect1, pVect3);
2280 qinv23 = GetQinv(0, pVect2, pVect3);
2281 q3 = sqrt(pow(qinv12,2)+pow(qinv13,2)+pow(qinv23,2));
2283 if(qinv13 > fQcut[qCutBin] || qinv23 > fQcut[qCutBin]) continue;
2286 pVect3MC[0]=sqrt(pow((fEvt+en3)->fMCtracks[abs((fEvt+en3)->fTracks[k].fLabel)].fPtot,2)+pow(fTrueMassPi,2));
2287 pVect3MC[1]=(fEvt+en3)->fMCtracks[abs((fEvt+en3)->fTracks[k].fLabel)].fPx;
2288 pVect3MC[2]=(fEvt+en3)->fMCtracks[abs((fEvt+en3)->fTracks[k].fLabel)].fPy;
2289 pVect3MC[3]=(fEvt+en3)->fMCtracks[abs((fEvt+en3)->fTracks[k].fLabel)].fPz;
2290 qinv13MC = GetQinv(0, pVect1MC, pVect3MC);
2291 qinv23MC = GetQinv(0, pVect2MC, pVect3MC);
2294 q3MC = sqrt(pow(qinv12MC,2)+pow(qinv13MC,2)+pow(qinv23MC,2));
2295 transK3 = sqrt( pow(pVect1[1]+pVect2[1]+pVect3[1],2) + pow(pVect1[2]+pVect2[2]+pVect3[2],2))/3.;
2297 if(qinv12 < fQLowerCut) continue;
2298 if(qinv13 < fQLowerCut) continue;
2299 if(qinv23 < fQLowerCut) continue;
2301 if(!AcceptPair(&((fEvt)->fTracks[i]), &((fEvt+en2)->fTracks[j]))) continue;
2304 if(!AcceptPair(&((fEvt)->fTracks[i]), &((fEvt+en3)->fTracks[k]))) continue;
2307 if(!AcceptPair(&((fEvt+en2)->fTracks[j]), &((fEvt+en3)->fTracks[k]))) continue;
2311 // The below call to SetFillBins3 will work for all 3-particle terms since all are for fully mixed events. part is set to 1, but only matters for terms 2-4.
2312 Bool_t fill2=kFALSE, fill3=kFALSE, fill4=kFALSE;
2313 SetFillBins3(fillIndex3, key1, key2, key3, ch1, ch2, ch3, 1, bin1, bin2, bin3, fill2, fill3, fill4);
2316 for(Int_t jj=1; jj<=5; jj++){// term loop
2318 if(jj==2) {if(!fill2) continue;}//12
2319 if(jj==3) {if(!fill3) continue;}//13
2320 if(jj==4) {if(!fill4) continue;}//23
2323 ArrangeQs(fillIndex3, key1, key2, key3, ch1, ch2, ch3, qinv12, qinv13, qinv23, 1, jj, firstQ, secondQ, thirdQ);
2324 ArrangeQs(fillIndex3, key1, key2, key3, ch1, ch2, ch3, qinv12MC, qinv13MC, qinv23MC, 1, jj, firstQMC, secondQMC, thirdQMC);
2326 if(ch1==ch2 && ch1==ch3){// same charge
2327 WInput = MCWeight3D(kTRUE, jj, 10, firstQMC, secondQMC, thirdQMC);
2329 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm1SC"))->Fill(q3MC, WInput);
2330 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm1SCden"))->Fill(q3MC);
2332 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm2SC"))->Fill(q3MC, WInput);
2333 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm2SCden"))->Fill(q3MC);
2335 }else {// mixed charge
2337 WInput = MCWeight3D(kFALSE, jj, 10, firstQMC, secondQMC, thirdQMC);
2339 if(jj==1 || jj==5) WInput = MCWeight3D(kFALSE, jj, 10, thirdQMC, secondQMC, firstQMC);// thirdQMC is ss
2340 else WInput = MCWeight3D(kFALSE, 6-jj, 10, thirdQMC, secondQMC, firstQMC);
2343 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm1MC"))->Fill(q3MC, WInput);
2344 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm1MCden"))->Fill(q3MC);
2348 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm2MC"))->Fill(q3MC, WInput);
2349 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm2MCden"))->Fill(q3MC);
2351 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm3MC"))->Fill(q3MC, WInput);
2352 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm3MCden"))->Fill(q3MC);
2354 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm4MC"))->Fill(q3MC, WInput);
2355 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm4MCden"))->Fill(q3MC);
2359 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm4MC"))->Fill(q3MC, WInput);
2360 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm4MCden"))->Fill(q3MC);
2362 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm3MC"))->Fill(q3MC, WInput);
2363 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm3MCden"))->Fill(q3MC);
2365 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm2MC"))->Fill(q3MC, WInput);
2366 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm2MCden"))->Fill(q3MC);
2374 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[jj-1].fIdeal->Fill(q3MC, WInput);
2375 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[jj-1].fSmeared->Fill(q3, WInput);
2379 }// MCarray check, 3rd particle
2382 }// TabulatePairs Check
2384 }// MCarray check, 1st and 2nd particle
2386 // reset key's and fill bins (they were altered for 3 particle MRC calculation)
2387 key1 = (fEvt)->fTracks[i].fKey;
2388 key2 = (fEvt+en2)->fTracks[j].fKey;
2389 SetFillBins2(fillIndex2, key1, key2, ch1, ch2, bin1, bin2);
2392 if(ch1==ch2 && fMbin==0 && qinv12<0.2){
2393 //////////////////////////
2394 // pad-row method testing
2395 Float_t coeff = (5)*0.2*(0.18/1.2);// 5 to evaluate at 1.0m in TPC
2396 Float_t phi1 = (fEvt)->fTracks[i].fPhi - asin((fEvt)->fTracks[i].fCharge*(0.1*fBfield)*coeff/(fEvt)->fTracks[i].fPt);
2397 if(phi1 > 2*PI) phi1 -= 2*PI;
2398 if(phi1 < 0) phi1 += 2*PI;
2399 Float_t phi2 = (fEvt+en2)->fTracks[j].fPhi - asin((fEvt+en2)->fTracks[j].fCharge*(0.1*fBfield)*coeff/(fEvt+en2)->fTracks[j].fPt);
2400 if(phi2 > 2*PI) phi2 -= 2*PI;
2401 if(phi2 < 0) phi2 += 2*PI;
2402 Float_t deltaphi = phi1 - phi2;
2403 if(deltaphi > PI) deltaphi -= PI;
2404 if(deltaphi < -PI) deltaphi += PI;
2406 Int_t ncl1 = (fEvt)->fTracks[i].fClusterMap.GetNbits();
2407 Int_t ncl2 = (fEvt+en2)->fTracks[j].fClusterMap.GetNbits();
2408 Float_t sumCls = 0; Float_t sumSha = 0; Float_t sumQ = 0;
2409 Double_t shfrac = 0; //Double_t qfactor = 0;
2410 for(Int_t imap = 0; imap < ncl1 && imap < ncl2; imap++) {
2411 if ((fEvt)->fTracks[i].fClusterMap.TestBitNumber(imap) && (fEvt+en2)->fTracks[j].fClusterMap.TestBitNumber(imap)) {// Both clusters
2412 if ((fEvt)->fTracks[i].fSharedMap.TestBitNumber(imap) && (fEvt+en2)->fTracks[j].fSharedMap.TestBitNumber(imap)) { // Shared
2416 else {sumQ--; sumCls+=2;}
2418 else if ((fEvt)->fTracks[i].fClusterMap.TestBitNumber(imap) || (fEvt+en2)->fTracks[j].fClusterMap.TestBitNumber(imap)) {// Non shared
2423 //qfactor = sumQ*1.0/sumCls;
2424 shfrac = sumSha*1.0/sumCls;
2426 if(fabs(deltaphi)<0.07 && fabs((fEvt)->fTracks[i].fEta-(fEvt+en2)->fTracks[j].fEta) < 0.03){
2427 ((TH3D*)fOutputList->FindObject("fPairsPadRowDen"))->Fill(transK12, shfrac, qinv12);
2430 for(Int_t rstep=0; rstep<10; rstep++){
2431 coeff = (rstep)*0.2*(0.18/1.2);
2432 // propagate through B field to r=1.2m
2433 phi1 = (fEvt)->fTracks[i].fPhi - asin((fEvt)->fTracks[i].fCharge*(0.1*fBfield)*coeff/(fEvt)->fTracks[i].fPt);
2434 if(phi1 > 2*PI) phi1 -= 2*PI;
2435 if(phi1 < 0) phi1 += 2*PI;
2436 phi2 = (fEvt+en2)->fTracks[j].fPhi - asin((fEvt+en2)->fTracks[j].fCharge*(0.1*fBfield)*coeff/(fEvt+en2)->fTracks[j].fPt);
2437 if(phi2 > 2*PI) phi2 -= 2*PI;
2438 if(phi2 < 0) phi2 += 2*PI;
2439 deltaphi = phi1 - phi2;
2440 if(deltaphi > PI) deltaphi -= PI;
2441 if(deltaphi < -PI) deltaphi += PI;
2443 if(fabs((fEvt)->fTracks[i].fEta-(fEvt+en2)->fTracks[j].fEta) < 0.03){
2444 ((TH3F*)fOutputList->FindObject("fPairsShareFracDPhiDen"))->Fill(rstep, shfrac, deltaphi);
2446 //if(shfrac < 0.05){
2447 ((TH3F*)fOutputList->FindObject("fPairsDetaDPhiDen"))->Fill(rstep, (fEvt)->fTracks[i].fEta-(fEvt+en2)->fTracks[j].fEta, deltaphi);
2454 }// desired pair selection
2462 if(qinv12 < fQLowerCut) continue;// remove unwanted low-q pairs (also a type of track splitting cut)
2463 if(ch1 == ch2 && !fGeneratorOnly){
2464 if(!AcceptPair(&((fEvt)->fTracks[i]), &((fEvt+en2)->fTracks[j]))) {
2465 fPairSplitCut[1][i]->AddAt('1',j);
2470 //////////////////////////////////////////
2472 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].fExplicit2->Fill(transK12, qinv12);
2473 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].fExplicit2QW->Fill(transK12, qinv12, qinv12);
2474 if(qinv12<fQupperBound) Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].fMeanKt->Fill(transK12);
2476 //////////////////////////////////////////
2480 if(pairCountME >= 2*kPairLimit) {exitCode=kTRUE; continue;}// Too many SE pairs
2481 if(exitCode) continue;
2483 if(qinv12 <= fQcut[qCutBin]) {
2484 ///////////////////////////
2487 (fEvt)->fPairsME[pairCountME].fP1[0] = (fEvt)->fTracks[i].fP[0];
2488 (fEvt)->fPairsME[pairCountME].fP1[1] = (fEvt)->fTracks[i].fP[1];
2489 (fEvt)->fPairsME[pairCountME].fP1[2] = (fEvt)->fTracks[i].fP[2];
2490 (fEvt)->fPairsME[pairCountME].fE1 = (fEvt)->fTracks[i].fEaccepted;
2491 (fEvt)->fPairsME[pairCountME].fCharge1 = (fEvt)->fTracks[i].fCharge;
2492 (fEvt)->fPairsME[pairCountME].fIndex1 = i;
2493 (fEvt)->fPairsME[pairCountME].fKey1 = key1;
2494 (fEvt)->fPairsME[pairCountME].fLabel1 = (fEvt)->fTracks[i].fLabel;
2495 if(fMCcase && ((fEvt)->fTracks[i].fLabel < (fEvt)->fMCarraySize)){
2496 (fEvt)->fPairsME[pairCountME].fP1MC[0] = (fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPx;
2497 (fEvt)->fPairsME[pairCountME].fP1MC[1] = (fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPy;
2498 (fEvt)->fPairsME[pairCountME].fP1MC[2] = (fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPz;
2501 (fEvt)->fPairsME[pairCountME].fP2[0] = (fEvt+en2)->fTracks[j].fP[0];
2502 (fEvt)->fPairsME[pairCountME].fP2[1] = (fEvt+en2)->fTracks[j].fP[1];
2503 (fEvt)->fPairsME[pairCountME].fP2[2] = (fEvt+en2)->fTracks[j].fP[2];
2504 (fEvt)->fPairsME[pairCountME].fE2 = (fEvt+en2)->fTracks[j].fEaccepted;
2505 (fEvt)->fPairsME[pairCountME].fCharge2 = (fEvt+en2)->fTracks[j].fCharge;
2506 (fEvt)->fPairsME[pairCountME].fIndex2 = j;
2507 (fEvt)->fPairsME[pairCountME].fKey2 = key2;
2508 (fEvt)->fPairsME[pairCountME].fLabel2 = (fEvt+en2)->fTracks[j].fLabel;
2509 if(fMCcase && ((fEvt+en2)->fTracks[j].fLabel < (fEvt+en2)->fMCarraySize)){
2510 (fEvt)->fPairsME[pairCountME].fP2MC[0] = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPx;
2511 (fEvt)->fPairsME[pairCountME].fP2MC[1] = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPy;
2512 (fEvt)->fPairsME[pairCountME].fP2MC[2] = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPz;
2515 (fEvt)->fPairsME[pairCountME].fQinv = qinv12;
2517 fPairLocationME[i]->AddAt(Int_t(pairCountME),j);
2523 if((qinv12 >= fNormQcutLow[normBin]) && (qinv12 < fNormQcutHigh[normBin])){
2525 fNormPairs[en2][normPairCount[en2]].fCharge1 = (fEvt)->fTracks[i].fCharge;
2526 fNormPairs[en2][normPairCount[en2]].fIndex1 = i;
2527 fNormPairs[en2][normPairCount[en2]].fKey1 = (fEvt)->fTracks[i].fKey;
2529 fNormPairs[en2][normPairCount[en2]].fCharge2 = (fEvt+en2)->fTracks[j].fCharge;
2530 fNormPairs[en2][normPairCount[en2]].fIndex2 = j;
2531 fNormPairs[en2][normPairCount[en2]].fKey2 = (fEvt+en2)->fTracks[j].fKey;
2533 //other past pairs in P11 with particle i
2534 for(Int_t pastpairP11=0; pastpairP11<numOtherPairs2[0][i]; pastpairP11++){// past pair in P11 with i as 1st and 2nd particle
2535 Int_t locationOtherPairP11 = fOtherPairLocation2[0][i]->At(pastpairP11);// i is 2nd particle
2536 if(locationOtherPairP11 < 0) continue;// no pair there
2537 Int_t indexOther1P11 = fNormPairs[0][ locationOtherPairP11 ].fIndex1;
2539 //Check other past pairs in P12
2540 if( (fNormPairSwitch[1][indexOther1P11]->At(j)=='0')) continue;
2542 // 1 and 3 are from SE
2543 ch3 = Int_t((fNormPairs[0][ locationOtherPairP11 ].fCharge1 + 1)/2.);// charge of second particle in P11
2544 key3 = fNormPairs[0][ locationOtherPairP11 ].fKey1;
2545 Short_t fillIndex3 = FillIndex3part(key1+key2+key3);
2546 Bool_t fill2=kFALSE, fill3=kFALSE, fill4=kFALSE;
2547 SetFillBins3(fillIndex3, key1, key2, key3, ch1, ch2, ch3, 2, bin1, bin2, bin3, fill2, fill3, fill4);
2550 if(fill2) tempNormFillCount[bin1][bin2][bin3][fillIndex3][1]++;
2551 if(fill3) tempNormFillCount[bin1][bin2][bin3][fillIndex3][2]++;
2552 if(fill4) tempNormFillCount[bin1][bin2][bin3][fillIndex3][3]++;
2558 fNormPairSwitch[en2][i]->AddAt('1',j);
2559 fOtherPairLocation1[en2][i]->AddAt(normPairCount[en2], numOtherPairs1[en2][i]);// location of otherpair with i as 1st particle
2560 fOtherPairLocation2[en2][j]->AddAt(normPairCount[en2], numOtherPairs2[en2][j]);// location of otherpair with j as 2nd particle
2562 numOtherPairs1[en2][i]++;
2563 numOtherPairs2[en2][j]++;
2565 normPairCount[en2]++;
2566 if(normPairCount[en2] >= kNormPairLimit) exitCode=kTRUE;
2575 ///////////////////////////////////////
2576 // P13 pairing (just for Norm counting of term5)
2577 for (Int_t i=0; i<myTracks; i++) {
2579 // exit out of loop if there are too many pairs
2580 // dont bother with this loop if exitCode is set.
2586 for (Int_t j=0; j<(fEvt+en2)->fNtracks; j++) {
2588 key1 = (fEvt)->fTracks[i].fKey;
2589 key2 = (fEvt+en2)->fTracks[j].fKey;
2590 Short_t fillIndex2 = FillIndex2part(key1+key2);
2591 Short_t normBin = SetNormBin(fillIndex2);
2592 pVect1[0]=(fEvt)->fTracks[i].fEaccepted; pVect2[0]=(fEvt+en2)->fTracks[j].fEaccepted;
2593 pVect1[1]=(fEvt)->fTracks[i].fP[0]; pVect2[1]=(fEvt+en2)->fTracks[j].fP[0];
2594 pVect1[2]=(fEvt)->fTracks[i].fP[1]; pVect2[2]=(fEvt+en2)->fTracks[j].fP[1];
2595 pVect1[3]=(fEvt)->fTracks[i].fP[2]; pVect2[3]=(fEvt+en2)->fTracks[j].fP[2];
2597 qinv12 = GetQinv(fillIndex2, pVect1, pVect2);
2599 if(qinv12 < fQLowerCut) continue;// remove unwanted low-q pairs (also a type of track splitting cut)
2601 ch1 = Int_t(((fEvt)->fTracks[i].fCharge + 1)/2.);
2602 ch2 = Int_t(((fEvt+en2)->fTracks[j].fCharge + 1)/2.);
2604 if(ch1 == ch2 && !fGeneratorOnly){
2605 if(!AcceptPair(&((fEvt)->fTracks[i]), &((fEvt+en2)->fTracks[j]))) {
2606 fPairSplitCut[2][i]->AddAt('1',j);
2611 /////////////////////////////////////////////////////////
2612 // Normalization Region
2614 if((qinv12 >= fNormQcutLow[normBin]) && (qinv12 < fNormQcutHigh[normBin])){
2616 fNormPairSwitch[en2][i]->AddAt('1',j);
2624 ///////////////////////////////////////
2625 // P23 pairing (just for Norm counting of term5)
2627 for (Int_t i=0; i<(fEvt+en1)->fNtracks; i++) {
2629 // exit out of loop if there are too many pairs
2630 // dont bother with this loop if exitCode is set.
2636 for (Int_t j=0; j<(fEvt+en2)->fNtracks; j++) {
2640 key1 = (fEvt+en1)->fTracks[i].fKey;
2641 key2 = (fEvt+en2)->fTracks[j].fKey;
2642 Short_t fillIndex2 = FillIndex2part(key1+key2);
2643 Short_t normBin = SetNormBin(fillIndex2);
2644 pVect1[0]=(fEvt+en1)->fTracks[i].fEaccepted; pVect2[0]=(fEvt+en2)->fTracks[j].fEaccepted;
2645 pVect1[1]=(fEvt+en1)->fTracks[i].fP[0]; pVect2[1]=(fEvt+en2)->fTracks[j].fP[0];
2646 pVect1[2]=(fEvt+en1)->fTracks[i].fP[1]; pVect2[2]=(fEvt+en2)->fTracks[j].fP[1];
2647 pVect1[3]=(fEvt+en1)->fTracks[i].fP[2]; pVect2[3]=(fEvt+en2)->fTracks[j].fP[2];
2649 qinv12 = GetQinv(fillIndex2, pVect1, pVect2);
2651 if(qinv12 < fQLowerCut) continue;// remove unwanted low-q pairs (also a type of track splitting cut)
2653 ///////////////////////////////
2654 ch1 = Int_t(((fEvt+en1)->fTracks[i].fCharge + 1)/2.);
2655 ch2 = Int_t(((fEvt+en2)->fTracks[j].fCharge + 1)/2.);
2657 if(ch1 == ch2 && !fGeneratorOnly){
2658 if(!AcceptPair(&((fEvt+en1)->fTracks[i]), &((fEvt+en2)->fTracks[j]))) {
2659 fPairSplitCut[3][i]->AddAt('1',j);
2664 if((qinv12 < fNormQcutLow[normBin]) || (qinv12 >= fNormQcutHigh[normBin])) continue;
2666 Int_t index1P23 = i;
2667 Int_t index2P23 = j;
2669 for(Int_t pastpairP12=0; pastpairP12<numOtherPairs2[1][index1P23]; pastpairP12++){// loop in P12 with i as 2nd particle
2670 Int_t locationOtherPairP12 = fOtherPairLocation2[1][index1P23]->At(pastpairP12);
2671 if(locationOtherPairP12 < 0) continue; // no pair there
2672 Int_t index1P12 = fNormPairs[1][ locationOtherPairP12 ].fIndex1;
2675 //Check other past pair status in P13
2676 if( (fNormPairSwitch[2][index1P12]->At(index2P23)=='0')) continue;
2678 // all from different event
2679 ch3 = Int_t((fNormPairs[1][ locationOtherPairP12 ].fCharge1 + 1)/2.);// charge of first particle in P12
2680 key3 = fNormPairs[1][ locationOtherPairP12 ].fKey1;
2681 Short_t fillIndex3 = FillIndex3part(key1+key2+key3);
2682 SetFillBins3(fillIndex3, key1, key2, key3, ch1, ch2, ch3, 3, bin1, bin2, bin3, fDummyB, fDummyB, fDummyB);
2684 tempNormFillCount[bin1][bin2][bin3][fillIndex3][4]++;
2692 ///////////////////////////////////////////////////
2693 // Do not use pairs from events with too many pairs
2695 cout<<"SE or ME or Norm PairCount too large. Discarding all pairs and skipping event"<<endl;
2696 (fEvt)->fNpairsSE = 0;
2697 (fEvt)->fNpairsME = 0;
2698 ((TH1F*)fOutputList->FindObject("fRejectedEvents"))->Fill(fMbin+1);
2699 return;// Skip event
2701 (fEvt)->fNpairsSE = pairCountSE;
2702 (fEvt)->fNpairsME = pairCountME;
2703 ((TH1F*)fOutputList->FindObject("fEvents2"))->Fill(fMbin+1);
2705 ///////////////////////////////////////////////////
2709 ///////////////////////////////////////////////////////////////////////
2710 ///////////////////////////////////////////////////////////////////////
2711 ///////////////////////////////////////////////////////////////////////
2714 // Start the Main Correlation Analysis
2717 ///////////////////////////////////////////////////////////////////////
2722 /////////////////////////////////////////////////////////
2724 // Set the Normalization counters
2725 for(Int_t termN=0; termN<5; termN++){
2728 if((fEvt)->fNtracks ==0) continue;
2730 if((fEvt)->fNtracks ==0) continue;
2731 if((fEvt+1)->fNtracks ==0) continue;
2733 if((fEvt)->fNtracks ==0) continue;
2734 if((fEvt+1)->fNtracks ==0) continue;
2735 if((fEvt+2)->fNtracks ==0) continue;
2738 for(Int_t sc=0; sc<kSCLimit3; sc++){
2740 for(Int_t c1=0; c1<2; c1++){
2741 for(Int_t c2=0; c2<2; c2++){
2742 for(Int_t c3=0; c3<2; c3++){
2744 if(sc==0 || sc==6 || sc==9){// Identical species
2745 if( (c1+c2+c3)==1) {if(c1!=0 || c2!=0 || c3!=1) continue;}
2746 if( (c1+c2+c3)==2) {if(c1!=0) continue;}
2748 if( (c1+c2)==1) {if(c1!=0) continue;}
2749 }else {}// do nothing for pi-k-p case
2750 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[fMbin].EDB[fEDbin].ThreePT[termN].fNorm3->Fill(0.,tempNormFillCount[c1][c2][c3][sc][termN]);
2759 /////////////////////////////////////////////
2760 // Calculate Pair-Cut Correlations
2761 for(Int_t en1case=0; en1case<2; en1case++){// limit at 2 (normal)
2764 if(en1case==0) nump1 = (fEvt)->fNpairsSE;
2765 if(en1case==1) nump1 = (fEvt)->fNpairsME;
2768 for(Int_t p1=0; p1<nump1; p1++){
2771 ch1 = Int_t(((fEvt)->fPairsSE[p1].fCharge1 + 1)/2.);
2772 ch2 = Int_t(((fEvt)->fPairsSE[p1].fCharge2 + 1)/2.);
2773 pVect1[0] = (fEvt)->fPairsSE[p1].fE1; pVect2[0] = (fEvt)->fPairsSE[p1].fE2;
2774 pVect1[1] = (fEvt)->fPairsSE[p1].fP1[0]; pVect2[1] = (fEvt)->fPairsSE[p1].fP2[0];
2775 pVect1[2] = (fEvt)->fPairsSE[p1].fP1[1]; pVect2[2] = (fEvt)->fPairsSE[p1].fP2[1];
2776 pVect1[3] = (fEvt)->fPairsSE[p1].fP1[2]; pVect2[3] = (fEvt)->fPairsSE[p1].fP2[2];
2777 index1 = (fEvt)->fPairsSE[p1].fIndex1; index2 = (fEvt)->fPairsSE[p1].fIndex2;
2778 key1 = (fEvt)->fPairsSE[p1].fKey1; key2 = (fEvt)->fPairsSE[p1].fKey2;
2779 qinv12 = (fEvt)->fPairsSE[p1].fQinv;
2781 pVect1MC[1] = (fEvt)->fPairsSE[p1].fP1MC[0]; pVect2MC[1] = (fEvt)->fPairsSE[p1].fP2MC[0];
2782 pVect1MC[2] = (fEvt)->fPairsSE[p1].fP1MC[1]; pVect2MC[2] = (fEvt)->fPairsSE[p1].fP2MC[1];
2783 pVect1MC[3] = (fEvt)->fPairsSE[p1].fP1MC[2]; pVect2MC[3] = (fEvt)->fPairsSE[p1].fP2MC[2];
2784 pVect1MC[0] = sqrt(pow(pVect1MC[1],2)+pow(pVect1MC[2],2)+pow(pVect1MC[3],2)+pow(fTrueMassPi,2));
2785 pVect2MC[0] = sqrt(pow(pVect2MC[1],2)+pow(pVect2MC[2],2)+pow(pVect2MC[3],2)+pow(fTrueMassPi,2));
2788 ch1 = Int_t(((fEvt)->fPairsME[p1].fCharge1 + 1)/2.);
2789 ch2 = Int_t(((fEvt)->fPairsME[p1].fCharge2 + 1)/2.);
2790 pVect1[0] = (fEvt)->fPairsME[p1].fE1; pVect2[0] = (fEvt)->fPairsME[p1].fE2;
2791 pVect1[1] = (fEvt)->fPairsME[p1].fP1[0]; pVect2[1] = (fEvt)->fPairsME[p1].fP2[0];
2792 pVect1[2] = (fEvt)->fPairsME[p1].fP1[1]; pVect2[2] = (fEvt)->fPairsME[p1].fP2[1];
2793 pVect1[3] = (fEvt)->fPairsME[p1].fP1[2]; pVect2[3] = (fEvt)->fPairsME[p1].fP2[2];
2794 index1 = (fEvt)->fPairsME[p1].fIndex1; index2 = (fEvt)->fPairsME[p1].fIndex2;
2795 key1 = (fEvt)->fPairsME[p1].fKey1; key2 = (fEvt)->fPairsME[p1].fKey2;
2796 qinv12 = (fEvt)->fPairsME[p1].fQinv;
2798 pVect1MC[1] = (fEvt)->fPairsME[p1].fP1MC[0]; pVect2MC[1] = (fEvt)->fPairsME[p1].fP2MC[0];
2799 pVect1MC[2] = (fEvt)->fPairsME[p1].fP1MC[1]; pVect2MC[2] = (fEvt)->fPairsME[p1].fP2MC[1];
2800 pVect1MC[3] = (fEvt)->fPairsME[p1].fP1MC[2]; pVect2MC[3] = (fEvt)->fPairsME[p1].fP2MC[2];
2801 pVect1MC[0] = sqrt(pow(pVect1MC[1],2)+pow(pVect1MC[2],2)+pow(pVect1MC[3],2)+pow(fTrueMassPi,2));
2802 pVect2MC[0] = sqrt(pow(pVect2MC[1],2)+pow(pVect2MC[2],2)+pow(pVect2MC[3],2)+pow(fTrueMassPi,2));
2807 for(Int_t en2=0; en2<3; en2++){
2808 //////////////////////////////////////
2810 Bool_t skipcase=kTRUE;
2811 Short_t config=-1, part=-1;
2812 if(en1case==0 && en2==0) {skipcase=kFALSE; config=1; part=0;}// P11T1
2813 if(en1case==0 && en2==1) {skipcase=kFALSE; config=2; part=1;}// P11T2
2814 if(en1case==1 && en2==0) {skipcase=kFALSE; config=2; part=2;}// P12T1
2815 if(en1case==1 && en2==2) {skipcase=kFALSE; config=3; part=3;}// P12T3
2817 if(skipcase) continue;
2822 for(Int_t k=0; k<(fEvt+en2)->fNtracks; k++){
2826 // remove auto-correlations and duplicate triplets
2828 if( index1 == index3) continue;
2829 if( index2 == index3) continue;
2830 if(fPairSplitCut[0][index1]->At(index2)=='1') continue;// Track splitting/merging
2832 // skip the switched off triplets
2833 if(fTripletSkip1[fPairLocationSE[index1]->At(index2)]->At(index3)=='1') {
2834 fTripletSkip1[fPairLocationSE[index1]->At(index2)]->AddAt('0',index3);// Reset
2837 ///////////////////////////////
2838 // Turn off 1st possible degenerate triplet
2839 if(index1 < index3){// verify correct id ordering ( index1 < k )
2840 if(fPairLocationSE[index1]->At(index3) >= 0){
2841 fTripletSkip1[fPairLocationSE[index1]->At(index3)]->AddAt('1',index2);
2843 if(fPairSplitCut[0][index1]->At(index3)=='1') continue;// Track splitting/merging
2844 }else {// or k < index1
2845 if(fPairLocationSE[index3]->At(index1) >= 0){
2846 fTripletSkip1[fPairLocationSE[index3]->At(index1)]->AddAt('1',index2);
2848 if(fPairSplitCut[0][index3]->At(index1)=='1') continue;// Track splitting/merging
2850 // turn off 2nd possible degenerate triplet
2851 if(index2 < index3){// verify correct id ordering (index2 < k)
2852 if(fPairLocationSE[index2]->At(index3) >= 0){
2853 fTripletSkip1[fPairLocationSE[index2]->At(index3)]->AddAt('1',index1);
2855 if(fPairSplitCut[0][index2]->At(index3)=='1') continue;// Track splitting/merging
2856 }else {// or k < index2
2857 if(fPairLocationSE[index3]->At(index2) >= 0){
2858 fTripletSkip1[fPairLocationSE[index3]->At(index2)]->AddAt('1',index1);
2860 if(fPairSplitCut[0][index3]->At(index2)=='1') continue;// Track splitting/merging
2865 if(config==2 && part==1){// SE pair and third particle from next event. P11T2
2866 ///////////////////////////////
2867 // Turn off 1st possible degenerate triplet
2868 if(fPairLocationME[index1]->At(index3) >= 0){
2869 fTripletSkip2[fPairLocationME[index1]->At(index3)]->AddAt('1',index2);
2872 // turn off 2nd possible degenerate triplet
2873 if(fPairLocationME[index2]->At(index3) >= 0){
2874 fTripletSkip2[fPairLocationME[index2]->At(index3)]->AddAt('1',index1);
2877 if(fPairSplitCut[0][index1]->At(index2)=='1') continue;// Track splitting/merging
2878 if(fPairSplitCut[1][index1]->At(index3)=='1') continue;// Track splitting/merging
2879 if(fPairSplitCut[1][index2]->At(index3)=='1') continue;// Track splitting/merging
2880 }// end config 2 part 1
2882 if(config==2 && part==2){// P12T1
2883 if( index1 == index3) continue;
2885 // skip the switched off triplets
2886 if(fTripletSkip2[fPairLocationME[index1]->At(index2)]->At(index3)=='1') {
2887 fTripletSkip2[fPairLocationME[index1]->At(index2)]->AddAt('0',index3);// Reset
2890 // turn off another possible degenerate
2891 if(fPairLocationME[index3]->At(index2) >= 0){
2892 fTripletSkip2[fPairLocationME[index3]->At(index2)]->AddAt('1',index1);
2893 }// end config 2 part 2
2895 if(fPairSplitCut[1][index1]->At(index2)=='1') continue;// Track splitting/merging
2896 if(index1 < index3) {if(fPairSplitCut[0][index1]->At(index3)=='1') continue;}// Track splitting/merging
2897 else {if(fPairSplitCut[0][index3]->At(index1)=='1') continue;}// Track splitting/merging
2898 if(fPairSplitCut[1][index3]->At(index2)=='1') continue;// Track splitting/merging
2900 if(config==3){// P12T3
2901 if(fPairSplitCut[1][index1]->At(index2)=='1') continue;// Track splitting/merging
2902 if(fPairSplitCut[2][index1]->At(index3)=='1') continue;// Track splitting/merging
2903 if(fPairSplitCut[3][index2]->At(index3)=='1') continue;// Track splitting/merging
2908 ch3 = Int_t(((fEvt+en2)->fTracks[k].fCharge + 1)/2.);
2909 key3 = (fEvt+en2)->fTracks[k].fKey;
2910 Short_t fillIndex3 = FillIndex3part(key1+key2+key3);
2911 Short_t fillIndex13 = FillIndex2part(key1+key3);
2912 Short_t fillIndex23 = FillIndex2part(key2+key3);
2913 Short_t qCutBin13 = SetQcutBin(fillIndex13);
2914 Short_t qCutBin23 = SetQcutBin(fillIndex23);
2915 pVect3[0] = (fEvt+en2)->fTracks[k].fEaccepted;
2916 pVect3[1] = (fEvt+en2)->fTracks[k].fP[0];
2917 pVect3[2] = (fEvt+en2)->fTracks[k].fP[1];
2918 pVect3[3] = (fEvt+en2)->fTracks[k].fP[2];
2919 qinv13 = GetQinv(fillIndex13, pVect1, pVect3);
2920 qinv23 = GetQinv(fillIndex23, pVect2, pVect3);
2922 if(qinv13 < fQLowerCut) continue;
2923 if(qinv23 < fQLowerCut) continue;
2924 if(qinv13 > fQcut[qCutBin13]) continue;
2925 if(qinv23 > fQcut[qCutBin23]) continue;
2930 pVect3MC[1] = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[k].fLabel)].fPx;
2931 pVect3MC[2] = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[k].fLabel)].fPy;
2932 pVect3MC[3] = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[k].fLabel)].fPz;
2933 pVect3MC[0] = sqrt(pow(pVect3MC[1],2)+pow(pVect3MC[2],2)+pow(pVect3MC[3],2)+pow(fTrueMassPi,2));
2934 qinv12MC = GetQinv(0, pVect1MC, pVect2MC);
2935 qinv13MC = GetQinv(0, pVect1MC, pVect3MC);
2936 qinv23MC = GetQinv(0, pVect2MC, pVect3MC);
2941 // if all three pair cuts are the same then the case (config=2 && term=2) never reaches here.
2942 Float_t Kt12 = sqrt( pow(pVect1[1]+pVect2[1],2) + pow(pVect1[2]+pVect2[2],2))/2.;
2943 Float_t Kt13 = sqrt( pow(pVect1[1]+pVect3[1],2) + pow(pVect1[2]+pVect3[2],2))/2.;
2944 Float_t Kt23 = sqrt( pow(pVect2[1]+pVect3[1],2) + pow(pVect2[2]+pVect3[2],2))/2.;
2945 q3 = sqrt(pow(qinv12,2) + pow(qinv13,2) + pow(qinv23,2));
2946 transK3 = sqrt( pow(pVect1[1]+pVect2[1]+pVect3[1],2) + pow(pVect1[2]+pVect2[2]+pVect3[2],2))/3.;
2947 if(fKt3bins==1) fEDbin=0;
2948 else if(fKt3bins==2){
2949 if(transK3<0.3) fEDbin=0;
2951 }else{// fKt3bins==3 is the limit set by fEDbins
2952 if(transK3<0.25) fEDbin=0;
2953 else if(transK3<0.35) fEDbin=1;
2957 firstQ=0; secondQ=0; thirdQ=0;
2962 if(config==1) {// 123
2963 SetFillBins3(fillIndex3, key1, key2, key3, ch1, ch2, ch3, 0, bin1, bin2, bin3, fDummyB, fDummyB, fDummyB);
2965 if(fillIndex3 <= 2){
2966 ArrangeQs(fillIndex3, key1, key2, key3, ch1, ch2, ch3, qinv12, qinv13, qinv23, 0, 1, firstQ, secondQ, thirdQ);
2967 if(fillIndex3==0 && fMCcase) ArrangeQs(fillIndex3, key1, key2, key3, ch1, ch2, ch3, qinv12MC, qinv13MC, qinv23MC, 0, 1, firstQMC, secondQMC, thirdQMC);
2968 Float_t WInput = 1.0;
2969 if(fGenerateSignal && ch1==ch2 && ch1==ch3) WInput = MCWeight3D(kTRUE, 1, 10, firstQ, secondQ, thirdQ);
2970 //if(fGenerateSignal && ch1==ch2 && ch1==ch3) WInput = MCWeight3D(kTRUE, 1, fFixedLambdaBinr3, firstQMC, secondQMC, thirdQMC);
2972 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[0].fTermsQ3->Fill(q3, WInput);
2973 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[0].fTerms3->Fill(firstQ, secondQ, thirdQ, WInput);
2975 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[0].fMeanKt->Fill(Kt12);
2976 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[0].fMeanKt->Fill(Kt13);
2977 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[0].fMeanKt->Fill(Kt23);
2980 if(fillIndex3==0 && ch1==ch2 && ch1==ch3 && fMCcase==kFALSE){
2981 ((TH3D*)fOutputList->FindObject("fKt3DistTerm1"))->Fill(fMbin+1, transK3, q3);
2986 }else if(config==2){// 12, 13, 23
2988 Bool_t fill2=kFALSE, fill3=kFALSE, fill4=kFALSE;
2989 SetFillBins3(fillIndex3, key1, key2, key3, ch1, ch2, ch3, part, bin1, bin2, bin3, fill2, fill3, fill4);
2991 // loop over terms 2-4
2992 for(Int_t jj=2; jj<5; jj++){
2993 if(jj==2) {if(!fill2) continue;}//12
2994 if(jj==3) {if(!fill3) continue;}//13
2995 if(jj==4) {if(!fill4) continue;}//23
2997 if(fillIndex3 <= 2){
2998 ArrangeQs(fillIndex3, key1, key2, key3, ch1, ch2, ch3, qinv12, qinv13, qinv23, part, jj, firstQ, secondQ, thirdQ);
2999 if(fillIndex3==0 && fMCcase) ArrangeQs(fillIndex3, key1, key2, key3, ch1, ch2, ch3, qinv12MC, qinv13MC, qinv23MC, part, jj, firstQMC, secondQMC, thirdQMC);
3000 Float_t WInput = 1.0;
3001 if(fGenerateSignal && ch1==ch2 && ch1==ch3) WInput = MCWeight3D(kTRUE, jj, 10, firstQ, secondQ, thirdQ);
3002 //if(fGenerateSignal && ch1==ch2 && ch1==ch3) WInput = MCWeight3D(kTRUE, jj, fFixedLambdaBinr3, firstQMC, secondQMC, thirdQMC);
3004 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[jj-1].fTermsQ3->Fill(q3, WInput);
3005 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[jj-1].fTerms3->Fill(firstQ, secondQ, thirdQ, WInput);
3007 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[jj-1].fMeanKt->Fill(Kt12);
3008 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[jj-1].fMeanKt->Fill(Kt13);
3009 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[jj-1].fMeanKt->Fill(Kt23);
3013 }else {// config 3: All particles from different events
3015 SetFillBins3(fillIndex3, key1, key2, key3, ch1, ch2, ch3, 3, bin1, bin2, bin3, fDummyB, fDummyB, fDummyB);
3017 if(ch1==ch2 && ch1==ch3 && fillIndex3==0) {
3018 if(!fMCcase) ((TH3D*)fOutputList->FindObject("fKt3DistTerm5"))->Fill(fMbin+1, transK3, q3);
3021 if(fillIndex3 <= 2){
3022 ArrangeQs(fillIndex3, key1, key2, key3, ch1, ch2, ch3, qinv12, qinv13, qinv23, part, 5, firstQ, secondQ, thirdQ);
3023 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[4].fTermsQ3->Fill(q3);
3024 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[4].fTerms3->Fill(firstQ, secondQ, thirdQ);
3026 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[4].fMeanKt->Fill(Kt12);
3027 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[4].fMeanKt->Fill(Kt13);
3028 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[4].fMeanKt->Fill(Kt23);
3033 }// end 3rd particle
3041 }// end of PdensityPairs
3045 // Post output data.
3046 PostData(1, fOutputList);
3049 //________________________________________________________________________
3050 void AliThreePionRadii::Terminate(Option_t *)
3052 // Called once at the end of the query
3057 //________________________________________________________________________
3058 Bool_t AliThreePionRadii::AcceptPair(AliChaoticityTrackStruct *first, AliChaoticityTrackStruct *second)
3061 if(fabs(first->fEta-second->fEta) > fMinSepPairEta) return kTRUE;
3063 // propagate through B field to r=1m
3064 Float_t phi1 = first->fPhi - asin(first->fCharge*(0.1*fBfield)*0.15/first->fPt);// 0.15 for D=1m
3065 if(phi1 > 2*PI) phi1 -= 2*PI;
3066 if(phi1 < 0) phi1 += 2*PI;
3067 Float_t phi2 = second->fPhi - asin(second->fCharge*(0.1*fBfield)*0.15/second->fPt);// 0.15 for D=1m
3068 if(phi2 > 2*PI) phi2 -= 2*PI;
3069 if(phi2 < 0) phi2 += 2*PI;
3071 Float_t deltaphi = phi1 - phi2;
3072 if(deltaphi > PI) deltaphi -= 2*PI;
3073 if(deltaphi < -PI) deltaphi += 2*PI;
3074 deltaphi = fabs(deltaphi);
3076 if(deltaphi < fMinSepPairPhi) return kFALSE;// Min Separation
3079 // propagate through B field to r=1.6m
3080 phi1 = first->fPhi - asin(first->fCharge*(0.1*fBfield)*0.24/first->fPt);// mine. 0.24 for D=1.6m
3081 if(phi1 > 2*PI) phi1 -= 2*PI;
3082 if(phi1 < 0) phi1 += 2*PI;
3083 phi2 = second->fPhi - asin(second->fCharge*(0.1*fBfield)*0.24/second->fPt);// mine. 0.24 for D=1.6m
3084 if(phi2 > 2*PI) phi2 -= 2*PI;
3085 if(phi2 < 0) phi2 += 2*PI;
3087 deltaphi = phi1 - phi2;
3088 if(deltaphi > PI) deltaphi -= 2*PI;
3089 if(deltaphi < -PI) deltaphi += 2*PI;
3090 deltaphi = fabs(deltaphi);
3092 if(deltaphi < fMinSepPairPhi) return kFALSE;// Min Separation
3098 Int_t ncl1 = first->fClusterMap.GetNbits();
3099 Int_t ncl2 = second->fClusterMap.GetNbits();
3100 Int_t sumCls = 0; Int_t sumSha = 0; Int_t sumQ = 0;
3101 Double_t shfrac = 0; Double_t qfactor = 0;
3102 for(Int_t imap = 0; imap < ncl1 && imap < ncl2; imap++) {
3103 if (first->fClusterMap.TestBitNumber(imap) && second->fClusterMap.TestBitNumber(imap)) {// Both clusters
3104 if (first->fSharedMap.TestBitNumber(imap) && second->fSharedMap.TestBitNumber(imap)) { // Shared
3108 else {sumQ--; sumCls+=2;}
3110 else if (first->fClusterMap.TestBitNumber(imap) || second->fClusterMap.TestBitNumber(imap)) {// Non shared
3115 qfactor = sumQ*1.0/sumCls;
3116 shfrac = sumSha*1.0/sumCls;
3119 if(qfactor > fShareQuality || shfrac > fShareFraction) return kFALSE;
3126 //________________________________________________________________________
3127 Float_t AliThreePionRadii::GamovFactor(Int_t chargeBin1, Int_t chargeBin2, Float_t qinv)
3129 Float_t arg = G_Coeff/qinv;
3131 if(chargeBin1==chargeBin2) return (exp(arg)-1)/(arg);
3132 else {return (exp(-arg)-1)/(-arg);}
3135 //________________________________________________________________________
3136 void AliThreePionRadii::Shuffle(Int_t *iarr, Int_t i1, Int_t i2)
3140 for (Int_t i = i1; i < i2+1; i++) {
3141 j = (Int_t) (gRandom->Rndm() * a);
3147 //________________________________________________________________________
3148 Short_t AliThreePionRadii::FillIndex2part(Short_t key){
3150 if(key==2) return 0;// pi-pi
3151 else if(key==11) return 1;// pi-k
3152 else if(key==101) return 2;// pi-p
3153 else if(key==20) return 3;// k-k
3154 else if(key==110) return 4;// k-p
3155 else return 5;// p-p
3157 //________________________________________________________________________
3158 Short_t AliThreePionRadii::FillIndex3part(Short_t key){
3160 if(key==3) return 0;// pi-pi-pi
3161 else if(key==12) return 1;// pi-pi-k
3162 else if(key==21) return 2;// k-k-pi
3163 else if(key==102) return 3;// pi-pi-p
3164 else if(key==201) return 4;// p-p-pi
3165 else if(key==111) return 5;// pi-k-p
3166 else if(key==30) return 6;// k-k-k
3167 else if(key==120) return 7;// k-k-p
3168 else if(key==210) return 8;// p-p-k
3169 else return 9;// p-p-p
3172 //________________________________________________________________________
3173 Short_t AliThreePionRadii::SetQcutBin(Short_t fi){// fi=FillIndex
3174 if(fi <= 2) return 0;
3175 else if(fi==3) return 1;
3178 //________________________________________________________________________
3179 Short_t AliThreePionRadii::SetNormBin(Short_t fi){// fi=FillIndex
3181 else if(fi <= 2) return 1;
3184 //________________________________________________________________________
3185 void AliThreePionRadii::SetFillBins2(Short_t fi, Short_t key1, Short_t key2, Int_t c1, Int_t c2, Int_t &b1, Int_t &b2){
3187 if(fi==0 || fi==3 || fi==5){// Identical species
3188 if((c1+c2)==1) {b1=0; b2=1;}// Re-assign to merge degenerate histos
3189 else {b1=c1; b2=c2;}
3190 }else {// Mixed species
3191 if(key1 < key2) { b1=c1; b2=c2;}
3192 else {b1=c2; b2=c1;}
3196 //________________________________________________________________________
3197 void AliThreePionRadii::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){
3200 // seSS, seSK, SE_keysum only used to determine which terms to fill (only used for terms 2-4)
3201 // part only matters for terms 2-4
3204 Short_t seKeySum=0;// only used for pi-k-p case
3205 if(part==1) {// default case (irrelevant for term 1 and term 5)
3206 if(c1==c2) seSS=kTRUE;
3207 if(key1==key2) seSK=kTRUE;
3208 seKeySum = key1+key2;
3211 if(c1==c3) seSS=kTRUE;
3212 if(key1==key3) seSK=kTRUE;
3213 seKeySum = key1+key3;
3217 // fill2, fill3, fill4 are only used for Cumulant Terms 2,3,4
3219 if(fi==0 || fi==6 || fi==9){// Identical species
3220 if( (c1+c2+c3)==1) {
3221 b1=0; b2=0; b3=1;// Re-assign to merge degenerate histos
3223 if(seSS) fill2=kTRUE;
3224 else {fill3=kTRUE; fill4=kTRUE;}
3226 }else if( (c1+c2+c3)==2) {
3229 if(!seSS) {fill2=kTRUE; fill3=kTRUE;}
3233 b1=c1; b2=c2; b3=c3;
3234 fill2=kTRUE; fill3=kTRUE; fill4=kTRUE;
3236 }else if(fi != 5){// all the rest except pi-k-p
3239 if( (c1+c2)==1) {b1=0; b2=1;}
3240 else {b1=c1; b2=c2;}
3241 }else if(key1==key3){
3243 if( (c1+c3)==1) {b1=0; b2=1;}
3244 else {b1=c1; b2=c3;}
3245 }else {// Key2==Key3
3247 if( (c2+c3)==1) {b1=0; b2=1;}
3248 else {b1=c2; b2=c3;}
3250 //////////////////////////////
3251 if(seSK) fill2=kTRUE;// Same keys from Same Event
3252 else {// Different keys from Same Event
3253 if( (c1+c2+c3)==1) {
3255 if(seSS) fill3=kTRUE;
3257 }else{fill3=kTRUE; fill4=kTRUE;}// b3=1 so fill both
3258 }else if( (c1+c2+c3)==2) {
3260 if(seSS) fill4=kTRUE;
3262 }else{fill3=kTRUE; fill4=kTRUE;}// b3=0 so fill both
3263 }else{fill3=kTRUE; fill4=kTRUE;}// all same charge so fill both
3265 /////////////////////////////
3266 }else {// pi-k-p (no charge ordering applies since all are unique)
3268 if(key2==10) {b1=c1; b2=c2; b3=c3;}// pi-k-p
3269 else {b1=c1; b2=c3; b3=c2;}// pi-p-k
3271 if(key2==1) {b1=c2; b2=c1; b3=c3;}// k-pi-p
3272 else {b1=c3; b2=c1; b3=c2;}// k-p-pi
3274 if(key2==1) {b1=c2; b2=c3; b3=c1;}// p-pi-k
3275 else {b1=c3; b2=c2; b3=c1;}// p-k-pi
3277 ////////////////////////////////////
3278 if(seKeySum==11) fill2=kTRUE;
3279 else if(seKeySum==101) fill3=kTRUE;
3281 ////////////////////////////////////
3285 //________________________________________________________________________
3286 void AliThreePionRadii::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){
3288 // for terms 2-4: start by setting q12(part 1) or q13(part 2)
3289 if(fi==0 || fi==6 || fi==9){// Identical species
3290 if( (c1+c2+c3)==1) {// fQ=ss, sQ=os, tQ=os
3291 if(term==1 || term==5){
3292 if(c1==c2) {fQ=q12; sQ=q13; tQ=q23;}
3293 else if(c1==c3) {fQ=q13; sQ=q12; tQ=q23;}
3294 else {fQ=q23; sQ=q12; tQ=q13;}
3295 }else if(term==2 && part==1){
3296 fQ=q12; sQ=q13; tQ=q23;
3297 }else if(term==2 && part==2){
3298 fQ=q13; sQ=q12; tQ=q23;
3299 }else if(term==3 && part==1){
3301 if(c1==c3) {fQ=q13; tQ=q23;}
3302 else {fQ=q23; tQ=q13;}
3303 }else if(term==3 && part==2){
3305 if(c1==c2) {fQ=q12; tQ=q23;}
3306 else {fQ=q23; tQ=q12;}
3307 }else if(term==4 && part==1){
3309 if(c1==c3) {fQ=q13; sQ=q23;}
3310 else {fQ=q23; sQ=q13;}
3311 }else if(term==4 && part==2){
3313 if(c1==c2) {fQ=q12; sQ=q23;}
3314 else {fQ=q23; sQ=q12;}
3315 }else cout<<"problem!!!!!!!!!!!!!"<<endl;
3316 }else if( (c1+c2+c3)==2) {// fQ=os, sQ=os, tQ=ss
3317 if(term==1 || term==5){
3318 if(c1==c2) {tQ=q12; sQ=q13; fQ=q23;}
3319 else if(c1==c3) {tQ=q13; sQ=q12; fQ=q23;}
3320 else {tQ=q23; sQ=q12; fQ=q13;}
3321 }else if(term==2 && part==1){
3323 if(c1==c3) {tQ=q13; sQ=q23;}
3324 else {tQ=q23; sQ=q13;}
3325 }else if(term==2 && part==2){
3327 if(c1==c2) {tQ=q12; sQ=q23;}
3328 else {tQ=q23; sQ=q12;}
3329 }else if(term==3 && part==1){
3331 if(c1==c3) {tQ=q13; fQ=q23;}
3332 else {tQ=q23; fQ=q13;}
3333 }else if(term==3 && part==2){
3335 if(c1==c2) {tQ=q12; fQ=q23;}
3336 else {tQ=q23; fQ=q12;}
3337 }else if(term==4 && part==1){
3338 tQ=q12; sQ=q13; fQ=q23;
3339 }else if(term==4 && part==2){
3340 tQ=q13; sQ=q12; fQ=q23;
3341 }else cout<<"problem!!!!!!!!!!!!!"<<endl;
3342 }else {// fQ=ss, sQ=ss, tQ=ss
3343 if(term==1 || term==5) {fQ=q12; sQ=q13; tQ=q23;}
3344 else if(term==2 && part==1) {fQ=q12; sQ=q13; tQ=q23;}
3345 else if(term==2 && part==2) {fQ=q13; sQ=q12; tQ=q23;}
3346 else if(term==3 && part==1) {sQ=q12; fQ=q13; tQ=q23;}
3347 else if(term==3 && part==2) {sQ=q13; fQ=q12; tQ=q23;}
3348 else if(term==4 && part==1) {tQ=q12; fQ=q13; sQ=q23;}
3349 else if(term==4 && part==2) {tQ=q13; fQ=q12; sQ=q23;}
3351 }else if(fi != 5){// all the rest except pi-k-p
3355 // cases not explicity shown below are not possible
3356 if(term==1 || term==5) {sQ=q13; tQ=q23;}
3357 else if(term==2 && part==1) {sQ=q13; tQ=q23;}
3358 else if(term==3 && part==2) {sQ=q13; tQ=q23;}
3359 else if(term==4 && part==2) {tQ=q13; sQ=q23;}
3360 else cout<<"problem!!!!!!!!!!!!!"<<endl;
3362 if(c1==c3) {sQ=q13; tQ=q23;}
3363 else {sQ=q23; tQ=q13;}
3365 if(c1==c3) {tQ=q13; sQ=q23;}
3366 else {tQ=q23; sQ=q13;}
3368 }else if(key1==key3){
3371 // cases not explicity shown below are not possible
3372 if(term==1 || term==5) {sQ=q12; tQ=q23;}
3373 else if(term==2 && part==2) {sQ=q12; tQ=q23;}
3374 else if(term==3 && part==1) {sQ=q12; tQ=q23;}
3375 else if(term==4 && part==1) {tQ=q12; sQ=q23;}
3376 else cout<<"problem!!!!!!!!!!!!!!!!!!!!!!"<<endl;
3378 if(c1==c2) {sQ=q12; tQ=q23;}
3379 else {sQ=q23; tQ=q12;}
3381 if(c1==c2) {tQ=q12; sQ=q23;}
3382 else {tQ=q23; sQ=q12;}
3384 }else {// key2==key3
3387 // cases not explicity shown below are not possible
3388 if(term==1 || term==5) {sQ=q12; tQ=q13;}
3389 else if(term==3 && part==1) {sQ=q12; tQ=q13;}
3390 else if(term==3 && part==2) {sQ=q13; tQ=q12;}
3391 else if(term==4 && part==1) {tQ=q12; sQ=q13;}
3392 else if(term==4 && part==2) {tQ=q13; sQ=q12;}
3393 else cout<<"problem!!!!!!!!!!!!!!!!!!!!!!"<<endl;
3395 if(c1==c2) {sQ=q12; tQ=q13;}
3396 else {sQ=q13; tQ=q12;}
3398 if(c1==c2) {tQ=q12; sQ=q13;}
3399 else {tQ=q13; sQ=q12;}
3404 if(key2==10) {fQ=q12; sQ=q13; tQ=q23;}// pi-k-p
3405 else {fQ=q13; sQ=q12; tQ=q23;}// pi-p-k
3407 if(key2==1) {fQ=q12; sQ=q23; tQ=q13;}// k-pi-p
3408 else {fQ=q13; sQ=q23; tQ=q12;}// k-p-pi
3410 if(key2==1) {fQ=q23; sQ=q12; tQ=q13;}// p-pi-k
3411 else {fQ=q23; sQ=q13; tQ=q12;}// p-k-pi
3418 //________________________________________________________________________
3419 Float_t AliThreePionRadii::GetQinv(Short_t fi, Float_t track1[], Float_t track2[]){
3423 if(fi==0 || fi==3 || fi==5){// identical masses
3424 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));
3425 }else{// different masses
3426 Float_t px = track1[1] + track2[1];
3427 Float_t py = track1[2] + track2[2];
3428 Float_t pz = track1[3] + track2[3];
3429 Float_t pSquared = pow(track1[0]+track2[0],2) - px*px - py*py - pz*pz;
3430 Float_t deltaDOTsum = (track1[0]-track2[0])*(track1[0]+track2[0]);
3431 deltaDOTsum -= (track1[1]-track2[1])*px + (track1[2]-track2[2])*py + (track1[3]-track2[3])*pz;
3433 qinv = pow( (track1[1]-track2[1]) - deltaDOTsum*px/(pSquared),2);
3434 qinv += pow( (track1[2]-track2[2]) - deltaDOTsum*py/(pSquared),2);
3435 qinv += pow( (track1[3]-track2[3]) - deltaDOTsum*pz/(pSquared),2);
3436 qinv -= pow( (track1[0]-track2[0]) - deltaDOTsum*(track1[0]+track2[0])/(pSquared),2);
3443 //________________________________________________________________________
3444 void AliThreePionRadii::GetQosl(Float_t track1[], Float_t track2[], Float_t& qout, Float_t& qside, Float_t& qlong){
3446 Float_t p0 = track1[0] + track2[0];
3447 Float_t px = track1[1] + track2[1];
3448 Float_t py = track1[2] + track2[2];
3449 Float_t pz = track1[3] + track2[3];
3451 Float_t mt = sqrt(p0*p0 - pz*pz);
3452 Float_t pt = sqrt(px*px + py*py);
3454 Float_t v0 = track1[0] - track2[0];
3455 Float_t vx = track1[1] - track2[1];
3456 Float_t vy = track1[2] - track2[2];
3457 Float_t vz = track1[3] - track2[3];
3459 qout = (px*vx + py*vy)/pt;
3460 qside = (px*vy - py*vx)/pt;
3461 qlong = (p0*vz - pz*v0)/mt;
3463 //________________________________________________________________________
3464 Float_t AliThreePionRadii::MCWeight(Int_t charge1, Int_t charge2, Float_t r, Int_t dampIndex, Float_t qinv){
3466 Float_t radius = r/0.19733;// convert to GeV (starts at 5 fm, was 3 fm)
3468 Float_t myDamp = fDampStart + (fDampStep)*dampIndex;
3469 Float_t coulCorr12 = FSICorrelation2(charge1, charge2, qinv);
3470 if(charge1==charge2){
3471 Float_t arg=qinv*radius;
3472 Float_t EW = 1 + kappa3/(6.*pow(2.,1.5))*(8.*pow(arg,3) - 12.*arg);
3473 EW += kappa4/(24.*pow(2.,2))*(16.*pow(arg,4) -48.*pow(arg,2) + 12);
3474 return ((1-myDamp) + myDamp*(1 + exp(-pow(qinv*radius,2))*pow(EW,2))*coulCorr12);
3476 return ((1-myDamp) + myDamp*coulCorr12);
3480 //________________________________________________________________________
3481 Float_t AliThreePionRadii::MCWeight3D(Bool_t SameCharge, Int_t term, Int_t dampIndex, Float_t q12, Float_t q13, Float_t q23){
3482 if(term==5) return 1.0;
3484 Float_t radius=fRMax;
3487 Float_t myDamp = fDampStart + (fDampStep)*dampIndex;
3488 Float_t fc = sqrt(myDamp);
3490 if(SameCharge){// all three of the same charge
3491 Float_t coulCorr12 = FSICorrelation2(+1,+1, q12);// K2
3492 Float_t coulCorr13 = FSICorrelation2(+1,+1, q13);// K2
3493 Float_t coulCorr23 = FSICorrelation2(+1,+1, q23);// K2
3494 Float_t arg12=q12*radius;
3495 Float_t arg13=q13*radius;
3496 Float_t arg23=q23*radius;
3497 Float_t EW12 = 1 + kappa3/(6.*pow(2.,1.5))*(8.*pow(arg12,3) - 12.*arg12);
3498 EW12 += kappa4/(24.*pow(2.,2))*(16.*pow(arg12,4) -48.*pow(arg12,2) + 12);
3499 Float_t EW13 = 1 + kappa3/(6.*pow(2.,1.5))*(8.*pow(arg13,3) - 12.*arg13);
3500 EW13 += kappa4/(24.*pow(2.,2))*(16.*pow(arg13,4) -48.*pow(arg13,2) + 12);
3501 Float_t EW23 = 1 + kappa3/(6.*pow(2.,1.5))*(8.*pow(arg23,3) - 12.*arg23);
3502 EW23 += kappa4/(24.*pow(2.,2))*(16.*pow(arg23,4) -48.*pow(arg23,2) + 12);
3504 Float_t c3QS = 1 + exp(-pow(q12*radius,2))*pow(EW12,2) + exp(-pow(q13*radius,2))*pow(EW13,2) + exp(-pow(q23*radius,2))*pow(EW23,2);
3505 c3QS += 2*exp(-pow(radius,2)*(pow(q12,2) + pow(q13,2) + pow(q23,2))/2.)*EW12*EW13*EW23;
3506 Float_t w123 = pow(1-fc,3) + 3*fc*pow(1-fc,2);
3507 w123 += pow(fc,2)*(1-fc)*(1+exp(-pow(q12*radius,2))*pow(EW12,2))*coulCorr12;
3508 w123 += pow(fc,2)*(1-fc)*(1+exp(-pow(q13*radius,2))*pow(EW13,2))*coulCorr13;
3509 w123 += pow(fc,2)*(1-fc)*(1+exp(-pow(q23*radius,2))*pow(EW23,2))*coulCorr23;
3510 w123 += pow(fc,3)*c3QS*coulCorr12*coulCorr13*coulCorr23;
3513 return ((1-myDamp) + myDamp*(1 + exp(-pow(q12*radius,2))*pow(EW12,2))*coulCorr12);
3515 return ((1-myDamp) + myDamp*(1 + exp(-pow(q13*radius,2))*pow(EW13,2))*coulCorr13);
3517 return ((1-myDamp) + myDamp*(1 + exp(-pow(q23*radius,2))*pow(EW23,2))*coulCorr23);
3520 }else{// mixed charge case pair 12 always treated as ss
3521 Float_t coulCorr12 = FSICorrelation2(+1,+1, q12);// K2 ss
3522 Float_t coulCorr13 = FSICorrelation2(+1,-1, q13);// K2 os
3523 Float_t coulCorr23 = FSICorrelation2(+1,-1, q23);// K2 os
3524 Float_t arg12=q12*radius;
3525 Float_t EW12 = 1 + kappa3/(6.*pow(2.,1.5))*(8.*pow(arg12,3) - 12.*arg12);
3526 EW12 += kappa4/(24.*pow(2.,2))*(16.*pow(arg12,4) -48.*pow(arg12,2) + 12);
3528 Float_t c3QS = 1 + exp(-pow(q12*radius,2))*pow(EW12,2);
3529 Float_t w123 = pow(1-fc,3) + 3*fc*pow(1-fc,2);
3530 w123 += pow(fc,2)*(1-fc)*(1+exp(-pow(q12*radius,2))*pow(EW12,2))*coulCorr12;
3531 w123 += pow(fc,2)*(1-fc)*coulCorr13;
3532 w123 += pow(fc,2)*(1-fc)*coulCorr23;
3533 w123 += pow(fc,3)*c3QS*coulCorr12*coulCorr13*coulCorr23;
3536 return ((1-myDamp) + myDamp*(1 + exp(-pow(q12*radius,2))*pow(EW12,2))*coulCorr12);
3538 return ((1-myDamp) + myDamp*coulCorr13);
3540 return ((1-myDamp) + myDamp*coulCorr23);
3545 //________________________________________________________________________
3546 void AliThreePionRadii::SetFSICorrelations(Bool_t legoCase, TH1D *temp1DSS[10], TH1D *temp1DOS[10]){
3547 // read in 2-particle FSI correlations = K2
3548 // 2-particle input histo from file is binned in qinv.
3550 cout<<"LEGO call to SetFSICorrelations"<<endl;
3551 for(int mb=0; mb<10; mb++){
3552 fFSI2SS[mb] = (TH1D*)temp1DSS[mb]->Clone();
3553 fFSI2OS[mb] = (TH1D*)temp1DOS[mb]->Clone();
3555 fFSI2SS[mb]->SetDirectory(0);
3556 fFSI2OS[mb]->SetDirectory(0);
3559 cout<<"non LEGO call to SetFSICorrelations"<<endl;
3560 TFile *fsifile = new TFile("KFile.root","READ");
3561 if(!fsifile->IsOpen()) {
3562 cout<<"No FSI file found"<<endl;
3563 AliFatal("No FSI file found. Kill process.");
3564 }else {cout<<"Good FSI File Found!"<<endl;}
3565 for(int mb=0; mb<10; mb++){
3566 TString *nameK2ss = new TString("K2ss_");
3567 TString *nameK2os = new TString("K2os_");
3570 TH1D *temphistoSS = (TH1D*)fsifile->Get(nameK2ss->Data());
3571 TH1D *temphistoOS = (TH1D*)fsifile->Get(nameK2os->Data());
3573 fFSI2SS[mb] = (TH1D*)temphistoSS->Clone();
3574 fFSI2OS[mb] = (TH1D*)temphistoOS->Clone();
3575 fFSI2SS[mb]->SetDirectory(0);
3576 fFSI2OS[mb]->SetDirectory(0);
3582 for(int mb=0; mb<10; mb++){
3583 for(Int_t ii=1; ii<=fFSI2SS[mb]->GetNbinsX(); ii++){
3584 if(fFSI2SS[mb]->GetBinContent(ii) > 1.0) fFSI2SS[mb]->SetBinContent(ii, 1.0);
3585 if(fFSI2OS[mb]->GetBinContent(ii) > 10.0) fFSI2OS[mb]->SetBinContent(ii, 10.0);
3587 if(fFSI2SS[mb]->GetBinContent(ii) < 0.05) fFSI2SS[mb]->SetBinContent(ii, 0.05);
3588 if(fFSI2OS[mb]->GetBinContent(ii) < 0.9) fFSI2OS[mb]->SetBinContent(ii, 0.9);
3592 cout<<"Done reading FSI file"<<endl;
3594 //________________________________________________________________________
3595 Float_t AliThreePionRadii::FSICorrelation2(Int_t charge1, Int_t charge2, Float_t qinv){
3596 // returns 2-particle Coulomb correlations = K2
3597 Int_t qbinL = fFSI2SS[fFSIindex]->GetXaxis()->FindBin(qinv-fFSI2SS[fFSIindex]->GetXaxis()->GetBinWidth(1)/2.);
3598 Int_t qbinH = qbinL+1;
3599 if(qbinL <= 0) return 1.0;
3600 if(qbinH > fFSI2SS[fFSIindex]->GetNbinsX()) return 1.0;
3603 if(charge1==charge2){
3604 slope = fFSI2SS[fFSIindex]->GetBinContent(qbinL) - fFSI2SS[fFSIindex]->GetBinContent(qbinH);
3605 slope /= fFSI2SS[fFSIindex]->GetXaxis()->GetBinCenter(qbinL) - fFSI2SS[fFSIindex]->GetXaxis()->GetBinCenter(qbinH);
3606 return (slope*(qinv - fFSI2SS[fFSIindex]->GetXaxis()->GetBinCenter(qbinL)) + fFSI2SS[fFSIindex]->GetBinContent(qbinL));
3608 slope = fFSI2OS[fFSIindex]->GetBinContent(qbinL) - fFSI2OS[fFSIindex]->GetBinContent(qbinH);
3609 slope /= fFSI2OS[fFSIindex]->GetXaxis()->GetBinCenter(qbinL) - fFSI2OS[fFSIindex]->GetXaxis()->GetBinCenter(qbinH);
3610 return (slope*(qinv - fFSI2OS[fFSIindex]->GetXaxis()->GetBinCenter(qbinL)) + fFSI2OS[fFSIindex]->GetBinContent(qbinL));
3613 //________________________________________________________________________