1 //_________________________________________________________________________
2 // Utility Class for transverse energy studies
3 // Base class for MC analysis
7 //*-- Authors: Oystein Djuvsland (Bergen), David Silvermyr (ORNL)
8 //_________________________________________________________________________
10 #include "AliAnalysisEtMonteCarlo.h"
11 #include "AliAnalysisEtCuts.h"
12 #include "AliESDtrack.h"
14 #include "AliMCEvent.h"
16 #include "TParticle.h"
18 Int_t AliAnalysisEtMonteCarlo::AnalyseEvent(AliVEvent* ev)
23 AliMCEvent *event = dynamic_cast<AliMCEvent*>(ev);
25 // Let's play with the stack!
26 AliStack *stack = event->Stack();
28 Int_t nPrim = stack->GetNtrack();
30 Double_t particleMassPart = 0; //The mass part in the Et calculation for this particle
32 for (Int_t iPart = 0; iPart < nPrim; iPart++)
35 TParticle *part = stack->Particle(iPart);
39 Printf("ERROR: Could not get particle %d", iPart);
43 TParticlePDG *pc = part->GetPDG(0);
45 // Check if it is a primary particle
46 if (!stack->IsPhysicalPrimary(iPart)) continue;
48 // printf("MC: iPart %03d eta %4.3f phi %4.3f code %d charge %g \n", iPart, part->Eta(), part->Phi(), pc->PdgCode(), pc->Charge()); // tmp/debug printout
50 // Check for reasonable (for now neutral and singly charged) charge on the particle
51 //TODO:Maybe not only singly charged?
52 if (TMath::Abs(pc->Charge()) != EtMonteCarloCuts::kSingleChargedParticle && pc->Charge() != EtMonteCarloCuts::kNeutralParticle) continue;
56 if (TMath::Abs(part->Eta()) < fEtaCut)
59 TParticlePDG *pdgCode = part->GetPDG(0);
61 TMath::Abs(pdgCode->PdgCode()) == fProtonCode ||
62 TMath::Abs(pdgCode->PdgCode()) == fNeutronCode ||
63 TMath::Abs(pdgCode->PdgCode()) == fLambdaCode ||
64 TMath::Abs(pdgCode->PdgCode()) == fXiCode ||
65 TMath::Abs(pdgCode->PdgCode()) == fXi0Code ||
66 TMath::Abs(pdgCode->PdgCode()) == fOmegaCode
69 particleMassPart = -TMath::Sign(pdgCode->PdgCode(), pdgCode->PdgCode())*pdgCode->Mass();
72 if (pdgCode->Charge() == EtMonteCarloCuts::kNeutralParticle)
74 fNeutralMultiplicity++;
75 fTotNeutralEt += part->Energy()*TMath::Sin(part->Theta());
77 if (TMath::Abs(part->Eta()) < fEtaCutAcc && part->Phi() < fPhiCutAccMax && part->Phi() > fPhiCutAccMin)
79 fTotNeutralEtAcc += part->Energy()*TMath::Sin(part->Theta());
80 fTotEtAcc += part->Energy()*TMath::Sin(part->Theta());
83 else if (pdgCode->Charge() != EtMonteCarloCuts::kNeutralParticle)
85 fChargedMultiplicity++;
86 fTotChargedEt += part->Energy()*TMath::Sin(part->Theta());
87 if (TMath::Abs(part->Eta()) < fEtaCutAcc && part->Phi() < fPhiCutAccMax && part->Phi() > fPhiCutAccMin)
89 fTotChargedEtAcc += part->Energy()*TMath::Sin(part->Theta());
90 fTotEtAcc += part->Energy()*TMath::Sin(part->Theta());
93 // if (TrackHitsCalorimeter(part, event->GetMagneticField()))
94 if (TrackHitsCalorimeter(part)) // magnetic field info not filled?
96 if (pdgCode->Charge() > 0) fHistPhivsPtPos->Fill(part->Phi(),part->Pt());
97 else fHistPhivsPtNeg->Fill(part->Phi(), part->Pt());
103 fTotNeutralEtAcc = fTotNeutralEt;
104 fTotEt = fTotChargedEt + fTotNeutralEt;
105 fTotEtAcc = fTotChargedEtAcc + fTotNeutralEtAcc;
112 void AliAnalysisEtMonteCarlo::Init()
114 AliAnalysisEt::Init();
117 bool AliAnalysisEtMonteCarlo::TrackHitsCalorimeter(TParticle* part, Double_t magField)
119 // printf(" TrackHitsCalorimeter - magField %f\n", magField);
120 AliESDtrack *esdTrack = new AliESDtrack(part);
121 // Printf("MC Propagating track: eta: %f, phi: %f, pt: %f", esdTrack->Eta(), esdTrack->Phi(), esdTrack->Pt());
123 Bool_t prop = esdTrack->PropagateTo(fDetectorRadius, magField);
125 // if(prop) Printf("Track propagated, eta: %f, phi: %f, pt: %f", esdTrack->Eta(), esdTrack->Phi(), esdTrack->Pt());
127 bool status = prop &&
128 TMath::Abs(esdTrack->Eta()) < fEtaCutAcc &&
129 esdTrack->Phi() > fPhiCutAccMin*TMath::Pi()/180. &&
130 esdTrack->Phi() < fPhiCutAccMax*TMath::Pi()/180.;