// //
// sim.SetNumberOfEvents(n); //
// //
-// The name of the configuration file can be specified by //
+// The name of the configuration file can be passed as argument to the //
+// AliSimulation constructor or can be specified by //
// //
// sim.SetConfigFile("..."); //
// //
// to merge more than two event streams. It is assumed that the sdigits //
// were already produced for the background events. //
// //
+// The methods RunSimulation, RunSDigitization, RunDigitization and //
+// RunHitsDigitization can be used to run only parts of the full simulation //
+// chain. //
+// //
///////////////////////////////////////////////////////////////////////////////
//_____________________________________________________________________________
-AliSimulation::AliSimulation(const char* name, const char* title) :
- TNamed(name, title)
+AliSimulation::AliSimulation(const char* configFileName,
+ const char* name, const char* title) :
+ TNamed(name, title),
+
+ fRunGeneration(kTRUE),
+ fRunSimulation(kTRUE),
+ fMakeSDigits("ALL"),
+ fMakeDigits("ALL"),
+ fMakeDigitsFromHits(""),
+ fStopOnError(kFALSE),
+
+ fNEvents(1),
+ fConfigFileName(configFileName),
+ fGAliceFileName("galice.root"),
+ fBkgrdFileNames(NULL),
+ fRegionOfInterest(kTRUE)
{
// create simulation object with default parameters
- Init();
}
//_____________________________________________________________________________
AliSimulation::AliSimulation(const AliSimulation& sim) :
- TNamed(sim)
+ TNamed(sim),
+
+ fRunGeneration(sim.fRunGeneration),
+ fRunSimulation(sim.fRunSimulation),
+ fMakeSDigits(sim.fMakeSDigits),
+ fMakeDigits(sim.fMakeDigits),
+ fMakeDigitsFromHits(sim.fMakeDigitsFromHits),
+ fStopOnError(sim.fStopOnError),
+
+ fNEvents(sim.fNEvents),
+ fConfigFileName(sim.fConfigFileName),
+ fGAliceFileName(sim.fGAliceFileName),
+ fBkgrdFileNames(NULL),
+ fRegionOfInterest(sim.fRegionOfInterest)
{
// copy constructor
- fRunGeneration = sim.fRunGeneration;
- fRunSimulation = sim.fRunSimulation;
- fMakeSDigits = sim.fMakeSDigits;
- fMakeDigits = sim.fMakeDigits;
- fMakeDigitsFromHits = sim.fMakeDigitsFromHits;
- fStopOnError = sim.fStopOnError;
-
- fNEvents = sim.fNEvents;
- fConfigFileName = sim.fConfigFileName;
- fGAliceFileName = sim.fGAliceFileName;
fBkgrdFileNames = new TObjArray;
for (Int_t i = 0; i < sim.fBkgrdFileNames->GetEntriesFast(); i++) {
if (!sim.fBkgrdFileNames->At(i)) continue;
fBkgrdFileNames->Add(sim.fBkgrdFileNames->At(i)->Clone());
}
-
- fRunLoader = NULL;
}
//_____________________________________________________________________________
{
// clean up
- fBkgrdFileNames->Delete();
- delete fBkgrdFileNames;
-}
-
-//_____________________________________________________________________________
-void AliSimulation::Init()
-{
-// set default parameters
-
- fRunGeneration = kTRUE;
- fRunSimulation = kTRUE;
- fMakeSDigits = "ALL";
- fMakeDigits = "ALL";
- fMakeDigitsFromHits = "";
- fStopOnError = kFALSE;
-
- fNEvents = 1;
- fConfigFileName = "Config.C";
- fGAliceFileName = "galice.root";
- fBkgrdFileNames = new TObjArray;
- fRegionOfInterest = kTRUE;
-
- fRunLoader = NULL;
+ if (fBkgrdFileNames) {
+ fBkgrdFileNames->Delete();
+ delete fBkgrdFileNames;
+ }
}
TObjString* fileNameStr = new TObjString(fileName);
fileNameStr->SetUniqueID(nSignalPerBkgrd);
+ if (!fBkgrdFileNames) fBkgrdFileNames = new TObjArray;
fBkgrdFileNames->Add(fileNameStr);
}
// generation and simulation -> hits
if (fRunGeneration) {
- if (!gAlice) {
- Error("Run", "no gAlice object. Restart aliroot and try again.");
- return kFALSE;
- }
- if (gAlice->Modules()->GetEntries() > 0) {
- Error("Run", "gAlice was already run. Restart aliroot and try again.");
- return kFALSE;
- }
if (!RunSimulation()) if (fStopOnError) return kFALSE;
}
- // reopen the run loader
- if (fRunLoader) delete fRunLoader;
- fRunLoader = AliRunLoader::Open(fGAliceFileName.Data(),AliConfig::fgkDefaultEventFolderName,"UPDATE");
- if (!fRunLoader) {
- Error("Run", "no run loader found in file %s",
- fGAliceFileName.Data());
- return kFALSE;
- }
- fRunLoader->LoadgAlice();
- gAlice = fRunLoader->GetAliRun();
- if (!gAlice) {
- Error("Run", "no gAlice object found in file %s",
- fGAliceFileName.Data());
- return kFALSE;
- }
-
// hits -> summable digits
if (!fMakeSDigits.IsNull()) {
if (!RunSDigitization(fMakeSDigits)) if (fStopOnError) return kFALSE;
// hits -> digits
if (!fMakeDigitsFromHits.IsNull()) {
- if (fBkgrdFileNames->GetEntriesFast() > 0) {
+ if (fBkgrdFileNames && (fBkgrdFileNames->GetEntriesFast() > 0)) {
Warning("Run", "Merging and direct creation of digits from hits "
"was selected for some detectors. "
"No merging will be done for the following detectors: %s",
}
//_____________________________________________________________________________
-Bool_t AliSimulation::RunSimulation()
+Bool_t AliSimulation::RunSimulation(Int_t nEvents)
{
// run the generation and simulation
TStopwatch stopwatch;
stopwatch.Start();
+ if (!gAlice) {
+ Error("RunSimulation", "no gAlice object. Restart aliroot and try again.");
+ return kFALSE;
+ }
+ if (gAlice->Modules()->GetEntries() > 0) {
+ Error("RunSimulation",
+ "gAlice was already run. Restart aliroot and try again.");
+ return kFALSE;
+ }
+
Info("RunSimulation", "initializing gAlice with config file %s",
fConfigFileName.Data());
gAlice->Init(fConfigFileName.Data());
- fRunLoader = gAlice->GetRunLoader();
- if (!fRunLoader) {
+ AliRunLoader* runLoader = gAlice->GetRunLoader();
+ if (!runLoader) {
Error("RunSimulation", "gAlice has no run loader object. "
"Check your config file: %s", fConfigFileName.Data());
return kFALSE;
}
- fGAliceFileName = fRunLoader->GetFileName();
+ fGAliceFileName = runLoader->GetFileName();
if (!fRunSimulation) {
if (!gAlice->Generator()) {
}
Info("RunSimulation", "running gAlice");
- gAlice->Run(fNEvents);
+ if (nEvents <= 0) nEvents = fNEvents;
+ gAlice->Run(nEvents);
+
+ delete runLoader;
Info("RunSimulation", "execution time:");
stopwatch.Print();
}
//_____________________________________________________________________________
-Bool_t AliSimulation::RunSDigitization(const TString& detectors)
+Bool_t AliSimulation::RunSDigitization(const char* detectors)
{
// run the digitization and produce summable digits
TStopwatch stopwatch;
stopwatch.Start();
+ AliRunLoader* runLoader = LoadRun();
+ if (!runLoader) return kFALSE;
+
TString detStr = detectors;
- TObjArray* detArray = gAlice->Detectors();
+ TObjArray* detArray = runLoader->GetAliRun()->Detectors();
for (Int_t iDet = 0; iDet < detArray->GetEntriesFast(); iDet++) {
AliModule* det = (AliModule*) detArray->At(iDet);
if (!det || !det->IsActive()) continue;
if (fStopOnError) return kFALSE;
}
+ delete runLoader;
+
Info("RunSDigitization", "execution time:");
stopwatch.Print();
//_____________________________________________________________________________
-Bool_t AliSimulation::RunDigitization(const TString& detectors,
- const TString& excludeDetectors)
+Bool_t AliSimulation::RunDigitization(const char* detectors,
+ const char* excludeDetectors)
{
// run the digitization and produce digits from sdigits
TStopwatch stopwatch;
stopwatch.Start();
- Int_t nStreams = fBkgrdFileNames->GetEntriesFast() + 1;
+ while (AliRunLoader::GetRunLoader()) delete AliRunLoader::GetRunLoader();
+ if (gAlice) delete gAlice;
+ gAlice = NULL;
+
+ Int_t nStreams = 1;
Int_t signalPerBkgrd = 1;
- if (nStreams > 1) signalPerBkgrd = fBkgrdFileNames->At(0)->GetUniqueID();
+ if (fBkgrdFileNames) {
+ nStreams = fBkgrdFileNames->GetEntriesFast() + 1;
+ if (nStreams > 1) signalPerBkgrd = fBkgrdFileNames->At(0)->GetUniqueID();
+ }
AliRunDigitizer* manager = new AliRunDigitizer(nStreams, signalPerBkgrd);
manager->SetInputStream(0, fGAliceFileName.Data());
for (Int_t iStream = 1; iStream < nStreams; iStream++) {
TString detStr = detectors;
TString detExcl = excludeDetectors;
- TObjArray* detArray = gAlice->Detectors();
+ manager->GetInputStream(0)->ImportgAlice();
+ AliRunLoader* runLoader =
+ AliRunLoader::GetRunLoader(manager->GetInputStream(0)->GetFolderName());
+ TObjArray* detArray = runLoader->GetAliRun()->Detectors();
for (Int_t iDet = 0; iDet < detArray->GetEntriesFast(); iDet++) {
AliModule* det = (AliModule*) detArray->At(iDet);
if (!det || !det->IsActive()) continue;
Info("RunDigitization", "executing digitization");
manager->Exec("");
}
+
delete manager;
Info("RunDigitization", "execution time:");
}
//_____________________________________________________________________________
-Bool_t AliSimulation::RunHitsDigitization(const TString& detectors)
+Bool_t AliSimulation::RunHitsDigitization(const char* detectors)
{
// run the digitization and produce digits from hits
TStopwatch stopwatch;
stopwatch.Start();
+ AliRunLoader* runLoader = LoadRun();
+ if (!runLoader) return kFALSE;
+
TString detStr = detectors;
- TObjArray* detArray = gAlice->Detectors();
+ TObjArray* detArray = runLoader->GetAliRun()->Detectors();
for (Int_t iDet = 0; iDet < detArray->GetEntriesFast(); iDet++) {
AliModule* det = (AliModule*) detArray->At(iDet);
if (!det || !det->IsActive()) continue;
if (fStopOnError) return kFALSE;
}
+ delete runLoader;
+
Info("RunHitsDigitization", "execution time:");
stopwatch.Print();
}
+//_____________________________________________________________________________
+AliRunLoader* AliSimulation::LoadRun() const
+{
+// delete existing run loaders, open a new one and load gAlice
+
+ while (AliRunLoader::GetRunLoader()) delete AliRunLoader::GetRunLoader();
+ AliRunLoader* runLoader =
+ AliRunLoader::Open(fGAliceFileName.Data(),
+ AliConfig::fgkDefaultEventFolderName, "UPDATE");
+ if (!runLoader) {
+ Error("LoadRun", "no run loader found in file %s",
+ fGAliceFileName.Data());
+ return NULL;
+ }
+ runLoader->LoadgAlice();
+ gAlice = runLoader->GetAliRun();
+ if (!gAlice) {
+ Error("LoadRun", "no gAlice object found in file %s",
+ fGAliceFileName.Data());
+ return NULL;
+ }
+ return runLoader;
+}
+
//_____________________________________________________________________________
Bool_t AliSimulation::IsSelected(TString detName, TString& detectors) const
{