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 "AliEMCALTrack.h"
14 #include "AliESDCaloCluster.h"
16 #include "TGeoGlobalMagField.h"
18 #include "AliVEvent.h"
19 #include "AliESDEvent.h"
20 #include "AliESDtrackCuts.h"
21 #include "AliVParticle.h"
22 #include "TDatabasePDG.h"
24 #include "AliESDpid.h"
30 #include "AliAnalysisHadEtCorrections.h"
31 #include "AliAnalysisEtSelector.h"
33 #include "AliCentrality.h"
34 #include "AliPHOSGeoUtils.h"
35 #include "AliPHOSGeometry.h"
40 ClassImp(AliAnalysisEtReconstructed);
43 AliAnalysisEtReconstructed::AliAnalysisEtReconstructed() :
47 ,fHistChargedPionEnergyDeposit(0)
48 ,fHistProtonEnergyDeposit(0)
49 ,fHistAntiProtonEnergyDeposit(0)
50 ,fHistChargedKaonEnergyDeposit(0)
51 ,fHistMuonEnergyDeposit(0)
52 ,fHistRemovedEnergy(0)
54 ,fEMinCorrection(1.0/0.687)
55 ,fRecEffCorrection(1.0)
59 ,fHistChargedEnergyRemoved(0)
60 ,fHistNeutralEnergyRemoved(0)
61 ,fHistGammaEnergyAdded(0)
66 AliAnalysisEtReconstructed::~AliAnalysisEtReconstructed()
69 delete fHistChargedPionEnergyDeposit; /** Energy deposited in calorimeter by charged pions */
70 delete fHistProtonEnergyDeposit; /** Energy deposited in calorimeter by protons */
71 delete fHistAntiProtonEnergyDeposit; /** Energy deposited in calorimeter by anti-protons */
72 delete fHistChargedKaonEnergyDeposit; /** Energy deposited in calorimeter by charged kaons */
73 delete fHistMuonEnergyDeposit; /** Energy deposited in calorimeter by muons */
75 delete fHistRemovedEnergy; // removed energy
76 delete fClusterPosition;
77 delete fClusterEnergy;
79 delete fHistChargedEnergyRemoved;
80 delete fHistNeutralEnergyRemoved;
81 delete fHistGammaEnergyAdded;
85 Int_t AliAnalysisEtReconstructed::AnalyseEvent(AliVEvent* ev)
88 //AliAnalysisEt::AnalyseEvent(ev);
92 AliFatal("ERROR: Event does not exist");
96 AliESDEvent *event = dynamic_cast<AliESDEvent*>(ev);
98 AliFatal("ERROR: ESD Event does not exist");
102 AliFatal("ERROR: fSelector does not exist");
105 fSelector->SetEvent(event);
108 if (fCentrality && cent)
110 cent = fCentrality->GetCentralityClass10("V0M");
111 fCentClass = fCentrality->GetCentralityClass10("V0M");
114 for (Int_t iCluster = 0; iCluster < event->GetNumberOfCaloClusters(); iCluster++)
116 AliESDCaloCluster* cluster = event->GetCaloCluster(iCluster);
119 AliError(Form("ERROR: Could not get cluster %d", iCluster));
124 if(!fSelector->IsDetectorCluster(*cluster)) continue;
126 if(!fSelector->PassMinEnergyCut(*cluster)) continue;
128 if (!fSelector->PassDistanceToBadChannelCut(*cluster)) continue;
133 cluster->GetPosition(pos);
136 Int_t trackMatchedIndex = cluster->GetTrackMatchedIndex();
138 Bool_t matched = false;
141 matched = !fSelector->PassTrackMatchingCut(*cluster);
146 if (cluster->GetNTracksMatched() > 0 && trackMatchedIndex>=0)
148 AliVTrack *track = event->GetTrack(trackMatchedIndex);
150 AliError("Error: track does not exist");
153 const Double_t *pidWeights = track->PID();
155 Double_t maxpidweight = 0;
160 for (Int_t p =0; p < AliPID::kSPECIES; p++)
162 if (pidWeights[p] > maxpidweight)
164 maxpidweight = pidWeights[p];
168 if (fCuts->GetHistMakeTreeDeposit() && fDepositTree)
170 fEnergyDeposited = cluster->E();
171 fMomentumTPC = track->P();
172 fCharge = track->Charge();
173 fParticlePid = maxpid;
174 fPidProb = maxpidweight;
175 AliESDtrack *esdTrack = dynamic_cast<AliESDtrack*>(track);
177 AliError("Error: track does not exist");
180 if (esdTrack) fTrackPassedCut = fEsdtrackCutsTPC->AcceptTrack(esdTrack);
181 fDepositTree->Fill();
185 if (maxpidweight > fPidCut)
187 //Float_t dist = TMath::Sqrt(pos[0]*pos[0] + pos[1]*pos[1]);
189 //Float_t theta = TMath::ATan(pos[2]/dist)+TMath::Pi()/2;
191 //Float_t et = cluster->E() * TMath::Sin(theta);
192 if (maxpid == AliPID::kProton)
195 if (track->Charge() == 1)
197 fHistProtonEnergyDeposit->Fill(cluster->E(), track->E());
199 else if (track->Charge() == -1)
201 fHistAntiProtonEnergyDeposit->Fill(cluster->E(), track->E());
204 else if (maxpid == AliPID::kPion)
206 fHistChargedPionEnergyDeposit->Fill(cluster->E(), track->E());
208 else if (maxpid == AliPID::kKaon)
210 fHistChargedKaonEnergyDeposit->Fill(cluster->E(), track->E());
212 else if (maxpid == AliPID::kMuon)
214 fHistMuonEnergyDeposit->Fill(cluster->E(), track->E());
225 //std::cout << x++ << std::endl;
227 //if (cluster->E() > fSingleCellEnergyCut && cluster->GetNCells() == fCuts->GetCommonSingleCell()) continue;
228 //if (cluster->E() < fClusterEnergyCut) continue;
229 cluster->GetPosition(pos);
233 fClusterPosition->Fill(p2.Phi(), p2.PseudoRapidity());
234 fClusterEnergy->Fill(cluster->E());
235 fClusterEt->Fill(TMath::Sin(p2.Theta())*cluster->E());
237 fTotNeutralEt += CorrectForReconstructionEfficiency(*cluster);
238 fNeutralMultiplicity++;
243 fChargedEnergyRemoved = GetChargedContribution(fNeutralMultiplicity);
244 fNeutralEnergyRemoved = GetNeutralContribution(fNeutralMultiplicity);
245 fHistChargedEnergyRemoved->Fill(fChargedEnergyRemoved, fNeutralMultiplicity);
246 fHistNeutralEnergyRemoved->Fill(fNeutralEnergyRemoved, fNeutralMultiplicity);
248 fGammaEnergyAdded = GetGammaContribution(fNeutralMultiplicity);
249 fHistGammaEnergyAdded->Fill(fGammaEnergyAdded, fNeutralMultiplicity);
251 Double_t removedEnergy = GetChargedContribution(fNeutralMultiplicity) + GetNeutralContribution(fNeutralMultiplicity) + GetGammaContribution(fNeutralMultiplicity) + GetSecondaryContribution(fNeutralMultiplicity);
252 fHistRemovedEnergy->Fill(removedEnergy);
254 fTotNeutralEt = fGeomCorrection * fEMinCorrection * (fTotNeutralEt - removedEnergy);
255 fTotEt = fTotChargedEt + fTotNeutralEt;
256 // Fill the histograms...0
258 //std::cout << "fTotNeutralEt: " << fTotNeutralEt << ", Contribution from non-removed charged: " << GetChargedContribution(fNeutralMultiplicity) << ", neutral: " << GetNeutralContribution(fNeutralMultiplicity) << ", gammas: " << GetGammaContribution(fNeutralMultiplicity) << ", multiplicity: " << fNeutralMultiplicity<< std::endl;
262 bool AliAnalysisEtReconstructed::CheckGoodVertex(AliVParticle* track)
268 AliError("ERROR: no track");
271 AliESDtrack *esdTrack = dynamic_cast<AliESDtrack*>(track);
273 AliError("ERROR: no track");
276 esdTrack->GetImpactParametersTPC(bxy,bz);
279 bool status = (TMath::Abs(track->Xv()) < fCuts->GetReconstructedVertexXCut()) &&
280 (TMath::Abs(track->Yv()) < fCuts->GetReconstructedVertexYCut()) &&
281 (TMath::Abs(track->Zv()) < fCuts->GetReconstructedVertexZCut()) &&
282 (TMath::Abs(bxy) < fCuts->GetReconstructedIPxyCut()) &&
283 (TMath::Abs(bz) < fCuts->GetReconstructedIPzCut());
288 void AliAnalysisEtReconstructed::Init()
290 AliAnalysisEt::Init();
291 fPidCut = fCuts->GetReconstructedPidCut();
292 TGeoGlobalMagField::Instance()->SetField(new AliMagF("Maps","Maps", 1., 1., AliMagF::k5kG));
294 cout<<"Warning! You have not set corrections. Your code will crash. You have to set the corrections."<<endl;
298 bool AliAnalysisEtReconstructed::TrackHitsCalorimeter(AliVParticle* track, Double_t magField)
299 { // propagate track to detector radius
302 cout<<"Warning: track empty"<<endl;
305 AliESDtrack *esdTrack= dynamic_cast<AliESDtrack*>(track);
307 AliError("ERROR: no ESD track");
310 // Printf("Propagating track: eta: %f, phi: %f, pt: %f", esdTrack->Eta(), esdTrack->Phi(), esdTrack->Pt());
312 Bool_t prop = esdTrack->PropagateTo(fDetectorRadius, magField);
314 // if (prop) Printf("Track propagated, eta: %f, phi: %f, pt: %f", esdTrack->Eta(), esdTrack->Phi(), esdTrack->Pt());
315 return prop && fSelector->CutGeometricalAcceptance(*esdTrack);
318 void AliAnalysisEtReconstructed::FillOutputList(TList* list)
319 { // add some extra histograms to the ones from base class
320 AliAnalysisEt::FillOutputList(list);
322 list->Add(fHistChargedPionEnergyDeposit);
323 list->Add(fHistProtonEnergyDeposit);
324 list->Add(fHistAntiProtonEnergyDeposit);
325 list->Add(fHistChargedKaonEnergyDeposit);
326 list->Add(fHistMuonEnergyDeposit);
328 list->Add(fHistRemovedEnergy);
329 list->Add(fClusterPosition);
330 list->Add(fClusterEnergy);
331 list->Add(fClusterEt);
333 list->Add(fHistChargedEnergyRemoved);
334 list->Add(fHistNeutralEnergyRemoved);
335 list->Add(fHistGammaEnergyAdded);
338 void AliAnalysisEtReconstructed::CreateHistograms()
339 { // add some extra histograms to the ones from base class
340 AliAnalysisEt::CreateHistograms();
342 Int_t nbinsEt = 1000;
346 // possibly change histogram limits
348 // nbinsEt = fCuts->GetHistNbinsParticleEt();
349 // minEt = fCuts->GetHistMinParticleEt();
350 // maxEt = fCuts->GetHistMaxParticleEt();
354 histname = "fHistChargedPionEnergyDeposit" + fHistogramNameSuffix;
355 fHistChargedPionEnergyDeposit = new TH2F(histname.Data(), "Energy deposited by #pi^{+/-}", nbinsEt, minEt, maxEt, nbinsEt, minEt, maxEt);
356 fHistChargedPionEnergyDeposit->SetXTitle("Energy deposited in calorimeter");
357 fHistChargedPionEnergyDeposit->SetYTitle("Energy of track");
359 histname = "fHistProtonEnergyDeposit" + fHistogramNameSuffix;
360 fHistProtonEnergyDeposit = new TH2F(histname.Data(), "Energy deposited by protons", nbinsEt, minEt, maxEt, nbinsEt, minEt, maxEt);
361 fHistProtonEnergyDeposit->SetXTitle("Energy deposited in calorimeter");
362 fHistProtonEnergyDeposit->SetYTitle("Energy of track");
364 histname = "fHistAntiProtonEnergyDeposit" + fHistogramNameSuffix;
365 fHistAntiProtonEnergyDeposit = new TH2F(histname.Data(), "Energy deposited by anti-protons", nbinsEt, minEt, maxEt, nbinsEt, minEt, maxEt);
366 fHistAntiProtonEnergyDeposit->SetXTitle("Energy deposited in calorimeter");
367 fHistAntiProtonEnergyDeposit->SetYTitle("Energy of track");
369 histname = "fHistChargedKaonEnergyDeposit" + fHistogramNameSuffix;
370 fHistChargedKaonEnergyDeposit = new TH2F(histname.Data(), "Energy deposited by K^{+/-}", nbinsEt, minEt, maxEt, nbinsEt, minEt, maxEt);
371 fHistChargedKaonEnergyDeposit->SetXTitle("Energy deposited in calorimeter");
372 fHistChargedKaonEnergyDeposit->SetYTitle("Energy of track");
374 histname = "fHistMuonEnergyDeposit" + fHistogramNameSuffix;
375 fHistMuonEnergyDeposit = new TH2F(histname.Data(), "Energy deposited by #mu^{+/-}", nbinsEt, minEt, maxEt, nbinsEt, minEt, maxEt);
376 fHistMuonEnergyDeposit->SetXTitle("Energy deposited in calorimeter");
377 fHistMuonEnergyDeposit->SetYTitle("Energy of track");
379 histname = "fHistRemovedEnergy" + fHistogramNameSuffix;
380 fHistRemovedEnergy = new TH1F(histname.Data(), histname.Data(), 1000, 0, 20);
381 //fHistMuonEnergyDeposit->SetXTitle("Energy deposited in calorimeter");
382 //fHistMuonEnergyDeposit->SetYTitle("Energy of track");
384 histname = "fClusterPosition" + fHistogramNameSuffix;
385 fClusterPosition = new TH2D(histname.Data(), "Position of accepted neutral clusters",1000, -2.0, -.5, 1000, -.13 , 0.13);
386 fClusterPosition->SetXTitle("Energy deposited in calorimeter");
387 fClusterPosition->SetYTitle("Energy of track");
389 histname = "fClusterEnergy" + fHistogramNameSuffix;
390 fClusterEnergy = new TH1F(histname.Data(), histname.Data(), 100, 0, 5);
391 fClusterEnergy->SetXTitle("Number of clusters");
392 fClusterEnergy->SetYTitle("Energy of cluster");
394 histname = "fClusterEt" + fHistogramNameSuffix;
395 fClusterEt = new TH1F(histname.Data(), histname.Data(), 100, 0, 5);
396 fClusterEt->SetXTitle("Number of clusters");
397 fClusterEt->SetYTitle("E_{T} of cluster");
399 histname = "fHistChargedEnergyRemoved" + fHistogramNameSuffix;
400 fHistChargedEnergyRemoved = new TH2D(histname.Data(), histname.Data(), 1000, .0, 30, 100, -0.5 , 99.5);
402 histname = "fHistNeutralEnergyRemoved" + fHistogramNameSuffix;
403 fHistNeutralEnergyRemoved = new TH2D(histname.Data(), histname.Data(), 1000, .0, 30, 100, -0.5 , 99.5);
405 histname = "fHistGammaEnergyAdded" + fHistogramNameSuffix;
406 fHistGammaEnergyAdded = new TH2D(histname.Data(), histname.Data(), 1000, .0, 30, 100, -0.5 , 99.5);