]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGLF/totEt/AliAnalysisEtReconstructed.cxx
Moving EMCAL track matching functionality to selection class.
[u/mrichter/AliRoot.git] / PWGLF / totEt / AliAnalysisEtReconstructed.cxx
1 //_________________________________________________________________________
2 //  Utility Class for transverse energy studies
3 //  Base class for ESD analysis
4 //  - reconstruction output
5 //  implementation file
6 //
7 //*-- Authors: Oystein Djuvsland (Bergen), David Silvermyr (ORNL)
8 //_________________________________________________________________________
9
10 #include "AliAnalysisEtReconstructed.h"
11 #include "AliAnalysisEtCuts.h"
12 #include "AliESDtrack.h"
13 #include "AliEMCALTrack.h"
14 #include "AliESDCaloCluster.h"
15 #include "TVector3.h"
16 #include "TGeoGlobalMagField.h"
17 #include "AliMagF.h"
18 #include "AliVEvent.h"
19 #include "AliESDEvent.h"
20 #include "AliESDtrackCuts.h"
21 #include "AliVParticle.h"
22 #include "TDatabasePDG.h"
23 #include "TList.h"
24 #include "AliESDpid.h"
25 #include <iostream>
26 #include "TH2F.h"
27 #include "TH2I.h"
28 #include "TH1I.h"
29 #include "TFile.h"
30 #include "AliAnalysisHadEtCorrections.h"
31 #include "AliAnalysisEtSelector.h"
32 #include "AliLog.h"
33 #include "AliCentrality.h"
34 #include "AliPHOSGeoUtils.h"
35 #include "AliPHOSGeometry.h"
36
37
38 using namespace std;
39
40 ClassImp(AliAnalysisEtReconstructed);
41
42
43 AliAnalysisEtReconstructed::AliAnalysisEtReconstructed() :
44         AliAnalysisEt()
45         ,fCorrections(0)
46         ,fPidCut(0)
47         ,fHistChargedPionEnergyDeposit(0)
48         ,fHistProtonEnergyDeposit(0)
49         ,fHistAntiProtonEnergyDeposit(0)
50         ,fHistChargedKaonEnergyDeposit(0)
51         ,fHistMuonEnergyDeposit(0)
52         ,fHistRemovedEnergy(0)
53         ,fGeomCorrection(1.0)
54         ,fEMinCorrection(1.0/0.687)
55         ,fRecEffCorrection(1.0)
56         ,fClusterPosition(0)
57         ,fHistChargedEnergyRemoved(0)
58         ,fHistNeutralEnergyRemoved(0)
59         ,fHistGammaEnergyAdded(0)
60 {
61
62 }
63
64 AliAnalysisEtReconstructed::~AliAnalysisEtReconstructed()
65 {//destructor
66     delete fCorrections;
67     delete fHistChargedPionEnergyDeposit; /** Energy deposited in calorimeter by charged pions */
68     delete fHistProtonEnergyDeposit; /** Energy deposited in calorimeter by protons */
69     delete fHistAntiProtonEnergyDeposit; /** Energy deposited in calorimeter by anti-protons */
70     delete fHistChargedKaonEnergyDeposit; /** Energy deposited in calorimeter by charged kaons */
71     delete fHistMuonEnergyDeposit; /** Energy deposited in calorimeter by muons */
72
73     delete fHistRemovedEnergy; // removed energy
74     delete fClusterPosition;
75     delete fHistChargedEnergyRemoved;
76     delete fHistNeutralEnergyRemoved;
77     delete fHistGammaEnergyAdded;
78
79 }
80
81 Int_t AliAnalysisEtReconstructed::AnalyseEvent(AliVEvent* ev)
82 {
83
84     //AliAnalysisEt::AnalyseEvent(ev);
85     // analyse ESD event
86     ResetEventValues();
87     if (!ev) {
88         AliFatal("ERROR: Event does not exist");
89         return 0;
90     }
91
92     AliESDEvent *event = dynamic_cast<AliESDEvent*>(ev);
93     if (!event) {
94         AliFatal("ERROR: ESD Event does not exist");
95         return 0;
96     }
97     fSelector->SetEvent(event);
98     
99     Int_t cent = -1;
100     if (fCentrality && cent)
101     {
102         cent = fCentrality->GetCentralityClass10("V0M");
103         fCentClass = fCentrality->GetCentralityClass10("V0M");
104     }
105
106     for (Int_t iCluster = 0; iCluster < event->GetNumberOfCaloClusters(); iCluster++)
107     {
108         AliESDCaloCluster* cluster = event->GetCaloCluster(iCluster);
109         if (!cluster)
110         {
111             AliError(Form("ERROR: Could not get cluster %d", iCluster));
112             continue;
113         }
114         int x = 0;
115         fCutFlow->Fill(x++);
116         if(!fSelector->IsDetectorCluster(*cluster)) continue;
117         fCutFlow->Fill(x++);
118         if(!fSelector->PassMinEnergyCut(*cluster)) continue;
119         fCutFlow->Fill(x++);
120         if (!fSelector->PassDistanceToBadChannelCut(*cluster)) continue;
121         fCutFlow->Fill(x++);
122
123         Float_t pos[3];
124
125         cluster->GetPosition(pos);
126         TVector3 cp(pos);
127         
128         Int_t trackMatchedIndex = cluster->GetTrackMatchedIndex();
129
130         Bool_t matched = false;
131
132         
133         matched = !fSelector->PassTrackMatchingCut(*cluster);
134
135         if (matched)
136         {
137           
138             if (cluster->GetNTracksMatched() > 0 && trackMatchedIndex>=0)
139             {
140                 AliVTrack *track = event->GetTrack(trackMatchedIndex);
141                 if (!track) {
142                     AliError("Error: track does not exist");
143                 }
144                 else {
145                     const Double_t *pidWeights = track->PID();
146
147                     Double_t maxpidweight = 0;
148                     Int_t maxpid = 0;
149
150                     if (pidWeights)
151                     {
152                         for (Int_t p =0; p < AliPID::kSPECIES; p++)
153                         {
154                             if (pidWeights[p] > maxpidweight)
155                             {
156                                 maxpidweight = pidWeights[p];
157                                 maxpid = p;
158                             }
159                         }
160                         if (fCuts->GetHistMakeTreeDeposit() && fDepositTree)
161                         {
162                             fEnergyDeposited = cluster->E();
163                             fMomentumTPC = track->P();
164                             fCharge = track->Charge();
165                             fParticlePid = maxpid;
166                             fPidProb = maxpidweight;
167                             AliESDtrack *esdTrack = dynamic_cast<AliESDtrack*>(track);
168                             if (!esdTrack) {
169                                 AliError("Error: track does not exist");
170                             }
171                             else {
172                                 if (esdTrack) fTrackPassedCut = fEsdtrackCutsTPC->AcceptTrack(esdTrack);
173                                 fDepositTree->Fill();
174                             }
175                         }
176
177                         if (maxpidweight > fPidCut)
178                         {
179                             //Float_t dist = TMath::Sqrt(pos[0]*pos[0] + pos[1]*pos[1]);
180
181                             //Float_t theta = TMath::ATan(pos[2]/dist)+TMath::Pi()/2;
182
183                             //Float_t et = cluster->E() * TMath::Sin(theta);
184                             if (maxpid == AliPID::kProton)
185                             {
186
187                                 if (track->Charge() == 1)
188                                 {
189                                     fHistProtonEnergyDeposit->Fill(cluster->E(), track->E());
190                                 }
191                                 else if (track->Charge() == -1)
192                                 {
193                                     fHistAntiProtonEnergyDeposit->Fill(cluster->E(), track->E());
194                                 }
195                             }
196                             else if (maxpid == AliPID::kPion)
197                             {
198                                 fHistChargedPionEnergyDeposit->Fill(cluster->E(), track->E());
199                             }
200                             else if (maxpid == AliPID::kKaon)
201                             {
202                                 fHistChargedKaonEnergyDeposit->Fill(cluster->E(), track->E());
203                             }
204                             else if (maxpid == AliPID::kMuon)
205                             {
206                                 fHistMuonEnergyDeposit->Fill(cluster->E(), track->E());
207                             }
208                         }
209                     }
210                 }
211             }
212             //continue;
213         } // distance
214         else
215         {
216           fCutFlow->Fill(x++);
217           //std::cout << x++ << std::endl;
218
219             //if (cluster->E() >  fSingleCellEnergyCut && cluster->GetNCells() == fCuts->GetCommonSingleCell()) continue;
220             //if (cluster->E() < fClusterEnergyCut) continue;
221             cluster->GetPosition(pos);
222             
223             TVector3 p2(pos);
224             
225             fClusterPosition->Fill(p2.Phi(), p2.PseudoRapidity());
226
227             fTotNeutralEt += CalculateTransverseEnergy(*cluster);
228             fNeutralMultiplicity++;
229         }
230         fMultiplicity++;
231     }
232     
233     fChargedEnergyRemoved = GetChargedContribution(fNeutralMultiplicity);
234     fNeutralEnergyRemoved = GetNeutralContribution(fNeutralMultiplicity);
235     fHistChargedEnergyRemoved->Fill(fChargedEnergyRemoved, fNeutralMultiplicity);
236     fHistNeutralEnergyRemoved->Fill(fNeutralEnergyRemoved, fNeutralMultiplicity);
237     
238     fGammaEnergyAdded = GetGammaContribution(fNeutralMultiplicity);
239     fHistGammaEnergyAdded->Fill(fGammaEnergyAdded, fNeutralMultiplicity);
240
241     Double_t removedEnergy = GetChargedContribution(fNeutralMultiplicity) + GetNeutralContribution(fNeutralMultiplicity) + GetGammaContribution(fNeutralMultiplicity) + GetSecondaryContribution(fNeutralMultiplicity);
242     fHistRemovedEnergy->Fill(removedEnergy);
243     
244     fTotNeutralEt = fGeomCorrection * fEMinCorrection * (fTotNeutralEt - removedEnergy);
245     fTotEt = fTotChargedEt + fTotNeutralEt;
246 // Fill the histograms...0
247     FillHistograms();
248     //std::cout << "fTotNeutralEt: " << fTotNeutralEt << ", Contribution from non-removed charged: " << GetChargedContribution(fNeutralMultiplicity) << ", neutral: " << GetNeutralContribution(fNeutralMultiplicity) << ", gammas: " << GetGammaContribution(fNeutralMultiplicity) << ", multiplicity: " << fNeutralMultiplicity<< std::endl;
249     return 0;
250 }
251
252 bool AliAnalysisEtReconstructed::CheckGoodVertex(AliVParticle* track)
253 { // check vertex
254
255     Float_t bxy = 999.;
256     Float_t bz = 999.;
257     if (!track) {
258         AliError("ERROR: no track");
259         return kFALSE;
260     }
261     AliESDtrack *esdTrack = dynamic_cast<AliESDtrack*>(track);
262     if (!esdTrack) {
263         AliError("ERROR: no track");
264         return kFALSE;
265     }
266     esdTrack->GetImpactParametersTPC(bxy,bz);
267
268
269     bool status = (TMath::Abs(track->Xv()) < fCuts->GetReconstructedVertexXCut()) &&
270                   (TMath::Abs(track->Yv()) < fCuts->GetReconstructedVertexYCut()) &&
271                   (TMath::Abs(track->Zv()) < fCuts->GetReconstructedVertexZCut()) &&
272                   (TMath::Abs(bxy) < fCuts->GetReconstructedIPxyCut()) &&
273                   (TMath::Abs(bz) < fCuts->GetReconstructedIPzCut());
274
275     return status;
276 }
277
278 void AliAnalysisEtReconstructed::Init()
279 { // Init
280     AliAnalysisEt::Init();
281     fPidCut = fCuts->GetReconstructedPidCut();
282     TGeoGlobalMagField::Instance()->SetField(new AliMagF("Maps","Maps", 1., 1., AliMagF::k5kG));
283     if (!fCorrections) {
284         cout<<"Warning!  You have not set corrections.  Your code will crash.  You have to set the corrections."<<endl;
285     }
286 }
287
288 bool AliAnalysisEtReconstructed::TrackHitsCalorimeter(AliVParticle* track, Double_t magField)
289 { // propagate track to detector radius
290
291     if (!track) {
292         cout<<"Warning: track empty"<<endl;
293         return kFALSE;
294     }
295     AliESDtrack *esdTrack= dynamic_cast<AliESDtrack*>(track);
296     if (!esdTrack) {
297         AliError("ERROR: no ESD track");
298         return kFALSE;
299     }
300     // Printf("Propagating track: eta: %f, phi: %f, pt: %f", esdTrack->Eta(), esdTrack->Phi(), esdTrack->Pt());
301
302     Bool_t prop = esdTrack->PropagateTo(fDetectorRadius, magField);
303
304     // if (prop) Printf("Track propagated, eta: %f, phi: %f, pt: %f", esdTrack->Eta(), esdTrack->Phi(), esdTrack->Pt());
305     return prop && fSelector->CutGeometricalAcceptance(*esdTrack);
306 }
307
308 void AliAnalysisEtReconstructed::FillOutputList(TList* list)
309 { // add some extra histograms to the ones from base class
310     AliAnalysisEt::FillOutputList(list);
311
312     list->Add(fHistChargedPionEnergyDeposit);
313     list->Add(fHistProtonEnergyDeposit);
314     list->Add(fHistAntiProtonEnergyDeposit);
315     list->Add(fHistChargedKaonEnergyDeposit);
316     list->Add(fHistMuonEnergyDeposit);
317
318     list->Add(fHistRemovedEnergy);
319     list->Add(fClusterPosition);
320     
321     list->Add(fHistChargedEnergyRemoved);
322     list->Add(fHistNeutralEnergyRemoved);
323     list->Add(fHistGammaEnergyAdded);
324 }
325
326 void AliAnalysisEtReconstructed::CreateHistograms()
327 { // add some extra histograms to the ones from base class
328     AliAnalysisEt::CreateHistograms();
329
330     Int_t nbinsEt = 1000;
331     Double_t minEt = 0;
332     Double_t maxEt = 10;
333
334     // possibly change histogram limits
335     if (fCuts) {
336         nbinsEt = fCuts->GetHistNbinsParticleEt();
337         minEt = fCuts->GetHistMinParticleEt();
338         maxEt = fCuts->GetHistMaxParticleEt();
339     }
340
341     TString histname;
342     histname = "fHistChargedPionEnergyDeposit" + fHistogramNameSuffix;
343     fHistChargedPionEnergyDeposit = new TH2F(histname.Data(), "Energy deposited by #pi^{+/-}", nbinsEt, minEt, maxEt, nbinsEt, minEt, maxEt);
344     fHistChargedPionEnergyDeposit->SetXTitle("Energy deposited in calorimeter");
345     fHistChargedPionEnergyDeposit->SetYTitle("Energy of track");
346
347     histname = "fHistProtonEnergyDeposit" + fHistogramNameSuffix;
348     fHistProtonEnergyDeposit = new TH2F(histname.Data(), "Energy deposited by protons", nbinsEt, minEt, maxEt, nbinsEt, minEt, maxEt);
349     fHistProtonEnergyDeposit->SetXTitle("Energy deposited in calorimeter");
350     fHistProtonEnergyDeposit->SetYTitle("Energy of track");
351
352     histname = "fHistAntiProtonEnergyDeposit" + fHistogramNameSuffix;
353     fHistAntiProtonEnergyDeposit = new TH2F(histname.Data(), "Energy deposited by anti-protons", nbinsEt, minEt, maxEt, nbinsEt, minEt, maxEt);
354     fHistAntiProtonEnergyDeposit->SetXTitle("Energy deposited in calorimeter");
355     fHistAntiProtonEnergyDeposit->SetYTitle("Energy of track");
356
357     histname = "fHistChargedKaonEnergyDeposit" + fHistogramNameSuffix;
358     fHistChargedKaonEnergyDeposit = new TH2F(histname.Data(), "Energy deposited by K^{+/-}", nbinsEt, minEt, maxEt, nbinsEt, minEt, maxEt);
359     fHistChargedKaonEnergyDeposit->SetXTitle("Energy deposited in calorimeter");
360     fHistChargedKaonEnergyDeposit->SetYTitle("Energy of track");
361
362     histname = "fHistMuonEnergyDeposit" + fHistogramNameSuffix;
363     fHistMuonEnergyDeposit = new TH2F(histname.Data(), "Energy deposited by #mu^{+/-}", nbinsEt, minEt, maxEt, nbinsEt, minEt, maxEt);
364     fHistMuonEnergyDeposit->SetXTitle("Energy deposited in calorimeter");
365     fHistMuonEnergyDeposit->SetYTitle("Energy of track");
366
367     histname = "fHistRemovedEnergy" + fHistogramNameSuffix;
368     fHistRemovedEnergy = new TH1F(histname.Data(), histname.Data(), 1000, 0, 20);
369     //fHistMuonEnergyDeposit->SetXTitle("Energy deposited in calorimeter");
370     //fHistMuonEnergyDeposit->SetYTitle("Energy of track");
371
372     histname = "fClusterPosition" + fHistogramNameSuffix;
373     fClusterPosition = new TH2D(histname.Data(), "Position of accepted neutral clusters",1000, -2.0, -.5, 1000, -.13 , 0.13);
374     fClusterPosition->SetXTitle("Energy deposited in calorimeter");
375     fClusterPosition->SetYTitle("Energy of track");
376
377
378     histname = "fHistChargedEnergyRemoved" + fHistogramNameSuffix;
379     fHistChargedEnergyRemoved = new TH2D(histname.Data(), histname.Data(), 1000, .0, 30, 100, -0.5 , 99.5);
380
381     histname = "fHistNeutralEnergyRemoved" + fHistogramNameSuffix;
382     fHistNeutralEnergyRemoved = new TH2D(histname.Data(), histname.Data(), 1000, .0, 30, 100, -0.5 , 99.5);
383
384     histname = "fHistGammaEnergyAdded" + fHistogramNameSuffix;
385     fHistGammaEnergyAdded = new TH2D(histname.Data(), histname.Data(), 1000, .0, 30, 100, -0.5 , 99.5);
386
387
388 }