new macros compliant with multiple events/files for TreeS,D,R
[u/mrichter/AliRoot.git] / ITS / AliITSHits2SDR.C
CommitLineData
53346a23 1#if !defined(__CINT__) || defined(__MAKECINT__)
2#include <iostream.h>
3#include <TClonesArray.h>
4#include <TFile.h>
5#include <TParticle.h>
6#include <TStopwatch.h>
7#include <TTree.h>
8#include <TFile.h>
9
10#include "AliRun.h"
11#include "AliHeader.h"
12#include "AliITS.h"
13#include "AliITSDetType.h"
14#include "AliITSsimulationFastPoints.h"
15#include "AliITSresponse.h"
16#include "AliITSresponseSDD.h"
17#include "AliITSreconstruction.h"
18#include "AliRunDigitizer.h"
19#include "AliITSsegmentationSDD.h"
20#include "AliITSDigitizer.h"
21
22#endif
23
24TFile* AccessInpFile(TString inFile);
25void writeAR(TFile * fin, TFile *fou);
26void AliITSSD2D(TString inFile = "galice.root", TString outFile = "");
27void AliITSH2FR2files (TString inFile, TString outfile);
28void AliITSH2SD2Files(TFile *file2);
29void copyTK(TString inFile, TString outFile);
30
31void AliITSHits2SDR(TString inFile = "galice.root", TString File1 = "galiceS.root",TString File2 = "galiceD.root", TString File3 = "galiceR.root"){
32 ////////////////////////////////////////////////////////////////////
33 // This macro takes hits from inFile file and
34 // produce fast RecPoints, Sdigits, Digits and slow Rec Points
35 // for the ITS using the standard detector simulations.
36 // The first argument is the input file which contains the tree with hits
37 // The second argument is the output file name onto which TreeS will
38 // be written.
39 // The third and fourth arguments are the file names onto which TreeD
40 // and TreeR+TreeC will be written (respectively).
41 // The AliRun object and the KINE tree will be saved onto
42 // these files as well.
43 // This macro will process all of the events on input the root file.
44 // This macro can be compiled and it should be launched from an aliroot
45 // session.
46 // WARNING: Fast Rec Points are written on a branch named ITSRecPointsF
47 // this macro should be used with aliroot (it does not load the libraries)
48 ////////////////////////////////////////////////////////////////////
49
50
51
52 // Produce Fast Rec Points (on File3)
53 cout<<"Producing Fast rec points...\n";
54 AliITSH2FR2files(inFile,File3);
55
56 // TreeK is copied to File3 (for comparison purposes)
57
58 copyTK(inFile,File3);
59
60 // Produce SDigits
61 TFile *file = AccessInpFile(inFile);
62 if(!file){
63 cerr<<"Problems in accessing the input file\n";
64 return;
65 }
66 TFile *file2 = gAlice->InitTreeFile("S",File1);
67 file2->cd();
68 cout<<"Producing Summable digits ....\n";
69 AliITSH2SD2Files(file2);
70 // write the AliRun object to the output file
71 writeAR(file,file2);
72 delete gAlice;
73 gAlice = 0;
74 file->Close();
75 delete file;
76 file2 = 0;
77
78 // Produce Digits
79 cout<<"Producing Digits ...\n";
80 AliITSSD2D(File1,File2);
81
82 // Produce Slow Rec. Points
83 TFile *fin = new TFile(File2);
84 gAlice = (AliRun*) fin->Get("gAlice");
85 const char *nulptr=0;
86 AliITSreconstruction *itsr = new AliITSreconstruction(nulptr);
87 itsr->SetOutputFile(File3);
88 itsr->Init();
89 itsr->Exec();
90 TFile *fou = gAlice->GetTreeRFile();
91 writeAR(fin,fou);
92 delete itsr;
93
94}
95
96void AliITSH2SD2Files(TFile *file2){
97
98 // Function used to produce s-digits
99
100 AliITS *ITS = (AliITS*) gAlice->GetModule("ITS");
101 if (!ITS) {
102 cerr<<"AliITS object not found on file" << endl;
103 return;
104 }
105 if(!(ITS->GetITSgeom())){
106 cerr << " AliITSgeom not found. Can't digitize without it." << endl;
107 return ;
108 }
109
cc2535cd 110 // these re-instantiations are necessary if the input file was created
111 // with aliroot version V3.07 or older
53346a23 112 AliITSresponseSDD *resp1 = (AliITSresponseSDD*)ITS->DetType(1)->GetResponseModel();
cc2535cd 113 resp1 = new AliITSresponseSDD();
114 ITS->SetResponseModel(1,resp1);
115 cout << "Changed response class for SDD: \n";
116 resp1->Print();
117
53346a23 118 for (Int_t nevent=0; nevent<gAlice->TreeE()->GetEntries(); nevent++) {
119 gAlice->GetEvent(nevent);
120 gAlice->MakeTree("S",file2);
121 ITS->MakeBranch("S");
122 ITS->SetTreeAddress();
123 ITS->Hits2SDigits();
124 }
125}
126
127
128TFile * AccessInpFile(TString inFile){
129
130 // Function used to open the input file and fetch the AliRun object
131
132 TFile *retfil = 0;
133 TFile *file = (TFile*)gROOT->GetListOfFiles()->FindObject(inFile);
134 if (file) {file->Close(); delete file;}
135 file = new TFile(inFile);
136 if (!file->IsOpen()) {
137 cerr<<"Can't open "<<inFile<<" !" << endl;
138 return retfil;
139 }
140
141 // Get AliRun object from file or return if not on file
142 if (gAlice) delete gAlice; gAlice = 0;
143 gAlice = (AliRun*)file->Get("gAlice");
144 if (!gAlice) {
145 cerr << "AliRun object not found on file"<< endl;
146 return retfil;
147 }
148 return file;
149}
150
151void writeAR(TFile * fin, TFile *fou) {
152 TDirectory *current = gDirectory;
153 TTree *Te;
154 TTree *TeNew;
155 AliHeader *alhe = new AliHeader();
156 Te = (TTree*)fin->Get("TE");
157 Te->SetBranchAddress("Header",&alhe);
158 Te->SetBranchStatus("*",1);
159 fou->cd();
160 TeNew = Te->CloneTree();
161 TeNew->Write(0,TObject::kOverwrite);
162 gAlice->Write(0,TObject::kOverwrite);
163 current->cd();
164 delete alhe;
165 cout<<"AliRun object written to file\n";
166}
167
168
169void AliITSSD2D(TString inFile, TString outFile){
170 AliRunDigitizer * manager = new AliRunDigitizer(1,1);
171 char ftmp[50];
172 sprintf(ftmp,"%s",inFile.Data());
173 manager->SetInputStream(0,ftmp);
174 if(outFile != "")manager->SetOutputFile(outFile);
175 AliITSDigitizer *dITS = new AliITSDigitizer(manager);
176 manager->Exec("");
177 TFile *file = (TFile*)gROOT->GetListOfFiles()->FindObject(inFile);
178 TFile *file2= new TFile(outFile,"update");
179 writeAR(file,file2);
180 delete dITS;
181 delete manager;
182 file = (TFile*)gROOT->GetListOfFiles()->FindObject(inFile);
183 if(file){
184 file->Close();
185 delete file;
186 }
187 file2->Close();
188 delete file2;
189}
190
191void AliITSH2FR2files (TString inFile, TString outfile)
192{
193
194 TFile * file = AccessInpFile(inFile);
195 if(!file){
196 cerr<<"*** AliITSH2FR2files: Problems in accessing the input file\n";
197 return;
198 }
199
200 // open output file and create TreeR on it
201 TFile * file2 = gAlice->InitTreeFile("R",outfile);
202 file2->cd();
203 // get ITS
204 AliITS *ITS = (AliITS*) gAlice->GetModule("ITS");
205 if (!ITS) {
206 cerr<<"ITSH2FR2files.C : AliITS object not found on file" << endl;
207 return;
208 } // end if !ITS
209
210 // Set the simulation model
211
212 for (Int_t i=0;i<3;i++) {
213 ITS->SetSimulationModel(i,new AliITSsimulationFastPoints());
214 }
215
216
217 //
218 // Event Loop
219 //
220 Int_t nsignal=25;
221 Int_t size=-1;
222 TStopwatch timer;
223 for (Int_t nevent=0; nevent<gAlice->TreeE()->GetEntries(); nevent++) {
224 gAlice->GetEvent(nevent);
225 if(!gAlice->TreeR())gAlice->MakeTree("R",file2);
226 ITS->MakeBranch("RF");
227 ITS->SetTreeAddress();
228 Int_t bgr_ev=nevent/nsignal;
229 ITS->HitsToFastRecPoints(nevent,bgr_ev,size," ","All"," ");
230 }
231
232 timer.Stop(); timer.Print();
233
234 delete gAlice;
235 gAlice = 0;
236 file->Close();
237}
238
239void copyTK(TString inFile, TString outFile) {
240
241 TDirectory *current = gDirectory;
242 TParticle *part = new TParticle();
243 TTree *Tk;
244 TTree *TkNew;
245 TFile *fin = AccessInpFile(inFile);
246 TFile *fou = new TFile(outFile,"update");
247 char tname[30];
248 for(Int_t event= 0; event < gAlice->TreeE()->GetEntries(); event++){
249 current->cd();
250 sprintf(tname,"TreeK%d",event);
251 Tk = (TTree*)fin->Get(tname);
252 if(!Tk){
253 cerr<<"Trying to access a non-existent TTree : "<<tname<<endl;
254 }
255 else {
256 Tk->SetBranchAddress("Particles",&part);
257 Tk->SetBranchStatus("*",1);
258 fou->cd();
259 TkNew = Tk->CloneTree();
260 TkNew->Write();
261 }
262 }
263 delete gAlice;
264 gAlice = 0;
265 fin->Close();
266 fou->Close();
267 delete fin;
268 delete fou;
269 current->cd();
270
271}