// //
///////////////////////////////////////////////////////////////////////////////
-#include <TBRIK.h>
#include <TCint.h>
-#include <TDatabasePDG.h>
-#include <TGeometry.h>
-#include <TNode.h>
#include <TROOT.h>
#include <TRandom3.h>
#include <TSystem.h>
//
#include "AliLog.h"
#include "AliDetector.h"
-#include "AliDisplay.h"
#include "AliHeader.h"
-#include "AliLego.h"
-#include "AliLegoGenerator.h"
#include "AliMC.h"
-#include "AliMagFC.h"
-#include "AliMagFCM.h"
-#include "AliMagFDM.h"
#include "AliPDG.h"
#include "AliRun.h"
#include "AliStack.h"
+#include "AliCDBManager.h"
#include "AliAlignObj.h"
+#include "AliSimulation.h"
+#include "AliLego.h"
AliRun *gAlice;
//_______________________________________________________________________
AliRun::AliRun():
- fRun(0),
- fEvent(0),
- fEventNrInRun(0),
- fEventsPerRun(0),
+// fRun(-1),
+ fEventNrInRun(-1),
fModules(0),
- fGeometry(0),
fMCApp(0),
- fDisplay(0),
- fField(0),
fNdets(0),
- fInitDone(kFALSE),
- fLego(0),
- fPDGDB(0), //Particle factory object
- fConfigFunction("\0"),
- fRandom(0),
- fIsRootGeometry(kFALSE),
+ fConfigFunction(""),
+ fBaseFileName(""),
fRunLoader(0x0)
{
//
//
AliConfig::Instance();//skowron 29 Feb 2002
//ensures that the folder structure is build
-}
-//_______________________________________________________________________
-AliRun::AliRun(const AliRun& arun):
- TNamed(arun),
- fRun(0),
- fEvent(0),
- fEventNrInRun(0),
- fEventsPerRun(0),
- fModules(0),
- fGeometry(0),
- fMCApp(0),
- fDisplay(0),
- fField(0),
- fNdets(0),
- fInitDone(kFALSE),
- fLego(0),
- fPDGDB(0), //Particle factory object
- fConfigFunction("\0"),
- fRandom(0),
- fIsRootGeometry(kFALSE),
- fRunLoader(0x0)
-{
- //
- // Copy constructor for AliRun
- //
- arun.Copy(*this);
}
//_____________________________________________________________________________
AliRun::AliRun(const char *name, const char *title):
TNamed(name,title),
- fRun(0),
- fEvent(0),
- fEventNrInRun(0),
- fEventsPerRun(0),
+ fEventNrInRun(-1),
fModules(new TObjArray(77)), // Support list for the Detectors
- fGeometry(0),
- fMCApp(0),
- fDisplay(0),
- fField(0),
+ fMCApp(new AliMC(GetName(),GetTitle())),
fNdets(0),
- fInitDone(kFALSE),
- fLego(0),
- fPDGDB(TDatabasePDG::Instance()), //Particle factory object!
fConfigFunction("Config();"),
- fRandom(new TRandom3()),
- fIsRootGeometry(kFALSE),
+ fBaseFileName(""),
fRunLoader(0x0)
{
//
gAlice = this;
// Set random number generator
- gRandom = fRandom;
+ gRandom = new TRandom3();
if (gSystem->Getenv("CONFIG_SEED")) {
gRandom->SetSeed(static_cast<UInt_t>(atoi(gSystem->Getenv("CONFIG_SEED"))));
// Add to list of browsable
gROOT->GetListOfBrowsables()->Add(this,name);
- // Create the TNode geometry for the event display
- BuildSimpleGeometry();
- // Create default mag field
- SetField();
-
- // Add particle list to configuration
- AliConfig::Instance()->Add(fPDGDB);
-
}
-
//_______________________________________________________________________
AliRun::~AliRun()
{
modfold->Remove(mod);
}
}
-
-
- delete fField;
+
delete fMCApp;
delete gMC; gMC=0;
- delete fGeometry;
- delete fDisplay;
- delete fLego;
if (fModules) {
fModules->Delete();
delete fModules;
}
- delete fPDGDB;
-}
-
-//_______________________________________________________________________
-void AliRun::Copy(TObject &) const
-{
- AliFatal("Not implemented!");
-}
-
-//_______________________________________________________________________
-void AliRun::Build()
-{
- //
- // Initialize Alice geometry
- // Dummy routine
- //
-}
-
-//_______________________________________________________________________
-void AliRun::BuildSimpleGeometry()
-{
- //
- // Create a simple TNode geometry used by Root display engine
- //
- // Initialise geometry
- //
- fGeometry = new TGeometry("AliceGeom","Galice Geometry for Hits");
- new TMaterial("void","Vacuum",0,0,0); //Everything is void
- TBRIK *brik = new TBRIK("S_alice","alice volume","void",2000,2000,3000);
- brik->SetVisibility(0);
- new TNode("alice","alice","S_alice");
-}
-
-//_______________________________________________________________________
-void AliRun::CleanDetectors()
-{
- //
- // Clean Detectors at the end of event
- //
- fRunLoader->CleanDetectors();
-}
-
-//_______________________________________________________________________
-void AliRun::ResetHits()
-{
- fMCApp->ResetHits();
-}
-
-//_______________________________________________________________________
-AliGenerator* AliRun::Generator() const
-{
- return fMCApp->Generator();
-}
-
-//_______________________________________________________________________
-void AliRun::SetField(AliMagF* magField)
-{
- //
- // Set Magnetic Field Map
- //
- fField = magField;
- fField->ReadField();
-}
-
-//_______________________________________________________________________
-void AliRun::SetRootGeometry(Bool_t flag)
-{
-// Instruct application that the geometry is to be retreived from a root file.
- fIsRootGeometry = flag;
- if (flag) gMC->SetRootGeometry();
-}
-//_______________________________________________________________________
-void AliRun::SetField(Int_t type, Int_t version, Float_t scale,
- Float_t maxField, const char* filename)
-{
- //
- // Set magnetic field parameters
- // type Magnetic field transport flag 0=no field, 2=helix, 3=Runge Kutta
- // version Magnetic field map version (only 1 active now)
- // scale Scale factor for the magnetic field
- // maxField Maximum value for the magnetic field
-
- //
- // --- Sanity check on mag field flags
- if(fField) delete fField;
- if(version==1) {
- fField = new AliMagFC("Map1"," ",type,scale,maxField);
- } else if(version<=2) {
- fField = new AliMagFCM("Map2-3",filename,type,scale,maxField);
- fField->ReadField();
- } else if(version==3) {
- fField = new AliMagFDM("Map4",filename,type,scale,maxField);
- fField->ReadField();
- } else {
- AliWarning(Form("Invalid map %d",version));
- }
}
//_____________________________________________________________________________
-
void AliRun::InitLoaders()
{
//creates list of getters
}
AliDebug(1, "Done");
}
-//_____________________________________________________________________________
-
-void AliRun::FinishRun()
-{
- //
- // Called at the end of the run.
- //
-
- if(fLego)
- {
- AliDebug(1, "Finish Lego");
- fRunLoader->CdGAFile();
- fLego->FinishRun();
- }
-
- // Clean detector information
- TIter next(fModules);
- AliModule *detector;
- while((detector = dynamic_cast<AliModule*>(next()))) {
- AliDebug(2, Form("%s->FinishRun()", detector->GetName()));
- detector->FinishRun();
- }
-
- AliDebug(1, "fRunLoader->WriteHeader(OVERWRITE)");
- fRunLoader->WriteHeader("OVERWRITE");
-
- // Write AliRun info and all detectors parameters
- fRunLoader->CdGAFile();
- Write(0,TObject::kOverwrite);//write AliRun
- fRunLoader->Write(0,TObject::kOverwrite);//write RunLoader itself
-
- // Clean tree information
- AliDebug(1, "fRunLoader->Stack()->FinishRun()");
- fRunLoader->Stack()->FinishRun();
-
- if(fMCApp) fMCApp->FinishRun();
-
- fRunLoader->Synchronize();
-}
//_______________________________________________________________________
void AliRun::Announce() const
printf(" You are running AliRoot version NewIO\n");
printf("%6s","*");
- printf(" The cvs tag for the current program is $Name$\n");
+ printf(" The SVN version for the current program is $Id$\n");
printf("%6s","*");printf("%64s","*\n");
printf("%70s",
// Reset existing structures
fMCApp->ResetHits();
fMCApp->ResetTrackReferences();
- ResetDigits();
- ResetSDigits();
+ fMCApp->ResetDigits();
+ fMCApp->ResetSDigits();
/*****************************************/
/**** R E L O A D ****/
/*****************************************/
- fRunLoader->GetEvent(event);
+ AliRunLoader::Instance()->GetEvent(event);
/*****************************************/
/**** P O S T R E L O A D I N G ****/
// Set Trees branch addresses
TIter next(fModules);
- AliModule *detector;
- while((detector = dynamic_cast<AliModule*>(next())))
+ AliDetector *detector;
+ while((detector = dynamic_cast<AliDetector*>(next())))
{
detector->SetTreeAddress();
}
- return fRunLoader->GetHeader()->GetNtrack();
-}
-
-//_______________________________________________________________________
-TGeometry *AliRun::GetGeometry()
-{
- //
- // Import Alice geometry from current file
- // Return pointer to geometry object
- //
- if (!fGeometry) fGeometry = dynamic_cast<TGeometry*>(gDirectory->Get("AliceGeom"));
- //
- // Unlink and relink nodes in detectors
- // This is bad and there must be a better way...
- //
-
- TIter next(fModules);
- AliModule *detector;
- while((detector = dynamic_cast<AliModule*>(next()))) {
- TList *dnodes=detector->Nodes();
- Int_t j;
- TNode *node, *node1;
- for ( j=0; j<dnodes->GetSize(); j++) {
- node = dynamic_cast<TNode*>(dnodes->At(j));
- node1 = fGeometry->GetNode(node->GetName());
- dnodes->Remove(node);
- dnodes->AddAt(node1,j);
- }
- }
- return fGeometry;
+ return AliRunLoader::Instance()->GetHeader()->GetNtrack();
}
//_______________________________________________________________________
fBaseFileName = filename;
}
-//_______________________________________________________________________
-void AliRun::ResetDigits()
-{
- //
- // Reset all Detectors digits
- //
- TIter next(fModules);
- AliModule *detector;
- while((detector = dynamic_cast<AliModule*>(next()))) {
- detector->ResetDigits();
- }
-}
//_______________________________________________________________________
-void AliRun::ResetSDigits()
-{
- //
- // Reset all Detectors digits
- //
- TIter next(fModules);
- AliModule *detector;
- while((detector = dynamic_cast<AliModule*>(next()))) {
- detector->ResetSDigits();
- }
-}
-
-
-//_______________________________________________________________________
-
-void AliRun::ResetPoints()
-{
- //
- // Reset all Detectors points
- //
- TIter next(fModules);
- AliModule *detector;
- while((detector = dynamic_cast<AliModule*>(next()))) {
- detector->ResetPoints();
- }
-}
-//_______________________________________________________________________
-
-void AliRun::InitMC(const char *setup)
-{
- //
- // Initialize ALICE Simulation run
- //
- Announce();
-
- if(fInitDone) {
- AliWarning("Cannot initialise AliRun twice!");
- return;
- }
-
- if (!fMCApp)
- fMCApp=new AliMC(GetName(),GetTitle());
-
- gROOT->LoadMacro(setup);
- gInterpreter->ProcessLine(fConfigFunction.Data());
-
- fRunLoader->CdGAFile();
-
- AliPDG::AddParticlesToPdgDataBase();
-
- fNdets = fModules->GetLast()+1;
-
- TIter next(fModules);
- for(Int_t i=0; i<fNdets; ++i)
- {
- TObject *objfirst, *objlast;
- AliModule *detector=dynamic_cast<AliModule*>(fModules->At(i));
- objlast = gDirectory->GetList()->Last();
-
- // Add Detector histograms in Detector list of histograms
- if (objlast) objfirst = gDirectory->GetList()->After(objlast);
- else objfirst = gDirectory->GetList()->First();
- while (objfirst)
- {
- detector->Histograms()->Add(objfirst);
- objfirst = gDirectory->GetList()->After(objfirst);
- }
- }
-
- fMCApp->Init();
-
- //Must be here because some MCs (G4) adds detectors here and not in Config.C
- InitLoaders();
- fRunLoader->MakeTree("E");
- if (fLego == 0x0)
- {
- fRunLoader->LoadKinematics("RECREATE");
- fRunLoader->LoadTrackRefs("RECREATE");
- fRunLoader->LoadHits("all","RECREATE");
- }
- fInitDone = kTRUE;
- //
- // Save stuff at the beginning of the file to avoid file corruption
- fRunLoader->CdGAFile();
- Write();
- fEventNrInRun = -1; //important - we start Begin event from increasing current number in run
-}
-
-//_______________________________________________________________________
-
-void AliRun::RunMC(Int_t nevent, const char *setup)
-{
- //
- // Main function to be called to process a galice run
- // example
- // Root > gAlice.Run();
- // a positive number of events will cause the finish routine
- // to be called
- //
- fEventsPerRun = nevent;
- // check if initialisation has been done
- if (!fInitDone) InitMC(setup);
-
- // Create the Root Tree with one branch per detector
- //Hits moved to begin event -> now we are crating separate tree for each event
-
- gMC->ProcessRun(nevent);
-
- // End of this run, close files
- if(nevent>0) FinishRun();
-}
-
-//_______________________________________________________________________
-void AliRun::RunReco(const char *selected, Int_t first, Int_t last)
-{
- //
- // Main function to be called to reconstruct Alice event
- //
- Int_t nev = fRunLoader->GetNumberOfEvents();
- AliDebug(1, Form("Found %d events", nev));
- Int_t nFirst = first;
- Int_t nLast = (last < 0)? nev : last;
-
- for (Int_t nevent = nFirst; nevent <= nLast; nevent++) {
- AliDebug(1, Form("Processing event %d", nevent));
- GetEvent(nevent);
- Digits2Reco(selected);
- }
-}
-
-//_______________________________________________________________________
-
void AliRun::Hits2Digits(const char *selected)
{
// Convert Hits to sumable digits
//
- for (Int_t nevent=0; nevent<gAlice->TreeE()->GetEntries(); nevent++) {
+ for (Int_t nevent=0; nevent<AliRunLoader::Instance()->TreeE()->GetEntries(); nevent++) {
GetEvent(nevent);
Hits2SDigits(selected);
SDigits2Digits(selected);
//_______________________________________________________________________
-
void AliRun::Tree2Tree(Option_t *option, const char *selected)
{
//
}
}
-//_______________________________________________________________________
-void AliRun::RunLego(const char *setup, Int_t nc1, Float_t c1min,
- Float_t c1max,Int_t nc2,Float_t c2min,Float_t c2max,
- Float_t rmin,Float_t rmax,Float_t zmax, AliLegoGenerator* gener)
-{
- //
- // Generates lego plots of:
- // - radiation length map phi vs theta
- // - radiation length map phi vs eta
- // - interaction length map
- // - g/cm2 length map
- //
- // ntheta bins in theta, eta
- // themin minimum angle in theta (degrees)
- // themax maximum angle in theta (degrees)
- // nphi bins in phi
- // phimin minimum angle in phi (degrees)
- // phimax maximum angle in phi (degrees)
- // rmin minimum radius
- // rmax maximum radius
- //
- //
- // The number of events generated = ntheta*nphi
- // run input parameters in macro setup (default="Config.C")
- //
- // Use macro "lego.C" to visualize the 3 lego plots in spherical coordinates
- //Begin_Html
- /*
- <img src="picts/AliRunLego1.gif">
- */
- //End_Html
- //Begin_Html
- /*
- <img src="picts/AliRunLego2.gif">
- */
- //End_Html
- //Begin_Html
- /*
- <img src="picts/AliRunLego3.gif">
- */
- //End_Html
- //
-
- // check if initialisation has been done
- // If runloader has been initialized, set the number of events per file to nc1 * nc2
-
- // Set new generator
- if (!gener) gener = new AliLegoGenerator();
- //
- // Configure Generator
- gener->SetRadiusRange(rmin, rmax);
- gener->SetZMax(zmax);
- gener->SetCoor1Range(nc1, c1min, c1max);
- gener->SetCoor2Range(nc2, c2min, c2max);
-
-
- //Create Lego object
- fLego = new AliLego("lego",gener);
-
- if (!fInitDone) InitMC(setup);
- //Save current generator
-
- AliGenerator *gen=fMCApp->Generator();
- fMCApp->ResetGenerator(gener);
- //Prepare MC for Lego Run
- gMC->InitLego();
-
- //Run Lego Object
-
- if (fRunLoader) fRunLoader->SetNumberOfEventsPerFile(nc1 * nc2);
- //gMC->ProcessRun(nc1*nc2+1);
- gMC->ProcessRun(nc1*nc2);
-
- // End of this run, close files
- FinishRun();
- // Restore current generator
- fMCApp->ResetGenerator(gen);
- // Delete Lego Object
- delete fLego; fLego=0;
-}
-
-//_______________________________________________________________________
-void AliRun::SetConfigFunction(const char * config)
-{
- //
- // Set the signature of the function contained in Config.C to configure
- // the run
- //
- fConfigFunction=config;
-}
-
-//
-// MC Application
-//
-
-//_______________________________________________________________________
-void AliRun::Field(const Double_t* x, Double_t *b) const
-{
- //
- // Return the value of the magnetic field
- //
- Float_t xfloat[3];
- for (Int_t i=0; i<3; i++) xfloat[i] = x[i];
-
- if (Field()) {
- Float_t bfloat[3];
- Field()->Field(xfloat,bfloat);
- for (Int_t j=0; j<3; j++) b[j] = bfloat[j];
- }
- else {
- AliError("No mag field defined!");
- b[0]=b[1]=b[2]=0.;
- }
-}
-
-//
-// End of MC Application
-//
//_______________________________________________________________________
void AliRun::Streamer(TBuffer &R__b)
if (!gAlice) gAlice = this;
AliRun::Class()->ReadBuffer(R__b, this);
gROOT->GetListOfBrowsables()->Add(this,"Run");
-
- gRandom = fRandom;
+ gRandom = new TRandom3();
} else {
AliRun::Class()->WriteBuffer(R__b, this);
}
}
-//_______________________________________________________________________
+//_______________________________________________________________________
void AliRun::SetGenEventHeader(AliGenEventHeader* header)
{
- fRunLoader->GetHeader()->SetGenEventHeader(header);
+ AliRunLoader::Instance()->GetHeader()->SetGenEventHeader(header);
}
-//_______________________________________________________________________
+
+//_______________________________________________________________________
Int_t AliRun::GetEvNumber() const
{
//Returns number of current event
return fRunLoader->GetEventNumber();
}
-//_______________________________________________________________________
+//_______________________________________________________________________
void AliRun::SetRunLoader(AliRunLoader* rloader)
{
//
}
}
+//_______________________________________________________________________
void AliRun::AddModule(AliModule* mod)
{
//
fNdets++;
}
-// added by Alberto Colla
-//_____________________________________________________________________________
-/*inline*/ Bool_t AliRun::IsFileAccessible(const char* fnam, EAccessMode mode)
-{ return !gSystem->AccessPathName(fnam,mode);}
-
-//______________________________________________________
-/*inline*/ Bool_t AliRun::IsFileAccessible(Char_t* name,EAccessMode mode)
-{
- TString str = name; gSystem->ExpandPathName(str);
- return !gSystem->AccessPathName(str.Data(),mode);
-}