1 //_________________________________________________________________________
2 // Utility Class for transverse energy studies
3 // Base class for ESD analysis
4 // - reconstruction output
7 //*-- Authors: Oystein Djuvsland (Bergen), David Silvermyr (ORNL)
8 //_________________________________________________________________________
10 #include "AliAnalysisEtReconstructed.h"
11 #include "AliAnalysisEtCuts.h"
12 #include "AliESDtrack.h"
13 #include "AliESDCaloCluster.h"
15 #include "AliVEvent.h"
16 #include "AliESDEvent.h"
17 #include "AliVParticle.h"
21 AliAnalysisEtReconstructed::AliAnalysisEtReconstructed() :
29 AliAnalysisEtReconstructed::~AliAnalysisEtReconstructed()
33 Int_t AliAnalysisEtReconstructed::AnalyseEvent(AliVEvent* ev)
34 { // analyse ESD event
36 AliESDEvent *event = dynamic_cast<AliESDEvent*>(ev);
38 for (Int_t iTrack = 0; iTrack < event->GetNumberOfTracks(); iTrack++)
40 AliVParticle *track = event->GetTrack(iTrack);
43 Printf("ERROR: Could not get track %d", iTrack);
49 Int_t nItsClusters = dynamic_cast<AliESDtrack*>(track)->GetNcls(0);
50 Int_t nTPCClusters = dynamic_cast<AliESDtrack*>(track)->GetNcls(1);
54 const Double_t *pidWeights = track->PID();
58 Float_t maxpidweight = 0;
59 for (Int_t p =0; p < AliPID::kSPECIES; p++)
61 if (pidWeights[p] > maxpidweight)
63 maxpidweight = pidWeights[p];
67 if (maxpid == AliPID::kProton)
69 // massPart = -0.938*track->Charge();
74 Double_t et = track->E() * TMath::Sin(track->Theta()) + massPart;
75 // printf("Rec track: iTrack %03d eta %4.3f phi %4.3f nITSCl %d nTPCCl %d\n", iTrack, track->Eta(), track->Phi(), nItsClusters, nTPCClusters); // tmp/debug printout
77 if (TMath::Abs(track->Eta()) < fCuts->GetCommonEtaCut() && CheckGoodVertex(track) && nItsClusters > fCuts->GetReconstructedNItsClustersCut() && nTPCClusters > fCuts->GetReconstructedNTpcClustersCut() )
80 fChargedMultiplicity++;
82 if (TMath::Abs(track->Eta()) < fEtaCutAcc && track->Phi() < fPhiCutAccMax && track->Phi() > fPhiCutAccMin)
84 fTotChargedEtAcc += track->E()*TMath::Sin(track->Theta()) + massPart;
88 if (TrackHitsCalorimeter(track, event->GetMagneticField()))
90 Double_t phi = track->Phi();
91 Double_t pt = track->Pt();
92 // printf("Rec track hit: iTrack %03d phi %4.3f pt %4.3f\n", iTrack, phi, pt); // tmp/debug printout
93 if (track->Charge() > 0) fHistPhivsPtPos->Fill(phi, pt);
94 else fHistPhivsPtNeg->Fill(phi, pt);
98 for (Int_t iCluster = 0; iCluster < event->GetNumberOfCaloClusters(); iCluster++)
100 AliESDCaloCluster* cluster = event->GetCaloCluster(iCluster);
103 Printf("ERROR: Could not get cluster %d", iCluster);
107 // printf("Rec Cluster: iCluster %03d E %4.3f type %d NCells %d\n", iCluster, cluster->E(), (int)(cluster->GetType()), cluster->GetNCells()); // tmp/debug printout
108 if (cluster->GetType() != fClusterType) continue;
110 if (cluster->E() < fClusterEnergyCut) continue;
113 cluster->GetPosition(pos);
114 //if (pos[0] < -(32.0*2.2)) continue; //Ensure that modules 0 and 1 are not used
115 // if(cp.Phi() < 260.*TMath::Pi()/180.) continue;
116 fHistTMDeltaR->Fill(cluster->GetEmcCpvDistance());
117 if (cluster->GetEmcCpvDistance() < fTrackDistanceCut)
120 //AliVParticle *matchedTrack = event->GetTrack(cluster->GetTrackMatched());
121 // if(CheckGoodVertex(matchedTrack))
123 // totChargedEnergy += matchedTrack->E();;
124 // totChargedEt += matchedTrack->E()*TMath::Sin(matchedTrack);
128 if (cluster->E() > fSingleCellEnergyCut && cluster->GetNCells() == fCuts->GetCommonSingleCell()) continue;
130 cluster->GetPosition(pos);
132 // TODO: replace with TVector3, too lazy now...
134 float dist = TMath::Sqrt(pos[0]*pos[0] + pos[1]*pos[1]);
136 float theta = TMath::ATan(pos[2]/dist)+TMath::Pi()/2;
137 // float eta = TMath::Log(TMath::Abs( TMath::Tan( 0.5 * theta ) ) );
138 fTotNeutralEt += cluster->E() * TMath::Sin(theta);
139 fNeutralMultiplicity++;
144 fTotNeutralEtAcc = fTotNeutralEt;
146 fTotEt = fTotChargedEt + fTotNeutralEt;
147 fTotEtAcc = fTotChargedEtAcc + fTotNeutralEtAcc;
149 std::cout << fTotChargedEtAcc << std::endl;
150 // Fill the histograms...
156 bool AliAnalysisEtReconstructed::CheckGoodVertex(AliVParticle* track)
161 dynamic_cast<AliESDtrack*>(track)->GetImpactParametersTPC(bxy,bz);
163 bool status = (TMath::Abs(track->Xv()) < fCuts->GetReconstructedVertexXCut()) &&
164 (TMath::Abs(track->Yv()) < fCuts->GetReconstructedVertexYCut()) &&
165 (TMath::Abs(track->Zv()) < fCuts->GetReconstructedVertexZCut()) &&
166 (TMath::Abs(bxy) < fCuts->GetReconstructedIPxyCut()) &&
167 (TMath::Abs(bz) < fCuts->GetReconstructedIPzCut());
172 void AliAnalysisEtReconstructed::Init()
174 AliAnalysisEt::Init();
177 bool AliAnalysisEtReconstructed::TrackHitsCalorimeter(AliVParticle* track, Double_t magField)
178 { // propagate track to detector radius
180 AliESDtrack *esdTrack = dynamic_cast<AliESDtrack*>(track);
181 // Printf("Propagating track: eta: %f, phi: %f, pt: %f", esdTrack->Eta(), esdTrack->Phi(), esdTrack->Pt());
183 Bool_t prop = esdTrack->PropagateTo(fDetectorRadius, magField);
185 // if (prop) Printf("Track propagated, eta: %f, phi: %f, pt: %f", esdTrack->Eta(), esdTrack->Phi(), esdTrack->Pt());
187 TMath::Abs(esdTrack->Eta()) < fEtaCutAcc &&
188 esdTrack->Phi() > fPhiCutAccMin*TMath::Pi()/180. &&
189 esdTrack->Phi() < fPhiCutAccMax*TMath::Pi()/180.;