- The part of JETAN dealing with ESD data has been separated from the one using MC...
[u/mrichter/AliRoot.git] / JETAN / AliJetESDReader.cxx
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 // Author: Mercedes Lopez Noriega (mercedes.lopez.noriega@cern.ch)
20 //------------------------------------------------------------------------- 
21
22
23 #include <Riostream.h>
24 #include <TSystem.h>
25 #include <TLorentzVector.h>
26 #include <TVector3.h>
27 #include "AliJetESDReader.h"
28 #include "AliJetESDReaderHeader.h"
29 #include "AliESD.h"
30 #include "AliESDtrack.h"
31
32 ClassImp(AliJetESDReader)
33
34 AliJetESDReader::AliJetESDReader():
35   fMass(0),
36   fSign(0)
37 {
38   // Constructor    
39   fReaderHeader = 0x0;
40 }
41
42 //____________________________________________________________________________
43
44 AliJetESDReader::~AliJetESDReader()
45 {
46   // Destructor
47 }
48
49 //____________________________________________________________________________
50
51 void AliJetESDReader::OpenInputFiles()
52 {
53   // chain for the ESDs
54   fChain   = new TChain("esdTree");
55
56   // get directory and pattern name from the header
57    const char* dirName=fReaderHeader->GetDirectory();
58    const char* pattern=fReaderHeader->GetPattern();
59     
60 //   // Add files matching patters to the chain
61   
62    void *dir  = gSystem->OpenDirectory(dirName);
63    const char *name = 0x0;
64    int nesd = fReaderHeader->GetNesd();
65    int a = 0;
66    while ((name = gSystem->GetDirEntry(dir))){
67        if (a>=nesd) continue;
68        
69        if (strstr(name,pattern)){
70            char path[256];
71            sprintf(path,"%s/%s/AliESDs.root",dirName,name);
72            fChain->AddFile(path);
73            a++;
74        }
75    }
76   
77   gSystem->FreeDirectory(dir);
78   
79
80   fESD = 0;
81   fChain->SetBranchAddress("ESD",    &fESD);
82   
83   int nMax = fChain->GetEntries(); 
84
85   printf("\nTotal number of events in chain= %d",nMax);
86   
87   // set number of events in header
88   if (fReaderHeader->GetLastEvent() == -1)
89     fReaderHeader->SetLastEvent(nMax);
90   else {
91     Int_t nUsr = fReaderHeader->GetLastEvent();
92     fReaderHeader->SetLastEvent(TMath::Min(nMax,nUsr));
93   }
94 }
95
96 void AliJetESDReader::ConnectTree(TTree* tree) {
97      fChain = (TChain*) tree;
98      
99      fChain->SetBranchAddress("ESD",    &fESD);
100      Int_t nMax = fChain->GetEntries(); 
101      printf("\nTotal number of events in chain= %5d", nMax);
102      // set number of events in header
103      if (fReaderHeader->GetLastEvent() == -1)
104          fReaderHeader->SetLastEvent(nMax);
105      else {
106          Int_t nUsr = fReaderHeader->GetLastEvent();
107          fReaderHeader->SetLastEvent(TMath::Min(nMax,nUsr));
108      }
109 }
110
111 //____________________________________________________________________________
112
113 Bool_t AliJetESDReader::FillMomentumArray(Int_t event)
114 {
115   // Fill momentum array
116
117   Int_t goodTrack = 0;
118   Int_t nt = 0;
119   Float_t pt, eta;
120   TVector3 p3;
121   
122   // clear momentum array
123    ClearArray();
124   
125   // get event from chain
126   fChain->GetTree()->GetEntry(event);
127
128   if (!fESD) {
129       return kFALSE;
130   }
131   
132   // get number of tracks in event (for the loop)
133   nt = fESD->GetNumberOfTracks();
134   // temporary storage of signal and pt cut flag
135   Int_t* sflag  = new Int_t[nt];
136   Int_t* cflag  = new Int_t[nt];
137   
138   // get cuts set by user
139   Float_t ptMin =  fReaderHeader->GetPtCut();
140   Float_t etaMin = fReaderHeader->GetFiducialEtaMin();
141   Float_t etaMax = fReaderHeader->GetFiducialEtaMax();  
142   
143   //loop over tracks
144   for (Int_t it = 0; it < nt; it++) {
145       AliESDtrack *track = fESD->GetTrack(it);
146       UInt_t status = track->GetStatus();
147       
148       Double_t mom[3];
149       track->GetPxPyPz(mom);
150       p3.SetXYZ(mom[0],mom[1],mom[2]);
151       pt = p3.Pt();
152       if ((status & AliESDtrack::kTPCrefit) == 0) continue;    // quality check
153       if ((status & AliESDtrack::kITSrefit) == 0) continue;    // quality check
154       if (((AliJetESDReaderHeader*) fReaderHeader)->ReadSignalOnly() 
155           && TMath::Abs(track->GetLabel()) > 10000)  continue;   // quality check
156       if (((AliJetESDReaderHeader*) fReaderHeader)->ReadBkgdOnly() 
157           && TMath::Abs(track->GetLabel()) < 10000)  continue;   // quality check
158       eta = p3.Eta();
159       if ( (eta > etaMax) || (eta < etaMin)) continue;           // checking eta cut
160       
161       new ((*fMomentumArray)[goodTrack]) TLorentzVector(p3,p3.Mag());
162       sflag[goodTrack]=0;
163       if (TMath::Abs(track->GetLabel()) < 10000) sflag[goodTrack]=1;
164       cflag[goodTrack]=0;
165       if (pt > ptMin) cflag[goodTrack]=1;                       // pt cut
166       goodTrack++;
167   }
168   // set the signal flags
169   fSignalFlag.Set(goodTrack,sflag);
170   fCutFlag.Set(goodTrack,cflag);
171   return kTRUE;
172 }
173
174   
175
176