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"
31 #include "AliAnalysisHadEtCorrections.h"
32 #include "AliAnalysisEtSelector.h"
34 #include "AliCentrality.h"
35 #include "AliPHOSGeoUtils.h"
36 #include "AliPHOSGeometry.h"
37 #include "AliAnalysisEtRecEffCorrection.h"
42 ClassImp(AliAnalysisEtReconstructed);
45 AliAnalysisEtReconstructed::AliAnalysisEtReconstructed() :
49 ,fHistChargedPionEnergyDeposit(0)
50 ,fHistProtonEnergyDeposit(0)
51 ,fHistAntiProtonEnergyDeposit(0)
52 ,fHistChargedKaonEnergyDeposit(0)
53 ,fHistMuonEnergyDeposit(0)
54 ,fHistRemovedEnergy(0)
56 ,fEMinCorrection(1.0/0.687)
57 ,fRecEffCorrection(1.0)
61 ,fHistChargedEnergyRemoved(0)
62 ,fHistNeutralEnergyRemoved(0)
63 ,fHistGammaEnergyAdded(0)
64 ,fHistMatchedTracksEvspTvsMult(0)
65 ,fHistMatchedTracksEvspTvsMultEffCorr(0)
67 ,fHistNominalNonLinHighEt(0)
68 ,fHistNominalNonLinLowEt(0)
69 ,fHistNominalEffHighEt(0)
70 ,fHistNominalEffLowEt(0)
75 AliAnalysisEtReconstructed::~AliAnalysisEtReconstructed()
78 delete fHistChargedPionEnergyDeposit; /** Energy deposited in calorimeter by charged pions */
79 delete fHistProtonEnergyDeposit; /** Energy deposited in calorimeter by protons */
80 delete fHistAntiProtonEnergyDeposit; /** Energy deposited in calorimeter by anti-protons */
81 delete fHistChargedKaonEnergyDeposit; /** Energy deposited in calorimeter by charged kaons */
82 delete fHistMuonEnergyDeposit; /** Energy deposited in calorimeter by muons */
84 delete fHistRemovedEnergy; // removed energy
85 delete fClusterPosition;
86 delete fClusterEnergy;
88 delete fHistChargedEnergyRemoved;
89 delete fHistNeutralEnergyRemoved;
90 delete fHistGammaEnergyAdded;
91 delete fHistMatchedTracksEvspTvsMult;
92 delete fHistMatchedTracksEvspTvsMultEffCorr;
93 delete fHistNominalRawEt;
94 delete fHistNominalNonLinHighEt;
95 delete fHistNominalNonLinLowEt;
96 delete fHistNominalEffHighEt;
97 delete fHistNominalEffLowEt;
100 Int_t AliAnalysisEtReconstructed::AnalyseEvent(AliVEvent* ev)
103 //AliAnalysisEt::AnalyseEvent(ev);
107 AliFatal("ERROR: Event does not exist");
111 AliESDEvent *event = dynamic_cast<AliESDEvent*>(ev);
113 AliFatal("ERROR: ESD Event does not exist");
117 AliFatal("ERROR: fSelector does not exist");
120 fSelector->SetEvent(event);
123 fCentrality = event->GetCentrality();
124 if (fCentrality && cent)
126 cent = fCentrality->GetCentralityClass5("V0M");
127 fCentClass = fCentrality->GetCentralityClass5("V0M");
130 TRefArray *caloClusters = fSelector->GetClusters();
131 Float_t fClusterMult = caloClusters->GetEntries();
133 Float_t nominalRawEt = 0;
134 Float_t nonlinHighRawEt = 0;
135 Float_t nonlinLowRawEt = 0;
136 Float_t effHighRawEt = 0;
137 Float_t effLowRawEt = 0;
140 for (Int_t iCluster = 0; iCluster < event->GetNumberOfCaloClusters(); iCluster++)
142 AliESDCaloCluster* cluster = event->GetCaloCluster(iCluster);
145 AliError(Form("ERROR: Could not get cluster %d", iCluster));
150 if(!fSelector->IsDetectorCluster(*cluster)) continue;
152 if(!fSelector->PassMinEnergyCut(*cluster)) continue;
154 if (!fSelector->PassDistanceToBadChannelCut(*cluster)) continue;
159 cluster->GetPosition(pos);
162 Bool_t matched = kTRUE;//default to no track matched
163 Int_t trackMatchedIndex = cluster->GetTrackMatchedIndex();//find the index of the matched track
164 matched = fSelector->PassTrackMatchingCut(*cluster);
166 if(trackMatchedIndex < 0) matched=kTRUE;
167 AliESDtrack *track = event->GetTrack(trackMatchedIndex);
168 //if this is a good track, accept track will return true. The track matched is good, so not track matched is false
169 matched = !(fEsdtrackCutsTPC->AcceptTrack(track));
176 if (cluster->GetNTracksMatched() > 0 && trackMatchedIndex>=0)
178 AliVTrack *track = event->GetTrack(trackMatchedIndex);
180 AliError("Error: track does not exist");
183 fHistMatchedTracksEvspTvsMult->Fill(track->P(),cluster->E(),fClusterMult);
184 fHistMatchedTracksEvspTvsMultEffCorr->Fill(track->P(),CorrectForReconstructionEfficiency(*cluster),fClusterMult);
185 const Double_t *pidWeights = track->PID();
187 Double_t maxpidweight = 0;
192 for (Int_t p =0; p < AliPID::kSPECIES; p++)
194 if (pidWeights[p] > maxpidweight)
196 maxpidweight = pidWeights[p];
200 if (fCuts->GetHistMakeTreeDeposit() && fDepositTree)
202 fEnergyDeposited = cluster->E();
203 fMomentumTPC = track->P();
204 fCharge = track->Charge();
205 fParticlePid = maxpid;
206 fPidProb = maxpidweight;
207 AliESDtrack *esdTrack = dynamic_cast<AliESDtrack*>(track);
209 AliError("Error: track does not exist");
212 if (esdTrack) fTrackPassedCut = fEsdtrackCutsTPC->AcceptTrack(esdTrack);
213 fDepositTree->Fill();
217 if (maxpidweight > fPidCut)
219 //Float_t dist = TMath::Sqrt(pos[0]*pos[0] + pos[1]*pos[1]);
221 //Float_t theta = TMath::ATan(pos[2]/dist)+TMath::Pi()/2;
223 //Float_t et = cluster->E() * TMath::Sin(theta);
224 if (maxpid == AliPID::kProton)
227 if (track->Charge() == 1)
229 fHistProtonEnergyDeposit->Fill(cluster->E(), track->E());
231 else if (track->Charge() == -1)
233 fHistAntiProtonEnergyDeposit->Fill(cluster->E(), track->E());
236 else if (maxpid == AliPID::kPion)
238 fHistChargedPionEnergyDeposit->Fill(cluster->E(), track->E());
240 else if (maxpid == AliPID::kKaon)
242 fHistChargedKaonEnergyDeposit->Fill(cluster->E(), track->E());
244 else if (maxpid == AliPID::kMuon)
246 fHistMuonEnergyDeposit->Fill(cluster->E(), track->E());
255 {//these are clusters which were not track matched
257 //std::cout << x++ << std::endl;
259 //if (cluster->E() > fSingleCellEnergyCut && cluster->GetNCells() == fCuts->GetCommonSingleCell()) continue;
260 //if (cluster->E() < fClusterEnergyCut) continue;
261 cluster->GetPosition(pos);
265 fClusterPosition->Fill(p2.Phi(), p2.PseudoRapidity());
266 fClusterEnergy->Fill(cluster->E());
267 fClusterEt->Fill(TMath::Sin(p2.Theta())*cluster->E());
269 Double_t effCorrEt = CorrectForReconstructionEfficiency(*cluster);
270 fTotNeutralEt += effCorrEt;
271 nominalRawEt += effCorrEt;
272 nonlinHighRawEt += effCorrEt*GetCorrectionModification(*cluster,1,0);
273 nonlinLowRawEt += effCorrEt*GetCorrectionModification(*cluster,-1,0);
274 effHighRawEt += effCorrEt*GetCorrectionModification(*cluster,0,1);
275 effLowRawEt += effCorrEt*GetCorrectionModification(*cluster,0,-1);
276 fNeutralMultiplicity++;
281 fChargedEnergyRemoved = GetChargedContribution(fNeutralMultiplicity);
282 fNeutralEnergyRemoved = GetNeutralContribution(fNeutralMultiplicity);
283 fHistChargedEnergyRemoved->Fill(fChargedEnergyRemoved, fNeutralMultiplicity);
284 fHistNeutralEnergyRemoved->Fill(fNeutralEnergyRemoved, fNeutralMultiplicity);
286 fGammaEnergyAdded = GetGammaContribution(fNeutralMultiplicity);
287 fHistGammaEnergyAdded->Fill(fGammaEnergyAdded, fNeutralMultiplicity);
289 Double_t removedEnergy = GetChargedContribution(fNeutralMultiplicity) + GetNeutralContribution(fNeutralMultiplicity) + GetGammaContribution(fNeutralMultiplicity) + GetSecondaryContribution(fNeutralMultiplicity);
290 fHistRemovedEnergy->Fill(removedEnergy);
292 fTotNeutralEt = fGeomCorrection * fEMinCorrection * (fTotNeutralEt - removedEnergy);
293 fTotEt = fTotChargedEt + fTotNeutralEt;
294 // Fill the histograms...0
296 //std::cout << "fTotNeutralEt: " << fTotNeutralEt << ", Contribution from non-removed charged: " << GetChargedContribution(fNeutralMultiplicity) << ", neutral: " << GetNeutralContribution(fNeutralMultiplicity) << ", gammas: " << GetGammaContribution(fNeutralMultiplicity) << ", multiplicity: " << fNeutralMultiplicity<< std::endl;
297 //cout<<"cent "<<cent<<" cluster mult "<<fClusterMult<<" fTotNeutralEt "<<fTotNeutralEt<<" nominalRawEt "<<nominalRawEt<<endl;
298 fHistNominalRawEt->Fill(nominalRawEt,cent);
299 fHistNominalNonLinHighEt->Fill(nonlinHighRawEt,cent);
300 fHistNominalNonLinLowEt->Fill(nonlinLowRawEt,cent);
301 fHistNominalEffHighEt->Fill(effHighRawEt,cent);
302 fHistNominalEffLowEt->Fill(effLowRawEt,cent);
307 bool AliAnalysisEtReconstructed::CheckGoodVertex(AliVParticle* track)
313 AliError("ERROR: no track");
316 AliESDtrack *esdTrack = dynamic_cast<AliESDtrack*>(track);
318 AliError("ERROR: no track");
321 esdTrack->GetImpactParametersTPC(bxy,bz);
324 bool status = (TMath::Abs(track->Xv()) < fCuts->GetReconstructedVertexXCut()) &&
325 (TMath::Abs(track->Yv()) < fCuts->GetReconstructedVertexYCut()) &&
326 (TMath::Abs(track->Zv()) < fCuts->GetReconstructedVertexZCut()) &&
327 (TMath::Abs(bxy) < fCuts->GetReconstructedIPxyCut()) &&
328 (TMath::Abs(bz) < fCuts->GetReconstructedIPzCut());
333 void AliAnalysisEtReconstructed::Init()
335 AliAnalysisEt::Init();
336 fPidCut = fCuts->GetReconstructedPidCut();
337 TGeoGlobalMagField::Instance()->SetField(new AliMagF("Maps","Maps", 1., 1., AliMagF::k5kG));
339 cout<<"Warning! You have not set corrections. Your code will crash. You have to set the corrections."<<endl;
343 bool AliAnalysisEtReconstructed::TrackHitsCalorimeter(AliVParticle* track, Double_t magField)
344 { // propagate track to detector radius
347 cout<<"Warning: track empty"<<endl;
350 AliESDtrack *esdTrack= dynamic_cast<AliESDtrack*>(track);
352 AliError("ERROR: no ESD track");
355 // Printf("Propagating track: eta: %f, phi: %f, pt: %f", esdTrack->Eta(), esdTrack->Phi(), esdTrack->Pt());
357 Bool_t prop = esdTrack->PropagateTo(fDetectorRadius, magField);
359 // if (prop) Printf("Track propagated, eta: %f, phi: %f, pt: %f", esdTrack->Eta(), esdTrack->Phi(), esdTrack->Pt());
360 return prop && fSelector->CutGeometricalAcceptance(*esdTrack);
363 void AliAnalysisEtReconstructed::FillOutputList(TList* list)
364 { // add some extra histograms to the ones from base class
365 AliAnalysisEt::FillOutputList(list);
367 list->Add(fHistChargedPionEnergyDeposit);
368 list->Add(fHistProtonEnergyDeposit);
369 list->Add(fHistAntiProtonEnergyDeposit);
370 list->Add(fHistChargedKaonEnergyDeposit);
371 list->Add(fHistMuonEnergyDeposit);
373 list->Add(fHistRemovedEnergy);
374 list->Add(fClusterPosition);
375 list->Add(fClusterEnergy);
376 list->Add(fClusterEt);
378 list->Add(fHistChargedEnergyRemoved);
379 list->Add(fHistNeutralEnergyRemoved);
380 list->Add(fHistGammaEnergyAdded);
381 list->Add(fHistMatchedTracksEvspTvsMult);
382 list->Add(fHistMatchedTracksEvspTvsMultEffCorr);
383 list->Add(fHistNominalRawEt);
384 list->Add(fHistNominalNonLinHighEt);
385 list->Add(fHistNominalNonLinLowEt);
386 list->Add(fHistNominalEffHighEt);
387 list->Add(fHistNominalEffLowEt);
390 void AliAnalysisEtReconstructed::CreateHistograms()
391 { // add some extra histograms to the ones from base class
392 AliAnalysisEt::CreateHistograms();
394 Int_t nbinsEt = 1000;
398 // possibly change histogram limits
400 // nbinsEt = fCuts->GetHistNbinsParticleEt();
401 // minEt = fCuts->GetHistMinParticleEt();
402 // maxEt = fCuts->GetHistMaxParticleEt();
406 histname = "fHistChargedPionEnergyDeposit" + fHistogramNameSuffix;
407 fHistChargedPionEnergyDeposit = new TH2F(histname.Data(), "Energy deposited by #pi^{+/-}", nbinsEt, minEt, maxEt, nbinsEt, minEt, maxEt);
408 fHistChargedPionEnergyDeposit->SetXTitle("Energy deposited in calorimeter");
409 fHistChargedPionEnergyDeposit->SetYTitle("Energy of track");
411 histname = "fHistProtonEnergyDeposit" + fHistogramNameSuffix;
412 fHistProtonEnergyDeposit = new TH2F(histname.Data(), "Energy deposited by protons", nbinsEt, minEt, maxEt, nbinsEt, minEt, maxEt);
413 fHistProtonEnergyDeposit->SetXTitle("Energy deposited in calorimeter");
414 fHistProtonEnergyDeposit->SetYTitle("Energy of track");
416 histname = "fHistAntiProtonEnergyDeposit" + fHistogramNameSuffix;
417 fHistAntiProtonEnergyDeposit = new TH2F(histname.Data(), "Energy deposited by anti-protons", nbinsEt, minEt, maxEt, nbinsEt, minEt, maxEt);
418 fHistAntiProtonEnergyDeposit->SetXTitle("Energy deposited in calorimeter");
419 fHistAntiProtonEnergyDeposit->SetYTitle("Energy of track");
421 histname = "fHistChargedKaonEnergyDeposit" + fHistogramNameSuffix;
422 fHistChargedKaonEnergyDeposit = new TH2F(histname.Data(), "Energy deposited by K^{+/-}", nbinsEt, minEt, maxEt, nbinsEt, minEt, maxEt);
423 fHistChargedKaonEnergyDeposit->SetXTitle("Energy deposited in calorimeter");
424 fHistChargedKaonEnergyDeposit->SetYTitle("Energy of track");
426 histname = "fHistMuonEnergyDeposit" + fHistogramNameSuffix;
427 fHistMuonEnergyDeposit = new TH2F(histname.Data(), "Energy deposited by #mu^{+/-}", nbinsEt, minEt, maxEt, nbinsEt, minEt, maxEt);
428 fHistMuonEnergyDeposit->SetXTitle("Energy deposited in calorimeter");
429 fHistMuonEnergyDeposit->SetYTitle("Energy of track");
431 histname = "fHistRemovedEnergy" + fHistogramNameSuffix;
432 fHistRemovedEnergy = new TH1F(histname.Data(), histname.Data(), 1000, 0, 20);
433 //fHistMuonEnergyDeposit->SetXTitle("Energy deposited in calorimeter");
434 //fHistMuonEnergyDeposit->SetYTitle("Energy of track");
436 histname = "fClusterPosition" + fHistogramNameSuffix;
437 fClusterPosition = new TH2D(histname.Data(), "Position of accepted neutral clusters",1000, -2.0, -.5, 1000, -.13 , 0.13);
438 fClusterPosition->SetXTitle("Energy deposited in calorimeter");
439 fClusterPosition->SetYTitle("Energy of track");
441 histname = "fClusterEnergy" + fHistogramNameSuffix;
442 fClusterEnergy = new TH1F(histname.Data(), histname.Data(), 100, 0, 5);
443 fClusterEnergy->SetXTitle("Number of clusters");
444 fClusterEnergy->SetYTitle("Energy of cluster");
446 histname = "fClusterEt" + fHistogramNameSuffix;
447 fClusterEt = new TH1F(histname.Data(), histname.Data(), 100, 0, 5);
448 fClusterEt->SetXTitle("Number of clusters");
449 fClusterEt->SetYTitle("E_{T} of cluster");
451 histname = "fHistChargedEnergyRemoved" + fHistogramNameSuffix;
452 fHistChargedEnergyRemoved = new TH2D(histname.Data(), histname.Data(), 1000, .0, 30, 100, -0.5 , 99.5);
454 histname = "fHistNeutralEnergyRemoved" + fHistogramNameSuffix;
455 fHistNeutralEnergyRemoved = new TH2D(histname.Data(), histname.Data(), 1000, .0, 30, 100, -0.5 , 99.5);
457 histname = "fHistGammaEnergyAdded" + fHistogramNameSuffix;
458 fHistGammaEnergyAdded = new TH2D(histname.Data(), histname.Data(), 1000, .0, 30, 100, -0.5 , 99.5);
460 fHistMatchedTracksEvspTvsMult = new TH3F("fHistMatchedTracksEvspTvsMult", "fHistMatchedTracksEvspTvsMult",100, 0, 3,100,0,3,10,0,100);
461 fHistMatchedTracksEvspTvsMultEffCorr = new TH3F("fHistMatchedTracksEvspTvsMultEffCorr", "fHistMatchedTracksEvspTvsMultEffCorr",100, 0, 3,100,0,3,10,0,100);
464 histname = "fHistNominalRawEt" + fHistogramNameSuffix;
465 fHistNominalRawEt = new TH2D(histname.Data(), histname.Data(),nbinsEt,minEt,maxEt,20,-0.5,19.5);
466 histname = "fHistNominalNonLinHighEt" + fHistogramNameSuffix;
467 fHistNominalNonLinHighEt = new TH2D(histname.Data(), histname.Data(),nbinsEt,minEt,maxEt,20,-0.5,19.5);
468 histname = "fHistNominalNonLinLowEt" + fHistogramNameSuffix;
469 fHistNominalNonLinLowEt = new TH2D(histname.Data(), histname.Data(),nbinsEt,minEt,maxEt,20,-0.5,19.5);
470 histname = "fHistNominalEffHighEt" + fHistogramNameSuffix;
471 fHistNominalEffHighEt = new TH2D(histname.Data(), histname.Data(),nbinsEt,minEt,maxEt,20,-0.5,19.5);
472 histname = "fHistNominalEffLowEt" + fHistogramNameSuffix;
473 fHistNominalEffLowEt = new TH2D(histname.Data(), histname.Data(),nbinsEt,minEt,maxEt,20,-0.5,19.5);
476 Double_t AliAnalysisEtReconstructed::ApplyModifiedCorrections(const AliESDCaloCluster& cluster,Int_t nonLinCorr, Int_t effCorr)
479 cluster.GetPosition(pos);
481 Double_t corrEnergy = fReCorrections->CorrectedEnergy(cluster.E());
483 Double_t factorNonLin = GetCorrectionModification(cluster, nonLinCorr,effCorr);
485 //std::cout << "Original energy: " << cluster.E() << ", corrected energy: " << corrEnergy << std::endl;
486 return TMath::Sin(cp.Theta())*corrEnergy*factorNonLin;
489 Double_t AliAnalysisEtReconstructed::GetCorrectionModification(const AliESDCaloCluster& cluster,Int_t nonLinCorr, Int_t effCorr){//nonLinCorr 0 = nominal 1 = high -1 = low, effCorr 0 = nominal 1 = high -1 = low
491 cout<<"Warning: This function should not get called!"<<endl;//this statement is basically here to avoid a compilation warning
494 cout<<"Warning: This function should not get called!"<<endl;//this statement is basically here to avoid a compilation warning