]> git.uio.no Git - u/mrichter/AliRoot.git/blame - STEER/AliRun.cxx
Coding Convention Violations
[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),
82 fTimer(),
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),
112 fTimer(),
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),
141 fTimer(),
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}