/**************************************************************************
* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
* *
* Author: The ALICE Off-line Project. *
* Contributors are mentioned in the code where appropriate. *
* *
* Permission to use, copy, modify and distribute this software and its *
* documentation strictly for non-commercial purposes is hereby granted *
* without fee, provided that the above copyright notice appears in all *
* copies and that both the copyright notice and this permission notice *
* appear in the supporting documentation. The authors make no claims *
* about the suitability of this software for any purpose. It is *
* provided "as is" without express or implied warranty. *
**************************************************************************/
/* $Id$ */
///////////////////////////////////////////////////////////////////////////////
// //
// Control class for Alice C++ //
// Only one single instance of this class exists. //
// The object is created in main program aliroot //
// and is pointed by the global gAlice. //
// //
// -Supports the list of all Alice Detectors (fModules). //
// -Supports the list of particles (fParticles). //
// -Supports the Trees. //
// -Supports the geometry. //
// -Supports the event display. //
//Begin_Html
/*
*/
//End_Html
//Begin_Html
/*
*/
//End_Html
// //
///////////////////////////////////////////////////////////////////////////////
#include
#include
#include
#include
#include
#include
//
#include "AliLog.h"
#include "AliDetector.h"
#include "AliHeader.h"
#include "AliMC.h"
#include "AliPDG.h"
#include "AliRun.h"
#include "AliStack.h"
#include "AliCDBManager.h"
#include "AliAlignObj.h"
#include "AliSimulation.h"
#include "AliLego.h"
AliRun *gAlice;
ClassImp(AliRun)
//_______________________________________________________________________
AliRun::AliRun():
// fRun(-1),
fEventNrInRun(-1),
fModules(0),
fMCApp(0),
fNdets(0),
fConfigFunction(""),
fBaseFileName(""),
fRunLoader(0x0)
{
//
// Default constructor for AliRun
//
AliConfig::Instance();//skowron 29 Feb 2002
//ensures that the folder structure is build
}
//_____________________________________________________________________________
AliRun::AliRun(const char *name, const char *title):
TNamed(name,title),
fEventNrInRun(-1),
fModules(new TObjArray(77)), // Support list for the Detectors
fMCApp(new AliMC(GetName(),GetTitle())),
fNdets(0),
fConfigFunction("Config();"),
fBaseFileName(""),
fRunLoader(0x0)
{
//
// Constructor for the main processor.
// Creates the geometry
// Creates the list of Detectors.
// Creates the list of particles.
//
gAlice = this;
// Set random number generator
gRandom = new TRandom3();
if (gSystem->Getenv("CONFIG_SEED")) {
gRandom->SetSeed(static_cast(atoi(gSystem->Getenv("CONFIG_SEED"))));
}
// Add to list of browsable
gROOT->GetListOfBrowsables()->Add(this,name);
}
//_______________________________________________________________________
AliRun::~AliRun()
{
//
// Default AliRun destructor
//
gROOT->GetListOfBrowsables()->Remove(this);
if (fRunLoader)
{
TFolder* evfold = fRunLoader->GetEventFolder();
TFolder* modfold = dynamic_cast(evfold->FindObjectAny(AliConfig::GetModulesFolderName()));
if(!modfold) AliFatal(Form("Folder %s not found\n",AliConfig::GetModulesFolderName().Data()));
TIter next(fModules);
AliModule *mod;
while((mod = (AliModule*)next()))
{
modfold->Remove(mod);
}
}
delete fMCApp;
delete gMC; gMC=0;
if (fModules) {
fModules->Delete();
delete fModules;
}
}
//_____________________________________________________________________________
void AliRun::InitLoaders()
{
//creates list of getters
AliDebug(1, "");
TIter next(fModules);
AliModule *mod;
while((mod = (AliModule*)next()))
{
mod->SetRunLoader(fRunLoader);
AliDetector *det = dynamic_cast(mod);
if (det)
{
AliDebug(2, Form("Adding %s", det->GetName()));
fRunLoader->AddLoader(det);
}
}
AliDebug(1, "Done");
}
//_______________________________________________________________________
void AliRun::Announce() const
{
//
// Announce the current version of AliRoot
//
printf("%70s",
"****************************************************************\n");
printf("%6s","*");printf("%64s","*\n");
printf("%6s","*");
printf(" You are running AliRoot version NewIO\n");
printf("%6s","*");
printf(" The SVN version for the current program is $Id$\n");
printf("%6s","*");printf("%64s","*\n");
printf("%70s",
"****************************************************************\n");
}
//_______________________________________________________________________
AliModule *AliRun::GetModule(const char *name) const
{
//
// Return pointer to detector from name
//
return dynamic_cast(fModules->FindObject(name));
}
//_______________________________________________________________________
AliDetector *AliRun::GetDetector(const char *name) const
{
//
// Return pointer to detector from name
//
return dynamic_cast(fModules->FindObject(name));
}
//_______________________________________________________________________
Int_t AliRun::GetModuleID(const char *name) const
{
//
// Return galice internal detector identifier from name
//
Int_t i=-1;
TObject *mod=fModules->FindObject(name);
if(mod) i=fModules->IndexOf(mod);
return i;
}
//_______________________________________________________________________
Int_t AliRun::GetEvent(Int_t event)
{
//
// Reloads data containers in folders # event
// Set branch addresses
//
if (fRunLoader == 0x0)
{
AliError("RunLoader is not set. Can not load data.");
return -1;
}
/*****************************************/
/**** P R E R E L O A D I N G ****/
/*****************************************/
// Reset existing structures
fMCApp->ResetHits();
fMCApp->ResetTrackReferences();
fMCApp->ResetDigits();
fMCApp->ResetSDigits();
/*****************************************/
/**** R E L O A D ****/
/*****************************************/
AliRunLoader::Instance()->GetEvent(event);
/*****************************************/
/**** P O S T R E L O A D I N G ****/
/*****************************************/
// Set Trees branch addresses
TIter next(fModules);
AliDetector *detector;
while((detector = dynamic_cast(next())))
{
detector->SetTreeAddress();
}
return AliRunLoader::Instance()->GetHeader()->GetNtrack();
}
//_______________________________________________________________________
void AliRun::SetBaseFile(const char *filename)
{
fBaseFileName = filename;
}
//_______________________________________________________________________
void AliRun::Hits2Digits(const char *selected)
{
// Convert Hits to sumable digits
//
for (Int_t nevent=0; neventTreeE()->GetEntries(); nevent++) {
GetEvent(nevent);
Hits2SDigits(selected);
SDigits2Digits(selected);
}
}
//_______________________________________________________________________
void AliRun::Tree2Tree(Option_t *option, const char *selected)
{
//
// Function to transform the content of
//
// - TreeH to TreeS (option "S")
// - TreeS to TreeD (option "D")
// - TreeD to TreeR (option "R")
//
// If multiple options are specified ("SDR"), transformation will be done in sequence for
// selected detector and for all detectors if none is selected (detector string
// can contain blank separated list of detector names).
const char *oS = strstr(option,"S");
const char *oD = strstr(option,"D");
const char *oR = strstr(option,"R");
TObjArray *detectors = Detectors();
TIter next(detectors);
AliDetector *detector = 0;
while((detector = dynamic_cast(next()))) {
if (selected)
if (strcmp(detector->GetName(),selected)) continue;
if (detector->IsActive())
{
AliLoader* loader = detector->GetLoader();
if (loader == 0x0) continue;
if (oS)
{
AliDebug(1, Form("Processing Hits2SDigits for %s ...", detector->GetName()));
loader->LoadHits("read");
if (loader->TreeS() == 0x0) loader->MakeTree("S");
detector->MakeBranch(option);
detector->SetTreeAddress();
detector->Hits2SDigits();
loader->UnloadHits();
loader->UnloadSDigits();
}
if (oD)
{
AliDebug(1, Form("Processing SDigits2Digits for %s ...", detector->GetName()));
loader->LoadSDigits("read");
if (loader->TreeD() == 0x0) loader->MakeTree("D");
detector->MakeBranch(option);
detector->SetTreeAddress();
detector->SDigits2Digits();
loader->UnloadSDigits();
loader->UnloadDigits();
}
if (oR)
{
AliDebug(1, Form("Processing Digits2Reco for %s ...", detector->GetName()));
loader->LoadDigits("read");
if (loader->TreeR() == 0x0) loader->MakeTree("R");
detector->MakeBranch(option);
detector->SetTreeAddress();
detector->Digits2Reco();
loader->UnloadDigits();
loader->UnloadRecPoints();
}
}
}
}
//_______________________________________________________________________
void AliRun::Streamer(TBuffer &R__b)
{
// Stream an object of class AliRun.
if (R__b.IsReading()) {
if (!gAlice) gAlice = this;
AliRun::Class()->ReadBuffer(R__b, this);
gROOT->GetListOfBrowsables()->Add(this,"Run");
gRandom = new TRandom3();
} else {
AliRun::Class()->WriteBuffer(R__b, this);
}
}
//_______________________________________________________________________
void AliRun::SetGenEventHeader(AliGenEventHeader* header)
{
AliRunLoader::Instance()->GetHeader()->SetGenEventHeader(header);
}
//_______________________________________________________________________
Int_t AliRun::GetEvNumber() const
{
//Returns number of current event
if (fRunLoader == 0x0)
{
AliError("RunLoader is not set. Can not load data.");
return -1;
}
return fRunLoader->GetEventNumber();
}
//_______________________________________________________________________
void AliRun::SetRunLoader(AliRunLoader* rloader)
{
//
// Set the loader of the run
//
fRunLoader = rloader;
if (fRunLoader == 0x0) return;
TString evfoldname;
TFolder* evfold = fRunLoader->GetEventFolder();
if (evfold) evfoldname = evfold->GetName();
else AliFatal("Did not get Event Folder from Run Loader");
if ( fRunLoader->GetAliRun() )
{//if alrun already exists in folder
if (fRunLoader->GetAliRun() != this )
{//and is different than this - crash
AliFatal("AliRun is already in Folder and it is not this object");
return;//pro forma
}//else do nothing
}
else
{
evfold->Add(this);//Post this AliRun to Folder
}
TIter next(fModules);
AliModule *module;
while((module = (AliModule*)next()))
{
if (evfold) AliConfig::Instance()->Add(module,evfoldname);
module->SetRunLoader(fRunLoader);
AliDetector* detector = dynamic_cast(module);
if (detector)
{
AliLoader* loader = fRunLoader->GetLoader(detector);
if (loader == 0x0)
{
AliError(Form("Can not get loader for detector %s", detector->GetName()));
}
else
{
AliDebug(1, Form("Setting loader for detector %s", detector->GetName()));
detector->SetLoader(loader);
}
}
}
}
//_______________________________________________________________________
void AliRun::AddModule(AliModule* mod)
{
//
// Add a module to the module list
//
if (mod == 0x0) return;
if (strlen(mod->GetName()) == 0) return;
if (GetModuleID(mod->GetName()) >= 0) return;
AliDebug(1, mod->GetName());
if (fRunLoader == 0x0) AliConfig::Instance()->Add(mod);
else AliConfig::Instance()->Add(mod,fRunLoader->GetEventFolder()->GetName());
Modules()->Add(mod);
fNdets++;
}