Option to read both DATE and ROOT raw data format included. Bug fixes in AliITSvBeamT...
[u/mrichter/AliRoot.git] / ITS / AliITSBeamTestDigitizer.cxx
1 ////////////////////////////////////////////////////
2 //  Class to manage the                           //
3 //  ITS beam test conversion from rawdata         //
4 //  to digits. It executes the digitization for   //
5 //  SPD, SDD and SSD.                             //
6 //  Origin:  E. Crescio crescio@to.infn.it        //
7 //           J. Conrad  Jan.Conrad@cern.ch        //
8 ////////////////////////////////////////////////////
9 #include "AliHeader.h"
10 #include "AliRun.h"
11 #include "AliRunLoader.h"
12 #include "AliITSEventHeader.h"
13 #include "AliITSLoader.h"
14 #include "AliITSvBeamTestITS04.h"
15 #include "AliITSvSDD03.h"
16 #include "AliITSBeamTestDigSDD.h"
17 #include "AliITSBeamTestDigSPD.h"
18 #include "AliITSBeamTestDigSSD.h"
19 #include "AliITSBeamTestDigitizer.h"
20 #include "AliRawReaderDate.h"
21 #include "AliRawReaderRoot.h"
22 #include "TGeoManager.h"
23 #include "TGeoMaterial.h"
24 #include "TGeoMedium.h"
25 #include "TGeoVolume.h"
26 #include <TVirtualMC.h>
27 //#include <TGeant3.h>
28
29 const TString AliITSBeamTestDigitizer::fgkDefaultDigitsFileName="ITS.Digits.root";  
30
31 ClassImp(AliITSBeamTestDigitizer)
32
33
34 //_____________________________________________________________
35 AliITSBeamTestDigitizer::AliITSBeamTestDigitizer():TTask() 
36 {  
37   //
38   // Default constructor
39   //
40   fRunLoader = 0;
41   fLoader =0;
42   fEvIn=0;
43   fEvFin=0;
44   fFlagHeader=kTRUE;
45   fDATEEvType=7;
46   fRunNumber=-1;
47   SetFlagInit();
48   SetOptDate();
49   fBt=0;
50   fPeriod=kNov04;
51
52
53 //_____________________________________________________________
54   AliITSBeamTestDigitizer::AliITSBeamTestDigitizer(const Text_t* name, const Text_t* title, Char_t* opt):TTask(name,title) 
55 {  
56   //
57   // Standard constructor 
58   //
59   fRunLoader=0;
60   fLoader=0;
61   fBt=0;
62   fEvIn=0;
63   fEvFin=0;
64   fDATEEvType=7;
65   fFlagHeader=kTRUE;
66   fRunNumber=-1;
67   SetOptDate();
68
69   TString choice(opt);
70   Bool_t aug04 = choice.Contains("Aug04");
71   Bool_t nov04 = choice.Contains("Nov04");
72   if(aug04) fPeriod=kAug04;
73   if(nov04) fPeriod=kNov04;
74   Init();
75  } 
76
77 //_____________________________________________________________
78   AliITSBeamTestDigitizer::AliITSBeamTestDigitizer(const Text_t* name, const Text_t* title, Int_t run, Char_t* opt):TTask(name,title) 
79
80 {  
81   //
82   // Constructor 
83   //
84   fRunLoader=0;
85   fLoader=0;
86   fBt=0;
87   fEvIn=0;
88   fEvFin=0;
89   fDATEEvType=7;
90   fFlagHeader=kTRUE;
91   fRunNumber=run;
92   SetOptDate();
93   TString choice(opt);
94   Bool_t aug04 = choice.Contains("Aug04");
95   Bool_t nov04 = choice.Contains("Nov04");
96   if(aug04) fPeriod=kAug04;
97   if(nov04) fPeriod=kNov04;
98
99   Init();
100  } 
101
102 //___________________________________________________________
103 void AliITSBeamTestDigitizer::Init(){
104
105   //
106   //Initialization of run loader and its loader 
107   //creation of galice.root
108   //
109
110   fRunLoader = AliRunLoader::Open("galice.root",
111                                   AliConfig::GetDefaultEventFolderName(),"recreate");
112   
113   gAlice->SetRunLoader(fRunLoader);    
114   fRunLoader->SetEventFolderName();
115   if(GetBeamTestPeriod()==kNov04){
116     if(gGeoManager) delete gGeoManager;
117     gGeoManager = new TGeoManager("ITSGeometry","ITS Simulation Geometry Manager");
118     TGeoMaterial *vacmat = new TGeoMaterial("Vacuum",0,0,0);
119     TGeoMedium   *vacmed = new TGeoMedium("Vacuum_med",1,vacmat);
120     TGeoVolume *aLICE = gGeoManager->MakeBox("ALICE",vacmed,100.,100.,200.);
121     gGeoManager->SetTopVolume(aLICE);  
122     fBt = new AliITSvBeamTestITS04("ITS","ITS beam test");
123     fBt->CreateGeometry();
124     fBt->Init();
125
126   }
127   if(GetBeamTestPeriod()==kAug04){
128     fBt = new AliITSvSDD03("ITS",2004);
129     gSystem->Load("libgeant321");
130     //    new TGeant3("C++ Interface to Geant3");
131     if(strcmp(gMC->GetName(),"TGeant3")) {
132         Fatal("Init","TGeant3 should be instantiated in advance");
133         return;
134     } 
135     fBt->CreateMaterials();
136     fBt->CreateGeometry();
137     fBt->Init();
138   }
139   gAlice->AddModule(fBt);
140   fBt->SetDefaults();   
141   fRunLoader->AddLoader(fBt);
142   fLoader = (AliITSLoader*)fRunLoader->GetLoader("ITSLoader");
143   fRunLoader->MakeTree("E");  
144   fRunLoader->WriteHeader("OVERWRITE");
145   fRunLoader->WriteRunLoader("OVERWRITE");
146   fRunLoader->WriteAliRun("OVERWRITE"); 
147   
148   fDigitsFileName=fgkDefaultDigitsFileName;
149   this->Add(new AliITSBeamTestDigSPD("DigSPD","SPD Digitization")); 
150   this->Add(new AliITSBeamTestDigSDD("DigSDD","SDD Digitization")); 
151   this->Add(new AliITSBeamTestDigSSD("DigSSD","SSD Digitization"));
152
153   SetFlagInit(kTRUE);
154 }
155
156 //_____________________________________________________________
157   AliITSBeamTestDigitizer::AliITSBeamTestDigitizer(const char* filename)
158 {
159   //
160   // Constructor for reading (reads galice.root)
161   //
162
163   fRunLoader = AliRunLoader::Open(filename);
164   if (fRunLoader == 0x0)
165     {
166       Error("AliITSBeamTestDigitizer","Can not load the session",filename);
167       return;
168     }
169   fRunLoader->LoadgAlice();
170   gAlice = fRunLoader->GetAliRun();
171   
172   if(!gAlice) {
173     Error("AliITSBeamTestDigitizer","gAlice not found on file. Aborting.");
174     return;
175   } 
176   
177   fLoader = (AliITSLoader*)fRunLoader->GetLoader("ITSLoader");
178   
179   //fBt = (AliITSBeamTest*)gAlice->GetDetector("ITS");
180   fBt->SetDefaults();
181
182   fDigitsFileName=fgkDefaultDigitsFileName;
183
184   fEvIn=0;
185   fEvFin=0;
186   SetOptDate();
187   
188 }
189
190 //______________________________________________________________________
191 AliITSBeamTestDigitizer::AliITSBeamTestDigitizer(const AliITSBeamTestDigitizer &bt):TTask(bt){
192   // Copy constructor. 
193   //not allowed
194   if(this==&bt) return;
195   Error("Copy constructor",
196         "You are not allowed to make a copy of the AliITSBeamTestDigitizer");
197   exit(1);
198
199 }
200 //______________________________________________________________________
201 AliITSBeamTestDigitizer& AliITSBeamTestDigitizer::operator=(const AliITSBeamTestDigitizer &source){
202     // Assignment operator. This is a function which is not allowed to be
203     // done to the ITS beam test digitizer. It exits with an error.
204     // Inputs:
205     if(this==&source) return *this;
206     Error("operator=","You are not allowed to make a copy of the AliITSBeamTestDigitizer");
207     exit(1);
208     return *this; //fake return
209 }
210
211
212 //______________________________________________________________
213 AliITSBeamTestDigitizer::~AliITSBeamTestDigitizer(){
214
215   //Destructor
216   if(fBt) delete fBt;
217   if(fLoader) delete fLoader;
218   if(fHeader) delete fHeader;
219
220
221
222 //_____________________________________________________________
223 void AliITSBeamTestDigitizer::SetNumberOfEventsPerFile(Int_t nev)
224 {
225   //Sets number of events per file
226
227   if(fRunLoader) fRunLoader->SetNumberOfEventsPerFile(nev);
228   else Warning("SetNumberOfEventsPerFile","fRunLoader is 0");
229 }
230
231
232 //____________________________________________________
233 void AliITSBeamTestDigitizer::ExecDigitization(){
234
235   // Execution of digitisation for SPD,SDD and SSD
236
237   if(!GetFlagInit()){
238     Warning("ExecDigitization()","Run Init() please..");
239     return;
240   }
241   fLoader->SetDigitsFileName(fDigitsFileName);
242   fLoader->LoadDigits("recreate");
243  
244   AliRawReader* rd;
245
246   if(GetOptDate()) rd = new AliRawReaderDate(fRawdataFileName,fEvIn);
247   else rd = new AliRawReaderRoot(fRawdataFileName,fEvIn);
248
249   AliHeader* header = fRunLoader->GetHeader();
250   
251   Int_t iev=fEvIn-1;
252
253   
254   AliITSBeamTestDigSDD* digSDD = (AliITSBeamTestDigSDD*)fTasks->FindObject("DigSDD");
255   AliITSBeamTestDigSPD* digSPD = (AliITSBeamTestDigSPD*)fTasks->FindObject("DigSPD");
256   AliITSBeamTestDigSSD* digSSD = (AliITSBeamTestDigSSD*)fTasks->FindObject("DigSSD");
257
258
259   do{
260     iev++;
261     if(fEvFin!=0){
262       if(iev>fEvFin) break;
263     } 
264     AliITSEventHeader* itsh = new AliITSEventHeader("ITSHeader");
265     fRunLoader->SetEventNumber(iev);
266    
267     rd->RequireHeader(fFlagHeader);
268     rd->SelectEvents(fDATEEvType);
269  
270     digSDD->SetRawReader(rd);
271     digSPD->SetRawReader(rd);
272     digSSD->SetRawReader(rd);
273     
274     if(fLoader->TreeD() == 0x0) fLoader->MakeTree("D");
275
276     TTree* treeD = (TTree*)fLoader->TreeD();
277    
278     // Make branches outside the dig-classes
279
280     TClonesArray* digitsSPD = new TClonesArray("AliITSdigitSPD",1000);
281     treeD->Branch("ITSDigitsSPD",&digitsSPD);
282  
283     TClonesArray* digitsSDD = new TClonesArray("AliITSdigitSDD",1000);
284     treeD->Branch("ITSDigitsSDD",&digitsSDD);
285    
286     TClonesArray* digitsSSD = new TClonesArray("AliITSdigitSSD",1000);
287     treeD->Branch("ITSDigitsSSD",&digitsSSD);
288
289
290     digSSD->SetTree(treeD);
291     digSDD->SetTree(treeD);
292     digSPD->SetTree(treeD);
293     
294     digSSD->SetBeamTest(fBt);
295     digSDD->SetBeamTest(fBt);
296     digSPD->SetBeamTest(fBt);
297     
298     digSSD->SetITSEventHeader(itsh);
299     digSDD->SetITSEventHeader(itsh);
300     digSPD->SetITSEventHeader(itsh);
301
302     digSDD->SetBtPeriod(GetBeamTestPeriod());
303     if(GetBeamTestPeriod()==1)digSDD->SetThreshold(16);
304     else digSDD->SetThreshold(0);
305     ExecuteTask(0);  
306
307     header->SetEventNrInRun(iev);
308     header->SetEvent(iev);
309     header->SetRun(fRunNumber);
310     fRunLoader->GetHeader()->AddDetectorEventHeader(itsh);
311     fRunLoader->TreeE()->Fill();
312     header->Reset(fRunNumber,iev);
313     
314     delete digitsSPD;
315     delete digitsSDD;
316     delete digitsSSD;
317
318    }while(rd->NextEvent());
319
320   
321   fRunLoader->WriteHeader("OVERWRITE");
322   fRunLoader->WriteRunLoader("OVERWRITE");
323
324   delete rd;
325   fLoader->UnloadDigits();
326   fLoader->UnloadRawClusters();
327   fRunLoader->UnloadHeader();
328
329   
330 }
331
332
333
334 //_______________________________________________
335 void AliITSBeamTestDigitizer:: SetActive(const TString& subdet,Bool_t value){
336
337   //Sets active sub-tasks (detectors)
338   
339   Bool_t sdd = subdet.Contains("SDD");
340   Bool_t spd = subdet.Contains("SPD");
341   Bool_t ssd = subdet.Contains("SSD");
342
343   if(sdd){
344   AliITSBeamTestDigSDD* digSDD = (AliITSBeamTestDigSDD*)fTasks->FindObject("DigSDD");
345   digSDD->SetActive(value);
346   }
347   
348  if(spd){
349   AliITSBeamTestDigSPD* digSPD = (AliITSBeamTestDigSPD*)fTasks->FindObject("DigSPD");
350   digSPD->SetActive(value);
351   
352   }
353  
354   if(ssd){
355   AliITSBeamTestDigSSD* digSSD = (AliITSBeamTestDigSSD*)fTasks->FindObject("DigSSD");
356   digSSD->SetActive(value);
357   
358   }
359
360
361
362 }
363