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",
227 Int_t iParticle = 0 ;
228 Int_t nparticles =
GetMC()->GetNumberOfTracks() ;
232 for (iParticle = 0 ; iParticle < nparticles ; iParticle++)
234 AliVParticle * particle =
GetMC()->GetTrack(iParticle);
246 Int_t momIndex = particle->GetMother();
279 if(TMath::Abs(pdg) == 11 && (
GetMC()->GetTrack(particle->GetMother()))->PdgCode()==22)
continue ;
281 AliDebug(2,Form(
"CTS : Selected tracks E %3.2f, pt %3.2f, phi %3.2f, eta %3.2f",
282 en,pt,phi*TMath::RadToDeg(),eta));
284 x[0] = particle->Xv(); x[1] = particle->Yv(); x[2] = particle->Zv();
285 p[0] = particle->Px(); p[1] = particle->Py(); p[2] = particle->Pz();
287 AliAODTrack *aodTrack =
new AliAODTrack(0, iParticle, p, kTRUE, x, kFALSE,NULL, 0, 0,
313 AliDebug(2,Form(
"Calo : Selected tracks E %3.2f, pt %3.2f, phi %3.2f, eta %3.2f",
314 en,pt,phi*TMath::RadToDeg(),eta));
341 AliDebug(2,Form(
"Calo : Selected tracks E %3.2f, pt %3.2f, phi %3.2f, eta %3.2f",
342 en,pt,phi*TMath::RadToDeg(),eta));
396 printf(
"**** Print **** %s %s ****\n", GetName(), GetTitle() ) ;
407 printf(
"Skip neutral particles in calo : ");
412 printf(
"Keep charged particles in calo : ");
426 Double_t mPi0 = TDatabasePDG::Instance()->GetParticle(111)->Mass();
434 Double_t sinThe = TMath::Sqrt(1-cosThe*cosThe);
489 AliAODTrack *track)
const
491 Float_t pid[10] = {0., 0., 0., 0., 0., 0., 0., 0., 0., 0.};
497 pid[AliAODTrack::kUnknown] = 1.;
502 track->SetCharge(-1);
503 pid[AliAODTrack::kElectron] = 1.;
508 track->SetCharge(+1);
509 pid[AliAODTrack::kElectron] = 1.;
514 track->SetCharge(-1);
515 pid[AliAODTrack::kMuon] = 1.;
520 track->SetCharge(+1);
521 pid[AliAODTrack::kMuon] = 1.;
527 pid[AliAODTrack::kUnknown] = 1.;
532 track->SetCharge(+1);
533 pid[AliAODTrack::kPion] = 1.;
538 track->SetCharge(-1);
539 pid[AliAODTrack::kPion] = 1.;
545 pid[AliAODTrack::kUnknown] = 1.;
550 track->SetCharge(+1);
551 pid[AliAODTrack::kKaon] = 1.;
556 track->SetCharge(-1);
557 pid[AliAODTrack::kKaon] = 1.;
563 pid[AliAODTrack::kUnknown] = 1.;
568 track->SetCharge(+1);
574 track->SetCharge(-1);
581 pid[AliAODTrack::kUnknown] = 1.;
587 pid[AliAODTrack::kUnknown] = 1.;
593 pid[AliAODTrack::kUnknown] = 1.;
599 pid[AliAODTrack::kUnknown] = 1.;
605 pid[AliAODTrack::kUnknown] = 1.;
610 track->SetCharge(+1);
611 pid[AliAODTrack::kUnknown] = 1.;
616 track->SetCharge(-1);
617 pid[AliAODTrack::kUnknown] = 1.;
622 track->SetCharge(-1);
623 pid[AliAODTrack::kUnknown] = 1.;
629 pid[AliAODTrack::kUnknown] = 1.;
634 track->SetCharge(-1);
635 pid[AliAODTrack::kUnknown] = 1.;
640 track->SetCharge(-1);
641 pid[AliAODTrack::kUnknown] = 1.;
647 pid[AliAODTrack::kUnknown] = 1.;
653 pid[AliAODTrack::kUnknown] = 1.;
658 track->SetCharge(-1);
659 pid[AliAODTrack::kUnknown] = 1.;
665 pid[AliAODTrack::kUnknown] = 1.;
670 track->SetCharge(+1);
671 pid[AliAODTrack::kUnknown] = 1.;
677 pid[AliAODTrack::kUnknown] = 1.;
682 track->SetCharge(+1);
686 track->SetCharge(+1);
687 pid[AliAODTrack::kUnknown] = 1.;
692 track->SetCharge(+1);
693 pid[AliAODTrack::kUnknown] = 1.;
698 track->SetCharge(-1);
699 pid[AliAODTrack::kUnknown] = 1.;
705 pid[AliAODTrack::kUnknown] = 1.;
711 pid[AliAODTrack::kUnknown] = 1.;
716 track->SetCharge(-99);
717 pid[AliAODTrack::kUnknown] = 1.;
730 AliVCluster *calo)
const
732 Float_t pid[13] = {0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.};
737 pid[AliVCluster::kPhoton] = 1.;
742 pid[AliVCluster::kElectron] = 1.;
747 pid[AliVCluster::kElectron] = 1.;
752 pid[AliVCluster::kCharged] = 1.;
757 pid[AliVCluster::kCharged] = 1.;
762 pid[AliVCluster::kPi0] = 1.;
767 pid[AliVCluster::kCharged] = 1.;
772 pid[AliVCluster::kCharged] = 1.;
777 pid[AliVCluster::kKaon0] = 1.;
778 pid[AliVCluster::kNeutral] = 1;
783 pid[AliVCluster::kCharged] = 1.;
788 pid[AliVCluster::kCharged] = 1.;
794 pid[AliVCluster::kNeutral] = 1.;
799 pid[AliVCluster::kCharged] = 1.;
804 pid[AliVCluster::kCharged] = 1.;
809 pid[AliVCluster::kKaon0] = 1.;
810 pid[AliVCluster::kNeutral] = 1.;
815 pid[AliVCluster::kKaon0] = 1.;
816 pid[AliVCluster::kNeutral] = 1.;
821 pid[AliVCluster::kKaon0] = 1.;
822 pid[AliVCluster::kNeutral] = 1.;
827 pid[AliVCluster::kNeutral] = 1.;
832 pid[AliVCluster::kUnknown] = 1.;
837 pid[AliVCluster::kUnknown] = 1.;
842 pid[AliVCluster::kUnknown] = 1.;
847 pid[AliVCluster::kUnknown] = 1.;
852 pid[AliVCluster::kUnknown] = 1.;
857 pid[AliVCluster::kUnknown] = 1.;
862 pid[AliVCluster::kUnknown] = 1.;
868 pid[AliVCluster::kNeutral] = 1.;
873 pid[AliVCluster::kUnknown] = 1.;
878 pid[AliVCluster::kUnknown] = 1.;
883 pid[AliVCluster::kUnknown] = 1.;
888 pid[AliVCluster::kUnknown] = 1.;
893 pid[AliVCluster::kUnknown] = 1.;
898 pid[AliVCluster::kUnknown] = 1.;
903 pid[AliVCluster::kUnknown] = 1.;
908 pid[AliVCluster::kUnknown] = 1.;
913 pid[AliVCluster::kUnknown] = 1.;
918 pid[AliVCluster::kUnknown] = 1.;
923 pid[AliVCluster::kUnknown] = 1.;
928 pid[AliVCluster::kUnknown] = 1.;
virtual AliMCEvent * GetMC() const
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.
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.
virtual AliGenEventHeader * GetGenEventHeader() const
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.
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.
virtual void SetOutputEvent(AliAODEvent *aod)
Class for filtering generated MC particles and prepare them as input for the analysis.
virtual Bool_t ComparePtHardAndJetPt()
Bool_t IsInFiducialCut(Float_t eta, Float_t phi, Int_t det) const
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 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.
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.