17 #include <TParticle.h> 18 #include <TDatabasePDG.h> 21 #include "TParticle.h" 25 #include "AliGenEventHeader.h" 26 #include "AliMCEvent.h" 27 #include "AliVCluster.h" 28 #include "AliAODTrack.h" 29 #include "AliAODEvent.h" 43 fNeutralParticlesArray(0x0), fChargedParticlesArray(0x0),
44 fStatusArray(0x0), fKeepAllStatus(0),
45 fCheckOverlap(0), fEMCALOverlapAngle(0),fPHOSOverlapAngle(0),
46 fIndex2ndPhoton(0), fOnlyGeneratorParticles(kTRUE),
47 fMomentum(), fPi0Momentum(),
48 fGamDecayMom1(), fGamDecayMom2()
125 AliVParticle *
meson =
GetMC()->GetTrack(imom);
126 Int_t mepdg = meson->PdgCode();
127 Int_t idaug1 = meson->GetFirstDaughter();
128 if((mepdg == 111 || mepdg == 221 ) && meson->GetNDaughters() == 2)
130 AliVParticle * d1 =
GetMC()->GetTrack(idaug1 );
131 AliVParticle * d2 =
GetMC()->GetTrack(idaug1+1);
132 if(d1->PdgCode() == 22 && d2->PdgCode() == 22 )
145 if(iPrimary == idaug1) iPrimary++;
150 if(iPrimary == idaug1)
172 ttype = AliVCluster::kPHOSNeutral;
179 ttype= AliVCluster::kEMCALClusterv1;
183 Int_t index = iParticle ;
185 CheckOverlap(overAngleLimit,motherIndex,index, iParticle, pdg);
187 Int_t labels[] = {index};
191 AliAODCaloCluster *calo =
new AliAODCaloCluster(index,1,labels,
fMomentum.E(), x, NULL, ttype, 0);
195 AliDebug(3,Form(
"PHOS %d?, EMCAL %d? : Selected cluster pdg %d, E %3.2f, pt %3.2f, phi %3.2f, eta %3.2f",
223 AliInfo(Form(
"Selected event header class <%s>, name <%s>; cocktail %p",
226 GetMC()->GetCocktailList()));
238 AliDebug(1,
"Pass Event header selection");
247 Int_t pyFirstGenPart = 0;
248 Int_t pythiaVersion = 0;
252 pyGenName,pyProcessName,pyProcess,pyFirstGenPart,pythiaVersion);
255 AliInfo(Form(
"Pythia v%d name <%s>, process %d <%s>, first generated particle %d",
256 pythiaVersion, pyGenName.Data(), pyProcess, pyProcessName.Data(), pyFirstGenPart));
268 AliDebug(1,
"Pass Pt Hard - Jet rejection");
275 AliDebug(1,
"Pass Pt Hard - Cluster rejection");
281 Int_t iParticle = 0 ;
282 Int_t nparticles =
GetMC()->GetNumberOfTracks() ;
286 for (iParticle = 0 ; iParticle < nparticles ; iParticle++)
288 AliVParticle * particle =
GetMC()->GetTrack(iParticle);
300 Int_t momIndex = particle->GetMother();
333 if(TMath::Abs(pdg) == 11 && (
GetMC()->GetTrack(particle->GetMother()))->PdgCode()==22)
continue ;
335 AliDebug(2,Form(
"CTS : Selected tracks E %3.2f, pt %3.2f, phi %3.2f, eta %3.2f",
336 en,pt,phi*TMath::RadToDeg(),eta));
338 x[0] = particle->Xv(); x[1] = particle->Yv(); x[2] = particle->Zv();
339 p[0] = particle->Px(); p[1] = particle->Py(); p[2] = particle->Pz();
341 AliAODTrack *aodTrack =
new AliAODTrack(0, iParticle, p, kTRUE, x, kFALSE,NULL, 0, 0,
367 AliDebug(2,Form(
"Calo : Selected tracks E %3.2f, pt %3.2f, phi %3.2f, eta %3.2f",
368 en,pt,phi*TMath::RadToDeg(),eta));
395 AliDebug(2,Form(
"Calo : Selected tracks E %3.2f, pt %3.2f, phi %3.2f, eta %3.2f",
396 en,pt,phi*TMath::RadToDeg(),eta));
450 printf(
"**** Print **** %s %s ****\n", GetName(), GetTitle() ) ;
461 printf(
"Skip neutral particles in calo : ");
466 printf(
"Keep charged particles in calo : ");
480 Double_t mPi0 = TDatabasePDG::Instance()->GetParticle(111)->Mass();
488 Double_t sinThe = TMath::Sqrt(1-cosThe*cosThe);
543 AliAODTrack *track)
const 545 Float_t pid[10] = {0., 0., 0., 0., 0., 0., 0., 0., 0., 0.};
551 pid[AliAODTrack::kUnknown] = 1.;
556 track->SetCharge(-1);
557 pid[AliAODTrack::kElectron] = 1.;
562 track->SetCharge(+1);
563 pid[AliAODTrack::kElectron] = 1.;
568 track->SetCharge(-1);
569 pid[AliAODTrack::kMuon] = 1.;
574 track->SetCharge(+1);
575 pid[AliAODTrack::kMuon] = 1.;
581 pid[AliAODTrack::kUnknown] = 1.;
586 track->SetCharge(+1);
587 pid[AliAODTrack::kPion] = 1.;
592 track->SetCharge(-1);
593 pid[AliAODTrack::kPion] = 1.;
599 pid[AliAODTrack::kUnknown] = 1.;
604 track->SetCharge(+1);
605 pid[AliAODTrack::kKaon] = 1.;
610 track->SetCharge(-1);
611 pid[AliAODTrack::kKaon] = 1.;
617 pid[AliAODTrack::kUnknown] = 1.;
622 track->SetCharge(+1);
628 track->SetCharge(-1);
635 pid[AliAODTrack::kUnknown] = 1.;
641 pid[AliAODTrack::kUnknown] = 1.;
647 pid[AliAODTrack::kUnknown] = 1.;
653 pid[AliAODTrack::kUnknown] = 1.;
659 pid[AliAODTrack::kUnknown] = 1.;
664 track->SetCharge(+1);
665 pid[AliAODTrack::kUnknown] = 1.;
670 track->SetCharge(-1);
671 pid[AliAODTrack::kUnknown] = 1.;
676 track->SetCharge(-1);
677 pid[AliAODTrack::kUnknown] = 1.;
683 pid[AliAODTrack::kUnknown] = 1.;
688 track->SetCharge(-1);
689 pid[AliAODTrack::kUnknown] = 1.;
694 track->SetCharge(-1);
695 pid[AliAODTrack::kUnknown] = 1.;
701 pid[AliAODTrack::kUnknown] = 1.;
707 pid[AliAODTrack::kUnknown] = 1.;
712 track->SetCharge(-1);
713 pid[AliAODTrack::kUnknown] = 1.;
719 pid[AliAODTrack::kUnknown] = 1.;
724 track->SetCharge(+1);
725 pid[AliAODTrack::kUnknown] = 1.;
731 pid[AliAODTrack::kUnknown] = 1.;
736 track->SetCharge(+1);
740 track->SetCharge(+1);
741 pid[AliAODTrack::kUnknown] = 1.;
746 track->SetCharge(+1);
747 pid[AliAODTrack::kUnknown] = 1.;
752 track->SetCharge(-1);
753 pid[AliAODTrack::kUnknown] = 1.;
759 pid[AliAODTrack::kUnknown] = 1.;
765 pid[AliAODTrack::kUnknown] = 1.;
770 track->SetCharge(-99);
771 pid[AliAODTrack::kUnknown] = 1.;
784 AliVCluster *calo)
const 786 Float_t pid[13] = {0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.};
791 pid[AliVCluster::kPhoton] = 1.;
796 pid[AliVCluster::kElectron] = 1.;
801 pid[AliVCluster::kElectron] = 1.;
806 pid[AliVCluster::kCharged] = 1.;
811 pid[AliVCluster::kCharged] = 1.;
816 pid[AliVCluster::kPi0] = 1.;
821 pid[AliVCluster::kCharged] = 1.;
826 pid[AliVCluster::kCharged] = 1.;
831 pid[AliVCluster::kKaon0] = 1.;
832 pid[AliVCluster::kNeutral] = 1;
837 pid[AliVCluster::kCharged] = 1.;
842 pid[AliVCluster::kCharged] = 1.;
848 pid[AliVCluster::kNeutral] = 1.;
853 pid[AliVCluster::kCharged] = 1.;
858 pid[AliVCluster::kCharged] = 1.;
863 pid[AliVCluster::kKaon0] = 1.;
864 pid[AliVCluster::kNeutral] = 1.;
869 pid[AliVCluster::kKaon0] = 1.;
870 pid[AliVCluster::kNeutral] = 1.;
875 pid[AliVCluster::kKaon0] = 1.;
876 pid[AliVCluster::kNeutral] = 1.;
881 pid[AliVCluster::kNeutral] = 1.;
886 pid[AliVCluster::kUnknown] = 1.;
891 pid[AliVCluster::kUnknown] = 1.;
896 pid[AliVCluster::kUnknown] = 1.;
901 pid[AliVCluster::kUnknown] = 1.;
906 pid[AliVCluster::kUnknown] = 1.;
911 pid[AliVCluster::kUnknown] = 1.;
916 pid[AliVCluster::kUnknown] = 1.;
922 pid[AliVCluster::kNeutral] = 1.;
927 pid[AliVCluster::kUnknown] = 1.;
932 pid[AliVCluster::kUnknown] = 1.;
937 pid[AliVCluster::kUnknown] = 1.;
942 pid[AliVCluster::kUnknown] = 1.;
947 pid[AliVCluster::kUnknown] = 1.;
952 pid[AliVCluster::kUnknown] = 1.;
957 pid[AliVCluster::kUnknown] = 1.;
962 pid[AliVCluster::kUnknown] = 1.;
967 pid[AliVCluster::kUnknown] = 1.;
972 pid[AliVCluster::kUnknown] = 1.;
977 pid[AliVCluster::kUnknown] = 1.;
982 pid[AliVCluster::kUnknown] = 1.;
virtual AliMCEvent * GetMC() const
Bool_t fComparePtHardAndClusterPt
In MonteCarlo, jet events, reject events with too large cluster energy.
TLorentzVector fGamDecayMom2
! Gamma decay 2 momentum
virtual ~AliCaloTrackMCReader()
Destructor.
TObjArray * fPHOSClusters
Temporal array with PHOS CaloClusters.
void InitParameters()
Initialize the parameters of the analysis.
void SetCaloClusterPID(Int_t pdgCode, AliVCluster *calo) const
Give a PID weight for CaloClusters equal to 1 depending on the particle type.
virtual void SetMC(AliMCEvent *const mc)
TLorentzVector fGamDecayMom1
! Gamma decay 1 momentum
Bool_t fOnlyGeneratorParticles
Use particles only generated by PYTHIA/HERWIG/... and not by the MC tranport G3/G4/FLUKA ...
void CheckOverlap(Float_t anglethres, Int_t imom, Int_t &iPrimary, Int_t &index, Int_t &pdg)
Check overlap of decay photons.
AliGenEventHeader * GetGenEventHeader() const
static AliGenPythiaEventHeader * GetPythiaEventHeader(AliMCEvent *mcevent, TString selecHeaderName, TString &genName, TString &processName, Int_t &process, Int_t &firstParticle, Int_t &pythiaVersion)
void SetInputOutputMCEvent(AliVEvent *esd, AliAODEvent *aod, AliMCEvent *mc)
Connect the input data pointer.
Float_t fEMCALPtMin
pT Threshold on emcal clusters.
Bool_t SkipNeutralParticles(Int_t pdg) const
Bool_t fDecayPi0
If not decayed, decay pi0 by hand.
Bool_t fFillCTS
Use data from CTS.
Int_t fTrackMult[10]
Track multiplicity, count for different pT cuts.
AliCaloTrackMCReader()
Default constructor. Initialize parameters.
Float_t fPHOSPtMin
pT Threshold on phos clusters.
TLorentzVector fMomentum
! Momentum
Int_t fEventNumber
Event number.
Float_t fTrackMultPtCut[10]
Track multiplicity and sum pt cuts list.
AliGenPythiaEventHeader * fGenPythiaEventHeader
! Event header casted to pythia
TLorentzVector fPi0Momentum
! Pi0 momentum
Float_t fCTSPtMax
pT Threshold on charged particles.
Float_t fPHOSOverlapAngle
Aperture angle of photons from decay that is not resolved by PHOS, in radians.
Int_t fIndex2ndPhoton
Check overlap of first decay photon already done, internal use.
Bool_t FillInputEvent(Int_t iEntry, const char *currentFileName)
Fill the event counter and input lists that are needed, called by AliAnaCaloTrackCorrMaker.
TObjArray * fEMCALClusters
Temporal array with EMCAL CaloClusters.
AliGenEventHeader * fGenEventHeader
! Event header
virtual void SetOutputEvent(AliAODEvent *aod)
Class for filtering generated MC particles and prepare them as input for the analysis.
Bool_t IsInFiducialCut(Float_t eta, Float_t phi, Int_t det) const
virtual Bool_t ComparePtHardAndClusterPt(Int_t process, TString processName)
Float_t fTrackMultEtaCut
Track multiplicity eta cut.
Base class for event, clusters and tracks filtering and preparation for the analysis.
Bool_t KeepParticleWithStatus(Int_t status) const
void SetTrackChargeAndPID(Int_t pdgCode, AliAODTrack *track) const
Give a PID weight for tracks equal to 1 depending on the particle type.
TArrayI * fNeutralParticlesArray
Do not keep neutral particles of this list in calorimeter.
void Print(const Option_t *opt) const
Print some relevant parameters set for the analysis.
Float_t fEMCALOverlapAngle
Aperture angle of photons from decay that is not resolved by EMCAL, in radians.
virtual Bool_t ComparePtHardAndJetPt(Int_t process, TString processName)
virtual void Print(const Option_t *opt) const
Print some relevant parameters set for the analysis.
Bool_t fCheckFidCut
Do analysis for clusters in defined region.
Bool_t fComparePtHardAndJetPt
In MonteCarlo, jet events, reject fake events with wrong jet energy.
AliFiducialCut * fFiducialCut
Acceptance cuts.
TArrayI * fChargedParticlesArray
Keep charged particles of this list in calorimeter.
Bool_t fCheckOverlap
Check of overlapped photons from pi0 enter the calorimeter.
Bool_t fFillEMCAL
Use data from EMCAL.
Bool_t fFillPHOS
Use data from PHOS.
Float_t fCTSPtMin
pT Threshold on charged particles.
void GetVertex(Double_t v[3]) const
Bool_t fKeepAllStatus
Do or do not select particles depending on their status code.
void FillCalorimeters(Int_t &iParticle, Int_t motherIndex, Int_t pdg)
Fill CaloClusters or AliVParticles lists of PHOS or EMCAL.
TArrayI * fStatusArray
Keep particles with status of the list.
virtual void FillVertexArray()
TObjArray * fCTSTracks
Temporal array with tracks.
TH1I * fhNEventsAfterCut
! Each bin represents number of events resulting after a given selection cut: vertex, trigger, ...
TString fMCGenerEventHeaderToAccept
Accept events that contain at least this event header name.
Float_t fTrackSumPt[10]
Track sum pT, count for different pT cuts.
Bool_t KeepChargedParticles(Int_t pdg) const
Int_t fTrackMultNPtCut
Track multiplicty, number of pt cuts.
Int_t fDataType
Select MC: Kinematics, Data: ESD/AOD, MCData: Both.