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