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"
33 #include "AliThreePionRadii.h"
36 #define G_Coeff 0.006399 // 2*pi*alpha*M_pion
37 #define kappa3 0.2 // kappa3 Edgeworth coefficient (non-Gaussian features of C2)
38 #define kappa4 0.45 // kappa4 Edgeworth coefficient (non-Gaussian features of C2)
41 // Author: Dhevan Gangadharan
43 ClassImp(AliThreePionRadii)
45 //________________________________________________________________________
46 AliThreePionRadii::AliThreePionRadii():
60 fGenerateSignal(kFALSE),
61 fPdensityPairCut(kTRUE),
114 fOtherPairLocation1(),
115 fOtherPairLocation2(),
120 // Default constructor
121 for(Int_t mb=0; mb<fMbins; mb++){
122 for(Int_t edB=0; edB<fEDbins; edB++){
123 for(Int_t c1=0; c1<2; c1++){
124 for(Int_t c2=0; c2<2; c2++){
125 for(Int_t sc=0; sc<kSCLimit2; sc++){
126 for(Int_t term=0; term<2; term++){
128 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fExplicit2 = 0x0;
129 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fExplicit2QW = 0x0;
130 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fAvgP = 0x0;
131 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fIdeal = 0x0;
132 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fSmeared = 0x0;
134 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fMCqinv = 0x0;
135 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fMCqinvQW = 0x0;
136 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fPIDpurityDen = 0x0;
137 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fPIDpurityNum = 0x0;
142 for(Int_t c3=0; c3<2; c3++){
143 for(Int_t sc=0; sc<kSCLimit3; sc++){
144 for(Int_t term=0; term<5; term++){
146 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fNorm3 = 0x0;
147 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fTerms3 = 0x0;
148 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fTermsQ3 = 0x0;
149 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fIdeal = 0x0;
150 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fSmeared = 0x0;
161 // Initialize 3-pion FSI histograms
162 for(Int_t i=0; i<10; i++){
168 //________________________________________________________________________
169 AliThreePionRadii::AliThreePionRadii(const Char_t *name)
170 : AliAnalysisTaskSE(name),
183 fGenerateSignal(kFALSE),
184 fPdensityPairCut(kTRUE),
198 fCentBinHighLimit(1),
219 fMinSepPairEta(0.03),
220 fMinSepPairPhi(0.04),
237 fOtherPairLocation1(),
238 fOtherPairLocation2(),
245 fPdensityPairCut = kTRUE;
248 for(Int_t mb=0; mb<fMbins; mb++){
249 for(Int_t edB=0; edB<fEDbins; edB++){
250 for(Int_t c1=0; c1<2; c1++){
251 for(Int_t c2=0; c2<2; c2++){
252 for(Int_t sc=0; sc<kSCLimit2; sc++){
253 for(Int_t term=0; term<2; term++){
255 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fExplicit2 = 0x0;
256 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fExplicit2QW = 0x0;
257 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fAvgP = 0x0;
258 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fIdeal = 0x0;
259 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fSmeared = 0x0;
261 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fMCqinv = 0x0;
262 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fMCqinvQW = 0x0;
263 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fPIDpurityDen = 0x0;
264 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fPIDpurityNum = 0x0;
268 for(Int_t c3=0; c3<2; c3++){
269 for(Int_t sc=0; sc<kSCLimit3; sc++){
270 for(Int_t term=0; term<5; term++){
272 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fNorm3 = 0x0;
273 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fTerms3 = 0x0;
274 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fTermsQ3 = 0x0;
275 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fIdeal = 0x0;
276 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fSmeared = 0x0;
286 // Initialize 3-pion FSI histograms
287 for(Int_t i=0; i<10; i++){
293 DefineOutput(1, TList::Class());
295 //________________________________________________________________________
296 AliThreePionRadii::AliThreePionRadii(const AliThreePionRadii &obj)
297 : AliAnalysisTaskSE(obj.fname),
301 fOutputList(obj.fOutputList),
302 fPIDResponse(obj.fPIDResponse),
305 fTempStruct(obj.fTempStruct),
306 fRandomNumber(obj.fRandomNumber),
308 fMCcase(obj.fMCcase),
309 fAODcase(obj.fAODcase),
310 fPbPbcase(obj.fPbPbcase),
311 fGenerateSignal(obj.fGenerateSignal),
312 fPdensityPairCut(obj.fPdensityPairCut),
314 fFilterBit(obj.fFilterBit),
315 fMaxChi2NDF(obj.fMaxChi2NDF),
316 fMinTPCncls(obj.fMinTPCncls),
317 fBfield(obj.fBfield),
319 fFSIindex(obj.fFSIindex),
322 fMultLimit(obj.fMultLimit),
323 fKt3bins(obj.fKt3bins),
324 fV0Mbinning(obj.fV0Mbinning),
325 fCentBinLowLimit(obj.fCentBinLowLimit),
326 fCentBinHighLimit(obj.fCentBinHighLimit),
327 fTriggerType(obj.fTriggerType),
328 fEventCounter(obj.fEventCounter),
329 fEventsToMix(obj.fEventsToMix),
330 fZvertexBins(obj.fZvertexBins),
333 fQLowerCut(obj.fQLowerCut),
334 fQlimitC2(obj.fQlimitC2),
335 fQbinsC2(obj.fQbinsC2),
338 fKupperBound(obj.fKupperBound),
339 fQupperBound(obj.fQupperBound),
341 fDampStart(obj.fDampStart),
342 fDampStep(obj.fDampStep),
343 fTPCTOFboundry(obj.fTPCTOFboundry),
344 fTOFboundry(obj.fTOFboundry),
345 fSigmaCutTPC(obj.fSigmaCutTPC),
346 fSigmaCutTOF(obj.fSigmaCutTOF),
347 fMinSepPairEta(obj.fMinSepPairEta),
348 fMinSepPairPhi(obj.fMinSepPairPhi),
349 fShareQuality(obj.fShareQuality),
350 fShareFraction(obj.fShareFraction),
351 fTrueMassP(obj.fTrueMassP),
352 fTrueMassPi(obj.fTrueMassPi),
353 fTrueMassK(obj.fTrueMassK),
354 fTrueMassKs(obj.fTrueMassKs),
355 fTrueMassLam(obj.fTrueMassLam),
356 fDummyB(obj.fDummyB),
365 fOtherPairLocation1(),
366 fOtherPairLocation2(),
373 for(Int_t i=0; i<10; i++){
374 fFSI2SS[i]=obj.fFSI2SS[i];
375 fFSI2OS[i]=obj.fFSI2OS[i];
379 //________________________________________________________________________
380 AliThreePionRadii &AliThreePionRadii::operator=(const AliThreePionRadii &obj)
382 // Assignment operator
388 fOutputList = obj.fOutputList;
389 fPIDResponse = obj.fPIDResponse;
392 fTempStruct = obj.fTempStruct;
393 fRandomNumber = obj.fRandomNumber;
395 fMCcase = obj.fMCcase;
396 fAODcase = obj.fAODcase;
397 fPbPbcase = obj.fPbPbcase;
398 fGenerateSignal = obj.fGenerateSignal;
399 fPdensityPairCut = obj.fPdensityPairCut;
401 fFilterBit = obj.fFilterBit;
402 fMaxChi2NDF = obj.fMaxChi2NDF;
403 fMinTPCncls = obj.fMinTPCncls;
404 fBfield = obj.fBfield;
406 fFSIindex = obj.fFSIindex;
409 fMultLimit = obj.fMultLimit;
410 fKt3bins = obj.fKt3bins;
411 fV0Mbinning = obj.fV0Mbinning;
412 fCentBinLowLimit = obj.fCentBinLowLimit;
413 fCentBinHighLimit = obj.fCentBinHighLimit;
414 fTriggerType = obj.fTriggerType;
415 fEventCounter = obj.fEventCounter;
416 fEventsToMix = obj.fEventsToMix;
417 fZvertexBins = obj.fZvertexBins;
418 fQLowerCut = obj.fQLowerCut;
419 fQlimitC2 = obj.fQlimitC2;
420 fQbinsC2 = obj.fQbinsC2;
421 fKupperBound = obj.fKupperBound;
422 fQupperBound = obj.fQupperBound;
424 fDampStart = obj.fDampStart;
425 fDampStep = obj.fDampStep;
426 fTPCTOFboundry = obj.fTPCTOFboundry;
427 fTOFboundry = obj.fTOFboundry;
428 fSigmaCutTPC = obj.fSigmaCutTPC;
429 fSigmaCutTOF = obj.fSigmaCutTOF;
430 fMinSepPairEta = obj.fMinSepPairEta;
431 fMinSepPairPhi = obj.fMinSepPairPhi;
432 fShareQuality = obj.fShareQuality;
433 fShareFraction = obj.fShareFraction;
434 fTrueMassP = obj.fTrueMassP;
435 fTrueMassPi = obj.fTrueMassPi;
436 fTrueMassK = obj.fTrueMassK;
437 fTrueMassKs = obj.fTrueMassKs;
438 fTrueMassLam = obj.fTrueMassLam;
439 fDummyB = obj.fDummyB;
442 for(Int_t i=0; i<10; i++){
443 fFSI2SS[i]=obj.fFSI2SS[i];
444 fFSI2OS[i]=obj.fFSI2OS[i];
449 //________________________________________________________________________
450 AliThreePionRadii::~AliThreePionRadii()
453 if(fAOD) delete fAOD;
454 //if(fESD) delete fESD;
455 if(fOutputList) delete fOutputList;
456 if(fPIDResponse) delete fPIDResponse;
458 if(fEvt) delete fEvt;
459 if(fTempStruct) delete [] fTempStruct;
460 if(fRandomNumber) delete fRandomNumber;
462 for(Int_t i=0; i<fMultLimit; i++){
463 if(fPairLocationSE[i]) delete [] fPairLocationSE[i];
464 if(fPairLocationME[i]) delete [] fPairLocationME[i];
465 for(Int_t j=0; j<2; j++){
466 if(fOtherPairLocation1[j][i]) delete [] fOtherPairLocation1[j][i];
467 if(fOtherPairLocation2[j][i]) delete [] fOtherPairLocation2[j][i];
469 for(Int_t j=0; j<3; j++) if(fNormPairSwitch[j][i]) delete [] fNormPairSwitch[j][i];
470 for(Int_t j=0; j<4; j++) if(fPairSplitCut[j][i]) delete [] fPairSplitCut[j][i];
472 for(Int_t i=0; i<kPairLimit; i++) if(fTripletSkip1[i]) delete [] fTripletSkip1[i];
473 for(Int_t i=0; i<2*kPairLimit; i++) if(fTripletSkip2[i]) delete [] fTripletSkip2[i];
474 for(Int_t i=0; i<3; i++) if(fNormPairs[i]) delete [] fNormPairs[i];
476 for(Int_t mb=0; mb<fMbins; mb++){
477 if(fPbPbcase && ((mb < fCentBinLowLimit) || (mb > fCentBinHighLimit))) continue;
478 for(Int_t edB=0; edB<fEDbins; edB++){
479 for(Int_t c1=0; c1<2; c1++){
480 for(Int_t c2=0; c2<2; c2++){
481 for(Int_t sc=0; sc<kSCLimit2; sc++){
482 for(Int_t term=0; term<2; term++){
484 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;
485 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;
487 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;
488 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;
490 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;
491 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;
495 for(Int_t c3=0; c3<2; c3++){
496 for(Int_t sc=0; sc<kSCLimit3; sc++){
497 for(Int_t term=0; term<5; term++){
499 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;
500 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;
512 for(Int_t i=0; i<10; i++){
513 if(fFSI2SS[i]) delete fFSI2SS[i];
514 if(fFSI2OS[i]) delete fFSI2OS[i];
518 //________________________________________________________________________
519 void AliThreePionRadii::ParInit()
521 cout<<"AliThreePionRadii MyInit() call"<<endl;
522 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;
524 fRandomNumber = new TRandom3();
525 fRandomNumber->SetSeed(0);
529 if(fPdensityPairCut) fEventsToMix=2;
533 fTPCTOFboundry = 0.6;// TPC pid used below this momentum, TOF above but below TOF_boundry
534 fTOFboundry = 2.1;// TOF pid used below this momentum
536 ////////////////////////////////////////////////
538 fShareQuality = .5;// max
539 fShareFraction = .05;// max
540 ////////////////////////////////////////////////
543 //fMultLimits[0]=0, fMultLimits[1]=5, fMultLimits[2]=10, fMultLimits[3]=15, fMultLimits[4]=20, fMultLimits[5]=25;
544 //fMultLimits[6]=30, fMultLimits[7]=35, fMultLimits[8]=40, fMultLimits[9]=45, fMultLimits[10]=kMultLimitPP;
546 fMultLimits[0]=0, fMultLimits[1]=5; fMultLimits[2]=10; fMultLimits[3]=15; fMultLimits[4]=20;
547 fMultLimits[5]=30, fMultLimits[6]=40; fMultLimits[7]=50; fMultLimits[8]=70; fMultLimits[9]=100;
548 fMultLimits[10]=150, fMultLimits[11]=200; fMultLimits[12]=260; fMultLimits[13]=320; fMultLimits[14]=400;
549 fMultLimits[15]=500, fMultLimits[16]=600; fMultLimits[17]=700; fMultLimits[18]=850; fMultLimits[19]=1050;
550 fMultLimits[20]=2000;
553 if(fPbPbcase && fCentBinLowLimit < 6) {// PbPb 0-30%, was 0-50%
554 fMultLimit=kMultLimitPbPb;
556 fQcut[0]=0.1;//pi-pi, pi-k, pi-p
558 fQcut[2]=0.6;//the rest
559 fNormQcutLow[0] = 0.15;//0.15
560 fNormQcutHigh[0] = 0.175;//0.175
561 fNormQcutLow[1] = 1.34;//1.34
562 fNormQcutHigh[1] = 1.4;//1.4
563 fNormQcutLow[2] = 1.1;//1.1
564 fNormQcutHigh[2] = 1.4;//1.4
568 fQupperBound = fQcut[0];
573 }else if(fPbPbcase && fCentBinLowLimit >= 6) {// PbPb 30-100%, was 50-100%
574 fMultLimit=kMultLimitPbPb;
576 fQcut[0]=0.2;//pi-pi, pi-k, pi-p
578 fQcut[2]=1.2;//the rest
579 fNormQcutLow[0] = 0.3;//0.15
580 fNormQcutHigh[0] = 0.35;//0.175
581 fNormQcutLow[1] = 1.34;//1.34
582 fNormQcutHigh[1] = 1.4;//1.4
583 fNormQcutLow[2] = 1.1;//1.1
584 fNormQcutHigh[2] = 1.4;//1.4
588 fQupperBound = fQcut[0];
594 fMultLimit=kMultLimitPP;
599 fNormQcutLow[0] = 1.0;
600 fNormQcutHigh[0] = 1.2;// 1.5
601 fNormQcutLow[1] = 1.0;
602 fNormQcutHigh[1] = 1.2;
603 fNormQcutLow[2] = 1.0;
604 fNormQcutHigh[2] = 1.2;
608 fQupperBound = 0.4;// was 0.4
620 fEC = new AliChaoticityEventCollection **[fZvertexBins];
621 for(UShort_t i=0; i<fZvertexBins; i++){
623 fEC[i] = new AliChaoticityEventCollection *[fMbins];
625 for(UShort_t j=0; j<fMbins; j++){
627 fEC[i][j] = new AliChaoticityEventCollection(fEventsToMix+1, fMultLimit, kPairLimit, kMCarrayLimit, fMCcase);
632 for(Int_t i=0; i<fMultLimit; i++) fDefaultsCharMult[i]='0';
633 for(Int_t i=0; i<kPairLimit; i++) fDefaultsCharSE[i]='0';
634 for(Int_t i=0; i<2*kPairLimit; i++) fDefaultsCharME[i]='0';
635 for(Int_t i=0; i<fMultLimit; i++) fDefaultsInt[i]=-1;
636 for(Int_t i=0; i<fMultLimit; i++) fPairLocationSE[i] = new TArrayI(fMultLimit,fDefaultsInt);
637 for(Int_t i=0; i<fMultLimit; i++) fPairLocationME[i] = new TArrayI(fMultLimit,fDefaultsInt);
638 for(Int_t i=0; i<kPairLimit; i++) fTripletSkip1[i] = new TArrayC(fMultLimit,fDefaultsCharSE);
639 for(Int_t i=0; i<2*kPairLimit; i++) fTripletSkip2[i] = new TArrayC(fMultLimit,fDefaultsCharME);
642 // Normalization utilities
643 for(Int_t i=0; i<fMultLimit; i++) fOtherPairLocation1[0][i] = new TArrayI(fMultLimit,fDefaultsInt);
644 for(Int_t i=0; i<fMultLimit; i++) fOtherPairLocation1[1][i] = new TArrayI(fMultLimit,fDefaultsInt);
645 for(Int_t i=0; i<fMultLimit; i++) fOtherPairLocation2[0][i] = new TArrayI(fMultLimit,fDefaultsInt);
646 for(Int_t i=0; i<fMultLimit; i++) fOtherPairLocation2[1][i] = new TArrayI(fMultLimit,fDefaultsInt);
647 for(Int_t i=0; i<fMultLimit; i++) fNormPairSwitch[0][i] = new TArrayC(fMultLimit,fDefaultsCharMult);
648 for(Int_t i=0; i<fMultLimit; i++) fNormPairSwitch[1][i] = new TArrayC(fMultLimit,fDefaultsCharMult);
649 for(Int_t i=0; i<fMultLimit; i++) fNormPairSwitch[2][i] = new TArrayC(fMultLimit,fDefaultsCharMult);
651 // Track Merging/Splitting utilities
652 for(Int_t i=0; i<fMultLimit; i++) fPairSplitCut[0][i] = new TArrayC(fMultLimit,fDefaultsCharMult);// P11
653 for(Int_t i=0; i<fMultLimit; i++) fPairSplitCut[1][i] = new TArrayC(fMultLimit,fDefaultsCharMult);// P12
654 for(Int_t i=0; i<fMultLimit; i++) fPairSplitCut[2][i] = new TArrayC(fMultLimit,fDefaultsCharMult);// P13
655 for(Int_t i=0; i<fMultLimit; i++) fPairSplitCut[3][i] = new TArrayC(fMultLimit,fDefaultsCharMult);// P23
658 fNormPairs[0] = new AliChaoticityNormPairStruct[kNormPairLimit];
659 fNormPairs[1] = new AliChaoticityNormPairStruct[kNormPairLimit];
662 fTempStruct = new AliChaoticityTrackStruct[fMultLimit];
665 fTrueMassP=0.93827, fTrueMassPi=0.13957, fTrueMassK=0.493677, fTrueMassKs=0.497614, fTrueMassLam=1.11568;
669 // Set weights, Coulomb corrections, and Momentum resolution corrections manually if not on LEGO
671 SetFSICorrelations(fLEGO);// Read in 2-particle and 3-particle FSI correlations
674 /////////////////////////////////////////////
675 /////////////////////////////////////////////
678 //________________________________________________________________________
679 void AliThreePionRadii::UserCreateOutputObjects()
684 ParInit();// Initialize my settings
687 fOutputList = new TList();
688 fOutputList->SetOwner();
690 TH3F *fVertexDist = new TH3F("fVertexDist","Vertex Distribution",20,-1,1, 20,-1,1, 600,-30,30);
691 fVertexDist->GetXaxis()->SetTitle("X Vertex (cm)");
692 fVertexDist->GetYaxis()->SetTitle("Y Vertex (cm)");
693 fVertexDist->GetZaxis()->SetTitle("Z Vertex (cm)");
694 fOutputList->Add(fVertexDist);
697 TH2F *fDCAxyDistPlus = new TH2F("fDCAxyDistPlus","DCA distribution",300,0,3., 50,0,5);
698 fOutputList->Add(fDCAxyDistPlus);
699 TH2F *fDCAzDistPlus = new TH2F("fDCAzDistPlus","DCA distribution",300,0,3., 50,0,5);
700 fOutputList->Add(fDCAzDistPlus);
701 TH2F *fDCAxyDistMinus = new TH2F("fDCAxyDistMinus","DCA distribution",300,0,3., 50,0,5);
702 fOutputList->Add(fDCAxyDistMinus);
703 TH2F *fDCAzDistMinus = new TH2F("fDCAzDistMinus","DCA distribution",300,0,3., 50,0,5);
704 fOutputList->Add(fDCAzDistMinus);
707 TH1F *fEvents1 = new TH1F("fEvents1","Events vs. fMbin",fMbins,.5,fMbins+.5);
708 fOutputList->Add(fEvents1);
709 TH1F *fEvents2 = new TH1F("fEvents2","Events vs. fMbin",fMbins,.5,fMbins+.5);
710 fOutputList->Add(fEvents2);
712 TH1F *fMultDist1 = new TH1F("fMultDist1","Multiplicity Distribution",fMultLimit,-.5,fMultLimit-.5);
713 fMultDist1->GetXaxis()->SetTitle("Multiplicity");
714 fOutputList->Add(fMultDist1);
716 TH1F *fMultDist2 = new TH1F("fMultDist2","Multiplicity Distribution",fMultLimit,-.5,fMultLimit-.5);
717 fMultDist2->GetXaxis()->SetTitle("Multiplicity");
718 fOutputList->Add(fMultDist2);
720 TH1F *fMultDist3 = new TH1F("fMultDist3","Multiplicity Distribution",fMultLimit,-.5,fMultLimit-.5);
721 fMultDist3->GetXaxis()->SetTitle("Multiplicity");
722 fOutputList->Add(fMultDist3);
724 TH3F *fPtEtaDist = new TH3F("fPtEtaDist","fPtEtaDist",2,-1.1,1.1, 300,0,3., 28,-1.4,1.4);
725 fOutputList->Add(fPtEtaDist);
727 TH3F *fPhiPtDist = new TH3F("fPhiPtDist","fPhiPtDist",2,-1.1,1.1, 120,0,2*PI, 300,0,3.);
728 fOutputList->Add(fPhiPtDist);
730 TH3F *fTOFResponse = new TH3F("fTOFResponse","TOF relative time",20,0,100, 200,0,2, 4000,-20000,20000);
731 fOutputList->Add(fTOFResponse);
732 TH3F *fTPCResponse = new TH3F("fTPCResponse","TPCsignal",20,0,100, 200,0,2, 1000,0,1000);
733 fOutputList->Add(fTPCResponse);
735 TH1F *fRejectedPairs = new TH1F("fRejectedPairs","",200,0,2);
736 fOutputList->Add(fRejectedPairs);
737 TH1I *fRejectedEvents = new TH1I("fRejectedEvents","",fMbins,0.5,fMbins+.5);
738 fOutputList->Add(fRejectedEvents);
740 TH3F *fPairsDetaDPhiNum = new TH3F("fPairsDetaDPhiNum","",10,-.5,9.5, 200,-0.2,0.2, 600,-0.3,0.3);
741 if(fMCcase) fOutputList->Add(fPairsDetaDPhiNum);
742 TH3F *fPairsDetaDPhiDen = new TH3F("fPairsDetaDPhiDen","",10,-.5,9.5, 200,-0.2,0.2, 600,-0.3,0.3);
743 if(fMCcase) fOutputList->Add(fPairsDetaDPhiDen);
744 TH3F *fPairsShareFracDPhiNum = new TH3F("fPairsShareFracDPhiNum","",10,-.5,9.5, 159,0,1, 600,-0.3,0.3);
745 if(fMCcase) fOutputList->Add(fPairsShareFracDPhiNum);
746 TH3F *fPairsShareFracDPhiDen = new TH3F("fPairsShareFracDPhiDen","",10,-.5,9.5, 159,0,1, 600,-0.3,0.3);
747 if(fMCcase) fOutputList->Add(fPairsShareFracDPhiDen);
748 TH3D* fPairsPadRowNum = new TH3D("fPairsPadRowNum","", 20,0,1, 159,0,1, 40,0,0.2);
749 if(fMCcase) fOutputList->Add(fPairsPadRowNum);
750 TH3D* fPairsPadRowDen = new TH3D("fPairsPadRowDen","", 20,0,1, 159,0,1, 40,0,0.2);
751 if(fMCcase) fOutputList->Add(fPairsPadRowDen);
755 TH3D *fPrimarySCPionPairs = new TH3D("fPrimarySCPionPairs","",fMbins,.5,fMbins+.5, 20,0,1, 20,0,0.2);
756 if(fMCcase) fOutputList->Add(fPrimarySCPionPairs);
757 TH3D *fAllSCPionPairs = new TH3D("fAllSCPionPairs","",fMbins,.5,fMbins+.5, 20,0,1, 20,0,0.2);
758 if(fMCcase) fOutputList->Add(fAllSCPionPairs);
759 TH3D *fPrimaryMCPionPairs = new TH3D("fPrimaryMCPionPairs","",fMbins,.5,fMbins+.5, 20,0,1, 20,0,0.2);
760 if(fMCcase) fOutputList->Add(fPrimaryMCPionPairs);
761 TH3D *fAllMCPionPairs = new TH3D("fAllMCPionPairs","",fMbins,.5,fMbins+.5, 20,0,1, 20,0,0.2);
762 if(fMCcase) fOutputList->Add(fAllMCPionPairs);
764 TProfile *fAvgMult = new TProfile("fAvgMult","",fMbins,.5,fMbins+.5, 0,1500,"");
765 fOutputList->Add(fAvgMult);
766 TH2D *fAvgMultHisto2D = new TH2D("fAvgMultHisto2D","",fMbins,.5,fMbins+.5, 1000,0.5,2000.5);
767 fOutputList->Add(fAvgMultHisto2D);
770 TH2D *fTrackChi2NDF = new TH2D("fTrackChi2NDF","",20,0,100, 100,0,10);
771 fOutputList->Add(fTrackChi2NDF);
772 TH2D *fTrackTPCncls = new TH2D("fTrackTPCncls","",20,0,100, 110,50,160);
773 fOutputList->Add(fTrackTPCncls);
776 TH3D *fTPNRejects1 = new TH3D("fTPNRejects1","",fQbins,0,fQupperBound, fQbins,0,fQupperBound, fQbins,0,fQupperBound);
777 fOutputList->Add(fTPNRejects1);
778 TH3D *fTPNRejects2 = new TH3D("fTPNRejects2","",fQbins,0,fQupperBound, fQbins,0,fQupperBound, fQbins,0,fQupperBound);
779 fOutputList->Add(fTPNRejects2);
780 TH3D *fTPNRejects3 = new TH3D("fTPNRejects3","",fQbins,0,fQupperBound, fQbins,0,fQupperBound, fQbins,0,fQupperBound);
781 fOutputList->Add(fTPNRejects3);
782 TH3D *fTPNRejects4 = new TH3D("fTPNRejects4","",fQbins,0,fQupperBound, fQbins,0,fQupperBound, fQbins,0,fQupperBound);
783 fOutputList->Add(fTPNRejects4);
784 TH3D *fTPNRejects5 = new TH3D("fTPNRejects5","",fQbins,0,fQupperBound, fQbins,0,fQupperBound, fQbins,0,fQupperBound);
785 fOutputList->Add(fTPNRejects5);
788 TH3D *fKt3DistTerm1 = new TH3D("fKt3DistTerm1","",fMbins,.5,fMbins+.5, 20,0,1, 20,0,0.2);
789 TH3D *fKt3DistTerm5 = new TH3D("fKt3DistTerm5","",fMbins,.5,fMbins+.5, 20,0,1, 20,0,0.2);
790 fOutputList->Add(fKt3DistTerm1);
791 fOutputList->Add(fKt3DistTerm5);
793 TH1D *fMCWeight3DTerm1SC = new TH1D("fMCWeight3DTerm1SC","", 20,0,0.2);
794 TH1D *fMCWeight3DTerm1SCden = new TH1D("fMCWeight3DTerm1SCden","", 20,0,0.2);
795 TH1D *fMCWeight3DTerm2SC = new TH1D("fMCWeight3DTerm2SC","", 20,0,0.2);
796 TH1D *fMCWeight3DTerm2SCden = new TH1D("fMCWeight3DTerm2SCden","", 20,0,0.2);
797 TH1D *fMCWeight3DTerm1MC = new TH1D("fMCWeight3DTerm1MC","", 20,0,0.2);
798 TH1D *fMCWeight3DTerm1MCden = new TH1D("fMCWeight3DTerm1MCden","", 20,0,0.2);
799 TH1D *fMCWeight3DTerm2MC = new TH1D("fMCWeight3DTerm2MC","", 20,0,0.2);
800 TH1D *fMCWeight3DTerm2MCden = new TH1D("fMCWeight3DTerm2MCden","", 20,0,0.2);
801 TH1D *fMCWeight3DTerm3MC = new TH1D("fMCWeight3DTerm3MC","", 20,0,0.2);
802 TH1D *fMCWeight3DTerm3MCden = new TH1D("fMCWeight3DTerm3MCden","", 20,0,0.2);
803 TH1D *fMCWeight3DTerm4MC = new TH1D("fMCWeight3DTerm4MC","", 20,0,0.2);
804 TH1D *fMCWeight3DTerm4MCden = new TH1D("fMCWeight3DTerm4MCden","", 20,0,0.2);
805 fOutputList->Add(fMCWeight3DTerm1SC);
806 fOutputList->Add(fMCWeight3DTerm1SCden);
807 fOutputList->Add(fMCWeight3DTerm2SC);
808 fOutputList->Add(fMCWeight3DTerm2SCden);
809 fOutputList->Add(fMCWeight3DTerm1MC);
810 fOutputList->Add(fMCWeight3DTerm1MCden);
811 fOutputList->Add(fMCWeight3DTerm2MC);
812 fOutputList->Add(fMCWeight3DTerm2MCden);
813 fOutputList->Add(fMCWeight3DTerm3MC);
814 fOutputList->Add(fMCWeight3DTerm3MCden);
815 fOutputList->Add(fMCWeight3DTerm4MC);
816 fOutputList->Add(fMCWeight3DTerm4MCden);
818 TH2D *fdNchdEtaResponse = new TH2D("fdNchdEtaResponse","",15,0,15, 15,0,15);
819 TH2D *fNpionTrueDist = new TH2D("fNpionTrueDist","",fMbins,.5,fMbins+.5, 1500,0.5,3000.5);
820 TH2D *fNchTrueDist = new TH2D("fNchTrueDist","",fMbins,.5,fMbins+.5, 1500,0.5,3000.5);
821 TProfile *fAvgRecRate = new TProfile("fAvgRecRate","",3000,0.5,3000.5, 0,3000, "");
822 if(fMCcase) fOutputList->Add(fdNchdEtaResponse);
823 if(fMCcase) fOutputList->Add(fNpionTrueDist);
824 if(fMCcase) fOutputList->Add(fNchTrueDist);
825 if(fMCcase) fOutputList->Add(fAvgRecRate);
826 TH2D *fdCentVsNchdEta = new TH2D("fdCentVsNchdEta","",fMbins,.5,fMbins+.5, 15,0,15);
827 if(fPbPbcase) fOutputList->Add(fdCentVsNchdEta);
829 TH1D *fV0TotSignal = new TH1D("fV0TotSignal","",3000, 0,30000);
830 if(fV0Mbinning) fOutputList->Add(fV0TotSignal);
832 TH1D *fExtendedQ3Histo_term1 = new TH1D("fExtendedQ3Histo_term1","",50,0,0.5);
833 TH1D *fExtendedQ3Histo_term2 = new TH1D("fExtendedQ3Histo_term2","",50,0,0.5);
834 TH1D *fExtendedQ3Histo_term5 = new TH1D("fExtendedQ3Histo_term5","",50,0,0.5);
835 fOutputList->Add(fExtendedQ3Histo_term1);
836 fOutputList->Add(fExtendedQ3Histo_term2);
837 fOutputList->Add(fExtendedQ3Histo_term5);
839 if(fPdensityPairCut){
841 for(Int_t mb=0; mb<fMbins; mb++){
842 if((mb < fCentBinLowLimit) || (mb > fCentBinHighLimit)) continue;
844 for(Int_t edB=0; edB<fEDbins; edB++){
845 if(edB >= fKt3bins) continue;
847 for(Int_t c1=0; c1<2; c1++){
848 for(Int_t c2=0; c2<2; c2++){
849 for(Int_t sc=0; sc<kSCLimit2; sc++){
850 for(Int_t term=0; term<2; term++){
852 TString *nameEx2 = new TString("Explicit2_Charge1_");
854 nameEx2->Append("_Charge2_");
856 nameEx2->Append("_SC_");
858 nameEx2->Append("_M_");
860 nameEx2->Append("_ED_");
862 nameEx2->Append("_Term_");
865 if(sc==0 || sc==3 || sc==5){
866 if( (c1+c2)==1 ) {if(c1!=0) continue;}// skip degenerate histogram
869 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);
870 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fExplicit2);
871 TString *nameEx2QW=new TString(nameEx2->Data());
872 nameEx2QW->Append("_QW");
873 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);
874 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fExplicit2QW);
875 TString *nameAvgP=new TString(nameEx2->Data());
876 nameAvgP->Append("_AvgP");
877 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,"");
878 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fAvgP);
880 // Momentum resolution histos
881 if(fMCcase && sc==0){
882 TString *nameIdeal = new TString(nameEx2->Data());
883 nameIdeal->Append("_Ideal");
884 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);
885 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fIdeal);
886 TString *nameSmeared = new TString(nameEx2->Data());
887 nameSmeared->Append("_Smeared");
888 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);
889 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fSmeared);
891 TString *nameEx2MC=new TString(nameEx2->Data());
892 nameEx2MC->Append("_MCqinv");
893 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fMCqinv = new TH1D(nameEx2MC->Data(),"",fQbinsC2,0,fQlimitC2);
894 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fMCqinv);
895 TString *nameEx2MCQW=new TString(nameEx2->Data());
896 nameEx2MCQW->Append("_MCqinvQW");
897 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fMCqinvQW = new TH1D(nameEx2MCQW->Data(),"",fQbinsC2,0,fQlimitC2);
898 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fMCqinvQW);
900 TString *nameEx2PIDpurityDen=new TString(nameEx2->Data());
901 nameEx2PIDpurityDen->Append("_PIDpurityDen");
902 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);
903 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fPIDpurityDen);
904 TString *nameEx2PIDpurityNum=new TString(nameEx2->Data());
905 nameEx2PIDpurityNum->Append("_PIDpurityNum");
906 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fPIDpurityNum = new TH2D(nameEx2PIDpurityNum->Data(),"Two Particle Distribution",20,0,1, fQbinsC2,0,fQlimitC2);
907 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fPIDpurityNum);
915 for(Int_t c3=0; c3<2; c3++){
916 for(Int_t sc=0; sc<kSCLimit3; sc++){
917 for(Int_t term=0; term<5; term++){
918 TString *nameEx3 = new TString("Explicit3_Charge1_");
920 nameEx3->Append("_Charge2_");
922 nameEx3->Append("_Charge3_");
924 nameEx3->Append("_SC_");
926 nameEx3->Append("_M_");
928 nameEx3->Append("_ED_");
930 nameEx3->Append("_Term_");
933 TString *namePC3 = new TString("PairCut3_Charge1_");
935 namePC3->Append("_Charge2_");
937 namePC3->Append("_Charge3_");
939 namePC3->Append("_SC_");
941 namePC3->Append("_M_");
943 namePC3->Append("_ED_");
945 namePC3->Append("_Term_");
948 ///////////////////////////////////////
949 // skip degenerate histograms
950 if(sc==0 || sc==6 || sc==9){// Identical species
951 if( (c1+c2+c3)==1) {if(c3!=1) continue;}
952 if( (c1+c2+c3)==2) {if(c1!=0) continue;}
954 if( (c1+c2)==1) {if(c1!=0) continue;}
955 }else {}// do nothing for pi-k-p case
957 /////////////////////////////////////////
962 if(fPdensityPairCut){
963 TString *nameNorm=new TString(namePC3->Data());
964 nameNorm->Append("_Norm");
965 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);
966 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fNorm3);
969 TString *nameQ3=new TString(namePC3->Data());
970 nameQ3->Append("_Q3");
971 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fTermsQ3 = new TH1D(nameQ3->Data(),"", 200,0,2.0);
972 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fTermsQ3);
974 TString *name3DQ=new TString(namePC3->Data());
975 name3DQ->Append("_3D");
976 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);
977 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fTerms3);
980 if(sc==0 && fMCcase==kTRUE){
981 TString *name3DMomResIdeal=new TString(namePC3->Data());
982 name3DMomResIdeal->Append("_Ideal");
983 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fIdeal = new TH1D(name3DMomResIdeal->Data(),"", 200,0,2.0);
984 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fIdeal);
985 TString *name3DMomResSmeared=new TString(namePC3->Data());
986 name3DMomResSmeared->Append("_Smeared");
987 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fSmeared = new TH1D(name3DMomResSmeared->Data(),"", 200,0,2.0);
988 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fSmeared);
1008 TProfile *fQsmearMean = new TProfile("fQsmearMean","",2,0.5,2.5, -0.2,0.2,"");
1009 fOutputList->Add(fQsmearMean);
1010 TProfile *fQsmearSq = new TProfile("fQsmearSq","",2,0.5,2.5, -2,2,"");
1011 fOutputList->Add(fQsmearSq);
1012 TH1D *fQDist = new TH1D("fQDist","",200,-.2,.2);
1013 fOutputList->Add(fQDist);
1017 ////////////////////////////////////
1018 ///////////////////////////////////
1020 PostData(1, fOutputList);
1023 //________________________________________________________________________
1024 void AliThreePionRadii::Exec(Option_t *)
1027 // Called for each event
1029 if(fEventCounter%1000==0) cout<<"=========== Event # "<<fEventCounter<<" ==========="<<endl;
1031 if(!fAODcase) {cout<<"ESDs not supported"<<endl; return;}
1033 fAOD = dynamic_cast<AliAODEvent*> (InputEvent());
1034 if (!fAOD) {Printf("ERROR: fAOD not available"); return;}
1039 if(fAOD->GetRunNumber() >= 136851 && fAOD->GetRunNumber() <= 139517){// 10h data
1040 Bool_t isSelected1 = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kMB);
1041 if(!isSelected1 && !fMCcase) {return;}
1043 if(fAOD->GetRunNumber() >= 167693 && fAOD->GetRunNumber() <= 170593){// 11h data
1044 Bool_t isSelected1 = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kMB);
1045 Bool_t isSelected2 = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kCentral);
1046 Bool_t isSelected3 = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kSemiCentral);
1047 if(!isSelected1 && !isSelected2 && !isSelected3 && !fMCcase) {return;}
1050 Bool_t isSelected[4]={kFALSE};
1051 isSelected[0] = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kMB);
1052 isSelected[1] = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kAnyINT);
1053 isSelected[2] = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kINT7);
1054 isSelected[3] = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kHighMult);
1055 if(!isSelected[fTriggerType]) return;
1059 ///////////////////////////////////////////////////////////
1060 const AliAODVertex *primaryVertexAOD;
1061 AliCentrality *centrality;// for AODs and ESDs
1064 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
1065 AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
1066 fPIDResponse = inputHandler->GetPIDResponse();
1069 TClonesArray *mcArray = 0x0;
1074 mcArray = (TClonesArray*)fAOD->FindListObject(AliAODMCParticle::StdBranchName());
1075 if(!mcArray || mcArray->GetEntriesFast() >= kMCarrayLimit){
1076 cout<<"No MC particle branch found or Array too large!!"<<endl;
1080 // Count true Nch at mid-rapidity
1081 for(Int_t mctrackN=0; mctrackN<mcArray->GetEntriesFast(); mctrackN++){
1082 AliAODMCParticle *mcParticle = (AliAODMCParticle*)mcArray->At(mctrackN);
1083 if(!mcParticle) continue;
1084 if(fabs(mcParticle->Eta())>0.8) continue;
1085 if(mcParticle->Charge()!=-3 && mcParticle->Charge()!=+3) continue;// x3 by convention
1086 if(mcParticle->Pt() < 0.16 || mcParticle->Pt() > 1.0) continue;
1087 if(!mcParticle->IsPrimary()) continue;
1088 if(!mcParticle->IsPhysicalPrimary()) continue;
1090 if(abs(mcParticle->GetPdgCode())==211) mcNpion++;
1097 Int_t positiveTracks=0, negativeTracks=0;
1098 Int_t myTracks=0, pionCount=0, kaonCount=0, protonCount=0;
1100 Double_t vertex[3]={0};
1102 Double_t zstep=2*10/Double_t(fZvertexBins), zstart=-10.;
1103 /////////////////////////////////////////////////
1106 Float_t centralityPercentile=0;
1107 //Float_t cStep=5.0, cStart=0;
1108 Int_t trackletMult = 0;
1110 if(fAODcase){// AOD case
1113 centrality = fAOD->GetCentrality();
1114 centralityPercentile = centrality->GetCentralityPercentile("V0M");
1115 if(centralityPercentile == 0) {/*cout<<"Centrality = 0, skipping event"<<endl;*/ return;}
1116 //if((centralityPercentile < 5*fCentBinLowLimit) || (centralityPercentile>= 5*(fCentBinHighLimit+1))) {/*cout<<"Centrality out of Range. Skipping Event"<<endl;*/ return;}
1117 cout<<"Centrality % = "<<centralityPercentile<<endl;
1119 //cout<<"AOD multiplicity = "<<fAOD->GetNumberOfTracks()<<endl;
1125 ////////////////////////////////
1127 ((TH1F*)fOutputList->FindObject("fMultDist1"))->Fill(fAOD->GetNumberOfTracks());
1128 primaryVertexAOD = fAOD->GetPrimaryVertex();
1129 vertex[0]=primaryVertexAOD->GetX(); vertex[1]=primaryVertexAOD->GetY(); vertex[2]=primaryVertexAOD->GetZ();
1131 if(fabs(vertex[2]) > 10) {/*cout<<"Zvertex Out of Range. Skip Event"<<endl;*/ return;} // Z-Vertex Cut
1132 ((TH3F*)fOutputList->FindObject("fVertexDist"))->Fill(vertex[0], vertex[1], vertex[2]);
1134 if(fAOD->IsPileupFromSPD()) {/*cout<<"PileUpEvent. Skip Event"<<endl;*/ return;} // Reject Pile-up events
1135 if(primaryVertexAOD->GetNContributors() < 1) {/*cout<<"Bad Vertex. Skip Event"<<endl;*/ return;}
1137 ((TH1F*)fOutputList->FindObject("fMultDist2"))->Fill(fAOD->GetNumberOfTracks());
1139 fBfield = fAOD->GetMagneticField();
1141 for(Int_t i=0; i<fZvertexBins; i++){
1142 if( (vertex[2] >= zstart+i*zstep) && (vertex[2] < zstart+(i+1)*zstep) ){
1148 AliAODTracklets *tracklets = (AliAODTracklets*)fAOD->GetTracklets();
1149 for(Int_t trackletN=0; trackletN<tracklets->GetNumberOfTracklets(); trackletN++){
1150 if(tracklets->GetTheta(trackletN) > 1.0904 && tracklets->GetTheta(trackletN) < 2.0512) trackletMult++;// |eta|<0.5 tracklets
1153 //cout<<fAOD->GetFiredTriggerClasses()<<endl;
1154 /////////////////////////////
1155 // Create Shuffled index list
1156 Int_t randomIndex[fAOD->GetNumberOfTracks()];
1157 for (Int_t i = 0; i < fAOD->GetNumberOfTracks(); i++) randomIndex[i]=i;
1158 Shuffle(randomIndex,0,fAOD->GetNumberOfTracks()-1);
1159 /////////////////////////////
1162 for (Int_t i = 0; i < fAOD->GetNumberOfTracks(); i++) {
1163 AliAODTrack* aodtrack = fAOD->GetTrack(randomIndex[i]);
1164 if (!aodtrack) continue;
1165 if(myTracks >= fMultLimit) {cout<<"More tracks than Track Limit"<<endl; return;}
1167 status=aodtrack->GetStatus();
1169 if(!aodtrack->TestFilterBit(BIT(7))) continue;// AOD filterBit cut
1171 // FilterBit Overlap Check
1172 if(fFilterBit != 7){
1173 Bool_t goodTrackOtherFB = kFALSE;
1174 if(fMCcase && fAOD->GetRunNumber()<=126437) goodTrackOtherFB=kTRUE;// FB7 to FB5 mapping in 10f6a MC does not work
1176 for (Int_t j = 0; j < fAOD->GetNumberOfTracks(); j++) {
1177 AliAODTrack* aodtrack2 = fAOD->GetTrack(randomIndex[j]);
1178 if(!aodtrack2) continue;
1179 if(!aodtrack2->TestFilterBit(BIT(fFilterBit))) continue;
1181 if(-(aodtrack->GetID()+1)==aodtrack2->GetID()) {goodTrackOtherFB=kTRUE; break;}
1184 if(!goodTrackOtherFB) continue;
1188 if(aodtrack->Pt() < 0.16) continue;
1189 if(fabs(aodtrack->Eta()) > 0.8) continue;
1192 Bool_t goodMomentum = aodtrack->GetPxPyPz( fTempStruct[myTracks].fP);
1193 if(!goodMomentum) continue;
1194 aodtrack->GetXYZ( fTempStruct[myTracks].fX);
1199 dca2[0] = sqrt( pow(fTempStruct[myTracks].fX[0] - vertex[0],2) + pow(fTempStruct[myTracks].fX[1] - vertex[1],2));
1200 dca2[1] = sqrt( pow(fTempStruct[myTracks].fX[2] - vertex[2],2));
1201 dca3d = sqrt( pow(dca2[0],2) + pow(dca2[1],2));
1203 fTempStruct[myTracks].fStatus = status;
1204 fTempStruct[myTracks].fFiltermap = aodtrack->GetFilterMap();
1205 fTempStruct[myTracks].fId = aodtrack->GetID();
1206 fTempStruct[myTracks].fLabel = aodtrack->GetLabel();
1207 fTempStruct[myTracks].fPhi = atan2(fTempStruct[myTracks].fP[1], fTempStruct[myTracks].fP[0]);
1208 if(fTempStruct[myTracks].fPhi < 0) fTempStruct[myTracks].fPhi += 2*PI;
1209 fTempStruct[myTracks].fPt = sqrt(pow(fTempStruct[myTracks].fP[0],2) + pow(fTempStruct[myTracks].fP[1],2));
1210 fTempStruct[myTracks].fMom = sqrt( pow(fTempStruct[myTracks].fPt,2) + pow(fTempStruct[myTracks].fP[2],2) );
1211 fTempStruct[myTracks].fEta = aodtrack->Eta();
1212 fTempStruct[myTracks].fCharge = aodtrack->Charge();
1213 fTempStruct[myTracks].fDCAXY = dca2[0];
1214 fTempStruct[myTracks].fDCAZ = dca2[1];
1215 fTempStruct[myTracks].fDCA = dca3d;
1216 fTempStruct[myTracks].fClusterMap = aodtrack->GetTPCClusterMap();
1217 fTempStruct[myTracks].fSharedMap = aodtrack->GetTPCSharedMap();
1221 if(fTempStruct[myTracks].fMom > 0.9999) continue;// upper P bound
1222 if(fTempStruct[myTracks].fPt > 0.9999) continue;// upper P bound
1223 if(fTempStruct[myTracks].fP[2] > 0.9999) continue;// upper P bound
1228 fTempStruct[myTracks].fElectron = kFALSE;
1229 fTempStruct[myTracks].fPion = kFALSE;
1230 fTempStruct[myTracks].fKaon = kFALSE;
1231 fTempStruct[myTracks].fProton = kFALSE;
1233 Float_t nSigmaTPC[5];
1234 Float_t nSigmaTOF[5];
1235 nSigmaTPC[0]=10; nSigmaTPC[1]=10; nSigmaTPC[2]=10; nSigmaTPC[3]=10; nSigmaTPC[4]=10;
1236 nSigmaTOF[0]=10; nSigmaTOF[1]=10; nSigmaTOF[2]=10; nSigmaTOF[3]=10; nSigmaTOF[4]=10;
1237 fTempStruct[myTracks].fTOFhit = kFALSE;// default
1238 Float_t signalTPC=0, signalTOF=0;
1239 Double_t integratedTimesTOF[10]={0};
1241 Bool_t DoPIDWorkAround=kTRUE;
1242 //if(fFilterBit == 7) DoPIDWorkAround=kTRUE;
1243 if(fMCcase && !fPbPbcase) DoPIDWorkAround=kFALSE;
1244 if(DoPIDWorkAround==kFALSE && fabs(fPIDResponse->NumberOfSigmasTPC(aodtrack,AliPID::kPion)) < 900) {
1245 nSigmaTPC[0]=fabs(fPIDResponse->NumberOfSigmasTPC(aodtrack,AliPID::kElectron));
1246 nSigmaTPC[1]=fabs(fPIDResponse->NumberOfSigmasTPC(aodtrack,AliPID::kMuon));
1247 nSigmaTPC[2]=fabs(fPIDResponse->NumberOfSigmasTPC(aodtrack,AliPID::kPion));
1248 nSigmaTPC[3]=fabs(fPIDResponse->NumberOfSigmasTPC(aodtrack,AliPID::kKaon));
1249 nSigmaTPC[4]=fabs(fPIDResponse->NumberOfSigmasTPC(aodtrack,AliPID::kProton));
1251 nSigmaTOF[0]=fabs(fPIDResponse->NumberOfSigmasTOF(aodtrack,AliPID::kElectron));
1252 nSigmaTOF[1]=fabs(fPIDResponse->NumberOfSigmasTOF(aodtrack,AliPID::kMuon));
1253 nSigmaTOF[2]=fabs(fPIDResponse->NumberOfSigmasTOF(aodtrack,AliPID::kPion));
1254 nSigmaTOF[3]=fabs(fPIDResponse->NumberOfSigmasTOF(aodtrack,AliPID::kKaon));
1255 nSigmaTOF[4]=fabs(fPIDResponse->NumberOfSigmasTOF(aodtrack,AliPID::kProton));
1256 signalTPC = aodtrack->GetTPCsignal();
1257 if( (status&AliESDtrack::kTOFpid)!=0 && (status&AliESDtrack::kTIME)!=0 && (status&AliESDtrack::kTOFout)!=0 && (status&AliESDtrack::kTOFmismatch)<=0){// good tof hit
1258 fTempStruct[myTracks].fTOFhit = kTRUE;
1259 signalTOF = aodtrack->GetTOFsignal();
1260 aodtrack->GetIntegratedTimes(integratedTimesTOF);
1261 }else fTempStruct[myTracks].fTOFhit = kFALSE;
1263 }else {// FilterBit 7 PID workaround
1265 for(Int_t j = 0; j < fAOD->GetNumberOfTracks(); j++) {
1266 AliAODTrack* aodTrack2 = fAOD->GetTrack(j);
1267 if (!aodTrack2) continue;
1268 if(aodtrack->GetID() != (-aodTrack2->GetID() - 1)) continue;// (-aodTrack2->GetID() - 1)
1270 UInt_t status2=aodTrack2->GetStatus();
1272 nSigmaTPC[0]=fabs(fPIDResponse->NumberOfSigmasTPC(aodTrack2,AliPID::kElectron));
1273 nSigmaTPC[1]=fabs(fPIDResponse->NumberOfSigmasTPC(aodTrack2,AliPID::kMuon));
1274 nSigmaTPC[2]=fabs(fPIDResponse->NumberOfSigmasTPC(aodTrack2,AliPID::kPion));
1275 nSigmaTPC[3]=fabs(fPIDResponse->NumberOfSigmasTPC(aodTrack2,AliPID::kKaon));
1276 nSigmaTPC[4]=fabs(fPIDResponse->NumberOfSigmasTPC(aodTrack2,AliPID::kProton));
1278 nSigmaTOF[0]=fabs(fPIDResponse->NumberOfSigmasTOF(aodTrack2,AliPID::kElectron));
1279 nSigmaTOF[1]=fabs(fPIDResponse->NumberOfSigmasTOF(aodTrack2,AliPID::kMuon));
1280 nSigmaTOF[2]=fabs(fPIDResponse->NumberOfSigmasTOF(aodTrack2,AliPID::kPion));
1281 nSigmaTOF[3]=fabs(fPIDResponse->NumberOfSigmasTOF(aodTrack2,AliPID::kKaon));
1282 nSigmaTOF[4]=fabs(fPIDResponse->NumberOfSigmasTOF(aodTrack2,AliPID::kProton));
1283 signalTPC = aodTrack2->GetTPCsignal();
1285 if( (status2&AliESDtrack::kTOFpid)!=0 && (status2&AliESDtrack::kTIME)!=0 && (status2&AliESDtrack::kTOFout)!=0 && (status2&AliESDtrack::kTOFmismatch)<=0){// good tof hit
1286 fTempStruct[myTracks].fTOFhit = kTRUE;
1287 signalTOF = aodTrack2->GetTOFsignal();
1288 aodTrack2->GetIntegratedTimes(integratedTimesTOF);
1289 }else fTempStruct[myTracks].fTOFhit = kFALSE;
1292 }// FilterBit 7 PID workaround
1294 //cout<<nSigmaTPC[2]<<endl;
1296 ((TH3F*)fOutputList->FindObject("fTPCResponse"))->Fill(centralityPercentile, fTempStruct[myTracks].fMom, signalTPC);
1297 if(fTempStruct[myTracks].fTOFhit) {
1298 ((TH3F*)fOutputList->FindObject("fTOFResponse"))->Fill(centralityPercentile, fTempStruct[myTracks].fMom, signalTOF - integratedTimesTOF[3]);
1302 // Use TOF if good hit and above threshold
1303 if(fTempStruct[myTracks].fTOFhit && fTempStruct[myTracks].fMom > fTPCTOFboundry){
1304 if(nSigmaTOF[0]<fSigmaCutTOF) fTempStruct[myTracks].fElectron = kTRUE;// Electron candidate
1305 if(nSigmaTOF[2]<fSigmaCutTOF) fTempStruct[myTracks].fPion = kTRUE;// Pion candidate
1306 if(nSigmaTOF[3]<fSigmaCutTOF) fTempStruct[myTracks].fKaon = kTRUE;// Kaon candidate
1307 if(nSigmaTOF[4]<fSigmaCutTOF) fTempStruct[myTracks].fProton = kTRUE;// Proton candidate
1308 }else {// TPC info instead
1309 if(nSigmaTPC[0]<fSigmaCutTPC) fTempStruct[myTracks].fElectron = kTRUE;// Electron candidate
1310 if(nSigmaTPC[2]<fSigmaCutTPC) fTempStruct[myTracks].fPion = kTRUE;// Pion candidate
1311 if(nSigmaTPC[3]<fSigmaCutTPC) fTempStruct[myTracks].fKaon = kTRUE;// Kaon candidate
1312 if(nSigmaTPC[4]<fSigmaCutTPC) fTempStruct[myTracks].fProton = kTRUE;// Proton candidate
1316 // Ensure there is only 1 candidate per track
1317 if(fTempStruct[myTracks].fElectron && fTempStruct[myTracks].fMom < 0.45) continue;// Remove electron band
1318 if(!fTempStruct[myTracks].fPion && !fTempStruct[myTracks].fKaon && !fTempStruct[myTracks].fProton) continue;
1319 if(fTempStruct[myTracks].fPion && fTempStruct[myTracks].fKaon) continue;
1320 if(fTempStruct[myTracks].fPion && fTempStruct[myTracks].fProton) continue;
1321 if(fTempStruct[myTracks].fKaon && fTempStruct[myTracks].fProton) continue;
1322 if(fTempStruct[myTracks].fPion && fTempStruct[myTracks].fKaon && fTempStruct[myTracks].fProton) continue;
1323 ////////////////////////
1324 if(fTempStruct[myTracks].fProton && fTempStruct[myTracks].fMom < 0.25) continue;//extra cut for protons
1326 if(!fTempStruct[myTracks].fPion) continue;// only pions
1330 if(fTempStruct[myTracks].fCharge==+1) {
1331 ((TH2F*)fOutputList->FindObject("fDCAxyDistPlus"))->Fill(fTempStruct[myTracks].fPt, dca2[0]);
1332 ((TH2F*)fOutputList->FindObject("fDCAzDistPlus"))->Fill(fTempStruct[myTracks].fPt, dca2[1]);
1334 ((TH2F*)fOutputList->FindObject("fDCAxyDistMinus"))->Fill(fTempStruct[myTracks].fPt, dca2[0]);
1335 ((TH2F*)fOutputList->FindObject("fDCAzDistMinus"))->Fill(fTempStruct[myTracks].fPt, dca2[1]);
1338 ((TH3F*)fOutputList->FindObject("fPhiPtDist"))->Fill(aodtrack->Charge(), aodtrack->Phi(), aodtrack->Pt());
1339 ((TH3F*)fOutputList->FindObject("fPtEtaDist"))->Fill(aodtrack->Charge(), aodtrack->Pt(), aodtrack->Eta());
1343 if(fTempStruct[myTracks].fPion) {// pions
1344 fTempStruct[myTracks].fEaccepted = sqrt(pow(fTempStruct[myTracks].fMom,2) + pow(fTrueMassPi,2));
1345 fTempStruct[myTracks].fKey = 1;
1346 }else if(fTempStruct[myTracks].fKaon){// kaons
1347 fTempStruct[myTracks].fEaccepted = sqrt(pow(fTempStruct[myTracks].fMom,2) + pow(fTrueMassK,2));;
1348 fTempStruct[myTracks].fKey = 10;
1350 fTempStruct[myTracks].fEaccepted = sqrt(pow(fTempStruct[myTracks].fMom,2) + pow(fTrueMassP,2));;
1351 fTempStruct[myTracks].fKey = 100;
1355 ((TH2D*)fOutputList->FindObject("fTrackChi2NDF"))->Fill(centralityPercentile, aodtrack->Chi2perNDF());
1356 ((TH2D*)fOutputList->FindObject("fTrackTPCncls"))->Fill(centralityPercentile, aodtrack->GetTPCncls());
1357 if(aodtrack->Chi2perNDF() > fMaxChi2NDF) continue;
1358 if(aodtrack->GetTPCncls() < fMinTPCncls) continue;
1361 if(aodtrack->Charge() > 0) positiveTracks++;
1362 else negativeTracks++;
1364 if(fTempStruct[myTracks].fPion) pionCount++;
1365 if(fTempStruct[myTracks].fKaon) kaonCount++;
1366 if(fTempStruct[myTracks].fProton) protonCount++;
1371 }else {// ESD tracks
1372 cout<<"ESDs not supported currently"<<endl;
1378 ((TH1F*)fOutputList->FindObject("fMultDist3"))->Fill(myTracks);
1382 //cout<<"There are "<<myTracks<<" myTracks"<<endl;
1383 //cout<<"pionCount = "<<pionCount<<" kaonCount = "<<kaonCount<<" protonCount = "<<protonCount<<endl;
1385 /////////////////////////////////////////
1386 // Pion Multiplicity Cut (To ensure all Correlation orders are present in each event)
1387 if(myTracks < 3) {/*cout<<"Less than 3 tracks. Skipping Event."<<endl;*/ return;}
1388 /////////////////////////////////////////
1391 ////////////////////////////////
1392 ///////////////////////////////
1393 // Mbin determination
1396 for(Int_t i=0; i<fCentBins; i++){
1397 if( pionCount >= fMultLimits[i] && pionCount < fMultLimits[i+1]) {fMbin = fCentBins-i-1; break;}
1403 if(fMbin==0) fFSIindex = 0;//0-5%
1404 else if(fMbin==1) fFSIindex = 1;//5-10%
1405 else if(fMbin<=3) fFSIindex = 2;//10-20%
1406 else if(fMbin<=5) fFSIindex = 3;//20-30%
1407 else if(fMbin<=7) fFSIindex = 4;//30-40%
1408 else if(fMbin<=9) fFSIindex = 5;//40-50%
1409 else if(fMbin<=12) fFSIindex = 6;//40-50%
1410 else if(fMbin<=15) fFSIindex = 7;//40-50%
1411 else if(fMbin<=18) fFSIindex = 8;//40-50%
1412 else fFSIindex = 8;//90-100%
1413 }else fFSIindex = 9;// pp and pPb
1416 Bool_t useV0=kFALSE;
1417 if(fPbPbcase) useV0=kTRUE;
1418 if(!fPbPbcase && fAOD->GetRunNumber() >= 195344 && fAOD->GetRunNumber() <= 195677) useV0=kTRUE;
1420 AliAODVZERO *vZero = fAOD->GetVZEROData();
1421 Float_t vZeroAmp = vZero->GetMTotV0A() + vZero->GetMTotV0C();
1422 centrality = fAOD->GetCentrality();
1423 centralityPercentile = centrality->GetCentralityPercentile("V0M");
1424 for(Int_t i=0; i<fCentBins; i++){
1425 if(vZeroAmp/4.4 >= fMultLimits[i] && vZeroAmp/4.4 < fMultLimits[i+1]) {fMbin = fCentBins-i-1; break;}
1427 ((TH1D*)fOutputList->FindObject("fV0TotSignal"))->Fill(vZeroAmp);
1428 //cout<<centralityPercentile<<" "<<vZeroAmp<<" "<<fMbin<<endl;
1433 if(fMbin==-1) {cout<<pionCount<<" Bad Mbin+++++++++++++++++++++++++++++++++++++++++++++++++++"<<endl; return;}
1434 if(fMbin < fCentBinLowLimit || fMbin > fCentBinHighLimit) {cout<<"Mult out of range"<<endl; return;}
1436 //////////////////////////////////////////////////
1437 fEDbin=0;// Extra Dimension bin (Kt, (Kt-Psi),....)
1438 //////////////////////////////////////////////////
1440 //cout<<fMbin<<" "<<pionCount<<endl;
1442 ((TH1F*)fOutputList->FindObject("fEvents1"))->Fill(fMbin+1);
1443 ((TProfile*)fOutputList->FindObject("fAvgMult"))->Fill(fMbin+1., pionCount);
1444 ((TH2D*)fOutputList->FindObject("fAvgMultHisto2D"))->Fill(fMbin+1., pionCount);
1446 ((TH2D*)fOutputList->FindObject("fdNchdEtaResponse"))->Fill(pow(trackletMult,1/3.), pow(mcNch,1/3.));
1447 ((TH2D*)fOutputList->FindObject("fNpionTrueDist"))->Fill(fMbin+1., mcNpion);
1448 ((TH2D*)fOutputList->FindObject("fNchTrueDist"))->Fill(fMbin+1., mcNch);
1449 ((TProfile*)fOutputList->FindObject("fAvgRecRate"))->Fill(mcNpion, pionCount);
1452 ((TH2D*)fOutputList->FindObject("fdCentVsNchdEta"))->Fill(fMbin+1, pow(trackletMult,1/3.));
1455 //cout<<trackletMult<<" "<<mcNchdEta<<endl;
1457 ////////////////////////////////////
1458 // Add event to buffer if > 0 tracks
1460 fEC[zbin][fMbin]->FIFOShift();
1461 (fEvt) = fEC[zbin][fMbin]->fEvtStr;
1462 (fEvt)->fNtracks = myTracks;
1463 (fEvt)->fFillStatus = 1;
1464 for(Int_t i=0; i<myTracks; i++) (fEvt)->fTracks[i] = fTempStruct[i];
1466 (fEvt)->fMCarraySize = mcArray->GetEntriesFast();
1467 for(Int_t i=0; i<mcArray->GetEntriesFast(); i++) {
1468 AliAODMCParticle *tempMCTrack = (AliAODMCParticle*)mcArray->At(i);
1469 (fEvt)->fMCtracks[i].fPx = tempMCTrack->Px();
1470 (fEvt)->fMCtracks[i].fPy = tempMCTrack->Py();
1471 (fEvt)->fMCtracks[i].fPz = tempMCTrack->Pz();
1472 (fEvt)->fMCtracks[i].fPtot = sqrt(pow(tempMCTrack->Px(),2)+pow(tempMCTrack->Py(),2)+pow(tempMCTrack->Pz(),2));
1479 Float_t qinv12=0, qinv13=0, qinv23=0;
1480 Float_t qout=0, qside=0, qlong=0;
1481 Float_t qoutMC=0, qsideMC=0, qlongMC=0;
1482 Float_t firstQ=0, secondQ=0, thirdQ=0;
1483 Float_t firstQMC=0, secondQMC=0, thirdQMC=0;
1484 Float_t transK12=0, transK3=0;
1485 Float_t q3=0, q3MC=0;
1486 Int_t ch1=0, ch2=0, ch3=0;
1487 Short_t key1=0, key2=0, key3=0;
1488 Int_t bin1=0, bin2=0, bin3=0;
1489 Float_t pVect1[4]={0};
1490 Float_t pVect2[4]={0};
1491 Float_t pVect3[4]={0};
1492 Float_t pVect1MC[4]={0};
1493 Float_t pVect2MC[4]={0};
1494 Float_t pVect3MC[4]={0};
1495 Int_t index1=0, index2=0, index3=0;
1496 Float_t qinv12MC=0, qinv13MC=0, qinv23MC=0;
1498 AliAODMCParticle *mcParticle1=0x0;
1499 AliAODMCParticle *mcParticle2=0x0;
1501 if(fPdensityPairCut){
1502 ////////////////////
1503 Int_t pairCountSE=0, pairCountME=0;
1504 Int_t normPairCount[2]={0};
1505 Int_t numOtherPairs1[2][fMultLimit];
1506 Int_t numOtherPairs2[2][fMultLimit];
1507 Bool_t exitCode=kFALSE;
1508 Int_t tempNormFillCount[2][2][2][10][5];
1511 // reset to defaults
1512 for(Int_t i=0; i<fMultLimit; i++) {
1513 fPairLocationSE[i]->Set(fMultLimit,fDefaultsInt);
1514 fPairLocationME[i]->Set(fMultLimit,fDefaultsInt);
1516 // Normalization Utilities
1517 fOtherPairLocation1[0][i]->Set(fMultLimit,fDefaultsInt);
1518 fOtherPairLocation1[1][i]->Set(fMultLimit,fDefaultsInt);
1519 fOtherPairLocation2[0][i]->Set(fMultLimit,fDefaultsInt);
1520 fOtherPairLocation2[1][i]->Set(fMultLimit,fDefaultsInt);
1521 fNormPairSwitch[0][i]->Set(fMultLimit,fDefaultsCharMult);
1522 fNormPairSwitch[1][i]->Set(fMultLimit,fDefaultsCharMult);
1523 fNormPairSwitch[2][i]->Set(fMultLimit,fDefaultsCharMult);
1524 numOtherPairs1[0][i]=0;
1525 numOtherPairs1[1][i]=0;
1526 numOtherPairs2[0][i]=0;
1527 numOtherPairs2[1][i]=0;
1529 // Track Merging/Splitting Utilities
1530 fPairSplitCut[0][i]->Set(fMultLimit,fDefaultsCharMult);// P11
1531 fPairSplitCut[1][i]->Set(fMultLimit,fDefaultsCharMult);// P12
1532 fPairSplitCut[2][i]->Set(fMultLimit,fDefaultsCharMult);// P13
1533 fPairSplitCut[3][i]->Set(fMultLimit,fDefaultsCharMult);// P23
1536 // Reset the temp Normalization counters
1537 for(Int_t i=0; i<2; i++){// Charge1
1538 for(Int_t j=0; j<2; j++){// Charge2
1539 for(Int_t k=0; k<2; k++){// Charge3
1540 for(Int_t l=0; l<10; l++){// FillIndex (species Combination)
1541 for(Int_t m=0; m<5; m++){// Term (Cumulant term)
1542 tempNormFillCount[i][j][k][l][m] = 0;
1551 /////////////////////////////////////////////////////////////////
1552 // extended range Q3 baseline
1553 /*for(Int_t iter=0; iter<3; iter++){
1554 for (Int_t i=0; i<myTracks; i++) {
1559 if(en2!=0) start2=0;
1561 for (Int_t j=start2; j<(fEvt+en2)->fNtracks; j++) {
1562 if((fEvt)->fTracks[i].fCharge != (fEvt+en2)->fTracks[j].fCharge) continue;
1563 key1 = (fEvt)->fTracks[i].fKey;
1564 key2 = (fEvt+en2)->fTracks[j].fKey;
1565 Short_t fillIndex2 = FillIndex2part(key1+key2);
1566 pVect1[0]=(fEvt)->fTracks[i].fEaccepted; pVect2[0]=(fEvt+en2)->fTracks[j].fEaccepted;
1567 pVect1[1]=(fEvt)->fTracks[i].fP[0]; pVect2[1]=(fEvt+en2)->fTracks[j].fP[0];
1568 pVect1[2]=(fEvt)->fTracks[i].fP[1]; pVect2[2]=(fEvt+en2)->fTracks[j].fP[1];
1569 pVect1[3]=(fEvt)->fTracks[i].fP[2]; pVect2[3]=(fEvt+en2)->fTracks[j].fP[2];
1570 qinv12 = GetQinv(fillIndex2, pVect1, pVect2);
1572 if(qinv12>0.5) continue;
1573 if(!AcceptPair(&((fEvt)->fTracks[i]), &((fEvt+en2)->fTracks[j]))) continue;
1579 if(iter>0) start3=0;
1581 for (Int_t k=start3; k<(fEvt+en3)->fNtracks; k++) {
1582 if((fEvt)->fTracks[i].fCharge != (fEvt+en3)->fTracks[k].fCharge) continue;
1583 pVect3[0]=(fEvt+en3)->fTracks[k].fEaccepted;
1584 pVect3[1]=(fEvt+en3)->fTracks[k].fP[0];
1585 pVect3[2]=(fEvt+en3)->fTracks[k].fP[1];
1586 pVect3[3]=(fEvt+en3)->fTracks[k].fP[2];
1587 qinv13 = GetQinv(fillIndex2, pVect1, pVect3);
1588 if(qinv13>0.5) continue;
1589 qinv23 = GetQinv(fillIndex2, pVect2, pVect3);
1590 if(qinv23>0.5) continue;
1591 if(!AcceptPair(&((fEvt)->fTracks[i]), &((fEvt+en3)->fTracks[k]))) continue;
1592 if(!AcceptPair(&((fEvt+en2)->fTracks[j]), &((fEvt+en3)->fTracks[k]))) continue;
1594 q3 = sqrt(pow(qinv12,2) + pow(qinv13,2) + pow(qinv23,2));
1596 if(iter==0) ((TH1D*)fOutputList->FindObject("fExtendedQ3Histo_term1"))->Fill(q3);
1597 if(iter==1) ((TH1D*)fOutputList->FindObject("fExtendedQ3Histo_term2"))->Fill(q3);
1598 if(iter==2) ((TH1D*)fOutputList->FindObject("fExtendedQ3Histo_term5"))->Fill(q3);
1605 ///////////////////////////////////////////////////////
1606 // Start the pairing process
1610 for (Int_t i=0; i<myTracks; i++) {
1615 for (Int_t j=i+1; j<(fEvt+en2)->fNtracks; j++) {
1617 key1 = (fEvt)->fTracks[i].fKey;
1618 key2 = (fEvt+en2)->fTracks[j].fKey;
1619 Short_t fillIndex2 = FillIndex2part(key1+key2);
1620 Short_t qCutBin = SetQcutBin(fillIndex2);
1621 Short_t normBin = SetNormBin(fillIndex2);
1622 pVect1[0]=(fEvt)->fTracks[i].fEaccepted; pVect2[0]=(fEvt+en2)->fTracks[j].fEaccepted;
1623 pVect1[1]=(fEvt)->fTracks[i].fP[0]; pVect2[1]=(fEvt+en2)->fTracks[j].fP[0];
1624 pVect1[2]=(fEvt)->fTracks[i].fP[1]; pVect2[2]=(fEvt+en2)->fTracks[j].fP[1];
1625 pVect1[3]=(fEvt)->fTracks[i].fP[2]; pVect2[3]=(fEvt+en2)->fTracks[j].fP[2];
1629 qinv12 = GetQinv(fillIndex2, pVect1, pVect2);
1630 GetQosl(pVect1, pVect2, qout, qside, qlong);
1631 transK12 = sqrt(pow(pVect1[1]+pVect2[1],2) + pow(pVect1[2]+pVect2[2],2))/2.;
1636 ///////////////////////////////
1637 ch1 = Int_t(((fEvt)->fTracks[i].fCharge + 1)/2.);
1638 ch2 = Int_t(((fEvt+en2)->fTracks[j].fCharge + 1)/2.);
1639 SetFillBins2(fillIndex2, key1, key2, ch1, ch2, bin1, bin2);
1641 if(fMCcase && ch1==ch2 && fMbin==0 && qinv12<0.2){
1642 //////////////////////////
1643 // pad-row method testing
1644 Float_t coeff = (5)*0.2*(0.18/1.2);// 5 to evaluate at 1.0m in TPC
1645 Float_t phi1 = (fEvt)->fTracks[i].fPhi - asin((fEvt)->fTracks[i].fCharge*(0.1*fBfield)*coeff/(fEvt)->fTracks[i].fPt);
1646 if(phi1 > 2*PI) phi1 -= 2*PI;
1647 if(phi1 < 0) phi1 += 2*PI;
1648 Float_t phi2 = (fEvt+en2)->fTracks[j].fPhi - asin((fEvt+en2)->fTracks[j].fCharge*(0.1*fBfield)*coeff/(fEvt+en2)->fTracks[j].fPt);
1649 if(phi2 > 2*PI) phi2 -= 2*PI;
1650 if(phi2 < 0) phi2 += 2*PI;
1651 Float_t deltaphi = phi1 - phi2;
1652 if(deltaphi > PI) deltaphi -= PI;
1653 if(deltaphi < -PI) deltaphi += PI;
1655 Int_t ncl1 = (fEvt)->fTracks[i].fClusterMap.GetNbits();
1656 Int_t ncl2 = (fEvt+en2)->fTracks[j].fClusterMap.GetNbits();
1657 Float_t sumCls = 0; Float_t sumSha = 0; Float_t sumQ = 0;
1658 Double_t shfrac = 0; //Double_t qfactor = 0;
1659 for(Int_t imap = 0; imap < ncl1 && imap < ncl2; imap++) {
1660 if ((fEvt)->fTracks[i].fClusterMap.TestBitNumber(imap) && (fEvt+en2)->fTracks[j].fClusterMap.TestBitNumber(imap)) {// Both clusters
1661 if ((fEvt)->fTracks[i].fSharedMap.TestBitNumber(imap) && (fEvt+en2)->fTracks[j].fSharedMap.TestBitNumber(imap)) { // Shared
1665 else {sumQ--; sumCls+=2;}
1667 else if ((fEvt)->fTracks[i].fClusterMap.TestBitNumber(imap) || (fEvt+en2)->fTracks[j].fClusterMap.TestBitNumber(imap)) {// Non shared
1672 //qfactor = sumQ*1.0/sumCls;
1673 shfrac = sumSha*1.0/sumCls;
1675 if(fabs(deltaphi)<0.07 && fabs((fEvt)->fTracks[i].fEta-(fEvt+en2)->fTracks[j].fEta) < 0.03){
1676 ((TH3D*)fOutputList->FindObject("fPairsPadRowNum"))->Fill(transK12, shfrac, qinv12);
1679 for(Int_t rstep=0; rstep<10; rstep++){
1680 coeff = (rstep)*0.2*(0.18/1.2);
1681 phi1 = (fEvt)->fTracks[i].fPhi - asin((fEvt)->fTracks[i].fCharge*(0.1*fBfield)*coeff/(fEvt)->fTracks[i].fPt);
1682 if(phi1 > 2*PI) phi1 -= 2*PI;
1683 if(phi1 < 0) phi1 += 2*PI;
1684 phi2 = (fEvt+en2)->fTracks[j].fPhi - asin((fEvt+en2)->fTracks[j].fCharge*(0.1*fBfield)*coeff/(fEvt+en2)->fTracks[j].fPt);
1685 if(phi2 > 2*PI) phi2 -= 2*PI;
1686 if(phi2 < 0) phi2 += 2*PI;
1687 deltaphi = phi1 - phi2;
1688 if(deltaphi > PI) deltaphi -= PI;
1689 if(deltaphi < -PI) deltaphi += PI;
1691 if(fabs((fEvt)->fTracks[i].fEta-(fEvt+en2)->fTracks[j].fEta) < 0.03){
1692 ((TH3F*)fOutputList->FindObject("fPairsShareFracDPhiNum"))->Fill(rstep, shfrac, deltaphi);
1694 //if(shfrac < 0.05){
1695 ((TH3F*)fOutputList->FindObject("fPairsDetaDPhiNum"))->Fill(rstep, (fEvt)->fTracks[i].fEta-(fEvt+en2)->fTracks[j].fEta, deltaphi);
1700 }// MCcase and pair selection
1702 // Pair Splitting/Merging cut
1703 if(qinv12 < fQLowerCut) continue;// remove unwanted low-q pairs (also a type of track splitting/merging cut)
1705 if(!AcceptPair(&((fEvt)->fTracks[i]), &((fEvt+en2)->fTracks[j]))) {
1706 fPairSplitCut[0][i]->AddAt('1',j);
1707 ((TH1F*)fOutputList->FindObject("fRejectedPairs"))->Fill(qinv12);
1713 if(fMCcase && fillIndex2==0){
1715 // Check that label does not exceed stack size
1716 if((fEvt)->fTracks[i].fLabel < (fEvt)->fMCarraySize && (fEvt+en2)->fTracks[j].fLabel < (fEvt+en2)->fMCarraySize){
1717 pVect1MC[0]=sqrt(pow((fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPtot,2)+pow(fTrueMassPi,2));
1718 pVect2MC[0]=sqrt(pow((fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPtot,2)+pow(fTrueMassPi,2));
1719 pVect1MC[1]=(fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPx; pVect2MC[1]=(fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPx;
1720 pVect1MC[2]=(fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPy; pVect2MC[2]=(fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPy;
1721 pVect1MC[3]=(fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPz; pVect2MC[3]=(fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPz;
1722 qinv12MC = GetQinv(fillIndex2, pVect1MC, pVect2MC);
1723 GetQosl(pVect1MC, pVect2MC, qoutMC, qsideMC, qlongMC);
1724 if(qinv12<0.1 && ch1==ch2) {
1725 ((TProfile*)fOutputList->FindObject("fQsmearMean"))->Fill(1.,qinv12-qinv12MC);
1726 ((TProfile*)fOutputList->FindObject("fQsmearSq"))->Fill(1.,1000.*pow(qinv12-qinv12MC,2));
1727 ((TH1D*)fOutputList->FindObject("fQDist"))->Fill(qinv12-qinv12MC);
1732 mcParticle1 = (AliAODMCParticle*)mcArray->At(abs((fEvt)->fTracks[i].fLabel));
1733 mcParticle2 = (AliAODMCParticle*)mcArray->At(abs((fEvt+en2)->fTracks[j].fLabel));
1736 // secondary contamination
1737 if(abs(mcParticle1->GetPdgCode())==211 && abs(mcParticle2->GetPdgCode())==211){
1739 ((TH3D*)fOutputList->FindObject("fAllSCPionPairs"))->Fill(fMbin+1, transK12, qinv12);
1740 if(!mcParticle1->IsSecondaryFromWeakDecay() && !mcParticle2->IsSecondaryFromWeakDecay()) {
1741 ((TH3D*)fOutputList->FindObject("fPrimarySCPionPairs"))->Fill(fMbin+1, transK12, qinv12);
1744 ((TH3D*)fOutputList->FindObject("fAllMCPionPairs"))->Fill(fMbin+1, transK12, qinv12);
1745 if(!mcParticle1->IsSecondaryFromWeakDecay() && !mcParticle2->IsSecondaryFromWeakDecay()) {
1746 ((TH3D*)fOutputList->FindObject("fPrimaryMCPionPairs"))->Fill(fMbin+1, transK12, qinv12);
1752 if(fFSIindex<=1) rForQW=10;
1753 else if(fFSIindex==2) rForQW=9;
1754 else if(fFSIindex==3) rForQW=8;
1755 else if(fFSIindex==4) rForQW=7;
1756 else if(fFSIindex==5) rForQW=6;
1757 else if(fFSIindex==6) rForQW=5;
1758 else if(fFSIindex==7) rForQW=4;
1759 else if(fFSIindex==8) rForQW=3;
1762 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].fMCqinv->Fill(qinv12MC, MCWeight(ch1,ch2,rForQW,10,qinv12MC));// was 4,5
1763 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
1765 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].fPIDpurityDen->Fill(transK12, qinv12);
1766 if(abs(mcParticle1->GetPdgCode())==211 && abs(mcParticle2->GetPdgCode())==211){// Pions
1767 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].fPIDpurityNum->Fill(transK12, qinv12);
1773 //////////////////////////////////////////
1775 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].fExplicit2->Fill(transK12, qinv12);
1776 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].fExplicit2QW->Fill(transK12, qinv12, qinv12);
1777 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].fAvgP->Fill(transK12, qinv12, (fEvt)->fTracks[i].fMom);
1778 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].fAvgP->Fill(transK12, qinv12, (fEvt+en2)->fTracks[j].fMom);
1781 //////////////////////////////////////////
1785 // exit out of loop if there are too many pairs
1786 if(pairCountSE >= kPairLimit) {exitCode=kTRUE; continue;}// Too many SE pairs
1787 if(exitCode) continue;
1789 //////////////////////////
1791 if(qinv12 <= fQcut[qCutBin]) {
1793 ///////////////////////////
1795 (fEvt)->fPairsSE[pairCountSE].fP1[0] = (fEvt)->fTracks[i].fP[0];
1796 (fEvt)->fPairsSE[pairCountSE].fP1[1] = (fEvt)->fTracks[i].fP[1];
1797 (fEvt)->fPairsSE[pairCountSE].fP1[2] = (fEvt)->fTracks[i].fP[2];
1798 (fEvt)->fPairsSE[pairCountSE].fE1 = (fEvt)->fTracks[i].fEaccepted;
1799 (fEvt)->fPairsSE[pairCountSE].fCharge1 = (fEvt)->fTracks[i].fCharge;
1800 (fEvt)->fPairsSE[pairCountSE].fIndex1 = i;
1801 (fEvt)->fPairsSE[pairCountSE].fKey1 = key1;
1802 (fEvt)->fPairsSE[pairCountSE].fLabel1 = (fEvt)->fTracks[i].fLabel;
1803 if(fMCcase && ((fEvt)->fTracks[i].fLabel < (fEvt)->fMCarraySize)){
1804 (fEvt)->fPairsSE[pairCountSE].fP1MC[0] = (fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPx;
1805 (fEvt)->fPairsSE[pairCountSE].fP1MC[1] = (fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPy;
1806 (fEvt)->fPairsSE[pairCountSE].fP1MC[2] = (fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPz;
1809 (fEvt)->fPairsSE[pairCountSE].fP2[0] = (fEvt+en2)->fTracks[j].fP[0];
1810 (fEvt)->fPairsSE[pairCountSE].fP2[1] = (fEvt+en2)->fTracks[j].fP[1];
1811 (fEvt)->fPairsSE[pairCountSE].fP2[2] = (fEvt+en2)->fTracks[j].fP[2];
1812 (fEvt)->fPairsSE[pairCountSE].fE2 = (fEvt+en2)->fTracks[j].fEaccepted;
1813 (fEvt)->fPairsSE[pairCountSE].fCharge2 = (fEvt+en2)->fTracks[j].fCharge;
1814 (fEvt)->fPairsSE[pairCountSE].fIndex2 = j;
1815 (fEvt)->fPairsSE[pairCountSE].fKey2 = key2;
1816 (fEvt)->fPairsSE[pairCountSE].fLabel2 = (fEvt+en2)->fTracks[j].fLabel;
1817 if(fMCcase && ((fEvt+en2)->fTracks[j].fLabel < (fEvt+en2)->fMCarraySize)){
1818 (fEvt)->fPairsSE[pairCountSE].fP2MC[0] = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPx;
1819 (fEvt)->fPairsSE[pairCountSE].fP2MC[1] = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPy;
1820 (fEvt)->fPairsSE[pairCountSE].fP2MC[2] = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPz;
1823 (fEvt)->fPairsSE[pairCountSE].fQinv = qinv12;
1825 fPairLocationSE[i]->AddAt(pairCountSE,j);
1832 /////////////////////////////////////////////////////////
1833 // Normalization Region
1835 if((qinv12 >= fNormQcutLow[normBin]) && (qinv12 < fNormQcutHigh[normBin])){
1837 fNormPairs[en2][normPairCount[en2]].fCharge1 = (fEvt)->fTracks[i].fCharge;
1838 fNormPairs[en2][normPairCount[en2]].fIndex1 = i;
1839 fNormPairs[en2][normPairCount[en2]].fKey1 = (fEvt)->fTracks[i].fKey;
1841 fNormPairs[en2][normPairCount[en2]].fCharge2 = (fEvt+en2)->fTracks[j].fCharge;
1842 fNormPairs[en2][normPairCount[en2]].fIndex2 = j;
1843 fNormPairs[en2][normPairCount[en2]].fKey2 = (fEvt+en2)->fTracks[j].fKey;
1846 //other past pairs with particle j
1847 for(Int_t pastpair=0; pastpair<numOtherPairs2[0][j]; pastpair++){
1848 Int_t locationOtherPair = fOtherPairLocation2[0][j]->At(pastpair);
1849 if(locationOtherPair < 0) continue;// no pair there
1850 Int_t indexOther1 = i;
1851 Int_t indexOther2 = fNormPairs[0][ locationOtherPair ].fIndex1;
1853 // Both possible orderings of other indexes
1854 if( (fNormPairSwitch[0][indexOther1]->At(indexOther2)=='1') || (fNormPairSwitch[0][indexOther2]->At(indexOther1)=='1')) {
1856 // 1 and 2 are from SE
1857 ch3 = Int_t((fNormPairs[0][ locationOtherPair ].fCharge1 + 1)/2.);
1858 key3 = fNormPairs[0][ locationOtherPair ].fKey1;
1859 Short_t fillIndex3 = FillIndex3part(key1+key2+key3);
1860 SetFillBins3(fillIndex3, key1, key2, key3, ch1, ch2, ch3, 0, bin1, bin2, bin3, fDummyB, fDummyB, fDummyB);
1862 tempNormFillCount[bin1][bin2][bin3][fillIndex3][0]++;
1865 }// pastpair P11 loop
1868 fNormPairSwitch[en2][i]->AddAt('1',j);
1869 fOtherPairLocation1[en2][i]->AddAt(normPairCount[en2], numOtherPairs1[en2][i]);// location of otherpair with i as 1st particle
1870 fOtherPairLocation2[en2][j]->AddAt(normPairCount[en2], numOtherPairs2[en2][j]);// location of otherpair with j as 2nd particle
1872 numOtherPairs1[en2][i]++;
1873 numOtherPairs2[en2][j]++;
1876 normPairCount[en2]++;
1877 if(normPairCount[en2] >= kNormPairLimit) exitCode=kTRUE;
1886 //////////////////////////////////////////////
1889 for (Int_t i=0; i<myTracks; i++) {
1894 for (Int_t j=0; j<(fEvt+en2)->fNtracks; j++) {
1896 key1 = (fEvt)->fTracks[i].fKey;
1897 key2 = (fEvt+en2)->fTracks[j].fKey;
1898 Short_t fillIndex2 = FillIndex2part(key1+key2);
1899 Short_t qCutBin = SetQcutBin(fillIndex2);
1900 Short_t normBin = SetNormBin(fillIndex2);
1901 pVect1[0]=(fEvt)->fTracks[i].fEaccepted; pVect2[0]=(fEvt+en2)->fTracks[j].fEaccepted;
1902 pVect1[1]=(fEvt)->fTracks[i].fP[0]; pVect2[1]=(fEvt+en2)->fTracks[j].fP[0];
1903 pVect1[2]=(fEvt)->fTracks[i].fP[1]; pVect2[2]=(fEvt+en2)->fTracks[j].fP[1];
1904 pVect1[3]=(fEvt)->fTracks[i].fP[2]; pVect2[3]=(fEvt+en2)->fTracks[j].fP[2];
1906 qinv12 = GetQinv(fillIndex2, pVect1, pVect2);
1907 GetQosl(pVect1, pVect2, qout, qside, qlong);
1908 transK12 = sqrt(pow(pVect1[1]+pVect2[1],2) + pow(pVect1[2]+pVect2[2],2))/2.;
1909 //if(transK12 <= 0.35) fEDbin=0;
1914 ///////////////////////////////
1915 ch1 = Int_t(((fEvt)->fTracks[i].fCharge + 1)/2.);
1916 ch2 = Int_t(((fEvt+en2)->fTracks[j].fCharge + 1)/2.);
1917 SetFillBins2(fillIndex2, key1, key2, ch1, ch2, bin1, bin2);
1920 if((fEvt)->fTracks[i].fLabel < (fEvt)->fMCarraySize && (fEvt+en2)->fTracks[j].fLabel < (fEvt+en2)->fMCarraySize){
1921 pVect1MC[0]=sqrt(pow((fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPtot,2)+pow(fTrueMassPi,2));
1922 pVect2MC[0]=sqrt(pow((fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPtot,2)+pow(fTrueMassPi,2));
1923 pVect1MC[1]=(fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPx; pVect2MC[1]=(fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPx;
1924 pVect1MC[2]=(fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPy; pVect2MC[2]=(fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPy;
1925 pVect1MC[3]=(fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPz; pVect2MC[3]=(fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPz;
1926 qinv12MC = GetQinv(fillIndex2, pVect1MC, pVect2MC);
1929 for(Int_t rIter=0; rIter<fRVALUES; rIter++){
1930 for(Int_t myDampIt=0; myDampIt<kNDampValues; myDampIt++){
1931 Int_t denIndex = rIter*kNDampValues + myDampIt;
1932 Float_t WInput = MCWeight(ch1,ch2, rIter+kRmin, myDampIt, qinv12MC);
1933 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[0].fIdeal->Fill(denIndex, qinv12MC, WInput);
1934 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[1].fIdeal->Fill(denIndex, qinv12MC);
1935 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[0].fSmeared->Fill(denIndex, qinv12, WInput);
1936 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[1].fSmeared->Fill(denIndex, qinv12);
1941 /////////////////////////////////////////////////////
1942 if(qinv12 <= fQcut[qCutBin]) {// 3-particle MRC
1945 Short_t fillIndex3 = 0;
1946 key1=1; key2=1; key3=1;
1949 for (Int_t k=0; k<(fEvt+en3)->fNtracks; k++) {
1950 if((fEvt+en3)->fTracks[k].fLabel < (fEvt+en3)->fMCarraySize){
1951 ch3 = Int_t(((fEvt+en3)->fTracks[k].fCharge + 1)/2.);
1952 pVect3[0]=(fEvt+en3)->fTracks[k].fEaccepted;
1953 pVect3[1]=(fEvt+en3)->fTracks[k].fP[0];
1954 pVect3[2]=(fEvt+en3)->fTracks[k].fP[1];
1955 pVect3[3]=(fEvt+en3)->fTracks[k].fP[2];
1956 qinv13 = GetQinv(0, pVect1, pVect3);
1957 qinv23 = GetQinv(0, pVect2, pVect3);
1958 q3 = sqrt(pow(qinv12,2)+pow(qinv13,2)+pow(qinv23,2));
1960 if(qinv13 > fQcut[qCutBin] || qinv23 > fQcut[qCutBin]) continue;
1963 pVect3MC[0]=sqrt(pow((fEvt+en3)->fMCtracks[abs((fEvt+en3)->fTracks[k].fLabel)].fPtot,2)+pow(fTrueMassPi,2));
1964 pVect3MC[1]=(fEvt+en3)->fMCtracks[abs((fEvt+en3)->fTracks[k].fLabel)].fPx;
1965 pVect3MC[2]=(fEvt+en3)->fMCtracks[abs((fEvt+en3)->fTracks[k].fLabel)].fPy;
1966 pVect3MC[3]=(fEvt+en3)->fMCtracks[abs((fEvt+en3)->fTracks[k].fLabel)].fPz;
1967 qinv13MC = GetQinv(0, pVect1MC, pVect3MC);
1968 qinv23MC = GetQinv(0, pVect2MC, pVect3MC);
1971 q3MC = sqrt(pow(qinv12MC,2)+pow(qinv13MC,2)+pow(qinv23MC,2));
1972 transK3 = sqrt( pow(pVect1[1]+pVect2[1]+pVect3[1],2) + pow(pVect1[2]+pVect2[2]+pVect3[2],2))/3.;
1976 // 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.
1977 Bool_t fill2=kFALSE, fill3=kFALSE, fill4=kFALSE;
1978 SetFillBins3(fillIndex3, key1, key2, key3, ch1, ch2, ch3, 1, bin1, bin2, bin3, fill2, fill3, fill4);
1981 for(Int_t jj=1; jj<=5; jj++){// term loop
1983 if(jj==2) {if(!fill2) continue;}//12
1984 if(jj==3) {if(!fill3) continue;}//13
1985 if(jj==4) {if(!fill4) continue;}//23
1988 ArrangeQs(fillIndex3, key1, key2, key3, ch1, ch2, ch3, qinv12, qinv13, qinv23, 1, jj, firstQ, secondQ, thirdQ);
1989 ArrangeQs(fillIndex3, key1, key2, key3, ch1, ch2, ch3, qinv12MC, qinv13MC, qinv23MC, 1, jj, firstQMC, secondQMC, thirdQMC);
1991 if(ch1==ch2 && ch1==ch3){// same charge
1992 WInput = MCWeight3D(kTRUE, jj, 10, firstQMC, secondQMC, thirdQMC);
1994 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm1SC"))->Fill(q3MC, WInput);
1995 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm1SCden"))->Fill(q3MC);
1997 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm2SC"))->Fill(q3MC, WInput);
1998 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm2SCden"))->Fill(q3MC);
2000 }else {// mixed charge
2002 WInput = MCWeight3D(kFALSE, jj, 10, firstQMC, secondQMC, thirdQMC);
2004 if(jj==1 || jj==5) WInput = MCWeight3D(kFALSE, jj, 10, thirdQMC, secondQMC, firstQMC);// thirdQMC is ss
2005 else WInput = MCWeight3D(kFALSE, 6-jj, 10, thirdQMC, secondQMC, firstQMC);
2008 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm1MC"))->Fill(q3MC, WInput);
2009 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm1MCden"))->Fill(q3MC);
2013 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm2MC"))->Fill(q3MC, WInput);
2014 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm2MCden"))->Fill(q3MC);
2016 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm3MC"))->Fill(q3MC, WInput);
2017 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm3MCden"))->Fill(q3MC);
2019 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm4MC"))->Fill(q3MC, WInput);
2020 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm4MCden"))->Fill(q3MC);
2024 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm4MC"))->Fill(q3MC, WInput);
2025 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm4MCden"))->Fill(q3MC);
2027 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm3MC"))->Fill(q3MC, WInput);
2028 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm3MCden"))->Fill(q3MC);
2030 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm2MC"))->Fill(q3MC, WInput);
2031 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm2MCden"))->Fill(q3MC);
2039 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[jj-1].fIdeal->Fill(q3MC, WInput);
2040 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[jj-1].fSmeared->Fill(q3, WInput);
2044 }// MCarray check, 3rd particle
2047 }// TabulatePairs Check
2049 }// MCarray check, 1st and 2nd particle
2051 // reset key's and fill bins (they were altered for 3 particle MRC calculation)
2052 key1 = (fEvt)->fTracks[i].fKey;
2053 key2 = (fEvt+en2)->fTracks[j].fKey;
2054 SetFillBins2(fillIndex2, key1, key2, ch1, ch2, bin1, bin2);
2057 if(ch1==ch2 && fMbin==0 && qinv12<0.2){
2058 //////////////////////////
2059 // pad-row method testing
2060 Float_t coeff = (5)*0.2*(0.18/1.2);// 5 to evaluate at 1.0m in TPC
2061 Float_t phi1 = (fEvt)->fTracks[i].fPhi - asin((fEvt)->fTracks[i].fCharge*(0.1*fBfield)*coeff/(fEvt)->fTracks[i].fPt);
2062 if(phi1 > 2*PI) phi1 -= 2*PI;
2063 if(phi1 < 0) phi1 += 2*PI;
2064 Float_t phi2 = (fEvt+en2)->fTracks[j].fPhi - asin((fEvt+en2)->fTracks[j].fCharge*(0.1*fBfield)*coeff/(fEvt+en2)->fTracks[j].fPt);
2065 if(phi2 > 2*PI) phi2 -= 2*PI;
2066 if(phi2 < 0) phi2 += 2*PI;
2067 Float_t deltaphi = phi1 - phi2;
2068 if(deltaphi > PI) deltaphi -= PI;
2069 if(deltaphi < -PI) deltaphi += PI;
2071 Int_t ncl1 = (fEvt)->fTracks[i].fClusterMap.GetNbits();
2072 Int_t ncl2 = (fEvt+en2)->fTracks[j].fClusterMap.GetNbits();
2073 Float_t sumCls = 0; Float_t sumSha = 0; Float_t sumQ = 0;
2074 Double_t shfrac = 0; //Double_t qfactor = 0;
2075 for(Int_t imap = 0; imap < ncl1 && imap < ncl2; imap++) {
2076 if ((fEvt)->fTracks[i].fClusterMap.TestBitNumber(imap) && (fEvt+en2)->fTracks[j].fClusterMap.TestBitNumber(imap)) {// Both clusters
2077 if ((fEvt)->fTracks[i].fSharedMap.TestBitNumber(imap) && (fEvt+en2)->fTracks[j].fSharedMap.TestBitNumber(imap)) { // Shared
2081 else {sumQ--; sumCls+=2;}
2083 else if ((fEvt)->fTracks[i].fClusterMap.TestBitNumber(imap) || (fEvt+en2)->fTracks[j].fClusterMap.TestBitNumber(imap)) {// Non shared
2088 //qfactor = sumQ*1.0/sumCls;
2089 shfrac = sumSha*1.0/sumCls;
2091 if(fabs(deltaphi)<0.07 && fabs((fEvt)->fTracks[i].fEta-(fEvt+en2)->fTracks[j].fEta) < 0.03){
2092 ((TH3D*)fOutputList->FindObject("fPairsPadRowDen"))->Fill(transK12, shfrac, qinv12);
2095 for(Int_t rstep=0; rstep<10; rstep++){
2096 coeff = (rstep)*0.2*(0.18/1.2);
2097 // propagate through B field to r=1.2m
2098 phi1 = (fEvt)->fTracks[i].fPhi - asin((fEvt)->fTracks[i].fCharge*(0.1*fBfield)*coeff/(fEvt)->fTracks[i].fPt);
2099 if(phi1 > 2*PI) phi1 -= 2*PI;
2100 if(phi1 < 0) phi1 += 2*PI;
2101 phi2 = (fEvt+en2)->fTracks[j].fPhi - asin((fEvt+en2)->fTracks[j].fCharge*(0.1*fBfield)*coeff/(fEvt+en2)->fTracks[j].fPt);
2102 if(phi2 > 2*PI) phi2 -= 2*PI;
2103 if(phi2 < 0) phi2 += 2*PI;
2104 deltaphi = phi1 - phi2;
2105 if(deltaphi > PI) deltaphi -= PI;
2106 if(deltaphi < -PI) deltaphi += PI;
2108 if(fabs((fEvt)->fTracks[i].fEta-(fEvt+en2)->fTracks[j].fEta) < 0.03){
2109 ((TH3F*)fOutputList->FindObject("fPairsShareFracDPhiDen"))->Fill(rstep, shfrac, deltaphi);
2111 //if(shfrac < 0.05){
2112 ((TH3F*)fOutputList->FindObject("fPairsDetaDPhiDen"))->Fill(rstep, (fEvt)->fTracks[i].fEta-(fEvt+en2)->fTracks[j].fEta, deltaphi);
2119 }// desired pair selection
2127 if(qinv12 < fQLowerCut) continue;// remove unwanted low-q pairs (also a type of track splitting cut)
2129 if(!AcceptPair(&((fEvt)->fTracks[i]), &((fEvt+en2)->fTracks[j]))) {
2130 fPairSplitCut[1][i]->AddAt('1',j);
2135 //////////////////////////////////////////
2137 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].fExplicit2->Fill(transK12, qinv12);
2138 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].fExplicit2QW->Fill(transK12, qinv12, qinv12);
2141 //////////////////////////////////////////
2145 if(pairCountME >= 2*kPairLimit) {exitCode=kTRUE; continue;}// Too many SE pairs
2146 if(exitCode) continue;
2148 if(qinv12 <= fQcut[qCutBin]) {
2149 ///////////////////////////
2152 (fEvt)->fPairsME[pairCountME].fP1[0] = (fEvt)->fTracks[i].fP[0];
2153 (fEvt)->fPairsME[pairCountME].fP1[1] = (fEvt)->fTracks[i].fP[1];
2154 (fEvt)->fPairsME[pairCountME].fP1[2] = (fEvt)->fTracks[i].fP[2];
2155 (fEvt)->fPairsME[pairCountME].fE1 = (fEvt)->fTracks[i].fEaccepted;
2156 (fEvt)->fPairsME[pairCountME].fCharge1 = (fEvt)->fTracks[i].fCharge;
2157 (fEvt)->fPairsME[pairCountME].fIndex1 = i;
2158 (fEvt)->fPairsME[pairCountME].fKey1 = key1;
2159 (fEvt)->fPairsME[pairCountME].fLabel1 = (fEvt)->fTracks[i].fLabel;
2160 if(fMCcase && ((fEvt)->fTracks[i].fLabel < (fEvt)->fMCarraySize)){
2161 (fEvt)->fPairsME[pairCountME].fP1MC[0] = (fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPx;
2162 (fEvt)->fPairsME[pairCountME].fP1MC[1] = (fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPy;
2163 (fEvt)->fPairsME[pairCountME].fP1MC[2] = (fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPz;
2166 (fEvt)->fPairsME[pairCountME].fP2[0] = (fEvt+en2)->fTracks[j].fP[0];
2167 (fEvt)->fPairsME[pairCountME].fP2[1] = (fEvt+en2)->fTracks[j].fP[1];
2168 (fEvt)->fPairsME[pairCountME].fP2[2] = (fEvt+en2)->fTracks[j].fP[2];
2169 (fEvt)->fPairsME[pairCountME].fE2 = (fEvt+en2)->fTracks[j].fEaccepted;
2170 (fEvt)->fPairsME[pairCountME].fCharge2 = (fEvt+en2)->fTracks[j].fCharge;
2171 (fEvt)->fPairsME[pairCountME].fIndex2 = j;
2172 (fEvt)->fPairsME[pairCountME].fKey2 = key2;
2173 (fEvt)->fPairsME[pairCountME].fLabel2 = (fEvt+en2)->fTracks[j].fLabel;
2174 if(fMCcase && ((fEvt+en2)->fTracks[j].fLabel < (fEvt+en2)->fMCarraySize)){
2175 (fEvt)->fPairsME[pairCountME].fP2MC[0] = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPx;
2176 (fEvt)->fPairsME[pairCountME].fP2MC[1] = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPy;
2177 (fEvt)->fPairsME[pairCountME].fP2MC[2] = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPz;
2180 (fEvt)->fPairsME[pairCountME].fQinv = qinv12;
2182 fPairLocationME[i]->AddAt(Int_t(pairCountME),j);
2188 if((qinv12 >= fNormQcutLow[normBin]) && (qinv12 < fNormQcutHigh[normBin])){
2190 fNormPairs[en2][normPairCount[en2]].fCharge1 = (fEvt)->fTracks[i].fCharge;
2191 fNormPairs[en2][normPairCount[en2]].fIndex1 = i;
2192 fNormPairs[en2][normPairCount[en2]].fKey1 = (fEvt)->fTracks[i].fKey;
2194 fNormPairs[en2][normPairCount[en2]].fCharge2 = (fEvt+en2)->fTracks[j].fCharge;
2195 fNormPairs[en2][normPairCount[en2]].fIndex2 = j;
2196 fNormPairs[en2][normPairCount[en2]].fKey2 = (fEvt+en2)->fTracks[j].fKey;
2198 //other past pairs in P11 with particle i
2199 for(Int_t pastpairP11=0; pastpairP11<numOtherPairs2[0][i]; pastpairP11++){// past pair in P11 with i as 1st and 2nd particle
2200 Int_t locationOtherPairP11 = fOtherPairLocation2[0][i]->At(pastpairP11);// i is 2nd particle
2201 if(locationOtherPairP11 < 0) continue;// no pair there
2202 Int_t indexOther1P11 = fNormPairs[0][ locationOtherPairP11 ].fIndex1;
2204 //Check other past pairs in P12
2205 if( (fNormPairSwitch[1][indexOther1P11]->At(j)=='0')) continue;
2207 // 1 and 3 are from SE
2208 ch3 = Int_t((fNormPairs[0][ locationOtherPairP11 ].fCharge1 + 1)/2.);// charge of second particle in P11
2209 key3 = fNormPairs[0][ locationOtherPairP11 ].fKey1;
2210 Short_t fillIndex3 = FillIndex3part(key1+key2+key3);
2211 Bool_t fill2=kFALSE, fill3=kFALSE, fill4=kFALSE;
2212 SetFillBins3(fillIndex3, key1, key2, key3, ch1, ch2, ch3, 2, bin1, bin2, bin3, fill2, fill3, fill4);
2215 if(fill2) tempNormFillCount[bin1][bin2][bin3][fillIndex3][1]++;
2216 if(fill3) tempNormFillCount[bin1][bin2][bin3][fillIndex3][2]++;
2217 if(fill4) tempNormFillCount[bin1][bin2][bin3][fillIndex3][3]++;
2223 fNormPairSwitch[en2][i]->AddAt('1',j);
2224 fOtherPairLocation1[en2][i]->AddAt(normPairCount[en2], numOtherPairs1[en2][i]);// location of otherpair with i as 1st particle
2225 fOtherPairLocation2[en2][j]->AddAt(normPairCount[en2], numOtherPairs2[en2][j]);// location of otherpair with j as 2nd particle
2227 numOtherPairs1[en2][i]++;
2228 numOtherPairs2[en2][j]++;
2230 normPairCount[en2]++;
2231 if(normPairCount[en2] >= kNormPairLimit) exitCode=kTRUE;
2240 ///////////////////////////////////////
2241 // P13 pairing (just for Norm counting of term5)
2242 for (Int_t i=0; i<myTracks; i++) {
2244 // exit out of loop if there are too many pairs
2245 // dont bother with this loop if exitCode is set.
2251 for (Int_t j=0; j<(fEvt+en2)->fNtracks; j++) {
2253 key1 = (fEvt)->fTracks[i].fKey;
2254 key2 = (fEvt+en2)->fTracks[j].fKey;
2255 Short_t fillIndex2 = FillIndex2part(key1+key2);
2256 Short_t normBin = SetNormBin(fillIndex2);
2257 pVect1[0]=(fEvt)->fTracks[i].fEaccepted; pVect2[0]=(fEvt+en2)->fTracks[j].fEaccepted;
2258 pVect1[1]=(fEvt)->fTracks[i].fP[0]; pVect2[1]=(fEvt+en2)->fTracks[j].fP[0];
2259 pVect1[2]=(fEvt)->fTracks[i].fP[1]; pVect2[2]=(fEvt+en2)->fTracks[j].fP[1];
2260 pVect1[3]=(fEvt)->fTracks[i].fP[2]; pVect2[3]=(fEvt+en2)->fTracks[j].fP[2];
2262 qinv12 = GetQinv(fillIndex2, pVect1, pVect2);
2264 if(qinv12 < fQLowerCut) continue;// remove unwanted low-q pairs (also a type of track splitting cut)
2266 ch1 = Int_t(((fEvt)->fTracks[i].fCharge + 1)/2.);
2267 ch2 = Int_t(((fEvt+en2)->fTracks[j].fCharge + 1)/2.);
2270 if(!AcceptPair(&((fEvt)->fTracks[i]), &((fEvt+en2)->fTracks[j]))) {
2271 fPairSplitCut[2][i]->AddAt('1',j);
2276 /////////////////////////////////////////////////////////
2277 // Normalization Region
2279 if((qinv12 >= fNormQcutLow[normBin]) && (qinv12 < fNormQcutHigh[normBin])){
2281 fNormPairSwitch[en2][i]->AddAt('1',j);
2289 ///////////////////////////////////////
2290 // P23 pairing (just for Norm counting of term5)
2292 for (Int_t i=0; i<(fEvt+en1)->fNtracks; i++) {
2294 // exit out of loop if there are too many pairs
2295 // dont bother with this loop if exitCode is set.
2301 for (Int_t j=0; j<(fEvt+en2)->fNtracks; j++) {
2305 key1 = (fEvt+en1)->fTracks[i].fKey;
2306 key2 = (fEvt+en2)->fTracks[j].fKey;
2307 Short_t fillIndex2 = FillIndex2part(key1+key2);
2308 Short_t normBin = SetNormBin(fillIndex2);
2309 pVect1[0]=(fEvt+en1)->fTracks[i].fEaccepted; pVect2[0]=(fEvt+en2)->fTracks[j].fEaccepted;
2310 pVect1[1]=(fEvt+en1)->fTracks[i].fP[0]; pVect2[1]=(fEvt+en2)->fTracks[j].fP[0];
2311 pVect1[2]=(fEvt+en1)->fTracks[i].fP[1]; pVect2[2]=(fEvt+en2)->fTracks[j].fP[1];
2312 pVect1[3]=(fEvt+en1)->fTracks[i].fP[2]; pVect2[3]=(fEvt+en2)->fTracks[j].fP[2];
2314 qinv12 = GetQinv(fillIndex2, pVect1, pVect2);
2316 if(qinv12 < fQLowerCut) continue;// remove unwanted low-q pairs (also a type of track splitting cut)
2318 ///////////////////////////////
2319 ch1 = Int_t(((fEvt+en1)->fTracks[i].fCharge + 1)/2.);
2320 ch2 = Int_t(((fEvt+en2)->fTracks[j].fCharge + 1)/2.);
2323 if(!AcceptPair(&((fEvt+en1)->fTracks[i]), &((fEvt+en2)->fTracks[j]))) {
2324 fPairSplitCut[3][i]->AddAt('1',j);
2329 if((qinv12 < fNormQcutLow[normBin]) || (qinv12 >= fNormQcutHigh[normBin])) continue;
2331 Int_t index1P23 = i;
2332 Int_t index2P23 = j;
2334 for(Int_t pastpairP12=0; pastpairP12<numOtherPairs2[1][index1P23]; pastpairP12++){// loop in P12 with i as 2nd particle
2335 Int_t locationOtherPairP12 = fOtherPairLocation2[1][index1P23]->At(pastpairP12);
2336 if(locationOtherPairP12 < 0) continue; // no pair there
2337 Int_t index1P12 = fNormPairs[1][ locationOtherPairP12 ].fIndex1;
2340 //Check other past pair status in P13
2341 if( (fNormPairSwitch[2][index1P12]->At(index2P23)=='0')) continue;
2343 // all from different event
2344 ch3 = Int_t((fNormPairs[1][ locationOtherPairP12 ].fCharge1 + 1)/2.);// charge of first particle in P12
2345 key3 = fNormPairs[1][ locationOtherPairP12 ].fKey1;
2346 Short_t fillIndex3 = FillIndex3part(key1+key2+key3);
2347 SetFillBins3(fillIndex3, key1, key2, key3, ch1, ch2, ch3, 3, bin1, bin2, bin3, fDummyB, fDummyB, fDummyB);
2349 tempNormFillCount[bin1][bin2][bin3][fillIndex3][4]++;
2357 ///////////////////////////////////////////////////
2358 // Do not use pairs from events with too many pairs
2360 cout<<"SE or ME or Norm PairCount too large. Discarding all pairs and skipping event"<<endl;
2361 (fEvt)->fNpairsSE = 0;
2362 (fEvt)->fNpairsME = 0;
2363 ((TH1F*)fOutputList->FindObject("fRejectedEvents"))->Fill(fMbin+1);
2364 return;// Skip event
2366 (fEvt)->fNpairsSE = pairCountSE;
2367 (fEvt)->fNpairsME = pairCountME;
2368 ((TH1F*)fOutputList->FindObject("fEvents2"))->Fill(fMbin+1);
2370 ///////////////////////////////////////////////////
2374 ///////////////////////////////////////////////////////////////////////
2375 ///////////////////////////////////////////////////////////////////////
2376 ///////////////////////////////////////////////////////////////////////
2379 // Start the Main Correlation Analysis
2382 ///////////////////////////////////////////////////////////////////////
2387 /////////////////////////////////////////////////////////
2389 // Set the Normalization counters
2390 for(Int_t termN=0; termN<5; termN++){
2393 if((fEvt)->fNtracks ==0) continue;
2395 if((fEvt)->fNtracks ==0) continue;
2396 if((fEvt+1)->fNtracks ==0) continue;
2398 if((fEvt)->fNtracks ==0) continue;
2399 if((fEvt+1)->fNtracks ==0) continue;
2400 if((fEvt+2)->fNtracks ==0) continue;
2403 for(Int_t sc=0; sc<kSCLimit3; sc++){
2405 for(Int_t c1=0; c1<2; c1++){
2406 for(Int_t c2=0; c2<2; c2++){
2407 for(Int_t c3=0; c3<2; c3++){
2409 if(sc==0 || sc==6 || sc==9){// Identical species
2410 if( (c1+c2+c3)==1) {if(c1!=0 || c2!=0 || c3!=1) continue;}
2411 if( (c1+c2+c3)==2) {if(c1!=0) continue;}
2413 if( (c1+c2)==1) {if(c1!=0) continue;}
2414 }else {}// do nothing for pi-k-p case
2415 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[fMbin].EDB[fEDbin].ThreePT[termN].fNorm3->Fill(0.,tempNormFillCount[c1][c2][c3][sc][termN]);
2424 /////////////////////////////////////////////
2425 // Calculate Pair-Cut Correlations
2426 for(Int_t en1case=0; en1case<2; en1case++){// limit at 2 (normal)
2429 if(en1case==0) nump1 = (fEvt)->fNpairsSE;
2430 if(en1case==1) nump1 = (fEvt)->fNpairsME;
2433 for(Int_t p1=0; p1<nump1; p1++){
2436 ch1 = Int_t(((fEvt)->fPairsSE[p1].fCharge1 + 1)/2.);
2437 ch2 = Int_t(((fEvt)->fPairsSE[p1].fCharge2 + 1)/2.);
2438 pVect1[0] = (fEvt)->fPairsSE[p1].fE1; pVect2[0] = (fEvt)->fPairsSE[p1].fE2;
2439 pVect1[1] = (fEvt)->fPairsSE[p1].fP1[0]; pVect2[1] = (fEvt)->fPairsSE[p1].fP2[0];
2440 pVect1[2] = (fEvt)->fPairsSE[p1].fP1[1]; pVect2[2] = (fEvt)->fPairsSE[p1].fP2[1];
2441 pVect1[3] = (fEvt)->fPairsSE[p1].fP1[2]; pVect2[3] = (fEvt)->fPairsSE[p1].fP2[2];
2442 index1 = (fEvt)->fPairsSE[p1].fIndex1; index2 = (fEvt)->fPairsSE[p1].fIndex2;
2443 key1 = (fEvt)->fPairsSE[p1].fKey1; key2 = (fEvt)->fPairsSE[p1].fKey2;
2444 qinv12 = (fEvt)->fPairsSE[p1].fQinv;
2446 pVect1MC[1] = (fEvt)->fPairsSE[p1].fP1MC[0]; pVect2MC[1] = (fEvt)->fPairsSE[p1].fP2MC[0];
2447 pVect1MC[2] = (fEvt)->fPairsSE[p1].fP1MC[1]; pVect2MC[2] = (fEvt)->fPairsSE[p1].fP2MC[1];
2448 pVect1MC[3] = (fEvt)->fPairsSE[p1].fP1MC[2]; pVect2MC[3] = (fEvt)->fPairsSE[p1].fP2MC[2];
2449 pVect1MC[0] = sqrt(pow(pVect1MC[1],2)+pow(pVect1MC[2],2)+pow(pVect1MC[3],2)+pow(fTrueMassPi,2));
2450 pVect2MC[0] = sqrt(pow(pVect2MC[1],2)+pow(pVect2MC[2],2)+pow(pVect2MC[3],2)+pow(fTrueMassPi,2));
2453 ch1 = Int_t(((fEvt)->fPairsME[p1].fCharge1 + 1)/2.);
2454 ch2 = Int_t(((fEvt)->fPairsME[p1].fCharge2 + 1)/2.);
2455 pVect1[0] = (fEvt)->fPairsME[p1].fE1; pVect2[0] = (fEvt)->fPairsME[p1].fE2;
2456 pVect1[1] = (fEvt)->fPairsME[p1].fP1[0]; pVect2[1] = (fEvt)->fPairsME[p1].fP2[0];
2457 pVect1[2] = (fEvt)->fPairsME[p1].fP1[1]; pVect2[2] = (fEvt)->fPairsME[p1].fP2[1];
2458 pVect1[3] = (fEvt)->fPairsME[p1].fP1[2]; pVect2[3] = (fEvt)->fPairsME[p1].fP2[2];
2459 index1 = (fEvt)->fPairsME[p1].fIndex1; index2 = (fEvt)->fPairsME[p1].fIndex2;
2460 key1 = (fEvt)->fPairsME[p1].fKey1; key2 = (fEvt)->fPairsME[p1].fKey2;
2461 qinv12 = (fEvt)->fPairsME[p1].fQinv;
2463 pVect1MC[1] = (fEvt)->fPairsME[p1].fP1MC[0]; pVect2MC[1] = (fEvt)->fPairsME[p1].fP2MC[0];
2464 pVect1MC[2] = (fEvt)->fPairsME[p1].fP1MC[1]; pVect2MC[2] = (fEvt)->fPairsME[p1].fP2MC[1];
2465 pVect1MC[3] = (fEvt)->fPairsME[p1].fP1MC[2]; pVect2MC[3] = (fEvt)->fPairsME[p1].fP2MC[2];
2466 pVect1MC[0] = sqrt(pow(pVect1MC[1],2)+pow(pVect1MC[2],2)+pow(pVect1MC[3],2)+pow(fTrueMassPi,2));
2467 pVect2MC[0] = sqrt(pow(pVect2MC[1],2)+pow(pVect2MC[2],2)+pow(pVect2MC[3],2)+pow(fTrueMassPi,2));
2472 for(Int_t en2=0; en2<3; en2++){
2473 //////////////////////////////////////
2475 Bool_t skipcase=kTRUE;
2476 Short_t config=-1, part=-1;
2477 if(en1case==0 && en2==0) {skipcase=kFALSE; config=1; part=0;}// P11T1
2478 if(en1case==0 && en2==1) {skipcase=kFALSE; config=2; part=1;}// P11T2
2479 if(en1case==1 && en2==0) {skipcase=kFALSE; config=2; part=2;}// P12T1
2480 if(en1case==1 && en2==2) {skipcase=kFALSE; config=3; part=3;}// P12T3
2482 if(skipcase) continue;
2487 for(Int_t k=0; k<(fEvt+en2)->fNtracks; k++){
2491 // remove auto-correlations and duplicate triplets
2493 if( index1 == index3) continue;
2494 if( index2 == index3) continue;
2495 if(fPairSplitCut[0][index1]->At(index2)=='1') continue;// Track splitting/merging
2497 // skip the switched off triplets
2498 if(fTripletSkip1[fPairLocationSE[index1]->At(index2)]->At(index3)=='1') {
2499 fTripletSkip1[fPairLocationSE[index1]->At(index2)]->AddAt('0',index3);// Reset
2502 ///////////////////////////////
2503 // Turn off 1st possible degenerate triplet
2504 if(index1 < index3){// verify correct id ordering ( index1 < k )
2505 if(fPairLocationSE[index1]->At(index3) >= 0){
2506 fTripletSkip1[fPairLocationSE[index1]->At(index3)]->AddAt('1',index2);
2508 if(fPairSplitCut[0][index1]->At(index3)=='1') continue;// Track splitting/merging
2509 }else {// or k < index1
2510 if(fPairLocationSE[index3]->At(index1) >= 0){
2511 fTripletSkip1[fPairLocationSE[index3]->At(index1)]->AddAt('1',index2);
2513 if(fPairSplitCut[0][index3]->At(index1)=='1') continue;// Track splitting/merging
2515 // turn off 2nd possible degenerate triplet
2516 if(index2 < index3){// verify correct id ordering (index2 < k)
2517 if(fPairLocationSE[index2]->At(index3) >= 0){
2518 fTripletSkip1[fPairLocationSE[index2]->At(index3)]->AddAt('1',index1);
2520 if(fPairSplitCut[0][index2]->At(index3)=='1') continue;// Track splitting/merging
2521 }else {// or k < index2
2522 if(fPairLocationSE[index3]->At(index2) >= 0){
2523 fTripletSkip1[fPairLocationSE[index3]->At(index2)]->AddAt('1',index1);
2525 if(fPairSplitCut[0][index3]->At(index2)=='1') continue;// Track splitting/merging
2530 if(config==2 && part==1){// SE pair and third particle from next event. P11T2
2531 ///////////////////////////////
2532 // Turn off 1st possible degenerate triplet
2533 if(fPairLocationME[index1]->At(index3) >= 0){
2534 fTripletSkip2[fPairLocationME[index1]->At(index3)]->AddAt('1',index2);
2537 // turn off 2nd possible degenerate triplet
2538 if(fPairLocationME[index2]->At(index3) >= 0){
2539 fTripletSkip2[fPairLocationME[index2]->At(index3)]->AddAt('1',index1);
2542 if(fPairSplitCut[0][index1]->At(index2)=='1') continue;// Track splitting/merging
2543 if(fPairSplitCut[1][index1]->At(index3)=='1') continue;// Track splitting/merging
2544 if(fPairSplitCut[1][index2]->At(index3)=='1') continue;// Track splitting/merging
2545 }// end config 2 part 1
2547 if(config==2 && part==2){// P12T1
2548 if( index1 == index3) continue;
2550 // skip the switched off triplets
2551 if(fTripletSkip2[fPairLocationME[index1]->At(index2)]->At(index3)=='1') {
2552 fTripletSkip2[fPairLocationME[index1]->At(index2)]->AddAt('0',index3);// Reset
2555 // turn off another possible degenerate
2556 if(fPairLocationME[index3]->At(index2) >= 0){
2557 fTripletSkip2[fPairLocationME[index3]->At(index2)]->AddAt('1',index1);
2558 }// end config 2 part 2
2560 if(fPairSplitCut[1][index1]->At(index2)=='1') continue;// Track splitting/merging
2561 if(index1 < index3) {if(fPairSplitCut[0][index1]->At(index3)=='1') continue;}// Track splitting/merging
2562 else {if(fPairSplitCut[0][index3]->At(index1)=='1') continue;}// Track splitting/merging
2563 if(fPairSplitCut[1][index3]->At(index2)=='1') continue;// Track splitting/merging
2565 if(config==3){// P12T3
2566 if(fPairSplitCut[1][index1]->At(index2)=='1') continue;// Track splitting/merging
2567 if(fPairSplitCut[2][index1]->At(index3)=='1') continue;// Track splitting/merging
2568 if(fPairSplitCut[3][index2]->At(index3)=='1') continue;// Track splitting/merging
2573 ch3 = Int_t(((fEvt+en2)->fTracks[k].fCharge + 1)/2.);
2574 key3 = (fEvt+en2)->fTracks[k].fKey;
2575 Short_t fillIndex3 = FillIndex3part(key1+key2+key3);
2576 Short_t fillIndex13 = FillIndex2part(key1+key3);
2577 Short_t fillIndex23 = FillIndex2part(key2+key3);
2578 Short_t qCutBin13 = SetQcutBin(fillIndex13);
2579 Short_t qCutBin23 = SetQcutBin(fillIndex23);
2580 pVect3[0] = (fEvt+en2)->fTracks[k].fEaccepted;
2581 pVect3[1] = (fEvt+en2)->fTracks[k].fP[0];
2582 pVect3[2] = (fEvt+en2)->fTracks[k].fP[1];
2583 pVect3[3] = (fEvt+en2)->fTracks[k].fP[2];
2584 qinv13 = GetQinv(fillIndex13, pVect1, pVect3);
2585 qinv23 = GetQinv(fillIndex23, pVect2, pVect3);
2587 if(qinv13 < fQLowerCut) continue;
2588 if(qinv23 < fQLowerCut) continue;
2589 if(qinv13 > fQcut[qCutBin13]) continue;
2590 if(qinv23 > fQcut[qCutBin23]) continue;
2595 pVect3MC[1] = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[k].fLabel)].fPx;
2596 pVect3MC[2] = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[k].fLabel)].fPy;
2597 pVect3MC[3] = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[k].fLabel)].fPz;
2598 pVect3MC[0] = sqrt(pow(pVect3MC[1],2)+pow(pVect3MC[2],2)+pow(pVect3MC[3],2)+pow(fTrueMassPi,2));
2599 qinv12MC = GetQinv(0, pVect1MC, pVect2MC);
2600 qinv13MC = GetQinv(0, pVect1MC, pVect3MC);
2601 qinv23MC = GetQinv(0, pVect2MC, pVect3MC);
2606 // if all three pair cuts are the same then the case (config=2 && term=2) never reaches here.
2608 q3 = sqrt(pow(qinv12,2) + pow(qinv13,2) + pow(qinv23,2));
2609 transK3 = sqrt( pow(pVect1[1]+pVect2[1]+pVect3[1],2) + pow(pVect1[2]+pVect2[2]+pVect3[2],2))/3.;
2610 if(fKt3bins==1) fEDbin=0;
2611 else if(fKt3bins<2){
2612 if(transK3<0.3) fEDbin=0;
2614 }else{// fKt3bins==3 is the limit set by fEDbins
2615 if(transK3<0.25) fEDbin=0;
2616 else if(transK3<0.35) fEDbin=1;
2620 firstQ=0; secondQ=0; thirdQ=0;
2625 if(config==1) {// 123
2626 SetFillBins3(fillIndex3, key1, key2, key3, ch1, ch2, ch3, 0, bin1, bin2, bin3, fDummyB, fDummyB, fDummyB);
2628 if(fillIndex3 <= 2){
2629 ArrangeQs(fillIndex3, key1, key2, key3, ch1, ch2, ch3, qinv12, qinv13, qinv23, 0, 1, firstQ, secondQ, thirdQ);
2630 if(fillIndex3==0 && fMCcase) ArrangeQs(fillIndex3, key1, key2, key3, ch1, ch2, ch3, qinv12MC, qinv13MC, qinv23MC, 0, 1, firstQMC, secondQMC, thirdQMC);
2631 Float_t WInput = 1.0;
2632 if(fGenerateSignal && ch1==ch2 && ch1==ch3) WInput = MCWeight3D(kTRUE, 1, 10, firstQ, secondQ, thirdQ);
2633 //if(fGenerateSignal && ch1==ch2 && ch1==ch3) WInput = MCWeight3D(kTRUE, 1, fFixedLambdaBinr3, firstQMC, secondQMC, thirdQMC);
2635 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[0].fTermsQ3->Fill(q3, WInput);
2636 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[0].fTerms3->Fill(firstQ, secondQ, thirdQ, WInput);
2639 if(fillIndex3==0 && ch1==ch2 && ch1==ch3 && fMCcase==kFALSE){
2640 ((TH3D*)fOutputList->FindObject("fKt3DistTerm1"))->Fill(fMbin+1, transK3, q3);
2645 }else if(config==2){// 12, 13, 23
2647 Bool_t fill2=kFALSE, fill3=kFALSE, fill4=kFALSE;
2648 SetFillBins3(fillIndex3, key1, key2, key3, ch1, ch2, ch3, part, bin1, bin2, bin3, fill2, fill3, fill4);
2650 // loop over terms 2-4
2651 for(Int_t jj=2; jj<5; jj++){
2652 if(jj==2) {if(!fill2) continue;}//12
2653 if(jj==3) {if(!fill3) continue;}//13
2654 if(jj==4) {if(!fill4) continue;}//23
2656 if(fillIndex3 <= 2){
2657 ArrangeQs(fillIndex3, key1, key2, key3, ch1, ch2, ch3, qinv12, qinv13, qinv23, part, jj, firstQ, secondQ, thirdQ);
2658 if(fillIndex3==0 && fMCcase) ArrangeQs(fillIndex3, key1, key2, key3, ch1, ch2, ch3, qinv12MC, qinv13MC, qinv23MC, part, jj, firstQMC, secondQMC, thirdQMC);
2659 Float_t WInput = 1.0;
2660 if(fGenerateSignal && ch1==ch2 && ch1==ch3) WInput = MCWeight3D(kTRUE, jj, 10, firstQ, secondQ, thirdQ);
2661 //if(fGenerateSignal && ch1==ch2 && ch1==ch3) WInput = MCWeight3D(kTRUE, jj, fFixedLambdaBinr3, firstQMC, secondQMC, thirdQMC);
2663 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[jj-1].fTermsQ3->Fill(q3, WInput);
2664 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[jj-1].fTerms3->Fill(firstQ, secondQ, thirdQ, WInput);
2669 }else {// config 3: All particles from different events
2671 SetFillBins3(fillIndex3, key1, key2, key3, ch1, ch2, ch3, 3, bin1, bin2, bin3, fDummyB, fDummyB, fDummyB);
2673 if(ch1==ch2 && ch1==ch3 && fillIndex3==0) {
2674 if(!fMCcase) ((TH3D*)fOutputList->FindObject("fKt3DistTerm5"))->Fill(fMbin+1, transK3, q3);
2677 if(fillIndex3 <= 2){
2678 ArrangeQs(fillIndex3, key1, key2, key3, ch1, ch2, ch3, qinv12, qinv13, qinv23, part, 5, firstQ, secondQ, thirdQ);
2679 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[4].fTermsQ3->Fill(q3);
2680 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[4].fTerms3->Fill(firstQ, secondQ, thirdQ);
2685 }// end 3rd particle
2693 }// end of PdensityPairs
2697 // Post output data.
2698 PostData(1, fOutputList);
2701 //________________________________________________________________________
2702 void AliThreePionRadii::Terminate(Option_t *)
2704 // Called once at the end of the query
2709 //________________________________________________________________________
2710 Bool_t AliThreePionRadii::AcceptPair(AliChaoticityTrackStruct *first, AliChaoticityTrackStruct *second)
2713 if(fabs(first->fEta-second->fEta) > fMinSepPairEta) return kTRUE;
2715 // propagate through B field to r=1m
2716 Float_t phi1 = first->fPhi - asin(first->fCharge*(0.1*fBfield)*0.15/first->fPt);// 0.15 for D=1m
2717 if(phi1 > 2*PI) phi1 -= 2*PI;
2718 if(phi1 < 0) phi1 += 2*PI;
2719 Float_t phi2 = second->fPhi - asin(second->fCharge*(0.1*fBfield)*0.15/second->fPt);// 0.15 for D=1m
2720 if(phi2 > 2*PI) phi2 -= 2*PI;
2721 if(phi2 < 0) phi2 += 2*PI;
2723 Float_t deltaphi = phi1 - phi2;
2724 if(deltaphi > PI) deltaphi -= 2*PI;
2725 if(deltaphi < -PI) deltaphi += 2*PI;
2726 deltaphi = fabs(deltaphi);
2728 if(deltaphi < fMinSepPairPhi) return kFALSE;// Min Separation
2731 // propagate through B field to r=1.6m
2732 phi1 = first->fPhi - asin(first->fCharge*(0.1*fBfield)*0.24/first->fPt);// mine. 0.24 for D=1.6m
2733 if(phi1 > 2*PI) phi1 -= 2*PI;
2734 if(phi1 < 0) phi1 += 2*PI;
2735 phi2 = second->fPhi - asin(second->fCharge*(0.1*fBfield)*0.24/second->fPt);// mine. 0.24 for D=1.6m
2736 if(phi2 > 2*PI) phi2 -= 2*PI;
2737 if(phi2 < 0) phi2 += 2*PI;
2739 deltaphi = phi1 - phi2;
2740 if(deltaphi > PI) deltaphi -= 2*PI;
2741 if(deltaphi < -PI) deltaphi += 2*PI;
2742 deltaphi = fabs(deltaphi);
2744 if(deltaphi < fMinSepPairPhi) return kFALSE;// Min Separation
2750 Int_t ncl1 = first->fClusterMap.GetNbits();
2751 Int_t ncl2 = second->fClusterMap.GetNbits();
2752 Int_t sumCls = 0; Int_t sumSha = 0; Int_t sumQ = 0;
2753 Double_t shfrac = 0; Double_t qfactor = 0;
2754 for(Int_t imap = 0; imap < ncl1 && imap < ncl2; imap++) {
2755 if (first->fClusterMap.TestBitNumber(imap) && second->fClusterMap.TestBitNumber(imap)) {// Both clusters
2756 if (first->fSharedMap.TestBitNumber(imap) && second->fSharedMap.TestBitNumber(imap)) { // Shared
2760 else {sumQ--; sumCls+=2;}
2762 else if (first->fClusterMap.TestBitNumber(imap) || second->fClusterMap.TestBitNumber(imap)) {// Non shared
2767 qfactor = sumQ*1.0/sumCls;
2768 shfrac = sumSha*1.0/sumCls;
2771 if(qfactor > fShareQuality || shfrac > fShareFraction) return kFALSE;
2778 //________________________________________________________________________
2779 Float_t AliThreePionRadii::GamovFactor(Int_t chargeBin1, Int_t chargeBin2, Float_t qinv)
2781 Float_t arg = G_Coeff/qinv;
2783 if(chargeBin1==chargeBin2) return (exp(arg)-1)/(arg);
2784 else {return (exp(-arg)-1)/(-arg);}
2787 //________________________________________________________________________
2788 void AliThreePionRadii::Shuffle(Int_t *iarr, Int_t i1, Int_t i2)
2792 for (Int_t i = i1; i < i2+1; i++) {
2793 j = (Int_t) (gRandom->Rndm() * a);
2799 //________________________________________________________________________
2800 Short_t AliThreePionRadii::FillIndex2part(Short_t key){
2802 if(key==2) return 0;// pi-pi
2803 else if(key==11) return 1;// pi-k
2804 else if(key==101) return 2;// pi-p
2805 else if(key==20) return 3;// k-k
2806 else if(key==110) return 4;// k-p
2807 else return 5;// p-p
2809 //________________________________________________________________________
2810 Short_t AliThreePionRadii::FillIndex3part(Short_t key){
2812 if(key==3) return 0;// pi-pi-pi
2813 else if(key==12) return 1;// pi-pi-k
2814 else if(key==21) return 2;// k-k-pi
2815 else if(key==102) return 3;// pi-pi-p
2816 else if(key==201) return 4;// p-p-pi
2817 else if(key==111) return 5;// pi-k-p
2818 else if(key==30) return 6;// k-k-k
2819 else if(key==120) return 7;// k-k-p
2820 else if(key==210) return 8;// p-p-k
2821 else return 9;// p-p-p
2824 //________________________________________________________________________
2825 Short_t AliThreePionRadii::SetQcutBin(Short_t fi){// fi=FillIndex
2826 if(fi <= 2) return 0;
2827 else if(fi==3) return 1;
2830 //________________________________________________________________________
2831 Short_t AliThreePionRadii::SetNormBin(Short_t fi){// fi=FillIndex
2833 else if(fi <= 2) return 1;
2836 //________________________________________________________________________
2837 void AliThreePionRadii::SetFillBins2(Short_t fi, Short_t key1, Short_t key2, Int_t c1, Int_t c2, Int_t &b1, Int_t &b2){
2839 if(fi==0 || fi==3 || fi==5){// Identical species
2840 if((c1+c2)==1) {b1=0; b2=1;}// Re-assign to merge degenerate histos
2841 else {b1=c1; b2=c2;}
2842 }else {// Mixed species
2843 if(key1 < key2) { b1=c1; b2=c2;}
2844 else {b1=c2; b2=c1;}
2848 //________________________________________________________________________
2849 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){
2852 // seSS, seSK, SE_keysum only used to determine which terms to fill (only used for terms 2-4)
2853 // part only matters for terms 2-4
2856 Short_t seKeySum=0;// only used for pi-k-p case
2857 if(part==1) {// default case (irrelevant for term 1 and term 5)
2858 if(c1==c2) seSS=kTRUE;
2859 if(key1==key2) seSK=kTRUE;
2860 seKeySum = key1+key2;
2863 if(c1==c3) seSS=kTRUE;
2864 if(key1==key3) seSK=kTRUE;
2865 seKeySum = key1+key3;
2869 // fill2, fill3, fill4 are only used for Cumulant Terms 2,3,4
2871 if(fi==0 || fi==6 || fi==9){// Identical species
2872 if( (c1+c2+c3)==1) {
2873 b1=0; b2=0; b3=1;// Re-assign to merge degenerate histos
2875 if(seSS) fill2=kTRUE;
2876 else {fill3=kTRUE; fill4=kTRUE;}
2878 }else if( (c1+c2+c3)==2) {
2881 if(!seSS) {fill2=kTRUE; fill3=kTRUE;}
2885 b1=c1; b2=c2; b3=c3;
2886 fill2=kTRUE; fill3=kTRUE; fill4=kTRUE;
2888 }else if(fi != 5){// all the rest except pi-k-p
2891 if( (c1+c2)==1) {b1=0; b2=1;}
2892 else {b1=c1; b2=c2;}
2893 }else if(key1==key3){
2895 if( (c1+c3)==1) {b1=0; b2=1;}
2896 else {b1=c1; b2=c3;}
2897 }else {// Key2==Key3
2899 if( (c2+c3)==1) {b1=0; b2=1;}
2900 else {b1=c2; b2=c3;}
2902 //////////////////////////////
2903 if(seSK) fill2=kTRUE;// Same keys from Same Event
2904 else {// Different keys from Same Event
2905 if( (c1+c2+c3)==1) {
2907 if(seSS) fill3=kTRUE;
2909 }else{fill3=kTRUE; fill4=kTRUE;}// b3=1 so fill both
2910 }else if( (c1+c2+c3)==2) {
2912 if(seSS) fill4=kTRUE;
2914 }else{fill3=kTRUE; fill4=kTRUE;}// b3=0 so fill both
2915 }else{fill3=kTRUE; fill4=kTRUE;}// all same charge so fill both
2917 /////////////////////////////
2918 }else {// pi-k-p (no charge ordering applies since all are unique)
2920 if(key2==10) {b1=c1; b2=c2; b3=c3;}// pi-k-p
2921 else {b1=c1; b2=c3; b3=c2;}// pi-p-k
2923 if(key2==1) {b1=c2; b2=c1; b3=c3;}// k-pi-p
2924 else {b1=c3; b2=c1; b3=c2;}// k-p-pi
2926 if(key2==1) {b1=c2; b2=c3; b3=c1;}// p-pi-k
2927 else {b1=c3; b2=c2; b3=c1;}// p-k-pi
2929 ////////////////////////////////////
2930 if(seKeySum==11) fill2=kTRUE;
2931 else if(seKeySum==101) fill3=kTRUE;
2933 ////////////////////////////////////
2937 //________________________________________________________________________
2938 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){
2940 // for terms 2-4: start by setting q12(part 1) or q13(part 2)
2941 if(fi==0 || fi==6 || fi==9){// Identical species
2942 if( (c1+c2+c3)==1) {// fQ=ss, sQ=os, tQ=os
2943 if(term==1 || term==5){
2944 if(c1==c2) {fQ=q12; sQ=q13; tQ=q23;}
2945 else if(c1==c3) {fQ=q13; sQ=q12; tQ=q23;}
2946 else {fQ=q23; sQ=q12; tQ=q13;}
2947 }else if(term==2 && part==1){
2948 fQ=q12; sQ=q13; tQ=q23;
2949 }else if(term==2 && part==2){
2950 fQ=q13; sQ=q12; tQ=q23;
2951 }else if(term==3 && part==1){
2953 if(c1==c3) {fQ=q13; tQ=q23;}
2954 else {fQ=q23; tQ=q13;}
2955 }else if(term==3 && part==2){
2957 if(c1==c2) {fQ=q12; tQ=q23;}
2958 else {fQ=q23; tQ=q12;}
2959 }else if(term==4 && part==1){
2961 if(c1==c3) {fQ=q13; sQ=q23;}
2962 else {fQ=q23; sQ=q13;}
2963 }else if(term==4 && part==2){
2965 if(c1==c2) {fQ=q12; sQ=q23;}
2966 else {fQ=q23; sQ=q12;}
2967 }else cout<<"problem!!!!!!!!!!!!!"<<endl;
2968 }else if( (c1+c2+c3)==2) {// fQ=os, sQ=os, tQ=ss
2969 if(term==1 || term==5){
2970 if(c1==c2) {tQ=q12; sQ=q13; fQ=q23;}
2971 else if(c1==c3) {tQ=q13; sQ=q12; fQ=q23;}
2972 else {tQ=q23; sQ=q12; fQ=q13;}
2973 }else if(term==2 && part==1){
2975 if(c1==c3) {tQ=q13; sQ=q23;}
2976 else {tQ=q23; sQ=q13;}
2977 }else if(term==2 && part==2){
2979 if(c1==c2) {tQ=q12; sQ=q23;}
2980 else {tQ=q23; sQ=q12;}
2981 }else if(term==3 && part==1){
2983 if(c1==c3) {tQ=q13; fQ=q23;}
2984 else {tQ=q23; fQ=q13;}
2985 }else if(term==3 && part==2){
2987 if(c1==c2) {tQ=q12; fQ=q23;}
2988 else {tQ=q23; fQ=q12;}
2989 }else if(term==4 && part==1){
2990 tQ=q12; sQ=q13; fQ=q23;
2991 }else if(term==4 && part==2){
2992 tQ=q13; sQ=q12; fQ=q23;
2993 }else cout<<"problem!!!!!!!!!!!!!"<<endl;
2994 }else {// fQ=ss, sQ=ss, tQ=ss
2995 if(term==1 || term==5) {fQ=q12; sQ=q13; tQ=q23;}
2996 else if(term==2 && part==1) {fQ=q12; sQ=q13; tQ=q23;}
2997 else if(term==2 && part==2) {fQ=q13; sQ=q12; tQ=q23;}
2998 else if(term==3 && part==1) {sQ=q12; fQ=q13; tQ=q23;}
2999 else if(term==3 && part==2) {sQ=q13; fQ=q12; tQ=q23;}
3000 else if(term==4 && part==1) {tQ=q12; fQ=q13; sQ=q23;}
3001 else if(term==4 && part==2) {tQ=q13; fQ=q12; sQ=q23;}
3003 }else if(fi != 5){// all the rest except pi-k-p
3007 // cases not explicity shown below are not possible
3008 if(term==1 || term==5) {sQ=q13; tQ=q23;}
3009 else if(term==2 && part==1) {sQ=q13; tQ=q23;}
3010 else if(term==3 && part==2) {sQ=q13; tQ=q23;}
3011 else if(term==4 && part==2) {tQ=q13; sQ=q23;}
3012 else cout<<"problem!!!!!!!!!!!!!"<<endl;
3014 if(c1==c3) {sQ=q13; tQ=q23;}
3015 else {sQ=q23; tQ=q13;}
3017 if(c1==c3) {tQ=q13; sQ=q23;}
3018 else {tQ=q23; sQ=q13;}
3020 }else if(key1==key3){
3023 // cases not explicity shown below are not possible
3024 if(term==1 || term==5) {sQ=q12; tQ=q23;}
3025 else if(term==2 && part==2) {sQ=q12; tQ=q23;}
3026 else if(term==3 && part==1) {sQ=q12; tQ=q23;}
3027 else if(term==4 && part==1) {tQ=q12; sQ=q23;}
3028 else cout<<"problem!!!!!!!!!!!!!!!!!!!!!!"<<endl;
3030 if(c1==c2) {sQ=q12; tQ=q23;}
3031 else {sQ=q23; tQ=q12;}
3033 if(c1==c2) {tQ=q12; sQ=q23;}
3034 else {tQ=q23; sQ=q12;}
3036 }else {// key2==key3
3039 // cases not explicity shown below are not possible
3040 if(term==1 || term==5) {sQ=q12; tQ=q13;}
3041 else if(term==3 && part==1) {sQ=q12; tQ=q13;}
3042 else if(term==3 && part==2) {sQ=q13; tQ=q12;}
3043 else if(term==4 && part==1) {tQ=q12; sQ=q13;}
3044 else if(term==4 && part==2) {tQ=q13; sQ=q12;}
3045 else cout<<"problem!!!!!!!!!!!!!!!!!!!!!!"<<endl;
3047 if(c1==c2) {sQ=q12; tQ=q13;}
3048 else {sQ=q13; tQ=q12;}
3050 if(c1==c2) {tQ=q12; sQ=q13;}
3051 else {tQ=q13; sQ=q12;}
3056 if(key2==10) {fQ=q12; sQ=q13; tQ=q23;}// pi-k-p
3057 else {fQ=q13; sQ=q12; tQ=q23;}// pi-p-k
3059 if(key2==1) {fQ=q12; sQ=q23; tQ=q13;}// k-pi-p
3060 else {fQ=q13; sQ=q23; tQ=q12;}// k-p-pi
3062 if(key2==1) {fQ=q23; sQ=q12; tQ=q13;}// p-pi-k
3063 else {fQ=q23; sQ=q13; tQ=q12;}// p-k-pi
3070 //________________________________________________________________________
3071 Float_t AliThreePionRadii::GetQinv(Short_t fi, Float_t track1[], Float_t track2[]){
3075 if(fi==0 || fi==3 || fi==5){// identical masses
3076 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));
3077 }else{// different masses
3078 Float_t px = track1[1] + track2[1];
3079 Float_t py = track1[2] + track2[2];
3080 Float_t pz = track1[3] + track2[3];
3081 Float_t pSquared = pow(track1[0]+track2[0],2) - px*px - py*py - pz*pz;
3082 Float_t deltaDOTsum = (track1[0]-track2[0])*(track1[0]+track2[0]);
3083 deltaDOTsum -= (track1[1]-track2[1])*px + (track1[2]-track2[2])*py + (track1[3]-track2[3])*pz;
3085 qinv = pow( (track1[1]-track2[1]) - deltaDOTsum*px/(pSquared),2);
3086 qinv += pow( (track1[2]-track2[2]) - deltaDOTsum*py/(pSquared),2);
3087 qinv += pow( (track1[3]-track2[3]) - deltaDOTsum*pz/(pSquared),2);
3088 qinv -= pow( (track1[0]-track2[0]) - deltaDOTsum*(track1[0]+track2[0])/(pSquared),2);
3095 //________________________________________________________________________
3096 void AliThreePionRadii::GetQosl(Float_t track1[], Float_t track2[], Float_t& qout, Float_t& qside, Float_t& qlong){
3098 Float_t p0 = track1[0] + track2[0];
3099 Float_t px = track1[1] + track2[1];
3100 Float_t py = track1[2] + track2[2];
3101 Float_t pz = track1[3] + track2[3];
3103 Float_t mt = sqrt(p0*p0 - pz*pz);
3104 Float_t pt = sqrt(px*px + py*py);
3106 Float_t v0 = track1[0] - track2[0];
3107 Float_t vx = track1[1] - track2[1];
3108 Float_t vy = track1[2] - track2[2];
3109 Float_t vz = track1[3] - track2[3];
3111 qout = (px*vx + py*vy)/pt;
3112 qside = (px*vy - py*vx)/pt;
3113 qlong = (p0*vz - pz*v0)/mt;
3115 //________________________________________________________________________
3116 Float_t AliThreePionRadii::MCWeight(Int_t charge1, Int_t charge2, Float_t r, Int_t dampIndex, Float_t qinv){
3118 Float_t radius = r/0.19733;// convert to GeV (starts at 5 fm, was 3 fm)
3120 Float_t myDamp = fDampStart + (fDampStep)*dampIndex;
3121 Float_t coulCorr12 = FSICorrelation2(charge1, charge2, qinv);
3122 if(charge1==charge2){
3123 Float_t arg=qinv*radius;
3124 Float_t EW = 1 + kappa3/(6.*pow(2.,1.5))*(8.*pow(arg,3) - 12.*arg);
3125 EW += kappa4/(24.*pow(2.,2))*(16.*pow(arg,4) -48.*pow(arg,2) + 12);
3126 return ((1-myDamp) + myDamp*(1 + exp(-pow(qinv*radius,2))*pow(EW,2))*coulCorr12);
3128 return ((1-myDamp) + myDamp*coulCorr12);
3132 //________________________________________________________________________
3133 Float_t AliThreePionRadii::MCWeight3D(Bool_t SameCharge, Int_t term, Int_t dampIndex, Float_t q12, Float_t q13, Float_t q23){
3134 if(term==5) return 1.0;
3136 Float_t radius=fRMax;
3139 Float_t myDamp = fDampStart + (fDampStep)*dampIndex;
3140 Float_t fc = sqrt(myDamp);
3142 if(SameCharge){// all three of the same charge
3143 Float_t coulCorr12 = FSICorrelation2(+1,+1, q12);// K2
3144 Float_t coulCorr13 = FSICorrelation2(+1,+1, q13);// K2
3145 Float_t coulCorr23 = FSICorrelation2(+1,+1, q23);// K2
3146 Float_t arg12=q12*radius;
3147 Float_t arg13=q13*radius;
3148 Float_t arg23=q23*radius;
3149 Float_t EW12 = 1 + kappa3/(6.*pow(2.,1.5))*(8.*pow(arg12,3) - 12.*arg12);
3150 EW12 += kappa4/(24.*pow(2.,2))*(16.*pow(arg12,4) -48.*pow(arg12,2) + 12);
3151 Float_t EW13 = 1 + kappa3/(6.*pow(2.,1.5))*(8.*pow(arg13,3) - 12.*arg13);
3152 EW13 += kappa4/(24.*pow(2.,2))*(16.*pow(arg13,4) -48.*pow(arg13,2) + 12);
3153 Float_t EW23 = 1 + kappa3/(6.*pow(2.,1.5))*(8.*pow(arg23,3) - 12.*arg23);
3154 EW23 += kappa4/(24.*pow(2.,2))*(16.*pow(arg23,4) -48.*pow(arg23,2) + 12);
3156 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);
3157 c3QS += 2*exp(-pow(radius,2)*(pow(q12,2) + pow(q13,2) + pow(q23,2))/2.)*EW12*EW13*EW23;
3158 Float_t w123 = pow(1-fc,3) + 3*fc*pow(1-fc,2);
3159 w123 += pow(fc,2)*(1-fc)*(1+exp(-pow(q12*radius,2))*pow(EW12,2))*coulCorr12;
3160 w123 += pow(fc,2)*(1-fc)*(1+exp(-pow(q13*radius,2))*pow(EW13,2))*coulCorr13;
3161 w123 += pow(fc,2)*(1-fc)*(1+exp(-pow(q23*radius,2))*pow(EW23,2))*coulCorr23;
3162 w123 += pow(fc,3)*c3QS*coulCorr12*coulCorr13*coulCorr23;
3165 return ((1-myDamp) + myDamp*(1 + exp(-pow(q12*radius,2))*pow(EW12,2))*coulCorr12);
3167 return ((1-myDamp) + myDamp*(1 + exp(-pow(q13*radius,2))*pow(EW13,2))*coulCorr13);
3169 return ((1-myDamp) + myDamp*(1 + exp(-pow(q23*radius,2))*pow(EW23,2))*coulCorr23);
3172 }else{// mixed charge case pair 12 always treated as ss
3173 Float_t coulCorr12 = FSICorrelation2(+1,+1, q12);// K2 ss
3174 Float_t coulCorr13 = FSICorrelation2(+1,-1, q13);// K2 os
3175 Float_t coulCorr23 = FSICorrelation2(+1,-1, q23);// K2 os
3176 Float_t arg12=q12*radius;
3177 Float_t EW12 = 1 + kappa3/(6.*pow(2.,1.5))*(8.*pow(arg12,3) - 12.*arg12);
3178 EW12 += kappa4/(24.*pow(2.,2))*(16.*pow(arg12,4) -48.*pow(arg12,2) + 12);
3180 Float_t c3QS = 1 + exp(-pow(q12*radius,2))*pow(EW12,2);
3181 Float_t w123 = pow(1-fc,3) + 3*fc*pow(1-fc,2);
3182 w123 += pow(fc,2)*(1-fc)*(1+exp(-pow(q12*radius,2))*pow(EW12,2))*coulCorr12;
3183 w123 += pow(fc,2)*(1-fc)*coulCorr13;
3184 w123 += pow(fc,2)*(1-fc)*coulCorr23;
3185 w123 += pow(fc,3)*c3QS*coulCorr12*coulCorr13*coulCorr23;
3188 return ((1-myDamp) + myDamp*(1 + exp(-pow(q12*radius,2))*pow(EW12,2))*coulCorr12);
3190 return ((1-myDamp) + myDamp*coulCorr13);
3192 return ((1-myDamp) + myDamp*coulCorr23);
3197 //________________________________________________________________________
3198 void AliThreePionRadii::SetFSICorrelations(Bool_t legoCase, TH1D *temp1DSS[10], TH1D *temp1DOS[10]){
3199 // read in 2-particle FSI correlations = K2
3200 // 2-particle input histo from file is binned in qinv.
3202 cout<<"LEGO call to SetFSICorrelations"<<endl;
3203 for(int mb=0; mb<10; mb++){
3204 fFSI2SS[mb] = (TH1D*)temp1DSS[mb]->Clone();
3205 fFSI2OS[mb] = (TH1D*)temp1DOS[mb]->Clone();
3207 fFSI2SS[mb]->SetDirectory(0);
3208 fFSI2OS[mb]->SetDirectory(0);
3211 cout<<"non LEGO call to SetFSICorrelations"<<endl;
3212 TFile *fsifile = new TFile("KFile.root","READ");
3213 if(!fsifile->IsOpen()) {
3214 cout<<"No FSI file found"<<endl;
3215 AliFatal("No FSI file found. Kill process.");
3216 }else {cout<<"Good FSI File Found!"<<endl;}
3217 for(int mb=0; mb<10; mb++){
3218 TString *nameK2ss = new TString("K2ss_");
3219 TString *nameK2os = new TString("K2os_");
3222 TH1D *temphistoSS = (TH1D*)fsifile->Get(nameK2ss->Data());
3223 TH1D *temphistoOS = (TH1D*)fsifile->Get(nameK2os->Data());
3225 fFSI2SS[mb] = (TH1D*)temphistoSS->Clone();
3226 fFSI2OS[mb] = (TH1D*)temphistoOS->Clone();
3227 fFSI2SS[mb]->SetDirectory(0);
3228 fFSI2OS[mb]->SetDirectory(0);
3234 for(int mb=0; mb<10; mb++){
3235 for(Int_t ii=1; ii<=fFSI2SS[mb]->GetNbinsX(); ii++){
3236 if(fFSI2SS[mb]->GetBinContent(ii) > 1.0) fFSI2SS[mb]->SetBinContent(ii, 1.0);
3237 if(fFSI2OS[mb]->GetBinContent(ii) > 10.0) fFSI2OS[mb]->SetBinContent(ii, 10.0);
3239 if(fFSI2SS[mb]->GetBinContent(ii) < 0.05) fFSI2SS[mb]->SetBinContent(ii, 0.05);
3240 if(fFSI2OS[mb]->GetBinContent(ii) < 0.9) fFSI2OS[mb]->SetBinContent(ii, 0.9);
3244 cout<<"Done reading FSI file"<<endl;
3246 //________________________________________________________________________
3247 Float_t AliThreePionRadii::FSICorrelation2(Int_t charge1, Int_t charge2, Float_t qinv){
3248 // returns 2-particle Coulomb correlations = K2
3249 Int_t qbinL = fFSI2SS[fFSIindex]->GetXaxis()->FindBin(qinv-fFSI2SS[fFSIindex]->GetXaxis()->GetBinWidth(1)/2.);
3250 Int_t qbinH = qbinL+1;
3251 if(qbinL <= 0) return 1.0;
3252 if(qbinH > fFSI2SS[fFSIindex]->GetNbinsX()) return 1.0;
3255 if(charge1==charge2){
3256 slope = fFSI2SS[fFSIindex]->GetBinContent(qbinL) - fFSI2SS[fFSIindex]->GetBinContent(qbinH);
3257 slope /= fFSI2SS[fFSIindex]->GetXaxis()->GetBinCenter(qbinL) - fFSI2SS[fFSIindex]->GetXaxis()->GetBinCenter(qbinH);
3258 return (slope*(qinv - fFSI2SS[fFSIindex]->GetXaxis()->GetBinCenter(qbinL)) + fFSI2SS[fFSIindex]->GetBinContent(qbinL));
3260 slope = fFSI2OS[fFSIindex]->GetBinContent(qbinL) - fFSI2OS[fFSIindex]->GetBinContent(qbinH);
3261 slope /= fFSI2OS[fFSIindex]->GetXaxis()->GetBinCenter(qbinL) - fFSI2OS[fFSIindex]->GetXaxis()->GetBinCenter(qbinH);
3262 return (slope*(qinv - fFSI2OS[fFSIindex]->GetXaxis()->GetBinCenter(qbinL)) + fFSI2OS[fFSIindex]->GetBinContent(qbinL));
3265 //________________________________________________________________________