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),
111 fOtherPairLocation1(),
112 fOtherPairLocation2(),
117 // Default constructor
118 for(Int_t mb=0; mb<fMbins; mb++){
119 for(Int_t edB=0; edB<fEDbins; edB++){
120 for(Int_t c1=0; c1<2; c1++){
121 for(Int_t c2=0; c2<2; c2++){
122 for(Int_t sc=0; sc<kSCLimit2; sc++){
123 for(Int_t term=0; term<2; term++){
125 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fExplicit2 = 0x0;
126 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fExplicit2QW = 0x0;
127 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fAvgP = 0x0;
128 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fIdeal = 0x0;
129 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fSmeared = 0x0;
131 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fMCqinv = 0x0;
132 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fMCqinvQW = 0x0;
133 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fPIDpurityDen = 0x0;
134 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fPIDpurityNum = 0x0;
139 for(Int_t c3=0; c3<2; c3++){
140 for(Int_t sc=0; sc<kSCLimit3; sc++){
141 for(Int_t term=0; term<5; term++){
143 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fNorm3 = 0x0;
144 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fTerms3 = 0x0;
145 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fTermsQ3 = 0x0;
146 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fIdeal = 0x0;
147 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fSmeared = 0x0;
158 // Initialize 3-pion FSI histograms
159 for(Int_t i=0; i<10; i++){
165 //________________________________________________________________________
166 AliThreePionRadii::AliThreePionRadii(const Char_t *name)
167 : AliAnalysisTaskSE(name),
180 fGenerateSignal(kFALSE),
181 fPdensityPairCut(kTRUE),
193 fCentBinHighLimit(1),
213 fMinSepPairEta(0.03),
214 fMinSepPairPhi(0.04),
231 fOtherPairLocation1(),
232 fOtherPairLocation2(),
239 fPdensityPairCut = kTRUE;
242 for(Int_t mb=0; mb<fMbins; mb++){
243 for(Int_t edB=0; edB<fEDbins; edB++){
244 for(Int_t c1=0; c1<2; c1++){
245 for(Int_t c2=0; c2<2; c2++){
246 for(Int_t sc=0; sc<kSCLimit2; sc++){
247 for(Int_t term=0; term<2; term++){
249 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fExplicit2 = 0x0;
250 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fExplicit2QW = 0x0;
251 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fAvgP = 0x0;
252 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fIdeal = 0x0;
253 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fSmeared = 0x0;
255 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fMCqinv = 0x0;
256 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fMCqinvQW = 0x0;
257 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fPIDpurityDen = 0x0;
258 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fPIDpurityNum = 0x0;
262 for(Int_t c3=0; c3<2; c3++){
263 for(Int_t sc=0; sc<kSCLimit3; sc++){
264 for(Int_t term=0; term<5; term++){
266 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fNorm3 = 0x0;
267 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fTerms3 = 0x0;
268 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fTermsQ3 = 0x0;
269 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fIdeal = 0x0;
270 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fSmeared = 0x0;
280 // Initialize 3-pion FSI histograms
281 for(Int_t i=0; i<10; i++){
287 DefineOutput(1, TList::Class());
289 //________________________________________________________________________
290 AliThreePionRadii::AliThreePionRadii(const AliThreePionRadii &obj)
291 : AliAnalysisTaskSE(obj.fname),
295 fOutputList(obj.fOutputList),
296 fPIDResponse(obj.fPIDResponse),
299 fTempStruct(obj.fTempStruct),
300 fRandomNumber(obj.fRandomNumber),
302 fMCcase(obj.fMCcase),
303 fAODcase(obj.fAODcase),
304 fPbPbcase(obj.fPbPbcase),
305 fGenerateSignal(obj.fGenerateSignal),
306 fPdensityPairCut(obj.fPdensityPairCut),
308 fFilterBit(obj.fFilterBit),
309 fMaxChi2NDF(obj.fMaxChi2NDF),
310 fMinTPCncls(obj.fMinTPCncls),
311 fBfield(obj.fBfield),
313 fFSIindex(obj.fFSIindex),
316 fMultLimit(obj.fMultLimit),
317 fCentBinLowLimit(obj.fCentBinLowLimit),
318 fCentBinHighLimit(obj.fCentBinHighLimit),
319 fEventCounter(obj.fEventCounter),
320 fEventsToMix(obj.fEventsToMix),
321 fZvertexBins(obj.fZvertexBins),
324 fQLowerCut(obj.fQLowerCut),
325 fQlimitC2(obj.fQlimitC2),
326 fQbinsC2(obj.fQbinsC2),
329 fKupperBound(obj.fKupperBound),
330 fQupperBound(obj.fQupperBound),
332 fDampStart(obj.fDampStart),
333 fDampStep(obj.fDampStep),
334 fTPCTOFboundry(obj.fTPCTOFboundry),
335 fTOFboundry(obj.fTOFboundry),
336 fSigmaCutTPC(obj.fSigmaCutTPC),
337 fSigmaCutTOF(obj.fSigmaCutTOF),
338 fMinSepPairEta(obj.fMinSepPairEta),
339 fMinSepPairPhi(obj.fMinSepPairPhi),
340 fShareQuality(obj.fShareQuality),
341 fShareFraction(obj.fShareFraction),
342 fTrueMassP(obj.fTrueMassP),
343 fTrueMassPi(obj.fTrueMassPi),
344 fTrueMassK(obj.fTrueMassK),
345 fTrueMassKs(obj.fTrueMassKs),
346 fTrueMassLam(obj.fTrueMassLam),
347 fDummyB(obj.fDummyB),
356 fOtherPairLocation1(),
357 fOtherPairLocation2(),
364 for(Int_t i=0; i<10; i++){
365 fFSI2SS[i]=obj.fFSI2SS[i];
366 fFSI2OS[i]=obj.fFSI2OS[i];
370 //________________________________________________________________________
371 AliThreePionRadii &AliThreePionRadii::operator=(const AliThreePionRadii &obj)
373 // Assignment operator
379 fOutputList = obj.fOutputList;
380 fPIDResponse = obj.fPIDResponse;
383 fTempStruct = obj.fTempStruct;
384 fRandomNumber = obj.fRandomNumber;
386 fMCcase = obj.fMCcase;
387 fAODcase = obj.fAODcase;
388 fPbPbcase = obj.fPbPbcase;
389 fGenerateSignal = obj.fGenerateSignal;
390 fPdensityPairCut = obj.fPdensityPairCut;
392 fFilterBit = obj.fFilterBit;
393 fMaxChi2NDF = obj.fMaxChi2NDF;
394 fMinTPCncls = obj.fMinTPCncls;
395 fBfield = obj.fBfield;
397 fFSIindex = obj.fFSIindex;
400 fMultLimit = obj.fMultLimit;
401 fCentBinLowLimit = obj.fCentBinLowLimit;
402 fCentBinHighLimit = obj.fCentBinHighLimit;
403 fEventCounter = obj.fEventCounter;
404 fEventsToMix = obj.fEventsToMix;
405 fZvertexBins = obj.fZvertexBins;
406 fQLowerCut = obj.fQLowerCut;
407 fQlimitC2 = obj.fQlimitC2;
408 fQbinsC2 = obj.fQbinsC2;
409 fKupperBound = obj.fKupperBound;
410 fQupperBound = obj.fQupperBound;
412 fDampStart = obj.fDampStart;
413 fDampStep = obj.fDampStep;
414 fTPCTOFboundry = obj.fTPCTOFboundry;
415 fTOFboundry = obj.fTOFboundry;
416 fSigmaCutTPC = obj.fSigmaCutTPC;
417 fSigmaCutTOF = obj.fSigmaCutTOF;
418 fMinSepPairEta = obj.fMinSepPairEta;
419 fMinSepPairPhi = obj.fMinSepPairPhi;
420 fShareQuality = obj.fShareQuality;
421 fShareFraction = obj.fShareFraction;
422 fTrueMassP = obj.fTrueMassP;
423 fTrueMassPi = obj.fTrueMassPi;
424 fTrueMassK = obj.fTrueMassK;
425 fTrueMassKs = obj.fTrueMassKs;
426 fTrueMassLam = obj.fTrueMassLam;
427 fDummyB = obj.fDummyB;
430 for(Int_t i=0; i<10; i++){
431 fFSI2SS[i]=obj.fFSI2SS[i];
432 fFSI2OS[i]=obj.fFSI2OS[i];
437 //________________________________________________________________________
438 AliThreePionRadii::~AliThreePionRadii()
441 if(fAOD) delete fAOD;
442 //if(fESD) delete fESD;
443 if(fOutputList) delete fOutputList;
444 if(fPIDResponse) delete fPIDResponse;
446 if(fEvt) delete fEvt;
447 if(fTempStruct) delete [] fTempStruct;
448 if(fRandomNumber) delete fRandomNumber;
450 for(Int_t i=0; i<fMultLimit; i++){
451 if(fPairLocationSE[i]) delete [] fPairLocationSE[i];
452 if(fPairLocationME[i]) delete [] fPairLocationME[i];
453 for(Int_t j=0; j<2; j++){
454 if(fOtherPairLocation1[j][i]) delete [] fOtherPairLocation1[j][i];
455 if(fOtherPairLocation2[j][i]) delete [] fOtherPairLocation2[j][i];
457 for(Int_t j=0; j<3; j++) if(fNormPairSwitch[j][i]) delete [] fNormPairSwitch[j][i];
458 for(Int_t j=0; j<4; j++) if(fPairSplitCut[j][i]) delete [] fPairSplitCut[j][i];
460 for(Int_t i=0; i<kPairLimit; i++) if(fTripletSkip1[i]) delete [] fTripletSkip1[i];
461 for(Int_t i=0; i<2*kPairLimit; i++) if(fTripletSkip2[i]) delete [] fTripletSkip2[i];
462 for(Int_t i=0; i<3; i++) if(fNormPairs[i]) delete [] fNormPairs[i];
464 for(Int_t mb=0; mb<fMbins; mb++){
465 if(fPbPbcase && ((mb < fCentBinLowLimit) || (mb > fCentBinHighLimit))) continue;
466 for(Int_t edB=0; edB<fEDbins; edB++){
467 for(Int_t c1=0; c1<2; c1++){
468 for(Int_t c2=0; c2<2; c2++){
469 for(Int_t sc=0; sc<kSCLimit2; sc++){
470 for(Int_t term=0; term<2; term++){
472 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;
473 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;
475 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;
476 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;
478 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;
479 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;
483 for(Int_t c3=0; c3<2; c3++){
484 for(Int_t sc=0; sc<kSCLimit3; sc++){
485 for(Int_t term=0; term<5; term++){
487 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;
488 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;
500 for(Int_t i=0; i<10; i++){
501 if(fFSI2SS[i]) delete fFSI2SS[i];
502 if(fFSI2OS[i]) delete fFSI2OS[i];
506 //________________________________________________________________________
507 void AliThreePionRadii::ParInit()
509 cout<<"AliThreePionRadii MyInit() call"<<endl;
510 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;
512 fRandomNumber = new TRandom3();
513 fRandomNumber->SetSeed(0);
517 if(fPdensityPairCut) fEventsToMix=2;
521 fTPCTOFboundry = 0.6;// TPC pid used below this momentum, TOF above but below TOF_boundry
522 fTOFboundry = 2.1;// TOF pid used below this momentum
524 ////////////////////////////////////////////////
526 fShareQuality = .5;// max
527 fShareFraction = .05;// max
528 ////////////////////////////////////////////////
531 //fMultLimits[0]=0, fMultLimits[1]=5, fMultLimits[2]=10, fMultLimits[3]=15, fMultLimits[4]=20, fMultLimits[5]=25;
532 //fMultLimits[6]=30, fMultLimits[7]=35, fMultLimits[8]=40, fMultLimits[9]=45, fMultLimits[10]=kMultLimitPP;
534 fMultLimits[0]=0, fMultLimits[1]=5; fMultLimits[2]=10; fMultLimits[3]=15; fMultLimits[4]=20;
535 fMultLimits[5]=30, fMultLimits[6]=40; fMultLimits[7]=50; fMultLimits[8]=70; fMultLimits[9]=100;
536 fMultLimits[10]=150, fMultLimits[11]=200; fMultLimits[12]=260; fMultLimits[13]=320; fMultLimits[14]=400;
537 fMultLimits[15]=500, fMultLimits[16]=600; fMultLimits[17]=700; fMultLimits[18]=850; fMultLimits[19]=1050;
538 fMultLimits[20]=2000;
541 if(fPbPbcase && fCentBinLowLimit < 10) {// PbPb 0-50%
542 fMultLimit=kMultLimitPbPb;
544 fQcut[0]=0.1;//pi-pi, pi-k, pi-p
546 fQcut[2]=0.6;//the rest
547 fNormQcutLow[0] = 0.15;//0.15
548 fNormQcutHigh[0] = 0.175;//0.175
549 fNormQcutLow[1] = 1.34;//1.34
550 fNormQcutHigh[1] = 1.4;//1.4
551 fNormQcutLow[2] = 1.1;//1.1
552 fNormQcutHigh[2] = 1.4;//1.4
556 fQupperBound = fQcut[0];
559 fDampStart = 0.5;// was 0.3
561 }else if(fPbPbcase && fCentBinLowLimit >= 10) {// PbPb 50-100%
562 fMultLimit=kMultLimitPbPb;
564 fQcut[0]=0.2;//pi-pi, pi-k, pi-p
566 fQcut[2]=1.2;//the rest
567 fNormQcutLow[0] = 0.3;//0.15
568 fNormQcutHigh[0] = 0.35;//0.175
569 fNormQcutLow[1] = 1.34;//1.34
570 fNormQcutHigh[1] = 1.4;//1.4
571 fNormQcutLow[2] = 1.1;//1.1
572 fNormQcutHigh[2] = 1.4;//1.4
576 fQupperBound = fQcut[0];
579 fDampStart = 0.5;// was 0.3
582 fMultLimit=kMultLimitPP;
587 fNormQcutLow[0] = 1.0;
588 fNormQcutHigh[0] = 1.2;// 1.5
589 fNormQcutLow[1] = 1.0;
590 fNormQcutHigh[1] = 1.2;
591 fNormQcutLow[2] = 1.0;
592 fNormQcutHigh[2] = 1.2;
599 fDampStart = 0.5;// was 0.3
603 fQLowerCut = 0.005;// was 0.005
608 fEC = new AliChaoticityEventCollection **[fZvertexBins];
609 for(UShort_t i=0; i<fZvertexBins; i++){
611 fEC[i] = new AliChaoticityEventCollection *[fMbins];
613 for(UShort_t j=0; j<fMbins; j++){
615 fEC[i][j] = new AliChaoticityEventCollection(fEventsToMix+1, fMultLimit, kPairLimit, kMCarrayLimit, fMCcase);
620 for(Int_t i=0; i<fMultLimit; i++) fDefaultsCharMult[i]='0';
621 for(Int_t i=0; i<kPairLimit; i++) fDefaultsCharSE[i]='0';
622 for(Int_t i=0; i<2*kPairLimit; i++) fDefaultsCharME[i]='0';
623 for(Int_t i=0; i<fMultLimit; i++) fDefaultsInt[i]=-1;
624 for(Int_t i=0; i<fMultLimit; i++) fPairLocationSE[i] = new TArrayI(fMultLimit,fDefaultsInt);
625 for(Int_t i=0; i<fMultLimit; i++) fPairLocationME[i] = new TArrayI(fMultLimit,fDefaultsInt);
626 for(Int_t i=0; i<kPairLimit; i++) fTripletSkip1[i] = new TArrayC(fMultLimit,fDefaultsCharSE);
627 for(Int_t i=0; i<2*kPairLimit; i++) fTripletSkip2[i] = new TArrayC(fMultLimit,fDefaultsCharME);
630 // Normalization utilities
631 for(Int_t i=0; i<fMultLimit; i++) fOtherPairLocation1[0][i] = new TArrayI(fMultLimit,fDefaultsInt);
632 for(Int_t i=0; i<fMultLimit; i++) fOtherPairLocation1[1][i] = new TArrayI(fMultLimit,fDefaultsInt);
633 for(Int_t i=0; i<fMultLimit; i++) fOtherPairLocation2[0][i] = new TArrayI(fMultLimit,fDefaultsInt);
634 for(Int_t i=0; i<fMultLimit; i++) fOtherPairLocation2[1][i] = new TArrayI(fMultLimit,fDefaultsInt);
635 for(Int_t i=0; i<fMultLimit; i++) fNormPairSwitch[0][i] = new TArrayC(fMultLimit,fDefaultsCharMult);
636 for(Int_t i=0; i<fMultLimit; i++) fNormPairSwitch[1][i] = new TArrayC(fMultLimit,fDefaultsCharMult);
637 for(Int_t i=0; i<fMultLimit; i++) fNormPairSwitch[2][i] = new TArrayC(fMultLimit,fDefaultsCharMult);
639 // Track Merging/Splitting utilities
640 for(Int_t i=0; i<fMultLimit; i++) fPairSplitCut[0][i] = new TArrayC(fMultLimit,fDefaultsCharMult);// P11
641 for(Int_t i=0; i<fMultLimit; i++) fPairSplitCut[1][i] = new TArrayC(fMultLimit,fDefaultsCharMult);// P12
642 for(Int_t i=0; i<fMultLimit; i++) fPairSplitCut[2][i] = new TArrayC(fMultLimit,fDefaultsCharMult);// P13
643 for(Int_t i=0; i<fMultLimit; i++) fPairSplitCut[3][i] = new TArrayC(fMultLimit,fDefaultsCharMult);// P23
646 fNormPairs[0] = new AliChaoticityNormPairStruct[kNormPairLimit];
647 fNormPairs[1] = new AliChaoticityNormPairStruct[kNormPairLimit];
650 fTempStruct = new AliChaoticityTrackStruct[fMultLimit];
653 fTrueMassP=0.93827, fTrueMassPi=0.13957, fTrueMassK=0.493677, fTrueMassKs=0.497614, fTrueMassLam=1.11568;
657 // Set weights, Coulomb corrections, and Momentum resolution corrections manually if not on LEGO
659 SetFSICorrelations(fLEGO);// Read in 2-particle and 3-particle FSI correlations
662 /////////////////////////////////////////////
663 /////////////////////////////////////////////
666 //________________________________________________________________________
667 void AliThreePionRadii::UserCreateOutputObjects()
672 ParInit();// Initialize my settings
675 fOutputList = new TList();
676 fOutputList->SetOwner();
678 TH3F *fVertexDist = new TH3F("fVertexDist","Vertex Distribution",20,-1,1, 20,-1,1, 600,-30,30);
679 fVertexDist->GetXaxis()->SetTitle("X Vertex (cm)");
680 fVertexDist->GetYaxis()->SetTitle("Y Vertex (cm)");
681 fVertexDist->GetZaxis()->SetTitle("Z Vertex (cm)");
682 fOutputList->Add(fVertexDist);
685 TH2F *fDCAxyDistPlus = new TH2F("fDCAxyDistPlus","DCA distribution",300,0,3., 50,0,5);
686 fOutputList->Add(fDCAxyDistPlus);
687 TH2F *fDCAzDistPlus = new TH2F("fDCAzDistPlus","DCA distribution",300,0,3., 50,0,5);
688 fOutputList->Add(fDCAzDistPlus);
689 TH2F *fDCAxyDistMinus = new TH2F("fDCAxyDistMinus","DCA distribution",300,0,3., 50,0,5);
690 fOutputList->Add(fDCAxyDistMinus);
691 TH2F *fDCAzDistMinus = new TH2F("fDCAzDistMinus","DCA distribution",300,0,3., 50,0,5);
692 fOutputList->Add(fDCAzDistMinus);
695 TH1F *fEvents1 = new TH1F("fEvents1","Events vs. fMbin",fMbins,.5,fMbins+.5);
696 fOutputList->Add(fEvents1);
697 TH1F *fEvents2 = new TH1F("fEvents2","Events vs. fMbin",fMbins,.5,fMbins+.5);
698 fOutputList->Add(fEvents2);
700 TH1F *fMultDist1 = new TH1F("fMultDist1","Multiplicity Distribution",fMultLimit,-.5,fMultLimit-.5);
701 fMultDist1->GetXaxis()->SetTitle("Multiplicity");
702 fOutputList->Add(fMultDist1);
704 TH1F *fMultDist2 = new TH1F("fMultDist2","Multiplicity Distribution",fMultLimit,-.5,fMultLimit-.5);
705 fMultDist2->GetXaxis()->SetTitle("Multiplicity");
706 fOutputList->Add(fMultDist2);
708 TH1F *fMultDist3 = new TH1F("fMultDist3","Multiplicity Distribution",fMultLimit,-.5,fMultLimit-.5);
709 fMultDist3->GetXaxis()->SetTitle("Multiplicity");
710 fOutputList->Add(fMultDist3);
712 TH3F *fPtEtaDist = new TH3F("fPtEtaDist","fPtEtaDist",2,-1.1,1.1, 300,0,3., 28,-1.4,1.4);
713 fOutputList->Add(fPtEtaDist);
715 TH3F *fPhiPtDist = new TH3F("fPhiPtDist","fPhiPtDist",2,-1.1,1.1, 120,0,2*PI, 300,0,3.);
716 fOutputList->Add(fPhiPtDist);
718 TH3F *fTOFResponse = new TH3F("fTOFResponse","TOF relative time",20,0,100, 200,0,2, 4000,-20000,20000);
719 fOutputList->Add(fTOFResponse);
720 TH3F *fTPCResponse = new TH3F("fTPCResponse","TPCsignal",20,0,100, 200,0,2, 1000,0,1000);
721 fOutputList->Add(fTPCResponse);
723 TH1F *fRejectedPairs = new TH1F("fRejectedPairs","",200,0,2);
724 fOutputList->Add(fRejectedPairs);
725 TH1I *fRejectedEvents = new TH1I("fRejectedEvents","",fMbins,0.5,fMbins+.5);
726 fOutputList->Add(fRejectedEvents);
728 TH3F *fPairsDetaDPhiNum = new TH3F("fPairsDetaDPhiNum","",10,-.5,9.5, 200,-0.2,0.2, 600,-0.3,0.3);
729 if(fMCcase) fOutputList->Add(fPairsDetaDPhiNum);
730 TH3F *fPairsDetaDPhiDen = new TH3F("fPairsDetaDPhiDen","",10,-.5,9.5, 200,-0.2,0.2, 600,-0.3,0.3);
731 if(fMCcase) fOutputList->Add(fPairsDetaDPhiDen);
732 TH3F *fPairsShareFracDPhiNum = new TH3F("fPairsShareFracDPhiNum","",10,-.5,9.5, 159,0,1, 600,-0.3,0.3);
733 if(fMCcase) fOutputList->Add(fPairsShareFracDPhiNum);
734 TH3F *fPairsShareFracDPhiDen = new TH3F("fPairsShareFracDPhiDen","",10,-.5,9.5, 159,0,1, 600,-0.3,0.3);
735 if(fMCcase) fOutputList->Add(fPairsShareFracDPhiDen);
736 TH3D* fPairsPadRowNum = new TH3D("fPairsPadRowNum","", 20,0,1, 159,0,1, 40,0,0.2);
737 if(fMCcase) fOutputList->Add(fPairsPadRowNum);
738 TH3D* fPairsPadRowDen = new TH3D("fPairsPadRowDen","", 20,0,1, 159,0,1, 40,0,0.2);
739 if(fMCcase) fOutputList->Add(fPairsPadRowDen);
743 TH3D *fPrimarySCPionPairs = new TH3D("fPrimarySCPionPairs","",fMbins,.5,fMbins+.5, 20,0,1, 20,0,0.2);
744 if(fMCcase) fOutputList->Add(fPrimarySCPionPairs);
745 TH3D *fAllSCPionPairs = new TH3D("fAllSCPionPairs","",fMbins,.5,fMbins+.5, 20,0,1, 20,0,0.2);
746 if(fMCcase) fOutputList->Add(fAllSCPionPairs);
747 TH3D *fPrimaryMCPionPairs = new TH3D("fPrimaryMCPionPairs","",fMbins,.5,fMbins+.5, 20,0,1, 20,0,0.2);
748 if(fMCcase) fOutputList->Add(fPrimaryMCPionPairs);
749 TH3D *fAllMCPionPairs = new TH3D("fAllMCPionPairs","",fMbins,.5,fMbins+.5, 20,0,1, 20,0,0.2);
750 if(fMCcase) fOutputList->Add(fAllMCPionPairs);
752 TProfile *fAvgMult = new TProfile("fAvgMult","",fMbins,.5,fMbins+.5, 0,1500,"");
753 fOutputList->Add(fAvgMult);
754 TH2D *fAvgMultHisto2D = new TH2D("fAvgMultHisto2D","",fMbins,.5,fMbins+.5, 1000,0.5,2000.5);
755 fOutputList->Add(fAvgMultHisto2D);
758 TH2D *fTrackChi2NDF = new TH2D("fTrackChi2NDF","",20,0,100, 100,0,10);
759 fOutputList->Add(fTrackChi2NDF);
760 TH2D *fTrackTPCncls = new TH2D("fTrackTPCncls","",20,0,100, 110,50,160);
761 fOutputList->Add(fTrackTPCncls);
764 TH3D *fTPNRejects1 = new TH3D("fTPNRejects1","",fQbins,0,fQupperBound, fQbins,0,fQupperBound, fQbins,0,fQupperBound);
765 fOutputList->Add(fTPNRejects1);
766 TH3D *fTPNRejects2 = new TH3D("fTPNRejects2","",fQbins,0,fQupperBound, fQbins,0,fQupperBound, fQbins,0,fQupperBound);
767 fOutputList->Add(fTPNRejects2);
768 TH3D *fTPNRejects3 = new TH3D("fTPNRejects3","",fQbins,0,fQupperBound, fQbins,0,fQupperBound, fQbins,0,fQupperBound);
769 fOutputList->Add(fTPNRejects3);
770 TH3D *fTPNRejects4 = new TH3D("fTPNRejects4","",fQbins,0,fQupperBound, fQbins,0,fQupperBound, fQbins,0,fQupperBound);
771 fOutputList->Add(fTPNRejects4);
772 TH3D *fTPNRejects5 = new TH3D("fTPNRejects5","",fQbins,0,fQupperBound, fQbins,0,fQupperBound, fQbins,0,fQupperBound);
773 fOutputList->Add(fTPNRejects5);
776 TH3D *fKt3DistTerm1 = new TH3D("fKt3DistTerm1","",fMbins,.5,fMbins+.5, 20,0,1, 20,0,0.2);
777 TH3D *fKt3DistTerm5 = new TH3D("fKt3DistTerm5","",fMbins,.5,fMbins+.5, 20,0,1, 20,0,0.2);
778 fOutputList->Add(fKt3DistTerm1);
779 fOutputList->Add(fKt3DistTerm5);
781 TH1D *fMCWeight3DTerm1SC = new TH1D("fMCWeight3DTerm1SC","", 20,0,0.2);
782 TH1D *fMCWeight3DTerm1SCden = new TH1D("fMCWeight3DTerm1SCden","", 20,0,0.2);
783 TH1D *fMCWeight3DTerm2SC = new TH1D("fMCWeight3DTerm2SC","", 20,0,0.2);
784 TH1D *fMCWeight3DTerm2SCden = new TH1D("fMCWeight3DTerm2SCden","", 20,0,0.2);
785 TH1D *fMCWeight3DTerm1MC = new TH1D("fMCWeight3DTerm1MC","", 20,0,0.2);
786 TH1D *fMCWeight3DTerm1MCden = new TH1D("fMCWeight3DTerm1MCden","", 20,0,0.2);
787 TH1D *fMCWeight3DTerm2MC = new TH1D("fMCWeight3DTerm2MC","", 20,0,0.2);
788 TH1D *fMCWeight3DTerm2MCden = new TH1D("fMCWeight3DTerm2MCden","", 20,0,0.2);
789 TH1D *fMCWeight3DTerm3MC = new TH1D("fMCWeight3DTerm3MC","", 20,0,0.2);
790 TH1D *fMCWeight3DTerm3MCden = new TH1D("fMCWeight3DTerm3MCden","", 20,0,0.2);
791 TH1D *fMCWeight3DTerm4MC = new TH1D("fMCWeight3DTerm4MC","", 20,0,0.2);
792 TH1D *fMCWeight3DTerm4MCden = new TH1D("fMCWeight3DTerm4MCden","", 20,0,0.2);
793 fOutputList->Add(fMCWeight3DTerm1SC);
794 fOutputList->Add(fMCWeight3DTerm1SCden);
795 fOutputList->Add(fMCWeight3DTerm2SC);
796 fOutputList->Add(fMCWeight3DTerm2SCden);
797 fOutputList->Add(fMCWeight3DTerm1MC);
798 fOutputList->Add(fMCWeight3DTerm1MCden);
799 fOutputList->Add(fMCWeight3DTerm2MC);
800 fOutputList->Add(fMCWeight3DTerm2MCden);
801 fOutputList->Add(fMCWeight3DTerm3MC);
802 fOutputList->Add(fMCWeight3DTerm3MCden);
803 fOutputList->Add(fMCWeight3DTerm4MC);
804 fOutputList->Add(fMCWeight3DTerm4MCden);
806 TH2D *fdNchdEtaResponse = new TH2D("fdNchdEtaResponse","",15,0,15, 15,0,15);
807 TH2D *fNpionTrueDist = new TH2D("fNpionTrueDist","",fMbins,.5,fMbins+.5, 1000,0.5,2000.5);
808 TH2D *fNchTrueDist = new TH2D("fNchTrueDist","",fMbins,.5,fMbins+.5, 1000,0.5,2000.5);
809 if(fMCcase) fOutputList->Add(fdNchdEtaResponse);
810 if(fMCcase) fOutputList->Add(fNpionTrueDist);
811 if(fMCcase) fOutputList->Add(fNchTrueDist);
812 TH2D *fdCentVsNchdEta = new TH2D("fdCentVsNchdEta","",fMbins,.5,fMbins+.5, 15,0,15);
813 if(fPbPbcase) fOutputList->Add(fdCentVsNchdEta);
816 if(fPdensityPairCut){
818 for(Int_t mb=0; mb<fMbins; mb++){
819 if((mb < fCentBinLowLimit) || (mb > fCentBinHighLimit)) continue;
821 for(Int_t edB=0; edB<fEDbins; edB++){
822 for(Int_t c1=0; c1<2; c1++){
823 for(Int_t c2=0; c2<2; c2++){
824 for(Int_t sc=0; sc<kSCLimit2; sc++){
825 for(Int_t term=0; term<2; term++){
827 TString *nameEx2 = new TString("Explicit2_Charge1_");
829 nameEx2->Append("_Charge2_");
831 nameEx2->Append("_SC_");
833 nameEx2->Append("_M_");
835 nameEx2->Append("_ED_");
837 nameEx2->Append("_Term_");
840 if(sc==0 || sc==3 || sc==5){
841 if( (c1+c2)==1 ) {if(c1!=0) continue;}// skip degenerate histogram
844 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);
845 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fExplicit2);
846 TString *nameEx2QW=new TString(nameEx2->Data());
847 nameEx2QW->Append("_QW");
848 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);
849 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fExplicit2QW);
850 TString *nameAvgP=new TString(nameEx2->Data());
851 nameAvgP->Append("_AvgP");
852 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,"");
853 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fAvgP);
855 // Momentum resolution histos
856 if(fMCcase && sc==0){
857 TString *nameIdeal = new TString(nameEx2->Data());
858 nameIdeal->Append("_Ideal");
859 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);
860 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fIdeal);
861 TString *nameSmeared = new TString(nameEx2->Data());
862 nameSmeared->Append("_Smeared");
863 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);
864 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fSmeared);
866 TString *nameEx2MC=new TString(nameEx2->Data());
867 nameEx2MC->Append("_MCqinv");
868 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fMCqinv = new TH1D(nameEx2MC->Data(),"",fQbinsC2,0,fQlimitC2);
869 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fMCqinv);
870 TString *nameEx2MCQW=new TString(nameEx2->Data());
871 nameEx2MCQW->Append("_MCqinvQW");
872 Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fMCqinvQW = new TH1D(nameEx2MCQW->Data(),"",fQbinsC2,0,fQlimitC2);
873 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fMCqinvQW);
875 TString *nameEx2PIDpurityDen=new TString(nameEx2->Data());
876 nameEx2PIDpurityDen->Append("_PIDpurityDen");
877 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);
878 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fPIDpurityDen);
879 TString *nameEx2PIDpurityNum=new TString(nameEx2->Data());
880 nameEx2PIDpurityNum->Append("_PIDpurityNum");
881 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);
882 fOutputList->Add(Charge1[c1].Charge2[c2].SC[sc].MB[mb].EDB[edB].TwoPT[term].fPIDpurityNum);
890 for(Int_t c3=0; c3<2; c3++){
891 for(Int_t sc=0; sc<kSCLimit3; sc++){
892 for(Int_t term=0; term<5; term++){
893 TString *nameEx3 = new TString("Explicit3_Charge1_");
895 nameEx3->Append("_Charge2_");
897 nameEx3->Append("_Charge3_");
899 nameEx3->Append("_SC_");
901 nameEx3->Append("_M_");
903 nameEx3->Append("_ED_");
905 nameEx3->Append("_Term_");
908 TString *namePC3 = new TString("PairCut3_Charge1_");
910 namePC3->Append("_Charge2_");
912 namePC3->Append("_Charge3_");
914 namePC3->Append("_SC_");
916 namePC3->Append("_M_");
918 namePC3->Append("_ED_");
920 namePC3->Append("_Term_");
923 ///////////////////////////////////////
924 // skip degenerate histograms
925 if(sc==0 || sc==6 || sc==9){// Identical species
926 if( (c1+c2+c3)==1) {if(c3!=1) continue;}
927 if( (c1+c2+c3)==2) {if(c1!=0) continue;}
929 if( (c1+c2)==1) {if(c1!=0) continue;}
930 }else {}// do nothing for pi-k-p case
932 /////////////////////////////////////////
937 if(fPdensityPairCut){
938 TString *nameNorm=new TString(namePC3->Data());
939 nameNorm->Append("_Norm");
940 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);
941 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fNorm3);
944 TString *nameQ3=new TString(namePC3->Data());
945 nameQ3->Append("_Q3");
946 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fTermsQ3 = new TH1D(nameQ3->Data(),"", 200,0,2.0);
947 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fTermsQ3);
949 TString *name3DQ=new TString(namePC3->Data());
950 name3DQ->Append("_3D");
951 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);
952 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fTerms3);
955 if(sc==0 && fMCcase==kTRUE){
956 TString *name3DMomResIdeal=new TString(namePC3->Data());
957 name3DMomResIdeal->Append("_Ideal");
958 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fIdeal = new TH1D(name3DMomResIdeal->Data(),"", 200,0,2.0);
959 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fIdeal);
960 TString *name3DMomResSmeared=new TString(namePC3->Data());
961 name3DMomResSmeared->Append("_Smeared");
962 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fSmeared = new TH1D(name3DMomResSmeared->Data(),"", 200,0,2.0);
963 fOutputList->Add(Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[mb].EDB[edB].ThreePT[term].fSmeared);
983 TProfile *fQsmearMean = new TProfile("fQsmearMean","",2,0.5,2.5, -0.2,0.2,"");
984 fOutputList->Add(fQsmearMean);
985 TProfile *fQsmearSq = new TProfile("fQsmearSq","",2,0.5,2.5, -2,2,"");
986 fOutputList->Add(fQsmearSq);
987 TH1D *fQDist = new TH1D("fQDist","",200,-.2,.2);
988 fOutputList->Add(fQDist);
992 ////////////////////////////////////
993 ///////////////////////////////////
995 PostData(1, fOutputList);
998 //________________________________________________________________________
999 void AliThreePionRadii::Exec(Option_t *)
1002 // Called for each event
1004 if(fEventCounter%1000==0) cout<<"=========== Event # "<<fEventCounter<<" ==========="<<endl;
1006 if(!fAODcase) {cout<<"ESDs not supported"<<endl; return;}
1008 fAOD = dynamic_cast<AliAODEvent*> (InputEvent());
1009 if (!fAOD) {Printf("ERROR: fAOD not available"); return;}
1014 if(fAOD->GetRunNumber() >= 136851 && fAOD->GetRunNumber() <= 139517){// 10h data
1015 Bool_t isSelected1 = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kMB);
1016 if(!isSelected1 && !fMCcase) {return;}
1018 if(fAOD->GetRunNumber() >= 167693 && fAOD->GetRunNumber() <= 170593){// 11h data
1019 Bool_t isSelected1 = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kMB);
1020 Bool_t isSelected2 = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kCentral);
1021 Bool_t isSelected3 = (((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected() & AliVEvent::kSemiCentral);
1022 if(!isSelected1 && !isSelected2 && !isSelected3 && !fMCcase) {return;}
1026 ///////////////////////////////////////////////////////////
1027 const AliAODVertex *primaryVertexAOD;
1028 AliCentrality *centrality;// for AODs and ESDs
1031 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
1032 AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
1033 fPIDResponse = inputHandler->GetPIDResponse();
1036 TClonesArray *mcArray = 0x0;
1041 mcArray = (TClonesArray*)fAOD->FindListObject(AliAODMCParticle::StdBranchName());
1042 if(!mcArray || mcArray->GetEntriesFast() >= kMCarrayLimit){
1043 cout<<"No MC particle branch found or Array too large!!"<<endl;
1047 // Count true Nch at mid-rapidity
1048 for(Int_t mctrackN=0; mctrackN<mcArray->GetEntriesFast(); mctrackN++){
1049 AliAODMCParticle *mcParticle = (AliAODMCParticle*)mcArray->At(mctrackN);
1050 if(!mcParticle) continue;
1051 if(fabs(mcParticle->Eta())>0.8) continue;
1052 if(mcParticle->Charge()!=-3 && mcParticle->Charge()!=+3) continue;// x3 by convention
1053 if(mcParticle->Pt() < 0.16 || mcParticle->Pt() > 1.0) continue;
1054 if(!mcParticle->IsPrimary()) continue;
1055 if(!mcParticle->IsPhysicalPrimary()) continue;
1057 if(abs(mcParticle->GetPdgCode())==211) mcdNpion++;
1064 Int_t positiveTracks=0, negativeTracks=0;
1065 Int_t myTracks=0, pionCount=0, kaonCount=0, protonCount=0;
1067 Double_t vertex[3]={0};
1069 Double_t zstep=2*10/Double_t(fZvertexBins), zstart=-10.;
1070 /////////////////////////////////////////////////
1073 Float_t centralityPercentile=0;
1074 //Float_t cStep=5.0, cStart=0;
1075 Int_t trackletMult = 0;
1077 if(fAODcase){// AOD case
1080 centrality = fAOD->GetCentrality();
1081 centralityPercentile = centrality->GetCentralityPercentile("V0M");
1082 if(centralityPercentile == 0) {/*cout<<"Centrality = 0, skipping event"<<endl;*/ return;}
1083 //if((centralityPercentile < 5*fCentBinLowLimit) || (centralityPercentile>= 5*(fCentBinHighLimit+1))) {/*cout<<"Centrality out of Range. Skipping Event"<<endl;*/ return;}
1084 cout<<"Centrality % = "<<centralityPercentile<<endl;
1086 //cout<<"AOD multiplicity = "<<fAOD->GetNumberOfTracks()<<endl;
1092 ////////////////////////////////
1094 ((TH1F*)fOutputList->FindObject("fMultDist1"))->Fill(fAOD->GetNumberOfTracks());
1095 primaryVertexAOD = fAOD->GetPrimaryVertex();
1096 vertex[0]=primaryVertexAOD->GetX(); vertex[1]=primaryVertexAOD->GetY(); vertex[2]=primaryVertexAOD->GetZ();
1098 if(fabs(vertex[2]) > 10) {/*cout<<"Zvertex Out of Range. Skip Event"<<endl;*/ return;} // Z-Vertex Cut
1099 ((TH3F*)fOutputList->FindObject("fVertexDist"))->Fill(vertex[0], vertex[1], vertex[2]);
1101 if(fAOD->IsPileupFromSPD()) {/*cout<<"PileUpEvent. Skip Event"<<endl;*/ return;} // Reject Pile-up events
1102 if(primaryVertexAOD->GetNContributors() < 1) {/*cout<<"Bad Vertex. Skip Event"<<endl;*/ return;}
1104 ((TH1F*)fOutputList->FindObject("fMultDist2"))->Fill(fAOD->GetNumberOfTracks());
1106 fBfield = fAOD->GetMagneticField();
1108 for(Int_t i=0; i<fZvertexBins; i++){
1109 if( (vertex[2] >= zstart+i*zstep) && (vertex[2] < zstart+(i+1)*zstep) ){
1115 AliAODTracklets *tracklets = (AliAODTracklets*)fAOD->GetTracklets();
1116 for(Int_t trackletN=0; trackletN<tracklets->GetNumberOfTracklets(); trackletN++){
1117 if(tracklets->GetTheta(trackletN) > 1.0904 && tracklets->GetTheta(trackletN) < 2.0512) trackletMult++;// |eta|<0.5 tracklets
1121 /////////////////////////////
1122 // Create Shuffled index list
1123 Int_t randomIndex[fAOD->GetNumberOfTracks()];
1124 for (Int_t i = 0; i < fAOD->GetNumberOfTracks(); i++) randomIndex[i]=i;
1125 Shuffle(randomIndex,0,fAOD->GetNumberOfTracks()-1);
1126 /////////////////////////////
1129 for (Int_t i = 0; i < fAOD->GetNumberOfTracks(); i++) {
1130 AliAODTrack* aodtrack = fAOD->GetTrack(randomIndex[i]);
1131 if (!aodtrack) continue;
1132 if(myTracks >= fMultLimit) {cout<<"More tracks than Track Limit"<<endl; return;}
1134 status=aodtrack->GetStatus();
1137 if(!aodtrack->TestFilterBit(BIT(fFilterBit))) continue;// AOD filterBit cut
1139 if(aodtrack->Pt() < 0.16) continue;
1140 if(fabs(aodtrack->Eta()) > 0.8) continue;
1143 Bool_t goodMomentum = aodtrack->GetPxPyPz( fTempStruct[myTracks].fP);
1144 if(!goodMomentum) continue;
1145 aodtrack->GetXYZ( fTempStruct[myTracks].fX);
1150 dca2[0] = sqrt( pow(fTempStruct[myTracks].fX[0] - vertex[0],2) + pow(fTempStruct[myTracks].fX[1] - vertex[1],2));
1151 dca2[1] = sqrt( pow(fTempStruct[myTracks].fX[2] - vertex[2],2));
1152 dca3d = sqrt( pow(dca2[0],2) + pow(dca2[1],2));
1154 fTempStruct[myTracks].fStatus = status;
1155 fTempStruct[myTracks].fFiltermap = aodtrack->GetFilterMap();
1156 fTempStruct[myTracks].fId = aodtrack->GetID();
1157 fTempStruct[myTracks].fLabel = aodtrack->GetLabel();
1158 fTempStruct[myTracks].fPhi = atan2(fTempStruct[myTracks].fP[1], fTempStruct[myTracks].fP[0]);
1159 if(fTempStruct[myTracks].fPhi < 0) fTempStruct[myTracks].fPhi += 2*PI;
1160 fTempStruct[myTracks].fPt = sqrt(pow(fTempStruct[myTracks].fP[0],2) + pow(fTempStruct[myTracks].fP[1],2));
1161 fTempStruct[myTracks].fMom = sqrt( pow(fTempStruct[myTracks].fPt,2) + pow(fTempStruct[myTracks].fP[2],2) );
1162 fTempStruct[myTracks].fEta = aodtrack->Eta();
1163 fTempStruct[myTracks].fCharge = aodtrack->Charge();
1164 fTempStruct[myTracks].fDCAXY = dca2[0];
1165 fTempStruct[myTracks].fDCAZ = dca2[1];
1166 fTempStruct[myTracks].fDCA = dca3d;
1167 fTempStruct[myTracks].fClusterMap = aodtrack->GetTPCClusterMap();
1168 fTempStruct[myTracks].fSharedMap = aodtrack->GetTPCSharedMap();
1172 if(fTempStruct[myTracks].fMom > 0.9999) continue;// upper P bound
1173 if(fTempStruct[myTracks].fPt > 0.9999) continue;// upper P bound
1174 if(fTempStruct[myTracks].fP[2] > 0.9999) continue;// upper P bound
1176 if(fTempStruct[myTracks].fCharge==+1) {
1177 ((TH2F*)fOutputList->FindObject("fDCAxyDistPlus"))->Fill(fTempStruct[myTracks].fPt, dca2[0]);
1178 ((TH2F*)fOutputList->FindObject("fDCAzDistPlus"))->Fill(fTempStruct[myTracks].fPt, dca2[1]);
1180 ((TH2F*)fOutputList->FindObject("fDCAxyDistMinus"))->Fill(fTempStruct[myTracks].fPt, dca2[0]);
1181 ((TH2F*)fOutputList->FindObject("fDCAzDistMinus"))->Fill(fTempStruct[myTracks].fPt, dca2[1]);
1184 ((TH3F*)fOutputList->FindObject("fPhiPtDist"))->Fill(aodtrack->Charge(), aodtrack->Phi(), aodtrack->Pt());
1185 ((TH3F*)fOutputList->FindObject("fPtEtaDist"))->Fill(aodtrack->Charge(), aodtrack->Pt(), aodtrack->Eta());
1189 fTempStruct[myTracks].fElectron = kFALSE;
1190 fTempStruct[myTracks].fPion = kFALSE;
1191 fTempStruct[myTracks].fKaon = kFALSE;
1192 fTempStruct[myTracks].fProton = kFALSE;
1194 Float_t nSigmaTPC[5];
1195 Float_t nSigmaTOF[5];
1196 nSigmaTPC[0]=10; nSigmaTPC[1]=10; nSigmaTPC[2]=10; nSigmaTPC[3]=10; nSigmaTPC[4]=10;
1197 nSigmaTOF[0]=10; nSigmaTOF[1]=10; nSigmaTOF[2]=10; nSigmaTOF[3]=10; nSigmaTOF[4]=10;
1198 fTempStruct[myTracks].fTOFhit = kFALSE;// default
1199 Float_t signalTPC=0, signalTOF=0;
1200 Double_t integratedTimesTOF[10]={0};
1203 if(fFilterBit != 7 || (fMCcase && !fPbPbcase)) {
1204 nSigmaTPC[0]=fabs(fPIDResponse->NumberOfSigmasTPC(aodtrack,AliPID::kElectron));
1205 nSigmaTPC[1]=fabs(fPIDResponse->NumberOfSigmasTPC(aodtrack,AliPID::kMuon));
1206 nSigmaTPC[2]=fabs(fPIDResponse->NumberOfSigmasTPC(aodtrack,AliPID::kPion));
1207 nSigmaTPC[3]=fabs(fPIDResponse->NumberOfSigmasTPC(aodtrack,AliPID::kKaon));
1208 nSigmaTPC[4]=fabs(fPIDResponse->NumberOfSigmasTPC(aodtrack,AliPID::kProton));
1210 nSigmaTOF[0]=fabs(fPIDResponse->NumberOfSigmasTOF(aodtrack,AliPID::kElectron));
1211 nSigmaTOF[1]=fabs(fPIDResponse->NumberOfSigmasTOF(aodtrack,AliPID::kMuon));
1212 nSigmaTOF[2]=fabs(fPIDResponse->NumberOfSigmasTOF(aodtrack,AliPID::kPion));
1213 nSigmaTOF[3]=fabs(fPIDResponse->NumberOfSigmasTOF(aodtrack,AliPID::kKaon));
1214 nSigmaTOF[4]=fabs(fPIDResponse->NumberOfSigmasTOF(aodtrack,AliPID::kProton));
1215 signalTPC = aodtrack->GetTPCsignal();
1216 if( (status&AliESDtrack::kTOFpid)!=0 && (status&AliESDtrack::kTIME)!=0 && (status&AliESDtrack::kTOFout)!=0 && (status&AliESDtrack::kTOFmismatch)<=0){// good tof hit
1217 fTempStruct[myTracks].fTOFhit = kTRUE;
1218 signalTOF = aodtrack->GetTOFsignal();
1219 aodtrack->GetIntegratedTimes(integratedTimesTOF);
1220 }else fTempStruct[myTracks].fTOFhit = kFALSE;
1222 }else {// FilterBit 7 PID workaround
1224 for(Int_t j = 0; j < fAOD->GetNumberOfTracks(); j++) {
1225 AliAODTrack* aodTrack2 = fAOD->GetTrack(j);
1226 if (!aodTrack2) continue;
1227 if(aodtrack->GetID() != (-aodTrack2->GetID() - 1)) continue;// (-aodTrack2->GetID() - 1)
1229 UInt_t status2=aodTrack2->GetStatus();
1231 nSigmaTPC[0]=fabs(fPIDResponse->NumberOfSigmasTPC(aodTrack2,AliPID::kElectron));
1232 nSigmaTPC[1]=fabs(fPIDResponse->NumberOfSigmasTPC(aodTrack2,AliPID::kMuon));
1233 nSigmaTPC[2]=fabs(fPIDResponse->NumberOfSigmasTPC(aodTrack2,AliPID::kPion));
1234 nSigmaTPC[3]=fabs(fPIDResponse->NumberOfSigmasTPC(aodTrack2,AliPID::kKaon));
1235 nSigmaTPC[4]=fabs(fPIDResponse->NumberOfSigmasTPC(aodTrack2,AliPID::kProton));
1237 nSigmaTOF[0]=fabs(fPIDResponse->NumberOfSigmasTOF(aodTrack2,AliPID::kElectron));
1238 nSigmaTOF[1]=fabs(fPIDResponse->NumberOfSigmasTOF(aodTrack2,AliPID::kMuon));
1239 nSigmaTOF[2]=fabs(fPIDResponse->NumberOfSigmasTOF(aodTrack2,AliPID::kPion));
1240 nSigmaTOF[3]=fabs(fPIDResponse->NumberOfSigmasTOF(aodTrack2,AliPID::kKaon));
1241 nSigmaTOF[4]=fabs(fPIDResponse->NumberOfSigmasTOF(aodTrack2,AliPID::kProton));
1242 signalTPC = aodTrack2->GetTPCsignal();
1244 if( (status2&AliESDtrack::kTOFpid)!=0 && (status2&AliESDtrack::kTIME)!=0 && (status2&AliESDtrack::kTOFout)!=0 && (status2&AliESDtrack::kTOFmismatch)<=0){// good tof hit
1245 fTempStruct[myTracks].fTOFhit = kTRUE;
1246 signalTOF = aodTrack2->GetTOFsignal();
1247 aodTrack2->GetIntegratedTimes(integratedTimesTOF);
1248 }else fTempStruct[myTracks].fTOFhit = kFALSE;
1251 }// FilterBit 7 PID workaround
1255 ((TH3F*)fOutputList->FindObject("fTPCResponse"))->Fill(centralityPercentile, fTempStruct[myTracks].fMom, signalTPC);
1256 if(fTempStruct[myTracks].fTOFhit) {
1257 ((TH3F*)fOutputList->FindObject("fTOFResponse"))->Fill(centralityPercentile, fTempStruct[myTracks].fMom, signalTOF - integratedTimesTOF[3]);
1261 // Use TOF if good hit and above threshold
1262 if(fTempStruct[myTracks].fTOFhit && fTempStruct[myTracks].fMom > fTPCTOFboundry){
1263 if(nSigmaTOF[0]<fSigmaCutTOF) fTempStruct[myTracks].fElectron = kTRUE;// Electron candidate
1264 if(nSigmaTOF[2]<fSigmaCutTOF) fTempStruct[myTracks].fPion = kTRUE;// Pion candidate
1265 if(nSigmaTOF[3]<fSigmaCutTOF) fTempStruct[myTracks].fKaon = kTRUE;// Kaon candidate
1266 if(nSigmaTOF[4]<fSigmaCutTOF) fTempStruct[myTracks].fProton = kTRUE;// Proton candidate
1267 }else {// TPC info instead
1268 if(nSigmaTPC[0]<fSigmaCutTPC) fTempStruct[myTracks].fElectron = kTRUE;// Electron candidate
1269 if(nSigmaTPC[2]<fSigmaCutTPC) fTempStruct[myTracks].fPion = kTRUE;// Pion candidate
1270 if(nSigmaTPC[3]<fSigmaCutTPC) fTempStruct[myTracks].fKaon = kTRUE;// Kaon candidate
1271 if(nSigmaTPC[4]<fSigmaCutTPC) fTempStruct[myTracks].fProton = kTRUE;// Proton candidate
1275 // Ensure there is only 1 candidate per track
1276 if(fTempStruct[myTracks].fElectron && fTempStruct[myTracks].fMom < 0.45) continue;// Remove electron band
1277 if(!fTempStruct[myTracks].fPion && !fTempStruct[myTracks].fKaon && !fTempStruct[myTracks].fProton) continue;
1278 if(fTempStruct[myTracks].fPion && fTempStruct[myTracks].fKaon) continue;
1279 if(fTempStruct[myTracks].fPion && fTempStruct[myTracks].fProton) continue;
1280 if(fTempStruct[myTracks].fKaon && fTempStruct[myTracks].fProton) continue;
1281 if(fTempStruct[myTracks].fPion && fTempStruct[myTracks].fKaon && fTempStruct[myTracks].fProton) continue;
1282 ////////////////////////
1283 if(fTempStruct[myTracks].fProton && fTempStruct[myTracks].fMom < 0.25) continue;//extra cut for protons
1285 if(!fTempStruct[myTracks].fPion) continue;// only pions
1290 if(fTempStruct[myTracks].fPion) {// pions
1291 fTempStruct[myTracks].fEaccepted = sqrt(pow(fTempStruct[myTracks].fMom,2) + pow(fTrueMassPi,2));
1292 fTempStruct[myTracks].fKey = 1;
1293 }else if(fTempStruct[myTracks].fKaon){// kaons
1294 fTempStruct[myTracks].fEaccepted = sqrt(pow(fTempStruct[myTracks].fMom,2) + pow(fTrueMassK,2));;
1295 fTempStruct[myTracks].fKey = 10;
1297 fTempStruct[myTracks].fEaccepted = sqrt(pow(fTempStruct[myTracks].fMom,2) + pow(fTrueMassP,2));;
1298 fTempStruct[myTracks].fKey = 100;
1302 ((TH2D*)fOutputList->FindObject("fTrackChi2NDF"))->Fill(centralityPercentile, aodtrack->Chi2perNDF());
1303 ((TH2D*)fOutputList->FindObject("fTrackTPCncls"))->Fill(centralityPercentile, aodtrack->GetTPCncls());
1304 if(aodtrack->Chi2perNDF() > fMaxChi2NDF) continue;
1305 if(aodtrack->GetTPCncls() < fMinTPCncls) continue;
1308 if(aodtrack->Charge() > 0) positiveTracks++;
1309 else negativeTracks++;
1311 if(fTempStruct[myTracks].fPion) pionCount++;
1312 if(fTempStruct[myTracks].fKaon) kaonCount++;
1313 if(fTempStruct[myTracks].fProton) protonCount++;
1318 }else {// ESD tracks
1319 cout<<"ESDs not supported currently"<<endl;
1325 ((TH1F*)fOutputList->FindObject("fMultDist3"))->Fill(myTracks);
1329 //cout<<"There are "<<myTracks<<" myTracks"<<endl;
1330 //cout<<"pionCount = "<<pionCount<<" kaonCount = "<<kaonCount<<" protonCount = "<<protonCount<<endl;
1332 /////////////////////////////////////////
1333 // Pion Multiplicity Cut (To ensure all Correlation orders are present in each event)
1334 if(myTracks < 3) {/*cout<<"Less than 3 tracks. Skipping Event."<<endl;*/ return;}
1335 /////////////////////////////////////////
1338 ////////////////////////////////
1339 ///////////////////////////////
1340 // Mbin determination
1343 for(Int_t i=0; i<fCentBins; i++){
1344 if( pionCount >= fMultLimits[i] && pionCount < fMultLimits[i+1]) {fMbin = fCentBins-i-1; break;}
1347 //if(centralityPercentile >= 5*i && centralityPercentile < 5*(i+1)) {fMbin=i; break;}
1349 //if( (pow(trackletMult,1/3.) >= fMultLimits[i]) && (pow(trackletMult,1/3.) < fMultLimits[i+1])) {fMbin=i; break;}
1351 //if( ( pionCount > fMultLimits[i]) && ( pionCount <= fMultLimits[i+1]) ) { fMbin=i; break;}// Mbin 0 has 0-5 pions
1356 if(fMbin==-1) {cout<<pionCount<<" Bad Mbin+++++++++++++++++++++++++++++++++++++++++++++++++++"<<endl; return;}
1357 if(fMbin < fCentBinLowLimit || fMbin > fCentBinHighLimit) {cout<<"Mult out of range"<<endl; return;}
1362 if(fMbin==0) fFSIindex = 0;//0-5%
1363 else if(fMbin==1) fFSIindex = 1;//5-10%
1364 else if(fMbin<=3) fFSIindex = 2;//10-20%
1365 else if(fMbin<=5) fFSIindex = 3;//20-30%
1366 else if(fMbin<=7) fFSIindex = 4;//30-40%
1367 else if(fMbin<=9) fFSIindex = 5;//40-50%
1368 else if(fMbin<=12) fFSIindex = 6;//40-50%
1369 else if(fMbin<=15) fFSIindex = 7;//40-50%
1370 else if(fMbin<=18) fFSIindex = 8;//40-50%
1371 else fFSIindex = 8;//90-100%
1372 }else fFSIindex = 9;// pp and pPb
1374 //////////////////////////////////////////////////
1375 fEDbin=0;// Extra Dimension bin (Kt, (Kt-Psi),....)
1376 //////////////////////////////////////////////////
1378 //cout<<fMbin<<" "<<pionCount<<endl;
1380 ((TH1F*)fOutputList->FindObject("fEvents1"))->Fill(fMbin+1);
1381 ((TProfile*)fOutputList->FindObject("fAvgMult"))->Fill(fMbin+1., pionCount);
1382 ((TH2D*)fOutputList->FindObject("fAvgMultHisto2D"))->Fill(fMbin+1., pionCount);
1384 ((TH2D*)fOutputList->FindObject("fdNchdEtaResponse"))->Fill(pow(trackletMult,1/3.), pow(mcdNch,1/3.));
1385 ((TH2D*)fOutputList->FindObject("fNpionTrueDist"))->Fill(fMbin+1., mcdNpion);
1386 ((TH2D*)fOutputList->FindObject("fNchTrueDist"))->Fill(fMbin+1., mcdNch);
1389 ((TH2D*)fOutputList->FindObject("fdCentVsNchdEta"))->Fill(fMbin+1, pow(trackletMult,1/3.));
1392 //cout<<trackletMult<<" "<<mcdNchdEta<<endl;
1394 ////////////////////////////////////
1395 // Add event to buffer if > 0 tracks
1397 fEC[zbin][fMbin]->FIFOShift();
1398 (fEvt) = fEC[zbin][fMbin]->fEvtStr;
1399 (fEvt)->fNtracks = myTracks;
1400 (fEvt)->fFillStatus = 1;
1401 for(Int_t i=0; i<myTracks; i++) (fEvt)->fTracks[i] = fTempStruct[i];
1403 (fEvt)->fMCarraySize = mcArray->GetEntriesFast();
1404 for(Int_t i=0; i<mcArray->GetEntriesFast(); i++) {
1405 AliAODMCParticle *tempMCTrack = (AliAODMCParticle*)mcArray->At(i);
1406 (fEvt)->fMCtracks[i].fPx = tempMCTrack->Px();
1407 (fEvt)->fMCtracks[i].fPy = tempMCTrack->Py();
1408 (fEvt)->fMCtracks[i].fPz = tempMCTrack->Pz();
1409 (fEvt)->fMCtracks[i].fPtot = sqrt(pow(tempMCTrack->Px(),2)+pow(tempMCTrack->Py(),2)+pow(tempMCTrack->Pz(),2));
1416 Float_t qinv12=0, qinv13=0, qinv23=0;
1417 Float_t qout=0, qside=0, qlong=0;
1418 Float_t qoutMC=0, qsideMC=0, qlongMC=0;
1419 Float_t firstQ=0, secondQ=0, thirdQ=0;
1420 Float_t firstQMC=0, secondQMC=0, thirdQMC=0;
1421 Float_t transK12=0, transK3=0;
1422 Float_t q3=0, q3MC=0;
1423 Int_t ch1=0, ch2=0, ch3=0;
1424 Short_t key1=0, key2=0, key3=0;
1425 Int_t bin1=0, bin2=0, bin3=0;
1426 Float_t pVect1[4]={0};
1427 Float_t pVect2[4]={0};
1428 Float_t pVect3[4]={0};
1429 Float_t pVect1MC[4]={0};
1430 Float_t pVect2MC[4]={0};
1431 Float_t pVect3MC[4]={0};
1432 Int_t index1=0, index2=0, index3=0;
1433 Float_t qinv12MC=0, qinv13MC=0, qinv23MC=0;
1435 AliAODMCParticle *mcParticle1=0x0;
1436 AliAODMCParticle *mcParticle2=0x0;
1438 if(fPdensityPairCut){
1439 ////////////////////
1440 Int_t pairCountSE=0, pairCountME=0;
1441 Int_t normPairCount[2]={0};
1442 Int_t numOtherPairs1[2][fMultLimit];
1443 Int_t numOtherPairs2[2][fMultLimit];
1444 Bool_t exitCode=kFALSE;
1445 Int_t tempNormFillCount[2][2][2][10][5];
1448 // reset to defaults
1449 for(Int_t i=0; i<fMultLimit; i++) {
1450 fPairLocationSE[i]->Set(fMultLimit,fDefaultsInt);
1451 fPairLocationME[i]->Set(fMultLimit,fDefaultsInt);
1453 // Normalization Utilities
1454 fOtherPairLocation1[0][i]->Set(fMultLimit,fDefaultsInt);
1455 fOtherPairLocation1[1][i]->Set(fMultLimit,fDefaultsInt);
1456 fOtherPairLocation2[0][i]->Set(fMultLimit,fDefaultsInt);
1457 fOtherPairLocation2[1][i]->Set(fMultLimit,fDefaultsInt);
1458 fNormPairSwitch[0][i]->Set(fMultLimit,fDefaultsCharMult);
1459 fNormPairSwitch[1][i]->Set(fMultLimit,fDefaultsCharMult);
1460 fNormPairSwitch[2][i]->Set(fMultLimit,fDefaultsCharMult);
1461 numOtherPairs1[0][i]=0;
1462 numOtherPairs1[1][i]=0;
1463 numOtherPairs2[0][i]=0;
1464 numOtherPairs2[1][i]=0;
1466 // Track Merging/Splitting Utilities
1467 fPairSplitCut[0][i]->Set(fMultLimit,fDefaultsCharMult);// P11
1468 fPairSplitCut[1][i]->Set(fMultLimit,fDefaultsCharMult);// P12
1469 fPairSplitCut[2][i]->Set(fMultLimit,fDefaultsCharMult);// P13
1470 fPairSplitCut[3][i]->Set(fMultLimit,fDefaultsCharMult);// P23
1473 // Reset the temp Normalization counters
1474 for(Int_t i=0; i<2; i++){// Charge1
1475 for(Int_t j=0; j<2; j++){// Charge2
1476 for(Int_t k=0; k<2; k++){// Charge3
1477 for(Int_t l=0; l<10; l++){// FillIndex (species Combination)
1478 for(Int_t m=0; m<5; m++){// Term (Cumulant term)
1479 tempNormFillCount[i][j][k][l][m] = 0;
1487 ///////////////////////////////////////////////////////
1488 // Start the pairing process
1492 for (Int_t i=0; i<myTracks; i++) {
1497 for (Int_t j=i+1; j<(fEvt+en2)->fNtracks; j++) {
1499 key1 = (fEvt)->fTracks[i].fKey;
1500 key2 = (fEvt+en2)->fTracks[j].fKey;
1501 Short_t fillIndex2 = FillIndex2part(key1+key2);
1502 Short_t qCutBin = SetQcutBin(fillIndex2);
1503 Short_t normBin = SetNormBin(fillIndex2);
1504 pVect1[0]=(fEvt)->fTracks[i].fEaccepted; pVect2[0]=(fEvt+en2)->fTracks[j].fEaccepted;
1505 pVect1[1]=(fEvt)->fTracks[i].fP[0]; pVect2[1]=(fEvt+en2)->fTracks[j].fP[0];
1506 pVect1[2]=(fEvt)->fTracks[i].fP[1]; pVect2[2]=(fEvt+en2)->fTracks[j].fP[1];
1507 pVect1[3]=(fEvt)->fTracks[i].fP[2]; pVect2[3]=(fEvt+en2)->fTracks[j].fP[2];
1511 qinv12 = GetQinv(fillIndex2, pVect1, pVect2);
1512 GetQosl(pVect1, pVect2, qout, qside, qlong);
1513 transK12 = sqrt(pow(pVect1[1]+pVect2[1],2) + pow(pVect1[2]+pVect2[2],2))/2.;
1518 ///////////////////////////////
1519 ch1 = Int_t(((fEvt)->fTracks[i].fCharge + 1)/2.);
1520 ch2 = Int_t(((fEvt+en2)->fTracks[j].fCharge + 1)/2.);
1521 SetFillBins2(fillIndex2, key1, key2, ch1, ch2, bin1, bin2);
1523 if(fMCcase && ch1==ch2 && fMbin==0 && qinv12<0.2){
1524 //////////////////////////
1525 // pad-row method testing
1526 Float_t coeff = (5)*0.2*(0.18/1.2);// 5 to evaluate at 1.0m in TPC
1527 Float_t phi1 = (fEvt)->fTracks[i].fPhi - asin((fEvt)->fTracks[i].fCharge*(0.1*fBfield)*coeff/(fEvt)->fTracks[i].fPt);
1528 if(phi1 > 2*PI) phi1 -= 2*PI;
1529 if(phi1 < 0) phi1 += 2*PI;
1530 Float_t phi2 = (fEvt+en2)->fTracks[j].fPhi - asin((fEvt+en2)->fTracks[j].fCharge*(0.1*fBfield)*coeff/(fEvt+en2)->fTracks[j].fPt);
1531 if(phi2 > 2*PI) phi2 -= 2*PI;
1532 if(phi2 < 0) phi2 += 2*PI;
1533 Float_t deltaphi = phi1 - phi2;
1534 if(deltaphi > PI) deltaphi -= PI;
1535 if(deltaphi < -PI) deltaphi += PI;
1537 Int_t ncl1 = (fEvt)->fTracks[i].fClusterMap.GetNbits();
1538 Int_t ncl2 = (fEvt+en2)->fTracks[j].fClusterMap.GetNbits();
1539 Float_t sumCls = 0; Float_t sumSha = 0; Float_t sumQ = 0;
1540 Double_t shfrac = 0; //Double_t qfactor = 0;
1541 for(Int_t imap = 0; imap < ncl1 && imap < ncl2; imap++) {
1542 if ((fEvt)->fTracks[i].fClusterMap.TestBitNumber(imap) && (fEvt+en2)->fTracks[j].fClusterMap.TestBitNumber(imap)) {// Both clusters
1543 if ((fEvt)->fTracks[i].fSharedMap.TestBitNumber(imap) && (fEvt+en2)->fTracks[j].fSharedMap.TestBitNumber(imap)) { // Shared
1547 else {sumQ--; sumCls+=2;}
1549 else if ((fEvt)->fTracks[i].fClusterMap.TestBitNumber(imap) || (fEvt+en2)->fTracks[j].fClusterMap.TestBitNumber(imap)) {// Non shared
1554 //qfactor = sumQ*1.0/sumCls;
1555 shfrac = sumSha*1.0/sumCls;
1557 if(fabs(deltaphi)<0.07 && fabs((fEvt)->fTracks[i].fEta-(fEvt+en2)->fTracks[j].fEta) < 0.03){
1558 ((TH3D*)fOutputList->FindObject("fPairsPadRowNum"))->Fill(transK12, shfrac, qinv12);
1561 for(Int_t rstep=0; rstep<10; rstep++){
1562 coeff = (rstep)*0.2*(0.18/1.2);
1563 phi1 = (fEvt)->fTracks[i].fPhi - asin((fEvt)->fTracks[i].fCharge*(0.1*fBfield)*coeff/(fEvt)->fTracks[i].fPt);
1564 if(phi1 > 2*PI) phi1 -= 2*PI;
1565 if(phi1 < 0) phi1 += 2*PI;
1566 phi2 = (fEvt+en2)->fTracks[j].fPhi - asin((fEvt+en2)->fTracks[j].fCharge*(0.1*fBfield)*coeff/(fEvt+en2)->fTracks[j].fPt);
1567 if(phi2 > 2*PI) phi2 -= 2*PI;
1568 if(phi2 < 0) phi2 += 2*PI;
1569 deltaphi = phi1 - phi2;
1570 if(deltaphi > PI) deltaphi -= PI;
1571 if(deltaphi < -PI) deltaphi += PI;
1573 if(fabs((fEvt)->fTracks[i].fEta-(fEvt+en2)->fTracks[j].fEta) < 0.03){
1574 ((TH3F*)fOutputList->FindObject("fPairsShareFracDPhiNum"))->Fill(rstep, shfrac, deltaphi);
1576 //if(shfrac < 0.05){
1577 ((TH3F*)fOutputList->FindObject("fPairsDetaDPhiNum"))->Fill(rstep, (fEvt)->fTracks[i].fEta-(fEvt+en2)->fTracks[j].fEta, deltaphi);
1582 }// MCcase and pair selection
1584 // Pair Splitting/Merging cut
1585 if(qinv12 < fQLowerCut) continue;// remove unwanted low-q pairs (also a type of track splitting/merging cut)
1587 if(!AcceptPair(&((fEvt)->fTracks[i]), &((fEvt+en2)->fTracks[j]))) {
1588 fPairSplitCut[0][i]->AddAt('1',j);
1589 ((TH1F*)fOutputList->FindObject("fRejectedPairs"))->Fill(qinv12);
1595 if(fMCcase && fillIndex2==0){
1597 // Check that label does not exceed stack size
1598 if((fEvt)->fTracks[i].fLabel < (fEvt)->fMCarraySize && (fEvt+en2)->fTracks[j].fLabel < (fEvt+en2)->fMCarraySize){
1599 pVect1MC[0]=sqrt(pow((fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPtot,2)+pow(fTrueMassPi,2));
1600 pVect2MC[0]=sqrt(pow((fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPtot,2)+pow(fTrueMassPi,2));
1601 pVect1MC[1]=(fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPx; pVect2MC[1]=(fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPx;
1602 pVect1MC[2]=(fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPy; pVect2MC[2]=(fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPy;
1603 pVect1MC[3]=(fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPz; pVect2MC[3]=(fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPz;
1604 qinv12MC = GetQinv(fillIndex2, pVect1MC, pVect2MC);
1605 GetQosl(pVect1MC, pVect2MC, qoutMC, qsideMC, qlongMC);
1606 if(qinv12<0.1 && ch1==ch2) {
1607 ((TProfile*)fOutputList->FindObject("fQsmearMean"))->Fill(1.,qinv12-qinv12MC);
1608 ((TProfile*)fOutputList->FindObject("fQsmearSq"))->Fill(1.,1000.*pow(qinv12-qinv12MC,2));
1609 ((TH1D*)fOutputList->FindObject("fQDist"))->Fill(qinv12-qinv12MC);
1614 mcParticle1 = (AliAODMCParticle*)mcArray->At(abs((fEvt)->fTracks[i].fLabel));
1615 mcParticle2 = (AliAODMCParticle*)mcArray->At(abs((fEvt+en2)->fTracks[j].fLabel));
1618 // secondary contamination
1619 if(abs(mcParticle1->GetPdgCode())==211 && abs(mcParticle2->GetPdgCode())==211){
1621 ((TH3D*)fOutputList->FindObject("fAllSCPionPairs"))->Fill(fMbin+1, transK12, qinv12);
1622 if(!mcParticle1->IsSecondaryFromWeakDecay() && !mcParticle2->IsSecondaryFromWeakDecay()) {
1623 ((TH3D*)fOutputList->FindObject("fPrimarySCPionPairs"))->Fill(fMbin+1, transK12, qinv12);
1626 ((TH3D*)fOutputList->FindObject("fAllMCPionPairs"))->Fill(fMbin+1, transK12, qinv12);
1627 if(!mcParticle1->IsSecondaryFromWeakDecay() && !mcParticle2->IsSecondaryFromWeakDecay()) {
1628 ((TH3D*)fOutputList->FindObject("fPrimaryMCPionPairs"))->Fill(fMbin+1, transK12, qinv12);
1634 if(fFSIindex<=1) rForQW=10;
1635 else if(fFSIindex==2) rForQW=9;
1636 else if(fFSIindex==3) rForQW=8;
1637 else if(fFSIindex==4) rForQW=7;
1638 else if(fFSIindex==5) rForQW=6;
1639 else if(fFSIindex==6) rForQW=5;
1640 else if(fFSIindex==7) rForQW=4;
1641 else if(fFSIindex==8) rForQW=3;
1644 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].fMCqinv->Fill(qinv12MC, MCWeight(ch1,ch2,rForQW,10,qinv12MC));// was 4,5
1645 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
1647 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].fPIDpurityDen->Fill(transK12, qinv12);
1648 if(abs(mcParticle1->GetPdgCode())==211 && abs(mcParticle2->GetPdgCode())==211){// Pions
1649 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].fPIDpurityNum->Fill(transK12, qinv12);
1655 //////////////////////////////////////////
1657 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].fExplicit2->Fill(transK12, qinv12);
1658 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].fExplicit2QW->Fill(transK12, qinv12, qinv12);
1659 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].fAvgP->Fill(transK12, qinv12, (fEvt)->fTracks[i].fMom);
1660 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].fAvgP->Fill(transK12, qinv12, (fEvt+en2)->fTracks[j].fMom);
1663 //////////////////////////////////////////
1667 // exit out of loop if there are too many pairs
1668 if(pairCountSE >= kPairLimit) {exitCode=kTRUE; continue;}// Too many SE pairs
1669 if(exitCode) continue;
1671 //////////////////////////
1673 if(qinv12 <= fQcut[qCutBin]) {
1675 ///////////////////////////
1677 (fEvt)->fPairsSE[pairCountSE].fP1[0] = (fEvt)->fTracks[i].fP[0];
1678 (fEvt)->fPairsSE[pairCountSE].fP1[1] = (fEvt)->fTracks[i].fP[1];
1679 (fEvt)->fPairsSE[pairCountSE].fP1[2] = (fEvt)->fTracks[i].fP[2];
1680 (fEvt)->fPairsSE[pairCountSE].fE1 = (fEvt)->fTracks[i].fEaccepted;
1681 (fEvt)->fPairsSE[pairCountSE].fCharge1 = (fEvt)->fTracks[i].fCharge;
1682 (fEvt)->fPairsSE[pairCountSE].fIndex1 = i;
1683 (fEvt)->fPairsSE[pairCountSE].fKey1 = key1;
1684 (fEvt)->fPairsSE[pairCountSE].fLabel1 = (fEvt)->fTracks[i].fLabel;
1685 if(fMCcase && ((fEvt)->fTracks[i].fLabel < (fEvt)->fMCarraySize)){
1686 (fEvt)->fPairsSE[pairCountSE].fP1MC[0] = (fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPx;
1687 (fEvt)->fPairsSE[pairCountSE].fP1MC[1] = (fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPy;
1688 (fEvt)->fPairsSE[pairCountSE].fP1MC[2] = (fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPz;
1691 (fEvt)->fPairsSE[pairCountSE].fP2[0] = (fEvt+en2)->fTracks[j].fP[0];
1692 (fEvt)->fPairsSE[pairCountSE].fP2[1] = (fEvt+en2)->fTracks[j].fP[1];
1693 (fEvt)->fPairsSE[pairCountSE].fP2[2] = (fEvt+en2)->fTracks[j].fP[2];
1694 (fEvt)->fPairsSE[pairCountSE].fE2 = (fEvt+en2)->fTracks[j].fEaccepted;
1695 (fEvt)->fPairsSE[pairCountSE].fCharge2 = (fEvt+en2)->fTracks[j].fCharge;
1696 (fEvt)->fPairsSE[pairCountSE].fIndex2 = j;
1697 (fEvt)->fPairsSE[pairCountSE].fKey2 = key2;
1698 (fEvt)->fPairsSE[pairCountSE].fLabel2 = (fEvt+en2)->fTracks[j].fLabel;
1699 if(fMCcase && ((fEvt+en2)->fTracks[j].fLabel < (fEvt+en2)->fMCarraySize)){
1700 (fEvt)->fPairsSE[pairCountSE].fP2MC[0] = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPx;
1701 (fEvt)->fPairsSE[pairCountSE].fP2MC[1] = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPy;
1702 (fEvt)->fPairsSE[pairCountSE].fP2MC[2] = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPz;
1705 (fEvt)->fPairsSE[pairCountSE].fQinv = qinv12;
1707 fPairLocationSE[i]->AddAt(pairCountSE,j);
1714 /////////////////////////////////////////////////////////
1715 // Normalization Region
1717 if((qinv12 >= fNormQcutLow[normBin]) && (qinv12 < fNormQcutHigh[normBin])){
1719 fNormPairs[en2][normPairCount[en2]].fCharge1 = (fEvt)->fTracks[i].fCharge;
1720 fNormPairs[en2][normPairCount[en2]].fIndex1 = i;
1721 fNormPairs[en2][normPairCount[en2]].fKey1 = (fEvt)->fTracks[i].fKey;
1723 fNormPairs[en2][normPairCount[en2]].fCharge2 = (fEvt+en2)->fTracks[j].fCharge;
1724 fNormPairs[en2][normPairCount[en2]].fIndex2 = j;
1725 fNormPairs[en2][normPairCount[en2]].fKey2 = (fEvt+en2)->fTracks[j].fKey;
1728 //other past pairs with particle j
1729 for(Int_t pastpair=0; pastpair<numOtherPairs2[0][j]; pastpair++){
1730 Int_t locationOtherPair = fOtherPairLocation2[0][j]->At(pastpair);
1731 if(locationOtherPair < 0) continue;// no pair there
1732 Int_t indexOther1 = i;
1733 Int_t indexOther2 = fNormPairs[0][ locationOtherPair ].fIndex1;
1735 // Both possible orderings of other indexes
1736 if( (fNormPairSwitch[0][indexOther1]->At(indexOther2)=='1') || (fNormPairSwitch[0][indexOther2]->At(indexOther1)=='1')) {
1738 // 1 and 2 are from SE
1739 ch3 = Int_t((fNormPairs[0][ locationOtherPair ].fCharge1 + 1)/2.);
1740 key3 = fNormPairs[0][ locationOtherPair ].fKey1;
1741 Short_t fillIndex3 = FillIndex3part(key1+key2+key3);
1742 SetFillBins3(fillIndex3, key1, key2, key3, ch1, ch2, ch3, 0, bin1, bin2, bin3, fDummyB, fDummyB, fDummyB);
1744 tempNormFillCount[bin1][bin2][bin3][fillIndex3][0]++;
1747 }// pastpair P11 loop
1750 fNormPairSwitch[en2][i]->AddAt('1',j);
1751 fOtherPairLocation1[en2][i]->AddAt(normPairCount[en2], numOtherPairs1[en2][i]);// location of otherpair with i as 1st particle
1752 fOtherPairLocation2[en2][j]->AddAt(normPairCount[en2], numOtherPairs2[en2][j]);// location of otherpair with j as 2nd particle
1754 numOtherPairs1[en2][i]++;
1755 numOtherPairs2[en2][j]++;
1758 normPairCount[en2]++;
1759 if(normPairCount[en2] >= kNormPairLimit) exitCode=kTRUE;
1768 //////////////////////////////////////////////
1771 for (Int_t i=0; i<myTracks; i++) {
1776 for (Int_t j=0; j<(fEvt+en2)->fNtracks; j++) {
1778 key1 = (fEvt)->fTracks[i].fKey;
1779 key2 = (fEvt+en2)->fTracks[j].fKey;
1780 Short_t fillIndex2 = FillIndex2part(key1+key2);
1781 Short_t qCutBin = SetQcutBin(fillIndex2);
1782 Short_t normBin = SetNormBin(fillIndex2);
1783 pVect1[0]=(fEvt)->fTracks[i].fEaccepted; pVect2[0]=(fEvt+en2)->fTracks[j].fEaccepted;
1784 pVect1[1]=(fEvt)->fTracks[i].fP[0]; pVect2[1]=(fEvt+en2)->fTracks[j].fP[0];
1785 pVect1[2]=(fEvt)->fTracks[i].fP[1]; pVect2[2]=(fEvt+en2)->fTracks[j].fP[1];
1786 pVect1[3]=(fEvt)->fTracks[i].fP[2]; pVect2[3]=(fEvt+en2)->fTracks[j].fP[2];
1788 qinv12 = GetQinv(fillIndex2, pVect1, pVect2);
1789 GetQosl(pVect1, pVect2, qout, qside, qlong);
1790 transK12 = sqrt(pow(pVect1[1]+pVect2[1],2) + pow(pVect1[2]+pVect2[2],2))/2.;
1791 //if(transK12 <= 0.35) fEDbin=0;
1796 ///////////////////////////////
1797 ch1 = Int_t(((fEvt)->fTracks[i].fCharge + 1)/2.);
1798 ch2 = Int_t(((fEvt+en2)->fTracks[j].fCharge + 1)/2.);
1799 SetFillBins2(fillIndex2, key1, key2, ch1, ch2, bin1, bin2);
1802 if((fEvt)->fTracks[i].fLabel < (fEvt)->fMCarraySize && (fEvt+en2)->fTracks[j].fLabel < (fEvt+en2)->fMCarraySize){
1803 pVect1MC[0]=sqrt(pow((fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPtot,2)+pow(fTrueMassPi,2));
1804 pVect2MC[0]=sqrt(pow((fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPtot,2)+pow(fTrueMassPi,2));
1805 pVect1MC[1]=(fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPx; pVect2MC[1]=(fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPx;
1806 pVect1MC[2]=(fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPy; pVect2MC[2]=(fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPy;
1807 pVect1MC[3]=(fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPz; pVect2MC[3]=(fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPz;
1808 qinv12MC = GetQinv(fillIndex2, pVect1MC, pVect2MC);
1811 for(Int_t rIter=0; rIter<fRVALUES; rIter++){
1812 for(Int_t myDampIt=0; myDampIt<kNDampValues; myDampIt++){
1813 Int_t denIndex = rIter*kNDampValues + myDampIt;
1814 Float_t WInput = MCWeight(ch1,ch2, rIter+kRmin, myDampIt, qinv12MC);
1815 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[0].fIdeal->Fill(denIndex, qinv12MC, WInput);
1816 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[1].fIdeal->Fill(denIndex, qinv12MC);
1817 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[0].fSmeared->Fill(denIndex, qinv12, WInput);
1818 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[1].fSmeared->Fill(denIndex, qinv12);
1823 /////////////////////////////////////////////////////
1824 if(qinv12 <= fQcut[qCutBin]) {// 3-particle MRC
1827 Short_t fillIndex3 = 0;
1828 key1=1; key2=1; key3=1;
1831 for (Int_t k=0; k<(fEvt+en3)->fNtracks; k++) {
1832 if((fEvt+en3)->fTracks[k].fLabel < (fEvt+en3)->fMCarraySize){
1833 ch3 = Int_t(((fEvt+en3)->fTracks[k].fCharge + 1)/2.);
1834 pVect3[0]=(fEvt+en3)->fTracks[k].fEaccepted;
1835 pVect3[1]=(fEvt+en3)->fTracks[k].fP[0];
1836 pVect3[2]=(fEvt+en3)->fTracks[k].fP[1];
1837 pVect3[3]=(fEvt+en3)->fTracks[k].fP[2];
1838 qinv13 = GetQinv(0, pVect1, pVect3);
1839 qinv23 = GetQinv(0, pVect2, pVect3);
1840 q3 = sqrt(pow(qinv12,2)+pow(qinv13,2)+pow(qinv23,2));
1842 if(qinv13 > fQcut[qCutBin] || qinv23 > fQcut[qCutBin]) continue;
1845 pVect3MC[0]=sqrt(pow((fEvt+en3)->fMCtracks[abs((fEvt+en3)->fTracks[k].fLabel)].fPtot,2)+pow(fTrueMassPi,2));
1846 pVect3MC[1]=(fEvt+en3)->fMCtracks[abs((fEvt+en3)->fTracks[k].fLabel)].fPx;
1847 pVect3MC[2]=(fEvt+en3)->fMCtracks[abs((fEvt+en3)->fTracks[k].fLabel)].fPy;
1848 pVect3MC[3]=(fEvt+en3)->fMCtracks[abs((fEvt+en3)->fTracks[k].fLabel)].fPz;
1849 qinv13MC = GetQinv(0, pVect1MC, pVect3MC);
1850 qinv23MC = GetQinv(0, pVect2MC, pVect3MC);
1853 q3MC = sqrt(pow(qinv12MC,2)+pow(qinv13MC,2)+pow(qinv23MC,2));
1854 transK3 = sqrt( pow(pVect1[1]+pVect2[1]+pVect3[1],2) + pow(pVect1[2]+pVect2[2]+pVect3[2],2))/3.;
1858 // 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.
1859 Bool_t fill2=kFALSE, fill3=kFALSE, fill4=kFALSE;
1860 SetFillBins3(fillIndex3, key1, key2, key3, ch1, ch2, ch3, 1, bin1, bin2, bin3, fill2, fill3, fill4);
1863 for(Int_t jj=1; jj<=5; jj++){// term loop
1865 if(jj==2) {if(!fill2) continue;}//12
1866 if(jj==3) {if(!fill3) continue;}//13
1867 if(jj==4) {if(!fill4) continue;}//23
1870 ArrangeQs(fillIndex3, key1, key2, key3, ch1, ch2, ch3, qinv12, qinv13, qinv23, 1, jj, firstQ, secondQ, thirdQ);
1871 ArrangeQs(fillIndex3, key1, key2, key3, ch1, ch2, ch3, qinv12MC, qinv13MC, qinv23MC, 1, jj, firstQMC, secondQMC, thirdQMC);
1873 if(ch1==ch2 && ch1==ch3){// same charge
1874 WInput = MCWeight3D(kTRUE, jj, 10, firstQMC, secondQMC, thirdQMC);
1876 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm1SC"))->Fill(q3MC, WInput);
1877 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm1SCden"))->Fill(q3MC);
1879 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm2SC"))->Fill(q3MC, WInput);
1880 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm2SCden"))->Fill(q3MC);
1882 }else {// mixed charge
1884 WInput = MCWeight3D(kFALSE, jj, 10, firstQMC, secondQMC, thirdQMC);
1886 if(jj==1 || jj==5) WInput = MCWeight3D(kFALSE, jj, 10, thirdQMC, secondQMC, firstQMC);// thirdQMC is ss
1887 else WInput = MCWeight3D(kFALSE, 6-jj, 10, thirdQMC, secondQMC, firstQMC);
1890 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm1MC"))->Fill(q3MC, WInput);
1891 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm1MCden"))->Fill(q3MC);
1895 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm2MC"))->Fill(q3MC, WInput);
1896 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm2MCden"))->Fill(q3MC);
1898 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm3MC"))->Fill(q3MC, WInput);
1899 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm3MCden"))->Fill(q3MC);
1901 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm4MC"))->Fill(q3MC, WInput);
1902 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm4MCden"))->Fill(q3MC);
1906 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm4MC"))->Fill(q3MC, WInput);
1907 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm4MCden"))->Fill(q3MC);
1909 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm3MC"))->Fill(q3MC, WInput);
1910 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm3MCden"))->Fill(q3MC);
1912 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm2MC"))->Fill(q3MC, WInput);
1913 ((TH1D*)fOutputList->FindObject("fMCWeight3DTerm2MCden"))->Fill(q3MC);
1921 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[jj-1].fIdeal->Fill(q3MC, WInput);
1922 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[jj-1].fSmeared->Fill(q3, WInput);
1926 }// MCarray check, 3rd particle
1929 }// TabulatePairs Check
1931 }// MCarray check, 1st and 2nd particle
1933 // reset key's and fill bins (they were altered for 3 particle MRC calculation)
1934 key1 = (fEvt)->fTracks[i].fKey;
1935 key2 = (fEvt+en2)->fTracks[j].fKey;
1936 SetFillBins2(fillIndex2, key1, key2, ch1, ch2, bin1, bin2);
1939 if(ch1==ch2 && fMbin==0 && qinv12<0.2){
1940 //////////////////////////
1941 // pad-row method testing
1942 Float_t coeff = (5)*0.2*(0.18/1.2);// 5 to evaluate at 1.0m in TPC
1943 Float_t phi1 = (fEvt)->fTracks[i].fPhi - asin((fEvt)->fTracks[i].fCharge*(0.1*fBfield)*coeff/(fEvt)->fTracks[i].fPt);
1944 if(phi1 > 2*PI) phi1 -= 2*PI;
1945 if(phi1 < 0) phi1 += 2*PI;
1946 Float_t phi2 = (fEvt+en2)->fTracks[j].fPhi - asin((fEvt+en2)->fTracks[j].fCharge*(0.1*fBfield)*coeff/(fEvt+en2)->fTracks[j].fPt);
1947 if(phi2 > 2*PI) phi2 -= 2*PI;
1948 if(phi2 < 0) phi2 += 2*PI;
1949 Float_t deltaphi = phi1 - phi2;
1950 if(deltaphi > PI) deltaphi -= PI;
1951 if(deltaphi < -PI) deltaphi += PI;
1953 Int_t ncl1 = (fEvt)->fTracks[i].fClusterMap.GetNbits();
1954 Int_t ncl2 = (fEvt+en2)->fTracks[j].fClusterMap.GetNbits();
1955 Float_t sumCls = 0; Float_t sumSha = 0; Float_t sumQ = 0;
1956 Double_t shfrac = 0; //Double_t qfactor = 0;
1957 for(Int_t imap = 0; imap < ncl1 && imap < ncl2; imap++) {
1958 if ((fEvt)->fTracks[i].fClusterMap.TestBitNumber(imap) && (fEvt+en2)->fTracks[j].fClusterMap.TestBitNumber(imap)) {// Both clusters
1959 if ((fEvt)->fTracks[i].fSharedMap.TestBitNumber(imap) && (fEvt+en2)->fTracks[j].fSharedMap.TestBitNumber(imap)) { // Shared
1963 else {sumQ--; sumCls+=2;}
1965 else if ((fEvt)->fTracks[i].fClusterMap.TestBitNumber(imap) || (fEvt+en2)->fTracks[j].fClusterMap.TestBitNumber(imap)) {// Non shared
1970 //qfactor = sumQ*1.0/sumCls;
1971 shfrac = sumSha*1.0/sumCls;
1973 if(fabs(deltaphi)<0.07 && fabs((fEvt)->fTracks[i].fEta-(fEvt+en2)->fTracks[j].fEta) < 0.03){
1974 ((TH3D*)fOutputList->FindObject("fPairsPadRowDen"))->Fill(transK12, shfrac, qinv12);
1977 for(Int_t rstep=0; rstep<10; rstep++){
1978 coeff = (rstep)*0.2*(0.18/1.2);
1979 // propagate through B field to r=1.2m
1980 phi1 = (fEvt)->fTracks[i].fPhi - asin((fEvt)->fTracks[i].fCharge*(0.1*fBfield)*coeff/(fEvt)->fTracks[i].fPt);
1981 if(phi1 > 2*PI) phi1 -= 2*PI;
1982 if(phi1 < 0) phi1 += 2*PI;
1983 phi2 = (fEvt+en2)->fTracks[j].fPhi - asin((fEvt+en2)->fTracks[j].fCharge*(0.1*fBfield)*coeff/(fEvt+en2)->fTracks[j].fPt);
1984 if(phi2 > 2*PI) phi2 -= 2*PI;
1985 if(phi2 < 0) phi2 += 2*PI;
1986 deltaphi = phi1 - phi2;
1987 if(deltaphi > PI) deltaphi -= PI;
1988 if(deltaphi < -PI) deltaphi += PI;
1990 if(fabs((fEvt)->fTracks[i].fEta-(fEvt+en2)->fTracks[j].fEta) < 0.03){
1991 ((TH3F*)fOutputList->FindObject("fPairsShareFracDPhiDen"))->Fill(rstep, shfrac, deltaphi);
1993 //if(shfrac < 0.05){
1994 ((TH3F*)fOutputList->FindObject("fPairsDetaDPhiDen"))->Fill(rstep, (fEvt)->fTracks[i].fEta-(fEvt+en2)->fTracks[j].fEta, deltaphi);
2001 }// desired pair selection
2009 if(qinv12 < fQLowerCut) continue;// remove unwanted low-q pairs (also a type of track splitting cut)
2011 if(!AcceptPair(&((fEvt)->fTracks[i]), &((fEvt+en2)->fTracks[j]))) {
2012 fPairSplitCut[1][i]->AddAt('1',j);
2017 //////////////////////////////////////////
2019 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].fExplicit2->Fill(transK12, qinv12);
2020 Charge1[bin1].Charge2[bin2].SC[fillIndex2].MB[fMbin].EDB[fEDbin].TwoPT[en2].fExplicit2QW->Fill(transK12, qinv12, qinv12);
2023 //////////////////////////////////////////
2027 if(pairCountME >= 2*kPairLimit) {exitCode=kTRUE; continue;}// Too many SE pairs
2028 if(exitCode) continue;
2030 if(qinv12 <= fQcut[qCutBin]) {
2031 ///////////////////////////
2034 (fEvt)->fPairsME[pairCountME].fP1[0] = (fEvt)->fTracks[i].fP[0];
2035 (fEvt)->fPairsME[pairCountME].fP1[1] = (fEvt)->fTracks[i].fP[1];
2036 (fEvt)->fPairsME[pairCountME].fP1[2] = (fEvt)->fTracks[i].fP[2];
2037 (fEvt)->fPairsME[pairCountME].fE1 = (fEvt)->fTracks[i].fEaccepted;
2038 (fEvt)->fPairsME[pairCountME].fCharge1 = (fEvt)->fTracks[i].fCharge;
2039 (fEvt)->fPairsME[pairCountME].fIndex1 = i;
2040 (fEvt)->fPairsME[pairCountME].fKey1 = key1;
2041 (fEvt)->fPairsME[pairCountME].fLabel1 = (fEvt)->fTracks[i].fLabel;
2042 if(fMCcase && ((fEvt)->fTracks[i].fLabel < (fEvt)->fMCarraySize)){
2043 (fEvt)->fPairsME[pairCountME].fP1MC[0] = (fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPx;
2044 (fEvt)->fPairsME[pairCountME].fP1MC[1] = (fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPy;
2045 (fEvt)->fPairsME[pairCountME].fP1MC[2] = (fEvt)->fMCtracks[abs((fEvt)->fTracks[i].fLabel)].fPz;
2048 (fEvt)->fPairsME[pairCountME].fP2[0] = (fEvt+en2)->fTracks[j].fP[0];
2049 (fEvt)->fPairsME[pairCountME].fP2[1] = (fEvt+en2)->fTracks[j].fP[1];
2050 (fEvt)->fPairsME[pairCountME].fP2[2] = (fEvt+en2)->fTracks[j].fP[2];
2051 (fEvt)->fPairsME[pairCountME].fE2 = (fEvt+en2)->fTracks[j].fEaccepted;
2052 (fEvt)->fPairsME[pairCountME].fCharge2 = (fEvt+en2)->fTracks[j].fCharge;
2053 (fEvt)->fPairsME[pairCountME].fIndex2 = j;
2054 (fEvt)->fPairsME[pairCountME].fKey2 = key2;
2055 (fEvt)->fPairsME[pairCountME].fLabel2 = (fEvt+en2)->fTracks[j].fLabel;
2056 if(fMCcase && ((fEvt+en2)->fTracks[j].fLabel < (fEvt+en2)->fMCarraySize)){
2057 (fEvt)->fPairsME[pairCountME].fP2MC[0] = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPx;
2058 (fEvt)->fPairsME[pairCountME].fP2MC[1] = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPy;
2059 (fEvt)->fPairsME[pairCountME].fP2MC[2] = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[j].fLabel)].fPz;
2062 (fEvt)->fPairsME[pairCountME].fQinv = qinv12;
2064 fPairLocationME[i]->AddAt(Int_t(pairCountME),j);
2070 if((qinv12 >= fNormQcutLow[normBin]) && (qinv12 < fNormQcutHigh[normBin])){
2072 fNormPairs[en2][normPairCount[en2]].fCharge1 = (fEvt)->fTracks[i].fCharge;
2073 fNormPairs[en2][normPairCount[en2]].fIndex1 = i;
2074 fNormPairs[en2][normPairCount[en2]].fKey1 = (fEvt)->fTracks[i].fKey;
2076 fNormPairs[en2][normPairCount[en2]].fCharge2 = (fEvt+en2)->fTracks[j].fCharge;
2077 fNormPairs[en2][normPairCount[en2]].fIndex2 = j;
2078 fNormPairs[en2][normPairCount[en2]].fKey2 = (fEvt+en2)->fTracks[j].fKey;
2080 //other past pairs in P11 with particle i
2081 for(Int_t pastpairP11=0; pastpairP11<numOtherPairs2[0][i]; pastpairP11++){// past pair in P11 with i as 1st and 2nd particle
2082 Int_t locationOtherPairP11 = fOtherPairLocation2[0][i]->At(pastpairP11);// i is 2nd particle
2083 if(locationOtherPairP11 < 0) continue;// no pair there
2084 Int_t indexOther1P11 = fNormPairs[0][ locationOtherPairP11 ].fIndex1;
2086 //Check other past pairs in P12
2087 if( (fNormPairSwitch[1][indexOther1P11]->At(j)=='0')) continue;
2089 // 1 and 3 are from SE
2090 ch3 = Int_t((fNormPairs[0][ locationOtherPairP11 ].fCharge1 + 1)/2.);// charge of second particle in P11
2091 key3 = fNormPairs[0][ locationOtherPairP11 ].fKey1;
2092 Short_t fillIndex3 = FillIndex3part(key1+key2+key3);
2093 Bool_t fill2=kFALSE, fill3=kFALSE, fill4=kFALSE;
2094 SetFillBins3(fillIndex3, key1, key2, key3, ch1, ch2, ch3, 2, bin1, bin2, bin3, fill2, fill3, fill4);
2097 if(fill2) tempNormFillCount[bin1][bin2][bin3][fillIndex3][1]++;
2098 if(fill3) tempNormFillCount[bin1][bin2][bin3][fillIndex3][2]++;
2099 if(fill4) tempNormFillCount[bin1][bin2][bin3][fillIndex3][3]++;
2105 fNormPairSwitch[en2][i]->AddAt('1',j);
2106 fOtherPairLocation1[en2][i]->AddAt(normPairCount[en2], numOtherPairs1[en2][i]);// location of otherpair with i as 1st particle
2107 fOtherPairLocation2[en2][j]->AddAt(normPairCount[en2], numOtherPairs2[en2][j]);// location of otherpair with j as 2nd particle
2109 numOtherPairs1[en2][i]++;
2110 numOtherPairs2[en2][j]++;
2112 normPairCount[en2]++;
2113 if(normPairCount[en2] >= kNormPairLimit) exitCode=kTRUE;
2122 ///////////////////////////////////////
2123 // P13 pairing (just for Norm counting of term5)
2124 for (Int_t i=0; i<myTracks; i++) {
2126 // exit out of loop if there are too many pairs
2127 // dont bother with this loop if exitCode is set.
2133 for (Int_t j=0; j<(fEvt+en2)->fNtracks; j++) {
2135 key1 = (fEvt)->fTracks[i].fKey;
2136 key2 = (fEvt+en2)->fTracks[j].fKey;
2137 Short_t fillIndex2 = FillIndex2part(key1+key2);
2138 Short_t normBin = SetNormBin(fillIndex2);
2139 pVect1[0]=(fEvt)->fTracks[i].fEaccepted; pVect2[0]=(fEvt+en2)->fTracks[j].fEaccepted;
2140 pVect1[1]=(fEvt)->fTracks[i].fP[0]; pVect2[1]=(fEvt+en2)->fTracks[j].fP[0];
2141 pVect1[2]=(fEvt)->fTracks[i].fP[1]; pVect2[2]=(fEvt+en2)->fTracks[j].fP[1];
2142 pVect1[3]=(fEvt)->fTracks[i].fP[2]; pVect2[3]=(fEvt+en2)->fTracks[j].fP[2];
2144 qinv12 = GetQinv(fillIndex2, pVect1, pVect2);
2146 if(qinv12 < fQLowerCut) continue;// remove unwanted low-q pairs (also a type of track splitting cut)
2148 ch1 = Int_t(((fEvt)->fTracks[i].fCharge + 1)/2.);
2149 ch2 = Int_t(((fEvt+en2)->fTracks[j].fCharge + 1)/2.);
2152 if(!AcceptPair(&((fEvt)->fTracks[i]), &((fEvt+en2)->fTracks[j]))) {
2153 fPairSplitCut[2][i]->AddAt('1',j);
2158 /////////////////////////////////////////////////////////
2159 // Normalization Region
2161 if((qinv12 >= fNormQcutLow[normBin]) && (qinv12 < fNormQcutHigh[normBin])){
2163 fNormPairSwitch[en2][i]->AddAt('1',j);
2171 ///////////////////////////////////////
2172 // P23 pairing (just for Norm counting of term5)
2174 for (Int_t i=0; i<(fEvt+en1)->fNtracks; i++) {
2176 // exit out of loop if there are too many pairs
2177 // dont bother with this loop if exitCode is set.
2183 for (Int_t j=0; j<(fEvt+en2)->fNtracks; j++) {
2187 key1 = (fEvt+en1)->fTracks[i].fKey;
2188 key2 = (fEvt+en2)->fTracks[j].fKey;
2189 Short_t fillIndex2 = FillIndex2part(key1+key2);
2190 Short_t normBin = SetNormBin(fillIndex2);
2191 pVect1[0]=(fEvt+en1)->fTracks[i].fEaccepted; pVect2[0]=(fEvt+en2)->fTracks[j].fEaccepted;
2192 pVect1[1]=(fEvt+en1)->fTracks[i].fP[0]; pVect2[1]=(fEvt+en2)->fTracks[j].fP[0];
2193 pVect1[2]=(fEvt+en1)->fTracks[i].fP[1]; pVect2[2]=(fEvt+en2)->fTracks[j].fP[1];
2194 pVect1[3]=(fEvt+en1)->fTracks[i].fP[2]; pVect2[3]=(fEvt+en2)->fTracks[j].fP[2];
2196 qinv12 = GetQinv(fillIndex2, pVect1, pVect2);
2198 if(qinv12 < fQLowerCut) continue;// remove unwanted low-q pairs (also a type of track splitting cut)
2200 ///////////////////////////////
2201 ch1 = Int_t(((fEvt+en1)->fTracks[i].fCharge + 1)/2.);
2202 ch2 = Int_t(((fEvt+en2)->fTracks[j].fCharge + 1)/2.);
2205 if(!AcceptPair(&((fEvt+en1)->fTracks[i]), &((fEvt+en2)->fTracks[j]))) {
2206 fPairSplitCut[3][i]->AddAt('1',j);
2211 if((qinv12 < fNormQcutLow[normBin]) || (qinv12 >= fNormQcutHigh[normBin])) continue;
2213 Int_t index1P23 = i;
2214 Int_t index2P23 = j;
2216 for(Int_t pastpairP12=0; pastpairP12<numOtherPairs2[1][index1P23]; pastpairP12++){// loop in P12 with i as 2nd particle
2217 Int_t locationOtherPairP12 = fOtherPairLocation2[1][index1P23]->At(pastpairP12);
2218 if(locationOtherPairP12 < 0) continue; // no pair there
2219 Int_t index1P12 = fNormPairs[1][ locationOtherPairP12 ].fIndex1;
2222 //Check other past pair status in P13
2223 if( (fNormPairSwitch[2][index1P12]->At(index2P23)=='0')) continue;
2225 // all from different event
2226 ch3 = Int_t((fNormPairs[1][ locationOtherPairP12 ].fCharge1 + 1)/2.);// charge of first particle in P12
2227 key3 = fNormPairs[1][ locationOtherPairP12 ].fKey1;
2228 Short_t fillIndex3 = FillIndex3part(key1+key2+key3);
2229 SetFillBins3(fillIndex3, key1, key2, key3, ch1, ch2, ch3, 3, bin1, bin2, bin3, fDummyB, fDummyB, fDummyB);
2231 tempNormFillCount[bin1][bin2][bin3][fillIndex3][4]++;
2239 ///////////////////////////////////////////////////
2240 // Do not use pairs from events with too many pairs
2242 cout<<"SE or ME or Norm PairCount too large. Discarding all pairs and skipping event"<<endl;
2243 (fEvt)->fNpairsSE = 0;
2244 (fEvt)->fNpairsME = 0;
2245 ((TH1F*)fOutputList->FindObject("fRejectedEvents"))->Fill(fMbin+1);
2246 return;// Skip event
2248 (fEvt)->fNpairsSE = pairCountSE;
2249 (fEvt)->fNpairsME = pairCountME;
2250 ((TH1F*)fOutputList->FindObject("fEvents2"))->Fill(fMbin+1);
2252 ///////////////////////////////////////////////////
2256 ///////////////////////////////////////////////////////////////////////
2257 ///////////////////////////////////////////////////////////////////////
2258 ///////////////////////////////////////////////////////////////////////
2261 // Start the Main Correlation Analysis
2264 ///////////////////////////////////////////////////////////////////////
2269 /////////////////////////////////////////////////////////
2271 // Set the Normalization counters
2272 for(Int_t termN=0; termN<5; termN++){
2275 if((fEvt)->fNtracks ==0) continue;
2277 if((fEvt)->fNtracks ==0) continue;
2278 if((fEvt+1)->fNtracks ==0) continue;
2280 if((fEvt)->fNtracks ==0) continue;
2281 if((fEvt+1)->fNtracks ==0) continue;
2282 if((fEvt+2)->fNtracks ==0) continue;
2285 for(Int_t sc=0; sc<kSCLimit3; sc++){
2287 for(Int_t c1=0; c1<2; c1++){
2288 for(Int_t c2=0; c2<2; c2++){
2289 for(Int_t c3=0; c3<2; c3++){
2291 if(sc==0 || sc==6 || sc==9){// Identical species
2292 if( (c1+c2+c3)==1) {if(c1!=0 || c2!=0 || c3!=1) continue;}
2293 if( (c1+c2+c3)==2) {if(c1!=0) continue;}
2295 if( (c1+c2)==1) {if(c1!=0) continue;}
2296 }else {}// do nothing for pi-k-p case
2297 Charge1[c1].Charge2[c2].Charge3[c3].SC[sc].MB[fMbin].EDB[fEDbin].ThreePT[termN].fNorm3->Fill(0.,tempNormFillCount[c1][c2][c3][sc][termN]);
2306 /////////////////////////////////////////////
2307 // Calculate Pair-Cut Correlations
2308 for(Int_t en1case=0; en1case<2; en1case++){// limit at 2 (normal)
2311 if(en1case==0) nump1 = (fEvt)->fNpairsSE;
2312 if(en1case==1) nump1 = (fEvt)->fNpairsME;
2315 for(Int_t p1=0; p1<nump1; p1++){
2318 ch1 = Int_t(((fEvt)->fPairsSE[p1].fCharge1 + 1)/2.);
2319 ch2 = Int_t(((fEvt)->fPairsSE[p1].fCharge2 + 1)/2.);
2320 pVect1[0] = (fEvt)->fPairsSE[p1].fE1; pVect2[0] = (fEvt)->fPairsSE[p1].fE2;
2321 pVect1[1] = (fEvt)->fPairsSE[p1].fP1[0]; pVect2[1] = (fEvt)->fPairsSE[p1].fP2[0];
2322 pVect1[2] = (fEvt)->fPairsSE[p1].fP1[1]; pVect2[2] = (fEvt)->fPairsSE[p1].fP2[1];
2323 pVect1[3] = (fEvt)->fPairsSE[p1].fP1[2]; pVect2[3] = (fEvt)->fPairsSE[p1].fP2[2];
2324 index1 = (fEvt)->fPairsSE[p1].fIndex1; index2 = (fEvt)->fPairsSE[p1].fIndex2;
2325 key1 = (fEvt)->fPairsSE[p1].fKey1; key2 = (fEvt)->fPairsSE[p1].fKey2;
2326 qinv12 = (fEvt)->fPairsSE[p1].fQinv;
2328 pVect1MC[1] = (fEvt)->fPairsSE[p1].fP1MC[0]; pVect2MC[1] = (fEvt)->fPairsSE[p1].fP2MC[0];
2329 pVect1MC[2] = (fEvt)->fPairsSE[p1].fP1MC[1]; pVect2MC[2] = (fEvt)->fPairsSE[p1].fP2MC[1];
2330 pVect1MC[3] = (fEvt)->fPairsSE[p1].fP1MC[2]; pVect2MC[3] = (fEvt)->fPairsSE[p1].fP2MC[2];
2331 pVect1MC[0] = sqrt(pow(pVect1MC[1],2)+pow(pVect1MC[2],2)+pow(pVect1MC[3],2)+pow(fTrueMassPi,2));
2332 pVect2MC[0] = sqrt(pow(pVect2MC[1],2)+pow(pVect2MC[2],2)+pow(pVect2MC[3],2)+pow(fTrueMassPi,2));
2335 ch1 = Int_t(((fEvt)->fPairsME[p1].fCharge1 + 1)/2.);
2336 ch2 = Int_t(((fEvt)->fPairsME[p1].fCharge2 + 1)/2.);
2337 pVect1[0] = (fEvt)->fPairsME[p1].fE1; pVect2[0] = (fEvt)->fPairsME[p1].fE2;
2338 pVect1[1] = (fEvt)->fPairsME[p1].fP1[0]; pVect2[1] = (fEvt)->fPairsME[p1].fP2[0];
2339 pVect1[2] = (fEvt)->fPairsME[p1].fP1[1]; pVect2[2] = (fEvt)->fPairsME[p1].fP2[1];
2340 pVect1[3] = (fEvt)->fPairsME[p1].fP1[2]; pVect2[3] = (fEvt)->fPairsME[p1].fP2[2];
2341 index1 = (fEvt)->fPairsME[p1].fIndex1; index2 = (fEvt)->fPairsME[p1].fIndex2;
2342 key1 = (fEvt)->fPairsME[p1].fKey1; key2 = (fEvt)->fPairsME[p1].fKey2;
2343 qinv12 = (fEvt)->fPairsME[p1].fQinv;
2345 pVect1MC[1] = (fEvt)->fPairsME[p1].fP1MC[0]; pVect2MC[1] = (fEvt)->fPairsME[p1].fP2MC[0];
2346 pVect1MC[2] = (fEvt)->fPairsME[p1].fP1MC[1]; pVect2MC[2] = (fEvt)->fPairsME[p1].fP2MC[1];
2347 pVect1MC[3] = (fEvt)->fPairsME[p1].fP1MC[2]; pVect2MC[3] = (fEvt)->fPairsME[p1].fP2MC[2];
2348 pVect1MC[0] = sqrt(pow(pVect1MC[1],2)+pow(pVect1MC[2],2)+pow(pVect1MC[3],2)+pow(fTrueMassPi,2));
2349 pVect2MC[0] = sqrt(pow(pVect2MC[1],2)+pow(pVect2MC[2],2)+pow(pVect2MC[3],2)+pow(fTrueMassPi,2));
2354 for(Int_t en2=0; en2<3; en2++){
2355 //////////////////////////////////////
2357 Bool_t skipcase=kTRUE;
2358 Short_t config=-1, part=-1;
2359 if(en1case==0 && en2==0) {skipcase=kFALSE; config=1; part=0;}// P11T1
2360 if(en1case==0 && en2==1) {skipcase=kFALSE; config=2; part=1;}// P11T2
2361 if(en1case==1 && en2==0) {skipcase=kFALSE; config=2; part=2;}// P12T1
2362 if(en1case==1 && en2==2) {skipcase=kFALSE; config=3; part=3;}// P12T3
2364 if(skipcase) continue;
2369 for(Int_t k=0; k<(fEvt+en2)->fNtracks; k++){
2373 // remove auto-correlations and duplicate triplets
2375 if( index1 == index3) continue;
2376 if( index2 == index3) continue;
2377 if(fPairSplitCut[0][index1]->At(index2)=='1') continue;// Track splitting/merging
2379 // skip the switched off triplets
2380 if(fTripletSkip1[fPairLocationSE[index1]->At(index2)]->At(index3)=='1') {
2381 fTripletSkip1[fPairLocationSE[index1]->At(index2)]->AddAt('0',index3);// Reset
2384 ///////////////////////////////
2385 // Turn off 1st possible degenerate triplet
2386 if(index1 < index3){// verify correct id ordering ( index1 < k )
2387 if(fPairLocationSE[index1]->At(index3) >= 0){
2388 fTripletSkip1[fPairLocationSE[index1]->At(index3)]->AddAt('1',index2);
2390 if(fPairSplitCut[0][index1]->At(index3)=='1') continue;// Track splitting/merging
2391 }else {// or k < index1
2392 if(fPairLocationSE[index3]->At(index1) >= 0){
2393 fTripletSkip1[fPairLocationSE[index3]->At(index1)]->AddAt('1',index2);
2395 if(fPairSplitCut[0][index3]->At(index1)=='1') continue;// Track splitting/merging
2397 // turn off 2nd possible degenerate triplet
2398 if(index2 < index3){// verify correct id ordering (index2 < k)
2399 if(fPairLocationSE[index2]->At(index3) >= 0){
2400 fTripletSkip1[fPairLocationSE[index2]->At(index3)]->AddAt('1',index1);
2402 if(fPairSplitCut[0][index2]->At(index3)=='1') continue;// Track splitting/merging
2403 }else {// or k < index2
2404 if(fPairLocationSE[index3]->At(index2) >= 0){
2405 fTripletSkip1[fPairLocationSE[index3]->At(index2)]->AddAt('1',index1);
2407 if(fPairSplitCut[0][index3]->At(index2)=='1') continue;// Track splitting/merging
2412 if(config==2 && part==1){// SE pair and third particle from next event. P11T2
2413 ///////////////////////////////
2414 // Turn off 1st possible degenerate triplet
2415 if(fPairLocationME[index1]->At(index3) >= 0){
2416 fTripletSkip2[fPairLocationME[index1]->At(index3)]->AddAt('1',index2);
2419 // turn off 2nd possible degenerate triplet
2420 if(fPairLocationME[index2]->At(index3) >= 0){
2421 fTripletSkip2[fPairLocationME[index2]->At(index3)]->AddAt('1',index1);
2424 if(fPairSplitCut[0][index1]->At(index2)=='1') continue;// Track splitting/merging
2425 if(fPairSplitCut[1][index1]->At(index3)=='1') continue;// Track splitting/merging
2426 if(fPairSplitCut[1][index2]->At(index3)=='1') continue;// Track splitting/merging
2427 }// end config 2 part 1
2429 if(config==2 && part==2){// P12T1
2430 if( index1 == index3) continue;
2432 // skip the switched off triplets
2433 if(fTripletSkip2[fPairLocationME[index1]->At(index2)]->At(index3)=='1') {
2434 fTripletSkip2[fPairLocationME[index1]->At(index2)]->AddAt('0',index3);// Reset
2437 // turn off another possible degenerate
2438 if(fPairLocationME[index3]->At(index2) >= 0){
2439 fTripletSkip2[fPairLocationME[index3]->At(index2)]->AddAt('1',index1);
2440 }// end config 2 part 2
2442 if(fPairSplitCut[1][index1]->At(index2)=='1') continue;// Track splitting/merging
2443 if(index1 < index3) {if(fPairSplitCut[0][index1]->At(index3)=='1') continue;}// Track splitting/merging
2444 else {if(fPairSplitCut[0][index3]->At(index1)=='1') continue;}// Track splitting/merging
2445 if(fPairSplitCut[1][index3]->At(index2)=='1') continue;// Track splitting/merging
2447 if(config==3){// P12T3
2448 if(fPairSplitCut[1][index1]->At(index2)=='1') continue;// Track splitting/merging
2449 if(fPairSplitCut[2][index1]->At(index3)=='1') continue;// Track splitting/merging
2450 if(fPairSplitCut[3][index2]->At(index3)=='1') continue;// Track splitting/merging
2455 ch3 = Int_t(((fEvt+en2)->fTracks[k].fCharge + 1)/2.);
2456 key3 = (fEvt+en2)->fTracks[k].fKey;
2457 Short_t fillIndex3 = FillIndex3part(key1+key2+key3);
2458 Short_t fillIndex13 = FillIndex2part(key1+key3);
2459 Short_t fillIndex23 = FillIndex2part(key2+key3);
2460 Short_t qCutBin13 = SetQcutBin(fillIndex13);
2461 Short_t qCutBin23 = SetQcutBin(fillIndex23);
2462 pVect3[0] = (fEvt+en2)->fTracks[k].fEaccepted;
2463 pVect3[1] = (fEvt+en2)->fTracks[k].fP[0];
2464 pVect3[2] = (fEvt+en2)->fTracks[k].fP[1];
2465 pVect3[3] = (fEvt+en2)->fTracks[k].fP[2];
2466 qinv13 = GetQinv(fillIndex13, pVect1, pVect3);
2467 qinv23 = GetQinv(fillIndex23, pVect2, pVect3);
2469 if(qinv13 < fQLowerCut) continue;
2470 if(qinv23 < fQLowerCut) continue;
2471 if(qinv13 > fQcut[qCutBin13]) continue;
2472 if(qinv23 > fQcut[qCutBin23]) continue;
2477 pVect3MC[1] = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[k].fLabel)].fPx;
2478 pVect3MC[2] = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[k].fLabel)].fPy;
2479 pVect3MC[3] = (fEvt+en2)->fMCtracks[abs((fEvt+en2)->fTracks[k].fLabel)].fPz;
2480 pVect3MC[0] = sqrt(pow(pVect3MC[1],2)+pow(pVect3MC[2],2)+pow(pVect3MC[3],2)+pow(fTrueMassPi,2));
2481 qinv12MC = GetQinv(0, pVect1MC, pVect2MC);
2482 qinv13MC = GetQinv(0, pVect1MC, pVect3MC);
2483 qinv23MC = GetQinv(0, pVect2MC, pVect3MC);
2488 // if all three pair cuts are the same then the case (config=2 && term=2) never reaches here.
2490 q3 = sqrt(pow(qinv12,2) + pow(qinv13,2) + pow(qinv23,2));
2491 transK3 = sqrt( pow(pVect1[1]+pVect2[1]+pVect3[1],2) + pow(pVect1[2]+pVect2[2]+pVect3[2],2))/3.;
2493 if(transK3<0.3) fEDbin=0;
2496 firstQ=0; secondQ=0; thirdQ=0;
2501 if(config==1) {// 123
2502 SetFillBins3(fillIndex3, key1, key2, key3, ch1, ch2, ch3, 0, bin1, bin2, bin3, fDummyB, fDummyB, fDummyB);
2504 if(fillIndex3 <= 2){
2505 ArrangeQs(fillIndex3, key1, key2, key3, ch1, ch2, ch3, qinv12, qinv13, qinv23, 0, 1, firstQ, secondQ, thirdQ);
2506 if(fillIndex3==0 && fMCcase) ArrangeQs(fillIndex3, key1, key2, key3, ch1, ch2, ch3, qinv12MC, qinv13MC, qinv23MC, 0, 1, firstQMC, secondQMC, thirdQMC);
2507 Float_t WInput = 1.0;
2508 if(fGenerateSignal && ch1==ch2 && ch1==ch3) WInput = MCWeight3D(kTRUE, 1, 10, firstQ, secondQ, thirdQ);
2509 //if(fGenerateSignal && ch1==ch2 && ch1==ch3) WInput = MCWeight3D(kTRUE, 1, fFixedLambdaBinr3, firstQMC, secondQMC, thirdQMC);
2511 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[0].fTermsQ3->Fill(q3, WInput);
2512 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[0].fTerms3->Fill(firstQ, secondQ, thirdQ, WInput);
2515 if(fillIndex3==0 && ch1==ch2 && ch1==ch3 && fMCcase==kFALSE){
2516 ((TH3D*)fOutputList->FindObject("fKt3DistTerm1"))->Fill(fMbin+1, transK3, q3);
2521 }else if(config==2){// 12, 13, 23
2523 Bool_t fill2=kFALSE, fill3=kFALSE, fill4=kFALSE;
2524 SetFillBins3(fillIndex3, key1, key2, key3, ch1, ch2, ch3, part, bin1, bin2, bin3, fill2, fill3, fill4);
2526 // loop over terms 2-4
2527 for(Int_t jj=2; jj<5; jj++){
2528 if(jj==2) {if(!fill2) continue;}//12
2529 if(jj==3) {if(!fill3) continue;}//13
2530 if(jj==4) {if(!fill4) continue;}//23
2532 if(fillIndex3 <= 2){
2533 ArrangeQs(fillIndex3, key1, key2, key3, ch1, ch2, ch3, qinv12, qinv13, qinv23, part, jj, firstQ, secondQ, thirdQ);
2534 if(fillIndex3==0 && fMCcase) ArrangeQs(fillIndex3, key1, key2, key3, ch1, ch2, ch3, qinv12MC, qinv13MC, qinv23MC, part, jj, firstQMC, secondQMC, thirdQMC);
2535 Float_t WInput = 1.0;
2536 if(fGenerateSignal && ch1==ch2 && ch1==ch3) WInput = MCWeight3D(kTRUE, jj, 10, firstQ, secondQ, thirdQ);
2537 //if(fGenerateSignal && ch1==ch2 && ch1==ch3) WInput = MCWeight3D(kTRUE, jj, fFixedLambdaBinr3, firstQMC, secondQMC, thirdQMC);
2539 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[jj-1].fTermsQ3->Fill(q3, WInput);
2540 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[jj-1].fTerms3->Fill(firstQ, secondQ, thirdQ, WInput);
2545 }else {// config 3: All particles from different events
2547 SetFillBins3(fillIndex3, key1, key2, key3, ch1, ch2, ch3, 3, bin1, bin2, bin3, fDummyB, fDummyB, fDummyB);
2549 if(ch1==ch2 && ch1==ch3 && fillIndex3==0) {
2550 if(!fMCcase) ((TH3D*)fOutputList->FindObject("fKt3DistTerm5"))->Fill(fMbin+1, transK3, q3);
2553 if(fillIndex3 <= 2){
2554 ArrangeQs(fillIndex3, key1, key2, key3, ch1, ch2, ch3, qinv12, qinv13, qinv23, part, 5, firstQ, secondQ, thirdQ);
2555 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[4].fTermsQ3->Fill(q3);
2556 Charge1[bin1].Charge2[bin2].Charge3[bin3].SC[fillIndex3].MB[fMbin].EDB[fEDbin].ThreePT[4].fTerms3->Fill(firstQ, secondQ, thirdQ);
2561 }// end 3rd particle
2569 }// end of PdensityPairs
2573 // Post output data.
2574 PostData(1, fOutputList);
2577 //________________________________________________________________________
2578 void AliThreePionRadii::Terminate(Option_t *)
2580 // Called once at the end of the query
2585 //________________________________________________________________________
2586 Bool_t AliThreePionRadii::AcceptPair(AliChaoticityTrackStruct *first, AliChaoticityTrackStruct *second)
2589 if(fabs(first->fEta-second->fEta) > fMinSepPairEta) return kTRUE;
2591 // propagate through B field to r=1m
2592 Float_t phi1 = first->fPhi - asin(first->fCharge*(0.1*fBfield)*0.15/first->fPt);// 0.15 for D=1m
2593 if(phi1 > 2*PI) phi1 -= 2*PI;
2594 if(phi1 < 0) phi1 += 2*PI;
2595 Float_t phi2 = second->fPhi - asin(second->fCharge*(0.1*fBfield)*0.15/second->fPt);// 0.15 for D=1m
2596 if(phi2 > 2*PI) phi2 -= 2*PI;
2597 if(phi2 < 0) phi2 += 2*PI;
2599 Float_t deltaphi = phi1 - phi2;
2600 if(deltaphi > PI) deltaphi -= 2*PI;
2601 if(deltaphi < -PI) deltaphi += 2*PI;
2602 deltaphi = fabs(deltaphi);
2604 if(deltaphi < fMinSepPairPhi) return kFALSE;// Min Separation
2607 // propagate through B field to r=1.6m
2608 phi1 = first->fPhi - asin(first->fCharge*(0.1*fBfield)*0.24/first->fPt);// mine. 0.24 for D=1.6m
2609 if(phi1 > 2*PI) phi1 -= 2*PI;
2610 if(phi1 < 0) phi1 += 2*PI;
2611 phi2 = second->fPhi - asin(second->fCharge*(0.1*fBfield)*0.24/second->fPt);// mine. 0.24 for D=1.6m
2612 if(phi2 > 2*PI) phi2 -= 2*PI;
2613 if(phi2 < 0) phi2 += 2*PI;
2615 deltaphi = phi1 - phi2;
2616 if(deltaphi > PI) deltaphi -= 2*PI;
2617 if(deltaphi < -PI) deltaphi += 2*PI;
2618 deltaphi = fabs(deltaphi);
2620 if(deltaphi < fMinSepPairPhi) return kFALSE;// Min Separation
2626 Int_t ncl1 = first->fClusterMap.GetNbits();
2627 Int_t ncl2 = second->fClusterMap.GetNbits();
2628 Int_t sumCls = 0; Int_t sumSha = 0; Int_t sumQ = 0;
2629 Double_t shfrac = 0; Double_t qfactor = 0;
2630 for(Int_t imap = 0; imap < ncl1 && imap < ncl2; imap++) {
2631 if (first->fClusterMap.TestBitNumber(imap) && second->fClusterMap.TestBitNumber(imap)) {// Both clusters
2632 if (first->fSharedMap.TestBitNumber(imap) && second->fSharedMap.TestBitNumber(imap)) { // Shared
2636 else {sumQ--; sumCls+=2;}
2638 else if (first->fClusterMap.TestBitNumber(imap) || second->fClusterMap.TestBitNumber(imap)) {// Non shared
2643 qfactor = sumQ*1.0/sumCls;
2644 shfrac = sumSha*1.0/sumCls;
2647 if(qfactor > fShareQuality || shfrac > fShareFraction) return kFALSE;
2654 //________________________________________________________________________
2655 Float_t AliThreePionRadii::GamovFactor(Int_t chargeBin1, Int_t chargeBin2, Float_t qinv)
2657 Float_t arg = G_Coeff/qinv;
2659 if(chargeBin1==chargeBin2) return (exp(arg)-1)/(arg);
2660 else {return (exp(-arg)-1)/(-arg);}
2663 //________________________________________________________________________
2664 void AliThreePionRadii::Shuffle(Int_t *iarr, Int_t i1, Int_t i2)
2668 for (Int_t i = i1; i < i2+1; i++) {
2669 j = (Int_t) (gRandom->Rndm() * a);
2675 //________________________________________________________________________
2676 Short_t AliThreePionRadii::FillIndex2part(Short_t key){
2678 if(key==2) return 0;// pi-pi
2679 else if(key==11) return 1;// pi-k
2680 else if(key==101) return 2;// pi-p
2681 else if(key==20) return 3;// k-k
2682 else if(key==110) return 4;// k-p
2683 else return 5;// p-p
2685 //________________________________________________________________________
2686 Short_t AliThreePionRadii::FillIndex3part(Short_t key){
2688 if(key==3) return 0;// pi-pi-pi
2689 else if(key==12) return 1;// pi-pi-k
2690 else if(key==21) return 2;// k-k-pi
2691 else if(key==102) return 3;// pi-pi-p
2692 else if(key==201) return 4;// p-p-pi
2693 else if(key==111) return 5;// pi-k-p
2694 else if(key==30) return 6;// k-k-k
2695 else if(key==120) return 7;// k-k-p
2696 else if(key==210) return 8;// p-p-k
2697 else return 9;// p-p-p
2700 //________________________________________________________________________
2701 Short_t AliThreePionRadii::SetQcutBin(Short_t fi){// fi=FillIndex
2702 if(fi <= 2) return 0;
2703 else if(fi==3) return 1;
2706 //________________________________________________________________________
2707 Short_t AliThreePionRadii::SetNormBin(Short_t fi){// fi=FillIndex
2709 else if(fi <= 2) return 1;
2712 //________________________________________________________________________
2713 void AliThreePionRadii::SetFillBins2(Short_t fi, Short_t key1, Short_t key2, Int_t c1, Int_t c2, Int_t &b1, Int_t &b2){
2715 if(fi==0 || fi==3 || fi==5){// Identical species
2716 if((c1+c2)==1) {b1=0; b2=1;}// Re-assign to merge degenerate histos
2717 else {b1=c1; b2=c2;}
2718 }else {// Mixed species
2719 if(key1 < key2) { b1=c1; b2=c2;}
2720 else {b1=c2; b2=c1;}
2724 //________________________________________________________________________
2725 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){
2728 // seSS, seSK, SE_keysum only used to determine which terms to fill (only used for terms 2-4)
2729 // part only matters for terms 2-4
2732 Short_t seKeySum=0;// only used for pi-k-p case
2733 if(part==1) {// default case (irrelevant for term 1 and term 5)
2734 if(c1==c2) seSS=kTRUE;
2735 if(key1==key2) seSK=kTRUE;
2736 seKeySum = key1+key2;
2739 if(c1==c3) seSS=kTRUE;
2740 if(key1==key3) seSK=kTRUE;
2741 seKeySum = key1+key3;
2745 // fill2, fill3, fill4 are only used for Cumulant Terms 2,3,4
2747 if(fi==0 || fi==6 || fi==9){// Identical species
2748 if( (c1+c2+c3)==1) {
2749 b1=0; b2=0; b3=1;// Re-assign to merge degenerate histos
2751 if(seSS) fill2=kTRUE;
2752 else {fill3=kTRUE; fill4=kTRUE;}
2754 }else if( (c1+c2+c3)==2) {
2757 if(!seSS) {fill2=kTRUE; fill3=kTRUE;}
2761 b1=c1; b2=c2; b3=c3;
2762 fill2=kTRUE; fill3=kTRUE; fill4=kTRUE;
2764 }else if(fi != 5){// all the rest except pi-k-p
2767 if( (c1+c2)==1) {b1=0; b2=1;}
2768 else {b1=c1; b2=c2;}
2769 }else if(key1==key3){
2771 if( (c1+c3)==1) {b1=0; b2=1;}
2772 else {b1=c1; b2=c3;}
2773 }else {// Key2==Key3
2775 if( (c2+c3)==1) {b1=0; b2=1;}
2776 else {b1=c2; b2=c3;}
2778 //////////////////////////////
2779 if(seSK) fill2=kTRUE;// Same keys from Same Event
2780 else {// Different keys from Same Event
2781 if( (c1+c2+c3)==1) {
2783 if(seSS) fill3=kTRUE;
2785 }else{fill3=kTRUE; fill4=kTRUE;}// b3=1 so fill both
2786 }else if( (c1+c2+c3)==2) {
2788 if(seSS) fill4=kTRUE;
2790 }else{fill3=kTRUE; fill4=kTRUE;}// b3=0 so fill both
2791 }else{fill3=kTRUE; fill4=kTRUE;}// all same charge so fill both
2793 /////////////////////////////
2794 }else {// pi-k-p (no charge ordering applies since all are unique)
2796 if(key2==10) {b1=c1; b2=c2; b3=c3;}// pi-k-p
2797 else {b1=c1; b2=c3; b3=c2;}// pi-p-k
2799 if(key2==1) {b1=c2; b2=c1; b3=c3;}// k-pi-p
2800 else {b1=c3; b2=c1; b3=c2;}// k-p-pi
2802 if(key2==1) {b1=c2; b2=c3; b3=c1;}// p-pi-k
2803 else {b1=c3; b2=c2; b3=c1;}// p-k-pi
2805 ////////////////////////////////////
2806 if(seKeySum==11) fill2=kTRUE;
2807 else if(seKeySum==101) fill3=kTRUE;
2809 ////////////////////////////////////
2813 //________________________________________________________________________
2814 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){
2816 // for terms 2-4: start by setting q12(part 1) or q13(part 2)
2817 if(fi==0 || fi==6 || fi==9){// Identical species
2818 if( (c1+c2+c3)==1) {// fQ=ss, sQ=os, tQ=os
2819 if(term==1 || term==5){
2820 if(c1==c2) {fQ=q12; sQ=q13; tQ=q23;}
2821 else if(c1==c3) {fQ=q13; sQ=q12; tQ=q23;}
2822 else {fQ=q23; sQ=q12; tQ=q13;}
2823 }else if(term==2 && part==1){
2824 fQ=q12; sQ=q13; tQ=q23;
2825 }else if(term==2 && part==2){
2826 fQ=q13; sQ=q12; tQ=q23;
2827 }else if(term==3 && part==1){
2829 if(c1==c3) {fQ=q13; tQ=q23;}
2830 else {fQ=q23; tQ=q13;}
2831 }else if(term==3 && part==2){
2833 if(c1==c2) {fQ=q12; tQ=q23;}
2834 else {fQ=q23; tQ=q12;}
2835 }else if(term==4 && part==1){
2837 if(c1==c3) {fQ=q13; sQ=q23;}
2838 else {fQ=q23; sQ=q13;}
2839 }else if(term==4 && part==2){
2841 if(c1==c2) {fQ=q12; sQ=q23;}
2842 else {fQ=q23; sQ=q12;}
2843 }else cout<<"problem!!!!!!!!!!!!!"<<endl;
2844 }else if( (c1+c2+c3)==2) {// fQ=os, sQ=os, tQ=ss
2845 if(term==1 || term==5){
2846 if(c1==c2) {tQ=q12; sQ=q13; fQ=q23;}
2847 else if(c1==c3) {tQ=q13; sQ=q12; fQ=q23;}
2848 else {tQ=q23; sQ=q12; fQ=q13;}
2849 }else if(term==2 && part==1){
2851 if(c1==c3) {tQ=q13; sQ=q23;}
2852 else {tQ=q23; sQ=q13;}
2853 }else if(term==2 && part==2){
2855 if(c1==c2) {tQ=q12; sQ=q23;}
2856 else {tQ=q23; sQ=q12;}
2857 }else if(term==3 && part==1){
2859 if(c1==c3) {tQ=q13; fQ=q23;}
2860 else {tQ=q23; fQ=q13;}
2861 }else if(term==3 && part==2){
2863 if(c1==c2) {tQ=q12; fQ=q23;}
2864 else {tQ=q23; fQ=q12;}
2865 }else if(term==4 && part==1){
2866 tQ=q12; sQ=q13; fQ=q23;
2867 }else if(term==4 && part==2){
2868 tQ=q13; sQ=q12; fQ=q23;
2869 }else cout<<"problem!!!!!!!!!!!!!"<<endl;
2870 }else {// fQ=ss, sQ=ss, tQ=ss
2871 if(term==1 || term==5) {fQ=q12; sQ=q13; tQ=q23;}
2872 else if(term==2 && part==1) {fQ=q12; sQ=q13; tQ=q23;}
2873 else if(term==2 && part==2) {fQ=q13; sQ=q12; tQ=q23;}
2874 else if(term==3 && part==1) {sQ=q12; fQ=q13; tQ=q23;}
2875 else if(term==3 && part==2) {sQ=q13; fQ=q12; tQ=q23;}
2876 else if(term==4 && part==1) {tQ=q12; fQ=q13; sQ=q23;}
2877 else if(term==4 && part==2) {tQ=q13; fQ=q12; sQ=q23;}
2879 }else if(fi != 5){// all the rest except pi-k-p
2883 // cases not explicity shown below are not possible
2884 if(term==1 || term==5) {sQ=q13; tQ=q23;}
2885 else if(term==2 && part==1) {sQ=q13; tQ=q23;}
2886 else if(term==3 && part==2) {sQ=q13; tQ=q23;}
2887 else if(term==4 && part==2) {tQ=q13; sQ=q23;}
2888 else cout<<"problem!!!!!!!!!!!!!"<<endl;
2890 if(c1==c3) {sQ=q13; tQ=q23;}
2891 else {sQ=q23; tQ=q13;}
2893 if(c1==c3) {tQ=q13; sQ=q23;}
2894 else {tQ=q23; sQ=q13;}
2896 }else if(key1==key3){
2899 // cases not explicity shown below are not possible
2900 if(term==1 || term==5) {sQ=q12; tQ=q23;}
2901 else if(term==2 && part==2) {sQ=q12; tQ=q23;}
2902 else if(term==3 && part==1) {sQ=q12; tQ=q23;}
2903 else if(term==4 && part==1) {tQ=q12; sQ=q23;}
2904 else cout<<"problem!!!!!!!!!!!!!!!!!!!!!!"<<endl;
2906 if(c1==c2) {sQ=q12; tQ=q23;}
2907 else {sQ=q23; tQ=q12;}
2909 if(c1==c2) {tQ=q12; sQ=q23;}
2910 else {tQ=q23; sQ=q12;}
2912 }else {// key2==key3
2915 // cases not explicity shown below are not possible
2916 if(term==1 || term==5) {sQ=q12; tQ=q13;}
2917 else if(term==3 && part==1) {sQ=q12; tQ=q13;}
2918 else if(term==3 && part==2) {sQ=q13; tQ=q12;}
2919 else if(term==4 && part==1) {tQ=q12; sQ=q13;}
2920 else if(term==4 && part==2) {tQ=q13; sQ=q12;}
2921 else cout<<"problem!!!!!!!!!!!!!!!!!!!!!!"<<endl;
2923 if(c1==c2) {sQ=q12; tQ=q13;}
2924 else {sQ=q13; tQ=q12;}
2926 if(c1==c2) {tQ=q12; sQ=q13;}
2927 else {tQ=q13; sQ=q12;}
2932 if(key2==10) {fQ=q12; sQ=q13; tQ=q23;}// pi-k-p
2933 else {fQ=q13; sQ=q12; tQ=q23;}// pi-p-k
2935 if(key2==1) {fQ=q12; sQ=q23; tQ=q13;}// k-pi-p
2936 else {fQ=q13; sQ=q23; tQ=q12;}// k-p-pi
2938 if(key2==1) {fQ=q23; sQ=q12; tQ=q13;}// p-pi-k
2939 else {fQ=q23; sQ=q13; tQ=q12;}// p-k-pi
2946 //________________________________________________________________________
2947 Float_t AliThreePionRadii::GetQinv(Short_t fi, Float_t track1[], Float_t track2[]){
2951 if(fi==0 || fi==3 || fi==5){// identical masses
2952 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));
2953 }else{// different masses
2954 Float_t px = track1[1] + track2[1];
2955 Float_t py = track1[2] + track2[2];
2956 Float_t pz = track1[3] + track2[3];
2957 Float_t pSquared = pow(track1[0]+track2[0],2) - px*px - py*py - pz*pz;
2958 Float_t deltaDOTsum = (track1[0]-track2[0])*(track1[0]+track2[0]);
2959 deltaDOTsum -= (track1[1]-track2[1])*px + (track1[2]-track2[2])*py + (track1[3]-track2[3])*pz;
2961 qinv = pow( (track1[1]-track2[1]) - deltaDOTsum*px/(pSquared),2);
2962 qinv += pow( (track1[2]-track2[2]) - deltaDOTsum*py/(pSquared),2);
2963 qinv += pow( (track1[3]-track2[3]) - deltaDOTsum*pz/(pSquared),2);
2964 qinv -= pow( (track1[0]-track2[0]) - deltaDOTsum*(track1[0]+track2[0])/(pSquared),2);
2971 //________________________________________________________________________
2972 void AliThreePionRadii::GetQosl(Float_t track1[], Float_t track2[], Float_t& qout, Float_t& qside, Float_t& qlong){
2974 Float_t p0 = track1[0] + track2[0];
2975 Float_t px = track1[1] + track2[1];
2976 Float_t py = track1[2] + track2[2];
2977 Float_t pz = track1[3] + track2[3];
2979 Float_t mt = sqrt(p0*p0 - pz*pz);
2980 Float_t pt = sqrt(px*px + py*py);
2982 Float_t v0 = track1[0] - track2[0];
2983 Float_t vx = track1[1] - track2[1];
2984 Float_t vy = track1[2] - track2[2];
2985 Float_t vz = track1[3] - track2[3];
2987 qout = (px*vx + py*vy)/pt;
2988 qside = (px*vy - py*vx)/pt;
2989 qlong = (p0*vz - pz*v0)/mt;
2991 //________________________________________________________________________
2992 Float_t AliThreePionRadii::MCWeight(Int_t charge1, Int_t charge2, Float_t r, Int_t dampIndex, Float_t qinv){
2994 Float_t radius = r/0.19733;// convert to GeV (starts at 5 fm, was 3 fm)
2996 Float_t myDamp = fDampStart + (fDampStep)*dampIndex;
2997 Float_t coulCorr12 = FSICorrelation2(charge1, charge2, qinv);
2998 if(charge1==charge2){
2999 Float_t arg=qinv*radius;
3000 Float_t EW = 1 + kappa3/(6.*pow(2.,1.5))*(8.*pow(arg,3) - 12.*arg);
3001 EW += kappa4/(24.*pow(2.,2))*(16.*pow(arg,4) -48.*pow(arg,2) + 12);
3002 return ((1-myDamp) + myDamp*(1 + exp(-pow(qinv*radius,2))*pow(EW,2))*coulCorr12);
3004 return ((1-myDamp) + myDamp*coulCorr12);
3008 //________________________________________________________________________
3009 Float_t AliThreePionRadii::MCWeight3D(Bool_t SameCharge, Int_t term, Int_t dampIndex, Float_t q12, Float_t q13, Float_t q23){
3010 if(term==5) return 1.0;
3012 Float_t radius=fRMax;
3015 Float_t myDamp = fDampStart + (fDampStep)*dampIndex;
3016 Float_t fc = sqrt(myDamp);
3018 if(SameCharge){// all three of the same charge
3019 Float_t coulCorr12 = FSICorrelation2(+1,+1, q12);// K2
3020 Float_t coulCorr13 = FSICorrelation2(+1,+1, q13);// K2
3021 Float_t coulCorr23 = FSICorrelation2(+1,+1, q23);// K2
3022 Float_t arg12=q12*radius;
3023 Float_t arg13=q13*radius;
3024 Float_t arg23=q23*radius;
3025 Float_t EW12 = 1 + kappa3/(6.*pow(2.,1.5))*(8.*pow(arg12,3) - 12.*arg12);
3026 EW12 += kappa4/(24.*pow(2.,2))*(16.*pow(arg12,4) -48.*pow(arg12,2) + 12);
3027 Float_t EW13 = 1 + kappa3/(6.*pow(2.,1.5))*(8.*pow(arg13,3) - 12.*arg13);
3028 EW13 += kappa4/(24.*pow(2.,2))*(16.*pow(arg13,4) -48.*pow(arg13,2) + 12);
3029 Float_t EW23 = 1 + kappa3/(6.*pow(2.,1.5))*(8.*pow(arg23,3) - 12.*arg23);
3030 EW23 += kappa4/(24.*pow(2.,2))*(16.*pow(arg23,4) -48.*pow(arg23,2) + 12);
3032 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);
3033 c3QS += 2*exp(-pow(radius,2)*(pow(q12,2) + pow(q13,2) + pow(q23,2))/2.)*EW12*EW13*EW23;
3034 Float_t w123 = pow(1-fc,3) + 3*fc*pow(1-fc,2);
3035 w123 += pow(fc,2)*(1-fc)*(1+exp(-pow(q12*radius,2))*pow(EW12,2))*coulCorr12;
3036 w123 += pow(fc,2)*(1-fc)*(1+exp(-pow(q13*radius,2))*pow(EW13,2))*coulCorr13;
3037 w123 += pow(fc,2)*(1-fc)*(1+exp(-pow(q23*radius,2))*pow(EW23,2))*coulCorr23;
3038 w123 += pow(fc,3)*c3QS*coulCorr12*coulCorr13*coulCorr23;
3041 return ((1-myDamp) + myDamp*(1 + exp(-pow(q12*radius,2))*pow(EW12,2))*coulCorr12);
3043 return ((1-myDamp) + myDamp*(1 + exp(-pow(q13*radius,2))*pow(EW13,2))*coulCorr13);
3045 return ((1-myDamp) + myDamp*(1 + exp(-pow(q23*radius,2))*pow(EW23,2))*coulCorr23);
3048 }else{// mixed charge case pair 12 always treated as ss
3049 Float_t coulCorr12 = FSICorrelation2(+1,+1, q12);// K2 ss
3050 Float_t coulCorr13 = FSICorrelation2(+1,-1, q13);// K2 os
3051 Float_t coulCorr23 = FSICorrelation2(+1,-1, q23);// K2 os
3052 Float_t arg12=q12*radius;
3053 Float_t EW12 = 1 + kappa3/(6.*pow(2.,1.5))*(8.*pow(arg12,3) - 12.*arg12);
3054 EW12 += kappa4/(24.*pow(2.,2))*(16.*pow(arg12,4) -48.*pow(arg12,2) + 12);
3056 Float_t c3QS = 1 + exp(-pow(q12*radius,2))*pow(EW12,2);
3057 Float_t w123 = pow(1-fc,3) + 3*fc*pow(1-fc,2);
3058 w123 += pow(fc,2)*(1-fc)*(1+exp(-pow(q12*radius,2))*pow(EW12,2))*coulCorr12;
3059 w123 += pow(fc,2)*(1-fc)*coulCorr13;
3060 w123 += pow(fc,2)*(1-fc)*coulCorr23;
3061 w123 += pow(fc,3)*c3QS*coulCorr12*coulCorr13*coulCorr23;
3064 return ((1-myDamp) + myDamp*(1 + exp(-pow(q12*radius,2))*pow(EW12,2))*coulCorr12);
3066 return ((1-myDamp) + myDamp*coulCorr13);
3068 return ((1-myDamp) + myDamp*coulCorr23);
3073 //________________________________________________________________________
3074 void AliThreePionRadii::SetFSICorrelations(Bool_t legoCase, TH1D *temp1DSS[10], TH1D *temp1DOS[10]){
3075 // read in 2-particle FSI correlations = K2
3076 // 2-particle input histo from file is binned in qinv.
3078 cout<<"LEGO call to SetFSICorrelations"<<endl;
3079 for(int mb=0; mb<10; mb++){
3080 fFSI2SS[mb] = (TH1D*)temp1DSS[mb]->Clone();
3081 fFSI2OS[mb] = (TH1D*)temp1DOS[mb]->Clone();
3083 fFSI2SS[mb]->SetDirectory(0);
3084 fFSI2OS[mb]->SetDirectory(0);
3087 cout<<"non LEGO call to SetFSICorrelations"<<endl;
3088 TFile *fsifile = new TFile("KFile.root","READ");
3089 if(!fsifile->IsOpen()) {
3090 cout<<"No FSI file found"<<endl;
3091 AliFatal("No FSI file found. Kill process.");
3092 }else {cout<<"Good FSI File Found!"<<endl;}
3093 for(int mb=0; mb<10; mb++){
3094 TString *nameK2ss = new TString("K2ss_");
3095 TString *nameK2os = new TString("K2os_");
3098 TH1D *temphistoSS = (TH1D*)fsifile->Get(nameK2ss->Data());
3099 TH1D *temphistoOS = (TH1D*)fsifile->Get(nameK2os->Data());
3101 fFSI2SS[mb] = (TH1D*)temphistoSS->Clone();
3102 fFSI2OS[mb] = (TH1D*)temphistoOS->Clone();
3103 fFSI2SS[mb]->SetDirectory(0);
3104 fFSI2OS[mb]->SetDirectory(0);
3110 for(int mb=0; mb<10; mb++){
3111 for(Int_t ii=1; ii<=fFSI2SS[mb]->GetNbinsX(); ii++){
3112 if(fFSI2SS[mb]->GetBinContent(ii) > 1.0) fFSI2SS[mb]->SetBinContent(ii, 1.0);
3113 if(fFSI2OS[mb]->GetBinContent(ii) > 10.0) fFSI2OS[mb]->SetBinContent(ii, 10.0);
3115 if(fFSI2SS[mb]->GetBinContent(ii) < 0.05) fFSI2SS[mb]->SetBinContent(ii, 0.05);
3116 if(fFSI2OS[mb]->GetBinContent(ii) < 0.9) fFSI2OS[mb]->SetBinContent(ii, 0.9);
3120 cout<<"Done reading FSI file"<<endl;
3122 //________________________________________________________________________
3123 Float_t AliThreePionRadii::FSICorrelation2(Int_t charge1, Int_t charge2, Float_t qinv){
3124 // returns 2-particle Coulomb correlations = K2
3125 Int_t qbinL = fFSI2SS[fFSIindex]->GetXaxis()->FindBin(qinv-fFSI2SS[fFSIindex]->GetXaxis()->GetBinWidth(1)/2.);
3126 Int_t qbinH = qbinL+1;
3127 if(qbinL <= 0) return 1.0;
3128 if(qbinH > fFSI2SS[fFSIindex]->GetNbinsX()) return 1.0;
3131 if(charge1==charge2){
3132 slope = fFSI2SS[fFSIindex]->GetBinContent(qbinL) - fFSI2SS[fFSIindex]->GetBinContent(qbinH);
3133 slope /= fFSI2SS[fFSIindex]->GetXaxis()->GetBinCenter(qbinL) - fFSI2SS[fFSIindex]->GetXaxis()->GetBinCenter(qbinH);
3134 return (slope*(qinv - fFSI2SS[fFSIindex]->GetXaxis()->GetBinCenter(qbinL)) + fFSI2SS[fFSIindex]->GetBinContent(qbinL));
3136 slope = fFSI2OS[fFSIindex]->GetBinContent(qbinL) - fFSI2OS[fFSIindex]->GetBinContent(qbinH);
3137 slope /= fFSI2OS[fFSIindex]->GetXaxis()->GetBinCenter(qbinL) - fFSI2OS[fFSIindex]->GetXaxis()->GetBinCenter(qbinH);
3138 return (slope*(qinv - fFSI2OS[fFSIindex]->GetXaxis()->GetBinCenter(qbinL)) + fFSI2OS[fFSIindex]->GetBinContent(qbinL));
3141 //________________________________________________________________________