]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG4/PartCorrBase/AliCaloTrackAODReader.cxx
Move GetModuleNumberXXX methods from QA analysis to a common place for other analysis...
[u/mrichter/AliRoot.git] / PWG4 / PartCorrBase / AliCaloTrackAODReader.cxx
CommitLineData
1c5acb87 1
2/**************************************************************************
3 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * *
5 * Author: The ALICE Off-line Project. *
6 * Contributors are mentioned in the code where appropriate. *
7 * *
8 * Permission to use, copy, modify and distribute this software and its *
9 * documentation strictly for non-commercial purposes is hereby granted *
10 * without fee, provided that the above copyright notice appears in all *
11 * copies and that both the copyright notice and this permission notice *
12 * appear in the supporting documentation. The authors make no claims *
13 * about the suitability of this software for any purpose. It is *
14 * provided "as is" without express or implied warranty. *
15 **************************************************************************/
16/* $Id: $ */
17
18//_________________________________________________________________________
19// Class for reading data (AODs) in order to do prompt gamma
591cc579 20// or other particle identification and correlations.
21// Mixing analysis can be done, input AOD with events
22// is opened in the AliCaloTrackReader::Init()
1c5acb87 23//
24//
25//*-- Author: Gustavo Conesa (LNF-INFN)
26//////////////////////////////////////////////////////////////////////////////
27
28
29// --- ROOT system ---
30//#include "Riostream.h"
31
32//---- ANALYSIS system ----
33#include "AliCaloTrackAODReader.h"
1c5acb87 34#include "AliAODCaloCluster.h"
35#include "AliAODTrack.h"
591cc579 36#include "AliESDtrack.h"
ff45398a 37#include "AliFiducialCut.h"
8a587055 38#include "AliAODInputHandler.h"
39#include "AliAnalysisManager.h"
1c5acb87 40
41ClassImp(AliCaloTrackAODReader)
42
43//____________________________________________________________________________
44AliCaloTrackAODReader::AliCaloTrackAODReader() :
08a064bc 45 AliCaloTrackReader(), fWriteOutputStdAOD(kFALSE)
1c5acb87 46{
47 //Default Ctor
48
49 //Initialize parameters
50 fDataType=kAOD;
591cc579 51 fReadStack = kTRUE;
52 fReadAODMCParticles = kFALSE;
53 //We want tracks fitted in the detectors:
54 fTrackStatus=AliESDtrack::kTPCrefit;
55 fTrackStatus|=AliESDtrack::kITSrefit;
56
1c5acb87 57}
58
59//____________________________________________________________________________
a8a55c9d 60AliCaloTrackAODReader::AliCaloTrackAODReader(const AliCaloTrackAODReader & aodr) :
08a064bc 61 AliCaloTrackReader(aodr), fWriteOutputStdAOD(aodr.fWriteOutputStdAOD)
1c5acb87 62{
63 // cpy ctor
64}
65
66//_________________________________________________________________________
67//AliCaloTrackAODReader & AliCaloTrackAODReader::operator = (const AliCaloTrackAODReader & source)
68//{
69// // assignment operator
70//
71// if(&source == this) return *this;
72//
73// return *this;
74//
75//}
76
77//____________________________________________________________________________
78void AliCaloTrackAODReader::FillInputCTS() {
591cc579 79 //Return array with Central Tracking System (CTS) tracks
be1f5fa4 80 if(fDebug > 2 ) printf("AliCaloTrackAODReader::FillInputCTS()\n");
477d6cee 81 Int_t nTracks = fInputEvent->GetNumberOfTracks() ;
a8a55c9d 82 Int_t naod = 0;
1c5acb87 83 Double_t p[3];
1c5acb87 84 for (Int_t itrack = 0; itrack < nTracks; itrack++) {////////////// track loop
477d6cee 85 AliAODTrack * track = ((AliAODEvent*)fInputEvent)->GetTrack(itrack) ; // retrieve track from esd
591cc579 86
87 //Select tracks under certain conditions, TPCrefit, ITSrefit ... check the set bits
88 if (fTrackStatus && !((track->GetStatus() & fTrackStatus) == fTrackStatus)) continue ;
1c5acb87 89
90 track->GetPxPyPz(p) ;
91 TLorentzVector momentum(p[0],p[1],p[2],0);
92
ff45398a 93 if(fCTSPtMin < momentum.Pt() && fFiducialCut->IsInFiducialCut(momentum,"CTS")){
1c5acb87 94
a3aebfff 95 if(fDebug > 2 && momentum.Pt() > 0.1) printf("AliCaloTrackAODReader::FillInputCTS() - Selected tracks E %3.2f, pt %3.2f, phi %3.2f, eta %3.2f\n",
1c5acb87 96 momentum.E(),momentum.Pt(),momentum.Phi()*TMath::RadToDeg(),momentum.Eta());
a8a55c9d 97
42dc8e7d 98 if(fWriteOutputStdAOD){
a8a55c9d 99 AliAODTrack* newtrack = new((*(fOutputEvent->GetTracks()))[naod++]) AliAODTrack(*track);
100 fAODCTS->Add(newtrack); //Use AOD stored in output for references.
101 }
102 else fAODCTS->Add(track);
ff45398a 103 }//Pt and Fiducial cut passed.
1c5acb87 104 }// track loop
591cc579 105
106 fAODCTSNormalInputEntries = fAODCTS->GetEntriesFast();
107 if(fDebug > 1) printf("AliCaloTrackAODReader::FillInputCTS() - aod entries %d\n", fAODCTSNormalInputEntries);
108
109 //If second input event available, add the clusters.
110 if(fSecondInputAODTree && fSecondInputAODEvent){
111 nTracks = fSecondInputAODEvent->GetNumberOfTracks() ;
112 if(fDebug > 1) printf("AliCaloTrackAODReader::FillInputCTS() - Add second input tracks, entries %d\n", nTracks) ;
113 for (Int_t itrack = 0; itrack < nTracks; itrack++) {////////////// track loop
114 AliAODTrack * track = ((AliAODEvent*)fSecondInputAODEvent)->GetTrack(itrack) ; // retrieve track from esd
115
116 //Select tracks under certain conditions, TPCrefit, ITSrefit ... check the set bits
117 if (fTrackStatus && !((track->GetStatus() & fTrackStatus) == fTrackStatus)) continue ;
118
119 track->GetPxPyPz(p) ;
120 TLorentzVector momentum(p[0],p[1],p[2],0);
121
ff45398a 122 if(fCTSPtMin < momentum.Pt() && fFiducialCut->IsInFiducialCut(momentum,"CTS")){
591cc579 123
124 if(fDebug > 2 && momentum.Pt() > 0.1) printf("AliCaloTrackAODReader::FillInputCTS() - Selected tracks E %3.2f, pt %3.2f, phi %3.2f, eta %3.2f\n",
125 momentum.E(),momentum.Pt(),momentum.Phi()*TMath::RadToDeg(),momentum.Eta());
126
42dc8e7d 127 if(fWriteOutputStdAOD){
a8a55c9d 128 AliAODTrack* newtrack = new((*(fOutputEvent->GetTracks()))[naod++]) AliAODTrack(*track);
129 fAODCTS->Add(newtrack); //Use AOD stored in output for references.
130 }
131 else fAODCTS->Add(track);
591cc579 132
ff45398a 133 }//Pt and Fiducial cut passed.
591cc579 134 }// track loop
135
136 if(fDebug > 1) printf("AliCaloTrackAODReader::FillInputCTS() - aod normal entries %d, after second input %d\n", fAODCTSNormalInputEntries, fAODCTS->GetEntriesFast());
137 } //second input loop
138
1c5acb87 139}
140
141//____________________________________________________________________________
142void AliCaloTrackAODReader::FillInputEMCAL() {
143 //Return array with EMCAL clusters in aod format
be1f5fa4 144 if(fDebug > 2 ) printf("AliCaloTrackAODReader::FillInputEMCAL()\n");
145
1c5acb87 146 //Get vertex for momentum calculation
147 Double_t v[3] ; //vertex ;
148 GetVertex(v);
a8a55c9d 149
150 Int_t naod = (fOutputEvent->GetCaloClusters())->GetEntriesFast();
ff45398a 151 //Loop to select clusters in fiducial cut and fill container with aodClusters
591cc579 152 Int_t nclusters = ((AliAODEvent*)fInputEvent)->GetNCaloClusters();
153 for (Int_t iclus = 0; iclus < nclusters; iclus++) {
477d6cee 154 AliAODCaloCluster * clus = 0;
155 if ( (clus = ((AliAODEvent*)fInputEvent)->GetCaloCluster(iclus)) ) {
156 if (clus->IsEMCALCluster()){
c1ac3823 157
158 //Check if the cluster contains any bad channel
159 if(ClusterContainsBadChannel("EMCAL",clus->GetCellsAbsId(), clus->GetNCells())) continue;
160
477d6cee 161 TLorentzVector momentum ;
162 clus->GetMomentum(momentum, v);
163
ff45398a 164 if(fEMCALPtMin < momentum.Pt() && fFiducialCut->IsInFiducialCut(momentum,"EMCAL")){
1c5acb87 165
a3aebfff 166 if(fDebug > 2 && momentum.E() > 0.1) printf("AliCaloTrackAODReader::FillInputEMCAL() - Selected clusters E %3.2f, pt %3.2f, phi %3.2f, eta %3.2f\n",
477d6cee 167 momentum.E(),momentum.Pt(),momentum.Phi()*TMath::RadToDeg(),momentum.Eta());
168
42dc8e7d 169 if(fWriteOutputStdAOD){
a8a55c9d 170 AliAODCaloCluster * newclus = new((*(fOutputEvent->GetCaloClusters()))[naod++])AliAODCaloCluster(*clus);
171 fAODEMCAL->Add(newclus);
172 }
173 else fAODEMCAL->Add(clus);
ff45398a 174 }//Pt and Fiducial cut passed.
477d6cee 175 }//EMCAL cluster
176 }// cluster exists
591cc579 177 }// cluster loop
178
179 fAODEMCALNormalInputEntries = fAODEMCAL->GetEntriesFast();
180 if(fDebug > 1) printf("AliCaloTrackAODReader::FillInputEMCAL() - aod entries %d\n", fAODEMCALNormalInputEntries);
181
182 //If second input event available, add the clusters.
183 if(fSecondInputAODTree && fSecondInputAODEvent){
233e0df8 184 GetSecondInputAODVertex(v);
591cc579 185 nclusters = ((AliAODEvent*)fSecondInputAODEvent)->GetNCaloClusters();
186 if(fDebug > 1) printf("AliCaloTrackAODReader::FillInputEMCAL() - Add second input clusters, entries %d\n", nclusters) ;
187 for (Int_t iclus = 0; iclus < nclusters; iclus++) {
188 AliAODCaloCluster * clus = 0;
189 if ( (clus = ((AliAODEvent*)fSecondInputAODEvent)->GetCaloCluster(iclus)) ) {
190 if (clus->IsEMCALCluster()){
191 TLorentzVector momentum ;
192 clus->GetMomentum(momentum, v);
193
ff45398a 194 if(fEMCALPtMin < momentum.Pt() && fFiducialCut->IsInFiducialCut(momentum,"EMCAL")){
591cc579 195
196 if(fDebug > 2 && momentum.E() > 0.1) printf("AliCaloTrackAODReader::FillInputEMCAL() - Selected clusters E %3.2f, pt %3.2f, phi %3.2f, eta %3.2f\n",
197 momentum.E(),momentum.Pt(),momentum.Phi()*TMath::RadToDeg(),momentum.Eta());
42dc8e7d 198 if(fWriteOutputStdAOD){
a8a55c9d 199 AliAODCaloCluster * newclus = new((*(fOutputEvent->GetCaloClusters()))[naod++])AliAODCaloCluster(*clus);
200 fAODEMCAL->Add(newclus);
201 }
202 else fAODEMCAL->Add(clus);
ff45398a 203 }//Pt and Fiducial cut passed.
591cc579 204 }//EMCAL cluster
205 }// cluster exists
206 }// cluster loop
207
208 if(fDebug > 1) printf("AliCaloTrackAODReader::FillInputEMCAL() - aod normal entries %d, after second input %d\n", fAODEMCALNormalInputEntries, fAODEMCAL->GetEntriesFast());
1c5acb87 209
591cc579 210 } //second input loop
1c5acb87 211}
212
213//____________________________________________________________________________
214void AliCaloTrackAODReader::FillInputPHOS() {
215 //Return array with PHOS clusters in aod format
be1f5fa4 216 if(fDebug > 2 ) printf("AliCaloTrackAODReader::FillInputPHOS()\n");
217
1c5acb87 218 //Get vertex for momentum calculation
219 Double_t v[3] ; //vertex ;
220 GetVertex(v);
a8a55c9d 221
222 Int_t naod = (fOutputEvent->GetCaloClusters())->GetEntriesFast();
ff45398a 223 //Loop to select clusters in fiducial cut and fill container with aodClusters
591cc579 224 Int_t nclusters = ((AliAODEvent*)fInputEvent)->GetNCaloClusters();
225 for (Int_t iclus = 0; iclus < nclusters; iclus++) {
477d6cee 226 AliAODCaloCluster * clus = 0;
227 if ( (clus = ((AliAODEvent*)fInputEvent)->GetCaloCluster(iclus)) ) {
228 if (clus->IsPHOSCluster()){
c1ac3823 229
230 //Check if the cluster contains any bad channel
231 if(ClusterContainsBadChannel("PHOS",clus->GetCellsAbsId(), clus->GetNCells())) continue;
232
477d6cee 233 TLorentzVector momentum ;
234 clus->GetMomentum(momentum, v);
235
ff45398a 236 if(fPHOSPtMin < momentum.Pt() && fFiducialCut->IsInFiducialCut(momentum,"PHOS")){
477d6cee 237
a3aebfff 238 if(fDebug > 2 && momentum.E() > 0.1) printf("AliCaloTrackAODReader::FillInputPHOS() - Selected clusters E %3.2f, pt %3.2f, phi %3.2f, eta %3.2f\n",
477d6cee 239 momentum.E(),momentum.Pt(),momentum.Phi()*TMath::RadToDeg(),momentum.Eta());
591cc579 240
42dc8e7d 241 if(fWriteOutputStdAOD){
a8a55c9d 242 AliAODCaloCluster * newclus = new((*(fOutputEvent->GetCaloClusters()))[naod++])AliAODCaloCluster(*clus);
243 fAODPHOS->Add(newclus);
244 }
245 else fAODPHOS->Add(clus);
ff45398a 246 }//Pt and Fiducial cut passed.
477d6cee 247 }//PHOS cluster
248 }//cluster exists
1c5acb87 249 }//esd cluster loop
591cc579 250
251 fAODPHOSNormalInputEntries = fAODPHOS->GetEntriesFast() ;
252 if(fDebug > 1) printf("AliCaloTrackAODReader::FillInputPHOS() - aod entries %d\n", fAODPHOSNormalInputEntries);
1c5acb87 253
591cc579 254 //If second input event available, add the clusters.
233e0df8 255 if(fSecondInputAODTree && fSecondInputAODEvent){
256 GetSecondInputAODVertex(v);
591cc579 257 nclusters = ((AliAODEvent*)fSecondInputAODEvent)->GetNCaloClusters();
258 if(fDebug > 1) printf("AliCaloTrackAODReader::FillInputPHOS() - Add second input clusters, entries %d\n", nclusters);
259 for (Int_t iclus = 0; iclus < nclusters; iclus++) {
260 AliAODCaloCluster * clus = 0;
261 if ( (clus = ((AliAODEvent*)fSecondInputAODEvent)->GetCaloCluster(iclus)) ) {
262 if (clus->IsPHOSCluster()){
263 TLorentzVector momentum ;
264 clus->GetMomentum(momentum, v);
265
ff45398a 266 if(fPHOSPtMin < momentum.Pt() && fFiducialCut->IsInFiducialCut(momentum,"PHOS")){
591cc579 267
268 if(fDebug > 2 && momentum.E() > 0.1) printf("AliCaloTrackAODReader::FillInputPHOS() - Selected clusters E %3.2f, pt %3.2f, phi %3.2f, eta %3.2f\n",
269 momentum.E(),momentum.Pt(),momentum.Phi()*TMath::RadToDeg(),momentum.Eta());
42dc8e7d 270 if(fWriteOutputStdAOD){
a8a55c9d 271 AliAODCaloCluster * newclus = new((*(fOutputEvent->GetCaloClusters()))[naod++])AliAODCaloCluster(*clus);
272 fAODPHOS->Add(newclus);
273 }
274 else fAODPHOS->Add(clus);
ff45398a 275 }//Pt and Fiducial cut passed.
591cc579 276 }//PHOS cluster
277 }// cluster exists
278 }// cluster loop
279 if(fDebug > 1) printf("AliCaloTrackAODReader::FillInputPHOS() - aod normal entries %d, after second input %d\n", fAODPHOSNormalInputEntries, fAODPHOS->GetEntriesFast());
280 } //second input loop
1c5acb87 281
282}
283
284//____________________________________________________________________________
285void AliCaloTrackAODReader::FillInputEMCALCells() {
286 //Return array with EMCAL cells in aod format
287
477d6cee 288 fEMCALCells = (TNamed*) ((AliAODEvent*)fInputEvent)->GetEMCALCells();
1c5acb87 289
290}
291
292//____________________________________________________________________________
293void AliCaloTrackAODReader::FillInputPHOSCells() {
294 //Return array with PHOS cells in aod format
295
477d6cee 296 fPHOSCells = (TNamed*) ((AliAODEvent*)fInputEvent)->GetPHOSCells();
1c5acb87 297
298}
299
300//____________________________________________________________________________
301void AliCaloTrackAODReader::GetVertex(Double_t v[3]) const {
302 //Return vertex position
303
8a587055 304 ((AliAODEvent*)fInputEvent)->GetPrimaryVertex()->GetXYZ(v);
305
1c5acb87 306}
307
233e0df8 308//____________________________________________________________________________
309void AliCaloTrackAODReader::GetSecondInputAODVertex(Double_t v[3]) const {
310 //Return vertex position of second AOD input
311
8a587055 312 fSecondInputAODEvent->GetPrimaryVertex()->GetXYZ(v);
313
233e0df8 314}
315
8dacfd76 316//____________________________________________________________________________
317Double_t AliCaloTrackAODReader::GetBField() const {
318 //Return magnetic field
319
320 Double_t bfield = ((AliAODEvent*)fInputEvent)->GetMagneticField();
321
322 return bfield;
323
324}
1c5acb87 325
e6e63685 326//____________________________________________________________________________________________________________________________________________________
327Int_t AliCaloTrackAODReader::GetModuleNumber(AliAODCaloCluster * cluster) const
328{
329 //Get the EMCAL/PHOS module number that corresponds to this cluster
330 TLorentzVector lv;
331 Double_t v[]={0.,0.,0.}; //not necessary to pass the real vertex.
332 cluster->GetMomentum(lv,v);
333 Float_t phi = lv.Phi();
334 if(phi < 0) phi+=TMath::TwoPi();
335 Int_t absId = -1;
336 if(cluster->IsEMCALCluster()){
337 GetEMCALGeometry()->GetAbsCellIdFromEtaPhi(lv.Eta(),phi, absId);
338 if(GetDebug() > 2)
339 printf("AliCaloTrackAODReader::GetModuleNumber(ESD) - EMCAL: cluster eta %f, phi %f, absid %d, SuperModule %d\n",
340 lv.Eta(), phi*TMath::RadToDeg(),absId, GetEMCALGeometry()->GetSuperModuleNumber(absId));
341 return GetEMCALGeometry()->GetSuperModuleNumber(absId) ;
342 }//EMCAL
343 else if(cluster->IsPHOSCluster()) {
344 Int_t relId[4];
345 if ( cluster->GetNCells() > 0) {
346 absId = cluster->GetCellAbsId(0);
347 if(GetDebug() > 2)
348 printf("AliCaloTrackAODReader::GetModuleNumber(AOD) - PHOS: cluster eta %f, phi %f, e %f, absId %d\n",
349 lv.Eta(), phi*TMath::RadToDeg(), lv.E(), absId);
350 }
351 else return -1;
352
353 if ( absId >= 0) {
354 GetPHOSGeometry()->AbsToRelNumbering(absId,relId);
355 if(GetDebug() > 2)
356 printf("AliCaloTrackAODReader::GetModuleNumber(AOD) - PHOS: Module %d\n",relId[0]-1);
357 return relId[0]-1;
358 }
359 else return -1;
360 }//PHOS
361
362 return -1;
363}
364
365
1c5acb87 366//____________________________________________________________________________
477d6cee 367void AliCaloTrackAODReader::SetInputOutputMCEvent(AliVEvent* input, AliAODEvent* aod, AliMCEvent* mc) {
1c5acb87 368 // Connect the data pointers
477d6cee 369 // If input is AOD, do analysis with input, if not, do analysis with the output aod.
8a587055 370
477d6cee 371 if(!strcmp(input->GetName(),"AliESDEvent")) {
372 SetInputEvent(aod);
373 SetOutputEvent(aod);
374 }
375 else if(!strcmp(input->GetName(),"AliAODEvent")){
8a587055 376
377 AliAODInputHandler* aodIH = static_cast<AliAODInputHandler*>((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
378 //printf("AODInputHandler %p, MergeEvents %d \n",aodIH, aodIH->GetMergeEvents());
379 if (aodIH && aodIH->GetMergeEvents()) {
380 //Merged events, use output AOD.
381 SetInputEvent(aod);
382 SetOutputEvent(aod);
383 }
384 else{
385 SetInputEvent(input);
386 SetOutputEvent(aod);
387 }
477d6cee 388 }
389 else{
591cc579 390 printf("AliCaloTrackAODReader::SetInputOutputMCEvent() - STOP : Wrong data format: %s\n",input->GetName());
477d6cee 391 abort();
392 }
393
394 SetMC(mc);
1c5acb87 395
1c5acb87 396}
08a064bc 397
398//________________________________________________________________
399void AliCaloTrackAODReader::Print(const Option_t * opt) const
400{
401
402 //Print some relevant parameters set for the analysis
403 AliCaloTrackReader::Print(opt);
404
405 printf("Write std AOD = %d\n", fWriteOutputStdAOD) ;
406
407 printf(" \n") ;
408}
409