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 TProfile *fAvgMult = new TProfile("fAvgMult","",fMbins,.5,fMbins+.5, 0,1500,"");
801 fOutputList->Add(fAvgMult);
802 TH2D *fAvgMultHisto2D = new TH2D("fAvgMultHisto2D","",fMbins,.5,fMbins+.5, 1000,0.5,2000.5);
803 fOutputList->Add(fAvgMultHisto2D);
804 TH2D *fAvgMultHisto2DV0C = new TH2D("fAvgMultHisto2DV0C","",fMbins,.5,fMbins+.5, 1000,0.5,2000.5);
805 fOutputList->Add(fAvgMultHisto2DV0C);
806 TH2D *fAvgMultHisto2DV0AplusC = new TH2D("fAvgMultHisto2DV0AplusC","",fMbins,.5,fMbins+.5, 1000,0.5,2000.5);
807 fOutputList->Add(fAvgMultHisto2DV0AplusC);
809 TH2D *fTrackChi2NDF = new TH2D("fTrackChi2NDF","",20,0,100, 100,0,10);
810 fOutputList->Add(fTrackChi2NDF);
811 TH2D *fTrackTPCncls = new TH2D("fTrackTPCncls","",20,0,100, 110,50,160);
812 fOutputList->Add(fTrackTPCncls);
816 TH3D *fKt3DistTerm1 = new TH3D("fKt3DistTerm1","",fMbins,.5,fMbins+.5, 20,0,1, 20,0,0.2);
817 TH3D *fKt3DistTerm5 = new TH3D("fKt3DistTerm5","",fMbins,.5,fMbins+.5, 20,0,1, 20,0,0.2);
818 fOutputList->Add(fKt3DistTerm1);
819 fOutputList->Add(fKt3DistTerm5);
821 TH1D *fMCWeight3DTerm1SC = new TH1D("fMCWeight3DTerm1SC","", 20,0,0.2);
822 TH1D *fMCWeight3DTerm1SCden = new TH1D("fMCWeight3DTerm1SCden","", 20,0,0.2);
823 TH1D *fMCWeight3DTerm2SC = new TH1D("fMCWeight3DTerm2SC","", 20,0,0.2);
824 TH1D *fMCWeight3DTerm2SCden = new TH1D("fMCWeight3DTerm2SCden","", 20,0,0.2);
825 TH1D *fMCWeight3DTerm1MC = new TH1D("fMCWeight3DTerm1MC","", 20,0,0.2);
826 TH1D *fMCWeight3DTerm1MCden = new TH1D("fMCWeight3DTerm1MCden","", 20,0,0.2);
827 TH1D *fMCWeight3DTerm2MC = new TH1D("fMCWeight3DTerm2MC","", 20,0,0.2);
828 TH1D *fMCWeight3DTerm2MCden = new TH1D("fMCWeight3DTerm2MCden","", 20,0,0.2);
829 TH1D *fMCWeight3DTerm3MC = new TH1D("fMCWeight3DTerm3MC","", 20,0,0.2);
830 TH1D *fMCWeight3DTerm3MCden = new TH1D("fMCWeight3DTerm3MCden","", 20,0,0.2);
831 TH1D *fMCWeight3DTerm4MC = new TH1D("fMCWeight3DTerm4MC","", 20,0,0.2);
832 TH1D *fMCWeight3DTerm4MCden = new TH1D("fMCWeight3DTerm4MCden","", 20,0,0.2);
833 fOutputList->Add(fMCWeight3DTerm1SC);
834 fOutputList->Add(fMCWeight3DTerm1SCden);
835 fOutputList->Add(fMCWeight3DTerm2SC);
836 fOutputList->Add(fMCWeight3DTerm2SCden);
837 fOutputList->Add(fMCWeight3DTerm1MC);
838 fOutputList->Add(fMCWeight3DTerm1MCden);
839 fOutputList->Add(fMCWeight3DTerm2MC);
840 fOutputList->Add(fMCWeight3DTerm2MCden);
841 fOutputList->Add(fMCWeight3DTerm3MC);
842 fOutputList->Add(fMCWeight3DTerm3MCden);
843 fOutputList->Add(fMCWeight3DTerm4MC);
844 fOutputList->Add(fMCWeight3DTerm4MCden);
846 TH2D *fdNchdEtaResponse = new TH2D("fdNchdEtaResponse","",15,0,15, 15,0,15);
847 TH2D *fNpionTrueDist = new TH2D("fNpionTrueDist","",fMbins,.5,fMbins+.5, 3000,0.5,3000.5);
848 TH2D *fNchTrueDist = new TH2D("fNchTrueDist","",fMbins,.5,fMbins+.5, 3000,0.5,3000.5);// default Nch mapping
849 TH2D *fNchTrueDistFullPt = new TH2D("fNchTrueDistFullPt","",fMbins,.5,fMbins+.5, 3000,0.5,3000.5);// full Pt Nch range mapping
850 TH2D *fNchTrueDistPubMethod = new TH2D("fNchTrueDistPubMethod","",fMbins,.5,fMbins+.5, 3000,0.5,3000.5);// Published pp Nch mapping
851 Float_t PubBins[9]={1.,12.,17.,23.,29.,35.,42.,52.,152.};
852 TProfile *fAvgNchTrueDistvsPubMethodBin = new TProfile("fAvgNchTrueDistvsPubMethodBin","",8,PubBins,"");
853 TProfile *fAvgRecRate = new TProfile("fAvgRecRate","",3000,0.5,3000.5, 0,3000, "");
854 if(fMCcase) fOutputList->Add(fdNchdEtaResponse);
855 if(fMCcase) fOutputList->Add(fNpionTrueDist);
856 if(fMCcase) fOutputList->Add(fNchTrueDist);
857 if(fMCcase) fOutputList->Add(fNchTrueDistFullPt);
858 if(fMCcase) fOutputList->Add(fNchTrueDistPubMethod);
859 if(fMCcase) fOutputList->Add(fAvgRecRate);
860 if(fMCcase) fOutputList->Add(fAvgNchTrueDistvsPubMethodBin);
861 TH2D *fdCentVsNchdEta = new TH2D("fdCentVsNchdEta","",fMbins,.5,fMbins+.5, 15,0,15);
862 if(fPbPbcase) fOutputList->Add(fdCentVsNchdEta);
864 TH1D *fV0TotSignal = new TH1D("fV0TotSignal","",3000, 0,30000);
865 if(fV0Mbinning) fOutputList->Add(fV0TotSignal);
867 TH2D *fMultBinVsCent = new TH2D("fMultBinVsCent","",fMbins,.5,fMbins+.5, 100,0,100);
868 fOutputList->Add(fMultBinVsCent);
870 TH1D *fExtendedQ3Histo_term1 = new TH1D("fExtendedQ3Histo_term1","",50,0,0.5);
871 TH1D *fExtendedQ3Histo_term2 = new TH1D("fExtendedQ3Histo_term2","",50,0,0.5);
872 TH1D *fExtendedQ3Histo_term5 = new TH1D("fExtendedQ3Histo_term5","",50,0,0.5);
873 fOutputList->Add(fExtendedQ3Histo_term1);
874 fOutputList->Add(fExtendedQ3Histo_term2);
875 fOutputList->Add(fExtendedQ3Histo_term5);
877 if(fPdensityPairCut){
879 for(Int_t mb=0; mb<fMbins; mb++){
880 if((mb < fCentBinLowLimit) || (mb > fCentBinHighLimit)) continue;
882 for(Int_t edB=0; edB<fEDbins; edB++){
883 if(edB >= fKt3bins) continue;
885 for(Int_t c1=0; c1<2; c1++){
886 for(Int_t c2=0; c2<2; c2++){
887 for(Int_t sc=0; sc<kSCLimit2; sc++){
888 for(Int_t term=0; term<2; term++){
890 TString *nameEx2 = new TString("Explicit2_Charge1_");
892 nameEx2->Append("_Charge2_");
894 nameEx2->Append("_SC_");
896 nameEx2->Append("_M_");
898 nameEx2->Append("_ED_");
900 nameEx2->Append("_Term_");
903 if(sc==0 || sc==3 || sc==5){
904 if( (c1+c2)==1 ) {if(c1!=0) continue;}// skip degenerate histogram
907 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);
908 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fExplicit2);
910 TString *nameMeanKt=new TString(nameEx2->Data());
911 nameMeanKt->Append("_MeanKt");
912 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fMeanKt = new TH1D(nameMeanKt->Data(),"Two Particle Distribution",200,0,1);
913 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fMeanKt);
915 TString *nameEx2QW=new TString(nameEx2->Data());
916 nameEx2QW->Append("_QW");
917 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);
918 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fExplicit2QW);
919 TString *nameAvgP=new TString(nameEx2->Data());
920 nameAvgP->Append("_AvgP");
921 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,"");
922 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fAvgP);
924 // Momentum resolution histos
925 if(fMCcase && sc==0){
926 TString *nameIdeal = new TString(nameEx2->Data());
927 nameIdeal->Append("_Ideal");
928 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fIdeal = new TH2D(nameIdeal->Data(),"Two Particle Distribution",fRVALUES*kNDampValues,-0.5,fRVALUES*kNDampValues-0.5, fQbins,0,fQupperBound);
929 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fIdeal);
930 TString *nameSmeared = new TString(nameEx2->Data());
931 nameSmeared->Append("_Smeared");
932 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fSmeared = new TH2D(nameSmeared->Data(),"Two Particle Distribution",fRVALUES*kNDampValues,-0.5,fRVALUES*kNDampValues-0.5, fQbins,0,fQupperBound);
933 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fSmeared);
935 TString *nameEx2MC=new TString(nameEx2->Data());
936 nameEx2MC->Append("_MCqinv");
937 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fMCqinv = new TH1D(nameEx2MC->Data(),"",fQbinsC2,0,fQlimitC2);
938 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fMCqinv);
939 TString *nameEx2MCQW=new TString(nameEx2->Data());
940 nameEx2MCQW->Append("_MCqinvQW");
941 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fMCqinvQW = new TH1D(nameEx2MCQW->Data(),"",fQbinsC2,0,fQlimitC2);
942 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fMCqinvQW);
944 TString *nameEx2PIDpurityDen=new TString(nameEx2->Data());
945 nameEx2PIDpurityDen->Append("_PIDpurityDen");
946 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);
947 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fPIDpurityDen);
948 TString *nameEx2PIDpurityNum=new TString(nameEx2->Data());
949 nameEx2PIDpurityNum->Append("_PIDpurityNum");
950 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);
951 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fPIDpurityNum);
959 for(Int_t c3=0; c3<2; c3++){
960 for(Int_t sc=0; sc<kSCLimit3; sc++){
961 for(Int_t term=0; term<5; term++){
962 TString *nameEx3 = new TString("Explicit3_Charge1_");
964 nameEx3->Append("_Charge2_");
966 nameEx3->Append("_Charge3_");
968 nameEx3->Append("_SC_");
970 nameEx3->Append("_M_");
972 nameEx3->Append("_ED_");
974 nameEx3->Append("_Term_");
977 TString *namePC3 = new TString("PairCut3_Charge1_");
979 namePC3->Append("_Charge2_");
981 namePC3->Append("_Charge3_");
983 namePC3->Append("_SC_");
985 namePC3->Append("_M_");
987 namePC3->Append("_ED_");
989 namePC3->Append("_Term_");
992 ///////////////////////////////////////
993 // skip degenerate histograms
994 if(sc==0 || sc==6 || sc==9){// Identical species
995 if( (c1+c2+c3)==1) {if(c3!=1) continue;}
996 if( (c1+c2+c3)==2) {if(c1!=0) continue;}
998 if( (c1+c2)==1) {if(c1!=0) continue;}
999 }else {}// do nothing for pi-k-p case
1001 /////////////////////////////////////////
1006 if(fPdensityPairCut){
1007 TString *nameNorm=new TString(namePC3->Data());
1008 nameNorm->Append("_Norm");
1009 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);
1010 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fNorm3);
1013 TString *nameQ3=new TString(namePC3->Data());
1014 nameQ3->Append("_Q3");
1015 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fTermsQ3 = new TH1D(nameQ3->Data(),"", 200,0,2.0);
1016 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fTermsQ3);
1018 TString *name3DQ=new TString(namePC3->Data());
1019 name3DQ->Append("_3D");
1020 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);
1021 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fTerms3);
1023 TString *nameMeanKt=new TString(namePC3->Data());
1024 nameMeanKt->Append("_MeanKt");
1025 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fMeanKt = new TH1D(nameMeanKt->Data(),"", 200,0,1);
1026 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fMeanKt);
1028 if(sc==0 && fMCcase==kTRUE){
1029 TString *name3DMomResIdeal=new TString(namePC3->Data());
1030 name3DMomResIdeal->Append("_Ideal");
1031 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fIdeal = new TH1D(name3DMomResIdeal->Data(),"", 200,0,2.0);
1032 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fIdeal);
1033 TString *name3DMomResSmeared=new TString(namePC3->Data());
1034 name3DMomResSmeared->Append("_Smeared");
1035 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fSmeared = new TH1D(name3DMomResSmeared->Data(),"", 200,0,2.0);
1036 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fSmeared);
1056 TProfile *fQsmearMean = new TProfile("fQsmearMean","",2,0.5,2.5, -0.2,0.2,"");
1057 fOutputList->Add(fQsmearMean);
1058 TProfile *fQsmearSq = new TProfile("fQsmearSq","",2,0.5,2.5, -2,2,"");
1059 fOutputList->Add(fQsmearSq);
1060 TH1D *fQDist = new TH1D("fQDist","",200,-.2,.2);
1061 fOutputList->Add(fQDist);
1065 ////////////////////////////////////
1066 ///////////////////////////////////
1068 PostData(1, fOutputList);
1071 //________________________________________________________________________
1072 void AliThreePionRadii::UserExec(Option_t *)
1075 // Called for each event
1077 if(fEventCounter%1000==0) cout<<"=========== Event # "<<fEventCounter<<" ==========="<<endl;
1079 if(!fAODcase) {cout<<"ESDs not supported"<<endl; return;}
1081 fAOD = dynamic_cast<AliAODEvent*> (InputEvent());
1082 if (!fAOD) {Printf("ERROR: fAOD not available"); return;}
1087 if(fAOD->GetRunNumber() >= 136851 && fAOD->GetRunNumber() <= 139517){// 10h data
1088 Bool_t isSelected1 = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kMB);
1089 if(!isSelected1 && !fMCcase) {return;}
1091 if(fAOD->GetRunNumber() >= 167693 && fAOD->GetRunNumber() <= 170593){// 11h data
1092 Bool_t isSelected1 = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kMB);
1093 Bool_t isSelected2 = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kCentral);
1094 Bool_t isSelected3 = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kSemiCentral);
1095 if(!isSelected1 && !isSelected2 && !isSelected3 && !fMCcase) {return;}
1098 Bool_t isSelected[4]={kFALSE};
1099 isSelected[0] = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kMB);
1100 isSelected[1] = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kAnyINT);
1101 isSelected[2] = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kINT7);
1102 isSelected[3] = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kHighMult);
1103 if(!isSelected[fTriggerType] && !fMCcase) return;
1107 ///////////////////////////////////////////////////////////
1108 const AliAODVertex *primaryVertexAOD;
1109 AliCentrality *centrality;// for AODs and ESDs
1112 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
1113 AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
1114 fPIDResponse = inputHandler->GetPIDResponse();
1117 TClonesArray *mcArray = 0x0;
1118 Int_t mcNch=0, mcNchFullPt=0, mcNchPubMethod=0;
1122 mcArray = (TClonesArray*)fAOD->FindListObject(AliAODMCParticle::StdBranchName());
1123 if(!mcArray || mcArray->GetEntriesFast() >= kMCarrayLimit){
1124 cout<<"No MC particle branch found or Array too large!!"<<endl;
1128 // Count true Nch at mid-rapidity
1129 for(Int_t mctrackN=0; mctrackN<mcArray->GetEntriesFast(); mctrackN++){
1130 AliAODMCParticle *mcParticle = (AliAODMCParticle*)mcArray->At(mctrackN);
1131 if(!mcParticle) continue;
1132 if(mcParticle->Charge()!=-3 && mcParticle->Charge()!=+3) continue;// x3 by convention
1133 if(!mcParticle->IsPrimary()) continue;
1134 if(!mcParticle->IsPhysicalPrimary()) continue;
1136 if(fabs(mcParticle->Eta())>0.8) continue;
1137 if(fabs(mcParticle->Eta())<=0.5) mcNchPubMethod++;// Published pp binning
1138 mcNchFullPt++;// My binning in full Pt range
1139 if(mcParticle->Pt() < 0.16 || mcParticle->Pt() > 1.0) continue;
1140 mcNch++;// My binning in my pt range
1141 if(abs(mcParticle->GetPdgCode())==211) mcNpion++;
1148 Int_t positiveTracks=0, negativeTracks=0;
1149 Int_t myTracks=0, pionCount=0, kaonCount=0, protonCount=0;
1150 Int_t FBTracks=0, AODTracks=0;
1152 Double_t vertex[3]={0};
1154 Double_t zstep=2*10/Double_t(fZvertexBins), zstart=-10.;
1155 /////////////////////////////////////////////////
1157 Float_t centralityPercentile=0;
1158 //Float_t cStep=5.0, cStart=0;
1159 Int_t trackletMult = 0;
1161 if(fAODcase){// AOD case
1164 centrality = fAOD->GetCentrality();
1165 centralityPercentile = centrality->GetCentralityPercentile("V0M");
1166 if(centralityPercentile == 0) {/*cout<<"Centrality = 0, skipping event"<<endl;*/ return;}
1167 //if((centralityPercentile < 5*fCentBinLowLimit) || (centralityPercentile>= 5*(fCentBinHighLimit+1))) {/*cout<<"Centrality out of Range. Skipping Event"<<endl;*/ return;}
1168 cout<<"Centrality % = "<<centralityPercentile<<endl;
1170 //cout<<"AOD multiplicity = "<<fAOD->GetNumberOfTracks()<<endl;
1173 AliAnalysisUtils *AnaUtil=new AliAnalysisUtils();
1174 if(fAOD->GetRunNumber() >= 195344 && fAOD->GetRunNumber() <= 195873) AnaUtil->SetUseMVPlpSelection(kTRUE);// use Multi-Vertex tool for pPb
1175 Bool_t pileUpCase=AnaUtil->IsPileUpEvent(fAOD);
1176 if(pileUpCase) return;
1178 ////////////////////////////////
1180 ((TH1F*)fOutputList->FindObject("fMultDist1"))->Fill(fAOD->GetNumberOfTracks());
1181 primaryVertexAOD = fAOD->GetPrimaryVertex();
1182 vertex[0]=primaryVertexAOD->GetX(); vertex[1]=primaryVertexAOD->GetY(); vertex[2]=primaryVertexAOD->GetZ();
1184 if(fabs(vertex[2]) > 10) {/*cout<<"Zvertex Out of Range. Skip Event"<<endl;*/ return;} // Z-Vertex Cut
1185 ((TH3F*)fOutputList->FindObject("fVertexDist"))->Fill(vertex[0], vertex[1], vertex[2]);
1187 for (Int_t i = 0; i < fAOD->GetNumberOfTracks(); i++) {
1188 AliAODTrack* aodtrack = fAOD->GetTrack(i);
1189 if (!aodtrack) continue;
1191 if(!aodtrack->TestFilterBit(BIT(fFilterBit))) continue;// AOD filterBit cut
1194 ((TH1F*)fOutputList->FindObject("fMultDist2"))->Fill(FBTracks);
1196 if(fAOD->IsPileupFromSPD()) {/*cout<<"PileUpEvent. Skip Event"<<endl;*/ return;} // Reject Pile-up events
1197 if(primaryVertexAOD->GetNContributors() < 1) {/*cout<<"Bad Vertex. Skip Event"<<endl;*/ return;}
1199 ((TH1F*)fOutputList->FindObject("fMultDist3"))->Fill(FBTracks);
1201 fBfield = fAOD->GetMagneticField();
1203 for(Int_t i=0; i<fZvertexBins; i++){
1204 if( (vertex[2] >= zstart+i*zstep) && (vertex[2] < zstart+(i+1)*zstep) ){
1210 AliAODTracklets *tracklets = (AliAODTracklets*)fAOD->GetTracklets();
1211 for(Int_t trackletN=0; trackletN<tracklets->GetNumberOfTracklets(); trackletN++){
1212 if(tracklets->GetTheta(trackletN) > 1.0904 && tracklets->GetTheta(trackletN) < 2.0512) trackletMult++;// |eta|<0.5 tracklets
1215 //cout<<fAOD->GetFiredTriggerClasses()<<endl;
1216 /////////////////////////////
1217 // Create Shuffled index list
1218 Int_t randomIndex[fAOD->GetNumberOfTracks()];
1219 for (Int_t i = 0; i < fAOD->GetNumberOfTracks(); i++) randomIndex[i]=i;
1220 Shuffle(randomIndex,0,fAOD->GetNumberOfTracks()-1);
1221 /////////////////////////////
1224 for (Int_t i = 0; i < fAOD->GetNumberOfTracks(); i++) {
1225 AliAODTrack* aodtrack = fAOD->GetTrack(randomIndex[i]);
1226 if (!aodtrack) continue;
1227 if(myTracks >= fMultLimit) {cout<<"More tracks than Track Limit"<<endl; return;}
1229 status=aodtrack->GetStatus();
1231 if(!aodtrack->TestFilterBit(BIT(7))) continue;// AOD filterBit cut
1233 // FilterBit Overlap Check
1234 if(fFilterBit != 7){
1235 Bool_t goodTrackOtherFB = kFALSE;
1236 if(fMCcase && fAOD->GetRunNumber()<=126437) goodTrackOtherFB=kTRUE;// FB7 to FB5 mapping in 10f6a MC does not work
1238 for (Int_t j = 0; j < fAOD->GetNumberOfTracks(); j++) {
1239 AliAODTrack* aodtrack2 = fAOD->GetTrack(randomIndex[j]);
1240 if(!aodtrack2) continue;
1241 if(!aodtrack2->TestFilterBit(BIT(fFilterBit))) continue;
1243 if(-(aodtrack->GetID()+1)==aodtrack2->GetID()) {goodTrackOtherFB=kTRUE; break;}
1246 if(!goodTrackOtherFB) continue;
1250 if(aodtrack->Pt() < 0.16) continue;
1251 if(fabs(aodtrack->Eta()) > 0.8) continue;
1254 Bool_t goodMomentum = aodtrack->GetPxPyPz( fTempStruct[myTracks].fP);
1255 if(!goodMomentum) continue;
1256 aodtrack->GetXYZ( fTempStruct[myTracks].fX);
1261 dca2[0] = sqrt( pow(fTempStruct[myTracks].fX[0] - vertex[0],2) + pow(fTempStruct[myTracks].fX[1] - vertex[1],2));
1262 dca2[1] = sqrt( pow(fTempStruct[myTracks].fX[2] - vertex[2],2));
1263 dca3d = sqrt( pow(dca2[0],2) + pow(dca2[1],2));
1265 fTempStruct[myTracks].fStatus = status;
1266 fTempStruct[myTracks].fFiltermap = aodtrack->GetFilterMap();
1267 fTempStruct[myTracks].fId = aodtrack->GetID();
1268 fTempStruct[myTracks].fLabel = aodtrack->GetLabel();
1269 fTempStruct[myTracks].fPhi = atan2(fTempStruct[myTracks].fP[1], fTempStruct[myTracks].fP[0]);
1270 if(fTempStruct[myTracks].fPhi < 0) fTempStruct[myTracks].fPhi += 2*PI;
1271 fTempStruct[myTracks].fPt = sqrt(pow(fTempStruct[myTracks].fP[0],2) + pow(fTempStruct[myTracks].fP[1],2));
1272 fTempStruct[myTracks].fMom = sqrt( pow(fTempStruct[myTracks].fPt,2) + pow(fTempStruct[myTracks].fP[2],2) );
1273 fTempStruct[myTracks].fEta = aodtrack->Eta();
1274 fTempStruct[myTracks].fCharge = aodtrack->Charge();
1275 fTempStruct[myTracks].fDCAXY = dca2[0];
1276 fTempStruct[myTracks].fDCAZ = dca2[1];
1277 fTempStruct[myTracks].fDCA = dca3d;
1278 fTempStruct[myTracks].fClusterMap = aodtrack->GetTPCClusterMap();
1279 fTempStruct[myTracks].fSharedMap = aodtrack->GetTPCSharedMap();
1283 if(fTempStruct[myTracks].fMom > 0.9999) continue;// upper P bound
1284 if(fTempStruct[myTracks].fPt > 0.9999) continue;// upper P bound
1285 if(fTempStruct[myTracks].fP[2] > 0.9999) continue;// upper P bound
1290 fTempStruct[myTracks].fElectron = kFALSE;
1291 fTempStruct[myTracks].fPion = kFALSE;
1292 fTempStruct[myTracks].fKaon = kFALSE;
1293 fTempStruct[myTracks].fProton = kFALSE;
1295 Float_t nSigmaTPC[5];
1296 Float_t nSigmaTOF[5];
1297 nSigmaTPC[0]=10; nSigmaTPC[1]=10; nSigmaTPC[2]=10; nSigmaTPC[3]=10; nSigmaTPC[4]=10;
1298 nSigmaTOF[0]=10; nSigmaTOF[1]=10; nSigmaTOF[2]=10; nSigmaTOF[3]=10; nSigmaTOF[4]=10;
1299 fTempStruct[myTracks].fTOFhit = kFALSE;// default
1300 Float_t signalTPC=0, signalTOF=0;
1301 Double_t integratedTimesTOF[10]={0};
1303 Bool_t DoPIDWorkAround=kTRUE;
1304 //if(fFilterBit == 7) DoPIDWorkAround=kTRUE;
1305 if(fMCcase && !fPbPbcase) DoPIDWorkAround=kFALSE;
1306 if(DoPIDWorkAround==kFALSE && fabs(fPIDResponse->NumberOfSigmasTPC(aodtrack,AliPID::kPion)) < 900) {
1307 nSigmaTPC[0]=fabs(fPIDResponse->NumberOfSigmasTPC(aodtrack,AliPID::kElectron));
1308 nSigmaTPC[1]=fabs(fPIDResponse->NumberOfSigmasTPC(aodtrack,AliPID::kMuon));
1309 nSigmaTPC[2]=fabs(fPIDResponse->NumberOfSigmasTPC(aodtrack,AliPID::kPion));
1310 nSigmaTPC[3]=fabs(fPIDResponse->NumberOfSigmasTPC(aodtrack,AliPID::kKaon));
1311 nSigmaTPC[4]=fabs(fPIDResponse->NumberOfSigmasTPC(aodtrack,AliPID::kProton));
1313 nSigmaTOF[0]=fabs(fPIDResponse->NumberOfSigmasTOF(aodtrack,AliPID::kElectron));
1314 nSigmaTOF[1]=fabs(fPIDResponse->NumberOfSigmasTOF(aodtrack,AliPID::kMuon));
1315 nSigmaTOF[2]=fabs(fPIDResponse->NumberOfSigmasTOF(aodtrack,AliPID::kPion));
1316 nSigmaTOF[3]=fabs(fPIDResponse->NumberOfSigmasTOF(aodtrack,AliPID::kKaon));
1317 nSigmaTOF[4]=fabs(fPIDResponse->NumberOfSigmasTOF(aodtrack,AliPID::kProton));
1318 signalTPC = aodtrack->GetTPCsignal();
1319 if( (status&AliESDtrack::kTOFpid)!=0 && (status&AliESDtrack::kTIME)!=0 && (status&AliESDtrack::kTOFout)!=0 && (status&AliESDtrack::kTOFmismatch)<=0){// good tof hit
1320 fTempStruct[myTracks].fTOFhit = kTRUE;
1321 signalTOF = aodtrack->GetTOFsignal();
1322 aodtrack->GetIntegratedTimes(integratedTimesTOF);
1323 }else fTempStruct[myTracks].fTOFhit = kFALSE;
1325 }else {// FilterBit 7 PID workaround
1327 for(Int_t j = 0; j < fAOD->GetNumberOfTracks(); j++) {
1328 AliAODTrack* aodTrack2 = fAOD->GetTrack(j);
1329 if (!aodTrack2) continue;
1330 if(aodtrack->GetID() != (-aodTrack2->GetID() - 1)) continue;// (-aodTrack2->GetID() - 1)
1332 UInt_t status2=aodTrack2->GetStatus();
1334 nSigmaTPC[0]=fabs(fPIDResponse->NumberOfSigmasTPC(aodTrack2,AliPID::kElectron));
1335 nSigmaTPC[1]=fabs(fPIDResponse->NumberOfSigmasTPC(aodTrack2,AliPID::kMuon));
1336 nSigmaTPC[2]=fabs(fPIDResponse->NumberOfSigmasTPC(aodTrack2,AliPID::kPion));
1337 nSigmaTPC[3]=fabs(fPIDResponse->NumberOfSigmasTPC(aodTrack2,AliPID::kKaon));
1338 nSigmaTPC[4]=fabs(fPIDResponse->NumberOfSigmasTPC(aodTrack2,AliPID::kProton));
1340 nSigmaTOF[0]=fabs(fPIDResponse->NumberOfSigmasTOF(aodTrack2,AliPID::kElectron));
1341 nSigmaTOF[1]=fabs(fPIDResponse->NumberOfSigmasTOF(aodTrack2,AliPID::kMuon));
1342 nSigmaTOF[2]=fabs(fPIDResponse->NumberOfSigmasTOF(aodTrack2,AliPID::kPion));
1343 nSigmaTOF[3]=fabs(fPIDResponse->NumberOfSigmasTOF(aodTrack2,AliPID::kKaon));
1344 nSigmaTOF[4]=fabs(fPIDResponse->NumberOfSigmasTOF(aodTrack2,AliPID::kProton));
1345 signalTPC = aodTrack2->GetTPCsignal();
1347 if( (status2&AliESDtrack::kTOFpid)!=0 && (status2&AliESDtrack::kTIME)!=0 && (status2&AliESDtrack::kTOFout)!=0 && (status2&AliESDtrack::kTOFmismatch)<=0){// good tof hit
1348 fTempStruct[myTracks].fTOFhit = kTRUE;
1349 signalTOF = aodTrack2->GetTOFsignal();
1350 aodTrack2->GetIntegratedTimes(integratedTimesTOF);
1351 }else fTempStruct[myTracks].fTOFhit = kFALSE;
1354 }// FilterBit 7 PID workaround
1356 //cout<<nSigmaTPC[2]<<endl;
1358 ((TH3F*)fOutputList->FindObject("fTPCResponse"))->Fill(centralityPercentile, fTempStruct[myTracks].fMom, signalTPC);
1359 if(fTempStruct[myTracks].fTOFhit) {
1360 ((TH3F*)fOutputList->FindObject("fTOFResponse"))->Fill(centralityPercentile, fTempStruct[myTracks].fMom, signalTOF - integratedTimesTOF[3]);
1364 // Use TOF if good hit and above threshold
1365 if(fTempStruct[myTracks].fTOFhit && fTempStruct[myTracks].fMom > fTPCTOFboundry){
1366 if(nSigmaTOF[0]<fSigmaCutTOF) fTempStruct[myTracks].fElectron = kTRUE;// Electron candidate
1367 if(nSigmaTOF[2]<fSigmaCutTOF) fTempStruct[myTracks].fPion = kTRUE;// Pion candidate
1368 if(nSigmaTOF[3]<fSigmaCutTOF) fTempStruct[myTracks].fKaon = kTRUE;// Kaon candidate
1369 if(nSigmaTOF[4]<fSigmaCutTOF) fTempStruct[myTracks].fProton = kTRUE;// Proton candidate
1370 }else {// TPC info instead
1371 if(nSigmaTPC[0]<fSigmaCutTPC) fTempStruct[myTracks].fElectron = kTRUE;// Electron candidate
1372 if(nSigmaTPC[2]<fSigmaCutTPC) fTempStruct[myTracks].fPion = kTRUE;// Pion candidate
1373 if(nSigmaTPC[3]<fSigmaCutTPC) fTempStruct[myTracks].fKaon = kTRUE;// Kaon candidate
1374 if(nSigmaTPC[4]<fSigmaCutTPC) fTempStruct[myTracks].fProton = kTRUE;// Proton candidate
1378 // Ensure there is only 1 candidate per track
1379 if(fTempStruct[myTracks].fElectron && fTempStruct[myTracks].fMom < 0.45) continue;// Remove electron band
1380 if(!fTempStruct[myTracks].fPion && !fTempStruct[myTracks].fKaon && !fTempStruct[myTracks].fProton) continue;
1381 if(fTempStruct[myTracks].fPion && fTempStruct[myTracks].fKaon) continue;
1382 if(fTempStruct[myTracks].fPion && fTempStruct[myTracks].fProton) continue;
1383 if(fTempStruct[myTracks].fKaon && fTempStruct[myTracks].fProton) continue;
1384 if(fTempStruct[myTracks].fPion && fTempStruct[myTracks].fKaon && fTempStruct[myTracks].fProton) continue;
1385 ////////////////////////
1386 if(fTempStruct[myTracks].fProton && fTempStruct[myTracks].fMom < 0.25) continue;//extra cut for protons
1388 if(!fTempStruct[myTracks].fPion) continue;// only pions
1393 if(fTempStruct[myTracks].fCharge==+1) {
1394 ((TH2F*)fOutputList->FindObject("fDCAxyDistPlus"))->Fill(fTempStruct[myTracks].fPt, dca2[0]);
1395 ((TH2F*)fOutputList->FindObject("fDCAzDistPlus"))->Fill(fTempStruct[myTracks].fPt, dca2[1]);
1397 ((TH2F*)fOutputList->FindObject("fDCAxyDistMinus"))->Fill(fTempStruct[myTracks].fPt, dca2[0]);
1398 ((TH2F*)fOutputList->FindObject("fDCAzDistMinus"))->Fill(fTempStruct[myTracks].fPt, dca2[1]);
1401 ((TH3F*)fOutputList->FindObject("fPhiPtDist"))->Fill(aodtrack->Charge(), aodtrack->Phi(), aodtrack->Pt());
1402 ((TH3F*)fOutputList->FindObject("fPtEtaDist"))->Fill(aodtrack->Charge(), aodtrack->Pt(), aodtrack->Eta());
1406 if(fTempStruct[myTracks].fPion) {// pions
1407 fTempStruct[myTracks].fEaccepted = sqrt(pow(fTempStruct[myTracks].fMom,2) + pow(fTrueMassPi,2));
1408 fTempStruct[myTracks].fKey = 1;
1409 }else if(fTempStruct[myTracks].fKaon){// kaons
1410 fTempStruct[myTracks].fEaccepted = sqrt(pow(fTempStruct[myTracks].fMom,2) + pow(fTrueMassK,2));;
1411 fTempStruct[myTracks].fKey = 10;
1413 fTempStruct[myTracks].fEaccepted = sqrt(pow(fTempStruct[myTracks].fMom,2) + pow(fTrueMassP,2));;
1414 fTempStruct[myTracks].fKey = 100;
1418 ((TH2D*)fOutputList->FindObject("fTrackChi2NDF"))->Fill(centralityPercentile, aodtrack->Chi2perNDF());
1419 ((TH2D*)fOutputList->FindObject("fTrackTPCncls"))->Fill(centralityPercentile, aodtrack->GetTPCncls());
1420 if(aodtrack->Chi2perNDF() > fMaxChi2NDF) continue;
1421 if(aodtrack->GetTPCncls() < fMinTPCncls) continue;
1424 if(aodtrack->Charge() > 0) positiveTracks++;
1425 else negativeTracks++;
1427 if(fTempStruct[myTracks].fPion) pionCount++;
1428 if(fTempStruct[myTracks].fKaon) kaonCount++;
1429 if(fTempStruct[myTracks].fProton) protonCount++;
1433 if(fMCcase){// muon mothers
1434 AliAODMCParticle *tempMCTrack=(AliAODMCParticle*)mcArray->At(abs(aodtrack->GetLabel()));
1435 if(abs(tempMCTrack->GetPdgCode())==13 && tempMCTrack->GetMother()>0){// muons
1436 AliAODMCParticle *parent=(AliAODMCParticle*)mcArray->At(tempMCTrack->GetMother());
1437 if(parent->IsPhysicalPrimary()){
1438 ((TH1D*)fOutputList->FindObject("fMuonParents"))->Fill(abs(parent->GetPdgCode()));
1439 }else ((TH1D*)fOutputList->FindObject("fSecondaryMuonParents"))->Fill(abs(parent->GetPdgCode()));
1441 ((TH1D*)fOutputList->FindObject("fPionCandidates"))->Fill(abs(tempMCTrack->GetPdgCode()));
1444 }else {// ESD tracks
1445 cout<<"ESDs not supported currently"<<endl;
1449 // Generator info only
1450 if(fMCcase && fGeneratorOnly){
1451 myTracks=0; pionCount=0; kaonCount=0; protonCount=0;// reset track counters
1452 for(Int_t mctrackN=0; mctrackN<mcArray->GetEntriesFast(); mctrackN++){
1453 if(myTracks >= fMultLimit) {cout<<"More tracks than Track Limit"<<endl; return;}
1454 if(myTracks >= 1300) continue;// additional cut to limit high mult events which exceed pair # limits
1456 AliAODMCParticle *mcParticle = (AliAODMCParticle*)mcArray->At(mctrackN);
1457 if(!mcParticle) continue;
1458 if(fabs(mcParticle->Eta())>0.8) continue;
1459 if(mcParticle->Charge()!=-3 && mcParticle->Charge()!=+3) continue;// x3 by convention
1460 if(mcParticle->Pt() < 0.16 || mcParticle->Pt() > 1.0) continue;
1461 if(!mcParticle->IsPrimary()) continue;
1462 if(!mcParticle->IsPhysicalPrimary()) continue;
1463 if(abs(mcParticle->GetPdgCode())!=211) continue;
1465 fTempStruct[myTracks].fP[0] = mcParticle->Px();
1466 fTempStruct[myTracks].fP[1] = mcParticle->Py();
1467 fTempStruct[myTracks].fP[2] = mcParticle->Pz();
1468 fTempStruct[myTracks].fX[0] = 0.; fTempStruct[myTracks].fX[1] = 0.; fTempStruct[myTracks].fX[2] = 0.;
1470 fTempStruct[myTracks].fId = myTracks;// use my track counter
1471 fTempStruct[myTracks].fLabel = mctrackN;
1472 fTempStruct[myTracks].fPhi = atan2(fTempStruct[myTracks].fP[1], fTempStruct[myTracks].fP[0]);
1473 if(fTempStruct[myTracks].fPhi < 0) fTempStruct[myTracks].fPhi += 2*PI;
1474 fTempStruct[myTracks].fPt = sqrt(pow(fTempStruct[myTracks].fP[0],2) + pow(fTempStruct[myTracks].fP[1],2));
1475 fTempStruct[myTracks].fMom = sqrt( pow(fTempStruct[myTracks].fPt,2) + pow(fTempStruct[myTracks].fP[2],2) );
1476 fTempStruct[myTracks].fEta = mcParticle->Eta();
1477 fTempStruct[myTracks].fCharge = int(mcParticle->Charge()/3.);
1478 fTempStruct[myTracks].fDCAXY = 0.;
1479 fTempStruct[myTracks].fDCAZ = 0.;
1480 fTempStruct[myTracks].fDCA = 0.;
1481 fTempStruct[myTracks].fPion = kTRUE;
1482 fTempStruct[myTracks].fEaccepted = sqrt(pow(fTempStruct[myTracks].fMom,2) + pow(fTrueMassPi,2));
1483 fTempStruct[myTracks].fKey = 1;
1493 ((TH1F*)fOutputList->FindObject("fMultDist4"))->Fill(myTracks);
1497 //cout<<"There are "<<myTracks<<" myTracks"<<endl;
1498 //cout<<"pionCount = "<<pionCount<<" kaonCount = "<<kaonCount<<" protonCount = "<<protonCount<<endl;
1500 /////////////////////////////////////////
1501 // Pion Multiplicity Cut (To ensure all Correlation orders are present in each event)
1502 if(myTracks < 3) {/*cout<<"Less than 3 tracks. Skipping Event."<<endl;*/ return;}
1503 /////////////////////////////////////////
1506 ////////////////////////////////
1507 ///////////////////////////////
1508 // Mbin determination
1511 for(Int_t i=0; i<fCentBins; i++){
1512 if( pionCount >= fMultLimits[i] && pionCount < fMultLimits[i+1]) {fMbin = fCentBins-i-1; break;}
1518 if(fMbin==0) fFSIindex = 0;//0-5%
1519 else if(fMbin==1) fFSIindex = 1;//5-10%
1520 else if(fMbin<=3) fFSIindex = 2;//10-20%
1521 else if(fMbin<=5) fFSIindex = 3;//20-30%
1522 else if(fMbin<=7) fFSIindex = 4;//30-40%
1523 else if(fMbin<=9) fFSIindex = 5;//40-50%
1524 else if(fMbin<=12) fFSIindex = 6;//40-50%
1525 else if(fMbin<=15) fFSIindex = 7;//40-50%
1526 else if(fMbin<=18) fFSIindex = 8;//40-50%
1527 else fFSIindex = 8;//90-100%
1528 }else fFSIindex = 9;// pp and pPb
1532 Bool_t useV0=kFALSE;
1533 if(fPbPbcase) useV0=kTRUE;
1534 if(!fPbPbcase && fAOD->GetRunNumber() >= 195344 && fAOD->GetRunNumber() <= 195677) useV0=kTRUE;
1536 AliAODVZERO *vZero = fAOD->GetVZEROData();
1537 Float_t vZeroAmp = vZero->GetMTotV0A();
1538 centrality = fAOD->GetCentrality();
1539 centralityPercentile = centrality->GetCentralityPercentile("V0M");
1540 for(Int_t i=0; i<fCentBins; i++){
1541 if(vZeroAmp/4.4 >= fMultLimits[i] && vZeroAmp/4.4 < fMultLimits[i+1]) {fMbin = fCentBins-i-1; break;}
1543 ((TH1D*)fOutputList->FindObject("fV0TotSignal"))->Fill(vZeroAmp);
1544 //cout<<centralityPercentile<<" "<<vZeroAmp<<" "<<fMbin<<endl;
1547 vZeroAmp = vZero->GetMTotV0C();
1548 for(Int_t i=0; i<fCentBins; i++){
1549 if(vZeroAmp/4.4 >= fMultLimits[i] && vZeroAmp/4.4 < fMultLimits[i+1]) {fMbinV0C = fCentBins-i-1; break;}
1552 Int_t fMbinV0AplusC=-1;
1553 vZeroAmp = vZero->GetMTotV0A() + vZero->GetMTotV0C();
1554 for(Int_t i=0; i<fCentBins; i++){
1555 if(vZeroAmp/4.4 >= fMultLimits[i] && vZeroAmp/4.4 < fMultLimits[i+1]) {fMbinV0AplusC = fCentBins-i-1; break;}
1557 ((TH2D*)fOutputList->FindObject("fAvgMultHisto2DV0C"))->Fill(fMbinV0C+1., pionCount);
1558 ((TH2D*)fOutputList->FindObject("fAvgMultHisto2DV0AplusC"))->Fill(fMbinV0AplusC+1., pionCount);
1562 if(fMbin==-1) {cout<<pionCount<<" Bad Mbin+++++++++++++++++++++++++++++++++++++++++++++++++++"<<endl; return;}
1564 ((TH1F*)fOutputList->FindObject("fEvents1"))->Fill(fMbin+1);
1565 ((TProfile*)fOutputList->FindObject("fAvgMult"))->Fill(fMbin+1., pionCount);
1566 ((TH2D*)fOutputList->FindObject("fAvgMultHisto2D"))->Fill(fMbin+1., pionCount);
1568 ((TH2D*)fOutputList->FindObject("fdNchdEtaResponse"))->Fill(pow(trackletMult,1/3.), pow(mcNch,1/3.));
1569 ((TH2D*)fOutputList->FindObject("fNpionTrueDist"))->Fill(fMbin+1., mcNpion);
1570 ((TH2D*)fOutputList->FindObject("fNchTrueDist"))->Fill(fMbin+1., mcNch);// default Nch mapping
1571 ((TH2D*)fOutputList->FindObject("fNchTrueDistFullPt"))->Fill(fMbin+1., mcNchFullPt);// full Pt Nch range mapping
1572 ((TH2D*)fOutputList->FindObject("fNchTrueDistPubMethod"))->Fill(fMbin+1., mcNchPubMethod);// Published pp Method Nch mapping
1573 ((TProfile*)fOutputList->FindObject("fAvgNchTrueDistvsPubMethodBin"))->Fill(mcNchPubMethod, mcNch);// Mapping of Published bins to default Nch bins
1574 ((TProfile*)fOutputList->FindObject("fAvgRecRate"))->Fill(mcNpion, pionCount);
1577 ((TH2D*)fOutputList->FindObject("fdCentVsNchdEta"))->Fill(fMbin+1, pow(trackletMult,1/3.));
1578 centrality = fAOD->GetCentrality();
1579 centralityPercentile = centrality->GetCentralityPercentile("V0M");
1580 ((TH2D*)fOutputList->FindObject("fMultBinVsCent"))->Fill(fMbin+1, centralityPercentile);
1584 if(fMbin < fCentBinLowLimit || fMbin > fCentBinHighLimit) {cout<<"Mult out of range"<<endl; return;}
1586 //////////////////////////////////////////////////
1587 fEDbin=0;// Extra Dimension bin (Kt, (Kt-Psi),....)
1588 //////////////////////////////////////////////////
1592 //return;// un-comment for a run to calculate Nrec to Nch Mapping
1595 ////////////////////////////////////
1596 // Add event to buffer if > 0 tracks
1598 fEC[zbin][fMbin]->FIFOShift();
1599 (fEvt) = fEC[zbin][fMbin]->fEvtStr;
1600 (fEvt)->fNtracks = myTracks;
1601 (fEvt)->fFillStatus = 1;
1602 for(Int_t i=0; i<myTracks; i++) (fEvt)->fTracks[i] = fTempStruct[i];
1604 (fEvt)->fMCarraySize = mcArray->GetEntriesFast();
1605 for(Int_t i=0; i<mcArray->GetEntriesFast(); i++) {
1606 AliAODMCParticle *tempMCTrack = (AliAODMCParticle*)mcArray->At(i);
1607 (fEvt)->fMCtracks[i].fPx = tempMCTrack->Px();
1608 (fEvt)->fMCtracks[i].fPy = tempMCTrack->Py();
1609 (fEvt)->fMCtracks[i].fPz = tempMCTrack->Pz();
1610 (fEvt)->fMCtracks[i].fPtot = sqrt(pow(tempMCTrack->Px(),2)+pow(tempMCTrack->Py(),2)+pow(tempMCTrack->Pz(),2));
1616 Float_t qinv12=0, qinv13=0, qinv23=0;
1617 Float_t qout=0, qside=0, qlong=0;
1618 Float_t qoutMC=0, qsideMC=0, qlongMC=0;
1619 Float_t firstQ=0, secondQ=0, thirdQ=0;
1620 Float_t firstQMC=0, secondQMC=0, thirdQMC=0;
1621 Float_t transK12=0, transK3=0;
1622 Float_t q3=0, q3MC=0;
1623 Int_t ch1=0, ch2=0, ch3=0;
1624 Short_t key1=0, key2=0, key3=0;
1625 Int_t bin1=0, bin2=0, bin3=0;
1626 Float_t pVect1[4]={0};
1627 Float_t pVect2[4]={0};
1628 Float_t pVect3[4]={0};
1629 Float_t pVect1MC[4]={0};
1630 Float_t pVect2MC[4]={0};
1631 Float_t pVect3MC[4]={0};
1632 Int_t index1=0, index2=0, index3=0;
1633 Float_t qinv12MC=0, qinv13MC=0, qinv23MC=0;
1635 AliAODMCParticle *mcParticle1=0x0;
1636 AliAODMCParticle *mcParticle2=0x0;
1638 if(fPdensityPairCut){
1639 ////////////////////
1640 Int_t pairCountSE=0, pairCountME=0;
1641 Int_t normPairCount[2]={0};
1642 Int_t numOtherPairs1[2][fMultLimit];
1643 Int_t numOtherPairs2[2][fMultLimit];
1644 Bool_t exitCode=kFALSE;
1645 Int_t tempNormFillCount[2][2][2][10][5];
1648 // reset to defaults
1649 for(Int_t i=0; i<fMultLimit; i++) {
1650 fPairLocationSE[i]->Set(fMultLimit,fDefaultsInt);
1651 fPairLocationME[i]->Set(fMultLimit,fDefaultsInt);
1653 // Normalization Utilities
1654 fOtherPairLocation1[0][i]->Set(fMultLimit,fDefaultsInt);
1655 fOtherPairLocation1[1][i]->Set(fMultLimit,fDefaultsInt);
1656 fOtherPairLocation2[0][i]->Set(fMultLimit,fDefaultsInt);
1657 fOtherPairLocation2[1][i]->Set(fMultLimit,fDefaultsInt);
1658 fNormPairSwitch[0][i]->Set(fMultLimit,fDefaultsCharMult);
1659 fNormPairSwitch[1][i]->Set(fMultLimit,fDefaultsCharMult);
1660 fNormPairSwitch[2][i]->Set(fMultLimit,fDefaultsCharMult);
1661 numOtherPairs1[0][i]=0;
1662 numOtherPairs1[1][i]=0;
1663 numOtherPairs2[0][i]=0;
1664 numOtherPairs2[1][i]=0;
1666 // Track Merging/Splitting Utilities
1667 fPairSplitCut[0][i]->Set(fMultLimit,fDefaultsCharMult);// P11
1668 fPairSplitCut[1][i]->Set(fMultLimit,fDefaultsCharMult);// P12
1669 fPairSplitCut[2][i]->Set(fMultLimit,fDefaultsCharMult);// P13
1670 fPairSplitCut[3][i]->Set(fMultLimit,fDefaultsCharMult);// P23
1673 // Reset the temp Normalization counters
1674 for(Int_t i=0; i<2; i++){// Charge1
1675 for(Int_t j=0; j<2; j++){// Charge2
1676 for(Int_t k=0; k<2; k++){// Charge3
1677 for(Int_t l=0; l<10; l++){// FillIndex (species Combination)
1678 for(Int_t m=0; m<5; m++){// Term (Cumulant term)
1679 tempNormFillCount[i][j][k][l][m] = 0;
1688 /////////////////////////////////////////////////////////////////
1689 // extended range Q3 baseline
1690 /*for(Int_t iter=0; iter<3; iter++){
1691 for (Int_t i=0; i<myTracks; i++) {
1696 if(en2!=0) start2=0;
1698 for (Int_t j=start2; j<(fEvt+en2)->fNtracks; j++) {
1699 if((fEvt)->fTracks[i].fCharge != (fEvt+en2)->fTracks[j].fCharge) continue;
1700 key1 = (fEvt)->fTracks[i].fKey;
1701 key2 = (fEvt+en2)->fTracks[j].fKey;
1702 Short_t fillIndex2 = FillIndex2part(key1+key2);
1703 pVect1[0]=(fEvt)->fTracks[i].fEaccepted; pVect2[0]=(fEvt+en2)->fTracks[j].fEaccepted;
1704 pVect1[1]=(fEvt)->fTracks[i].fP[0]; pVect2[1]=(fEvt+en2)->fTracks[j].fP[0];
1705 pVect1[2]=(fEvt)->fTracks[i].fP[1]; pVect2[2]=(fEvt+en2)->fTracks[j].fP[1];
1706 pVect1[3]=(fEvt)->fTracks[i].fP[2]; pVect2[3]=(fEvt+en2)->fTracks[j].fP[2];
1707 qinv12 = GetQinv(fillIndex2, pVect1, pVect2);
1709 if(qinv12>0.5) continue;
1710 if(!AcceptPair(&((fEvt)->fTracks[i]), &((fEvt+en2)->fTracks[j]))) continue;
1716 if(iter>0) start3=0;
1718 for (Int_t k=start3; k<(fEvt+en3)->fNtracks; k++) {
1719 if((fEvt)->fTracks[i].fCharge != (fEvt+en3)->fTracks[k].fCharge) continue;
1720 pVect3[0]=(fEvt+en3)->fTracks[k].fEaccepted;
1721 pVect3[1]=(fEvt+en3)->fTracks[k].fP[0];
1722 pVect3[2]=(fEvt+en3)->fTracks[k].fP[1];
1723 pVect3[3]=(fEvt+en3)->fTracks[k].fP[2];
1724 qinv13 = GetQinv(fillIndex2, pVect1, pVect3);
1725 if(qinv13>0.5) continue;
1726 qinv23 = GetQinv(fillIndex2, pVect2, pVect3);
1727 if(qinv23>0.5) continue;
1728 if(!AcceptPair(&((fEvt)->fTracks[i]), &((fEvt+en3)->fTracks[k]))) continue;
1729 if(!AcceptPair(&((fEvt+en2)->fTracks[j]), &((fEvt+en3)->fTracks[k]))) continue;
1731 q3 = sqrt(pow(qinv12,2) + pow(qinv13,2) + pow(qinv23,2));
1733 if(iter==0) ((TH1D*)fOutputList->FindObject("fExtendedQ3Histo_term1"))->Fill(q3);
1734 if(iter==1) ((TH1D*)fOutputList->FindObject("fExtendedQ3Histo_term2"))->Fill(q3);
1735 if(iter==2) ((TH1D*)fOutputList->FindObject("fExtendedQ3Histo_term5"))->Fill(q3);
1742 ///////////////////////////////////////////////////////
1743 // Start the pairing process
1747 for (Int_t i=0; i<myTracks; i++) {
1752 for (Int_t j=i+1; j<(fEvt+en2)->fNtracks; j++) {
1754 key1 = (fEvt)->fTracks[i].fKey;
1755 key2 = (fEvt+en2)->fTracks[j].fKey;
1756 Short_t fillIndex2 = FillIndex2part(key1+key2);
1757 Short_t qCutBin = SetQcutBin(fillIndex2);
1758 Short_t normBin = SetNormBin(fillIndex2);
1759 pVect1[0]=(fEvt)->fTracks[i].fEaccepted; pVect2[0]=(fEvt+en2)->fTracks[j].fEaccepted;
1760 pVect1[1]=(fEvt)->fTracks[i].fP[0]; pVect2[1]=(fEvt+en2)->fTracks[j].fP[0];
1761 pVect1[2]=(fEvt)->fTracks[i].fP[1]; pVect2[2]=(fEvt+en2)->fTracks[j].fP[1];
1762 pVect1[3]=(fEvt)->fTracks[i].fP[2]; pVect2[3]=(fEvt+en2)->fTracks[j].fP[2];
1766 qinv12 = GetQinv(fillIndex2, pVect1, pVect2);
1767 GetQosl(pVect1, pVect2, qout, qside, qlong);
1768 transK12 = sqrt(pow(pVect1[1]+pVect2[1],2) + pow(pVect1[2]+pVect2[2],2))/2.;
1773 ///////////////////////////////
1774 ch1 = Int_t(((fEvt)->fTracks[i].fCharge + 1)/2.);
1775 ch2 = Int_t(((fEvt+en2)->fTracks[j].fCharge + 1)/2.);
1776 SetFillBins2(fillIndex2, key1, key2, ch1, ch2, bin1, bin2);
1778 if(fMCcase && ch1==ch2 && fMbin==0 && qinv12<0.2){
1779 //////////////////////////
1780 // pad-row method testing
1781 Float_t coeff = (5)*0.2*(0.18/1.2);// 5 to evaluate at 1.0m in TPC
1782 Float_t phi1 = (fEvt)->fTracks[i].fPhi - asin((fEvt)->fTracks[i].fCharge*(0.1*fBfield)*coeff/(fEvt)->fTracks[i].fPt);
1783 if(phi1 > 2*PI) phi1 -= 2*PI;
1784 if(phi1 < 0) phi1 += 2*PI;
1785 Float_t phi2 = (fEvt+en2)->fTracks[j].fPhi - asin((fEvt+en2)->fTracks[j].fCharge*(0.1*fBfield)*coeff/(fEvt+en2)->fTracks[j].fPt);
1786 if(phi2 > 2*PI) phi2 -= 2*PI;
1787 if(phi2 < 0) phi2 += 2*PI;
1788 Float_t deltaphi = phi1 - phi2;
1789 if(deltaphi > PI) deltaphi -= PI;
1790 if(deltaphi < -PI) deltaphi += PI;
1792 Int_t ncl1 = (fEvt)->fTracks[i].fClusterMap.GetNbits();
1793 Int_t ncl2 = (fEvt+en2)->fTracks[j].fClusterMap.GetNbits();
1794 Float_t sumCls = 0; Float_t sumSha = 0; Float_t sumQ = 0;
1795 Double_t shfrac = 0; //Double_t qfactor = 0;
1796 for(Int_t imap = 0; imap < ncl1 && imap < ncl2; imap++) {
1797 if ((fEvt)->fTracks[i].fClusterMap.TestBitNumber(imap) && (fEvt+en2)->fTracks[j].fClusterMap.TestBitNumber(imap)) {// Both clusters
1798 if ((fEvt)->fTracks[i].fSharedMap.TestBitNumber(imap) && (fEvt+en2)->fTracks[j].fSharedMap.TestBitNumber(imap)) { // Shared
1802 else {sumQ--; sumCls+=2;}
1804 else if ((fEvt)->fTracks[i].fClusterMap.TestBitNumber(imap) || (fEvt+en2)->fTracks[j].fClusterMap.TestBitNumber(imap)) {// Non shared
1809 //qfactor = sumQ*1.0/sumCls;
1810 shfrac = sumSha*1.0/sumCls;
1812 if(fabs(deltaphi)<0.07 && fabs((fEvt)->fTracks[i].fEta-(fEvt+en2)->fTracks[j].fEta) < 0.03){
1813 ((TH3D*)fOutputList->FindObject("fPairsPadRowNum"))->Fill(transK12, shfrac, qinv12);
1816 for(Int_t rstep=0; rstep<10; rstep++){
1817 coeff = (rstep)*0.2*(0.18/1.2);
1818 phi1 = (fEvt)->fTracks[i].fPhi - asin((fEvt)->fTracks[i].fCharge*(0.1*fBfield)*coeff/(fEvt)->fTracks[i].fPt);
1819 if(phi1 > 2*PI) phi1 -= 2*PI;
1820 if(phi1 < 0) phi1 += 2*PI;
1821 phi2 = (fEvt+en2)->fTracks[j].fPhi - asin((fEvt+en2)->fTracks[j].fCharge*(0.1*fBfield)*coeff/(fEvt+en2)->fTracks[j].fPt);
1822 if(phi2 > 2*PI) phi2 -= 2*PI;
1823 if(phi2 < 0) phi2 += 2*PI;
1824 deltaphi = phi1 - phi2;
1825 if(deltaphi > PI) deltaphi -= PI;
1826 if(deltaphi < -PI) deltaphi += PI;
1828 if(fabs((fEvt)->fTracks[i].fEta-(fEvt+en2)->fTracks[j].fEta) < 0.03){
1829 ((TH3F*)fOutputList->FindObject("fPairsShareFracDPhiNum"))->Fill(rstep, shfrac, deltaphi);
1831 //if(shfrac < 0.05){
1832 ((TH3F*)fOutputList->FindObject("fPairsDetaDPhiNum"))->Fill(rstep, (fEvt)->fTracks[i].fEta-(fEvt+en2)->fTracks[j].fEta, deltaphi);
1837 }// MCcase and pair selection
1839 // Pair Splitting/Merging cut
1840 if(qinv12 < fQLowerCut) continue;// remove unwanted low-q pairs (also a type of track splitting/merging cut)
1841 if(ch1 == ch2 && !fGeneratorOnly){
1842 if(!AcceptPair(&((fEvt)->fTracks[i]), &((fEvt+en2)->fTracks[j]))) {
1843 fPairSplitCut[0][i]->AddAt('1',j);
1844 ((TH1F*)fOutputList->FindObject("fRejectedPairs"))->Fill(qinv12);
1850 if(fMCcase && fillIndex2==0){
1852 // Check that label does not exceed stack size
1853 if((fEvt)->fTracks[i].fLabel < (fEvt)->fMCarraySize && (fEvt+en2)->fTracks[j].fLabel < (fEvt+en2)->fMCarraySize){
1854 pVect1MC[0]=sqrt(pow((fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPtot,2)+pow(fTrueMassPi,2));
1855 pVect2MC[0]=sqrt(pow((fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPtot,2)+pow(fTrueMassPi,2));
1856 pVect1MC[1]=(fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPx; pVect2MC[1]=(fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPx;
1857 pVect1MC[2]=(fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPy; pVect2MC[2]=(fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPy;
1858 pVect1MC[3]=(fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPz; pVect2MC[3]=(fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPz;
1859 qinv12MC = GetQinv(fillIndex2, pVect1MC, pVect2MC);
1860 GetQosl(pVect1MC, pVect2MC, qoutMC, qsideMC, qlongMC);
1861 if(qinv12<0.1 && ch1==ch2) {
1862 ((TProfile*)fOutputList->FindObject("fQsmearMean"))->Fill(1.,qinv12-qinv12MC);
1863 ((TProfile*)fOutputList->FindObject("fQsmearSq"))->Fill(1.,1000.*pow(qinv12-qinv12MC,2));
1864 ((TH1D*)fOutputList->FindObject("fQDist"))->Fill(qinv12-qinv12MC);
1869 mcParticle1 = (AliAODMCParticle*)mcArray->At(abs((fEvt)->fTracks[i].fLabel));
1870 mcParticle2 = (AliAODMCParticle*)mcArray->At(abs((fEvt+en2)->fTracks[j].fLabel));
1873 // secondary contamination
1874 if(abs(mcParticle1->GetPdgCode())==211 && abs(mcParticle2->GetPdgCode())==211){
1876 ((TH3D*)fOutputList->FindObject("fAllSCPionPairs"))->Fill(fMbin+1, transK12, qinv12);
1877 if(!mcParticle1->IsSecondaryFromWeakDecay() && !mcParticle2->IsSecondaryFromWeakDecay()) {
1878 ((TH3D*)fOutputList->FindObject("fPrimarySCPionPairs"))->Fill(fMbin+1, transK12, qinv12);
1881 ((TH3D*)fOutputList->FindObject("fAllMCPionPairs"))->Fill(fMbin+1, transK12, qinv12);
1882 if(!mcParticle1->IsSecondaryFromWeakDecay() && !mcParticle2->IsSecondaryFromWeakDecay()) {
1883 ((TH3D*)fOutputList->FindObject("fPrimaryMCPionPairs"))->Fill(fMbin+1, transK12, qinv12);
1889 if(fFSIindex<=1) rForQW=10;
1890 else if(fFSIindex==2) rForQW=9;
1891 else if(fFSIindex==3) rForQW=8;
1892 else if(fFSIindex==4) rForQW=7;
1893 else if(fFSIindex==5) rForQW=6;
1894 else if(fFSIindex==6) rForQW=5;
1895 else if(fFSIindex==7) rForQW=4;
1896 else if(fFSIindex==8) rForQW=3;
1899 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].fMCqinv->Fill(qinv12MC, MCWeight(ch1,ch2,rForQW,10,qinv12MC));// was 4,5
1900 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
1902 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].fPIDpurityDen->Fill(transK12, qinv12);
1905 if((abs(mcParticle1->GetPdgCode()) + abs(mcParticle2->GetPdgCode()))==22) SCNumber=1;// e-e
1906 else if((abs(mcParticle1->GetPdgCode()) + abs(mcParticle2->GetPdgCode()))==24) SCNumber=2;// e-mu
1907 else if((abs(mcParticle1->GetPdgCode()) + abs(mcParticle2->GetPdgCode()))==222) SCNumber=3;// e-pi
1908 else if((abs(mcParticle1->GetPdgCode()) + abs(mcParticle2->GetPdgCode()))==332) SCNumber=4;// e-k
1909 else if((abs(mcParticle1->GetPdgCode()) + abs(mcParticle2->GetPdgCode()))==2223) SCNumber=5;// e-p
1910 else if((abs(mcParticle1->GetPdgCode()) + abs(mcParticle2->GetPdgCode()))==26) SCNumber=6;// mu-mu
1911 else if((abs(mcParticle1->GetPdgCode()) + abs(mcParticle2->GetPdgCode()))==224) SCNumber=7;// mu-pi
1912 else if((abs(mcParticle1->GetPdgCode()) + abs(mcParticle2->GetPdgCode()))==334) SCNumber=8;// mu-k
1913 else if((abs(mcParticle1->GetPdgCode()) + abs(mcParticle2->GetPdgCode()))==2225) SCNumber=9;// mu-p
1914 else if((abs(mcParticle1->GetPdgCode()) + abs(mcParticle2->GetPdgCode()))==422) SCNumber=10;// pi-pi
1915 else if((abs(mcParticle1->GetPdgCode()) + abs(mcParticle2->GetPdgCode()))==532) SCNumber=11;// pi-k
1916 else if((abs(mcParticle1->GetPdgCode()) + abs(mcParticle2->GetPdgCode()))==2423) SCNumber=12;// pi-p
1917 else if((abs(mcParticle1->GetPdgCode()) + abs(mcParticle2->GetPdgCode()))==642) SCNumber=13;// k-k
1918 else if((abs(mcParticle1->GetPdgCode()) + abs(mcParticle2->GetPdgCode()))==2533) SCNumber=14;// k-p
1919 else if((abs(mcParticle1->GetPdgCode()) + abs(mcParticle2->GetPdgCode()))==4424) SCNumber=15;// p-p
1922 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].fPIDpurityNum->Fill(SCNumber, transK12, qinv12);
1924 ///////////////////////
1925 // muon contamination
1926 if(qinv12 < fQcut[0] && ((fEvt)->fTracks[i].fLabel != (fEvt+en2)->fTracks[j].fLabel)){
1927 if(abs(mcParticle1->GetPdgCode())==13 || abs(mcParticle2->GetPdgCode())==13){// muon check
1928 Float_t Pparent1[4]={pVect1MC[0],pVect1MC[1],pVect1MC[2],pVect1MC[3]};
1929 Float_t Pparent2[4]={pVect2MC[0],pVect2MC[1],pVect2MC[2],pVect2MC[3]};
1930 Bool_t pionParent1=kFALSE, pionParent2=kFALSE;
1931 if(abs(mcParticle1->GetPdgCode())==13) {
1932 AliAODMCParticle *parent1=(AliAODMCParticle*)mcArray->At(mcParticle1->GetMother());
1933 if(abs(parent1->GetPdgCode())==211) {
1935 Pparent1[1] = parent1->Px(); Pparent1[2] = parent1->Py(); Pparent1[3] = parent1->Pz();
1936 Pparent1[0] = sqrt(pow(Pparent1[1],2)+pow(Pparent1[2],2)+pow(Pparent1[3],2)+pow(fTrueMassPi,2));
1940 if(abs(mcParticle2->GetPdgCode())==13) {
1941 AliAODMCParticle *parent2=(AliAODMCParticle*)mcArray->At(mcParticle2->GetMother());
1942 if(abs(parent2->GetPdgCode())==211) {
1944 Pparent2[1] = parent2->Px(); Pparent2[2] = parent2->Py(); Pparent2[3] = parent2->Pz();
1945 Pparent2[0] = sqrt(pow(Pparent2[1],2)+pow(Pparent2[2],2)+pow(Pparent2[3],2)+pow(fTrueMassPi,2));
1948 Float_t parentQinv12 = GetQinv(0, Pparent1, Pparent2);
1949 Float_t WInput = 1.0;
1950 if(parentQinv12 > 0.001 && parentQinv12 < 0.2) WInput = MCWeight(ch1,ch2, 10, 10, parentQinv12);
1952 if(ch1 != ch2) ChComb=1;
1953 if(pionParent1 || pionParent2){
1954 ((TH3D*)fOutputList->FindObject("fMuonContamSmearedNum2"))->Fill(ChComb, transK12, qinv12MC, WInput);
1955 ((TH3D*)fOutputList->FindObject("fMuonContamSmearedDen2"))->Fill(ChComb, transK12, qinv12MC);
1956 ((TH3D*)fOutputList->FindObject("fMuonContamIdealNum2"))->Fill(ChComb, transK12, parentQinv12, WInput);
1957 ((TH3D*)fOutputList->FindObject("fMuonContamIdealDen2"))->Fill(ChComb, transK12, parentQinv12);
1958 ((TH3D*)fOutputList->FindObject("fMuonPionDeltaQinv"))->Fill(ChComb, transK12, qinv12MC-parentQinv12);
1960 ////////////////////////////////////
1963 for (Int_t k=j+1; k<(fEvt+en3)->fNtracks; k++) {
1964 pVect3[0]=(fEvt+en3)->fTracks[k].fEaccepted;
1965 pVect3[1]=(fEvt+en3)->fTracks[k].fP[0];
1966 pVect3[2]=(fEvt+en3)->fTracks[k].fP[1];
1967 pVect3[3]=(fEvt+en3)->fTracks[k].fP[2];
1969 qinv13 = GetQinv(0, pVect1, pVect3);
1970 qinv23 = GetQinv(0, pVect2, pVect3);
1971 if(qinv13 > fQcut[0] || qinv23 > fQcut[0]) continue;
1973 if(qinv13 < fQLowerCut || qinv23 < fQLowerCut) continue;// remove unwanted low-q pairs (also a type of track splitting/merging cut)
1974 if(ch1 == ch3 && !fGeneratorOnly){
1975 if(!AcceptPair(&((fEvt)->fTracks[i]), &((fEvt+en3)->fTracks[k]))) {
1979 if(ch2 == ch3 && !fGeneratorOnly){
1980 if(!AcceptPair(&((fEvt+en2)->fTracks[j]), &((fEvt+en3)->fTracks[k]))) {
1985 if((fEvt+en3)->fTracks[k].fLabel < (fEvt+en3)->fMCarraySize){
1986 AliAODMCParticle *mcParticle3 = (AliAODMCParticle*)mcArray->At(abs((fEvt+en3)->fTracks[k].fLabel));
1988 ch3 = Int_t(((fEvt+en3)->fTracks[k].fCharge + 1)/2.);
1989 pVect3MC[0]=sqrt(pow((fEvt+en3)->fMCtracks[abs((fEvt+en3)->fTracks[k].fLabel)].fPtot,2)+pow(fTrueMassPi,2));
1990 pVect3MC[1]=(fEvt+en3)->fMCtracks[abs((fEvt+en3)->fTracks[k].fLabel)].fPx;
1991 pVect3MC[2]=(fEvt+en3)->fMCtracks[abs((fEvt+en3)->fTracks[k].fLabel)].fPy;
1992 pVect3MC[3]=(fEvt+en3)->fMCtracks[abs((fEvt+en3)->fTracks[k].fLabel)].fPz;
1993 qinv13MC = GetQinv(0, pVect1MC, pVect3MC);
1994 qinv23MC = GetQinv(0, pVect2MC, pVect3MC);
1996 q3MC = sqrt(pow(qinv12MC,2)+pow(qinv13MC,2)+pow(qinv23MC,2));
1997 transK3 = sqrt( pow(pVect1[1]+pVect2[1]+pVect3[1],2) + pow(pVect1[2]+pVect2[2]+pVect3[2],2))/3.;
1999 if(transK3>0.3) K3index=1;
2001 Float_t Pparent3[4]={pVect3MC[0],pVect3MC[1],pVect3MC[2],pVect3MC[3]};
2002 Bool_t pionParent3=kFALSE;
2003 if(abs(mcParticle3->GetPdgCode())==13){// muon check
2004 AliAODMCParticle *parent=(AliAODMCParticle*)mcArray->At(mcParticle3->GetMother());
2005 if(abs(parent->GetPdgCode())==211) {
2007 Pparent3[1] = parent->Px(); Pparent3[2] = parent->Py(); Pparent3[3] = parent->Pz();
2008 Pparent3[0] = sqrt(pow(Pparent3[1],2)+pow(Pparent3[2],2)+pow(Pparent3[3],2)+pow(fTrueMassPi,2));
2011 Float_t parentQinv13 = GetQinv(0, Pparent1, Pparent3);
2012 Float_t parentQinv23 = GetQinv(0, Pparent2, Pparent3);
2013 if(parentQinv12 < 0.001 || parentQinv12 > 0.2) continue;
2014 if(parentQinv13 < 0.001 || parentQinv13 > 0.2) continue;
2015 if(parentQinv23 < 0.001 || parentQinv23 > 0.2) continue;
2016 if(!pionParent1 && !pionParent2 && !pionParent3) continue;// want at least one pion-->muon
2017 Float_t parentQ3 = sqrt(pow(parentQinv12,2) + pow(parentQinv13,2) + pow(parentQinv23,2));
2018 Int_t ChCombtriplet=0;
2019 if(ch1!=ch2 || ch1!=ch3 || ch2!=ch3) ChCombtriplet=1;
2020 Float_t WInput3=1.0;
2021 if(ChCombtriplet==0) WInput3 = MCWeight3D(kTRUE, 1, 10, parentQinv12, parentQinv13, parentQinv23);
2023 if(ch1==ch2) WInput3 = MCWeight3D(kFALSE, 1, 10, parentQinv12, parentQinv13, parentQinv23);
2024 else if(ch1==ch3) WInput3 = MCWeight3D(kFALSE, 1, 10, parentQinv13, parentQinv12, parentQinv23);
2025 else WInput3 = MCWeight3D(kFALSE, 1, 10, parentQinv23, parentQinv12, parentQinv13);
2027 ((TH3D*)fOutputList->FindObject("fMuonContamSmearedNum3"))->Fill(ChCombtriplet, K3index, q3MC, WInput3);
2028 ((TH3D*)fOutputList->FindObject("fMuonContamSmearedDen3"))->Fill(ChCombtriplet, K3index, q3MC);
2029 ((TH3D*)fOutputList->FindObject("fMuonContamIdealNum3"))->Fill(ChCombtriplet, K3index, parentQ3, WInput3);
2030 ((TH3D*)fOutputList->FindObject("fMuonContamIdealDen3"))->Fill(ChCombtriplet, K3index, parentQ3);
2034 }// muon code check of 1 and 2
2039 //////////////////////////////////////////
2041 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].fExplicit2->Fill(transK12, qinv12);
2042 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].fExplicit2QW->Fill(transK12, qinv12, qinv12);
2043 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].fAvgP->Fill(transK12, qinv12, (fEvt)->fTracks[i].fMom);
2044 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].fAvgP->Fill(transK12, qinv12, (fEvt+en2)->fTracks[j].fMom);
2046 if(qinv12<fQupperBound) Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].fMeanKt->Fill(transK12);
2048 //////////////////////////////////////////
2052 // exit out of loop if there are too many pairs
2053 if(pairCountSE >= kPairLimit) {exitCode=kTRUE; continue;}// Too many SE pairs
2054 if(exitCode) continue;
2056 //////////////////////////
2058 if(qinv12 <= fQcut[qCutBin]) {
2060 ///////////////////////////
2062 (fEvt)->fPairsSE[pairCountSE].fP1[0] = (fEvt)->fTracks[i].fP[0];
2063 (fEvt)->fPairsSE[pairCountSE].fP1[1] = (fEvt)->fTracks[i].fP[1];
2064 (fEvt)->fPairsSE[pairCountSE].fP1[2] = (fEvt)->fTracks[i].fP[2];
2065 (fEvt)->fPairsSE[pairCountSE].fE1 = (fEvt)->fTracks[i].fEaccepted;
2066 (fEvt)->fPairsSE[pairCountSE].fCharge1 = (fEvt)->fTracks[i].fCharge;
2067 (fEvt)->fPairsSE[pairCountSE].fIndex1 = i;
2068 (fEvt)->fPairsSE[pairCountSE].fKey1 = key1;
2069 (fEvt)->fPairsSE[pairCountSE].fLabel1 = (fEvt)->fTracks[i].fLabel;
2070 if(fMCcase && ((fEvt)->fTracks[i].fLabel < (fEvt)->fMCarraySize)){
2071 (fEvt)->fPairsSE[pairCountSE].fP1MC[0] = (fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPx;
2072 (fEvt)->fPairsSE[pairCountSE].fP1MC[1] = (fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPy;
2073 (fEvt)->fPairsSE[pairCountSE].fP1MC[2] = (fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPz;
2076 (fEvt)->fPairsSE[pairCountSE].fP2[0] = (fEvt+en2)->fTracks[j].fP[0];
2077 (fEvt)->fPairsSE[pairCountSE].fP2[1] = (fEvt+en2)->fTracks[j].fP[1];
2078 (fEvt)->fPairsSE[pairCountSE].fP2[2] = (fEvt+en2)->fTracks[j].fP[2];
2079 (fEvt)->fPairsSE[pairCountSE].fE2 = (fEvt+en2)->fTracks[j].fEaccepted;
2080 (fEvt)->fPairsSE[pairCountSE].fCharge2 = (fEvt+en2)->fTracks[j].fCharge;
2081 (fEvt)->fPairsSE[pairCountSE].fIndex2 = j;
2082 (fEvt)->fPairsSE[pairCountSE].fKey2 = key2;
2083 (fEvt)->fPairsSE[pairCountSE].fLabel2 = (fEvt+en2)->fTracks[j].fLabel;
2084 if(fMCcase && ((fEvt+en2)->fTracks[j].fLabel < (fEvt+en2)->fMCarraySize)){
2085 (fEvt)->fPairsSE[pairCountSE].fP2MC[0] = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPx;
2086 (fEvt)->fPairsSE[pairCountSE].fP2MC[1] = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPy;
2087 (fEvt)->fPairsSE[pairCountSE].fP2MC[2] = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPz;
2090 (fEvt)->fPairsSE[pairCountSE].fQinv = qinv12;
2092 fPairLocationSE[i]->AddAt(pairCountSE,j);
2099 /////////////////////////////////////////////////////////
2100 // Normalization Region
2102 if((qinv12 >= fNormQcutLow[normBin]) && (qinv12 < fNormQcutHigh[normBin])){
2104 fNormPairs[en2][normPairCount[en2]].fCharge1 = (fEvt)->fTracks[i].fCharge;
2105 fNormPairs[en2][normPairCount[en2]].fIndex1 = i;
2106 fNormPairs[en2][normPairCount[en2]].fKey1 = (fEvt)->fTracks[i].fKey;
2108 fNormPairs[en2][normPairCount[en2]].fCharge2 = (fEvt+en2)->fTracks[j].fCharge;
2109 fNormPairs[en2][normPairCount[en2]].fIndex2 = j;
2110 fNormPairs[en2][normPairCount[en2]].fKey2 = (fEvt+en2)->fTracks[j].fKey;
2113 //other past pairs with particle j
2114 for(Int_t pastpair=0; pastpair<numOtherPairs2[0][j]; pastpair++){
2115 Int_t locationOtherPair = fOtherPairLocation2[0][j]->At(pastpair);
2116 if(locationOtherPair < 0) continue;// no pair there
2117 Int_t indexOther1 = i;
2118 Int_t indexOther2 = fNormPairs[0][ locationOtherPair ].fIndex1;
2120 // Both possible orderings of other indexes
2121 if( (fNormPairSwitch[0][indexOther1]->At(indexOther2)=='1') || (fNormPairSwitch[0][indexOther2]->At(indexOther1)=='1')) {
2123 // 1 and 2 are from SE
2124 ch3 = Int_t((fNormPairs[0][ locationOtherPair ].fCharge1 + 1)/2.);
2125 key3 = fNormPairs[0][ locationOtherPair ].fKey1;
2126 Short_t fillIndex3 = FillIndex3part(key1+key2+key3);
2127 SetFillBins3(fillIndex3, key1, key2, key3, ch1, ch2, ch3, 0, bin1, bin2, bin3, fDummyB, fDummyB, fDummyB);
2129 tempNormFillCount[bin1][bin2][bin3][fillIndex3][0]++;
2132 }// pastpair P11 loop
2135 fNormPairSwitch[en2][i]->AddAt('1',j);
2136 fOtherPairLocation1[en2][i]->AddAt(normPairCount[en2], numOtherPairs1[en2][i]);// location of otherpair with i as 1st particle
2137 fOtherPairLocation2[en2][j]->AddAt(normPairCount[en2], numOtherPairs2[en2][j]);// location of otherpair with j as 2nd particle
2139 numOtherPairs1[en2][i]++;
2140 numOtherPairs2[en2][j]++;
2143 normPairCount[en2]++;
2144 if(normPairCount[en2] >= kNormPairLimit) exitCode=kTRUE;
2153 //////////////////////////////////////////////
2156 for (Int_t i=0; i<myTracks; i++) {
2161 for (Int_t j=0; j<(fEvt+en2)->fNtracks; j++) {
2163 key1 = (fEvt)->fTracks[i].fKey;
2164 key2 = (fEvt+en2)->fTracks[j].fKey;
2165 Short_t fillIndex2 = FillIndex2part(key1+key2);
2166 Short_t qCutBin = SetQcutBin(fillIndex2);
2167 Short_t normBin = SetNormBin(fillIndex2);
2168 pVect1[0]=(fEvt)->fTracks[i].fEaccepted; pVect2[0]=(fEvt+en2)->fTracks[j].fEaccepted;
2169 pVect1[1]=(fEvt)->fTracks[i].fP[0]; pVect2[1]=(fEvt+en2)->fTracks[j].fP[0];
2170 pVect1[2]=(fEvt)->fTracks[i].fP[1]; pVect2[2]=(fEvt+en2)->fTracks[j].fP[1];
2171 pVect1[3]=(fEvt)->fTracks[i].fP[2]; pVect2[3]=(fEvt+en2)->fTracks[j].fP[2];
2173 qinv12 = GetQinv(fillIndex2, pVect1, pVect2);
2174 GetQosl(pVect1, pVect2, qout, qside, qlong);
2175 transK12 = sqrt(pow(pVect1[1]+pVect2[1],2) + pow(pVect1[2]+pVect2[2],2))/2.;
2176 //if(transK12 <= 0.35) fEDbin=0;
2180 ///////////////////////////////
2181 ch1 = Int_t(((fEvt)->fTracks[i].fCharge + 1)/2.);
2182 ch2 = Int_t(((fEvt+en2)->fTracks[j].fCharge + 1)/2.);
2183 SetFillBins2(fillIndex2, key1, key2, ch1, ch2, bin1, bin2);
2186 if((fEvt)->fTracks[i].fLabel < (fEvt)->fMCarraySize && (fEvt+en2)->fTracks[j].fLabel < (fEvt+en2)->fMCarraySize){
2187 pVect1MC[0]=sqrt(pow((fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPtot,2)+pow(fTrueMassPi,2));
2188 pVect2MC[0]=sqrt(pow((fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPtot,2)+pow(fTrueMassPi,2));
2189 pVect1MC[1]=(fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPx; pVect2MC[1]=(fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPx;
2190 pVect1MC[2]=(fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPy; pVect2MC[2]=(fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPy;
2191 pVect1MC[3]=(fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPz; pVect2MC[3]=(fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPz;
2192 qinv12MC = GetQinv(fillIndex2, pVect1MC, pVect2MC);
2195 for(Int_t rIter=0; rIter<fRVALUES; rIter++){
2196 for(Int_t myDampIt=0; myDampIt<kNDampValues; myDampIt++){
2197 Int_t denIndex = rIter*kNDampValues + myDampIt;
2198 Float_t WInput = MCWeight(ch1,ch2, rIter+kRmin, myDampIt, qinv12MC);
2199 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[0].fIdeal->Fill(denIndex, qinv12MC, WInput);
2200 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[1].fIdeal->Fill(denIndex, qinv12MC);
2201 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[0].fSmeared->Fill(denIndex, qinv12, WInput);
2202 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[1].fSmeared->Fill(denIndex, qinv12);
2206 /////////////////////////////////////////////////////
2207 if(qinv12 <= fQcut[qCutBin]) {// 3-particle MRC
2210 Short_t fillIndex3 = 0;
2211 key1=1; key2=1; key3=1;
2214 for (Int_t k=0; k<(fEvt+en3)->fNtracks; k++) {
2215 if((fEvt+en3)->fTracks[k].fLabel < (fEvt+en3)->fMCarraySize){
2216 ch3 = Int_t(((fEvt+en3)->fTracks[k].fCharge + 1)/2.);
2217 pVect3[0]=(fEvt+en3)->fTracks[k].fEaccepted;
2218 pVect3[1]=(fEvt+en3)->fTracks[k].fP[0];
2219 pVect3[2]=(fEvt+en3)->fTracks[k].fP[1];
2220 pVect3[3]=(fEvt+en3)->fTracks[k].fP[2];
2221 qinv13 = GetQinv(0, pVect1, pVect3);
2222 qinv23 = GetQinv(0, pVect2, pVect3);
2223 q3 = sqrt(pow(qinv12,2)+pow(qinv13,2)+pow(qinv23,2));
2225 if(qinv13 > fQcut[qCutBin] || qinv23 > fQcut[qCutBin]) continue;
2228 pVect3MC[0]=sqrt(pow((fEvt+en3)->fMCtracks[abs((fEvt+en3)->fTracks[k].fLabel)].fPtot,2)+pow(fTrueMassPi,2));
2229 pVect3MC[1]=(fEvt+en3)->fMCtracks[abs((fEvt+en3)->fTracks[k].fLabel)].fPx;
2230 pVect3MC[2]=(fEvt+en3)->fMCtracks[abs((fEvt+en3)->fTracks[k].fLabel)].fPy;
2231 pVect3MC[3]=(fEvt+en3)->fMCtracks[abs((fEvt+en3)->fTracks[k].fLabel)].fPz;
2232 qinv13MC = GetQinv(0, pVect1MC, pVect3MC);
2233 qinv23MC = GetQinv(0, pVect2MC, pVect3MC);
2236 q3MC = sqrt(pow(qinv12MC,2)+pow(qinv13MC,2)+pow(qinv23MC,2));
2237 transK3 = sqrt( pow(pVect1[1]+pVect2[1]+pVect3[1],2) + pow(pVect1[2]+pVect2[2]+pVect3[2],2))/3.;
2239 if(qinv12 < fQLowerCut) continue;
2240 if(qinv13 < fQLowerCut) continue;
2241 if(qinv23 < fQLowerCut) continue;
2243 if(!AcceptPair(&((fEvt)->fTracks[i]), &((fEvt+en2)->fTracks[j]))) continue;
2246 if(!AcceptPair(&((fEvt)->fTracks[i]), &((fEvt+en3)->fTracks[k]))) continue;
2249 if(!AcceptPair(&((fEvt+en2)->fTracks[j]), &((fEvt+en3)->fTracks[k]))) continue;
2253 // 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.
2254 Bool_t fill2=kFALSE, fill3=kFALSE, fill4=kFALSE;
2255 SetFillBins3(fillIndex3, key1, key2, key3, ch1, ch2, ch3, 1, bin1, bin2, bin3, fill2, fill3, fill4);
2258 for(Int_t jj=1; jj<=5; jj++){// term loop
2260 if(jj==2) {if(!fill2) continue;}//12
2261 if(jj==3) {if(!fill3) continue;}//13
2262 if(jj==4) {if(!fill4) continue;}//23
2265 ArrangeQs(fillIndex3, key1, key2, key3, ch1, ch2, ch3, qinv12, qinv13, qinv23, 1, jj, firstQ, secondQ, thirdQ);
2266 ArrangeQs(fillIndex3, key1, key2, key3, ch1, ch2, ch3, qinv12MC, qinv13MC, qinv23MC, 1, jj, firstQMC, secondQMC, thirdQMC);
2268 if(ch1==ch2 && ch1==ch3){// same charge
2269 WInput = MCWeight3D(kTRUE, jj, 10, firstQMC, secondQMC, thirdQMC);
2271 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm1SC"))->Fill(q3MC, WInput);
2272 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm1SCden"))->Fill(q3MC);
2274 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm2SC"))->Fill(q3MC, WInput);
2275 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm2SCden"))->Fill(q3MC);
2277 }else {// mixed charge
2279 WInput = MCWeight3D(kFALSE, jj, 10, firstQMC, secondQMC, thirdQMC);
2281 if(jj==1 || jj==5) WInput = MCWeight3D(kFALSE, jj, 10, thirdQMC, secondQMC, firstQMC);// thirdQMC is ss
2282 else WInput = MCWeight3D(kFALSE, 6-jj, 10, thirdQMC, secondQMC, firstQMC);
2285 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm1MC"))->Fill(q3MC, WInput);
2286 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm1MCden"))->Fill(q3MC);
2290 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm2MC"))->Fill(q3MC, WInput);
2291 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm2MCden"))->Fill(q3MC);
2293 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm3MC"))->Fill(q3MC, WInput);
2294 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm3MCden"))->Fill(q3MC);
2296 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm4MC"))->Fill(q3MC, WInput);
2297 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm4MCden"))->Fill(q3MC);
2301 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm4MC"))->Fill(q3MC, WInput);
2302 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm4MCden"))->Fill(q3MC);
2304 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm3MC"))->Fill(q3MC, WInput);
2305 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm3MCden"))->Fill(q3MC);
2307 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm2MC"))->Fill(q3MC, WInput);
2308 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm2MCden"))->Fill(q3MC);
2316 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[jj-1].fIdeal->Fill(q3MC, WInput);
2317 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[jj-1].fSmeared->Fill(q3, WInput);
2321 }// MCarray check, 3rd particle
2324 }// TabulatePairs Check
2326 }// MCarray check, 1st and 2nd particle
2328 // reset key's and fill bins (they were altered for 3 particle MRC calculation)
2329 key1 = (fEvt)->fTracks[i].fKey;
2330 key2 = (fEvt+en2)->fTracks[j].fKey;
2331 SetFillBins2(fillIndex2, key1, key2, ch1, ch2, bin1, bin2);
2334 if(ch1==ch2 && fMbin==0 && qinv12<0.2){
2335 //////////////////////////
2336 // pad-row method testing
2337 Float_t coeff = (5)*0.2*(0.18/1.2);// 5 to evaluate at 1.0m in TPC
2338 Float_t phi1 = (fEvt)->fTracks[i].fPhi - asin((fEvt)->fTracks[i].fCharge*(0.1*fBfield)*coeff/(fEvt)->fTracks[i].fPt);
2339 if(phi1 > 2*PI) phi1 -= 2*PI;
2340 if(phi1 < 0) phi1 += 2*PI;
2341 Float_t phi2 = (fEvt+en2)->fTracks[j].fPhi - asin((fEvt+en2)->fTracks[j].fCharge*(0.1*fBfield)*coeff/(fEvt+en2)->fTracks[j].fPt);
2342 if(phi2 > 2*PI) phi2 -= 2*PI;
2343 if(phi2 < 0) phi2 += 2*PI;
2344 Float_t deltaphi = phi1 - phi2;
2345 if(deltaphi > PI) deltaphi -= PI;
2346 if(deltaphi < -PI) deltaphi += PI;
2348 Int_t ncl1 = (fEvt)->fTracks[i].fClusterMap.GetNbits();
2349 Int_t ncl2 = (fEvt+en2)->fTracks[j].fClusterMap.GetNbits();
2350 Float_t sumCls = 0; Float_t sumSha = 0; Float_t sumQ = 0;
2351 Double_t shfrac = 0; //Double_t qfactor = 0;
2352 for(Int_t imap = 0; imap < ncl1 && imap < ncl2; imap++) {
2353 if ((fEvt)->fTracks[i].fClusterMap.TestBitNumber(imap) && (fEvt+en2)->fTracks[j].fClusterMap.TestBitNumber(imap)) {// Both clusters
2354 if ((fEvt)->fTracks[i].fSharedMap.TestBitNumber(imap) && (fEvt+en2)->fTracks[j].fSharedMap.TestBitNumber(imap)) { // Shared
2358 else {sumQ--; sumCls+=2;}
2360 else if ((fEvt)->fTracks[i].fClusterMap.TestBitNumber(imap) || (fEvt+en2)->fTracks[j].fClusterMap.TestBitNumber(imap)) {// Non shared
2365 //qfactor = sumQ*1.0/sumCls;
2366 shfrac = sumSha*1.0/sumCls;
2368 if(fabs(deltaphi)<0.07 && fabs((fEvt)->fTracks[i].fEta-(fEvt+en2)->fTracks[j].fEta) < 0.03){
2369 ((TH3D*)fOutputList->FindObject("fPairsPadRowDen"))->Fill(transK12, shfrac, qinv12);
2372 for(Int_t rstep=0; rstep<10; rstep++){
2373 coeff = (rstep)*0.2*(0.18/1.2);
2374 // propagate through B field to r=1.2m
2375 phi1 = (fEvt)->fTracks[i].fPhi - asin((fEvt)->fTracks[i].fCharge*(0.1*fBfield)*coeff/(fEvt)->fTracks[i].fPt);
2376 if(phi1 > 2*PI) phi1 -= 2*PI;
2377 if(phi1 < 0) phi1 += 2*PI;
2378 phi2 = (fEvt+en2)->fTracks[j].fPhi - asin((fEvt+en2)->fTracks[j].fCharge*(0.1*fBfield)*coeff/(fEvt+en2)->fTracks[j].fPt);
2379 if(phi2 > 2*PI) phi2 -= 2*PI;
2380 if(phi2 < 0) phi2 += 2*PI;
2381 deltaphi = phi1 - phi2;
2382 if(deltaphi > PI) deltaphi -= PI;
2383 if(deltaphi < -PI) deltaphi += PI;
2385 if(fabs((fEvt)->fTracks[i].fEta-(fEvt+en2)->fTracks[j].fEta) < 0.03){
2386 ((TH3F*)fOutputList->FindObject("fPairsShareFracDPhiDen"))->Fill(rstep, shfrac, deltaphi);
2388 //if(shfrac < 0.05){
2389 ((TH3F*)fOutputList->FindObject("fPairsDetaDPhiDen"))->Fill(rstep, (fEvt)->fTracks[i].fEta-(fEvt+en2)->fTracks[j].fEta, deltaphi);
2396 }// desired pair selection
2404 if(qinv12 < fQLowerCut) continue;// remove unwanted low-q pairs (also a type of track splitting cut)
2405 if(ch1 == ch2 && !fGeneratorOnly){
2406 if(!AcceptPair(&((fEvt)->fTracks[i]), &((fEvt+en2)->fTracks[j]))) {
2407 fPairSplitCut[1][i]->AddAt('1',j);
2412 //////////////////////////////////////////
2414 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].fExplicit2->Fill(transK12, qinv12);
2415 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].fExplicit2QW->Fill(transK12, qinv12, qinv12);
2416 if(qinv12<fQupperBound) Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].fMeanKt->Fill(transK12);
2418 //////////////////////////////////////////
2422 if(pairCountME >= 2*kPairLimit) {exitCode=kTRUE; continue;}// Too many SE pairs
2423 if(exitCode) continue;
2425 if(qinv12 <= fQcut[qCutBin]) {
2426 ///////////////////////////
2429 (fEvt)->fPairsME[pairCountME].fP1[0] = (fEvt)->fTracks[i].fP[0];
2430 (fEvt)->fPairsME[pairCountME].fP1[1] = (fEvt)->fTracks[i].fP[1];
2431 (fEvt)->fPairsME[pairCountME].fP1[2] = (fEvt)->fTracks[i].fP[2];
2432 (fEvt)->fPairsME[pairCountME].fE1 = (fEvt)->fTracks[i].fEaccepted;
2433 (fEvt)->fPairsME[pairCountME].fCharge1 = (fEvt)->fTracks[i].fCharge;
2434 (fEvt)->fPairsME[pairCountME].fIndex1 = i;
2435 (fEvt)->fPairsME[pairCountME].fKey1 = key1;
2436 (fEvt)->fPairsME[pairCountME].fLabel1 = (fEvt)->fTracks[i].fLabel;
2437 if(fMCcase && ((fEvt)->fTracks[i].fLabel < (fEvt)->fMCarraySize)){
2438 (fEvt)->fPairsME[pairCountME].fP1MC[0] = (fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPx;
2439 (fEvt)->fPairsME[pairCountME].fP1MC[1] = (fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPy;
2440 (fEvt)->fPairsME[pairCountME].fP1MC[2] = (fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPz;
2443 (fEvt)->fPairsME[pairCountME].fP2[0] = (fEvt+en2)->fTracks[j].fP[0];
2444 (fEvt)->fPairsME[pairCountME].fP2[1] = (fEvt+en2)->fTracks[j].fP[1];
2445 (fEvt)->fPairsME[pairCountME].fP2[2] = (fEvt+en2)->fTracks[j].fP[2];
2446 (fEvt)->fPairsME[pairCountME].fE2 = (fEvt+en2)->fTracks[j].fEaccepted;
2447 (fEvt)->fPairsME[pairCountME].fCharge2 = (fEvt+en2)->fTracks[j].fCharge;
2448 (fEvt)->fPairsME[pairCountME].fIndex2 = j;
2449 (fEvt)->fPairsME[pairCountME].fKey2 = key2;
2450 (fEvt)->fPairsME[pairCountME].fLabel2 = (fEvt+en2)->fTracks[j].fLabel;
2451 if(fMCcase && ((fEvt+en2)->fTracks[j].fLabel < (fEvt+en2)->fMCarraySize)){
2452 (fEvt)->fPairsME[pairCountME].fP2MC[0] = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPx;
2453 (fEvt)->fPairsME[pairCountME].fP2MC[1] = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPy;
2454 (fEvt)->fPairsME[pairCountME].fP2MC[2] = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPz;
2457 (fEvt)->fPairsME[pairCountME].fQinv = qinv12;
2459 fPairLocationME[i]->AddAt(Int_t(pairCountME),j);
2465 if((qinv12 >= fNormQcutLow[normBin]) && (qinv12 < fNormQcutHigh[normBin])){
2467 fNormPairs[en2][normPairCount[en2]].fCharge1 = (fEvt)->fTracks[i].fCharge;
2468 fNormPairs[en2][normPairCount[en2]].fIndex1 = i;
2469 fNormPairs[en2][normPairCount[en2]].fKey1 = (fEvt)->fTracks[i].fKey;
2471 fNormPairs[en2][normPairCount[en2]].fCharge2 = (fEvt+en2)->fTracks[j].fCharge;
2472 fNormPairs[en2][normPairCount[en2]].fIndex2 = j;
2473 fNormPairs[en2][normPairCount[en2]].fKey2 = (fEvt+en2)->fTracks[j].fKey;
2475 //other past pairs in P11 with particle i
2476 for(Int_t pastpairP11=0; pastpairP11<numOtherPairs2[0][i]; pastpairP11++){// past pair in P11 with i as 1st and 2nd particle
2477 Int_t locationOtherPairP11 = fOtherPairLocation2[0][i]->At(pastpairP11);// i is 2nd particle
2478 if(locationOtherPairP11 < 0) continue;// no pair there
2479 Int_t indexOther1P11 = fNormPairs[0][ locationOtherPairP11 ].fIndex1;
2481 //Check other past pairs in P12
2482 if( (fNormPairSwitch[1][indexOther1P11]->At(j)=='0')) continue;
2484 // 1 and 3 are from SE
2485 ch3 = Int_t((fNormPairs[0][ locationOtherPairP11 ].fCharge1 + 1)/2.);// charge of second particle in P11
2486 key3 = fNormPairs[0][ locationOtherPairP11 ].fKey1;
2487 Short_t fillIndex3 = FillIndex3part(key1+key2+key3);
2488 Bool_t fill2=kFALSE, fill3=kFALSE, fill4=kFALSE;
2489 SetFillBins3(fillIndex3, key1, key2, key3, ch1, ch2, ch3, 2, bin1, bin2, bin3, fill2, fill3, fill4);
2492 if(fill2) tempNormFillCount[bin1][bin2][bin3][fillIndex3][1]++;
2493 if(fill3) tempNormFillCount[bin1][bin2][bin3][fillIndex3][2]++;
2494 if(fill4) tempNormFillCount[bin1][bin2][bin3][fillIndex3][3]++;
2500 fNormPairSwitch[en2][i]->AddAt('1',j);
2501 fOtherPairLocation1[en2][i]->AddAt(normPairCount[en2], numOtherPairs1[en2][i]);// location of otherpair with i as 1st particle
2502 fOtherPairLocation2[en2][j]->AddAt(normPairCount[en2], numOtherPairs2[en2][j]);// location of otherpair with j as 2nd particle
2504 numOtherPairs1[en2][i]++;
2505 numOtherPairs2[en2][j]++;
2507 normPairCount[en2]++;
2508 if(normPairCount[en2] >= kNormPairLimit) exitCode=kTRUE;
2517 ///////////////////////////////////////
2518 // P13 pairing (just for Norm counting of term5)
2519 for (Int_t i=0; i<myTracks; i++) {
2521 // exit out of loop if there are too many pairs
2522 // dont bother with this loop if exitCode is set.
2528 for (Int_t j=0; j<(fEvt+en2)->fNtracks; j++) {
2530 key1 = (fEvt)->fTracks[i].fKey;
2531 key2 = (fEvt+en2)->fTracks[j].fKey;
2532 Short_t fillIndex2 = FillIndex2part(key1+key2);
2533 Short_t normBin = SetNormBin(fillIndex2);
2534 pVect1[0]=(fEvt)->fTracks[i].fEaccepted; pVect2[0]=(fEvt+en2)->fTracks[j].fEaccepted;
2535 pVect1[1]=(fEvt)->fTracks[i].fP[0]; pVect2[1]=(fEvt+en2)->fTracks[j].fP[0];
2536 pVect1[2]=(fEvt)->fTracks[i].fP[1]; pVect2[2]=(fEvt+en2)->fTracks[j].fP[1];
2537 pVect1[3]=(fEvt)->fTracks[i].fP[2]; pVect2[3]=(fEvt+en2)->fTracks[j].fP[2];
2539 qinv12 = GetQinv(fillIndex2, pVect1, pVect2);
2541 if(qinv12 < fQLowerCut) continue;// remove unwanted low-q pairs (also a type of track splitting cut)
2543 ch1 = Int_t(((fEvt)->fTracks[i].fCharge + 1)/2.);
2544 ch2 = Int_t(((fEvt+en2)->fTracks[j].fCharge + 1)/2.);
2546 if(ch1 == ch2 && !fGeneratorOnly){
2547 if(!AcceptPair(&((fEvt)->fTracks[i]), &((fEvt+en2)->fTracks[j]))) {
2548 fPairSplitCut[2][i]->AddAt('1',j);
2553 /////////////////////////////////////////////////////////
2554 // Normalization Region
2556 if((qinv12 >= fNormQcutLow[normBin]) && (qinv12 < fNormQcutHigh[normBin])){
2558 fNormPairSwitch[en2][i]->AddAt('1',j);
2566 ///////////////////////////////////////
2567 // P23 pairing (just for Norm counting of term5)
2569 for (Int_t i=0; i<(fEvt+en1)->fNtracks; i++) {
2571 // exit out of loop if there are too many pairs
2572 // dont bother with this loop if exitCode is set.
2578 for (Int_t j=0; j<(fEvt+en2)->fNtracks; j++) {
2582 key1 = (fEvt+en1)->fTracks[i].fKey;
2583 key2 = (fEvt+en2)->fTracks[j].fKey;
2584 Short_t fillIndex2 = FillIndex2part(key1+key2);
2585 Short_t normBin = SetNormBin(fillIndex2);
2586 pVect1[0]=(fEvt+en1)->fTracks[i].fEaccepted; pVect2[0]=(fEvt+en2)->fTracks[j].fEaccepted;
2587 pVect1[1]=(fEvt+en1)->fTracks[i].fP[0]; pVect2[1]=(fEvt+en2)->fTracks[j].fP[0];
2588 pVect1[2]=(fEvt+en1)->fTracks[i].fP[1]; pVect2[2]=(fEvt+en2)->fTracks[j].fP[1];
2589 pVect1[3]=(fEvt+en1)->fTracks[i].fP[2]; pVect2[3]=(fEvt+en2)->fTracks[j].fP[2];
2591 qinv12 = GetQinv(fillIndex2, pVect1, pVect2);
2593 if(qinv12 < fQLowerCut) continue;// remove unwanted low-q pairs (also a type of track splitting cut)
2595 ///////////////////////////////
2596 ch1 = Int_t(((fEvt+en1)->fTracks[i].fCharge + 1)/2.);
2597 ch2 = Int_t(((fEvt+en2)->fTracks[j].fCharge + 1)/2.);
2599 if(ch1 == ch2 && !fGeneratorOnly){
2600 if(!AcceptPair(&((fEvt+en1)->fTracks[i]), &((fEvt+en2)->fTracks[j]))) {
2601 fPairSplitCut[3][i]->AddAt('1',j);
2606 if((qinv12 < fNormQcutLow[normBin]) || (qinv12 >= fNormQcutHigh[normBin])) continue;
2608 Int_t index1P23 = i;
2609 Int_t index2P23 = j;
2611 for(Int_t pastpairP12=0; pastpairP12<numOtherPairs2[1][index1P23]; pastpairP12++){// loop in P12 with i as 2nd particle
2612 Int_t locationOtherPairP12 = fOtherPairLocation2[1][index1P23]->At(pastpairP12);
2613 if(locationOtherPairP12 < 0) continue; // no pair there
2614 Int_t index1P12 = fNormPairs[1][ locationOtherPairP12 ].fIndex1;
2617 //Check other past pair status in P13
2618 if( (fNormPairSwitch[2][index1P12]->At(index2P23)=='0')) continue;
2620 // all from different event
2621 ch3 = Int_t((fNormPairs[1][ locationOtherPairP12 ].fCharge1 + 1)/2.);// charge of first particle in P12
2622 key3 = fNormPairs[1][ locationOtherPairP12 ].fKey1;
2623 Short_t fillIndex3 = FillIndex3part(key1+key2+key3);
2624 SetFillBins3(fillIndex3, key1, key2, key3, ch1, ch2, ch3, 3, bin1, bin2, bin3, fDummyB, fDummyB, fDummyB);
2626 tempNormFillCount[bin1][bin2][bin3][fillIndex3][4]++;
2634 ///////////////////////////////////////////////////
2635 // Do not use pairs from events with too many pairs
2637 cout<<"SE or ME or Norm PairCount too large. Discarding all pairs and skipping event"<<endl;
2638 (fEvt)->fNpairsSE = 0;
2639 (fEvt)->fNpairsME = 0;
2640 ((TH1F*)fOutputList->FindObject("fRejectedEvents"))->Fill(fMbin+1);
2641 return;// Skip event
2643 (fEvt)->fNpairsSE = pairCountSE;
2644 (fEvt)->fNpairsME = pairCountME;
2645 ((TH1F*)fOutputList->FindObject("fEvents2"))->Fill(fMbin+1);
2647 ///////////////////////////////////////////////////
2651 ///////////////////////////////////////////////////////////////////////
2652 ///////////////////////////////////////////////////////////////////////
2653 ///////////////////////////////////////////////////////////////////////
2656 // Start the Main Correlation Analysis
2659 ///////////////////////////////////////////////////////////////////////
2664 /////////////////////////////////////////////////////////
2666 // Set the Normalization counters
2667 for(Int_t termN=0; termN<5; termN++){
2670 if((fEvt)->fNtracks ==0) continue;
2672 if((fEvt)->fNtracks ==0) continue;
2673 if((fEvt+1)->fNtracks ==0) continue;
2675 if((fEvt)->fNtracks ==0) continue;
2676 if((fEvt+1)->fNtracks ==0) continue;
2677 if((fEvt+2)->fNtracks ==0) continue;
2680 for(Int_t sc=0; sc<kSCLimit3; sc++){
2682 for(Int_t c1=0; c1<2; c1++){
2683 for(Int_t c2=0; c2<2; c2++){
2684 for(Int_t c3=0; c3<2; c3++){
2686 if(sc==0 || sc==6 || sc==9){// Identical species
2687 if( (c1+c2+c3)==1) {if(c1!=0 || c2!=0 || c3!=1) continue;}
2688 if( (c1+c2+c3)==2) {if(c1!=0) continue;}
2690 if( (c1+c2)==1) {if(c1!=0) continue;}
2691 }else {}// do nothing for pi-k-p case
2692 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[fMbin].EDB[fEDbin].ThreePT[termN].fNorm3->Fill(0.,tempNormFillCount[c1][c2][c3][sc][termN]);
2701 /////////////////////////////////////////////
2702 // Calculate Pair-Cut Correlations
2703 for(Int_t en1case=0; en1case<2; en1case++){// limit at 2 (normal)
2706 if(en1case==0) nump1 = (fEvt)->fNpairsSE;
2707 if(en1case==1) nump1 = (fEvt)->fNpairsME;
2710 for(Int_t p1=0; p1<nump1; p1++){
2713 ch1 = Int_t(((fEvt)->fPairsSE[p1].fCharge1 + 1)/2.);
2714 ch2 = Int_t(((fEvt)->fPairsSE[p1].fCharge2 + 1)/2.);
2715 pVect1[0] = (fEvt)->fPairsSE[p1].fE1; pVect2[0] = (fEvt)->fPairsSE[p1].fE2;
2716 pVect1[1] = (fEvt)->fPairsSE[p1].fP1[0]; pVect2[1] = (fEvt)->fPairsSE[p1].fP2[0];
2717 pVect1[2] = (fEvt)->fPairsSE[p1].fP1[1]; pVect2[2] = (fEvt)->fPairsSE[p1].fP2[1];
2718 pVect1[3] = (fEvt)->fPairsSE[p1].fP1[2]; pVect2[3] = (fEvt)->fPairsSE[p1].fP2[2];
2719 index1 = (fEvt)->fPairsSE[p1].fIndex1; index2 = (fEvt)->fPairsSE[p1].fIndex2;
2720 key1 = (fEvt)->fPairsSE[p1].fKey1; key2 = (fEvt)->fPairsSE[p1].fKey2;
2721 qinv12 = (fEvt)->fPairsSE[p1].fQinv;
2723 pVect1MC[1] = (fEvt)->fPairsSE[p1].fP1MC[0]; pVect2MC[1] = (fEvt)->fPairsSE[p1].fP2MC[0];
2724 pVect1MC[2] = (fEvt)->fPairsSE[p1].fP1MC[1]; pVect2MC[2] = (fEvt)->fPairsSE[p1].fP2MC[1];
2725 pVect1MC[3] = (fEvt)->fPairsSE[p1].fP1MC[2]; pVect2MC[3] = (fEvt)->fPairsSE[p1].fP2MC[2];
2726 pVect1MC[0] = sqrt(pow(pVect1MC[1],2)+pow(pVect1MC[2],2)+pow(pVect1MC[3],2)+pow(fTrueMassPi,2));
2727 pVect2MC[0] = sqrt(pow(pVect2MC[1],2)+pow(pVect2MC[2],2)+pow(pVect2MC[3],2)+pow(fTrueMassPi,2));
2730 ch1 = Int_t(((fEvt)->fPairsME[p1].fCharge1 + 1)/2.);
2731 ch2 = Int_t(((fEvt)->fPairsME[p1].fCharge2 + 1)/2.);
2732 pVect1[0] = (fEvt)->fPairsME[p1].fE1; pVect2[0] = (fEvt)->fPairsME[p1].fE2;
2733 pVect1[1] = (fEvt)->fPairsME[p1].fP1[0]; pVect2[1] = (fEvt)->fPairsME[p1].fP2[0];
2734 pVect1[2] = (fEvt)->fPairsME[p1].fP1[1]; pVect2[2] = (fEvt)->fPairsME[p1].fP2[1];
2735 pVect1[3] = (fEvt)->fPairsME[p1].fP1[2]; pVect2[3] = (fEvt)->fPairsME[p1].fP2[2];
2736 index1 = (fEvt)->fPairsME[p1].fIndex1; index2 = (fEvt)->fPairsME[p1].fIndex2;
2737 key1 = (fEvt)->fPairsME[p1].fKey1; key2 = (fEvt)->fPairsME[p1].fKey2;
2738 qinv12 = (fEvt)->fPairsME[p1].fQinv;
2740 pVect1MC[1] = (fEvt)->fPairsME[p1].fP1MC[0]; pVect2MC[1] = (fEvt)->fPairsME[p1].fP2MC[0];
2741 pVect1MC[2] = (fEvt)->fPairsME[p1].fP1MC[1]; pVect2MC[2] = (fEvt)->fPairsME[p1].fP2MC[1];
2742 pVect1MC[3] = (fEvt)->fPairsME[p1].fP1MC[2]; pVect2MC[3] = (fEvt)->fPairsME[p1].fP2MC[2];
2743 pVect1MC[0] = sqrt(pow(pVect1MC[1],2)+pow(pVect1MC[2],2)+pow(pVect1MC[3],2)+pow(fTrueMassPi,2));
2744 pVect2MC[0] = sqrt(pow(pVect2MC[1],2)+pow(pVect2MC[2],2)+pow(pVect2MC[3],2)+pow(fTrueMassPi,2));
2749 for(Int_t en2=0; en2<3; en2++){
2750 //////////////////////////////////////
2752 Bool_t skipcase=kTRUE;
2753 Short_t config=-1, part=-1;
2754 if(en1case==0 && en2==0) {skipcase=kFALSE; config=1; part=0;}// P11T1
2755 if(en1case==0 && en2==1) {skipcase=kFALSE; config=2; part=1;}// P11T2
2756 if(en1case==1 && en2==0) {skipcase=kFALSE; config=2; part=2;}// P12T1
2757 if(en1case==1 && en2==2) {skipcase=kFALSE; config=3; part=3;}// P12T3
2759 if(skipcase) continue;
2764 for(Int_t k=0; k<(fEvt+en2)->fNtracks; k++){
2768 // remove auto-correlations and duplicate triplets
2770 if( index1 == index3) continue;
2771 if( index2 == index3) continue;
2772 if(fPairSplitCut[0][index1]->At(index2)=='1') continue;// Track splitting/merging
2774 // skip the switched off triplets
2775 if(fTripletSkip1[fPairLocationSE[index1]->At(index2)]->At(index3)=='1') {
2776 fTripletSkip1[fPairLocationSE[index1]->At(index2)]->AddAt('0',index3);// Reset
2779 ///////////////////////////////
2780 // Turn off 1st possible degenerate triplet
2781 if(index1 < index3){// verify correct id ordering ( index1 < k )
2782 if(fPairLocationSE[index1]->At(index3) >= 0){
2783 fTripletSkip1[fPairLocationSE[index1]->At(index3)]->AddAt('1',index2);
2785 if(fPairSplitCut[0][index1]->At(index3)=='1') continue;// Track splitting/merging
2786 }else {// or k < index1
2787 if(fPairLocationSE[index3]->At(index1) >= 0){
2788 fTripletSkip1[fPairLocationSE[index3]->At(index1)]->AddAt('1',index2);
2790 if(fPairSplitCut[0][index3]->At(index1)=='1') continue;// Track splitting/merging
2792 // turn off 2nd possible degenerate triplet
2793 if(index2 < index3){// verify correct id ordering (index2 < k)
2794 if(fPairLocationSE[index2]->At(index3) >= 0){
2795 fTripletSkip1[fPairLocationSE[index2]->At(index3)]->AddAt('1',index1);
2797 if(fPairSplitCut[0][index2]->At(index3)=='1') continue;// Track splitting/merging
2798 }else {// or k < index2
2799 if(fPairLocationSE[index3]->At(index2) >= 0){
2800 fTripletSkip1[fPairLocationSE[index3]->At(index2)]->AddAt('1',index1);
2802 if(fPairSplitCut[0][index3]->At(index2)=='1') continue;// Track splitting/merging
2807 if(config==2 && part==1){// SE pair and third particle from next event. P11T2
2808 ///////////////////////////////
2809 // Turn off 1st possible degenerate triplet
2810 if(fPairLocationME[index1]->At(index3) >= 0){
2811 fTripletSkip2[fPairLocationME[index1]->At(index3)]->AddAt('1',index2);
2814 // turn off 2nd possible degenerate triplet
2815 if(fPairLocationME[index2]->At(index3) >= 0){
2816 fTripletSkip2[fPairLocationME[index2]->At(index3)]->AddAt('1',index1);
2819 if(fPairSplitCut[0][index1]->At(index2)=='1') continue;// Track splitting/merging
2820 if(fPairSplitCut[1][index1]->At(index3)=='1') continue;// Track splitting/merging
2821 if(fPairSplitCut[1][index2]->At(index3)=='1') continue;// Track splitting/merging
2822 }// end config 2 part 1
2824 if(config==2 && part==2){// P12T1
2825 if( index1 == index3) continue;
2827 // skip the switched off triplets
2828 if(fTripletSkip2[fPairLocationME[index1]->At(index2)]->At(index3)=='1') {
2829 fTripletSkip2[fPairLocationME[index1]->At(index2)]->AddAt('0',index3);// Reset
2832 // turn off another possible degenerate
2833 if(fPairLocationME[index3]->At(index2) >= 0){
2834 fTripletSkip2[fPairLocationME[index3]->At(index2)]->AddAt('1',index1);
2835 }// end config 2 part 2
2837 if(fPairSplitCut[1][index1]->At(index2)=='1') continue;// Track splitting/merging
2838 if(index1 < index3) {if(fPairSplitCut[0][index1]->At(index3)=='1') continue;}// Track splitting/merging
2839 else {if(fPairSplitCut[0][index3]->At(index1)=='1') continue;}// Track splitting/merging
2840 if(fPairSplitCut[1][index3]->At(index2)=='1') continue;// Track splitting/merging
2842 if(config==3){// P12T3
2843 if(fPairSplitCut[1][index1]->At(index2)=='1') continue;// Track splitting/merging
2844 if(fPairSplitCut[2][index1]->At(index3)=='1') continue;// Track splitting/merging
2845 if(fPairSplitCut[3][index2]->At(index3)=='1') continue;// Track splitting/merging
2850 ch3 = Int_t(((fEvt+en2)->fTracks[k].fCharge + 1)/2.);
2851 key3 = (fEvt+en2)->fTracks[k].fKey;
2852 Short_t fillIndex3 = FillIndex3part(key1+key2+key3);
2853 Short_t fillIndex13 = FillIndex2part(key1+key3);
2854 Short_t fillIndex23 = FillIndex2part(key2+key3);
2855 Short_t qCutBin13 = SetQcutBin(fillIndex13);
2856 Short_t qCutBin23 = SetQcutBin(fillIndex23);
2857 pVect3[0] = (fEvt+en2)->fTracks[k].fEaccepted;
2858 pVect3[1] = (fEvt+en2)->fTracks[k].fP[0];
2859 pVect3[2] = (fEvt+en2)->fTracks[k].fP[1];
2860 pVect3[3] = (fEvt+en2)->fTracks[k].fP[2];
2861 qinv13 = GetQinv(fillIndex13, pVect1, pVect3);
2862 qinv23 = GetQinv(fillIndex23, pVect2, pVect3);
2864 if(qinv13 < fQLowerCut) continue;
2865 if(qinv23 < fQLowerCut) continue;
2866 if(qinv13 > fQcut[qCutBin13]) continue;
2867 if(qinv23 > fQcut[qCutBin23]) continue;
2872 pVect3MC[1] = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[k].fLabel)].fPx;
2873 pVect3MC[2] = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[k].fLabel)].fPy;
2874 pVect3MC[3] = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[k].fLabel)].fPz;
2875 pVect3MC[0] = sqrt(pow(pVect3MC[1],2)+pow(pVect3MC[2],2)+pow(pVect3MC[3],2)+pow(fTrueMassPi,2));
2876 qinv12MC = GetQinv(0, pVect1MC, pVect2MC);
2877 qinv13MC = GetQinv(0, pVect1MC, pVect3MC);
2878 qinv23MC = GetQinv(0, pVect2MC, pVect3MC);
2883 // if all three pair cuts are the same then the case (config=2 && term=2) never reaches here.
2884 Float_t Kt12 = sqrt( pow(pVect1[1]+pVect2[1],2) + pow(pVect1[2]+pVect2[2],2))/2.;
2885 Float_t Kt13 = sqrt( pow(pVect1[1]+pVect3[1],2) + pow(pVect1[2]+pVect3[2],2))/2.;
2886 Float_t Kt23 = sqrt( pow(pVect2[1]+pVect3[1],2) + pow(pVect2[2]+pVect3[2],2))/2.;
2887 q3 = sqrt(pow(qinv12,2) + pow(qinv13,2) + pow(qinv23,2));
2888 transK3 = sqrt( pow(pVect1[1]+pVect2[1]+pVect3[1],2) + pow(pVect1[2]+pVect2[2]+pVect3[2],2))/3.;
2889 if(fKt3bins==1) fEDbin=0;
2890 else if(fKt3bins==2){
2891 if(transK3<0.3) fEDbin=0;
2893 }else{// fKt3bins==3 is the limit set by fEDbins
2894 if(transK3<0.25) fEDbin=0;
2895 else if(transK3<0.35) fEDbin=1;
2899 firstQ=0; secondQ=0; thirdQ=0;
2904 if(config==1) {// 123
2905 SetFillBins3(fillIndex3, key1, key2, key3, ch1, ch2, ch3, 0, bin1, bin2, bin3, fDummyB, fDummyB, fDummyB);
2907 if(fillIndex3 <= 2){
2908 ArrangeQs(fillIndex3, key1, key2, key3, ch1, ch2, ch3, qinv12, qinv13, qinv23, 0, 1, firstQ, secondQ, thirdQ);
2909 if(fillIndex3==0 && fMCcase) ArrangeQs(fillIndex3, key1, key2, key3, ch1, ch2, ch3, qinv12MC, qinv13MC, qinv23MC, 0, 1, firstQMC, secondQMC, thirdQMC);
2910 Float_t WInput = 1.0;
2911 if(fGenerateSignal && ch1==ch2 && ch1==ch3) WInput = MCWeight3D(kTRUE, 1, 10, firstQ, secondQ, thirdQ);
2912 //if(fGenerateSignal && ch1==ch2 && ch1==ch3) WInput = MCWeight3D(kTRUE, 1, fFixedLambdaBinr3, firstQMC, secondQMC, thirdQMC);
2914 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[0].fTermsQ3->Fill(q3, WInput);
2915 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[0].fTerms3->Fill(firstQ, secondQ, thirdQ, WInput);
2917 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[0].fMeanKt->Fill(Kt12);
2918 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[0].fMeanKt->Fill(Kt13);
2919 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[0].fMeanKt->Fill(Kt23);
2922 if(fillIndex3==0 && ch1==ch2 && ch1==ch3 && fMCcase==kFALSE){
2923 ((TH3D*)fOutputList->FindObject("fKt3DistTerm1"))->Fill(fMbin+1, transK3, q3);
2928 }else if(config==2){// 12, 13, 23
2930 Bool_t fill2=kFALSE, fill3=kFALSE, fill4=kFALSE;
2931 SetFillBins3(fillIndex3, key1, key2, key3, ch1, ch2, ch3, part, bin1, bin2, bin3, fill2, fill3, fill4);
2933 // loop over terms 2-4
2934 for(Int_t jj=2; jj<5; jj++){
2935 if(jj==2) {if(!fill2) continue;}//12
2936 if(jj==3) {if(!fill3) continue;}//13
2937 if(jj==4) {if(!fill4) continue;}//23
2939 if(fillIndex3 <= 2){
2940 ArrangeQs(fillIndex3, key1, key2, key3, ch1, ch2, ch3, qinv12, qinv13, qinv23, part, jj, firstQ, secondQ, thirdQ);
2941 if(fillIndex3==0 && fMCcase) ArrangeQs(fillIndex3, key1, key2, key3, ch1, ch2, ch3, qinv12MC, qinv13MC, qinv23MC, part, jj, firstQMC, secondQMC, thirdQMC);
2942 Float_t WInput = 1.0;
2943 if(fGenerateSignal && ch1==ch2 && ch1==ch3) WInput = MCWeight3D(kTRUE, jj, 10, firstQ, secondQ, thirdQ);
2944 //if(fGenerateSignal && ch1==ch2 && ch1==ch3) WInput = MCWeight3D(kTRUE, jj, fFixedLambdaBinr3, firstQMC, secondQMC, thirdQMC);
2946 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[jj-1].fTermsQ3->Fill(q3, WInput);
2947 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[jj-1].fTerms3->Fill(firstQ, secondQ, thirdQ, WInput);
2949 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[jj-1].fMeanKt->Fill(Kt12);
2950 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[jj-1].fMeanKt->Fill(Kt13);
2951 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[jj-1].fMeanKt->Fill(Kt23);
2955 }else {// config 3: All particles from different events
2957 SetFillBins3(fillIndex3, key1, key2, key3, ch1, ch2, ch3, 3, bin1, bin2, bin3, fDummyB, fDummyB, fDummyB);
2959 if(ch1==ch2 && ch1==ch3 && fillIndex3==0) {
2960 if(!fMCcase) ((TH3D*)fOutputList->FindObject("fKt3DistTerm5"))->Fill(fMbin+1, transK3, q3);
2963 if(fillIndex3 <= 2){
2964 ArrangeQs(fillIndex3, key1, key2, key3, ch1, ch2, ch3, qinv12, qinv13, qinv23, part, 5, firstQ, secondQ, thirdQ);
2965 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[4].fTermsQ3->Fill(q3);
2966 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[4].fTerms3->Fill(firstQ, secondQ, thirdQ);
2968 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[4].fMeanKt->Fill(Kt12);
2969 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[4].fMeanKt->Fill(Kt13);
2970 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[4].fMeanKt->Fill(Kt23);
2975 }// end 3rd particle
2983 }// end of PdensityPairs
2987 // Post output data.
2988 PostData(1, fOutputList);
2991 //________________________________________________________________________
2992 void AliThreePionRadii::Terminate(Option_t *)
2994 // Called once at the end of the query
2999 //________________________________________________________________________
3000 Bool_t AliThreePionRadii::AcceptPair(AliChaoticityTrackStruct *first, AliChaoticityTrackStruct *second)
3003 if(fabs(first->fEta-second->fEta) > fMinSepPairEta) return kTRUE;
3005 // propagate through B field to r=1m
3006 Float_t phi1 = first->fPhi - asin(first->fCharge*(0.1*fBfield)*0.15/first->fPt);// 0.15 for D=1m
3007 if(phi1 > 2*PI) phi1 -= 2*PI;
3008 if(phi1 < 0) phi1 += 2*PI;
3009 Float_t phi2 = second->fPhi - asin(second->fCharge*(0.1*fBfield)*0.15/second->fPt);// 0.15 for D=1m
3010 if(phi2 > 2*PI) phi2 -= 2*PI;
3011 if(phi2 < 0) phi2 += 2*PI;
3013 Float_t deltaphi = phi1 - phi2;
3014 if(deltaphi > PI) deltaphi -= 2*PI;
3015 if(deltaphi < -PI) deltaphi += 2*PI;
3016 deltaphi = fabs(deltaphi);
3018 if(deltaphi < fMinSepPairPhi) return kFALSE;// Min Separation
3021 // propagate through B field to r=1.6m
3022 phi1 = first->fPhi - asin(first->fCharge*(0.1*fBfield)*0.24/first->fPt);// mine. 0.24 for D=1.6m
3023 if(phi1 > 2*PI) phi1 -= 2*PI;
3024 if(phi1 < 0) phi1 += 2*PI;
3025 phi2 = second->fPhi - asin(second->fCharge*(0.1*fBfield)*0.24/second->fPt);// mine. 0.24 for D=1.6m
3026 if(phi2 > 2*PI) phi2 -= 2*PI;
3027 if(phi2 < 0) phi2 += 2*PI;
3029 deltaphi = phi1 - phi2;
3030 if(deltaphi > PI) deltaphi -= 2*PI;
3031 if(deltaphi < -PI) deltaphi += 2*PI;
3032 deltaphi = fabs(deltaphi);
3034 if(deltaphi < fMinSepPairPhi) return kFALSE;// Min Separation
3040 Int_t ncl1 = first->fClusterMap.GetNbits();
3041 Int_t ncl2 = second->fClusterMap.GetNbits();
3042 Int_t sumCls = 0; Int_t sumSha = 0; Int_t sumQ = 0;
3043 Double_t shfrac = 0; Double_t qfactor = 0;
3044 for(Int_t imap = 0; imap < ncl1 && imap < ncl2; imap++) {
3045 if (first->fClusterMap.TestBitNumber(imap) && second->fClusterMap.TestBitNumber(imap)) {// Both clusters
3046 if (first->fSharedMap.TestBitNumber(imap) && second->fSharedMap.TestBitNumber(imap)) { // Shared
3050 else {sumQ--; sumCls+=2;}
3052 else if (first->fClusterMap.TestBitNumber(imap) || second->fClusterMap.TestBitNumber(imap)) {// Non shared
3057 qfactor = sumQ*1.0/sumCls;
3058 shfrac = sumSha*1.0/sumCls;
3061 if(qfactor > fShareQuality || shfrac > fShareFraction) return kFALSE;
3068 //________________________________________________________________________
3069 Float_t AliThreePionRadii::GamovFactor(Int_t chargeBin1, Int_t chargeBin2, Float_t qinv)
3071 Float_t arg = G_Coeff/qinv;
3073 if(chargeBin1==chargeBin2) return (exp(arg)-1)/(arg);
3074 else {return (exp(-arg)-1)/(-arg);}
3077 //________________________________________________________________________
3078 void AliThreePionRadii::Shuffle(Int_t *iarr, Int_t i1, Int_t i2)
3082 for (Int_t i = i1; i < i2+1; i++) {
3083 j = (Int_t) (gRandom->Rndm() * a);
3089 //________________________________________________________________________
3090 Short_t AliThreePionRadii::FillIndex2part(Short_t key){
3092 if(key==2) return 0;// pi-pi
3093 else if(key==11) return 1;// pi-k
3094 else if(key==101) return 2;// pi-p
3095 else if(key==20) return 3;// k-k
3096 else if(key==110) return 4;// k-p
3097 else return 5;// p-p
3099 //________________________________________________________________________
3100 Short_t AliThreePionRadii::FillIndex3part(Short_t key){
3102 if(key==3) return 0;// pi-pi-pi
3103 else if(key==12) return 1;// pi-pi-k
3104 else if(key==21) return 2;// k-k-pi
3105 else if(key==102) return 3;// pi-pi-p
3106 else if(key==201) return 4;// p-p-pi
3107 else if(key==111) return 5;// pi-k-p
3108 else if(key==30) return 6;// k-k-k
3109 else if(key==120) return 7;// k-k-p
3110 else if(key==210) return 8;// p-p-k
3111 else return 9;// p-p-p
3114 //________________________________________________________________________
3115 Short_t AliThreePionRadii::SetQcutBin(Short_t fi){// fi=FillIndex
3116 if(fi <= 2) return 0;
3117 else if(fi==3) return 1;
3120 //________________________________________________________________________
3121 Short_t AliThreePionRadii::SetNormBin(Short_t fi){// fi=FillIndex
3123 else if(fi <= 2) return 1;
3126 //________________________________________________________________________
3127 void AliThreePionRadii::SetFillBins2(Short_t fi, Short_t key1, Short_t key2, Int_t c1, Int_t c2, Int_t &b1, Int_t &b2){
3129 if(fi==0 || fi==3 || fi==5){// Identical species
3130 if((c1+c2)==1) {b1=0; b2=1;}// Re-assign to merge degenerate histos
3131 else {b1=c1; b2=c2;}
3132 }else {// Mixed species
3133 if(key1 < key2) { b1=c1; b2=c2;}
3134 else {b1=c2; b2=c1;}
3138 //________________________________________________________________________
3139 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){
3142 // seSS, seSK, SE_keysum only used to determine which terms to fill (only used for terms 2-4)
3143 // part only matters for terms 2-4
3146 Short_t seKeySum=0;// only used for pi-k-p case
3147 if(part==1) {// default case (irrelevant for term 1 and term 5)
3148 if(c1==c2) seSS=kTRUE;
3149 if(key1==key2) seSK=kTRUE;
3150 seKeySum = key1+key2;
3153 if(c1==c3) seSS=kTRUE;
3154 if(key1==key3) seSK=kTRUE;
3155 seKeySum = key1+key3;
3159 // fill2, fill3, fill4 are only used for Cumulant Terms 2,3,4
3161 if(fi==0 || fi==6 || fi==9){// Identical species
3162 if( (c1+c2+c3)==1) {
3163 b1=0; b2=0; b3=1;// Re-assign to merge degenerate histos
3165 if(seSS) fill2=kTRUE;
3166 else {fill3=kTRUE; fill4=kTRUE;}
3168 }else if( (c1+c2+c3)==2) {
3171 if(!seSS) {fill2=kTRUE; fill3=kTRUE;}
3175 b1=c1; b2=c2; b3=c3;
3176 fill2=kTRUE; fill3=kTRUE; fill4=kTRUE;
3178 }else if(fi != 5){// all the rest except pi-k-p
3181 if( (c1+c2)==1) {b1=0; b2=1;}
3182 else {b1=c1; b2=c2;}
3183 }else if(key1==key3){
3185 if( (c1+c3)==1) {b1=0; b2=1;}
3186 else {b1=c1; b2=c3;}
3187 }else {// Key2==Key3
3189 if( (c2+c3)==1) {b1=0; b2=1;}
3190 else {b1=c2; b2=c3;}
3192 //////////////////////////////
3193 if(seSK) fill2=kTRUE;// Same keys from Same Event
3194 else {// Different keys from Same Event
3195 if( (c1+c2+c3)==1) {
3197 if(seSS) fill3=kTRUE;
3199 }else{fill3=kTRUE; fill4=kTRUE;}// b3=1 so fill both
3200 }else if( (c1+c2+c3)==2) {
3202 if(seSS) fill4=kTRUE;
3204 }else{fill3=kTRUE; fill4=kTRUE;}// b3=0 so fill both
3205 }else{fill3=kTRUE; fill4=kTRUE;}// all same charge so fill both
3207 /////////////////////////////
3208 }else {// pi-k-p (no charge ordering applies since all are unique)
3210 if(key2==10) {b1=c1; b2=c2; b3=c3;}// pi-k-p
3211 else {b1=c1; b2=c3; b3=c2;}// pi-p-k
3213 if(key2==1) {b1=c2; b2=c1; b3=c3;}// k-pi-p
3214 else {b1=c3; b2=c1; b3=c2;}// k-p-pi
3216 if(key2==1) {b1=c2; b2=c3; b3=c1;}// p-pi-k
3217 else {b1=c3; b2=c2; b3=c1;}// p-k-pi
3219 ////////////////////////////////////
3220 if(seKeySum==11) fill2=kTRUE;
3221 else if(seKeySum==101) fill3=kTRUE;
3223 ////////////////////////////////////
3227 //________________________________________________________________________
3228 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){
3230 // for terms 2-4: start by setting q12(part 1) or q13(part 2)
3231 if(fi==0 || fi==6 || fi==9){// Identical species
3232 if( (c1+c2+c3)==1) {// fQ=ss, sQ=os, tQ=os
3233 if(term==1 || term==5){
3234 if(c1==c2) {fQ=q12; sQ=q13; tQ=q23;}
3235 else if(c1==c3) {fQ=q13; sQ=q12; tQ=q23;}
3236 else {fQ=q23; sQ=q12; tQ=q13;}
3237 }else if(term==2 && part==1){
3238 fQ=q12; sQ=q13; tQ=q23;
3239 }else if(term==2 && part==2){
3240 fQ=q13; sQ=q12; tQ=q23;
3241 }else if(term==3 && part==1){
3243 if(c1==c3) {fQ=q13; tQ=q23;}
3244 else {fQ=q23; tQ=q13;}
3245 }else if(term==3 && part==2){
3247 if(c1==c2) {fQ=q12; tQ=q23;}
3248 else {fQ=q23; tQ=q12;}
3249 }else if(term==4 && part==1){
3251 if(c1==c3) {fQ=q13; sQ=q23;}
3252 else {fQ=q23; sQ=q13;}
3253 }else if(term==4 && part==2){
3255 if(c1==c2) {fQ=q12; sQ=q23;}
3256 else {fQ=q23; sQ=q12;}
3257 }else cout<<"problem!!!!!!!!!!!!!"<<endl;
3258 }else if( (c1+c2+c3)==2) {// fQ=os, sQ=os, tQ=ss
3259 if(term==1 || term==5){
3260 if(c1==c2) {tQ=q12; sQ=q13; fQ=q23;}
3261 else if(c1==c3) {tQ=q13; sQ=q12; fQ=q23;}
3262 else {tQ=q23; sQ=q12; fQ=q13;}
3263 }else if(term==2 && part==1){
3265 if(c1==c3) {tQ=q13; sQ=q23;}
3266 else {tQ=q23; sQ=q13;}
3267 }else if(term==2 && part==2){
3269 if(c1==c2) {tQ=q12; sQ=q23;}
3270 else {tQ=q23; sQ=q12;}
3271 }else if(term==3 && part==1){
3273 if(c1==c3) {tQ=q13; fQ=q23;}
3274 else {tQ=q23; fQ=q13;}
3275 }else if(term==3 && part==2){
3277 if(c1==c2) {tQ=q12; fQ=q23;}
3278 else {tQ=q23; fQ=q12;}
3279 }else if(term==4 && part==1){
3280 tQ=q12; sQ=q13; fQ=q23;
3281 }else if(term==4 && part==2){
3282 tQ=q13; sQ=q12; fQ=q23;
3283 }else cout<<"problem!!!!!!!!!!!!!"<<endl;
3284 }else {// fQ=ss, sQ=ss, tQ=ss
3285 if(term==1 || term==5) {fQ=q12; sQ=q13; tQ=q23;}
3286 else if(term==2 && part==1) {fQ=q12; sQ=q13; tQ=q23;}
3287 else if(term==2 && part==2) {fQ=q13; sQ=q12; tQ=q23;}
3288 else if(term==3 && part==1) {sQ=q12; fQ=q13; tQ=q23;}
3289 else if(term==3 && part==2) {sQ=q13; fQ=q12; tQ=q23;}
3290 else if(term==4 && part==1) {tQ=q12; fQ=q13; sQ=q23;}
3291 else if(term==4 && part==2) {tQ=q13; fQ=q12; sQ=q23;}
3293 }else if(fi != 5){// all the rest except pi-k-p
3297 // cases not explicity shown below are not possible
3298 if(term==1 || term==5) {sQ=q13; tQ=q23;}
3299 else if(term==2 && part==1) {sQ=q13; tQ=q23;}
3300 else if(term==3 && part==2) {sQ=q13; tQ=q23;}
3301 else if(term==4 && part==2) {tQ=q13; sQ=q23;}
3302 else cout<<"problem!!!!!!!!!!!!!"<<endl;
3304 if(c1==c3) {sQ=q13; tQ=q23;}
3305 else {sQ=q23; tQ=q13;}
3307 if(c1==c3) {tQ=q13; sQ=q23;}
3308 else {tQ=q23; sQ=q13;}
3310 }else if(key1==key3){
3313 // cases not explicity shown below are not possible
3314 if(term==1 || term==5) {sQ=q12; tQ=q23;}
3315 else if(term==2 && part==2) {sQ=q12; tQ=q23;}
3316 else if(term==3 && part==1) {sQ=q12; tQ=q23;}
3317 else if(term==4 && part==1) {tQ=q12; sQ=q23;}
3318 else cout<<"problem!!!!!!!!!!!!!!!!!!!!!!"<<endl;
3320 if(c1==c2) {sQ=q12; tQ=q23;}
3321 else {sQ=q23; tQ=q12;}
3323 if(c1==c2) {tQ=q12; sQ=q23;}
3324 else {tQ=q23; sQ=q12;}
3326 }else {// key2==key3
3329 // cases not explicity shown below are not possible
3330 if(term==1 || term==5) {sQ=q12; tQ=q13;}
3331 else if(term==3 && part==1) {sQ=q12; tQ=q13;}
3332 else if(term==3 && part==2) {sQ=q13; tQ=q12;}
3333 else if(term==4 && part==1) {tQ=q12; sQ=q13;}
3334 else if(term==4 && part==2) {tQ=q13; sQ=q12;}
3335 else cout<<"problem!!!!!!!!!!!!!!!!!!!!!!"<<endl;
3337 if(c1==c2) {sQ=q12; tQ=q13;}
3338 else {sQ=q13; tQ=q12;}
3340 if(c1==c2) {tQ=q12; sQ=q13;}
3341 else {tQ=q13; sQ=q12;}
3346 if(key2==10) {fQ=q12; sQ=q13; tQ=q23;}// pi-k-p
3347 else {fQ=q13; sQ=q12; tQ=q23;}// pi-p-k
3349 if(key2==1) {fQ=q12; sQ=q23; tQ=q13;}// k-pi-p
3350 else {fQ=q13; sQ=q23; tQ=q12;}// k-p-pi
3352 if(key2==1) {fQ=q23; sQ=q12; tQ=q13;}// p-pi-k
3353 else {fQ=q23; sQ=q13; tQ=q12;}// p-k-pi
3360 //________________________________________________________________________
3361 Float_t AliThreePionRadii::GetQinv(Short_t fi, Float_t track1[], Float_t track2[]){
3365 if(fi==0 || fi==3 || fi==5){// identical masses
3366 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));
3367 }else{// different masses
3368 Float_t px = track1[1] + track2[1];
3369 Float_t py = track1[2] + track2[2];
3370 Float_t pz = track1[3] + track2[3];
3371 Float_t pSquared = pow(track1[0]+track2[0],2) - px*px - py*py - pz*pz;
3372 Float_t deltaDOTsum = (track1[0]-track2[0])*(track1[0]+track2[0]);
3373 deltaDOTsum -= (track1[1]-track2[1])*px + (track1[2]-track2[2])*py + (track1[3]-track2[3])*pz;
3375 qinv = pow( (track1[1]-track2[1]) - deltaDOTsum*px/(pSquared),2);
3376 qinv += pow( (track1[2]-track2[2]) - deltaDOTsum*py/(pSquared),2);
3377 qinv += pow( (track1[3]-track2[3]) - deltaDOTsum*pz/(pSquared),2);
3378 qinv -= pow( (track1[0]-track2[0]) - deltaDOTsum*(track1[0]+track2[0])/(pSquared),2);
3385 //________________________________________________________________________
3386 void AliThreePionRadii::GetQosl(Float_t track1[], Float_t track2[], Float_t& qout, Float_t& qside, Float_t& qlong){
3388 Float_t p0 = track1[0] + track2[0];
3389 Float_t px = track1[1] + track2[1];
3390 Float_t py = track1[2] + track2[2];
3391 Float_t pz = track1[3] + track2[3];
3393 Float_t mt = sqrt(p0*p0 - pz*pz);
3394 Float_t pt = sqrt(px*px + py*py);
3396 Float_t v0 = track1[0] - track2[0];
3397 Float_t vx = track1[1] - track2[1];
3398 Float_t vy = track1[2] - track2[2];
3399 Float_t vz = track1[3] - track2[3];
3401 qout = (px*vx + py*vy)/pt;
3402 qside = (px*vy - py*vx)/pt;
3403 qlong = (p0*vz - pz*v0)/mt;
3405 //________________________________________________________________________
3406 Float_t AliThreePionRadii::MCWeight(Int_t charge1, Int_t charge2, Float_t r, Int_t dampIndex, Float_t qinv){
3408 Float_t radius = r/0.19733;// convert to GeV (starts at 5 fm, was 3 fm)
3410 Float_t myDamp = fDampStart + (fDampStep)*dampIndex;
3411 Float_t coulCorr12 = FSICorrelation2(charge1, charge2, qinv);
3412 if(charge1==charge2){
3413 Float_t arg=qinv*radius;
3414 Float_t EW = 1 + kappa3/(6.*pow(2.,1.5))*(8.*pow(arg,3) - 12.*arg);
3415 EW += kappa4/(24.*pow(2.,2))*(16.*pow(arg,4) -48.*pow(arg,2) + 12);
3416 return ((1-myDamp) + myDamp*(1 + exp(-pow(qinv*radius,2))*pow(EW,2))*coulCorr12);
3418 return ((1-myDamp) + myDamp*coulCorr12);
3422 //________________________________________________________________________
3423 Float_t AliThreePionRadii::MCWeight3D(Bool_t SameCharge, Int_t term, Int_t dampIndex, Float_t q12, Float_t q13, Float_t q23){
3424 if(term==5) return 1.0;
3426 Float_t radius=fRMax;
3429 Float_t myDamp = fDampStart + (fDampStep)*dampIndex;
3430 Float_t fc = sqrt(myDamp);
3432 if(SameCharge){// all three of the same charge
3433 Float_t coulCorr12 = FSICorrelation2(+1,+1, q12);// K2
3434 Float_t coulCorr13 = FSICorrelation2(+1,+1, q13);// K2
3435 Float_t coulCorr23 = FSICorrelation2(+1,+1, q23);// K2
3436 Float_t arg12=q12*radius;
3437 Float_t arg13=q13*radius;
3438 Float_t arg23=q23*radius;
3439 Float_t EW12 = 1 + kappa3/(6.*pow(2.,1.5))*(8.*pow(arg12,3) - 12.*arg12);
3440 EW12 += kappa4/(24.*pow(2.,2))*(16.*pow(arg12,4) -48.*pow(arg12,2) + 12);
3441 Float_t EW13 = 1 + kappa3/(6.*pow(2.,1.5))*(8.*pow(arg13,3) - 12.*arg13);
3442 EW13 += kappa4/(24.*pow(2.,2))*(16.*pow(arg13,4) -48.*pow(arg13,2) + 12);
3443 Float_t EW23 = 1 + kappa3/(6.*pow(2.,1.5))*(8.*pow(arg23,3) - 12.*arg23);
3444 EW23 += kappa4/(24.*pow(2.,2))*(16.*pow(arg23,4) -48.*pow(arg23,2) + 12);
3446 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);
3447 c3QS += 2*exp(-pow(radius,2)*(pow(q12,2) + pow(q13,2) + pow(q23,2))/2.)*EW12*EW13*EW23;
3448 Float_t w123 = pow(1-fc,3) + 3*fc*pow(1-fc,2);
3449 w123 += pow(fc,2)*(1-fc)*(1+exp(-pow(q12*radius,2))*pow(EW12,2))*coulCorr12;
3450 w123 += pow(fc,2)*(1-fc)*(1+exp(-pow(q13*radius,2))*pow(EW13,2))*coulCorr13;
3451 w123 += pow(fc,2)*(1-fc)*(1+exp(-pow(q23*radius,2))*pow(EW23,2))*coulCorr23;
3452 w123 += pow(fc,3)*c3QS*coulCorr12*coulCorr13*coulCorr23;
3455 return ((1-myDamp) + myDamp*(1 + exp(-pow(q12*radius,2))*pow(EW12,2))*coulCorr12);
3457 return ((1-myDamp) + myDamp*(1 + exp(-pow(q13*radius,2))*pow(EW13,2))*coulCorr13);
3459 return ((1-myDamp) + myDamp*(1 + exp(-pow(q23*radius,2))*pow(EW23,2))*coulCorr23);
3462 }else{// mixed charge case pair 12 always treated as ss
3463 Float_t coulCorr12 = FSICorrelation2(+1,+1, q12);// K2 ss
3464 Float_t coulCorr13 = FSICorrelation2(+1,-1, q13);// K2 os
3465 Float_t coulCorr23 = FSICorrelation2(+1,-1, q23);// K2 os
3466 Float_t arg12=q12*radius;
3467 Float_t EW12 = 1 + kappa3/(6.*pow(2.,1.5))*(8.*pow(arg12,3) - 12.*arg12);
3468 EW12 += kappa4/(24.*pow(2.,2))*(16.*pow(arg12,4) -48.*pow(arg12,2) + 12);
3470 Float_t c3QS = 1 + exp(-pow(q12*radius,2))*pow(EW12,2);
3471 Float_t w123 = pow(1-fc,3) + 3*fc*pow(1-fc,2);
3472 w123 += pow(fc,2)*(1-fc)*(1+exp(-pow(q12*radius,2))*pow(EW12,2))*coulCorr12;
3473 w123 += pow(fc,2)*(1-fc)*coulCorr13;
3474 w123 += pow(fc,2)*(1-fc)*coulCorr23;
3475 w123 += pow(fc,3)*c3QS*coulCorr12*coulCorr13*coulCorr23;
3478 return ((1-myDamp) + myDamp*(1 + exp(-pow(q12*radius,2))*pow(EW12,2))*coulCorr12);
3480 return ((1-myDamp) + myDamp*coulCorr13);
3482 return ((1-myDamp) + myDamp*coulCorr23);
3487 //________________________________________________________________________
3488 void AliThreePionRadii::SetFSICorrelations(Bool_t legoCase, TH1D *temp1DSS[10], TH1D *temp1DOS[10]){
3489 // read in 2-particle FSI correlations = K2
3490 // 2-particle input histo from file is binned in qinv.
3492 cout<<"LEGO call to SetFSICorrelations"<<endl;
3493 for(int mb=0; mb<10; mb++){
3494 fFSI2SS[mb] = (TH1D*)temp1DSS[mb]->Clone();
3495 fFSI2OS[mb] = (TH1D*)temp1DOS[mb]->Clone();
3497 fFSI2SS[mb]->SetDirectory(0);
3498 fFSI2OS[mb]->SetDirectory(0);
3501 cout<<"non LEGO call to SetFSICorrelations"<<endl;
3502 TFile *fsifile = new TFile("KFile.root","READ");
3503 if(!fsifile->IsOpen()) {
3504 cout<<"No FSI file found"<<endl;
3505 AliFatal("No FSI file found. Kill process.");
3506 }else {cout<<"Good FSI File Found!"<<endl;}
3507 for(int mb=0; mb<10; mb++){
3508 TString *nameK2ss = new TString("K2ss_");
3509 TString *nameK2os = new TString("K2os_");
3512 TH1D *temphistoSS = (TH1D*)fsifile->Get(nameK2ss->Data());
3513 TH1D *temphistoOS = (TH1D*)fsifile->Get(nameK2os->Data());
3515 fFSI2SS[mb] = (TH1D*)temphistoSS->Clone();
3516 fFSI2OS[mb] = (TH1D*)temphistoOS->Clone();
3517 fFSI2SS[mb]->SetDirectory(0);
3518 fFSI2OS[mb]->SetDirectory(0);
3524 for(int mb=0; mb<10; mb++){
3525 for(Int_t ii=1; ii<=fFSI2SS[mb]->GetNbinsX(); ii++){
3526 if(fFSI2SS[mb]->GetBinContent(ii) > 1.0) fFSI2SS[mb]->SetBinContent(ii, 1.0);
3527 if(fFSI2OS[mb]->GetBinContent(ii) > 10.0) fFSI2OS[mb]->SetBinContent(ii, 10.0);
3529 if(fFSI2SS[mb]->GetBinContent(ii) < 0.05) fFSI2SS[mb]->SetBinContent(ii, 0.05);
3530 if(fFSI2OS[mb]->GetBinContent(ii) < 0.9) fFSI2OS[mb]->SetBinContent(ii, 0.9);
3534 cout<<"Done reading FSI file"<<endl;
3536 //________________________________________________________________________
3537 Float_t AliThreePionRadii::FSICorrelation2(Int_t charge1, Int_t charge2, Float_t qinv){
3538 // returns 2-particle Coulomb correlations = K2
3539 Int_t qbinL = fFSI2SS[fFSIindex]->GetXaxis()->FindBin(qinv-fFSI2SS[fFSIindex]->GetXaxis()->GetBinWidth(1)/2.);
3540 Int_t qbinH = qbinL+1;
3541 if(qbinL <= 0) return 1.0;
3542 if(qbinH > fFSI2SS[fFSIindex]->GetNbinsX()) return 1.0;
3545 if(charge1==charge2){
3546 slope = fFSI2SS[fFSIindex]->GetBinContent(qbinL) - fFSI2SS[fFSIindex]->GetBinContent(qbinH);
3547 slope /= fFSI2SS[fFSIindex]->GetXaxis()->GetBinCenter(qbinL) - fFSI2SS[fFSIindex]->GetXaxis()->GetBinCenter(qbinH);
3548 return (slope*(qinv - fFSI2SS[fFSIindex]->GetXaxis()->GetBinCenter(qbinL)) + fFSI2SS[fFSIindex]->GetBinContent(qbinL));
3550 slope = fFSI2OS[fFSIindex]->GetBinContent(qbinL) - fFSI2OS[fFSIindex]->GetBinContent(qbinH);
3551 slope /= fFSI2OS[fFSIindex]->GetXaxis()->GetBinCenter(qbinL) - fFSI2OS[fFSIindex]->GetXaxis()->GetBinCenter(qbinH);
3552 return (slope*(qinv - fFSI2OS[fFSIindex]->GetXaxis()->GetBinCenter(qbinL)) + fFSI2OS[fFSIindex]->GetBinContent(qbinL));
3555 //________________________________________________________________________