]> git.uio.no Git - u/mrichter/AliRoot.git/blame_incremental - JETAN/AliJetESDReader.cxx
Correct initialization of data members
[u/mrichter/AliRoot.git] / JETAN / AliJetESDReader.cxx
... / ...
CommitLineData
1/**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
15
16//-------------------------------------------------------------------------
17// Jet ESD Reader
18// ESD reader for jet analysis
19// Authors: Mercedes Lopez Noriega (mercedes.lopez.noriega@cern.ch)
20// Magali Estienne <magali.estienne@subatech.in2p3.fr>
21//-------------------------------------------------------------------------
22
23// --- Standard library ---
24#include <Riostream.h>
25
26// --- ROOT system ---
27#include <TSystem.h>
28#include <TStopwatch.h>
29#include <TLorentzVector.h>
30#include <TVector3.h>
31#include "TTask.h"
32#include "TTree.h"
33#include "TFile.h"
34#include <TGeoManager.h>
35#include <assert.h>
36#include <TRefArray.h>
37#include <TMath.h>
38#include <TProcessID.h>
39#include <TRandom3.h>
40
41// --- AliRoot header files ---
42#include "AliJetESDReader.h"
43#include "AliJetESDReaderHeader.h"
44#include "AliESDEvent.h"
45#include "AliESD.h"
46#include "AliESDtrack.h"
47#include "AliJetDummyGeo.h"
48#include "AliJetFillUnitArrayTracks.h"
49#include "AliJetFillUnitArrayEMCalDigits.h"
50#include "AliJetUnitArray.h"
51#include "AliAnalysisTask.h"
52
53ClassImp(AliJetESDReader)
54
55AliJetESDReader::AliJetESDReader():
56 AliJetReader(),
57 fGeom(0),
58 fChain(0x0),
59 fTree(0x0),
60 fESD(0x0),
61 fHadCorr(0x0),
62 fTpcGrid(0x0),
63 fEmcalGrid(0x0),
64 fGrid0(0),
65 fGrid1(0),
66 fGrid2(0),
67 fGrid3(0),
68 fGrid4(0),
69 fPtCut(0),
70 fHCorrection(0),
71 fECorrection(0),
72 fEFlag(kFALSE),
73 fNumUnits(0),
74 fDebug(0),
75 fMass(0),
76 fSign(0),
77 fNIn(0),
78 fOpt(0),
79 fDZ(0),
80 fNeta(0),
81 fNphi(0),
82 fArrayInitialised(0),
83 fRefArray(0x0),
84 fProcId(kFALSE)
85{
86 // Constructor
87}
88
89//____________________________________________________________________________
90AliJetESDReader::~AliJetESDReader()
91{
92 // Destructor
93 delete fChain;
94 delete fTree;
95 delete fESD;
96 delete fTpcGrid;
97 delete fEmcalGrid;
98 if(fDZ)
99 {
100 delete fGrid0;
101 delete fGrid1;
102 delete fGrid2;
103 delete fGrid3;
104 delete fGrid4;
105 }
106}
107
108//____________________________________________________________________________
109void AliJetESDReader::OpenInputFiles()
110{
111 // chain for the ESDs
112 fChain = new TChain("esdTree");
113
114 // get directory and pattern name from the header
115 const char* dirName=fReaderHeader->GetDirectory();
116 const char* pattern=fReaderHeader->GetPattern();
117
118 // Add files matching patters to the chain
119 void *dir = gSystem->OpenDirectory(dirName);
120 const char *name = 0x0;
121 int nesd = ((AliJetESDReaderHeader*) fReaderHeader)->GetNesd();
122 int a = 0;
123 while ((name = gSystem->GetDirEntry(dir))){
124 if (a>=nesd) continue;
125
126 if (strstr(name,pattern)){
127 printf("Adding %s\n",name);
128 char path[256];
129 sprintf(path,"%s/%s/AliESDs.root",dirName,name);
130 fChain->AddFile(path);
131 a++;
132 }
133 }
134
135 gSystem->FreeDirectory(dir);
136
137 fESD = new AliESDEvent();
138 fESD->ReadFromTree(fChain);
139
140 int nMax = fChain->GetEntries();
141
142 printf("\n AliJetESDReader: Total number of events in chain= %d \n",nMax);
143
144 // set number of events in header
145 if (fReaderHeader->GetLastEvent() == -1)
146 fReaderHeader->SetLastEvent(nMax);
147 else {
148 Int_t nUsr = fReaderHeader->GetLastEvent();
149 fReaderHeader->SetLastEvent(TMath::Min(nMax,nUsr));
150 }
151
152}
153
154//____________________________________________________________________________
155void AliJetESDReader::SetInputEvent(TObject* esd, TObject* /*aod*/, TObject* /*mc*/) {
156 // Connect the tree
157 fESD = (AliESDEvent*) esd;
158}
159
160//____________________________________________________________________________
161Bool_t AliJetESDReader::FillMomentumArray()
162{
163 // Fill momentum array
164
165 Int_t goodTrack = 0;
166 Int_t nt = 0;
167 Float_t pt, eta;
168 TVector3 p3;
169
170 // clear momentum array
171 ClearArray();
172 fDebug = fReaderHeader->GetDebug();
173 fOpt = fReaderHeader->GetDetector();
174
175 if (!fESD) {
176 return kFALSE;
177 }
178
179 // get number of tracks in event (for the loop)
180 nt = fESD->GetNumberOfTracks();
181 printf("Fill Momentum Array %5d \n", nt);
182
183 // temporary storage of signal and pt cut flag
184 Int_t* sflag = new Int_t[nt];
185 Int_t* cflag = new Int_t[nt];
186
187 // get cuts set by user
188 Float_t ptMin = fReaderHeader->GetPtCut();
189 Float_t etaMin = fReaderHeader->GetFiducialEtaMin();
190 Float_t etaMax = fReaderHeader->GetFiducialEtaMax();
191
192 //loop over tracks in ESD
193 for (Int_t it = 0; it < nt; it++) {
194 AliESDtrack *track = fESD->GetTrack(it);
195 UInt_t status = track->GetStatus();
196
197 Double_t mom[3];
198 track->GetPxPyPz(mom);
199 p3.SetXYZ(mom[0],mom[1],mom[2]);
200 pt = p3.Pt();
201 if ((status & AliESDtrack::kTPCrefit) == 0) continue; // quality check
202 if ((status & AliESDtrack::kITSrefit) == 0) continue; // quality check
203 if (((AliJetESDReaderHeader*) fReaderHeader)->ReadSignalOnly()
204 && TMath::Abs(track->GetLabel()) > 10000) continue; // quality check
205 if (((AliJetESDReaderHeader*) fReaderHeader)->ReadBkgdOnly()
206 && TMath::Abs(track->GetLabel()) < 10000) continue; // quality check
207 eta = p3.Eta();
208 if ( (eta > etaMax) || (eta < etaMin)) continue; // checking eta cut
209
210 new ((*fMomentumArray)[goodTrack]) TLorentzVector(p3,p3.Mag());
211 sflag[goodTrack]=0;
212 if (TMath::Abs(track->GetLabel()) < 10000) sflag[goodTrack]=1;
213 cflag[goodTrack]=0;
214 if (pt > ptMin) cflag[goodTrack]=1; // pt cut
215 goodTrack++;
216 }
217
218 // set the signal flags
219 fSignalFlag.Set(goodTrack,sflag);
220 fCutFlag.Set(goodTrack,cflag);
221
222 delete[] sflag;
223 delete[] cflag;
224
225 return kTRUE;
226
227}
228
229//____________________________________________________________________________
230void AliJetESDReader::CreateTasks(TChain* tree)
231{
232 //
233 // For reader task initialization
234 //
235
236 fDebug = fReaderHeader->GetDebug();
237 fDZ = fReaderHeader->GetDZ();
238 fTree = tree;
239
240 // Init EMCAL geometry
241 SetEMCALGeometry();
242 // Init parameters
243 InitParameters();
244 // Create and init unit array
245 InitUnitArray();
246
247 // Create global reader task for analysis
248 fFillUnitArray = new TTask("fFillUnitArray","Fill unit array jet finder");
249 // Create a task for to fill the charged particle information
250 fFillUAFromTracks = new AliJetFillUnitArrayTracks();
251 fFillUAFromTracks->SetReaderHeader(fReaderHeader);
252 fFillUAFromTracks->SetGeom(fGeom);
253 fFillUAFromTracks->SetTPCGrid(fTpcGrid);
254 fFillUAFromTracks->SetEMCalGrid(fEmcalGrid);
255 if(fDZ)
256 { // Calo dead zones inclusion
257 fFillUAFromTracks->SetGrid0(fGrid0);
258 fFillUAFromTracks->SetGrid1(fGrid1);
259 fFillUAFromTracks->SetGrid2(fGrid2);
260 fFillUAFromTracks->SetGrid3(fGrid3);
261 fFillUAFromTracks->SetGrid4(fGrid4);
262 }
263 fFillUAFromTracks->SetHadCorrection(fHCorrection);
264 fFillUAFromTracks->SetHadCorrector(fHadCorr);
265 // Create a task for to fill the neutral particle information
266 fFillUAFromEMCalDigits = new AliJetFillUnitArrayEMCalDigits();
267 fFillUAFromEMCalDigits->SetReaderHeader(fReaderHeader);
268 fFillUAFromEMCalDigits->SetGeom(fGeom);
269 fFillUAFromEMCalDigits->SetTPCGrid(fTpcGrid);
270 fFillUAFromEMCalDigits->SetEMCalGrid(fEmcalGrid);
271 fFillUAFromEMCalDigits->SetEleCorrection(fECorrection);
272 // Add the task to global task
273 fFillUnitArray->Add(fFillUAFromTracks);
274 fFillUnitArray->Add(fFillUAFromEMCalDigits);
275 fFillUAFromTracks->SetActive(kFALSE);
276 fFillUAFromEMCalDigits->SetActive(kFALSE);
277
278 cout << "Tasks instantiated at that stage ! " << endl;
279 cout << "You can loop over events now ! " << endl;
280
281}
282
283//____________________________________________________________________________
284Bool_t AliJetESDReader::ExecTasks(Bool_t procid, TRefArray* refArray)
285{
286 //
287 // Reader task execussion
288 //
289
290 fProcId = procid;
291 fRefArray = refArray;
292 vector<Float_t> vtmp(3);
293
294 // clear momentum array
295 ClearArray();
296
297 fDebug = fReaderHeader->GetDebug();
298 fOpt = fReaderHeader->GetDetector();
299
300 if(!fESD) {
301 return kFALSE;
302 }
303
304 // TPC only or Digits+TPC or Clusters+TPC
305 if(fOpt%2==!0 && fOpt!=0){
306 fFillUAFromTracks->SetESD(fESD);
307 fFillUAFromTracks->SetActive(kTRUE);
308 fFillUAFromTracks->SetUnitArray(fUnitArray);
309 fFillUAFromTracks->SetRefArray(fRefArray);
310 fFillUAFromTracks->SetProcId(fProcId);
311 // fFillUAFromTracks->ExecuteTask("tpc"); // Temporarily changed
312 fFillUAFromTracks->Exec("tpc"); // Temporarily added
313 if(fOpt==1){
314 fNumCandidate = fFillUAFromTracks->GetMult();
315 fNumCandidateCut = fFillUAFromTracks->GetMultCut();
316 }
317 }
318
319 // Digits only or Digits+TPC
320 if(fOpt>=2 && fOpt<=3){
321 fFillUAFromEMCalDigits->SetESD(fESD);
322 fFillUAFromEMCalDigits->SetActive(kTRUE);
323 fFillUAFromEMCalDigits->SetUnitArray(fUnitArray);
324 fFillUAFromEMCalDigits->SetRefArray(fRefArray);
325 fFillUAFromEMCalDigits->SetProcId(fFillUAFromTracks->GetProcId());
326 fFillUAFromEMCalDigits->SetInitMult(fFillUAFromTracks->GetMult());
327 fFillUAFromEMCalDigits->SetInitMultCut(fFillUAFromTracks->GetMultCut());
328 fFillUAFromEMCalDigits->Exec("digits"); // Temporarily added
329 fNumCandidate = fFillUAFromEMCalDigits->GetMult();
330 fNumCandidateCut = fFillUAFromEMCalDigits->GetMultCut();
331 }
332
333 // fFillUnitArray->ExecuteTask(); // Temporarily commented
334
335 return kTRUE;
336}
337
338//____________________________________________________________________________
339Bool_t AliJetESDReader::SetEMCALGeometry()
340{
341 //
342 // Set the EMCal Geometry
343 //
344
345 if (!fTree->GetFile())
346 return kFALSE;
347
348 TString geomFile(fTree->GetFile()->GetName());
349 geomFile.ReplaceAll("AliESDs", "geometry");
350
351 // temporary workaround for PROOF bug #18505
352 geomFile.ReplaceAll("#geometry.root#geometry.root", "#geometry.root");
353 if(fDebug>1) printf("Current geometry file %s \n", geomFile.Data());
354
355 // Define EMCAL geometry to be able to read ESDs
356 fGeom = AliJetDummyGeo::GetInstance();
357 if (fGeom == 0)
358 fGeom = AliJetDummyGeo::GetInstance("EMCAL_COMPLETE","EMCAL");
359
360 // To be setted to run some AliEMCALGeometry functions
361 TGeoManager::Import(geomFile);
362 fGeom->GetTransformationForSM();
363 printf("\n EMCal Geometry set ! \n");
364
365 return kTRUE;
366}
367
368//____________________________________________________________________________
369void AliJetESDReader::InitParameters()
370{
371 // Initialise parameters
372 fOpt = fReaderHeader->GetDetector();
373 fHadCorr = 0; // For hadron correction
374 if(fEFlag==kFALSE){
375 if(fOpt==0 || fOpt==1)
376 fECorrection = 0; // For electron correction
377 else fECorrection = 1; // For electron correction
378 }
379 fNumUnits = fGeom->GetNCells(); // Number of cells in EMCAL
380 if(fDebug>1) printf("\n EMCal parameters initiated ! \n");
381}
382
383//____________________________________________________________________________
384void AliJetESDReader::InitUnitArray()
385{
386 //
387 // Create and Initialise unit arrays
388 //
389
390 Int_t nElements = fTpcGrid->GetNEntries();
391 Float_t eta = 0., phi = 0., Deta = 0., Dphi = 0.;
392 if(fArrayInitialised) fUnitArray->Delete();
393
394 if(fTpcGrid->GetGridType()==0)
395 { // Fill the following quantities :
396 // Good track ID, (Eta,Phi) position ID, eta, phi, energy, px, py, pz, Deta, Dphi,
397 // detector flag, in/out jet, pt cut, mass, cluster ID)
398 for(Int_t nBin = 1; nBin < nElements+1; nBin++)
399 {
400 fTpcGrid->GetEtaPhiFromIndex2(nBin,phi,eta);
401 phi = ((phi < 0) ? phi + 2. * TMath::Pi() : phi);
402 Deta = fTpcGrid->GetDeta();
403 Dphi = fTpcGrid->GetDphi();
404 new ((*fUnitArray)[nBin-1]) AliJetUnitArray(nBin-1,0,eta,phi,0.,Deta,Dphi,kTpc,kOutJet,kPtSmaller,kPtSmaller,kBad,0.,-1);
405 }
406 }
407
408 if(fTpcGrid->GetGridType()==1)
409 {
410 Int_t nGaps = 0;
411 Int_t n0 = 0, n1 = 0, n2 = 0, n3 = 0, n4 = 0;
412
413 if(fDZ)
414 {
415 // Define a grid of cell for the gaps between SM
416 Double_t phimin0 = 0., phimin1 = 0., phimin2 = 0., phimin3 = 0., phimin4 = 0.;
417 Double_t phimax0 = 0., phimax1 = 0., phimax2 = 0., phimax3 = 0., phimax4 = 0.;
418 fGeom->GetPhiBoundariesOfSMGap(0,phimin0,phimax0);
419 fGrid0 = new AliJetGrid(0,95,phimin0,phimax0,-0.7,0.7); // 0.015 x 0.015
420 fGrid0->SetGridType(0);
421 fGrid0->SetMatrixIndexes();
422 fGrid0->SetIndexIJ();
423 n0 = fGrid0->GetNEntries();
424 fGeom->GetPhiBoundariesOfSMGap(1,phimin1,phimax1);
425 fGrid1 = new AliJetGrid(0,95,phimin1,phimax1,-0.7,0.7); // 0.015 x 0.015
426 fGrid1->SetGridType(0);
427 fGrid1->SetMatrixIndexes();
428 fGrid1->SetIndexIJ();
429 n1 = fGrid1->GetNEntries();
430 fGeom->GetPhiBoundariesOfSMGap(2,phimin2,phimax2);
431 fGrid2 = new AliJetGrid(0,95,phimin2,phimax2,-0.7,0.7); // 0.015 x 0.015
432 fGrid2->SetGridType(0);
433 fGrid2->SetMatrixIndexes();
434 fGrid2->SetIndexIJ();
435 n2 = fGrid2->GetNEntries();
436 fGeom->GetPhiBoundariesOfSMGap(3,phimin3,phimax3);
437 fGrid3 = new AliJetGrid(0,95,phimin3,phimax3,-0.7,0.7); // 0.015 x 0.015
438 fGrid3->SetGridType(0);
439 fGrid3->SetMatrixIndexes();
440 fGrid3->SetIndexIJ();
441 n3 = fGrid3->GetNEntries();
442 fGeom->GetPhiBoundariesOfSMGap(4,phimin4,phimax4);
443 fGrid4 = new AliJetGrid(0,95,phimin4,phimax4,-0.7,0.7); // 0.015 x 0.015
444 fGrid4->SetGridType(0);
445 fGrid4->SetMatrixIndexes();
446 fGrid4->SetIndexIJ();
447 n4 = fGrid4->GetNEntries();
448
449 if(fDebug>1)
450 {
451 cout << "n0 cells: " << n0 << "phimin0: " << phimin0 << ", phimax0: " << phimax0 << endl;
452 cout << "n1 cells: " << n1 << "phimin1: " << phimin1 << ", phimax1: " << phimax1 << endl;
453 cout << "n2 cells: " << n2 << "phimin2: " << phimin2 << ", phimax2: " << phimax2 << endl;
454 cout << "n3 cells: " << n3 << "phimin3: " << phimin3 << ", phimax3: " << phimax3 << endl;
455 cout << "n4 cells: " << n4 << "phimin4: " << phimin4 << ", phimax4: " << phimax4 << endl;
456 }
457
458 nGaps = n0+n1+n2+n3+n4;
459
460 }
461
462 for(Int_t nBin = 0; nBin < fNumUnits+nElements+nGaps; nBin++)
463 {
464 if(nBin<fNumUnits)
465 {
466 fGeom->EtaPhiFromIndex(nBin, eta, phi); // From EMCal geometry
467 // fEmcalGrid->GetEtaPhiFromIndex2(nBin,phi,eta); // My function from Grid
468 phi = ((phi < 0) ? phi + 2. * TMath::Pi() : phi);
469 Deta = fEmcalGrid->GetDeta(); // Modify with the exact detector values
470 Dphi = fEmcalGrid->GetDphi(); // Modify with the exact detector values
471 new ((*fUnitArray)[nBin]) AliJetUnitArray(nBin,0,eta,phi,0.,Deta,Dphi,kTpc,kOutJet,kPtSmaller,kPtSmaller,kBad,0.,-1);
472 }
473 else {
474 if(nBin>=fNumUnits && nBin<fNumUnits+nElements){
475 fTpcGrid->GetEtaPhiFromIndex2(nBin+1-fNumUnits,phi,eta);
476 phi = ((phi < 0) ? phi + 2. * TMath::Pi() : phi);
477 Deta = fTpcGrid->GetDeta();
478 Dphi = fTpcGrid->GetDphi();
479 new ((*fUnitArray)[nBin]) AliJetUnitArray(nBin,0,eta,phi,0.,Deta,Dphi,kTpc,kOutJet,kPtSmaller,kPtSmaller,kBad,0.,-1);
480 }
481 else {
482 if(fDZ) {
483 if(nBin>=fNumUnits+nElements && nBin<fNumUnits+nElements+nGaps){
484 if(nBin<fNumUnits+nElements+n0)
485 {
486 Float_t phi0 = eta = 0.;
487 fGrid0->GetEtaPhiFromIndex2(nBin+1-(fNumUnits+nElements),phi0,eta);
488 Deta = fGrid0->GetDeta();
489 Dphi = fGrid0->GetDphi();
490 new ((*fUnitArray)[nBin]) AliJetUnitArray(nBin,0,eta,phi0,0.,Deta,Dphi,kTpc,kOutJet,kPtSmaller,kPtSmaller,kBad,0.,-1);
491 }
492 else if(nBin>=fNumUnits+nElements+n0 && nBin<fNumUnits+nElements+n0+n1)
493 {
494 Float_t phi = eta = 0.;
495 fGrid1->GetEtaPhiFromIndex2(nBin+1-(fNumUnits+nElements+n0),phi,eta);
496 Deta = fGrid1->GetDeta();
497 Dphi = fGrid1->GetDphi();
498 new ((*fUnitArray)[nBin]) AliJetUnitArray(nBin,0,eta,phi,0.,Deta,Dphi,kTpc,kOutJet,kPtSmaller,kPtSmaller,kBad,0.,-1);
499 }
500 else if(nBin>=fNumUnits+nElements+n0+n1 && nBin<fNumUnits+nElements+n0+n1+n2)
501 {
502 Float_t phi0 = eta = 0.;
503 fGrid2->GetEtaPhiFromIndex2(nBin+1-(fNumUnits+nElements+n0+n1),phi0,eta);
504 Deta = fGrid2->GetDeta();
505 Dphi = fGrid2->GetDphi();
506 new ((*fUnitArray)[nBin]) AliJetUnitArray(nBin,0,eta,phi0,0.,Deta,Dphi,kTpc,kOutJet,kPtSmaller,kPtSmaller,kBad,0.,-1);
507 }
508 else if(nBin>=fNumUnits+nElements+n0+n1+n2 && nBin<fNumUnits+nElements+n0+n1+n2+n3)
509 {
510 Float_t phi0 = eta = 0.;
511 fGrid3->GetEtaPhiFromIndex2(nBin+1-(fNumUnits+nElements+n0+n1+n2),phi0,eta);
512 Deta = fGrid3->GetDeta();
513 Dphi = fGrid3->GetDphi();
514 new ((*fUnitArray)[nBin]) AliJetUnitArray(nBin,0,eta,phi0,0.,Deta,Dphi,kTpc,kOutJet,kPtSmaller,kPtSmaller,kBad,0.,-1);
515 }
516 else if(nBin>=fNumUnits+nElements+n0+n1+n2+n3 && nBin<fNumUnits+nElements+nGaps)
517 {
518 Float_t phi0 = eta = 0.;
519 fGrid4->GetEtaPhiFromIndex2(nBin+1-(fNumUnits+nElements+n0+n1+n2+n3),phi0,eta);
520 Deta = fGrid4->GetDeta();
521 Dphi = fGrid4->GetDphi();
522 new ((*fUnitArray)[nBin]) AliJetUnitArray(nBin,0,eta,phi0,0.,Deta,Dphi,kTpc,kOutJet,kPtSmaller,kPtSmaller,kBad,0.,-1);
523 }
524 }
525 } // end if(fDZ)
526 } // end else 2
527 } // end else 1
528 } // end loop on nBin
529 } // end grid type == 1
530 fArrayInitialised = 1;
531}
532
533
534