]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG4/totEt/AliAnalysisEtReconstructed.cxx
increment version number
[u/mrichter/AliRoot.git] / PWG4 / totEt / AliAnalysisEtReconstructed.cxx
CommitLineData
cf6522d1 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//_________________________________________________________________________
2fbf38ac 9
10#include "AliAnalysisEtReconstructed.h"
11#include "AliAnalysisEtCuts.h"
12#include "AliESDtrack.h"
ba136eb4 13#include "AliEMCALTrack.h"
2fbf38ac 14#include "AliESDCaloCluster.h"
15#include "TVector3.h"
ba136eb4 16#include "TGeoGlobalMagField.h"
17#include "AliMagF.h"
2fbf38ac 18#include "AliVEvent.h"
19#include "AliESDEvent.h"
b5821c13 20#include "AliESDtrackCuts.h"
2fbf38ac 21#include "AliVParticle.h"
87efb15c 22#include "TDatabasePDG.h"
23#include "TList.h"
b5821c13 24#include "AliESDpid.h"
2fbf38ac 25#include <iostream>
26#include "TH2F.h"
27
28AliAnalysisEtReconstructed::AliAnalysisEtReconstructed() :
29 AliAnalysisEt()
2fbf38ac 30 ,fTrackDistanceCut(0)
87efb15c 31 ,fPidCut(0)
2fbf38ac 32 ,fClusterType(0)
87efb15c 33 ,fHistChargedPionEnergyDeposit(0)
34 ,fHistProtonEnergyDeposit(0)
35 ,fHistAntiProtonEnergyDeposit(0)
36 ,fHistChargedKaonEnergyDeposit(0)
37 ,fHistMuonEnergyDeposit(0)
2fbf38ac 38{
39
40}
41
cf6522d1 42AliAnalysisEtReconstructed::~AliAnalysisEtReconstructed()
2fbf38ac 43{
cf6522d1 44}
45
46Int_t AliAnalysisEtReconstructed::AnalyseEvent(AliVEvent* ev)
47{ // analyse ESD event
2fbf38ac 48 ResetEventValues();
49 AliESDEvent *event = dynamic_cast<AliESDEvent*>(ev);
50
87efb15c 51 Double_t protonMass = fPdgDB->GetParticle("proton")->Mass();
52
b5821c13 53 AliESDEvent *realEvent = dynamic_cast<AliESDEvent*>(ev);
54 //for PID
55 AliESDpid *pID = new AliESDpid();
56 pID->MakePID(realEvent);
57 TObjArray* list = fEsdtrackCutsTPC->GetAcceptedTracks(realEvent);
58 Int_t nGoodTracks = list->GetEntries();
59 for (Int_t iTrack = 0; iTrack < nGoodTracks; iTrack++)
60 {
61 AliESDtrack *track = dynamic_cast<AliESDtrack*> (list->At(iTrack));
2fbf38ac 62 if (!track)
63 {
64 Printf("ERROR: Could not get track %d", iTrack);
65 continue;
66 }
67
68 fMultiplicity++;
69
b5821c13 70
71 Float_t nSigmaPion,nSigmaProton,nSigmaKaon,nSigmaElectron;
72 nSigmaPion = TMath::Abs(pID->NumberOfSigmasTPC(track,AliPID::kPion));
73 nSigmaProton = TMath::Abs(pID->NumberOfSigmasTPC(track,AliPID::kProton));
74 nSigmaKaon = TMath::Abs(pID->NumberOfSigmasTPC(track,AliPID::kKaon));
75 nSigmaElectron = TMath::Abs(pID->NumberOfSigmasTPC(track,AliPID::kElectron));
76 bool isPion = (nSigmaPion<3.0 && nSigmaProton>2.0 && nSigmaKaon>2.0);
77 bool isElectron = (nSigmaElectron<2.0 && nSigmaPion>4.0 && nSigmaProton>3.0 && nSigmaKaon>3.0);
78 bool isKaon = (nSigmaPion>3.0 && nSigmaProton>2.0 && nSigmaKaon<2.0);
79 bool isProton = (nSigmaPion>3.0 && nSigmaProton<2.0 && nSigmaKaon>2.0);
80
81
2fbf38ac 82 Int_t nItsClusters = dynamic_cast<AliESDtrack*>(track)->GetNcls(0);
83 Int_t nTPCClusters = dynamic_cast<AliESDtrack*>(track)->GetNcls(1);
84
85 Float_t massPart = 0;
86
87 const Double_t *pidWeights = track->PID();
87efb15c 88 Int_t maxpid = -1;
89 Double_t maxpidweight = 0;
90
2fbf38ac 91 if (pidWeights)
92 {
2fbf38ac 93 for (Int_t p =0; p < AliPID::kSPECIES; p++)
94 {
95 if (pidWeights[p] > maxpidweight)
96 {
97 maxpidweight = pidWeights[p];
98 maxpid = p;
99 }
100 }
101 if (maxpid == AliPID::kProton)
102 {
87efb15c 103 //by definition of ET
104 massPart = -protonMass*track->Charge();
2fbf38ac 105 }
106
107 }
108
109 Double_t et = track->E() * TMath::Sin(track->Theta()) + massPart;
cf6522d1 110 // 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
2fbf38ac 111
4998becf 112 if (TMath::Abs(track->Eta()) < fCuts->GetCommonEtaCut() && CheckGoodVertex(track) && nItsClusters > fCuts->GetReconstructedNItsClustersCut() && nTPCClusters > fCuts->GetReconstructedNTpcClustersCut() )
2fbf38ac 113 {
114 fTotChargedEt += et;
115 fChargedMultiplicity++;
87efb15c 116 if (maxpid != -1)
117 {
118 if (maxpid == AliPID::kPion)
119 {
120 fProtonEt += et;
121 }
122 if (maxpid == AliPID::kKaon)
123 {
124 fChargedKaonEt += et;
125 }
126 if (maxpid == AliPID::kMuon)
127 {
128 fMuonEt += et;
129 }
130 if (maxpid == AliPID::kElectron)
131 {
132 fElectronEt += et;
133 }
134 }
2fbf38ac 135
136 if (TMath::Abs(track->Eta()) < fEtaCutAcc && track->Phi() < fPhiCutAccMax && track->Phi() > fPhiCutAccMin)
137 {
138 fTotChargedEtAcc += track->E()*TMath::Sin(track->Theta()) + massPart;
87efb15c 139 if (maxpid != -1)
140 {
141 if (maxpid == AliPID::kPion)
142 {
143 fProtonEtAcc += et;
144 }
145 if (maxpid == AliPID::kKaon)
146 {
147 fChargedKaonEtAcc += et;
148 }
149 if (maxpid == AliPID::kMuon)
150 {
151 fMuonEtAcc += et;
152 }
153 if (maxpid == AliPID::kElectron)
154 {
155 fElectronEtAcc += et;
156 }
157 }
158
2fbf38ac 159 }
160 }
161
2fbf38ac 162 if (TrackHitsCalorimeter(track, event->GetMagneticField()))
163 {
13b0d3c1 164 Double_t phi = track->Phi();
165 Double_t pt = track->Pt();
cf6522d1 166 // printf("Rec track hit: iTrack %03d phi %4.3f pt %4.3f\n", iTrack, phi, pt); // tmp/debug printout
13b0d3c1 167 if (track->Charge() > 0) fHistPhivsPtPos->Fill(phi, pt);
168 else fHistPhivsPtNeg->Fill(phi, pt);
2fbf38ac 169 }
170 }
171
172 for (Int_t iCluster = 0; iCluster < event->GetNumberOfCaloClusters(); iCluster++)
173 {
174 AliESDCaloCluster* cluster = event->GetCaloCluster(iCluster);
175 if (!cluster)
176 {
177 Printf("ERROR: Could not get cluster %d", iCluster);
178 continue;
179 }
180
87efb15c 181 if (cluster->GetType() != fClusterType) continue;
ba136eb4 182 //if(cluster->GetTracksMatched() > 0)
87efb15c 183 //printf("Rec Cluster: iCluster %03d E %4.3f type %d NCells %d, nmatched: %d, distance to closest: %f\n", iCluster, cluster->E(), (int)(cluster->GetType()), cluster->GetNCells(), cluster->GetNTracksMatched(), cluster->GetEmcCpvDistance()); // tmp/debug printout
184
185
2fbf38ac 186 if (cluster->E() < fClusterEnergyCut) continue;
187 Float_t pos[3];
188 TVector3 cp(pos);
189 cluster->GetPosition(pos);
87efb15c 190
ba136eb4 191 Double_t distance = cluster->GetEmcCpvDistance();
192 Int_t trackMatchedIndex = cluster->GetTrackMatchedIndex();
193 if ( cluster->IsEMCAL() ) {
194 distance = CalcTrackClusterDistance(pos, &trackMatchedIndex, event);
195 }
196
197 fHistTMDeltaR->Fill(distance);
198 if (distance < fTrackDistanceCut)
2fbf38ac 199 {
ba136eb4 200 if (cluster->GetNTracksMatched() == 1 && trackMatchedIndex>0)
87efb15c 201 {
ba136eb4 202 AliVTrack *track = event->GetTrack(trackMatchedIndex);
87efb15c 203 const Double_t *pidWeights = track->PID();
204
205 Double_t maxpidweight = 0;
206 Int_t maxpid = 0;
207
208 if (pidWeights)
209 {
210 for (Int_t p =0; p < AliPID::kSPECIES; p++)
211 {
212 if (pidWeights[p] > maxpidweight)
213 {
214 maxpidweight = pidWeights[p];
215 maxpid = p;
216 }
217 }
218 if(maxpidweight > fPidCut)
219 {
220 if(maxpid == AliPID::kProton)
221 {
222 if(track->Charge() == 1)
223 {
224 fHistProtonEnergyDeposit->Fill(cluster->E(), track->E());
225 }
226 else if(track->Charge() == -1)
227 {
228 fHistAntiProtonEnergyDeposit->Fill(cluster->E(), track->E());
229 }
230 }
231 else if(maxpid == AliPID::kPion)
232 {
233 fHistChargedPionEnergyDeposit->Fill(cluster->E(), track->E());
234 }
235 else if(maxpid == AliPID::kKaon)
236 {
237 fHistChargedKaonEnergyDeposit->Fill(cluster->E(), track->E());
238 }
239 else if(maxpid == AliPID::kMuon)
240 {
241 fHistMuonEnergyDeposit->Fill(cluster->E(), track->E());
242 }
243 }
244 }
245 }
246
2fbf38ac 247 continue;
ba136eb4 248 } // distance
2fbf38ac 249
4998becf 250 if (cluster->E() > fSingleCellEnergyCut && cluster->GetNCells() == fCuts->GetCommonSingleCell()) continue;
2fbf38ac 251
252 cluster->GetPosition(pos);
253
254 // TODO: replace with TVector3, too lazy now...
255
256 float dist = TMath::Sqrt(pos[0]*pos[0] + pos[1]*pos[1]);
257
258 float theta = TMath::ATan(pos[2]/dist)+TMath::Pi()/2;
259 // float eta = TMath::Log(TMath::Abs( TMath::Tan( 0.5 * theta ) ) );
260 fTotNeutralEt += cluster->E() * TMath::Sin(theta);
13b0d3c1 261 fNeutralMultiplicity++;
2fbf38ac 262
263 fMultiplicity++;
2fbf38ac 264 }
265
266 fTotNeutralEtAcc = fTotNeutralEt;
267 fTotEt = fTotChargedEt + fTotNeutralEt;
268 fTotEtAcc = fTotChargedEtAcc + fTotNeutralEtAcc;
269
2fbf38ac 270 // Fill the histograms...
271 FillHistograms();
272
273 return 0;
274}
275
276bool AliAnalysisEtReconstructed::CheckGoodVertex(AliVParticle* track)
cf6522d1 277{ // check vertex
2fbf38ac 278
279 Float_t bxy = 999.;
280 Float_t bz = 999.;
281 dynamic_cast<AliESDtrack*>(track)->GetImpactParametersTPC(bxy,bz);
282
4998becf 283 bool status = (TMath::Abs(track->Xv()) < fCuts->GetReconstructedVertexXCut()) &&
284 (TMath::Abs(track->Yv()) < fCuts->GetReconstructedVertexYCut()) &&
285 (TMath::Abs(track->Zv()) < fCuts->GetReconstructedVertexZCut()) &&
286 (TMath::Abs(bxy) < fCuts->GetReconstructedIPxyCut()) &&
287 (TMath::Abs(bz) < fCuts->GetReconstructedIPzCut());
2fbf38ac 288
4998becf 289 return status;
2fbf38ac 290}
291
292void AliAnalysisEtReconstructed::Init()
cf6522d1 293{ // Init
2fbf38ac 294 AliAnalysisEt::Init();
83d0f02c 295 fPidCut = fCuts->GetReconstructedPidCut();
ba136eb4 296 TGeoGlobalMagField::Instance()->SetField(new AliMagF("Maps","Maps", 1., 1., AliMagF::k5kG));
297
2fbf38ac 298}
299
300bool AliAnalysisEtReconstructed::TrackHitsCalorimeter(AliVParticle* track, Double_t magField)
cf6522d1 301{ // propagate track to detector radius
2fbf38ac 302
303 AliESDtrack *esdTrack = dynamic_cast<AliESDtrack*>(track);
cf6522d1 304 // Printf("Propagating track: eta: %f, phi: %f, pt: %f", esdTrack->Eta(), esdTrack->Phi(), esdTrack->Pt());
2fbf38ac 305
306 Bool_t prop = esdTrack->PropagateTo(fDetectorRadius, magField);
307
cf6522d1 308 // if (prop) Printf("Track propagated, eta: %f, phi: %f, pt: %f", esdTrack->Eta(), esdTrack->Phi(), esdTrack->Pt());
2fbf38ac 309 return prop &&
310 TMath::Abs(esdTrack->Eta()) < fEtaCutAcc &&
311 esdTrack->Phi() > fPhiCutAccMin*TMath::Pi()/180. &&
312 esdTrack->Phi() < fPhiCutAccMax*TMath::Pi()/180.;
313}
314
87efb15c 315void AliAnalysisEtReconstructed::FillOutputList(TList* list)
ce546038 316{ // add some extra histograms to the ones from base class
87efb15c 317 AliAnalysisEt::FillOutputList(list);
318
319 list->Add(fHistChargedPionEnergyDeposit);
320 list->Add(fHistProtonEnergyDeposit);
321 list->Add(fHistAntiProtonEnergyDeposit);
322 list->Add(fHistChargedKaonEnergyDeposit);
323 list->Add(fHistMuonEnergyDeposit);
324}
325
326void AliAnalysisEtReconstructed::CreateHistograms()
ce546038 327{ // add some extra histograms to the ones from base class
87efb15c 328 AliAnalysisEt::CreateHistograms();
329
0fa8c632 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
87efb15c 341 TString histname;
342 histname = "fHistChargedPionEnergyDeposit" + fHistogramNameSuffix;
0fa8c632 343 fHistChargedPionEnergyDeposit = new TH2F(histname.Data(), "Energy deposited by #pi^{+/-}", nbinsEt, minEt, maxEt, nbinsEt, minEt, maxEt);
87efb15c 344 fHistChargedPionEnergyDeposit->SetXTitle("Energy deposited in calorimeter");
345 fHistChargedPionEnergyDeposit->SetYTitle("Energy of track");
346
347 histname = "fHistProtonEnergyDeposit" + fHistogramNameSuffix;
0fa8c632 348 fHistProtonEnergyDeposit = new TH2F(histname.Data(), "Energy deposited by protons", nbinsEt, minEt, maxEt, nbinsEt, minEt, maxEt);
87efb15c 349 fHistProtonEnergyDeposit->SetXTitle("Energy deposited in calorimeter");
350 fHistProtonEnergyDeposit->SetYTitle("Energy of track");
351
352 histname = "fHistAntiProtonEnergyDeposit" + fHistogramNameSuffix;
0fa8c632 353 fHistAntiProtonEnergyDeposit = new TH2F(histname.Data(), "Energy deposited by anti-protons", nbinsEt, minEt, maxEt, nbinsEt, minEt, maxEt);
87efb15c 354 fHistAntiProtonEnergyDeposit->SetXTitle("Energy deposited in calorimeter");
355 fHistAntiProtonEnergyDeposit->SetYTitle("Energy of track");
356
357 histname = "fHistChargedKaonEnergyDeposit" + fHistogramNameSuffix;
0fa8c632 358 fHistChargedKaonEnergyDeposit = new TH2F(histname.Data(), "Energy deposited by K^{+/-}", nbinsEt, minEt, maxEt, nbinsEt, minEt, maxEt);
87efb15c 359 fHistChargedKaonEnergyDeposit->SetXTitle("Energy deposited in calorimeter");
360 fHistChargedKaonEnergyDeposit->SetYTitle("Energy of track");
361
362 histname = "fHistMuonEnergyDeposit" + fHistogramNameSuffix;
0fa8c632 363 fHistMuonEnergyDeposit = new TH2F(histname.Data(), "Energy deposited by #mu^{+/-}", nbinsEt, minEt, maxEt, nbinsEt, minEt, maxEt);
87efb15c 364 fHistMuonEnergyDeposit->SetXTitle("Energy deposited in calorimeter");
365 fHistMuonEnergyDeposit->SetYTitle("Energy of track");
366
367
368}
ba136eb4 369
370Double_t
ce546038 371AliAnalysisEtReconstructed::CalcTrackClusterDistance(const Float_t clsPos[3],
ba136eb4 372 Int_t *trkMatchId,
ce546038 373 const AliESDEvent *event)
ba136eb4 374{ // calculate distance between cluster and closest track
375
376 Double_t trkPos[3] = {0,0,0};
377
378 Int_t bestTrkMatchId = -1;
379 Double_t distance = 9999; // init to a big number
380
381 Double_t dist = 0;
382 Double_t distX = 0, distY = 0, distZ = 0;
383
384 for (Int_t iTrack = 0; iTrack < event->GetNumberOfTracks(); iTrack++) {
385 AliESDtrack *track = event->GetTrack(iTrack);
386 if (!track) {
387 Printf("ERROR: Could not get track %d", iTrack);
388 continue;
389 }
390
391 // check for approx. eta and phi range before we propagate..
392 // TBD
393
394 AliEMCALTrack *emctrack = new AliEMCALTrack(*track);
395 if (!emctrack->PropagateToGlobal(clsPos[0],clsPos[1],clsPos[2],0.,0.) ) {
396 continue;
397 }
398 emctrack->GetXYZ(trkPos);
399 if (emctrack) delete emctrack;
400
401 distX = clsPos[0]-trkPos[0];
402 distY = clsPos[1]-trkPos[1];
403 distZ = clsPos[2]-trkPos[2];
404 dist = TMath::Sqrt(distX*distX + distY*distY + distZ*distZ);
405
406 if (dist < distance) {
407 distance = dist;
408 bestTrkMatchId = iTrack;
409 }
410 } // iTrack
411
412 // printf("CalcTrackClusterDistance: bestTrkMatch %d origTrkMatch %d distance %f\n", bestTrkMatchId, *trkMatchId, distance);
413 *trkMatchId = bestTrkMatchId;
414 return distance;
415}