27 #include "Riostream.h"
28 #include "TObjArray.h"
32 #include "TParticle.h"
39 #include "TParameter.h"
54 fTrackCollection(NULL),
55 fReferenceMultiplicity(0),
57 fUseGlauberMCSymmetryPlanes(kFALSE),
58 fUseExternalSymmetryPlanes(kFALSE),
67 fMCReactionPlaneAngle(0.),
68 fMCReactionPlaneAngleIsSet(kFALSE),
69 fAfterBurnerPrecision(0.001),
70 fUserModified(kFALSE),
71 fNumberOfTracksWrap(NULL),
72 fNumberOfRPsWrap(NULL),
73 fNumberOfPOIsWrap(NULL),
74 fMCReactionPlaneAngleWrap(NULL),
75 fShuffledIndexes(NULL),
76 fShuffleTracks(kFALSE),
77 fMothersCollection(NULL),
91 for(
Int_t i(0); i < 3; i++) {
94 for(
Int_t i=0; i < 4; i++) {
98 cout <<
"AliFlowEventSimple: Default constructor to be used only by root for io" << endl;
110 fReferenceMultiplicity(0),
112 fUseGlauberMCSymmetryPlanes(kFALSE),
113 fUseExternalSymmetryPlanes(kFALSE),
122 fMCReactionPlaneAngle(0.),
123 fMCReactionPlaneAngleIsSet(kFALSE),
124 fAfterBurnerPrecision(0.001),
125 fUserModified(kFALSE),
126 fNumberOfTracksWrap(NULL),
127 fNumberOfRPsWrap(NULL),
128 fNumberOfPOIsWrap(NULL),
129 fMCReactionPlaneAngleWrap(NULL),
130 fShuffledIndexes(NULL),
131 fShuffleTracks(kFALSE),
141 fNumberOfPOItypes(2),
142 fNumberOfPOIs(new
Int_t[fNumberOfPOItypes])
150 Generate(n,ptDist,phiMin,phiMax,etaMin,etaMax);
154 for(
Int_t i(0); i < 3; i++) {
157 for(
Int_t i=0; i < 4; i++) {
166 fTrackCollection((
TObjArray*)(anEvent.fTrackCollection)->Clone()),
167 fReferenceMultiplicity(anEvent.fReferenceMultiplicity),
168 fNumberOfTracks(anEvent.fNumberOfTracks),
169 fUseGlauberMCSymmetryPlanes(anEvent.fUseGlauberMCSymmetryPlanes),
170 fUseExternalSymmetryPlanes(anEvent.fUseExternalSymmetryPlanes),
171 fPsi1(anEvent.fPsi1),
172 fPsi2(anEvent.fPsi2),
173 fPsi3(anEvent.fPsi3),
174 fPsi4(anEvent.fPsi4),
175 fPsi5(anEvent.fPsi5),
176 fPsi1Psi3(anEvent.fPsi1Psi3),
177 fPsi2Psi4(anEvent.fPsi2Psi4),
178 fPsi3Psi5(anEvent.fPsi3Psi5),
179 fMCReactionPlaneAngle(anEvent.fMCReactionPlaneAngle),
180 fMCReactionPlaneAngleIsSet(anEvent.fMCReactionPlaneAngleIsSet),
181 fAfterBurnerPrecision(anEvent.fAfterBurnerPrecision),
182 fUserModified(anEvent.fUserModified),
183 fNumberOfTracksWrap(anEvent.fNumberOfTracksWrap),
184 fNumberOfRPsWrap(anEvent.fNumberOfRPsWrap),
185 fNumberOfPOIsWrap(anEvent.fNumberOfPOIsWrap),
186 fMCReactionPlaneAngleWrap(anEvent.fMCReactionPlaneAngleWrap),
187 fShuffledIndexes(NULL),
188 fShuffleTracks(anEvent.fShuffleTracks),
190 fCentrality(anEvent.fCentrality),
191 fCentralityCL1(anEvent.fCentralityCL1),
192 fNITSCL1(anEvent.fNITSCL1),
193 fCentralityTRK(anEvent.fCentralityTRK),
195 fZNCQ(anEvent.fZNCQ),
196 fZNAQ(anEvent.fZNAQ),
197 fZNCM(anEvent.fZNCM),
198 fZNAM(anEvent.fZNAM),
199 fAbsOrbit(anEvent.fAbsOrbit),
200 fNumberOfPOItypes(anEvent.fNumberOfPOItypes),
201 fNumberOfPOIs(new
Int_t[fNumberOfPOItypes])
205 for(
Int_t i(0); i < 3; i++) {
208 for(
Int_t i=0; i < 4; i++) {
224 for (
Int_t j=0; j<n; j++) { tmp[j]=0; }
246 if (&anEvent==
this)
return *
this;
285 for(
Int_t i(0); i < 3; i++) {
288 for(
Int_t i=0; i < 4; i++) {
321 fPsi1Psi3 =
new TF1(
"fPsi1Psi3",
"[0]*x+[1]",0.,2.*TMath::Pi());
329 fPsi2Psi4 =
new TF1(
"fPsi2Psi4",
"[0]*x+[1]",0.,2.*TMath::Pi());
337 fPsi3Psi5 =
new TF1(
"fPsi3Psi5",
"[0]*x+[1]",0.,2.*TMath::Pi());
355 static TF1 ptdistribution(
"ptSpectra",
"x*TMath::Exp(-pow(0.13957*0.13957+x*x,0.5)/0.4)",0.1,10.);
356 ptDist=&ptdistribution;
359 for (
Int_t i=0; i<nParticles; i++)
364 track->
SetPt( ptDist->GetRandom() );
370 fPsi1Psi3->SetParameter(1,betaParameter);
372 betaParameter =
gRandom->Gaus(0.,0.9);
373 fPsi2Psi4->SetParameter(1,betaParameter);
375 betaParameter =
gRandom->Gaus(0.,1.5);
376 fPsi3Psi5->SetParameter(1,betaParameter);
382 else if(
fPsi3 > 2.*TMath::Pi())
fPsi3 -= 2.*TMath::Pi();
385 else if(
fPsi4 > 2.*TMath::Pi())
fPsi4 -= 2.*TMath::Pi();
388 else if(
fPsi5 > 2.*TMath::Pi())
fPsi5 -= 2.*TMath::Pi();
428 Printf(
"Tracks shuffled! tracks: %i",fNumberOfTracks);
435 if (fNumberOfTracks < fTrackCollection->GetEntriesFast())
504 TH1F *phiWeights = NULL;
505 TH1D *ptWeights = NULL;
506 TH1D *etaWeights = NULL;
512 phiWeights =
dynamic_cast<TH1F *
>(weightsList->FindObject(
"phi_weights"));
513 if(phiWeights) nBinsPhi = phiWeights->GetNbinsX();
517 ptWeights =
dynamic_cast<TH1D *
>(weightsList->FindObject(
"pt_weights"));
520 dBinWidthPt = ptWeights->GetBinWidth(1);
521 dPtMin = (ptWeights->GetXaxis())->GetXmin();
526 etaWeights =
dynamic_cast<TH1D *
>(weightsList->FindObject(
"eta_weights"));
529 dBinWidthEta = etaWeights->GetBinWidth(1);
530 dEtaMin = (etaWeights->GetXaxis())->GetXmin();
543 dPhi = pTrack->
Phi();
545 dEta = pTrack->
Eta();
546 dWeight = pTrack->
Weight();
549 if(phiWeights && nBinsPhi)
551 wPhi = phiWeights->GetBinContent(1+(
Int_t)(TMath::Floor(dPhi*nBinsPhi/TMath::TwoPi())));
554 if(ptWeights && dBinWidthPt)
556 wPt=ptWeights->GetBinContent(1+(
Int_t)(TMath::Floor((dPt-dPtMin)/dBinWidthPt)));
559 if(etaWeights && dBinWidthEta)
561 wEta=etaWeights->GetBinContent(1+(
Int_t)(TMath::Floor((dEta-dEtaMin)/dBinWidthEta)));
565 dQX += dWeight*wPhi*wPt*wEta*TMath::Cos(iOrder*dPhi);
566 dQY += dWeight*wPhi*wPt*wEta*TMath::Sin(iOrder*dPhi);
569 sumOfWeights += dWeight*wPhi*wPt*wEta;
575 cerr <<
"no particle!!!"<<endl;
611 Int_t iNbinsPhiSub0 = 0;
612 Int_t iNbinsPhiSub1 = 0;
622 TH1F* phiWeightsSub0 = NULL;
623 TH1F* phiWeightsSub1 = NULL;
624 TH1D* ptWeights = NULL;
625 TH1D* etaWeights = NULL;
631 phiWeightsSub0 =
dynamic_cast<TH1F *
>(weightsList->FindObject(
"phi_weights_sub0"));
633 iNbinsPhiSub0 = phiWeightsSub0->GetNbinsX();
635 phiWeightsSub1 =
dynamic_cast<TH1F *
>(weightsList->FindObject(
"phi_weights_sub1"));
637 iNbinsPhiSub1 = phiWeightsSub1->GetNbinsX();
642 ptWeights =
dynamic_cast<TH1D *
>(weightsList->FindObject(
"pt_weights"));
645 dBinWidthPt = ptWeights->GetBinWidth(1);
646 dPtMin = (ptWeights->GetXaxis())->GetXmin();
651 etaWeights =
dynamic_cast<TH1D *
>(weightsList->FindObject(
"eta_weights"));
654 dBinWidthEta = etaWeights->GetBinWidth(1);
655 dEtaMin = (etaWeights->GetXaxis())->GetXmin();
661 for (
Int_t s=0; s<2; s++)
669 cerr <<
"no particle!!!"<<endl;
674 dPhi = pTrack->
Phi();
676 dEta = pTrack->
Eta();
677 dWeight = pTrack->
Weight();
682 if(phiWeightsSub0 && iNbinsPhiSub0) {
683 Int_t phiBin = 1+(
Int_t)(TMath::Floor(dPhi*iNbinsPhiSub0/TMath::TwoPi()));
685 dPhi = phiWeightsSub0->GetBinCenter(phiBin);
686 dWphi = phiWeightsSub0->GetBinContent(phiBin);
691 if(phiWeightsSub1 && iNbinsPhiSub1) {
692 Int_t phiBin = 1+(
Int_t)(TMath::Floor(dPhi*iNbinsPhiSub1/TMath::TwoPi()));
694 dPhi = phiWeightsSub1->GetBinCenter(phiBin);
695 dWphi = phiWeightsSub1->GetBinContent(phiBin);
700 if(ptWeights && dBinWidthPt)
702 dWpt=ptWeights->GetBinContent(1+(
Int_t)(TMath::Floor((dPt-dPtMin)/dBinWidthPt)));
706 if(etaWeights && dBinWidthEta)
708 dWeta=etaWeights->GetBinContent(1+(
Int_t)(TMath::Floor((dEta-dEtaMin)/dBinWidthEta)));
712 dQX += dWeight*dWphi*dWpt*dWeta*TMath::Cos(iOrder*dPhi);
713 dQY += dWeight*dWphi*dWpt*dWeta*TMath::Sin(iOrder*dPhi);
716 sumOfWeights+=dWeight*dWphi*dWpt*dWeta;
721 Qarray[s].Set(dQX,dQY);
722 Qarray[s].
SetMult(sumOfWeights);
756 Qarray[0] =
fV0C[har-1];
757 Qarray[1] =
fV0A[har-1];
759 printf(
"WARNING: harmonic %d not available \n",har);
797 printf(
"Class.Print Name = %s, #tracks= %d, Number of RPs= %d, Number of POIs = %d, MC EventPlaneAngle= %f\n",
801 if (!optionstr.Contains(
"all"))
return;
808 printf(
"Empty track collection \n");
844 fTrackCollection(NULL),
845 fReferenceMultiplicity(0),
847 fUseGlauberMCSymmetryPlanes(kFALSE),
848 fUseExternalSymmetryPlanes(kFALSE),
857 fMCReactionPlaneAngle(0.),
858 fMCReactionPlaneAngleIsSet(kFALSE),
859 fAfterBurnerPrecision(0.001),
860 fUserModified(kFALSE),
861 fNumberOfTracksWrap(NULL),
862 fNumberOfRPsWrap(NULL),
863 fNumberOfPOIsWrap(NULL),
864 fMCReactionPlaneAngleWrap(NULL),
865 fShuffledIndexes(NULL),
866 fShuffleTracks(kFALSE),
876 fNumberOfPOItypes(2),
877 fNumberOfPOIs(new
Int_t[fNumberOfPOItypes])
882 Int_t numberOfInputTracks = inputTree->GetEntries() ;
885 TParticle* pParticle =
new TParticle();
886 inputTree->SetBranchAddress(
"Particles",&pParticle);
888 for (
Int_t i=0; i<numberOfInputTracks; i++)
890 inputTree->GetEntry(i);
892 if (!pParticle)
continue;
893 if (!pParticle->IsPrimary())
continue;
906 pTrack->
TagRP(kTRUE);
913 pTrack->
Tag(poiType);
915 printf(
"fNumberOfPOIs[%i] = %i",poiType,
fNumberOfPOIs[poiType]);
925 for(
Int_t i(0); i < 3; i++) {
928 for(
Int_t i=0; i < 4; i++) {
941 for (
Int_t i=0; i<n; i++)
943 for (
Int_t itrack=0; itrack<ntracks; itrack++)
946 if (!track)
continue;
975 if (!track)
continue;
990 if (!track)
continue;
1091 if (track) track->
AddFlow(v1,v2,v3,v4,v5,rp1,rp2,rp3,rp4,rp5,
fAfterBurnerPrecision);
1115 if (!track)
continue;
1129 if (!track)
continue;
1143 if (!track)
continue;
1165 if (!track)
continue;
1176 track->
Tag(poiType,pass);
1200 if (eta>etaMin && eta<etaMax && phi>phiMin && phi<phiMax)
1221 if (!track)
continue;
1222 if (track->
IsDead()) {
delete track;track=NULL;ncleaned++;}
1225 fNumberOfTracks-=ncleaned;
1234 return new TF1(
"StandardPtDepV2",
"((x<1.0)*(0.05/1.0)*x+(x>=1.0)*0.05)");
1241 return new TF2 (
"f",
"((x<1)*.1*x+(x>=1)*.1)*(1-0.2*TMath::Abs(y))");
1248 return new TF1(
"StandardPtSpectrum",
"x*TMath::Exp(-pow(0.13957*0.13957+x*x,0.5)/0.4)",0.1,10.);
void SetCharge(Int_t charge)
void Print(Option_t *option="") const
void SetForSubevent(Int_t i)
virtual void SetV02Qsub(Double_t QVCx, Double_t QVCy, Double_t MC, Double_t QVAx, Double_t QVAy, Double_t MA, Int_t har)
virtual AliFlowVector GetQ(Int_t n=2, TList *weightsList=NULL, Bool_t usePhiWeights=kFALSE, Bool_t usePtWeights=kFALSE, Bool_t useEtaWeights=kFALSE)
void SetEta(Double_t eta)
virtual ~AliFlowEventSimple()
virtual Int_t GetNDaughters() const
virtual void GetVertexPosition(Double_t *pos)
AliFlowTrackSimple * GetTrack(Int_t i)
void AddV1(Double_t v1, Double_t reactionPlaneAngle, Double_t precision, Int_t maxNumberOfIterations=100)
ClassImp(AliFlowEventSimple) AliFlowEventSimple
Bool_t InSubevent(Int_t i) const
Int_t GetNumberOfRPs() const
virtual void SetZDC2Qsub(Double_t *QVC, Double_t MC, Double_t *QVA, Double_t MA)
void AddV5(Double_t v5, Double_t reactionPlaneAngle, Double_t precision, Int_t maxNumberOfIterations=100)
void AddFlow(Double_t v1, Double_t v2, Double_t v3, Double_t v4, Double_t v5)
virtual AliFlowTrackSimple * Clone(const char *option="") const
void TagSubeventsByCharge()
TParameter< Int_t > * fNumberOfRPsWrap
number of tracks in TBrowser
void TagRP(const AliFlowTrackSimpleCuts *cuts)
static TF2 * SimplePtEtaDepV2()
void TagTracks(const AliFlowTrackSimpleCuts *cutsRP, const AliFlowTrackSimpleCuts *cutsPOI)
AliFlowEventSimple & operator=(const AliFlowEventSimple &anEvent)
static TF1 * SimplePtSpectrum()
Int_t fReferenceMultiplicity
void SetSubeventNumber(Int_t n)
void AddTrack(AliFlowTrackSimple *track)
void TagPOI(const AliFlowTrackSimpleCuts *cuts, Int_t poiType=1)
Bool_t PassesCuts(const AliFlowTrackSimple *track) const
void SetUserModified(Bool_t s=kTRUE)
Double_t fMCReactionPlaneAngle
void TagRP(Bool_t b=kTRUE)
Bool_t InRPSelection() const
virtual void SetVertexPosition(Double_t *pos)
void IncrementNumberOfPOIs(Int_t poiType=1)
Int_t * fShuffledIndexes
the angle of the reaction plane from the MC truth in TBrowser
TParameter< Double_t > * fMCReactionPlaneAngleWrap
number of tracks that have passed the POI selection in TBrowser
void SetForRPSelection(Bool_t b=kTRUE)
void SetHarmonic(Int_t h)
void CloneTracks(Int_t n)
TParameter< Int_t > * fNumberOfPOIsWrap
number of tracks that have passed the RP selection in TBrowser
void SetNumberOfPOIs(Int_t nubmerOfPOIs, Int_t poiType=1)
Bool_t fUseGlauberMCSymmetryPlanes
void AddV4(Double_t v4, Double_t reactionPlaneAngle, Double_t precision, Int_t maxNumberOfIterations=100)
void ResolutionPt(Double_t res)
void SetMult(Double_t mult)
Int_t GetNumberOfPOIs(Int_t i=1) const
void Tag(Int_t n, Bool_t b=kTRUE)
void ResolutionPt(Double_t resolution)
virtual void Generate(Int_t nParticles, TF1 *ptDist=NULL, Double_t phiMin=0.0, Double_t phiMax=TMath::TwoPi(), Double_t etaMin=-1.0, Double_t etaMax=1.0)
Bool_t fShuffleTracks
placeholder for randomized indexes
TObjArray * fTrackCollection
virtual void Get2Qsub(AliFlowVector *Qarray, Int_t n=2, TList *weightsList=NULL, Bool_t usePhiWeights=kFALSE, Bool_t usePtWeights=kFALSE, Bool_t useEtaWeights=kFALSE)
void SetPhi(Double_t phi)
void DefineDeadZone(Double_t etaMin, Double_t etaMax, Double_t phiMin, Double_t phiMax)
AliFlowTrackSimple * MakeNewTrack()
void AddV2(Double_t v2, Double_t reactionPlaneAngle, Double_t precision, Int_t maxNumberOfIterations=100)
virtual void GetZDC2Qsub(AliFlowVector *Qarray)
void AddFlow(Double_t v1, Double_t v2, Double_t v3, Double_t v4, Double_t reactionPlaneAngle, Double_t precision, Int_t maxNumberOfIterations=100)
void AddV3(Double_t v3, Double_t reactionPlaneAngle, Double_t precision, Int_t maxNumberOfIterations=100)
TParameter< Int_t > * fNumberOfTracksWrap
Double_t fAfterBurnerPrecision
Bool_t fUseExternalSymmetryPlanes
virtual void GetV02Qsub(AliFlowVector *Qarray, Int_t har)
TObjArray * fMothersCollection
Bool_t fMCReactionPlaneAngleIsSet
void TagSubeventsInEta(Double_t etaMinA, Double_t etaMaxA, Double_t etaMinB, Double_t etaMaxB)
void SetUseExternalSymmetryPlanes(TF1 *gPsi1Psi3=0x0, TF1 *gPsi2Psi4=0x0, TF1 *gPsi3Psi5=0x0)
static TF1 * SimplePtDepV2()
Bool_t InPOISelection(Int_t poiType=1) const
Double_t fCentrality
cache the particles with daughters
Int_t CleanUpDeadTracks()
Bool_t MC(TH1F *hs, TH1F *hb, Double_t &sgn, Double_t &errsgn, Double_t &bkg, Double_t &errbkg, Double_t &sgnf, Double_t &errsgnf, Double_t &sigmaused, Int_t &status)