Bug corrected.
[u/mrichter/AliRoot.git] / STEER / AliRun.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 /* $Id$ */
17
18 ///////////////////////////////////////////////////////////////////////////////
19 //                                                                           //
20 //  Control class for Alice C++                                              //
21 //  Only one single instance of this class exists.                           //
22 //  The object is created in main program aliroot                            //
23 //  and is pointed by the global gAlice.                                     //
24 //                                                                           //
25 //   -Supports the list of all Alice Detectors (fModules).                 //
26 //   -Supports the list of particles (fParticles).                           //
27 //   -Supports the Trees.                                                    //
28 //   -Supports the geometry.                                                 //
29 //   -Supports the event display.                                            //
30 //Begin_Html
31 /*
32 <img src="picts/AliRunClass.gif">
33 */
34 //End_Html
35 //Begin_Html
36 /*
37 <img src="picts/alirun.gif">
38 */
39 //End_Html
40 //                                                                           //
41 ///////////////////////////////////////////////////////////////////////////////
42
43 #include <TCint.h> 
44 #include <TROOT.h>
45 #include <TRandom3.h>
46 #include <TSystem.h>
47 #include <TVirtualMC.h>
48 #include <TGeoManager.h>
49 // 
50 #include "AliLog.h"
51 #include "AliDetector.h"
52 #include "AliHeader.h"
53 #include "AliMC.h"
54 #include "AliPDG.h"
55 #include "AliRun.h"
56 #include "AliStack.h"
57 #include "AliCDBManager.h"
58 #include "AliAlignObj.h"
59 #include "AliSimulation.h"
60 #include "AliLego.h"
61
62 AliRun *gAlice;
63
64 ClassImp(AliRun)
65
66 //_______________________________________________________________________
67 AliRun::AliRun():
68 //  fRun(-1),
69   fEventNrInRun(-1),
70   fModules(0),
71   fMCApp(0),
72   fNdets(0),
73   fConfigFunction(""),
74   fBaseFileName(""),
75   fRunLoader(0x0)
76 {
77   //
78   // Default constructor for AliRun
79   //
80   AliConfig::Instance();//skowron 29 Feb 2002
81                         //ensures that the folder structure is build
82
83 }
84
85 //_____________________________________________________________________________
86 AliRun::AliRun(const char *name, const char *title):
87   TNamed(name,title),
88   fEventNrInRun(-1),
89   fModules(new TObjArray(77)), // Support list for the Detectors
90   fMCApp(new AliMC(GetName(),GetTitle())),
91   fNdets(0),
92   fConfigFunction("Config();"),
93   fBaseFileName(""),
94   fRunLoader(0x0)
95 {
96   //
97   //  Constructor for the main processor.
98   //  Creates the geometry
99   //  Creates the list of Detectors.
100   //  Creates the list of particles.
101   //
102
103   gAlice     = this;
104
105   // Set random number generator
106   gRandom = new TRandom3();
107
108   if (gSystem->Getenv("CONFIG_SEED")) {
109      gRandom->SetSeed(static_cast<UInt_t>(atoi(gSystem->Getenv("CONFIG_SEED"))));
110   }
111
112   // Add to list of browsable  
113   gROOT->GetListOfBrowsables()->Add(this,name);
114   
115 }
116
117 //_______________________________________________________________________
118 AliRun::~AliRun()
119 {
120   //
121   // Default AliRun destructor
122   //
123   gROOT->GetListOfBrowsables()->Remove(this);
124
125   if (fRunLoader)
126    {
127     TFolder* evfold = fRunLoader->GetEventFolder();
128     TFolder* modfold = dynamic_cast<TFolder*>(evfold->FindObjectAny(AliConfig::GetModulesFolderName()));
129     TIter next(fModules);
130     AliModule *mod;
131     while((mod = (AliModule*)next()))
132      { 
133        modfold->Remove(mod);
134      }
135    }
136     
137   delete fMCApp;
138   delete gMC; gMC=0;
139   if (fModules) {
140     fModules->Delete();
141     delete fModules;
142   }
143   
144 }
145
146 //_____________________________________________________________________________
147 void AliRun::InitLoaders()
148 {
149   //creates list of getters
150   AliDebug(1, "");
151   TIter next(fModules);
152   AliModule *mod;
153   while((mod = (AliModule*)next()))
154    { 
155      mod->SetRunLoader(fRunLoader);
156      AliDetector *det = dynamic_cast<AliDetector*>(mod);
157      if (det) 
158       {
159         AliDebug(2, Form("Adding %s", det->GetName()));
160         fRunLoader->AddLoader(det);
161       }
162    }
163   AliDebug(1, "Done");
164 }
165
166 //_______________________________________________________________________
167 void AliRun::Announce() const
168 {
169   //
170   // Announce the current version of AliRoot
171   //
172   printf("%70s",
173          "****************************************************************\n");
174   printf("%6s","*");printf("%64s","*\n");
175
176   printf("%6s","*");
177   printf("    You are running AliRoot version NewIO\n");
178
179   printf("%6s","*");
180   printf("    The SVN version for the current program is $Id$\n");
181
182   printf("%6s","*");printf("%64s","*\n");
183   printf("%70s",
184          "****************************************************************\n");
185 }
186
187 //_______________________________________________________________________
188 AliModule *AliRun::GetModule(const char *name) const
189 {
190   //
191   // Return pointer to detector from name
192   //
193   return dynamic_cast<AliModule*>(fModules->FindObject(name));
194 }
195  
196 //_______________________________________________________________________
197 AliDetector *AliRun::GetDetector(const char *name) const
198 {
199   //
200   // Return pointer to detector from name
201   //
202   return dynamic_cast<AliDetector*>(fModules->FindObject(name));
203 }
204  
205 //_______________________________________________________________________
206 Int_t AliRun::GetModuleID(const char *name) const
207 {
208   //
209   // Return galice internal detector identifier from name
210   //
211   Int_t i=-1;
212   TObject *mod=fModules->FindObject(name);
213   if(mod) i=fModules->IndexOf(mod);
214   return i;
215 }
216  
217 //_______________________________________________________________________
218 Int_t AliRun::GetEvent(Int_t event)
219 {
220 //
221 // Reloads data containers in folders # event
222 // Set branch addresses
223 //
224   if (fRunLoader == 0x0)
225    {
226      AliError("RunLoader is not set. Can not load data.");
227      return -1;
228    }
229 /*****************************************/ 
230 /****   P R E    R E L O A D I N G    ****/
231 /*****************************************/ 
232 // Reset existing structures
233   fMCApp->ResetHits();
234   fMCApp->ResetTrackReferences();
235   fMCApp->ResetDigits();
236   fMCApp->ResetSDigits();
237
238 /*****************************************/ 
239 /****       R  E  L  O  A  D          ****/
240 /*****************************************/
241
242   AliRunLoader::Instance()->GetEvent(event);
243
244 /*****************************************/ 
245 /****  P O S T    R E L O A D I N G   ****/
246 /*****************************************/ 
247
248   // Set Trees branch addresses
249   TIter next(fModules);
250   AliDetector *detector;
251   while((detector = dynamic_cast<AliDetector*>(next()))) 
252    {
253      detector->SetTreeAddress();
254    }
255  
256   return AliRunLoader::Instance()->GetHeader()->GetNtrack();
257 }
258
259 //_______________________________________________________________________
260 void AliRun::SetBaseFile(const char *filename)
261 {
262   fBaseFileName = filename;
263 }
264
265
266 //_______________________________________________________________________
267 void AliRun::Hits2Digits(const char *selected)
268 {
269
270    // Convert Hits to sumable digits
271    // 
272    for (Int_t nevent=0; nevent<AliRunLoader::Instance()->TreeE()->GetEntries(); nevent++) {
273      GetEvent(nevent);
274      Hits2SDigits(selected);
275      SDigits2Digits(selected);
276    }  
277 }
278
279
280 //_______________________________________________________________________
281 void AliRun::Tree2Tree(Option_t *option, const char *selected)
282 {
283   //
284   // Function to transform the content of
285   //  
286   // - TreeH to TreeS (option "S")
287   // - TreeS to TreeD (option "D")
288   // - TreeD to TreeR (option "R")
289   // 
290   // If multiple options are specified ("SDR"), transformation will be done in sequence for
291   // selected detector and for all detectors if none is selected (detector string 
292   // can contain blank separated list of detector names). 
293
294
295    const char *oS = strstr(option,"S");
296    const char *oD = strstr(option,"D");
297    const char *oR = strstr(option,"R");
298    
299    TObjArray *detectors = Detectors();
300
301    TIter next(detectors);
302
303    AliDetector *detector = 0;
304
305    while((detector = dynamic_cast<AliDetector*>(next()))) {
306      if (selected) 
307        if (strcmp(detector->GetName(),selected)) continue;
308      if (detector->IsActive())
309       { 
310        
311        AliLoader* loader = detector->GetLoader();
312        if (loader == 0x0) continue;
313        
314        if (oS) 
315         {
316           AliDebug(1, Form("Processing Hits2SDigits for %s ...", detector->GetName()));
317           loader->LoadHits("read");
318           if (loader->TreeS() == 0x0) loader->MakeTree("S");
319           detector->MakeBranch(option);
320           detector->SetTreeAddress();
321           detector->Hits2SDigits();
322           loader->UnloadHits();
323           loader->UnloadSDigits();
324         }  
325        if (oD) 
326         {
327           AliDebug(1, Form("Processing SDigits2Digits for %s ...", detector->GetName()));
328           loader->LoadSDigits("read");
329           if (loader->TreeD() == 0x0) loader->MakeTree("D");
330           detector->MakeBranch(option);
331           detector->SetTreeAddress();
332           detector->SDigits2Digits();
333           loader->UnloadSDigits();
334           loader->UnloadDigits();
335         } 
336        if (oR) 
337         {
338           AliDebug(1, Form("Processing Digits2Reco for %s ...", detector->GetName()));
339           loader->LoadDigits("read");
340           if (loader->TreeR() == 0x0) loader->MakeTree("R");
341           detector->MakeBranch(option);
342           detector->SetTreeAddress();
343           detector->Digits2Reco(); 
344           loader->UnloadDigits();
345           loader->UnloadRecPoints();
346
347         }
348      }   
349    }
350 }
351
352
353 //_______________________________________________________________________
354 void AliRun::Streamer(TBuffer &R__b)
355 {
356   // Stream an object of class AliRun.
357
358   if (R__b.IsReading()) {
359     if (!gAlice) gAlice = this;
360     AliRun::Class()->ReadBuffer(R__b, this);
361     gROOT->GetListOfBrowsables()->Add(this,"Run");
362     gRandom = new TRandom3();
363   } else {
364     AliRun::Class()->WriteBuffer(R__b, this);
365   }
366 }
367
368 //_______________________________________________________________________
369 void AliRun::SetGenEventHeader(AliGenEventHeader* header)
370 {
371   AliRunLoader::Instance()->GetHeader()->SetGenEventHeader(header);
372 }
373
374
375 //_______________________________________________________________________
376 Int_t AliRun::GetEvNumber() const
377
378 //Returns number of current event  
379   if (fRunLoader == 0x0)
380    {
381      AliError("RunLoader is not set. Can not load data.");
382      return -1;
383    }
384
385   return fRunLoader->GetEventNumber();
386 }
387
388 //_______________________________________________________________________
389 void AliRun::SetRunLoader(AliRunLoader* rloader)
390 {
391   //
392   // Set the loader of the run
393   //
394   fRunLoader = rloader;
395   if (fRunLoader == 0x0) return;
396   
397   TString evfoldname;
398   TFolder* evfold = fRunLoader->GetEventFolder();
399   if (evfold) evfoldname = evfold->GetName();
400   else AliWarning("Did not get Event Folder from Run Loader");
401   
402   if ( fRunLoader->GetAliRun() )
403    {//if alrun already exists in folder
404     if (fRunLoader->GetAliRun() != this )
405      {//and is different than this - crash
406        AliFatal("AliRun is already in Folder and it is not this object");
407        return;//pro forma
408      }//else do nothing
409    }
410   else
411    {
412      evfold->Add(this);//Post this AliRun to Folder
413    }
414   
415   TIter next(fModules);
416   AliModule *module;
417   while((module = (AliModule*)next())) 
418    {
419      if (evfold) AliConfig::Instance()->Add(module,evfoldname);
420      module->SetRunLoader(fRunLoader);
421      AliDetector* detector = dynamic_cast<AliDetector*>(module);
422      if (detector)
423       {
424         AliLoader* loader = fRunLoader->GetLoader(detector);
425         if (loader == 0x0)
426          {
427            AliError(Form("Can not get loader for detector %s", detector->GetName()));
428          }
429         else
430          {
431            AliDebug(1, Form("Setting loader for detector %s", detector->GetName()));
432            detector->SetLoader(loader);
433          }
434       }
435    }
436 }
437
438 //_______________________________________________________________________
439 void AliRun::AddModule(AliModule* mod)
440 {
441   //
442   // Add a module to the module list
443   //
444   if (mod == 0x0) return;
445   if (strlen(mod->GetName()) == 0) return;
446   if (GetModuleID(mod->GetName()) >= 0) return;
447   
448   AliDebug(1, mod->GetName());
449   if (fRunLoader == 0x0) AliConfig::Instance()->Add(mod);
450   else AliConfig::Instance()->Add(mod,fRunLoader->GetEventFolder()->GetName());
451
452   Modules()->Add(mod);
453   
454   fNdets++;
455 }
456