MC-dependent part of AliRun extracted in AliMC (F.Carminati)
[u/mrichter/AliRoot.git] / STEER / AliRun.cxx
CommitLineData
99d554c8 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
acd84897 16/* $Id$ */
99d554c8 17
fe4da5cc 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// //
8494b010 25// -Supports the list of all Alice Detectors (fModules). //
fe4da5cc 26// -Supports the list of particles (fParticles). //
27// -Supports the Trees. //
28// -Supports the geometry. //
29// -Supports the event display. //
30//Begin_Html
31/*
1439f98e 32<img src="picts/AliRunClass.gif">
fe4da5cc 33*/
34//End_Html
35//Begin_Html
36/*
1439f98e 37<img src="picts/alirun.gif">
fe4da5cc 38*/
39//End_Html
40// //
41///////////////////////////////////////////////////////////////////////////////
42
88cb7938 43#include <TBRIK.h>
88cb7938 44#include <TCint.h>
5d12ce38 45#include <TDatabasePDG.h>
88cb7938 46#include <TGeometry.h>
88cb7938 47#include <TNode.h>
88cb7938 48#include <TROOT.h>
88cb7938 49#include <TRandom3.h>
50#include <TSystem.h>
5d12ce38 51#include <TVector.h>
88cb7938 52#include <TVirtualMC.h>
5d12ce38 53//
98490ea9 54#include "AliDetector.h"
fe4da5cc 55#include "AliDisplay.h"
98490ea9 56#include "AliHeader.h"
dffd31ef 57#include "AliLego.h"
98490ea9 58#include "AliLegoGenerator.h"
5d12ce38 59#include "AliMC.h"
aee8290b 60#include "AliMagFC.h"
61#include "AliMagFCM.h"
62#include "AliMagFDM.h"
141f90e3 63#include "AliPDG.h"
98490ea9 64#include "AliRun.h"
65#include "AliStack.h"
fe4da5cc 66
fe4da5cc 67AliRun *gAlice;
68
5d12ce38 69
fe4da5cc 70ClassImp(AliRun)
71
e2afb3b6 72//_______________________________________________________________________
73AliRun::AliRun():
74 fRun(0),
75 fEvent(0),
76 fEventNrInRun(0),
77 fEventsPerRun(0),
78 fDebug(0),
e2afb3b6 79 fModules(0),
80 fGeometry(0),
5d12ce38 81 fMCApp(0),
e2afb3b6 82 fDisplay(0),
83 fTimer(),
84 fField(0),
85 fMC(0),
e2afb3b6 86 fNdets(0),
e2afb3b6 87 fInitDone(kFALSE),
88 fLego(0),
89 fPDGDB(0), //Particle factory object
e2afb3b6 90 fConfigFunction("\0"),
91 fRandom(0),
5d12ce38 92 fRunLoader(0x0)
fe4da5cc 93{
94 //
95 // Default constructor for AliRun
96 //
88cb7938 97 AliConfig::Instance();//skowron 29 Feb 2002
98 //ensures that the folder structure is build
e2afb3b6 99}
100
101//_______________________________________________________________________
102AliRun::AliRun(const AliRun& arun):
5d12ce38 103 TNamed(arun),
e2afb3b6 104 fRun(0),
105 fEvent(0),
106 fEventNrInRun(0),
107 fEventsPerRun(0),
108 fDebug(0),
e2afb3b6 109 fModules(0),
110 fGeometry(0),
5d12ce38 111 fMCApp(0),
e2afb3b6 112 fDisplay(0),
113 fTimer(),
114 fField(0),
115 fMC(0),
e2afb3b6 116 fNdets(0),
e2afb3b6 117 fInitDone(kFALSE),
118 fLego(0),
119 fPDGDB(0), //Particle factory object
e2afb3b6 120 fConfigFunction("\0"),
121 fRandom(0),
88cb7938 122 fRunLoader(0x0)
e2afb3b6 123{
124 //
125 // Copy constructor for AliRun
126 //
127 arun.Copy(*this);
fe4da5cc 128}
129
130//_____________________________________________________________________________
e2afb3b6 131AliRun::AliRun(const char *name, const char *title):
5d12ce38 132 TNamed(name,title),
e2afb3b6 133 fRun(0),
134 fEvent(0),
135 fEventNrInRun(0),
136 fEventsPerRun(0),
137 fDebug(0),
e2afb3b6 138 fModules(new TObjArray(77)), // Support list for the Detectors
139 fGeometry(0),
5d12ce38 140 fMCApp(0),
e2afb3b6 141 fDisplay(0),
142 fTimer(),
143 fField(0),
144 fMC(gMC),
e2afb3b6 145 fNdets(0),
e2afb3b6 146 fInitDone(kFALSE),
147 fLego(0),
148 fPDGDB(TDatabasePDG::Instance()), //Particle factory object!
e2afb3b6 149 fConfigFunction("Config();"),
150 fRandom(new TRandom3()),
88cb7938 151 fRunLoader(0x0)
fe4da5cc 152{
153 //
154 // Constructor for the main processor.
155 // Creates the geometry
156 // Creates the list of Detectors.
157 // Creates the list of particles.
158 //
e2afb3b6 159
fe4da5cc 160 gAlice = this;
65fb704d 161
162 // Set random number generator
e2afb3b6 163 gRandom = fRandom;
2ab0c725 164
165 if (gSystem->Getenv("CONFIG_SEED")) {
e2afb3b6 166 gRandom->SetSeed(static_cast<UInt_t>(atoi(gSystem->Getenv("CONFIG_SEED"))));
2ab0c725 167 }
e2afb3b6 168
169 // Add to list of browsable
fe4da5cc 170 gROOT->GetListOfBrowsables()->Add(this,name);
fe4da5cc 171 // Create the TNode geometry for the event display
fe4da5cc 172 BuildSimpleGeometry();
173
fe4da5cc 174 // Create default mag field
175 SetField();
e2afb3b6 176
e2afb3b6 177 // Add particle list to configuration
9e1a0ddb 178 AliConfig::Instance()->Add(fPDGDB);
e2afb3b6 179
fe4da5cc 180}
181
aee8290b 182
e2afb3b6 183//_______________________________________________________________________
fe4da5cc 184AliRun::~AliRun()
185{
186 //
2ab0c725 187 // Default AliRun destructor
fe4da5cc 188 //
88cb7938 189 gROOT->GetListOfBrowsables()->Remove(this);
190
191 if (fRunLoader)
192 {
193 TFolder* evfold = fRunLoader->GetEventFolder();
194 TFolder* modfold = dynamic_cast<TFolder*>(evfold->FindObjectAny(AliConfig::GetModulesFolderName()));
195 TIter next(fModules);
196 AliModule *mod;
197 while((mod = (AliModule*)next()))
198 {
199 modfold->Remove(mod);
200 }
201 }
5d12ce38 202
203
fe4da5cc 204 delete fField;
5d12ce38 205 delete fMCApp;
f5bc1485 206 delete gMC; gMC=0;
fe4da5cc 207 delete fGeometry;
208 delete fDisplay;
fe4da5cc 209 delete fLego;
8494b010 210 if (fModules) {
211 fModules->Delete();
212 delete fModules;
fe4da5cc 213 }
88cb7938 214
c222d2b0 215 delete fPDGDB;
fe4da5cc 216}
217
e2afb3b6 218//_______________________________________________________________________
219void AliRun::Copy(AliRun &) const
220{
221 Fatal("Copy","Not implemented!\n");
222}
223
224//_______________________________________________________________________
fe4da5cc 225void AliRun::Build()
226{
227 //
228 // Initialize Alice geometry
229 // Dummy routine
230 //
231}
232
e2afb3b6 233//_______________________________________________________________________
fe4da5cc 234void AliRun::BuildSimpleGeometry()
235{
236 //
237 // Create a simple TNode geometry used by Root display engine
238 //
239 // Initialise geometry
240 //
241 fGeometry = new TGeometry("AliceGeom","Galice Geometry for Hits");
242 new TMaterial("void","Vacuum",0,0,0); //Everything is void
243 TBRIK *brik = new TBRIK("S_alice","alice volume","void",2000,2000,3000);
244 brik->SetVisibility(0);
245 new TNode("alice","alice","S_alice");
246}
247
e2afb3b6 248//_______________________________________________________________________
fe4da5cc 249void AliRun::CleanDetectors()
250{
251 //
252 // Clean Detectors at the end of event
253 //
88cb7938 254 fRunLoader->CleanDetectors();
fe4da5cc 255}
256
e2afb3b6 257//_______________________________________________________________________
5d12ce38 258void AliRun::ResetHits()
fe4da5cc 259{
5d12ce38 260 fMCApp->ResetHits();
fe4da5cc 261}
262
e2afb3b6 263//_______________________________________________________________________
5d12ce38 264AliGenerator* AliRun::Generator() const
fe4da5cc 265{
5d12ce38 266 return fMCApp->Generator();
fe4da5cc 267}
268
e2afb3b6 269//_______________________________________________________________________
d8408e76 270void AliRun::SetField(AliMagF* magField)
271{
272 // Set Magnetic Field Map
273 fField = magField;
274 fField->ReadField();
275}
276
e2afb3b6 277//_______________________________________________________________________
fe4da5cc 278void AliRun::SetField(Int_t type, Int_t version, Float_t scale,
279 Float_t maxField, char* filename)
280{
281 //
282 // Set magnetic field parameters
283 // type Magnetic field transport flag 0=no field, 2=helix, 3=Runge Kutta
284 // version Magnetic field map version (only 1 active now)
285 // scale Scale factor for the magnetic field
286 // maxField Maximum value for the magnetic field
287
288 //
289 // --- Sanity check on mag field flags
fe4da5cc 290 if(fField) delete fField;
291 if(version==1) {
d8408e76 292 fField = new AliMagFC("Map1"," ",type,scale,maxField);
f1b9d7c3 293 } else if(version<=2) {
d8408e76 294 fField = new AliMagFCM("Map2-3",filename,type,scale,maxField);
fe4da5cc 295 fField->ReadField();
f1b9d7c3 296 } else if(version==3) {
d8408e76 297 fField = new AliMagFDM("Map4",filename,type,scale,maxField);
f1b9d7c3 298 fField->ReadField();
fe4da5cc 299 } else {
23370b7a 300 Warning("SetField","Invalid map %d\n",version);
fe4da5cc 301 }
302}
88cb7938 303
304//_____________________________________________________________________________
305
306void AliRun::InitLoaders()
307{
308 //creates list of getters
309 if (GetDebug()) Info("InitLoaders","");
310 TIter next(fModules);
311 AliModule *mod;
312 while((mod = (AliModule*)next()))
313 {
314 AliDetector *det = dynamic_cast<AliDetector*>(mod);
315 if (det)
316 {
317 if (GetDebug()) Info("InitLoaders"," Adding %s ",det->GetName());
318 fRunLoader->AddLoader(det);
319 }
320 }
321 if (GetDebug()) Info("InitLoaders","Done");
322}
323//_____________________________________________________________________________
324
fe4da5cc 325void AliRun::FinishRun()
326{
327 //
328 // Called at the end of the run.
329 //
88cb7938 330
88cb7938 331 if(fLego)
332 {
333 if (GetDebug()) Info("FinishRun"," Finish Lego");
334 fRunLoader->CdGAFile();
335 fLego->FinishRun();
336 }
8e70f139 337
fe4da5cc 338 // Clean detector information
8494b010 339 TIter next(fModules);
340 AliModule *detector;
e2afb3b6 341 while((detector = dynamic_cast<AliModule*>(next()))) {
88cb7938 342 if (GetDebug()) Info("FinishRun"," %s->FinishRun()",detector->GetName());
fe4da5cc 343 detector->FinishRun();
344 }
345
88cb7938 346 if (GetDebug()) Info("FinishRun"," fRunLoader->WriteHeader(OVERWRITE)");
347 fRunLoader->WriteHeader("OVERWRITE");
682a4a95 348
88cb7938 349 // Write AliRun info and all detectors parameters
350 fRunLoader->CdGAFile();
351 Write(0,TObject::kOverwrite);//write AliRun
352 fRunLoader->Write(0,TObject::kOverwrite);//write RunLoader itself
353
fe4da5cc 354 // Clean tree information
88cb7938 355 if (GetDebug()) Info("FinishRun"," fRunLoader->Stack()->FinishRun()");
356 fRunLoader->Stack()->FinishRun();
9e1a0ddb 357
5d12ce38 358 if(fMCApp) fMCApp->FinishRun();
fe4da5cc 359
5d12ce38 360 fRunLoader->Synchronize();
fe4da5cc 361}
362
e2afb3b6 363//_______________________________________________________________________
eb1b8d29 364void AliRun::Announce() const
365{
366 //
37d06d5b 367 // Announce the current version of AliRoot
368 //
369 printf("%70s",
370 "****************************************************************\n");
371 printf("%6s","*");printf("%64s","*\n");
372
373 printf("%6s","*");
88cb7938 374 printf(" You are running AliRoot version NewIO\n");
37d06d5b 375
376 printf("%6s","*");
377 printf(" The cvs tag for the current program is $Name$\n");
378
379 printf("%6s","*");printf("%64s","*\n");
380 printf("%70s",
381 "****************************************************************\n");
eb1b8d29 382}
383
384//_______________________________________________________________________
94de3818 385AliModule *AliRun::GetModule(const char *name) const
fe4da5cc 386{
387 //
388 // Return pointer to detector from name
389 //
e2afb3b6 390 return dynamic_cast<AliModule*>(fModules->FindObject(name));
fe4da5cc 391}
392
e2afb3b6 393//_______________________________________________________________________
94de3818 394AliDetector *AliRun::GetDetector(const char *name) const
a68348e9 395{
396 //
397 // Return pointer to detector from name
398 //
e2afb3b6 399 return dynamic_cast<AliDetector*>(fModules->FindObject(name));
a68348e9 400}
401
e2afb3b6 402//_______________________________________________________________________
94de3818 403Int_t AliRun::GetModuleID(const char *name) const
fe4da5cc 404{
405 //
406 // Return galice internal detector identifier from name
407 //
23370b7a 408 Int_t i=-1;
409 TObject *mod=fModules->FindObject(name);
410 if(mod) i=fModules->IndexOf(mod);
411 return i;
fe4da5cc 412}
413
e2afb3b6 414//_______________________________________________________________________
fe4da5cc 415Int_t AliRun::GetEvent(Int_t event)
416{
88cb7938 417//
418// Reloads data containers in folders # event
419// Set branch addresses
420//
421 if (fRunLoader == 0x0)
422 {
423 Error("GetEvent","RunLoader is not set. Can not load data.");
424 return -1;
425 }
426/*****************************************/
427/**** P R E R E L O A D I N G ****/
428/*****************************************/
429// Reset existing structures
5d12ce38 430 fMCApp->ResetHits();
431 fMCApp->ResetTrackReferences();
fe4da5cc 432 ResetDigits();
2ab0c725 433 ResetSDigits();
50a6540a 434
88cb7938 435/*****************************************/
436/**** R E L O A D ****/
437/*****************************************/
aab9c8d5 438
88cb7938 439 fRunLoader->GetEvent(event);
b9d0a01d 440
88cb7938 441/*****************************************/
442/**** P O S T R E L O A D I N G ****/
443/*****************************************/
82711e7a 444
fe4da5cc 445 // Set Trees branch addresses
8494b010 446 TIter next(fModules);
447 AliModule *detector;
88cb7938 448 while((detector = dynamic_cast<AliModule*>(next())))
449 {
450 detector->SetTreeAddress();
451 }
452
453 return fRunLoader->GetHeader()->GetNtrack();
fe4da5cc 454}
455
e2afb3b6 456//_______________________________________________________________________
fe4da5cc 457TGeometry *AliRun::GetGeometry()
458{
459 //
460 // Import Alice geometry from current file
461 // Return pointer to geometry object
462 //
e2afb3b6 463 if (!fGeometry) fGeometry = dynamic_cast<TGeometry*>(gDirectory->Get("AliceGeom"));
fe4da5cc 464 //
465 // Unlink and relink nodes in detectors
466 // This is bad and there must be a better way...
467 //
fe4da5cc 468
8494b010 469 TIter next(fModules);
470 AliModule *detector;
e2afb3b6 471 while((detector = dynamic_cast<AliModule*>(next()))) {
fe4da5cc 472 TList *dnodes=detector->Nodes();
473 Int_t j;
474 TNode *node, *node1;
475 for ( j=0; j<dnodes->GetSize(); j++) {
e2afb3b6 476 node = dynamic_cast<TNode*>(dnodes->At(j));
52d0ab00 477 node1 = fGeometry->GetNode(node->GetName());
fe4da5cc 478 dnodes->Remove(node);
479 dnodes->AddAt(node1,j);
480 }
481 }
482 return fGeometry;
483}
484
e2afb3b6 485//_______________________________________________________________________
e2afb3b6 486void AliRun::SetBaseFile(const char *filename)
2ab0c725 487{
39de14fb 488 fBaseFileName = filename;
2ab0c725 489}
490
e2afb3b6 491//_______________________________________________________________________
fe4da5cc 492void AliRun::ResetDigits()
493{
494 //
495 // Reset all Detectors digits
496 //
8494b010 497 TIter next(fModules);
498 AliModule *detector;
e2afb3b6 499 while((detector = dynamic_cast<AliModule*>(next()))) {
fe4da5cc 500 detector->ResetDigits();
501 }
502}
503
e2afb3b6 504//_______________________________________________________________________
2ab0c725 505void AliRun::ResetSDigits()
506{
507 //
508 // Reset all Detectors digits
509 //
510 TIter next(fModules);
511 AliModule *detector;
e2afb3b6 512 while((detector = dynamic_cast<AliModule*>(next()))) {
2ab0c725 513 detector->ResetSDigits();
514 }
515}
516
2b22f272 517
e2afb3b6 518//_______________________________________________________________________
88cb7938 519
fe4da5cc 520void AliRun::ResetPoints()
521{
522 //
523 // Reset all Detectors points
524 //
8494b010 525 TIter next(fModules);
526 AliModule *detector;
e2afb3b6 527 while((detector = dynamic_cast<AliModule*>(next()))) {
fe4da5cc 528 detector->ResetPoints();
529 }
530}
e2afb3b6 531//_______________________________________________________________________
88cb7938 532
b9d0a01d 533void AliRun::InitMC(const char *setup)
534{
535 //
5d12ce38 536 // Initialize ALICE Simulation run
b9d0a01d 537 //
37d06d5b 538 Announce();
539
b9d0a01d 540 if(fInitDone) {
541 Warning("Init","Cannot initialise AliRun twice!\n");
542 return;
543 }
544
5d12ce38 545 fMCApp=new AliMC(GetName(),GetTitle());
546
b9d0a01d 547 gROOT->LoadMacro(setup);
548 gInterpreter->ProcessLine(fConfigFunction.Data());
549
88cb7938 550 InitLoaders();
551
552 fRunLoader->MakeTree("E");
553 fRunLoader->LoadKinematics("RECREATE");
554 fRunLoader->LoadTrackRefs("RECREATE");
555 fRunLoader->LoadHits("all","RECREATE");
556
557
558 fRunLoader->CdGAFile();
b9d0a01d 559
141f90e3 560 AliPDG::AddParticlesToPdgDataBase();
b9d0a01d 561
b9d0a01d 562 fNdets = fModules->GetLast()+1;
563
564 //
b9d0a01d 565
566 // Added also after in case of interactive initialisation of modules
567 fNdets = fModules->GetLast()+1;
568
88cb7938 569 TIter next(fModules);
5d12ce38 570 for(Int_t i=0; i<fNdets; ++i)
88cb7938 571 {
5d12ce38 572 TObject *objfirst, *objlast;
573 AliModule *detector=dynamic_cast<AliModule*>(fModules->At(i));
88cb7938 574 objlast = gDirectory->GetList()->Last();
b9d0a01d 575
88cb7938 576 // Add Detector histograms in Detector list of histograms
577 if (objlast) objfirst = gDirectory->GetList()->After(objlast);
578 else objfirst = gDirectory->GetList()->First();
579 while (objfirst)
580 {
b9d0a01d 581 detector->Histograms()->Add(objfirst);
582 objfirst = gDirectory->GetList()->After(objfirst);
583 }
584 }
b9d0a01d 585
5d12ce38 586 fMCApp->Init();
b9d0a01d 587
588 fInitDone = kTRUE;
589
b9d0a01d 590 //
591 // Save stuff at the beginning of the file to avoid file corruption
592 Write();
88cb7938 593 fEventNrInRun = -1; //important - we start Begin event from increasing current number in run
b9d0a01d 594}
595
e2afb3b6 596//_______________________________________________________________________
88cb7938 597
875c717b 598void AliRun::RunMC(Int_t nevent, const char *setup)
fe4da5cc 599{
600 //
601 // Main function to be called to process a galice run
602 // example
603 // Root > gAlice.Run();
604 // a positive number of events will cause the finish routine
605 // to be called
606 //
88cb7938 607 fEventsPerRun = nevent;
fe4da5cc 608 // check if initialisation has been done
875c717b 609 if (!fInitDone) InitMC(setup);
fe4da5cc 610
fe4da5cc 611 // Create the Root Tree with one branch per detector
88cb7938 612 //Hits moved to begin event -> now we are crating separate tree for each event
fe4da5cc 613
875c717b 614 gMC->ProcessRun(nevent);
615
fe4da5cc 616 // End of this run, close files
80762cb1 617 if(nevent>0) FinishRun();
fe4da5cc 618}
619
e2afb3b6 620//_______________________________________________________________________
27f087a9 621void AliRun::RunReco(const char *selected, Int_t first, Int_t last)
d47c658f 622{
623 //
624 // Main function to be called to reconstruct Alice event
27f087a9 625 //
88cb7938 626 Int_t nev = fRunLoader->GetNumberOfEvents();
627 if (GetDebug()) Info("RunReco","Found %d events",nev);
27f087a9 628 Int_t nFirst = first;
88cb7938 629 Int_t nLast = (last < 0)? nev : last;
27f087a9 630
631 for (Int_t nevent = nFirst; nevent <= nLast; nevent++) {
88cb7938 632 if (GetDebug()) Info("RunReco","Processing event %d",nevent);
9e1a0ddb 633 GetEvent(nevent);
9e1a0ddb 634 Digits2Reco(selected);
635 }
d47c658f 636}
637
e2afb3b6 638//_______________________________________________________________________
2ab0c725 639
640void AliRun::Hits2Digits(const char *selected)
641{
9e1a0ddb 642
d47c658f 643 // Convert Hits to sumable digits
644 //
9e1a0ddb 645 for (Int_t nevent=0; nevent<gAlice->TreeE()->GetEntries(); nevent++) {
646 GetEvent(nevent);
9e1a0ddb 647 Hits2SDigits(selected);
648 SDigits2Digits(selected);
649 }
2ab0c725 650}
651
d47c658f 652
e2afb3b6 653//_______________________________________________________________________
2ab0c725 654
d47c658f 655void AliRun::Tree2Tree(Option_t *option, const char *selected)
2ab0c725 656{
657 //
d47c658f 658 // Function to transform the content of
659 //
660 // - TreeH to TreeS (option "S")
661 // - TreeS to TreeD (option "D")
662 // - TreeD to TreeR (option "R")
663 //
664 // If multiple options are specified ("SDR"), transformation will be done in sequence for
665 // selected detector and for all detectors if none is selected (detector string
666 // can contain blank separated list of detector names).
2ab0c725 667
2ab0c725 668
5cf7bbad 669 const char *oS = strstr(option,"S");
670 const char *oD = strstr(option,"D");
671 const char *oR = strstr(option,"R");
2ab0c725 672
9e1a0ddb 673 TObjArray *detectors = Detectors();
2ab0c725 674
675 TIter next(detectors);
676
d47c658f 677 AliDetector *detector = 0;
2ab0c725 678
88cb7938 679 while((detector = dynamic_cast<AliDetector*>(next()))) {
d47c658f 680 if (selected)
2ab0c725 681 if (strcmp(detector->GetName(),selected)) continue;
88cb7938 682 if (detector->IsActive())
683 {
684
685 AliLoader* loader = detector->GetLoader();
686 if (loader == 0x0) continue;
687
688 if (oS)
689 {
690 if (GetDebug()) Info("Tree2Tree","Processing Hits2SDigits for %s ...",detector->GetName());
691 loader->LoadHits("read");
692 if (loader->TreeS() == 0x0) loader->MakeTree("S");
693 detector->MakeBranch(option);
694 detector->SetTreeAddress();
695 detector->Hits2SDigits();
696 loader->UnloadHits();
697 loader->UnloadSDigits();
698 }
699 if (oD)
700 {
701 if (GetDebug()) Info("Tree2Tree","Processing SDigits2Digits for %s ...",detector->GetName());
702 loader->LoadSDigits("read");
703 if (loader->TreeD() == 0x0) loader->MakeTree("D");
704 detector->MakeBranch(option);
705 detector->SetTreeAddress();
706 detector->SDigits2Digits();
707 loader->UnloadSDigits();
708 loader->UnloadDigits();
709 }
710 if (oR)
711 {
712 if (GetDebug()) Info("Tree2Tree","Processing Digits2Reco for %s ...",detector->GetName());
713 loader->LoadDigits("read");
714 if (loader->TreeR() == 0x0) loader->MakeTree("R");
715 detector->MakeBranch(option);
716 detector->SetTreeAddress();
717 detector->Digits2Reco();
718 loader->UnloadDigits();
719 loader->UnloadRecPoints();
720
721 }
722 }
723 }
2ab0c725 724}
725
e2afb3b6 726//_______________________________________________________________________
0a520a66 727void AliRun::RunLego(const char *setup, Int_t nc1, Float_t c1min,
728 Float_t c1max,Int_t nc2,Float_t c2min,Float_t c2max,
729 Float_t rmin,Float_t rmax,Float_t zmax, AliLegoGenerator* gener)
fe4da5cc 730{
731 //
732 // Generates lego plots of:
733 // - radiation length map phi vs theta
734 // - radiation length map phi vs eta
735 // - interaction length map
736 // - g/cm2 length map
737 //
738 // ntheta bins in theta, eta
739 // themin minimum angle in theta (degrees)
740 // themax maximum angle in theta (degrees)
741 // nphi bins in phi
742 // phimin minimum angle in phi (degrees)
743 // phimax maximum angle in phi (degrees)
744 // rmin minimum radius
745 // rmax maximum radius
746 //
747 //
748 // The number of events generated = ntheta*nphi
749 // run input parameters in macro setup (default="Config.C")
750 //
751 // Use macro "lego.C" to visualize the 3 lego plots in spherical coordinates
752 //Begin_Html
753 /*
1439f98e 754 <img src="picts/AliRunLego1.gif">
fe4da5cc 755 */
756 //End_Html
757 //Begin_Html
758 /*
1439f98e 759 <img src="picts/AliRunLego2.gif">
fe4da5cc 760 */
761 //End_Html
762 //Begin_Html
763 /*
1439f98e 764 <img src="picts/AliRunLego3.gif">
fe4da5cc 765 */
766 //End_Html
767 //
768
769 // check if initialisation has been done
875c717b 770 if (!fInitDone) InitMC(setup);
5d12ce38 771 //Save current generator
772 AliGenerator *gen=fMCApp->Generator();
2cacde38 773 // If runloader has been initialized, set the number of events per file to nc1 * nc2
774 if (fRunLoader) fRunLoader->SetNumberOfEventsPerFile(nc1 * nc2);
5d12ce38 775
0a520a66 776 // Set new generator
777 if (!gener) gener = new AliLegoGenerator();
5d12ce38 778 fMCApp->ResetGenerator(gener);
0a520a66 779 //
780 // Configure Generator
781 gener->SetRadiusRange(rmin, rmax);
782 gener->SetZMax(zmax);
783 gener->SetCoor1Range(nc1, c1min, c1max);
784 gener->SetCoor2Range(nc2, c2min, c2max);
785
786
b13db077 787 //Create Lego object
0a520a66 788 fLego = new AliLego("lego",gener);
b13db077 789
dffd31ef 790 //Prepare MC for Lego Run
791 gMC->InitLego();
792
b13db077 793 //Run Lego Object
0a520a66 794
b9d0a01d 795 //gMC->ProcessRun(nc1*nc2+1);
796 gMC->ProcessRun(nc1*nc2);
fe4da5cc 797
798 // Create only the Root event Tree
88cb7938 799 fRunLoader->MakeTree("E");
fe4da5cc 800
801 // End of this run, close files
80762cb1 802 FinishRun();
0a520a66 803 // Restore current generator
5d12ce38 804 fMCApp->ResetGenerator(gen);
838edcaf 805 // Delete Lego Object
806 delete fLego; fLego=0;
fe4da5cc 807}
808
e2afb3b6 809//_______________________________________________________________________
94de3818 810void AliRun::SetConfigFunction(const char * config)
811{
812 //
813 // Set the signature of the function contained in Config.C to configure
814 // the run
815 //
816 fConfigFunction=config;
817}
818
b9d0a01d 819//
820// MC Application
821//
822
e2afb3b6 823//_______________________________________________________________________
b9d0a01d 824void AliRun::Field(const Double_t* x, Double_t *b) const
825{
88cb7938 826 Float_t xfloat[3];
827 for (Int_t i=0; i<3; i++) xfloat[i] = x[i];
828
829 if (Field()) {
830 Float_t bfloat[3];
831 Field()->Field(xfloat,bfloat);
832 for (Int_t j=0; j<3; j++) b[j] = bfloat[j];
833 }
834 else {
835 printf("No mag field defined!\n");
836 b[0]=b[1]=b[2]=0.;
837 }
b9d0a01d 838
839}
840
841//
842// End of MC Application
843//
844
e2afb3b6 845//_______________________________________________________________________
fe4da5cc 846void AliRun::Streamer(TBuffer &R__b)
847{
eef4b160 848 // Stream an object of class AliRun.
2ab0c725 849
7e90ff59 850 if (R__b.IsReading()) {
851 if (!gAlice) gAlice = this;
7e90ff59 852 AliRun::Class()->ReadBuffer(R__b, this);
7e90ff59 853 gROOT->GetListOfBrowsables()->Add(this,"Run");
eef4b160 854
7e90ff59 855 gRandom = fRandom;
856 } else {
eef4b160 857 AliRun::Class()->WriteBuffer(R__b, this);
858 }
2ab0c725 859}
860
9e1a0ddb 861
e2afb3b6 862//_______________________________________________________________________
b9d0a01d 863
e2afb3b6 864//_______________________________________________________________________
27f087a9 865void AliRun::SetGenEventHeader(AliGenEventHeader* header)
866{
88cb7938 867 fRunLoader->GetHeader()->SetGenEventHeader(header);
27f087a9 868}
b9d0a01d 869
88cb7938 870//___________________________________________________________________________
0592d1ca 871
88cb7938 872Int_t AliRun::GetEvNumber() const
873{
874//Returns number of current event
875 if (fRunLoader == 0x0)
876 {
877 Error("GetEvent","RunLoader is not set. Can not load data.");
878 return -1;
879 }
0592d1ca 880
88cb7938 881 return fRunLoader->GetEventNumber();
0592d1ca 882}
b9d0a01d 883
88cb7938 884void AliRun::SetRunLoader(AliRunLoader* rloader)
0592d1ca 885{
88cb7938 886 fRunLoader = rloader;
887 if (fRunLoader == 0x0) return;
888
889 TString evfoldname;
890 TFolder* evfold = fRunLoader->GetEventFolder();
891 if (evfold) evfoldname = evfold->GetName();
892 else Warning("SetRunLoader","Did not get Event Folder from Run Loader");
893
894 if ( fRunLoader->GetAliRun() )
895 {//if alrun already exists in folder
896 if (fRunLoader->GetAliRun() != this )
897 {//and is different than this - crash
898 Fatal("AliRun","AliRun is already in Folder and it is not this object");
899 return;//pro forma
900 }//else do nothing
901 }
902 else
903 {
904 evfold->Add(this);//Post this AliRun to Folder
905 }
906
907 TIter next(fModules);
908 AliModule *module;
909 while((module = (AliModule*)next()))
910 {
911 if (evfold) AliConfig::Instance()->Add(module,evfoldname);
912 AliDetector* detector = dynamic_cast<AliDetector*>(module);
913 if (detector)
914 {
915 AliLoader* loader = fRunLoader->GetLoader(detector);
916 if (loader == 0x0)
917 {
918 Error("SetRunLoader","Can not get loader for detector %s",detector->GetName());
919 }
920 else
921 {
922 if (GetDebug()) Info("SetRunLoader","Setting loader for detector %s",detector->GetName());
923 detector->SetLoader(loader);
924 }
0592d1ca 925 }
88cb7938 926 }
0592d1ca 927}
928
88cb7938 929void AliRun::AddModule(AliModule* mod)
7a16e9cc 930{
88cb7938 931 if (mod == 0x0) return;
932 if (strlen(mod->GetName()) == 0) return;
933 if (GetModuleID(mod->GetName()) >= 0) return;
934
935 if (GetDebug()) Info("AddModule","%s",mod->GetName());
936 if (fRunLoader == 0x0) AliConfig::Instance()->Add(mod);
937 else AliConfig::Instance()->Add(mod,fRunLoader->GetEventFolder()->GetName());
7a16e9cc 938
88cb7938 939 Modules()->Add(mod);
7a16e9cc 940}