1 #include "AliAnalysisEtMonteCarlo.h"
2 #include "AliAnalysisEtCuts.h"
3 #include "AliESDtrack.h"
5 #include "AliMCEvent.h"
8 Int_t AliAnalysisEtMonteCarlo::AnalyseEvent(AliVEvent* ev)
13 AliMCEvent *event = dynamic_cast<AliMCEvent*>(ev);
15 // Let's play with the stack!
16 AliStack *stack = event->Stack();
18 Int_t nPrim = stack->GetNtrack();
20 Double_t particleMassPart = 0; //The mass part in the Et calculation for this particle
22 for (Int_t iPart = 0; iPart < nPrim; iPart++)
25 TParticle *part = stack->Particle(iPart);
29 Printf("ERROR: Could not get particle %d", iPart);
33 TParticlePDG *pc = part->GetPDG(0);
35 // Check if it is a primary particle
36 if (!stack->IsPhysicalPrimary(iPart)) continue;
38 // Check for reasonable (for now neutral and singly charged) charge on the particle
39 //TODO:Maybe not only singly charged?
40 if (TMath::Abs(pc->Charge()) != EtMonteCarloCuts::kSingleChargedParticle && pc->Charge() != EtMonteCarloCuts::kNeutralParticle) continue;
44 if (TMath::Abs(part->Eta()) < fEtaCut)
47 TParticlePDG *pdgCode = part->GetPDG(0);
49 TMath::Abs(pdgCode->PdgCode()) == ProtonCode ||
50 TMath::Abs(pdgCode->PdgCode()) == NeutronCode ||
51 TMath::Abs(pdgCode->PdgCode()) == LambdaCode ||
52 TMath::Abs(pdgCode->PdgCode()) == XiCode ||
53 TMath::Abs(pdgCode->PdgCode()) == Xi0Code ||
54 TMath::Abs(pdgCode->PdgCode()) == OmegaCode
57 particleMassPart = -TMath::Sign(pdgCode->PdgCode(), pdgCode->PdgCode())*pdgCode->Mass();
60 if (pdgCode->Charge() == EtMonteCarloCuts::kNeutralParticle)
62 fNeutralMultiplicity++;
63 fTotNeutralEt += part->Energy()*TMath::Sin(part->Theta());
65 if (TMath::Abs(part->Eta()) < fEtaCutAcc && part->Phi() < fPhiCutAccMax && part->Phi() > fPhiCutAccMin)
67 fTotNeutralEtAcc += part->Energy()*TMath::Sin(part->Theta());
68 fTotEtAcc += part->Energy()*TMath::Sin(part->Theta());
71 else if (pdgCode->Charge() != EtMonteCarloCuts::kNeutralParticle)
73 fChargedMultiplicity++;
74 fTotChargedEt += part->Energy()*TMath::Sin(part->Theta());
75 if (TMath::Abs(part->Eta()) < fEtaCutAcc && part->Phi() < fPhiCutAccMax && part->Phi() > fPhiCutAccMin)
77 fTotChargedEtAcc += part->Energy()*TMath::Sin(part->Theta());
78 fTotEtAcc += part->Energy()*TMath::Sin(part->Theta());
81 // if (TrackHitsCalorimeter(part, event->GetMagneticField()))
82 if (TrackHitsCalorimeter(part)) // magnetic field info not filled?
84 if (pdgCode->Charge() > 0) fHistPhivsPtPos->Fill(part->Phi(),part->Pt());
85 else fHistPhivsPtNeg->Fill(part->Phi(), part->Pt());
91 fTotNeutralEtAcc = fTotNeutralEt;
92 fTotEt = fTotChargedEt + fTotNeutralEt;
93 fTotEtAcc = fTotChargedEtAcc + fTotNeutralEtAcc;
100 void AliAnalysisEtMonteCarlo::Init()
103 AliAnalysisEt::Init();
105 fVertexXCut = EtReconstructedCuts::kVertexXCut;
106 fVertexYCut = EtReconstructedCuts::kVertexYCut;
107 fVertexZCut = EtReconstructedCuts::kVertexZCut;
108 fIPxyCut = EtReconstructedCuts::kIPxyCut;
109 fIPzCut = EtReconstructedCuts::kIPzCut;
113 bool AliAnalysisEtMonteCarlo::TrackHitsCalorimeter(TParticle* part, Double_t magField)
115 // printf(" TrackHitsCalorimeter - magField %f\n", magField);
116 AliESDtrack *esdTrack = new AliESDtrack(part);
117 // Printf("MC Propagating track: eta: %f, phi: %f, pt: %f", esdTrack->Eta(), esdTrack->Phi(), esdTrack->Pt());
119 Bool_t prop = esdTrack->PropagateTo(fDetectorRadius, magField);
121 // if(prop) Printf("Track propagated, eta: %f, phi: %f, pt: %f", esdTrack->Eta(), esdTrack->Phi(), esdTrack->Pt());
123 bool status = prop &&
124 TMath::Abs(esdTrack->Eta()) < fEtaCutAcc &&
125 esdTrack->Phi() > fPhiCutAccMin*TMath::Pi()/180. &&
126 esdTrack->Phi() < fPhiCutAccMax*TMath::Pi()/180.;