2nd phase of AOD implementation - reading w/o checking the cuts
[u/mrichter/AliRoot.git] / ANALYSIS / AliReaderAOD.cxx
1 #include "AliReaderAOD.h"
2
3 ClassImp(AliReaderAOD)
4
5 #include <TError.h>
6 #include <TFile.h>
7 #include <TTree.h>
8 #include "AliAOD.h"
9
10
11 const TString AliReaderAOD::fgkTreeName("TAOD");
12 const TString AliReaderAOD::fgkRecosntructedDataBranchName("reconstructed.");
13 const TString AliReaderAOD::fgkSimulatedDataBranchName("simulated.");
14
15 AliReaderAOD::AliReaderAOD(const Char_t* aodfilename):
16  fFileName(aodfilename),
17  fReadSim(kFALSE),
18  fTree(0x0),
19  fFile(0x0),
20  fSimBuffer(0x0),
21  fRecBuffer(0x0)
22 {
23   //ctor
24 }
25 /********************************************************************/
26
27 AliReaderAOD::~AliReaderAOD()
28 {
29 //dtor
30   if (fEventSim == fSimBuffer )
31    {
32     fEventSim = 0x0;
33     fEventRec = 0x0;
34    }
35   delete fSimBuffer;
36   delete fRecBuffer;
37   
38   delete fTree;
39   delete fFile;
40 }
41 /********************************************************************/
42
43 void AliReaderAOD::Rewind()
44 {
45 //Rewinds reading
46   delete fTree;
47   fTree = 0x0;
48   delete fFile;
49   fFile = 0x0;
50   fCurrentDir = 0;
51   fNEventsRead= 0;
52 }
53 /********************************************************************/
54 Int_t AliReaderAOD::ReadNext()
55 {
56 //Reads next event
57   
58   do  //do{}while; is OK even if 0 dirs specified. In that case we try to read from "./"
59     {
60       if (fFile == 0x0)
61        {
62          Int_t opened = OpenFile(fCurrentDir);//rl is opened here
63          if (opened)
64            {
65              //Error("ReadNext","Error Occured while opening directory number %d",fCurrentDir);
66              fCurrentDir++;
67              continue;
68            }
69          fCurrentEvent = 0;
70        }
71       
72       fTree->GetEvent(fCurrentEvent);
73       
74       //Temporary testing sollution
75       fEventSim = fSimBuffer;
76       fEventRec = fRecBuffer;
77       
78       fCurrentEvent++;
79       fNEventsRead++;
80
81       if (fTree)
82        {
83          if ( fCurrentEvent >= fTree->GetEntries() )
84           {
85             delete fTree;
86             fTree = 0x0;
87             delete fFile;
88             fFile = 0x0;
89             fCurrentDir++;
90           } 
91        }
92
93
94       return 0;//success -> read one event
95       
96     }while(fCurrentDir < GetNumberOfDirs());//end of loop over directories specified in fDirs Obj Array  
97    
98   return 1; //no more directories to read
99   
100   
101 }
102 /********************************************************************/
103
104 Int_t AliReaderAOD::OpenFile(Int_t n)
105 {
106 //opens fFile with  tree
107
108  const TString& dirname = GetDirName(n);
109  if (dirname == "")
110   {
111     if (AliVAODParticle::GetDebug() > 2 )
112       {
113         Info("OpenFile","Got empty string as a directory name."); 
114       }
115    return 1;
116   }
117  
118  TString filename = dirname +"/"+ fFileName;
119  fFile = TFile::Open(filename.Data()); 
120  if ( fFile == 0x0)
121   {
122     Error("OpenFile","Can't open fFile %s",filename.Data());
123     return 2;
124   }
125  if (!fFile->IsOpen())
126   {
127     Error("OpenFile","Can't open fFile  %s",filename.Data());
128     delete fFile;
129     fFile = 0x0;
130     return 3;
131   }
132  
133  fTree = dynamic_cast<TTree*>(fFile->Get(fgkTreeName));
134  if (fTree == 0x0)
135   {
136     if (AliVAODParticle::GetDebug() > 2 )
137       {
138         Info("ReadNext","Can not find TTree object named %s",fgkTreeName.Data());
139       }
140     fCurrentDir++;
141     delete fFile;//we have to assume there is no more ESD objects in the fFile
142     fFile = 0x0;
143     return 4;
144   }
145
146   fTree->SetBranchAddress(fgkSimulatedDataBranchName,&fSimBuffer);
147   fTree->SetBranchAddress(fgkRecosntructedDataBranchName,&fRecBuffer);
148   
149   return 0;
150  
151 }
152
153 /********************************************************************/
154
155 Int_t AliReaderAOD::WriteAOD(AliReader* reader, const char* outfilename, const char* pclassname,  Bool_t /*multcheck*/)
156 {
157 //reads tracks from runs and writes them to file
158   ::Info("AliReaderAOD::Write","________________________________________________________");
159   ::Info("AliReaderAOD::Write","________________________________________________________");
160   ::Info("AliReaderAOD::Write","________________________________________________________");
161   
162   if (reader == 0x0)
163    {
164      ::Error("AliReaderAOD::Write","Input Reader is NULL");
165      return -1;
166    }
167   TFile *outfile = TFile::Open(outfilename,"recreate");
168   if (outfile == 0x0)
169    {
170      ::Error("AliReaderAOD::Write","Can not open output file %s",outfilename);
171      return -1;
172    }
173
174   TTree *tree = new TTree(fgkTreeName,"Tree with tracks");
175   
176   TBranch *recbranch = 0x0, *simbranch = 0x0;
177   
178   AliAOD* eventrec = new AliAOD();//must be created before Branch is called. Otherwise clones array is not splitted
179   AliAOD* eventsim = new AliAOD();//AOD together with fParticles clones array knowing exact type of particles
180   
181   eventrec->SetParticleClassName(pclassname);
182   eventsim->SetParticleClassName(pclassname);
183  
184   AliAOD* recbuffer = eventrec;
185   AliAOD* simbuffer = eventsim;
186   
187   if (reader->ReadsRec()) recbranch = tree->Branch(fgkRecosntructedDataBranchName,"AliAOD",&recbuffer,32000,99);
188   if (reader->ReadsSim()) simbranch = tree->Branch(fgkSimulatedDataBranchName,"AliAOD",&simbuffer,32000,99);
189
190   reader->Rewind();
191   while (reader->Next() == kFALSE)
192    {
193      
194      if (reader->ReadsRec())
195       {//here we can get AOD that has different particle type
196         AliAOD* event = reader->GetEventRec();
197         if ( eventrec->GetParticleClass() != event->GetParticleClass() )
198          {//if class type is not what what we whant we copy particles
199            eventrec->CopyData(event);
200            recbuffer = eventrec;
201          }
202         else
203          {//else just pointer to event from input reader is passed
204            recbuffer = event;
205          } 
206       }
207
208      if (reader->ReadsSim())
209       {
210         AliAOD* event = reader->GetEventRec();
211         if ( eventsim->GetParticleClass() != event->GetParticleClass() )
212          {//if class type is not what what we whant we copy particles
213            eventsim->CopyData(event);
214            simbuffer = eventrec;
215          }
216         else
217          {//else just pointer to event from input reader is passed
218            simbuffer = event;
219          } 
220       }
221      eventrec->GetParticle(0)->Print();
222      eventsim->GetParticle(0)->Print();
223      tree->Fill();
224    }
225   
226   ::Info("AliReaderAOD::Write","Written %d events",tree->GetEntries());
227   outfile->cd();
228   tree->Write();
229
230   delete eventsim;
231   delete eventrec;
232   
233   delete tree;
234   delete outfile;
235   return 0; 
236 }
237