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),
93 for(
Int_t i(0); i < 3; i++) {
96 for(
Int_t i=0; i < 4; i++) {
100 cout <<
"AliFlowEventSimple: Default constructor to be used only by root for io" << endl;
112 fReferenceMultiplicity(0),
114 fUseGlauberMCSymmetryPlanes(kFALSE),
115 fUseExternalSymmetryPlanes(kFALSE),
124 fMCReactionPlaneAngle(0.),
125 fMCReactionPlaneAngleIsSet(kFALSE),
126 fAfterBurnerPrecision(0.001),
127 fUserModified(kFALSE),
128 fNumberOfTracksWrap(NULL),
129 fNumberOfRPsWrap(NULL),
130 fNumberOfPOIsWrap(NULL),
131 fMCReactionPlaneAngleWrap(NULL),
132 fShuffledIndexes(NULL),
133 fShuffleTracks(kFALSE),
145 fNumberOfPOItypes(2),
146 fNumberOfPOIs(new
Int_t[fNumberOfPOItypes])
154 Generate(n,ptDist,phiMin,phiMax,etaMin,etaMax);
158 for(
Int_t i(0); i < 3; i++) {
161 for(
Int_t i=0; i < 4; i++) {
170 fTrackCollection((
TObjArray*)(anEvent.fTrackCollection)->Clone()),
171 fReferenceMultiplicity(anEvent.fReferenceMultiplicity),
172 fNumberOfTracks(anEvent.fNumberOfTracks),
173 fUseGlauberMCSymmetryPlanes(anEvent.fUseGlauberMCSymmetryPlanes),
174 fUseExternalSymmetryPlanes(anEvent.fUseExternalSymmetryPlanes),
175 fPsi1(anEvent.fPsi1),
176 fPsi2(anEvent.fPsi2),
177 fPsi3(anEvent.fPsi3),
178 fPsi4(anEvent.fPsi4),
179 fPsi5(anEvent.fPsi5),
180 fPsi1Psi3(anEvent.fPsi1Psi3),
181 fPsi2Psi4(anEvent.fPsi2Psi4),
182 fPsi3Psi5(anEvent.fPsi3Psi5),
183 fMCReactionPlaneAngle(anEvent.fMCReactionPlaneAngle),
184 fMCReactionPlaneAngleIsSet(anEvent.fMCReactionPlaneAngleIsSet),
185 fAfterBurnerPrecision(anEvent.fAfterBurnerPrecision),
186 fUserModified(anEvent.fUserModified),
187 fNumberOfTracksWrap(anEvent.fNumberOfTracksWrap),
188 fNumberOfRPsWrap(anEvent.fNumberOfRPsWrap),
189 fNumberOfPOIsWrap(anEvent.fNumberOfPOIsWrap),
190 fMCReactionPlaneAngleWrap(anEvent.fMCReactionPlaneAngleWrap),
191 fShuffledIndexes(NULL),
192 fShuffleTracks(anEvent.fShuffleTracks),
194 fCentrality(anEvent.fCentrality),
195 fCentralityCL1(anEvent.fCentralityCL1),
196 fNITSCL1(anEvent.fNITSCL1),
197 fCentralityTRK(anEvent.fCentralityTRK),
199 fZNCQ(anEvent.fZNCQ),
200 fZNAQ(anEvent.fZNAQ),
201 fZNCQ0(anEvent.fZNCQ0),
202 fZNAQ0(anEvent.fZNAQ0),
203 fZNCM(anEvent.fZNCM),
204 fZNAM(anEvent.fZNAM),
205 fAbsOrbit(anEvent.fAbsOrbit),
206 fNumberOfPOItypes(anEvent.fNumberOfPOItypes),
207 fNumberOfPOIs(new
Int_t[fNumberOfPOItypes])
211 for(
Int_t i(0); i < 3; i++) {
214 for(
Int_t i=0; i < 4; i++) {
230 for (
Int_t j=0; j<n; j++) { tmp[j]=0; }
252 if (&anEvent==
this)
return *
this;
293 for(
Int_t i(0); i < 3; i++) {
296 for(
Int_t i=0; i < 4; i++) {
329 fPsi1Psi3 =
new TF1(
"fPsi1Psi3",
"[0]*x+[1]",0.,2.*TMath::Pi());
337 fPsi2Psi4 =
new TF1(
"fPsi2Psi4",
"[0]*x+[1]",0.,2.*TMath::Pi());
345 fPsi3Psi5 =
new TF1(
"fPsi3Psi5",
"[0]*x+[1]",0.,2.*TMath::Pi());
363 static TF1 ptdistribution(
"ptSpectra",
"x*TMath::Exp(-pow(0.13957*0.13957+x*x,0.5)/0.4)",0.1,10.);
364 ptDist=&ptdistribution;
367 for (
Int_t i=0; i<nParticles; i++)
372 track->
SetPt( ptDist->GetRandom() );
378 fPsi1Psi3->SetParameter(1,betaParameter);
380 betaParameter =
gRandom->Gaus(0.,0.9);
381 fPsi2Psi4->SetParameter(1,betaParameter);
383 betaParameter =
gRandom->Gaus(0.,1.5);
384 fPsi3Psi5->SetParameter(1,betaParameter);
390 else if(
fPsi3 > 2.*TMath::Pi())
fPsi3 -= 2.*TMath::Pi();
393 else if(
fPsi4 > 2.*TMath::Pi())
fPsi4 -= 2.*TMath::Pi();
396 else if(
fPsi5 > 2.*TMath::Pi())
fPsi5 -= 2.*TMath::Pi();
436 Printf(
"Tracks shuffled! tracks: %i",fNumberOfTracks);
443 if (fNumberOfTracks < fTrackCollection->GetEntriesFast())
512 TH1F *phiWeights = NULL;
513 TH1D *ptWeights = NULL;
514 TH1D *etaWeights = NULL;
520 phiWeights =
dynamic_cast<TH1F *
>(weightsList->FindObject(
"phi_weights"));
521 if(phiWeights) nBinsPhi = phiWeights->GetNbinsX();
525 ptWeights =
dynamic_cast<TH1D *
>(weightsList->FindObject(
"pt_weights"));
528 dBinWidthPt = ptWeights->GetBinWidth(1);
529 dPtMin = (ptWeights->GetXaxis())->GetXmin();
534 etaWeights =
dynamic_cast<TH1D *
>(weightsList->FindObject(
"eta_weights"));
537 dBinWidthEta = etaWeights->GetBinWidth(1);
538 dEtaMin = (etaWeights->GetXaxis())->GetXmin();
551 dPhi = pTrack->
Phi();
553 dEta = pTrack->
Eta();
554 dWeight = pTrack->
Weight();
557 if(phiWeights && nBinsPhi)
559 wPhi = phiWeights->GetBinContent(1+(
Int_t)(TMath::Floor(dPhi*nBinsPhi/TMath::TwoPi())));
562 if(ptWeights && dBinWidthPt)
564 wPt=ptWeights->GetBinContent(1+(
Int_t)(TMath::Floor((dPt-dPtMin)/dBinWidthPt)));
567 if(etaWeights && dBinWidthEta)
569 wEta=etaWeights->GetBinContent(1+(
Int_t)(TMath::Floor((dEta-dEtaMin)/dBinWidthEta)));
573 dQX += dWeight*wPhi*wPt*wEta*TMath::Cos(iOrder*dPhi);
574 dQY += dWeight*wPhi*wPt*wEta*TMath::Sin(iOrder*dPhi);
577 sumOfWeights += dWeight*wPhi*wPt*wEta;
583 cerr <<
"no particle!!!"<<endl;
619 Int_t iNbinsPhiSub0 = 0;
620 Int_t iNbinsPhiSub1 = 0;
630 TH1F* phiWeightsSub0 = NULL;
631 TH1F* phiWeightsSub1 = NULL;
632 TH1D* ptWeights = NULL;
633 TH1D* etaWeights = NULL;
639 phiWeightsSub0 =
dynamic_cast<TH1F *
>(weightsList->FindObject(
"phi_weights_sub0"));
641 iNbinsPhiSub0 = phiWeightsSub0->GetNbinsX();
643 phiWeightsSub1 =
dynamic_cast<TH1F *
>(weightsList->FindObject(
"phi_weights_sub1"));
645 iNbinsPhiSub1 = phiWeightsSub1->GetNbinsX();
650 ptWeights =
dynamic_cast<TH1D *
>(weightsList->FindObject(
"pt_weights"));
653 dBinWidthPt = ptWeights->GetBinWidth(1);
654 dPtMin = (ptWeights->GetXaxis())->GetXmin();
659 etaWeights =
dynamic_cast<TH1D *
>(weightsList->FindObject(
"eta_weights"));
662 dBinWidthEta = etaWeights->GetBinWidth(1);
663 dEtaMin = (etaWeights->GetXaxis())->GetXmin();
669 for (
Int_t s=0; s<2; s++)
677 cerr <<
"no particle!!!"<<endl;
682 dPhi = pTrack->
Phi();
684 dEta = pTrack->
Eta();
685 dWeight = pTrack->
Weight();
690 if(phiWeightsSub0 && iNbinsPhiSub0) {
691 Int_t phiBin = 1+(
Int_t)(TMath::Floor(dPhi*iNbinsPhiSub0/TMath::TwoPi()));
693 dPhi = phiWeightsSub0->GetBinCenter(phiBin);
694 dWphi = phiWeightsSub0->GetBinContent(phiBin);
699 if(phiWeightsSub1 && iNbinsPhiSub1) {
700 Int_t phiBin = 1+(
Int_t)(TMath::Floor(dPhi*iNbinsPhiSub1/TMath::TwoPi()));
702 dPhi = phiWeightsSub1->GetBinCenter(phiBin);
703 dWphi = phiWeightsSub1->GetBinContent(phiBin);
708 if(ptWeights && dBinWidthPt)
710 dWpt=ptWeights->GetBinContent(1+(
Int_t)(TMath::Floor((dPt-dPtMin)/dBinWidthPt)));
714 if(etaWeights && dBinWidthEta)
716 dWeta=etaWeights->GetBinContent(1+(
Int_t)(TMath::Floor((dEta-dEtaMin)/dBinWidthEta)));
720 dQX += dWeight*dWphi*dWpt*dWeta*TMath::Cos(iOrder*dPhi);
721 dQY += dWeight*dWphi*dWpt*dWeta*TMath::Sin(iOrder*dPhi);
724 sumOfWeights+=dWeight*dWphi*dWpt*dWeta;
729 Qarray[s].Set(dQX,dQY);
730 Qarray[s].
SetMult(sumOfWeights);
764 Qarray[0] =
fV0C[har-1];
765 Qarray[1] =
fV0A[har-1];
767 printf(
"WARNING: harmonic %d not available \n",har);
805 printf(
"Class.Print Name = %s, #tracks= %d, Number of RPs= %d, Number of POIs = %d, MC EventPlaneAngle= %f\n",
809 if (!optionstr.Contains(
"all"))
return;
816 printf(
"Empty track collection \n");
852 fTrackCollection(NULL),
853 fReferenceMultiplicity(0),
855 fUseGlauberMCSymmetryPlanes(kFALSE),
856 fUseExternalSymmetryPlanes(kFALSE),
865 fMCReactionPlaneAngle(0.),
866 fMCReactionPlaneAngleIsSet(kFALSE),
867 fAfterBurnerPrecision(0.001),
868 fUserModified(kFALSE),
869 fNumberOfTracksWrap(NULL),
870 fNumberOfRPsWrap(NULL),
871 fNumberOfPOIsWrap(NULL),
872 fMCReactionPlaneAngleWrap(NULL),
873 fShuffledIndexes(NULL),
874 fShuffleTracks(kFALSE),
886 fNumberOfPOItypes(2),
887 fNumberOfPOIs(new
Int_t[fNumberOfPOItypes])
892 Int_t numberOfInputTracks = inputTree->GetEntries() ;
895 TParticle* pParticle =
new TParticle();
896 inputTree->SetBranchAddress(
"Particles",&pParticle);
898 for (
Int_t i=0; i<numberOfInputTracks; i++)
900 inputTree->GetEntry(i);
902 if (!pParticle)
continue;
903 if (!pParticle->IsPrimary())
continue;
916 pTrack->
TagRP(kTRUE);
923 pTrack->
Tag(poiType);
925 printf(
"fNumberOfPOIs[%i] = %i",poiType,
fNumberOfPOIs[poiType]);
935 for(
Int_t i(0); i < 3; i++) {
938 for(
Int_t i=0; i < 4; i++) {
951 for (
Int_t i=0; i<n; i++)
953 for (
Int_t itrack=0; itrack<ntracks; itrack++)
956 if (!track)
continue;
985 if (!track)
continue;
1000 if (!track)
continue;
1101 if (track) track->
AddFlow(v1,v2,v3,v4,v5,rp1,rp2,rp3,rp4,rp5,
fAfterBurnerPrecision);
1125 if (!track)
continue;
1139 if (!track)
continue;
1153 if (!track)
continue;
1175 if (!track)
continue;
1186 track->
Tag(poiType,pass);
1210 if (eta>etaMin && eta<etaMax && phi>phiMin && phi<phiMax)
1231 if (!track)
continue;
1232 if (track->
IsDead()) {
delete track;track=NULL;ncleaned++;}
1235 fNumberOfTracks-=ncleaned;
1244 return new TF1(
"StandardPtDepV2",
"((x<1.0)*(0.05/1.0)*x+(x>=1.0)*0.05)");
1251 return new TF2 (
"f",
"((x<1)*.1*x+(x>=1)*.1)*(1-0.2*TMath::Abs(y))");
1258 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)