]> git.uio.no Git - u/mrichter/AliRoot.git/blame - STEER/AliRun.cxx
New macro to store in a tree sets of ESD objects saved individually in separate files...
[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//_______________________________________________________________________
6c4904c2 219void AliRun::Copy(TObject &) const
e2afb3b6 220{
221 Fatal("Copy","Not implemented!\n");
222}
223
e2afb3b6 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,
07c4aae4 279 Float_t maxField, const char* filename)
fe4da5cc 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 {
1d6fbf6e 314 mod->SetRunLoader(fRunLoader);
88cb7938 315 AliDetector *det = dynamic_cast<AliDetector*>(mod);
316 if (det)
317 {
318 if (GetDebug()) Info("InitLoaders"," Adding %s ",det->GetName());
319 fRunLoader->AddLoader(det);
320 }
321 }
322 if (GetDebug()) Info("InitLoaders","Done");
323}
324//_____________________________________________________________________________
325
fe4da5cc 326void AliRun::FinishRun()
327{
328 //
329 // Called at the end of the run.
330 //
88cb7938 331
88cb7938 332 if(fLego)
333 {
334 if (GetDebug()) Info("FinishRun"," Finish Lego");
335 fRunLoader->CdGAFile();
336 fLego->FinishRun();
337 }
8e70f139 338
fe4da5cc 339 // Clean detector information
8494b010 340 TIter next(fModules);
341 AliModule *detector;
e2afb3b6 342 while((detector = dynamic_cast<AliModule*>(next()))) {
88cb7938 343 if (GetDebug()) Info("FinishRun"," %s->FinishRun()",detector->GetName());
fe4da5cc 344 detector->FinishRun();
345 }
346
88cb7938 347 if (GetDebug()) Info("FinishRun"," fRunLoader->WriteHeader(OVERWRITE)");
348 fRunLoader->WriteHeader("OVERWRITE");
682a4a95 349
88cb7938 350 // Write AliRun info and all detectors parameters
351 fRunLoader->CdGAFile();
352 Write(0,TObject::kOverwrite);//write AliRun
353 fRunLoader->Write(0,TObject::kOverwrite);//write RunLoader itself
354
fe4da5cc 355 // Clean tree information
88cb7938 356 if (GetDebug()) Info("FinishRun"," fRunLoader->Stack()->FinishRun()");
357 fRunLoader->Stack()->FinishRun();
9e1a0ddb 358
5d12ce38 359 if(fMCApp) fMCApp->FinishRun();
fe4da5cc 360
5d12ce38 361 fRunLoader->Synchronize();
fe4da5cc 362}
363
eb1b8d29 364//_______________________________________________________________________
365void AliRun::Announce() const
366{
367 //
37d06d5b 368 // Announce the current version of AliRoot
369 //
370 printf("%70s",
371 "****************************************************************\n");
372 printf("%6s","*");printf("%64s","*\n");
373
374 printf("%6s","*");
88cb7938 375 printf(" You are running AliRoot version NewIO\n");
37d06d5b 376
377 printf("%6s","*");
378 printf(" The cvs tag for the current program is $Name$\n");
379
380 printf("%6s","*");printf("%64s","*\n");
381 printf("%70s",
382 "****************************************************************\n");
eb1b8d29 383}
384
e2afb3b6 385//_______________________________________________________________________
94de3818 386AliModule *AliRun::GetModule(const char *name) const
fe4da5cc 387{
388 //
389 // Return pointer to detector from name
390 //
e2afb3b6 391 return dynamic_cast<AliModule*>(fModules->FindObject(name));
fe4da5cc 392}
393
e2afb3b6 394//_______________________________________________________________________
94de3818 395AliDetector *AliRun::GetDetector(const char *name) const
a68348e9 396{
397 //
398 // Return pointer to detector from name
399 //
e2afb3b6 400 return dynamic_cast<AliDetector*>(fModules->FindObject(name));
a68348e9 401}
402
e2afb3b6 403//_______________________________________________________________________
94de3818 404Int_t AliRun::GetModuleID(const char *name) const
fe4da5cc 405{
406 //
407 // Return galice internal detector identifier from name
408 //
23370b7a 409 Int_t i=-1;
410 TObject *mod=fModules->FindObject(name);
411 if(mod) i=fModules->IndexOf(mod);
412 return i;
fe4da5cc 413}
414
e2afb3b6 415//_______________________________________________________________________
fe4da5cc 416Int_t AliRun::GetEvent(Int_t event)
417{
88cb7938 418//
419// Reloads data containers in folders # event
420// Set branch addresses
421//
422 if (fRunLoader == 0x0)
423 {
424 Error("GetEvent","RunLoader is not set. Can not load data.");
425 return -1;
426 }
427/*****************************************/
428/**** P R E R E L O A D I N G ****/
429/*****************************************/
430// Reset existing structures
5d12ce38 431 fMCApp->ResetHits();
432 fMCApp->ResetTrackReferences();
fe4da5cc 433 ResetDigits();
2ab0c725 434 ResetSDigits();
50a6540a 435
88cb7938 436/*****************************************/
437/**** R E L O A D ****/
438/*****************************************/
aab9c8d5 439
88cb7938 440 fRunLoader->GetEvent(event);
b9d0a01d 441
88cb7938 442/*****************************************/
443/**** P O S T R E L O A D I N G ****/
444/*****************************************/
82711e7a 445
fe4da5cc 446 // Set Trees branch addresses
8494b010 447 TIter next(fModules);
448 AliModule *detector;
88cb7938 449 while((detector = dynamic_cast<AliModule*>(next())))
450 {
451 detector->SetTreeAddress();
452 }
453
454 return fRunLoader->GetHeader()->GetNtrack();
fe4da5cc 455}
456
e2afb3b6 457//_______________________________________________________________________
fe4da5cc 458TGeometry *AliRun::GetGeometry()
459{
460 //
461 // Import Alice geometry from current file
462 // Return pointer to geometry object
463 //
e2afb3b6 464 if (!fGeometry) fGeometry = dynamic_cast<TGeometry*>(gDirectory->Get("AliceGeom"));
fe4da5cc 465 //
466 // Unlink and relink nodes in detectors
467 // This is bad and there must be a better way...
468 //
fe4da5cc 469
8494b010 470 TIter next(fModules);
471 AliModule *detector;
e2afb3b6 472 while((detector = dynamic_cast<AliModule*>(next()))) {
fe4da5cc 473 TList *dnodes=detector->Nodes();
474 Int_t j;
475 TNode *node, *node1;
476 for ( j=0; j<dnodes->GetSize(); j++) {
e2afb3b6 477 node = dynamic_cast<TNode*>(dnodes->At(j));
52d0ab00 478 node1 = fGeometry->GetNode(node->GetName());
fe4da5cc 479 dnodes->Remove(node);
480 dnodes->AddAt(node1,j);
481 }
482 }
483 return fGeometry;
484}
485
e2afb3b6 486//_______________________________________________________________________
487void AliRun::SetBaseFile(const char *filename)
2ab0c725 488{
39de14fb 489 fBaseFileName = filename;
2ab0c725 490}
491
e2afb3b6 492//_______________________________________________________________________
b9d0a01d 493void AliRun::ResetDigits()
fe4da5cc 494{
495 //
b9d0a01d 496 // Reset all Detectors digits
fe4da5cc 497 //
b9d0a01d 498 TIter next(fModules);
499 AliModule *detector;
e2afb3b6 500 while((detector = dynamic_cast<AliModule*>(next()))) {
b9d0a01d 501 detector->ResetDigits();
502 }
503}
504
e2afb3b6 505//_______________________________________________________________________
b9d0a01d 506void AliRun::ResetSDigits()
507{
dffd31ef 508 //
b9d0a01d 509 // Reset all Detectors digits
9e1a0ddb 510 //
b9d0a01d 511 TIter next(fModules);
512 AliModule *detector;
e2afb3b6 513 while((detector = dynamic_cast<AliModule*>(next()))) {
b9d0a01d 514 detector->ResetSDigits();
515 }
516}
dffd31ef 517
2b22f272 518
e2afb3b6 519//_______________________________________________________________________
88cb7938 520
b9d0a01d 521void AliRun::ResetPoints()
fe4da5cc 522{
523 //
b9d0a01d 524 // Reset all Detectors points
fe4da5cc 525 //
8494b010 526 TIter next(fModules);
527 AliModule *detector;
e2afb3b6 528 while((detector = dynamic_cast<AliModule*>(next()))) {
b9d0a01d 529 detector->ResetPoints();
fe4da5cc 530 }
531}
e2afb3b6 532//_______________________________________________________________________
88cb7938 533
b9d0a01d 534void AliRun::InitMC(const char *setup)
2ab0c725 535{
536 //
5d12ce38 537 // Initialize ALICE Simulation run
2ab0c725 538 //
37d06d5b 539 Announce();
540
b9d0a01d 541 if(fInitDone) {
542 Warning("Init","Cannot initialise AliRun twice!\n");
543 return;
fe4da5cc 544 }
b9d0a01d 545
5d12ce38 546 fMCApp=new AliMC(GetName(),GetTitle());
547
b9d0a01d 548 gROOT->LoadMacro(setup);
549 gInterpreter->ProcessLine(fConfigFunction.Data());
fe4da5cc 550
88cb7938 551 fRunLoader->CdGAFile();
aab9c8d5 552
141f90e3 553 AliPDG::AddParticlesToPdgDataBase();
aab9c8d5 554
b9d0a01d 555 fNdets = fModules->GetLast()+1;
aab9c8d5 556
b9d0a01d 557 // Added also after in case of interactive initialisation of modules
558 fNdets = fModules->GetLast()+1;
559
88cb7938 560 TIter next(fModules);
5d12ce38 561 for(Int_t i=0; i<fNdets; ++i)
88cb7938 562 {
5d12ce38 563 TObject *objfirst, *objlast;
564 AliModule *detector=dynamic_cast<AliModule*>(fModules->At(i));
88cb7938 565 objlast = gDirectory->GetList()->Last();
b9d0a01d 566
88cb7938 567 // Add Detector histograms in Detector list of histograms
568 if (objlast) objfirst = gDirectory->GetList()->After(objlast);
569 else objfirst = gDirectory->GetList()->First();
570 while (objfirst)
571 {
b9d0a01d 572 detector->Histograms()->Add(objfirst);
573 objfirst = gDirectory->GetList()->After(objfirst);
574 }
575 }
b9d0a01d 576
5d12ce38 577 fMCApp->Init();
b9d0a01d 578
504b172d 579 //Must be here because some MCs (G4) adds detectors here and not in Config.C
580 InitLoaders();
581 fRunLoader->MakeTree("E");
582 if (fLego == 0x0)
583 {
584 fRunLoader->LoadKinematics("RECREATE");
585 fRunLoader->LoadTrackRefs("RECREATE");
586 fRunLoader->LoadHits("all","RECREATE");
587 }
b9d0a01d 588 fInitDone = kTRUE;
b9d0a01d 589 //
590 // Save stuff at the beginning of the file to avoid file corruption
504b172d 591 fRunLoader->CdGAFile();
b9d0a01d 592 Write();
88cb7938 593 fEventNrInRun = -1; //important - we start Begin event from increasing current number in run
fe4da5cc 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
2cacde38 770 // If runloader has been initialized, set the number of events per file to nc1 * nc2
5d12ce38 771
0a520a66 772 // Set new generator
773 if (!gener) gener = new AliLegoGenerator();
0a520a66 774 //
775 // Configure Generator
776 gener->SetRadiusRange(rmin, rmax);
777 gener->SetZMax(zmax);
778 gener->SetCoor1Range(nc1, c1min, c1max);
779 gener->SetCoor2Range(nc2, c2min, c2max);
780
781
b13db077 782 //Create Lego object
0a520a66 783 fLego = new AliLego("lego",gener);
b13db077 784
504b172d 785 if (!fInitDone) InitMC(setup);
786 //Save current generator
787
788 AliGenerator *gen=fMCApp->Generator();
789 fMCApp->ResetGenerator(gener);
dffd31ef 790 //Prepare MC for Lego Run
791 gMC->InitLego();
792
b13db077 793 //Run Lego Object
0a520a66 794
504b172d 795 if (fRunLoader) fRunLoader->SetNumberOfEventsPerFile(nc1 * nc2);
b9d0a01d 796 //gMC->ProcessRun(nc1*nc2+1);
797 gMC->ProcessRun(nc1*nc2);
fe4da5cc 798
fe4da5cc 799 // End of this run, close files
80762cb1 800 FinishRun();
0a520a66 801 // Restore current generator
5d12ce38 802 fMCApp->ResetGenerator(gen);
838edcaf 803 // Delete Lego Object
804 delete fLego; fLego=0;
fe4da5cc 805}
806
e2afb3b6 807//_______________________________________________________________________
94de3818 808void AliRun::SetConfigFunction(const char * config)
809{
810 //
811 // Set the signature of the function contained in Config.C to configure
812 // the run
813 //
814 fConfigFunction=config;
815}
816
b9d0a01d 817//
818// MC Application
819//
820
e2afb3b6 821//_______________________________________________________________________
b9d0a01d 822void AliRun::Field(const Double_t* x, Double_t *b) const
823{
88cb7938 824 Float_t xfloat[3];
825 for (Int_t i=0; i<3; i++) xfloat[i] = x[i];
826
827 if (Field()) {
828 Float_t bfloat[3];
829 Field()->Field(xfloat,bfloat);
830 for (Int_t j=0; j<3; j++) b[j] = bfloat[j];
831 }
832 else {
833 printf("No mag field defined!\n");
834 b[0]=b[1]=b[2]=0.;
835 }
b9d0a01d 836
837}
838
839//
840// End of MC Application
841//
842
e2afb3b6 843//_______________________________________________________________________
fe4da5cc 844void AliRun::Streamer(TBuffer &R__b)
845{
eef4b160 846 // Stream an object of class AliRun.
2ab0c725 847
7e90ff59 848 if (R__b.IsReading()) {
849 if (!gAlice) gAlice = this;
7e90ff59 850 AliRun::Class()->ReadBuffer(R__b, this);
7e90ff59 851 gROOT->GetListOfBrowsables()->Add(this,"Run");
eef4b160 852
7e90ff59 853 gRandom = fRandom;
854 } else {
eef4b160 855 AliRun::Class()->WriteBuffer(R__b, this);
856 }
2ab0c725 857}
e2afb3b6 858//_______________________________________________________________________
b9d0a01d 859
27f087a9 860void AliRun::SetGenEventHeader(AliGenEventHeader* header)
861{
88cb7938 862 fRunLoader->GetHeader()->SetGenEventHeader(header);
27f087a9 863}
504b172d 864//_______________________________________________________________________
0592d1ca 865
88cb7938 866Int_t AliRun::GetEvNumber() const
867{
868//Returns number of current event
869 if (fRunLoader == 0x0)
870 {
871 Error("GetEvent","RunLoader is not set. Can not load data.");
872 return -1;
873 }
0592d1ca 874
88cb7938 875 return fRunLoader->GetEventNumber();
0592d1ca 876}
504b172d 877//_______________________________________________________________________
b9d0a01d 878
88cb7938 879void AliRun::SetRunLoader(AliRunLoader* rloader)
0592d1ca 880{
88cb7938 881 fRunLoader = rloader;
882 if (fRunLoader == 0x0) return;
883
884 TString evfoldname;
885 TFolder* evfold = fRunLoader->GetEventFolder();
886 if (evfold) evfoldname = evfold->GetName();
887 else Warning("SetRunLoader","Did not get Event Folder from Run Loader");
888
889 if ( fRunLoader->GetAliRun() )
890 {//if alrun already exists in folder
891 if (fRunLoader->GetAliRun() != this )
892 {//and is different than this - crash
893 Fatal("AliRun","AliRun is already in Folder and it is not this object");
894 return;//pro forma
895 }//else do nothing
896 }
897 else
898 {
899 evfold->Add(this);//Post this AliRun to Folder
900 }
901
902 TIter next(fModules);
903 AliModule *module;
904 while((module = (AliModule*)next()))
905 {
906 if (evfold) AliConfig::Instance()->Add(module,evfoldname);
1d6fbf6e 907 module->SetRunLoader(fRunLoader);
88cb7938 908 AliDetector* detector = dynamic_cast<AliDetector*>(module);
909 if (detector)
910 {
911 AliLoader* loader = fRunLoader->GetLoader(detector);
912 if (loader == 0x0)
913 {
914 Error("SetRunLoader","Can not get loader for detector %s",detector->GetName());
915 }
916 else
917 {
918 if (GetDebug()) Info("SetRunLoader","Setting loader for detector %s",detector->GetName());
919 detector->SetLoader(loader);
920 }
0592d1ca 921 }
88cb7938 922 }
0592d1ca 923}
924
88cb7938 925void AliRun::AddModule(AliModule* mod)
7a16e9cc 926{
88cb7938 927 if (mod == 0x0) return;
928 if (strlen(mod->GetName()) == 0) return;
929 if (GetModuleID(mod->GetName()) >= 0) return;
930
931 if (GetDebug()) Info("AddModule","%s",mod->GetName());
932 if (fRunLoader == 0x0) AliConfig::Instance()->Add(mod);
933 else AliConfig::Instance()->Add(mod,fRunLoader->GetEventFolder()->GetName());
7a16e9cc 934
88cb7938 935 Modules()->Add(mod);
7a16e9cc 936}