25 #include "Riostream.h" 29 #include "AliAODEvent.h" 30 #include "AliAODInputHandler.h" 31 #include "AliAnalysisManager.h" 32 #include "AliMultSelection.h" 46 fMaxNumberCorrelations(8),
48 fNumberDifferentHarmonics(2),
49 fUseParticleWeights(kFALSE),
50 fComputeNestedLoops(kFALSE),
61 fMaxCentrality(100.0),
66 fOutputMainList(NULL),
67 fPreCutControlList(NULL),
68 fPostCutControlList(NULL),
69 fCorrelationResultsList(NULL),
70 fCentralityPreCutHisto(NULL),
71 fMultiplicityPreCutHisto(NULL),
72 fPtPreCutControlHisto(NULL),
73 fEtaPreCutControlHisto(NULL),
74 fPhiPreCutHisto(NULL),
75 fMultiplicityPostCutHisto(NULL),
76 fPtPostCutControlHisto(NULL),
77 fEtaPostCutControlHisto(NULL),
78 fPhiPostCutHisto(NULL)
81 AliDebug(2,
"AliAnalysisTaskTwoMultiCorrelations::AliAnalysisTaskTwoMultiCorrelations(const char *name, Bool_t useParticleWeights)");
84 fOutputMainList =
new TList();
85 fOutputMainList->SetName(
"outputAnalysis");
86 fOutputMainList->SetOwner(kTRUE);
89 DefineOutput(1, TList::Class());
92 InitialiseArraysOfQvectors();
95 InitialiseArraysOfTProfiles();
98 if(useParticleWeights)
108 fMaxNumberCorrelations(8),
110 fNumberDifferentHarmonics(2),
111 fUseParticleWeights(kFALSE),
112 fComputeNestedLoops(kFALSE),
113 fComputeSine(kFALSE),
123 fMaxCentrality(100.0),
128 fOutputMainList(NULL),
129 fPreCutControlList(NULL),
130 fPostCutControlList(NULL),
131 fCorrelationResultsList(NULL),
132 fCentralityPreCutHisto(NULL),
133 fMultiplicityPreCutHisto(NULL),
134 fPtPreCutControlHisto(NULL),
135 fEtaPreCutControlHisto(NULL),
136 fPhiPreCutHisto(NULL),
137 fMultiplicityPostCutHisto(NULL),
138 fPtPostCutControlHisto(NULL),
139 fEtaPostCutControlHisto(NULL),
140 fPhiPostCutHisto(NULL)
145 AliDebug(2,
"AliAnalysisTaskTwoMultiCorrelations::AliAnalysisTaskTwoMultiCorrelations(const char *name, Bool_t useParticleWeights)");
171 Bool_t oldHistAddStatus = TH1::AddDirectoryStatus();
172 TH1::AddDirectory(kFALSE);
183 TH1::AddDirectory(oldHistAddStatus);
197 if(!currentEvent){
return;}
200 AliMultSelection *ams = (AliMultSelection*)currentEvent->FindListObject(
"MultSelection");
209 Int_t nParticles = currentEvent->GetNumberOfTracks();
210 Int_t nParticlesAfterCuts = 0;
216 for (
Int_t iParticle = 0; iParticle < nParticles; iParticle++)
219 AliAODTrack *currentParticle =
dynamic_cast<AliAODTrack*
>(currentEvent->GetTrack(iParticle));
220 if(!currentParticle){
continue;}
221 if(!currentParticle->TestFilterBit(128)){
continue;}
224 Double_t preCutPt = currentParticle->Pt();
225 Double_t preCutEta = currentParticle->Eta();
226 Double_t preCutPhi = currentParticle->Phi();
235 nParticlesAfterCuts++;
236 goodIndices[iParticle] = 1;
238 else {goodIndices[iParticle] = 0;}
257 harmonics[iArray] = fullHarmonicsArray[iArray];
261 if (nParticlesAfterCuts > (2*fNumberDifferentHarmonics))
264 for (
Int_t iiParticle = 0; iiParticle < nParticles; iiParticle++)
267 AliAODTrack *keptParticle =
dynamic_cast<AliAODTrack*
>(currentEvent->GetTrack(iiParticle));
268 if(!keptParticle){
continue;}
269 if(!keptParticle->TestFilterBit(128)){
continue;}
272 if (goodIndices[iiParticle] == 1)
274 pt[index] = keptParticle->Pt();
275 eta[index] = keptParticle->Eta();
276 phi[index] = keptParticle->Phi();
277 particleWeights[index] = 1.;
297 Int_t numeratorFirstTwoParticle[2] = {harmonics[2*iDiffHarmo],harmonics[(2*iDiffHarmo)+1]};
298 Int_t numeratorLastTwoParticle[2] = {harmonics[2],harmonics[3]};
305 if (fNumberDifferentHarmonics >= 2)
308 for (
Int_t i = 0; i < fNumberDifferentHarmonics-1; i++)
313 Int_t numeratorFourParticle[4] = {harmonics[2*i],harmonics[(2*i)+1], harmonics[2*j],harmonics[(2*j)+1]};
323 if (fNumberDifferentHarmonics >= 3)
326 for (
Int_t i = 0; i < fNumberDifferentHarmonics-2; i++)
329 for (
Int_t j = i+1; j < fNumberDifferentHarmonics-1; j++)
335 Int_t numeratorSixParticle[6] = {harmonics[2*i],harmonics[(2*i)+1], harmonics[2*j],harmonics[(2*j)+1],harmonics[2*k],harmonics[(2*k)+1]};
344 if (fNumberDifferentHarmonics >= 4)
351 delete [] goodIndices;
355 delete [] particleWeights;
378 TFile *outputFile =
new TFile(
"AnalysisResults.root",
"RECREATE");
392 fQvectors[iHarmo][iPower] = TComplex(0.,0.);
403 for (
Int_t cs = 0; cs < 2; cs++)
405 for (
Int_t t = 0; t < 4; t++)
414 for (
Int_t f = 0; f < 6; f++)
431 TString sMethodName =
"void AliAnalysisTaskTwoMultiCorrelations::BookAndNestAllLists()";
432 if(!
fOutputMainList){Fatal(sMethodName.Data(),
"Main list fOutputMainList is NULL");}
436 fPreCutControlList->SetName(
"PreCutControlList");
437 fPreCutControlList->SetOwner(kTRUE);
477 fPtPreCutControlHisto =
new TH1D(
"fPtPreCutControlHisto",
"Transverse momentum distribution before the cuts", 1000, 0., 20.);
489 fPhiPreCutHisto =
new TH1D(
"fPhiPreCutHisto",
"Azimuthal angles distribution before the cuts", 1000, 0., 6.3);
512 fPtPostCutControlHisto =
new TH1D(
"fPtPostCutControlHisto",
"Transverse momentum distribution after the cuts", 1000, 0., 20.);
524 fPhiPostCutHisto =
new TH1D(
"fPhiPostCutHisto",
"Azimuthal angles distribution after the cuts", 1000, 0., 6.3);
542 for (
Int_t cs = 0; cs < endCs; cs++)
544 for (
Int_t t = 0; t < 4; t++)
567 fTwoCosineAverageProfile[cs][t]->SetTitle(Form(
"Q-vectors, #LT #LT cos(m (phi1-phi2)) #GT #LT cos(n (phi1-phi2)) #GT #GT, cs = %d, combi = %d", cs, t));
569 fTwoCosineAverageProfile[cs][t]->GetXaxis()->SetTitle(
"#LT #LT cos(m (phi1-phi2)) #GT #LT cos(n (phi1-phi2)) #GT #GT");
585 fTwoCosineAverageNestedProfile[cs][t]->SetTitle(Form(
"Nested loops, #LT #LT cos(m (phi1-phi2)) #GT #LT cos(n (phi1-phi2)) #GT #GT, cs = %d, combi = %d", cs, t));
592 for (
Int_t t = 0; t < 6; t++)
635 for (
Int_t iParticle = 0; iParticle < nParticles; iParticle++)
641 pWeightPowerP = pow(particleWeight[iParticle], iPower);
642 fQvectors[iHarmo][iPower] += TComplex(pWeightPowerP*TMath::Cos(iHarmo*phi[iParticle]),pWeightPowerP*TMath::Sin(iHarmo*phi[iParticle]));
654 return TComplex::Conjugate(
fQvectors[-n][p]);
664 TComplex stopQvector = TComplex(0.,0.);
667 Int_t counterOne = 0;
669 TComplex tempQvector = TComplex(0,0);
670 Int_t counterTwo = 0;
673 nMinusOne = nPartCorr-1;
674 stopQvector =
Q(harmonics[nMinusOne],p);
676 if (nMinusOne == 0) {
return stopQvector;}
678 if (nMinusOne == skip) {
return stopQvector;}
682 nMinusTwo = nPartCorr-2;
683 hHold = harmonics[counterOne];
684 harmonics[counterOne] = harmonics[nMinusTwo];
685 harmonics[nMinusTwo] = hHold + harmonics[nMinusOne];
687 counterTwo = nPartCorr-3;
689 while (counterTwo >= skip)
691 harmonics[nMinusTwo] = harmonics[counterOne];
692 harmonics[counterOne] = hHold;
695 hHold = harmonics[counterOne];
696 harmonics[counterOne] = harmonics[nMinusTwo];
697 harmonics[nMinusTwo] = hHold + harmonics[nMinusOne];
702 harmonics[nMinusTwo] = harmonics[counterOne];
703 harmonics[counterOne] = hHold;
706 if (p == 1) {
return stopQvector - tempQvector;}
707 return stopQvector - (
Double_t(p)*tempQvector);
711 stopQvector = TComplex(0.,0.);
716 tempQvector = TComplex(0,0);
726 Int_t denominatorTwoParticleHarmonics[2] = {0,0};
728 TComplex firstTwoParticleCorrelation = TComplex(0.,0.);
729 TComplex lastTwoParticleCorrelation = TComplex(0.,0.);
744 firstTwoParticleCorrelation = TComplex(0.,0.);
745 lastTwoParticleCorrelation = TComplex(0.,0.);
753 Int_t denominatorFourParticleHarmonics[4] = {0,0,0,0};
755 TComplex fourParticleCorrelation = TComplex(0.,0.);
771 Int_t denominatorSixParticleHarmonics[6] = {0,0,0,0,0,0};
773 TComplex sixParticleCorrelation = TComplex(0.,0.);
789 Int_t denominatorEightParticleHarmonics[8] = {0,0,0,0,0,0,0,0};
791 TComplex eightParticleCorrelation = TComplex(0.,0.);
813 for (
Int_t k = 0; k < nParticles; k++)
815 for (
Int_t l = 0; l < nParticles; l++)
818 if (k == l) {
continue;}
821 twoParticleCos = TMath::Cos(numeratorTwoParticleHarmonics[0]*phi[k] + numeratorTwoParticleHarmonics[1]*phi[l]);
822 twoParticleSecondCos = TMath::Cos(numeratorTwoLastParticleHarmonics[0]*phi[k] + numeratorTwoLastParticleHarmonics[1]*phi[l]);
824 if (
fComputeSine) {twoParticleSin = TMath::Sin(numeratorTwoParticleHarmonics[0]*phi[k] + numeratorTwoParticleHarmonics[1]*phi[l]);}
825 totalParticleWeight = particleWeight[k] * particleWeight[l];
839 twoParticleSecondCos = 0.;
841 totalParticleWeight = 0.;
855 for (
Int_t k = 0; k < nParticles; k++)
857 for (
Int_t l = 0; l < nParticles; l++)
860 if (k == l) {
continue;}
862 for (
Int_t m = 0; m < nParticles; m++)
865 if ((k == m) || (l == m)) {
continue;}
867 for (
Int_t n = 0; n < nParticles; n++)
870 if ((k == n) || (l == n) || (m == n)) {
continue;}
873 fourParticleCos = TMath::Cos(numeratorFourParticleHarmonics[0]*phi[k] + numeratorFourParticleHarmonics[1]*phi[l] + numeratorFourParticleHarmonics[2]*phi[m] + numeratorFourParticleHarmonics[3]*phi[n]);
874 if (
fComputeSine) {fourParticleSin = TMath::Sin(numeratorFourParticleHarmonics[0]*phi[k] + numeratorFourParticleHarmonics[1]*phi[l] + numeratorFourParticleHarmonics[2]*phi[m] + numeratorFourParticleHarmonics[3]*phi[n]);}
875 totalParticleWeight = particleWeight[k]*particleWeight[l]*particleWeight[m]*particleWeight[n];
887 fourParticleCos = 0.;
888 fourParticleSin = 0.;
889 totalParticleWeight = 0.;
TProfile * fTwoParticleCorrelationProfile[2][4]
Azimuthal angles distribution.
TComplex fQvectors[49][9]
TList * fPostCutControlList
virtual void UserCreateOutputObjects()
TProfile * fEightParticleCorrelationProfile[2]
6-p correlations ([cos,sin][max number of combinations of 3 elements out of 4]) with Q-vectors ...
virtual void ComputeFourParticleCorrelationWithQvectors(Int_t numeratorFourParticleHarmonics[], Int_t indexTProfile)
Int_t fNumberDifferentHarmonics
virtual ~AliAnalysisTaskTwoMultiCorrelations()
virtual void Terminate(Option_t *)
Int_t fMaxNumberCorrelations
TComplex CalculateRecursionWithQvectors(Int_t nPartCorr, Int_t harmonics[], Int_t p=1, Int_t skip=0)
TList * fCorrelationResultsList
TProfile * fTwoNestedCorrelationProfile[2][4]
[<<cos(m(phi1-phi2))><cos(n(phi1-phi2))>>,<<sin(m(phi1-phi2))><sin(n(phi1-phi2))>>][6] with Q-vectors...
TProfile * fSixParticleCorrelationProfile[2][4]
4-p correlations ([cos,sin][max number of combinations of 2 elements out of 4]) with Q-vectors ...
TProfile * fTwoCosineAverageNestedProfile[2][4]
4-p correlations ([cos,sin][max number of combinations of 2 elements out of 4]) with nested loops ...
TH1D * fPtPreCutControlHisto
Multiplicity distribution.
virtual void BookCorrelationResultsList()
virtual void BookPostCutControlList()
TH1D * fPtPostCutControlHisto
Multiplicity distribution.
virtual void ComputeCorrelationsWithTwoNestedLoops(Int_t numeratorTwoParticleHarmonics[], Int_t numeratorTwoLastParticleHarmonics[], Int_t indexTProfile, Int_t nParticles, Double_t phi[], Double_t particleWeight[])
Bool_t fComputeNestedLoops
TH1D * fEtaPreCutControlHisto
Transverse momentum distribution.
TProfile * fTwoCosineAverageProfile[2][4]
8-p correlations ([cos,sin]) with Q-vectors
virtual void BookPreCutControlList()
TH1D * fPhiPreCutHisto
Pseudorapidity distribution.
virtual void InitialiseArraysOfQvectors()
TH1D * fPhiPostCutHisto
Pseudorapidity distribution.
virtual void ComputeCorrelationsWithFourNestedLoops(Int_t numeratorFourParticleHarmonics[], Int_t indexTProfile, Int_t nParticles, Double_t phi[], Double_t particleWeight[])
TH1D * fMultiplicityPostCutHisto
Azimuthal angles distribution.
virtual void InitialiseArraysOfTProfiles()
virtual void UserExec(Option_t *)
TH1D * fMultiplicityPreCutHisto
Centrality distribution.
TProfile * fFourParticleCorrelationProfile[2][6]
2-p correlations ([cos,sin][m,n,p,q]) with Q-vectors
TH1D * fEtaPostCutControlHisto
Transverse momentum distribution.
virtual void BookAndNestAllLists()
TList * fPreCutControlList
virtual void ComputeEightParticleCorrelationWithQvectors(Int_t numeratorEightParticleHarmonics[])
TProfile * fFourNestedCorrelationProfile[2][6]
2-p correlations ([cos,sin][m,n,p,q]) with nested loops
TH1D * fCentralityPreCutHisto
TComplex Q(Int_t n, Int_t p)
virtual void ComputeSixParticleCorrelationWithQvectors(Int_t numeratorSixParticleHarmonics[], Int_t indexTProfile)
virtual void CalculateQvectors(Int_t nParticles, Double_t phi[], Double_t particleWeight[])
virtual void ComputeTwoParticleCorrelationWithQvectors(Int_t numeratorFirstTwoParticleHarmonics[], Int_t numeratorLastTwoParticleHarmonics[], Int_t indexTProfile)
AliAnalysisTaskTwoMultiCorrelations()