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