]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG4/totEt/AliAnalysisEtReconstructed.cxx
coverity fix - checked fCentrality before usage
[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"
964c8159 27#include "AliAnalysisHadEtCorrections.h"
0f6416f3 28#include "AliLog.h"
e9da35da 29#include "AliCentrality.h"
0f6416f3 30
31
32
2fbf38ac 33
16abb579 34using namespace std;
35
36ClassImp(AliAnalysisEtReconstructed);
37
38
2fbf38ac 39AliAnalysisEtReconstructed::AliAnalysisEtReconstructed() :
40 AliAnalysisEt()
e9da35da 41 ,fCorrections(0)
87efb15c 42 ,fPidCut(0)
2fbf38ac 43 ,fClusterType(0)
87efb15c 44 ,fHistChargedPionEnergyDeposit(0)
45 ,fHistProtonEnergyDeposit(0)
46 ,fHistAntiProtonEnergyDeposit(0)
47 ,fHistChargedKaonEnergyDeposit(0)
48 ,fHistMuonEnergyDeposit(0)
476828ae 49 ,fHistRemovedEnergy(0)
e9da35da 50 ,fGeomCorrection(1.0)
51 ,fEMinCorrection(1.0)
2fbf38ac 52{
53
54}
55
e9da35da 56AliAnalysisEtReconstructed::~AliAnalysisEtReconstructed()
2fbf38ac 57{
e9da35da 58 delete fCorrections;
cf6522d1 59}
60
61Int_t AliAnalysisEtReconstructed::AnalyseEvent(AliVEvent* ev)
e9da35da 62{
63 // analyse ESD event
2fbf38ac 64 ResetEventValues();
743ce29f 65
e9da35da 66 if (!ev) {
67 AliFatal("ERROR: Event does not exist");
68 return 0;
69 }
70
2fbf38ac 71 AliESDEvent *event = dynamic_cast<AliESDEvent*>(ev);
e9da35da 72 if (!event) {
73 AliFatal("ERROR: ESD Event does not exist");
74 return 0;
ec956c46 75 }
2fbf38ac 76
743ce29f 77 Int_t cent = -1;
78 if (fCentrality)
79 {
80 cent = fCentrality->GetCentralityClass10("V0M");
81 fCentClass = fCentrality->GetCentralityClass10("V0M");
82 }
83
7d2d1773 84 Double_t protonMass = fgProtonMass;
87efb15c 85
b5821c13 86 //for PID
43056f1b 87 AliESDpid pID;
88 pID.MakePID(event);
6ad010c1 89 TObjArray* list = fEsdtrackCutsTPC->GetAcceptedTracks(event);
43056f1b 90
b5821c13 91 Int_t nGoodTracks = list->GetEntries();
6ad010c1 92 // printf("nGoodTracks %d nCaloClusters %d\n", nGoodTracks, event->GetNumberOfCaloClusters());
93
b5821c13 94 for (Int_t iTrack = 0; iTrack < nGoodTracks; iTrack++)
e9da35da 95 {
96 AliESDtrack *track = dynamic_cast<AliESDtrack*> (list->At(iTrack));
2fbf38ac 97 if (!track)
98 {
e9da35da 99 AliError(Form("ERROR: Could not get track %d", iTrack));
100 continue;
2fbf38ac 101 }
102
103 fMultiplicity++;
104
b5821c13 105
e9da35da 106 Float_t nSigmaPion,nSigmaProton,nSigmaKaon,nSigmaElectron;
107 nSigmaPion = TMath::Abs(pID.NumberOfSigmasTPC(track,AliPID::kPion));
108 nSigmaProton = TMath::Abs(pID.NumberOfSigmasTPC(track,AliPID::kProton));
109 nSigmaKaon = TMath::Abs(pID.NumberOfSigmasTPC(track,AliPID::kKaon));
110 nSigmaElectron = TMath::Abs(pID.NumberOfSigmasTPC(track,AliPID::kElectron));
111 /*
112 bool isPion = (nSigmaPion<3.0 && nSigmaProton>2.0 && nSigmaKaon>2.0);
113 bool isElectron = (nSigmaElectron<2.0 && nSigmaPion>4.0 && nSigmaProton>3.0 && nSigmaKaon>3.0);
114 bool isKaon = (nSigmaPion>3.0 && nSigmaProton>2.0 && nSigmaKaon<2.0);
115 bool isProton = (nSigmaPion>3.0 && nSigmaProton<2.0 && nSigmaKaon>2.0);
116 */
b5821c13 117
2fbf38ac 118 Int_t nItsClusters = dynamic_cast<AliESDtrack*>(track)->GetNcls(0);
119 Int_t nTPCClusters = dynamic_cast<AliESDtrack*>(track)->GetNcls(1);
120
121 Float_t massPart = 0;
122
123 const Double_t *pidWeights = track->PID();
e9da35da 124 Int_t maxpid = -1;
87efb15c 125 Double_t maxpidweight = 0;
e9da35da 126
2fbf38ac 127 if (pidWeights)
128 {
2fbf38ac 129 for (Int_t p =0; p < AliPID::kSPECIES; p++)
130 {
131 if (pidWeights[p] > maxpidweight)
132 {
133 maxpidweight = pidWeights[p];
134 maxpid = p;
135 }
136 }
137 if (maxpid == AliPID::kProton)
138 {
e9da35da 139 //by definition of ET
140 massPart = -protonMass*track->Charge();
2fbf38ac 141 }
142
143 }
144
145 Double_t et = track->E() * TMath::Sin(track->Theta()) + massPart;
e9da35da 146
147 fSparseTracks[0] = maxpid;
148 fSparseTracks[1] = track->Charge();
149 fSparseTracks[2] = track->M();
150 fSparseTracks[3] = et;
151 fSparseTracks[4] = track->Pt();
152 fSparseTracks[5] = track->Eta();
153 fSparseTracks[6] = cent;
154 fSparseHistTracks->Fill(fSparseTracks);
155 //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 156
4998becf 157 if (TMath::Abs(track->Eta()) < fCuts->GetCommonEtaCut() && CheckGoodVertex(track) && nItsClusters > fCuts->GetReconstructedNItsClustersCut() && nTPCClusters > fCuts->GetReconstructedNTpcClustersCut() )
2fbf38ac 158 {
e9da35da 159 fTotChargedEt += et;
2fbf38ac 160 fChargedMultiplicity++;
e9da35da 161 if (maxpid != -1)
87efb15c 162 {
43056f1b 163 if (maxpid == AliPID::kProton)
87efb15c 164 {
165 fProtonEt += et;
166 }
43056f1b 167 if (maxpid == AliPID::kPion)
168 {
169 fPionEt += et;
170 }
87efb15c 171 if (maxpid == AliPID::kKaon)
172 {
173 fChargedKaonEt += et;
174 }
175 if (maxpid == AliPID::kMuon)
176 {
177 fMuonEt += et;
178 }
179 if (maxpid == AliPID::kElectron)
180 {
181 fElectronEt += et;
182 }
183 }
2fbf38ac 184
185 if (TMath::Abs(track->Eta()) < fEtaCutAcc && track->Phi() < fPhiCutAccMax && track->Phi() > fPhiCutAccMin)
186 {
187 fTotChargedEtAcc += track->E()*TMath::Sin(track->Theta()) + massPart;
e9da35da 188 if (maxpid != -1)
87efb15c 189 {
43056f1b 190 if (maxpid == AliPID::kProton)
87efb15c 191 {
192 fProtonEtAcc += et;
193 }
43056f1b 194 if (maxpid == AliPID::kPion)
195 {
196 fPionEtAcc += et;
197 }
87efb15c 198 if (maxpid == AliPID::kKaon)
199 {
200 fChargedKaonEtAcc += et;
201 }
202 if (maxpid == AliPID::kMuon)
203 {
204 fMuonEtAcc += et;
205 }
206 if (maxpid == AliPID::kElectron)
207 {
208 fElectronEtAcc += et;
209 }
210 }
e9da35da 211
2fbf38ac 212 }
213 }
214
2fbf38ac 215 if (TrackHitsCalorimeter(track, event->GetMagneticField()))
216 {
e9da35da 217 Double_t phi = track->Phi();
218 Double_t pt = track->Pt();
219 // printf("Rec track hit: iTrack %03d phi %4.3f pt %4.3f\n", iTrack, phi, pt); // tmp/debug printout
220 if (track->Charge() > 0) fHistPhivsPtPos->Fill(phi, pt);
221 else fHistPhivsPtNeg->Fill(phi, pt);
2fbf38ac 222 }
e9da35da 223 }
2fbf38ac 224
225 for (Int_t iCluster = 0; iCluster < event->GetNumberOfCaloClusters(); iCluster++)
226 {
227 AliESDCaloCluster* cluster = event->GetCaloCluster(iCluster);
228 if (!cluster)
229 {
e9da35da 230 AliError(Form("ERROR: Could not get cluster %d", iCluster));
2fbf38ac 231 continue;
232 }
e9da35da 233 if (cluster->GetType() != fClusterType) continue;
234
235 //if(cluster->GetTracksMatched() > 0)
236// printf("Rec Cluster: iCluster %03d E %4.3f type %.qd NCells %d, nmatched: %d, distance to closest: %f\n", iCluster, cluster->E(), (int)(cluster->GetType()), cluster->GetNCells(), cluster->GetNTracksMatched(), cluster->GetEmcCpvDistance()); // tmp/debug printout
237
2fbf38ac 238
2fbf38ac 239 if (cluster->E() < fClusterEnergyCut) continue;
e9da35da 240
2fbf38ac 241 Float_t pos[3];
e9da35da 242
2fbf38ac 243 cluster->GetPosition(pos);
e9da35da 244 TVector3 cp(pos);
245
246 Double_t distance = cluster->GetEmcCpvDistance();
247 Int_t trackMatchedIndex = cluster->GetTrackMatchedIndex();
248 if ( cluster->IsEMCAL() ) {
249 distance = CalcTrackClusterDistance(pos, &trackMatchedIndex, event);
250 }
87efb15c 251
e9da35da 252 fSparseClusters[0] = 0;
253 fSparseClusters[1] = 0;
254 fSparseClusters[2] = 0;
255 fSparseClusters[6] = 0;
256 fSparseClusters[7] = 0;
257 fSparseClusters[8] = 0;
258 fSparseClusters[9] = cent;
259 fSparseClusters[10] = 0;
ba136eb4 260
e9da35da 261
262 if (cluster->GetNTracksMatched() > 0 && trackMatchedIndex > -1)
2fbf38ac 263 {
e9da35da 264 AliVTrack *tmptrack = event->GetTrack(trackMatchedIndex);
265 if (!tmptrack)
87efb15c 266 {
e9da35da 267 AliError("Error: track does not exist");
268 return -1;
269 }
270 const Double_t *pidWeights = tmptrack->PID();
271
272 Double_t maxpidweight = 0;
273 Int_t maxpid = 0;
274 Double_t massPart = 0;
275 if (pidWeights)
276 {
277 for (Int_t p =0; p < AliPID::kSPECIES; p++)
278 {
279 if (pidWeights[p] > maxpidweight)
280 {
281 maxpidweight = pidWeights[p];
282 maxpid = p;
283 }
284 }
285 if (maxpid == AliPID::kProton)
286 {
287 //by definition of ET
288 massPart = -protonMass*tmptrack->Charge();
87efb15c 289 }
290 }
e9da35da 291 fSparseClusters[0] = maxpid;
292 fSparseClusters[1] = tmptrack->Charge();
293 fSparseClusters[2] = tmptrack->M();
294 fSparseClusters[6] = tmptrack->E() * TMath::Sin(tmptrack->Theta()) + massPart;;
295 fSparseClusters[7] = tmptrack->Pt();
296 fSparseClusters[8] = tmptrack->Eta();
297 }
87efb15c 298
e9da35da 299 fSparseClusters[10] = distance;
300
301 fHistTMDeltaR->Fill(distance);
302 fHistTMDxDz->Fill(cluster->GetTrackDx(), cluster->GetTrackDz());
303
476828ae 304// Float_t clusteret = cluster->E() * TMath::Sin(cp.Theta());
e9da35da 305
306 Bool_t matched = false;
307
308 if (cluster->IsEMCAL()) matched = distance < fTrackDistanceCut;
309 else matched = (TMath::Abs(cluster->GetTrackDx()) < fTrackDxCut && TMath::Abs(cluster->GetTrackDz()) < fTrackDzCut);
310
311 if (matched)
312 {
313 if (cluster->GetNTracksMatched() > 0 && trackMatchedIndex>=0)
314 {
315 AliVTrack *track = event->GetTrack(trackMatchedIndex);
316 if (!track) {
317 AliError("Error: track does not exist");
318 }
319 else {
320 const Double_t *pidWeights = track->PID();
321
322 Double_t maxpidweight = 0;
323 Int_t maxpid = 0;
324
325 if (pidWeights)
326 {
327 for (Int_t p =0; p < AliPID::kSPECIES; p++)
328 {
329 if (pidWeights[p] > maxpidweight)
330 {
331 maxpidweight = pidWeights[p];
332 maxpid = p;
333 }
334 }
335 if (fCuts->GetHistMakeTreeDeposit() && fTreeDeposit)
336 {
337 fEnergyDeposited = cluster->E();
338 fEnergyTPC = track->E();
339 fCharge = track->Charge();
340 fParticlePid = maxpid;
341 fPidProb = maxpidweight;
342 AliESDtrack *esdTrack = dynamic_cast<AliESDtrack*>(track);
343 if (!esdTrack) {
344 AliError("Error: track does not exist");
345 }
346 else {
347 if (esdTrack) fTrackPassedCut = fEsdtrackCutsTPC->AcceptTrack(esdTrack);
348 fTreeDeposit->Fill();
349 }
350 }
351
352 if (maxpidweight > fPidCut)
353 {
354 Float_t dist = TMath::Sqrt(pos[0]*pos[0] + pos[1]*pos[1]);
355
356 Float_t theta = TMath::ATan(pos[2]/dist)+TMath::Pi()/2;
357
358 Float_t et = cluster->E() * TMath::Sin(theta);
359 if (maxpid == AliPID::kProton)
360 {
361
362 if (track->Charge() == 1)
363 {
364 fBaryonEt += et;
365 fHistProtonEnergyDeposit->Fill(cluster->E(), track->E());
366 }
367 else if (track->Charge() == -1)
368 {
369 fAntiBaryonEt += et;
370 fHistAntiProtonEnergyDeposit->Fill(cluster->E(), track->E());
371 }
372 }
373 else if (maxpid == AliPID::kPion)
374 {
375 fMesonEt += et;
376 fHistChargedPionEnergyDeposit->Fill(cluster->E(), track->E());
377 }
378 else if (maxpid == AliPID::kKaon)
379 {
380 fMesonEt += et;
381 fHistChargedKaonEnergyDeposit->Fill(cluster->E(), track->E());
382 }
383 else if (maxpid == AliPID::kMuon)
384 {
385 fHistMuonEnergyDeposit->Fill(cluster->E(), track->E());
386 }
387 }
388 }
389 }
390 }
391 //continue;
ba136eb4 392 } // distance
e9da35da 393 else
394 {
395 fSparseClusters[0] = AliPID::kPhoton;
396 fSparseClusters[1] = 0;
397
398 if (cluster->E() > fSingleCellEnergyCut && cluster->GetNCells() == fCuts->GetCommonSingleCell()) continue;
399 if (cluster->E() < fClusterEnergyCut) continue;
400 cluster->GetPosition(pos);
2fbf38ac 401
e9da35da 402 // TODO: replace with TVector3, too lazy now...
403
404 float dist = TMath::Sqrt(pos[0]*pos[0] + pos[1]*pos[1]);
405
406 float theta = TMath::ATan(pos[2]/dist)+TMath::Pi()/2;
407 // float eta = TMath::Log(TMath::Abs( TMath::Tan( 0.5 * theta ) ) );
408 fTotNeutralEt += cluster->E() * TMath::Sin(theta);
409 fNeutralMultiplicity++;
410 }
2fbf38ac 411
412 cluster->GetPosition(pos);
2fbf38ac 413
e9da35da 414 // TODO: replace with TVector3
2fbf38ac 415
e9da35da 416 float dist = TMath::Sqrt(pos[0]*pos[0] + pos[1]*pos[1]);
2fbf38ac 417 float theta = TMath::ATan(pos[2]/dist)+TMath::Pi()/2;
e9da35da 418 float eta = TMath::Log(TMath::Abs( TMath::Tan( 0.5 * theta ) ) );
419 fSparseClusters[3] = cluster->E() * TMath::Sin(theta);
420 fSparseClusters[4] = cluster->E();
421 fSparseClusters[5] = eta;
422
423 fSparseHistClusters->Fill(fSparseClusters);
2fbf38ac 424
425 fMultiplicity++;
2fbf38ac 426 }
e9da35da 427 Double_t removedEnergy = GetChargedContribution(fNeutralMultiplicity) + GetNeutralContribution(fNeutralMultiplicity) - GetGammaContribution(fNeutralMultiplicity);
428 fHistRemovedEnergy->Fill(removedEnergy);
429// std::cout << "fTotNeutralEt: " << fTotNeutralEt << ", Contribution from non-removed charged: " << GetChargedContribution(fNeutralMultiplicity) << ", neutral: " << GetNeutralContribution(fNeutralMultiplicity) << ", gammas: " << GetGammaContribution(fNeutralMultiplicity) << ", multiplicity: " << fNeutralMultiplicity<< std::endl;
430 fTotNeutralEt = fGeomCorrection * fEMinCorrection * fTotNeutralEt - removedEnergy;
431 fTotNeutralEtAcc = fTotNeutralEt/fGeomCorrection;
2fbf38ac 432 fTotEt = fTotChargedEt + fTotNeutralEt;
433 fTotEtAcc = fTotChargedEtAcc + fTotNeutralEtAcc;
e9da35da 434 fSparseEt[0] = fTotEt;
435 fSparseEt[1] = fTotNeutralEt;
436 fSparseEt[2] = fTotChargedEtAcc;
437 fSparseEt[3] = fMultiplicity;
438 fSparseEt[4] = fNeutralMultiplicity;
439 fSparseEt[5] = fChargedMultiplicity;
440 fSparseEt[6] = cent;
2fbf38ac 441 // Fill the histograms...
442 FillHistograms();
443
444 return 0;
445}
446
447bool AliAnalysisEtReconstructed::CheckGoodVertex(AliVParticle* track)
cf6522d1 448{ // check vertex
2fbf38ac 449
450 Float_t bxy = 999.;
451 Float_t bz = 999.;
e9da35da 452 if (!track) {
453 AliError("ERROR: no track");
454 return kFALSE;
ec956c46 455 }
1b8c3d66 456 AliESDtrack *esdTrack = dynamic_cast<AliESDtrack*>(track);
e9da35da 457 if (!esdTrack) {
458 AliError("ERROR: no track");
459 return kFALSE;
1b8c3d66 460 }
461 esdTrack->GetImpactParametersTPC(bxy,bz);
ec956c46 462
2fbf38ac 463
e9da35da 464 bool status = (TMath::Abs(track->Xv()) < fCuts->GetReconstructedVertexXCut()) &&
465 (TMath::Abs(track->Yv()) < fCuts->GetReconstructedVertexYCut()) &&
466 (TMath::Abs(track->Zv()) < fCuts->GetReconstructedVertexZCut()) &&
467 (TMath::Abs(bxy) < fCuts->GetReconstructedIPxyCut()) &&
468 (TMath::Abs(bz) < fCuts->GetReconstructedIPzCut());
2fbf38ac 469
4998becf 470 return status;
2fbf38ac 471}
472
473void AliAnalysisEtReconstructed::Init()
cf6522d1 474{ // Init
2fbf38ac 475 AliAnalysisEt::Init();
83d0f02c 476 fPidCut = fCuts->GetReconstructedPidCut();
ba136eb4 477 TGeoGlobalMagField::Instance()->SetField(new AliMagF("Maps","Maps", 1., 1., AliMagF::k5kG));
e9da35da 478 if (!fCorrections) {
479 cout<<"Warning! You have not set corrections. Your code will crash. You have to set the corrections."<<endl;
0f97be4c 480 }
2fbf38ac 481}
482
483bool AliAnalysisEtReconstructed::TrackHitsCalorimeter(AliVParticle* track, Double_t magField)
cf6522d1 484{ // propagate track to detector radius
2fbf38ac 485
e9da35da 486 if (!track) {
487 cout<<"Warning: track empty"<<endl;
488 return kFALSE;
489 }
490 AliESDtrack *esdTrack= dynamic_cast<AliESDtrack*>(track);
491 if (!esdTrack) {
492 AliError("ERROR: no ESD track");
493 return kFALSE;
494 }
495 // Printf("Propagating track: eta: %f, phi: %f, pt: %f", esdTrack->Eta(), esdTrack->Phi(), esdTrack->Pt());
2fbf38ac 496
497 Bool_t prop = esdTrack->PropagateTo(fDetectorRadius, magField);
498
cf6522d1 499 // if (prop) Printf("Track propagated, eta: %f, phi: %f, pt: %f", esdTrack->Eta(), esdTrack->Phi(), esdTrack->Pt());
e9da35da 500 return prop &&
501 TMath::Abs(esdTrack->Eta()) < fEtaCutAcc &&
502 esdTrack->Phi() > fPhiCutAccMin*TMath::Pi()/180. &&
503 esdTrack->Phi() < fPhiCutAccMax*TMath::Pi()/180.;
2fbf38ac 504}
505
87efb15c 506void AliAnalysisEtReconstructed::FillOutputList(TList* list)
ce546038 507{ // add some extra histograms to the ones from base class
87efb15c 508 AliAnalysisEt::FillOutputList(list);
509
510 list->Add(fHistChargedPionEnergyDeposit);
511 list->Add(fHistProtonEnergyDeposit);
512 list->Add(fHistAntiProtonEnergyDeposit);
513 list->Add(fHistChargedKaonEnergyDeposit);
514 list->Add(fHistMuonEnergyDeposit);
e9da35da 515
516 list->Add(fHistRemovedEnergy);
87efb15c 517}
518
519void AliAnalysisEtReconstructed::CreateHistograms()
ce546038 520{ // add some extra histograms to the ones from base class
87efb15c 521 AliAnalysisEt::CreateHistograms();
522
0fa8c632 523 Int_t nbinsEt = 1000;
524 Double_t minEt = 0;
525 Double_t maxEt = 10;
526
527 // possibly change histogram limits
528 if (fCuts) {
e9da35da 529 nbinsEt = fCuts->GetHistNbinsParticleEt();
530 minEt = fCuts->GetHistMinParticleEt();
531 maxEt = fCuts->GetHistMaxParticleEt();
0fa8c632 532 }
533
87efb15c 534 TString histname;
535 histname = "fHistChargedPionEnergyDeposit" + fHistogramNameSuffix;
0fa8c632 536 fHistChargedPionEnergyDeposit = new TH2F(histname.Data(), "Energy deposited by #pi^{+/-}", nbinsEt, minEt, maxEt, nbinsEt, minEt, maxEt);
87efb15c 537 fHistChargedPionEnergyDeposit->SetXTitle("Energy deposited in calorimeter");
538 fHistChargedPionEnergyDeposit->SetYTitle("Energy of track");
e9da35da 539
87efb15c 540 histname = "fHistProtonEnergyDeposit" + fHistogramNameSuffix;
0fa8c632 541 fHistProtonEnergyDeposit = new TH2F(histname.Data(), "Energy deposited by protons", nbinsEt, minEt, maxEt, nbinsEt, minEt, maxEt);
87efb15c 542 fHistProtonEnergyDeposit->SetXTitle("Energy deposited in calorimeter");
543 fHistProtonEnergyDeposit->SetYTitle("Energy of track");
e9da35da 544
87efb15c 545 histname = "fHistAntiProtonEnergyDeposit" + fHistogramNameSuffix;
0fa8c632 546 fHistAntiProtonEnergyDeposit = new TH2F(histname.Data(), "Energy deposited by anti-protons", nbinsEt, minEt, maxEt, nbinsEt, minEt, maxEt);
87efb15c 547 fHistAntiProtonEnergyDeposit->SetXTitle("Energy deposited in calorimeter");
548 fHistAntiProtonEnergyDeposit->SetYTitle("Energy of track");
e9da35da 549
87efb15c 550 histname = "fHistChargedKaonEnergyDeposit" + fHistogramNameSuffix;
0fa8c632 551 fHistChargedKaonEnergyDeposit = new TH2F(histname.Data(), "Energy deposited by K^{+/-}", nbinsEt, minEt, maxEt, nbinsEt, minEt, maxEt);
87efb15c 552 fHistChargedKaonEnergyDeposit->SetXTitle("Energy deposited in calorimeter");
553 fHistChargedKaonEnergyDeposit->SetYTitle("Energy of track");
e9da35da 554
87efb15c 555 histname = "fHistMuonEnergyDeposit" + fHistogramNameSuffix;
0fa8c632 556 fHistMuonEnergyDeposit = new TH2F(histname.Data(), "Energy deposited by #mu^{+/-}", nbinsEt, minEt, maxEt, nbinsEt, minEt, maxEt);
87efb15c 557 fHistMuonEnergyDeposit->SetXTitle("Energy deposited in calorimeter");
558 fHistMuonEnergyDeposit->SetYTitle("Energy of track");
e9da35da 559
560 histname = "fHistRemovedEnergy" + fHistogramNameSuffix;
561 fHistRemovedEnergy = new TH1F(histname.Data(), histname.Data(), 1000, 0, 20);
562 //fHistMuonEnergyDeposit->SetXTitle("Energy deposited in calorimeter");
563 //fHistMuonEnergyDeposit->SetYTitle("Energy of track");
564
565
87efb15c 566
567}
ba136eb4 568
e9da35da 569Double_t
ce546038 570AliAnalysisEtReconstructed::CalcTrackClusterDistance(const Float_t clsPos[3],
e9da35da 571 Int_t *trkMatchId,
572 const AliESDEvent *event)
ba136eb4 573{ // calculate distance between cluster and closest track
574
e9da35da 575 Double_t trkPos[3] = {0,0,0};
ba136eb4 576
e9da35da 577 Int_t bestTrkMatchId = -1;
578 Double_t distance = 9999; // init to a big number
ba136eb4 579
e9da35da 580 Double_t dist = 0;
581 Double_t distX = 0, distY = 0, distZ = 0;
ba136eb4 582
e9da35da 583 for (Int_t iTrack = 0; iTrack < event->GetNumberOfTracks(); iTrack++) {
584 AliESDtrack *track = event->GetTrack(iTrack);
585 if (!track) {
586 AliError(Form("ERROR: Could not get track %d", iTrack));
587 continue;
588 }
ba136eb4 589
e9da35da 590 // check for approx. eta and phi range before we propagate..
591 // TBD
ba136eb4 592
e9da35da 593 AliEMCALTrack *emctrack = new AliEMCALTrack(*track);
594 if (!emctrack->PropagateToGlobal(clsPos[0],clsPos[1],clsPos[2],0.,0.) ) {
595 continue;
596 }
597 emctrack->GetXYZ(trkPos);
598 delete emctrack;
ba136eb4 599
e9da35da 600 distX = clsPos[0]-trkPos[0];
601 distY = clsPos[1]-trkPos[1];
602 distZ = clsPos[2]-trkPos[2];
603 dist = TMath::Sqrt(distX*distX + distY*distY + distZ*distZ);
ba136eb4 604
e9da35da 605 if (dist < distance) {
606 distance = dist;
607 bestTrkMatchId = iTrack;
608 }
609 } // iTrack
610
611 // printf("CalcTrackClusterDistance: bestTrkMatch %d origTrkMatch %d distance %f\n", bestTrkMatchId, *trkMatchId, distance);
612 *trkMatchId = bestTrkMatchId;
613 return distance;
ba136eb4 614}
e9da35da 615