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