b98344209a6e93f24b66c123aac50f6c4207e1a9
[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     if(!modfold) AliFatal(Form("Folder %s not found\n",AliConfig::GetModulesFolderName().Data()));
130     TIter next(fModules);
131     AliModule *mod;
132     while((mod = (AliModule*)next()))
133      { 
134        modfold->Remove(mod);
135      }
136    }
137     
138   delete fMCApp;
139   delete gMC; gMC=0;
140   if (fModules) {
141     fModules->Delete();
142     delete fModules;
143   }
144   
145 }
146
147 //_____________________________________________________________________________
148 void AliRun::InitLoaders()
149 {
150   //creates list of getters
151   AliDebug(1, "");
152   TIter next(fModules);
153   AliModule *mod;
154   while((mod = (AliModule*)next()))
155    { 
156      mod->SetRunLoader(fRunLoader);
157      AliDetector *det = dynamic_cast<AliDetector*>(mod);
158      if (det) 
159       {
160         AliDebug(2, Form("Adding %s", det->GetName()));
161         fRunLoader->AddLoader(det);
162       }
163    }
164   AliDebug(1, "Done");
165 }
166
167 //_______________________________________________________________________
168 void AliRun::Announce() const
169 {
170   //
171   // Announce the current version of AliRoot
172   //
173   printf("%70s",
174          "****************************************************************\n");
175   printf("%6s","*");printf("%64s","*\n");
176
177   printf("%6s","*");
178   printf("    You are running AliRoot version NewIO\n");
179
180   printf("%6s","*");
181   printf("    The SVN version for the current program is $Id$\n");
182
183   printf("%6s","*");printf("%64s","*\n");
184   printf("%70s",
185          "****************************************************************\n");
186 }
187
188 //_______________________________________________________________________
189 AliModule *AliRun::GetModule(const char *name) const
190 {
191   //
192   // Return pointer to detector from name
193   //
194   return dynamic_cast<AliModule*>(fModules->FindObject(name));
195 }
196  
197 //_______________________________________________________________________
198 AliDetector *AliRun::GetDetector(const char *name) const
199 {
200   //
201   // Return pointer to detector from name
202   //
203   return dynamic_cast<AliDetector*>(fModules->FindObject(name));
204 }
205  
206 //_______________________________________________________________________
207 Int_t AliRun::GetModuleID(const char *name) const
208 {
209   //
210   // Return galice internal detector identifier from name
211   //
212   Int_t i=-1;
213   TObject *mod=fModules->FindObject(name);
214   if(mod) i=fModules->IndexOf(mod);
215   return i;
216 }
217  
218 //_______________________________________________________________________
219 Int_t AliRun::GetEvent(Int_t event)
220 {
221 //
222 // Reloads data containers in folders # event
223 // Set branch addresses
224 //
225   if (fRunLoader == 0x0)
226    {
227      AliError("RunLoader is not set. Can not load data.");
228      return -1;
229    }
230 /*****************************************/ 
231 /****   P R E    R E L O A D I N G    ****/
232 /*****************************************/ 
233 // Reset existing structures
234   fMCApp->ResetHits();
235   fMCApp->ResetTrackReferences();
236   fMCApp->ResetDigits();
237   fMCApp->ResetSDigits();
238
239 /*****************************************/ 
240 /****       R  E  L  O  A  D          ****/
241 /*****************************************/
242
243   AliRunLoader::Instance()->GetEvent(event);
244
245 /*****************************************/ 
246 /****  P O S T    R E L O A D I N G   ****/
247 /*****************************************/ 
248
249   // Set Trees branch addresses
250   TIter next(fModules);
251   AliDetector *detector;
252   while((detector = dynamic_cast<AliDetector*>(next()))) 
253    {
254      detector->SetTreeAddress();
255    }
256  
257   return AliRunLoader::Instance()->GetHeader()->GetNtrack();
258 }
259
260 //_______________________________________________________________________
261 void AliRun::SetBaseFile(const char *filename)
262 {
263   fBaseFileName = filename;
264 }
265
266
267 //_______________________________________________________________________
268 void AliRun::Hits2Digits(const char *selected)
269 {
270
271    // Convert Hits to sumable digits
272    // 
273    for (Int_t nevent=0; nevent<AliRunLoader::Instance()->TreeE()->GetEntries(); nevent++) {
274      GetEvent(nevent);
275      Hits2SDigits(selected);
276      SDigits2Digits(selected);
277    }  
278 }
279
280
281 //_______________________________________________________________________
282 void AliRun::Tree2Tree(Option_t *option, const char *selected)
283 {
284   //
285   // Function to transform the content of
286   //  
287   // - TreeH to TreeS (option "S")
288   // - TreeS to TreeD (option "D")
289   // - TreeD to TreeR (option "R")
290   // 
291   // If multiple options are specified ("SDR"), transformation will be done in sequence for
292   // selected detector and for all detectors if none is selected (detector string 
293   // can contain blank separated list of detector names). 
294
295
296    const char *oS = strstr(option,"S");
297    const char *oD = strstr(option,"D");
298    const char *oR = strstr(option,"R");
299    
300    TObjArray *detectors = Detectors();
301
302    TIter next(detectors);
303
304    AliDetector *detector = 0;
305
306    while((detector = dynamic_cast<AliDetector*>(next()))) {
307      if (selected) 
308        if (strcmp(detector->GetName(),selected)) continue;
309      if (detector->IsActive())
310       { 
311        
312        AliLoader* loader = detector->GetLoader();
313        if (loader == 0x0) continue;
314        
315        if (oS) 
316         {
317           AliDebug(1, Form("Processing Hits2SDigits for %s ...", detector->GetName()));
318           loader->LoadHits("read");
319           if (loader->TreeS() == 0x0) loader->MakeTree("S");
320           detector->MakeBranch(option);
321           detector->SetTreeAddress();
322           detector->Hits2SDigits();
323           loader->UnloadHits();
324           loader->UnloadSDigits();
325         }  
326        if (oD) 
327         {
328           AliDebug(1, Form("Processing SDigits2Digits for %s ...", detector->GetName()));
329           loader->LoadSDigits("read");
330           if (loader->TreeD() == 0x0) loader->MakeTree("D");
331           detector->MakeBranch(option);
332           detector->SetTreeAddress();
333           detector->SDigits2Digits();
334           loader->UnloadSDigits();
335           loader->UnloadDigits();
336         } 
337        if (oR) 
338         {
339           AliDebug(1, Form("Processing Digits2Reco for %s ...", detector->GetName()));
340           loader->LoadDigits("read");
341           if (loader->TreeR() == 0x0) loader->MakeTree("R");
342           detector->MakeBranch(option);
343           detector->SetTreeAddress();
344           detector->Digits2Reco(); 
345           loader->UnloadDigits();
346           loader->UnloadRecPoints();
347
348         }
349      }   
350    }
351 }
352
353
354 //_______________________________________________________________________
355 void AliRun::Streamer(TBuffer &R__b)
356 {
357   // Stream an object of class AliRun.
358
359   if (R__b.IsReading()) {
360     if (!gAlice) gAlice = this;
361     AliRun::Class()->ReadBuffer(R__b, this);
362     gROOT->GetListOfBrowsables()->Add(this,"Run");
363     gRandom = new TRandom3();
364   } else {
365     AliRun::Class()->WriteBuffer(R__b, this);
366   }
367 }
368
369 //_______________________________________________________________________
370 void AliRun::SetGenEventHeader(AliGenEventHeader* header)
371 {
372   AliRunLoader::Instance()->GetHeader()->SetGenEventHeader(header);
373 }
374
375
376 //_______________________________________________________________________
377 Int_t AliRun::GetEvNumber() const
378
379 //Returns number of current event  
380   if (fRunLoader == 0x0)
381    {
382      AliError("RunLoader is not set. Can not load data.");
383      return -1;
384    }
385
386   return fRunLoader->GetEventNumber();
387 }
388
389 //_______________________________________________________________________
390 void AliRun::SetRunLoader(AliRunLoader* rloader)
391 {
392   //
393   // Set the loader of the run
394   //
395   fRunLoader = rloader;
396   if (fRunLoader == 0x0) return;
397   
398   TString evfoldname;
399   TFolder* evfold = fRunLoader->GetEventFolder();
400   if (evfold) evfoldname = evfold->GetName();
401   else AliWarning("Did not get Event Folder from Run Loader");
402   
403   if ( fRunLoader->GetAliRun() )
404    {//if alrun already exists in folder
405     if (fRunLoader->GetAliRun() != this )
406      {//and is different than this - crash
407        AliFatal("AliRun is already in Folder and it is not this object");
408        return;//pro forma
409      }//else do nothing
410    }
411   else
412    {
413      evfold->Add(this);//Post this AliRun to Folder
414    }
415   
416   TIter next(fModules);
417   AliModule *module;
418   while((module = (AliModule*)next())) 
419    {
420      if (evfold) AliConfig::Instance()->Add(module,evfoldname);
421      module->SetRunLoader(fRunLoader);
422      AliDetector* detector = dynamic_cast<AliDetector*>(module);
423      if (detector)
424       {
425         AliLoader* loader = fRunLoader->GetLoader(detector);
426         if (loader == 0x0)
427          {
428            AliError(Form("Can not get loader for detector %s", detector->GetName()));
429          }
430         else
431          {
432            AliDebug(1, Form("Setting loader for detector %s", detector->GetName()));
433            detector->SetLoader(loader);
434          }
435       }
436    }
437 }
438
439 //_______________________________________________________________________
440 void AliRun::AddModule(AliModule* mod)
441 {
442   //
443   // Add a module to the module list
444   //
445   if (mod == 0x0) return;
446   if (strlen(mod->GetName()) == 0) return;
447   if (GetModuleID(mod->GetName()) >= 0) return;
448   
449   AliDebug(1, mod->GetName());
450   if (fRunLoader == 0x0) AliConfig::Instance()->Add(mod);
451   else AliConfig::Instance()->Add(mod,fRunLoader->GetEventFolder()->GetName());
452
453   Modules()->Add(mod);
454   
455   fNdets++;
456 }
457