1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
18 ///////////////////////////////////////////////////////////////////////////////
20 // class for running generation, simulation and digitization //
22 // Hits, sdigits and digits are created for all detectors by typing: //
24 // AliSimulation sim; //
27 // The Run method returns kTRUE in case of successful execution. //
28 // The number of events can be given as argument to the Run method or it //
31 // sim.SetNumberOfEvents(n); //
33 // The name of the configuration file can be passed as argument to the //
34 // AliSimulation constructor or can be specified by //
36 // sim.SetConfigFile("..."); //
38 // The generation of particles and the simulation of detector hits can be //
39 // switched on or off by //
41 // sim.SetRunGeneration(kTRUE); // generation of primary particles //
42 // sim.SetRunSimulation(kFALSE); // but no tracking //
44 // For which detectors sdigits and digits will be created, can be steered //
47 // sim.SetMakeSDigits("ALL"); // make sdigits for all detectors //
48 // sim.SetMakeDigits("ITS TPC"); // make digits only for ITS and TPC //
50 // The argument is a (case sensitive) string with the names of the //
51 // detectors separated by a space. An empty string ("") can be used to //
52 // disable the creation of sdigits or digits. The special string "ALL" //
53 // selects all available detectors. This is the default. //
55 // The creation of digits from hits instead of from sdigits can be selected //
58 // sim.SetMakeDigitsFromHits("TRD"); //
60 // The argument is again a string with the selected detectors. Be aware that //
61 // this feature is not available for all detectors and that merging is not //
62 // possible, when digits are created directly from hits. //
64 // Background events can be merged by calling //
66 // sim.MergeWith("background/galice.root", 2); //
68 // The first argument is the file name of the background galice file. The //
69 // second argument is the number of signal events per background event. //
70 // By default this number is calculated from the number of available //
71 // background events. MergeWith can be called several times to merge more //
72 // than two event streams. It is assumed that the sdigits were already //
73 // produced for the background events. //
75 // The output of raw data can be switched on by calling //
77 // sim.SetWriteRawData("MUON"); // write raw data for MUON //
79 // The default output format of the raw data are DDL files. They are //
80 // converted to a DATE file, if a file name is given as second argument. //
81 // For this conversion the program "dateStream" is required. If the file //
82 // name has the extension ".root", the DATE file is converted to a root //
83 // file. The program "alimdc" is used for this purpose. For the conversion //
84 // to DATE and root format the two conversion programs have to be installed. //
85 // Only the raw data in the final format is kept if the third argument is //
88 // The methods RunSimulation, RunSDigitization, RunDigitization, //
89 // RunHitsDigitization and WriteRawData can be used to run only parts of //
90 // the full simulation chain. The creation of raw data DDL files and their //
91 // conversion to the DATE or root format can be run directly by calling //
92 // the methods WriteRawFiles, ConvertRawFilesToDate and ConvertDateToRoot. //
94 // The default number of events per file, which is usually set in the //
95 // config file, can be changed for individual detectors and data types //
98 // sim.SetEventsPerFile("PHOS", "Reconstructed Points", 3); //
100 // The first argument is the detector, the second one the data type and the //
101 // last one the number of events per file. Valid data types are "Hits", //
102 // "Summable Digits", "Digits", "Reconstructed Points" and "Tracks". //
103 // The number of events per file has to be set before the simulation of //
104 // hits. Otherwise it has no effect. //
106 ///////////////////////////////////////////////////////////////////////////////
108 #include <TObjString.h>
109 #include <TStopwatch.h>
112 #include "AliDigitizer.h"
113 #include "AliGenerator.h"
114 #include "AliModule.h"
116 #include "AliRunDigitizer.h"
117 #include "AliRunLoader.h"
118 #include "AliSimulation.h"
119 #include "AliVertexGenFile.h"
121 ClassImp(AliSimulation)
124 //_____________________________________________________________________________
125 AliSimulation::AliSimulation(const char* configFileName,
126 const char* name, const char* title) :
129 fRunGeneration(kTRUE),
130 fRunSimulation(kTRUE),
133 fMakeDigitsFromHits(""),
135 fRawDataFileName(""),
136 fDeleteIntermediateFiles(kFALSE),
137 fStopOnError(kFALSE),
140 fConfigFileName(configFileName),
141 fGAliceFileName("galice.root"),
143 fBkgrdFileNames(NULL),
144 fUseBkgrdVertex(kTRUE),
145 fRegionOfInterest(kTRUE)
147 // create simulation object with default parameters
149 SetGAliceFile("galice.root");
152 //_____________________________________________________________________________
153 AliSimulation::AliSimulation(const AliSimulation& sim) :
156 fRunGeneration(sim.fRunGeneration),
157 fRunSimulation(sim.fRunSimulation),
158 fMakeSDigits(sim.fMakeSDigits),
159 fMakeDigits(sim.fMakeDigits),
160 fMakeDigitsFromHits(sim.fMakeDigitsFromHits),
161 fWriteRawData(sim.fWriteRawData),
162 fRawDataFileName(""),
163 fDeleteIntermediateFiles(kFALSE),
164 fStopOnError(sim.fStopOnError),
166 fNEvents(sim.fNEvents),
167 fConfigFileName(sim.fConfigFileName),
168 fGAliceFileName(sim.fGAliceFileName),
170 fBkgrdFileNames(NULL),
171 fUseBkgrdVertex(sim.fUseBkgrdVertex),
172 fRegionOfInterest(sim.fRegionOfInterest)
176 for (Int_t i = 0; i < sim.fEventsPerFile.GetEntriesFast(); i++) {
177 if (!sim.fEventsPerFile[i]) continue;
178 fEventsPerFile.Add(sim.fEventsPerFile[i]->Clone());
181 fBkgrdFileNames = new TObjArray;
182 for (Int_t i = 0; i < sim.fBkgrdFileNames->GetEntriesFast(); i++) {
183 if (!sim.fBkgrdFileNames->At(i)) continue;
184 fBkgrdFileNames->Add(sim.fBkgrdFileNames->At(i)->Clone());
188 //_____________________________________________________________________________
189 AliSimulation& AliSimulation::operator = (const AliSimulation& sim)
191 // assignment operator
193 this->~AliSimulation();
194 new(this) AliSimulation(sim);
198 //_____________________________________________________________________________
199 AliSimulation::~AliSimulation()
203 fEventsPerFile.Delete();
205 if (fBkgrdFileNames) {
206 fBkgrdFileNames->Delete();
207 delete fBkgrdFileNames;
212 //_____________________________________________________________________________
213 void AliSimulation::SetNumberOfEvents(Int_t nEvents)
215 // set the number of events for one run
220 //_____________________________________________________________________________
221 void AliSimulation::SetConfigFile(const char* fileName)
223 // set the name of the config file
225 fConfigFileName = fileName;
228 //_____________________________________________________________________________
229 void AliSimulation::SetGAliceFile(const char* fileName)
231 // set the name of the galice file
232 // the path is converted to an absolute one if it is relative
234 fGAliceFileName = fileName;
235 if (!gSystem->IsAbsoluteFileName(fGAliceFileName)) {
236 char* absFileName = gSystem->ConcatFileName(gSystem->WorkingDirectory(),
238 fGAliceFileName = absFileName;
239 delete[] absFileName;
243 //_____________________________________________________________________________
244 void AliSimulation::SetEventsPerFile(const char* detector, const char* type,
247 // set the number of events per file for the given detector and data type
248 // ("Hits", "Summable Digits", "Digits", "Reconstructed Points" or "Tracks")
250 TNamed* obj = new TNamed(detector, type);
251 obj->SetUniqueID(nEvents);
252 fEventsPerFile.Add(obj);
255 //_____________________________________________________________________________
256 void AliSimulation::MergeWith(const char* fileName, Int_t nSignalPerBkgrd)
258 // add a file with background events for merging
260 TObjString* fileNameStr = new TObjString(fileName);
261 fileNameStr->SetUniqueID(nSignalPerBkgrd);
262 if (!fBkgrdFileNames) fBkgrdFileNames = new TObjArray;
263 fBkgrdFileNames->Add(fileNameStr);
267 //_____________________________________________________________________________
268 Bool_t AliSimulation::Run(Int_t nEvents)
270 // run the generation, simulation and digitization
272 if (nEvents > 0) fNEvents = nEvents;
274 // generation and simulation -> hits
275 if (fRunGeneration) {
276 if (!RunSimulation()) if (fStopOnError) return kFALSE;
279 // hits -> summable digits
280 if (!fMakeSDigits.IsNull()) {
281 if (!RunSDigitization(fMakeSDigits)) if (fStopOnError) return kFALSE;
284 // summable digits -> digits
285 if (!fMakeDigits.IsNull()) {
286 if (!RunDigitization(fMakeDigits, fMakeDigitsFromHits)) {
287 if (fStopOnError) return kFALSE;
292 if (!fMakeDigitsFromHits.IsNull()) {
293 if (fBkgrdFileNames && (fBkgrdFileNames->GetEntriesFast() > 0)) {
294 Warning("Run", "Merging and direct creation of digits from hits "
295 "was selected for some detectors. "
296 "No merging will be done for the following detectors: %s",
297 fMakeDigitsFromHits.Data());
299 if (!RunHitsDigitization(fMakeDigitsFromHits)) {
300 if (fStopOnError) return kFALSE;
304 // digits -> raw data
305 if (!fWriteRawData.IsNull()) {
306 if (!WriteRawData(fWriteRawData, fRawDataFileName,
307 fDeleteIntermediateFiles)) {
308 if (fStopOnError) return kFALSE;
315 //_____________________________________________________________________________
316 Bool_t AliSimulation::RunSimulation(Int_t nEvents)
318 // run the generation and simulation
320 TStopwatch stopwatch;
324 Error("RunSimulation", "no gAlice object. Restart aliroot and try again.");
327 if (gAlice->Modules()->GetEntries() > 0) {
328 Error("RunSimulation",
329 "gAlice was already run. Restart aliroot and try again.");
333 Info("RunSimulation", "initializing gAlice with config file %s",
334 fConfigFileName.Data());
335 gAlice->Init(fConfigFileName.Data());
336 AliRunLoader* runLoader = gAlice->GetRunLoader();
338 Error("RunSimulation", "gAlice has no run loader object. "
339 "Check your config file: %s", fConfigFileName.Data());
342 SetGAliceFile(runLoader->GetFileName());
344 if (!gAlice->Generator()) {
345 Error("RunSimulation", "gAlice has no generator object. "
346 "Check your config file: %s", fConfigFileName.Data());
349 if (nEvents <= 0) nEvents = fNEvents;
351 // get vertex from background file in case of merging
352 if (fUseBkgrdVertex &&
353 fBkgrdFileNames && (fBkgrdFileNames->GetEntriesFast() > 0)) {
354 Int_t signalPerBkgrd = GetNSignalPerBkgrd(nEvents);
355 const char* fileName = ((TObjString*)
356 (fBkgrdFileNames->At(0)))->GetName();
357 Info("RunSimulation", "The vertex will be taken from the background "
358 "file %s with nSignalPerBackground = %d",
359 fileName, signalPerBkgrd);
360 AliVertexGenFile* vtxGen = new AliVertexGenFile(fileName, signalPerBkgrd);
361 gAlice->Generator()->SetVertexGenerator(vtxGen);
364 if (!fRunSimulation) {
365 gAlice->Generator()->SetTrackingFlag(0);
368 // set the number of events per file for given detectors and data types
369 for (Int_t i = 0; i < fEventsPerFile.GetEntriesFast(); i++) {
370 if (!fEventsPerFile[i]) continue;
371 const char* detName = fEventsPerFile[i]->GetName();
372 const char* typeName = fEventsPerFile[i]->GetTitle();
373 TString loaderName(detName);
374 loaderName += "Loader";
375 AliLoader* loader = runLoader->GetLoader(loaderName);
377 Error("RunSimulation", "no loader for %s found\n"
378 "Number of events per file not set for %s %s",
379 detName, typeName, detName);
382 AliDataLoader* dataLoader =
383 loader->GetDataLoader(typeName);
385 Error("RunSimulation", "no data loader for %s found\n"
386 "Number of events per file not set for %s %s",
387 typeName, detName, typeName);
390 dataLoader->SetNumberOfEventsPerFile(fEventsPerFile[i]->GetUniqueID());
391 Info("RunSimulation", "number of events per file set to %d for %s %s",
392 fEventsPerFile[i]->GetUniqueID(), detName, typeName);
395 Info("RunSimulation", "running gAlice");
396 gAlice->Run(nEvents);
400 Info("RunSimulation", "execution time:");
406 //_____________________________________________________________________________
407 Bool_t AliSimulation::RunSDigitization(const char* detectors)
409 // run the digitization and produce summable digits
411 TStopwatch stopwatch;
414 AliRunLoader* runLoader = LoadRun();
415 if (!runLoader) return kFALSE;
417 TString detStr = detectors;
418 TObjArray* detArray = runLoader->GetAliRun()->Detectors();
419 for (Int_t iDet = 0; iDet < detArray->GetEntriesFast(); iDet++) {
420 AliModule* det = (AliModule*) detArray->At(iDet);
421 if (!det || !det->IsActive()) continue;
422 if (IsSelected(det->GetName(), detStr)) {
423 Info("RunSDigitization", "creating summable digits for %s",
425 TStopwatch stopwatchDet;
426 stopwatchDet.Start();
428 Info("RunSDigitization", "execution time for %s:", det->GetName());
429 stopwatchDet.Print();
433 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
434 Error("RunSDigitization", "the following detectors were not found: %s",
436 if (fStopOnError) return kFALSE;
441 Info("RunSDigitization", "execution time:");
448 //_____________________________________________________________________________
449 Bool_t AliSimulation::RunDigitization(const char* detectors,
450 const char* excludeDetectors)
452 // run the digitization and produce digits from sdigits
454 TStopwatch stopwatch;
457 while (AliRunLoader::GetRunLoader()) delete AliRunLoader::GetRunLoader();
458 if (gAlice) delete gAlice;
462 if (fBkgrdFileNames) nStreams = fBkgrdFileNames->GetEntriesFast() + 1;
463 Int_t signalPerBkgrd = GetNSignalPerBkgrd();
464 AliRunDigitizer* manager = new AliRunDigitizer(nStreams, signalPerBkgrd);
465 manager->SetInputStream(0, fGAliceFileName.Data());
466 for (Int_t iStream = 1; iStream < nStreams; iStream++) {
467 const char* fileName = ((TObjString*)
468 (fBkgrdFileNames->At(iStream-1)))->GetName();
469 manager->SetInputStream(iStream, fileName);
472 TString detStr = detectors;
473 TString detExcl = excludeDetectors;
474 manager->GetInputStream(0)->ImportgAlice();
475 AliRunLoader* runLoader =
476 AliRunLoader::GetRunLoader(manager->GetInputStream(0)->GetFolderName());
477 TObjArray* detArray = runLoader->GetAliRun()->Detectors();
478 for (Int_t iDet = 0; iDet < detArray->GetEntriesFast(); iDet++) {
479 AliModule* det = (AliModule*) detArray->At(iDet);
480 if (!det || !det->IsActive()) continue;
481 if (IsSelected(det->GetName(), detStr) &&
482 !IsSelected(det->GetName(), detExcl)) {
483 AliDigitizer* digitizer = det->CreateDigitizer(manager);
485 Error("RunDigitization", "no digitizer for %s", det->GetName());
486 if (fStopOnError) return kFALSE;
488 digitizer->SetRegionOfInterest(fRegionOfInterest);
493 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
494 Error("RunDigitization", "the following detectors were not found: %s",
496 if (fStopOnError) return kFALSE;
499 if (!manager->GetListOfTasks()->IsEmpty()) {
500 Info("RunDigitization", "executing digitization");
506 Info("RunDigitization", "execution time:");
512 //_____________________________________________________________________________
513 Bool_t AliSimulation::RunHitsDigitization(const char* detectors)
515 // run the digitization and produce digits from hits
517 TStopwatch stopwatch;
520 AliRunLoader* runLoader = LoadRun();
521 if (!runLoader) return kFALSE;
523 TString detStr = detectors;
524 TObjArray* detArray = runLoader->GetAliRun()->Detectors();
525 for (Int_t iDet = 0; iDet < detArray->GetEntriesFast(); iDet++) {
526 AliModule* det = (AliModule*) detArray->At(iDet);
527 if (!det || !det->IsActive()) continue;
528 if (IsSelected(det->GetName(), detStr)) {
529 Info("RunHitsDigitization", "creating digits from hits for %s",
535 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
536 Error("RunHitsDigitization", "the following detectors were not found: %s",
538 if (fStopOnError) return kFALSE;
543 Info("RunHitsDigitization", "execution time:");
549 //_____________________________________________________________________________
550 Bool_t AliSimulation::WriteRawData(const char* detectors,
551 const char* fileName,
552 Bool_t deleteIntermediateFiles)
554 // convert the digits to raw data
555 // First DDL raw data files for the given detectors are created.
556 // If a file name is given, the DDL files are then converted to a DATE file.
557 // If deleteIntermediateFiles is true, the DDL raw files are deleted
559 // If the file name has the extension ".root", the DATE file is converted
561 // If deleteIntermediateFiles is true, the DATE file is deleted afterwards.
563 TStopwatch stopwatch;
566 if (!WriteRawFiles(detectors)) {
567 if (fStopOnError) return kFALSE;
570 TString dateFileName(fileName);
571 if (!dateFileName.IsNull()) {
572 Bool_t rootOutput = dateFileName.EndsWith(".root");
573 if (rootOutput) dateFileName += ".date";
574 if (!ConvertRawFilesToDate(dateFileName)) {
575 if (fStopOnError) return kFALSE;
577 if (deleteIntermediateFiles) {
578 AliRunLoader* runLoader = LoadRun("READ");
579 if (runLoader) for (Int_t iEvent = 0;
580 iEvent < runLoader->GetNumberOfEvents(); iEvent++) {
582 sprintf(command, "rm -r raw%d", iEvent);
583 gSystem->Exec(command);
588 if (!ConvertDateToRoot(dateFileName, fileName)) {
589 if (fStopOnError) return kFALSE;
591 if (deleteIntermediateFiles) {
592 gSystem->Unlink(dateFileName);
597 Info("WriteRawData", "execution time:");
603 //_____________________________________________________________________________
604 Bool_t AliSimulation::WriteRawFiles(const char* detectors)
606 // convert the digits to raw data DDL files
608 AliRunLoader* runLoader = LoadRun("READ");
609 if (!runLoader) return kFALSE;
611 // write raw data to DDL files
612 for (Int_t iEvent = 0; iEvent < runLoader->GetNumberOfEvents(); iEvent++) {
613 Info("WriteRawFiles", "processing event %d", iEvent);
614 runLoader->GetEvent(iEvent);
615 TString baseDir = gSystem->WorkingDirectory();
617 sprintf(dirName, "raw%d", iEvent);
618 gSystem->MakeDirectory(dirName);
619 if (!gSystem->ChangeDirectory(dirName)) {
620 Error("WriteRawData", "couldn't change to directory %s", dirName);
621 if (fStopOnError) return kFALSE; else continue;
624 TString detStr = detectors;
625 TObjArray* detArray = runLoader->GetAliRun()->Detectors();
626 for (Int_t iDet = 0; iDet < detArray->GetEntriesFast(); iDet++) {
627 AliModule* det = (AliModule*) detArray->At(iDet);
628 if (!det || !det->IsActive()) continue;
629 if (IsSelected(det->GetName(), detStr)) {
630 Info("WriteRawData", "creating raw data from digits for %s",
636 gSystem->ChangeDirectory(baseDir);
637 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
638 Error("WriteRawData", "the following detectors were not found: %s",
640 if (fStopOnError) return kFALSE;
648 //_____________________________________________________________________________
649 Bool_t AliSimulation::ConvertRawFilesToDate(const char* dateFileName)
651 // convert raw data DDL files to a DATE file with the program "dateStream"
654 const Int_t kNDetectors = 17;
655 const char* kDetectors[kNDetectors] = {"TPC", "ITSSPD", "ITSSDD", "ITSSSD",
656 "TRD", "TOF", "PHOS", "RICH",
657 "EMCAL", "MUON", "MUTR", "ZDC",
658 "PMD", "START", "VZERO", "CRT",
660 const Int_t kDetectorDDLs[kNDetectors] = {216, 20, 12, 16,
665 const Float_t kDetectorLDCs[kNDetectors] = {46, 2, 2, 1,
671 char* path = gSystem->Which(gSystem->Getenv("PATH"), "dateStream");
673 Error("ConvertRawFilesToDate", "the program dateStream was not found");
674 if (fStopOnError) return kFALSE;
679 AliRunLoader* runLoader = LoadRun("READ");
680 if (!runLoader) return kFALSE;
682 Info("ConvertRawFilesToDate",
683 "converting raw data DDL files to DATE file %s", dateFileName);
685 sprintf(command, "dateStream -o %s -# %d -C",
686 dateFileName, runLoader->GetNumberOfEvents());
687 FILE* pipe = gSystem->OpenPipe(command, "w");
689 for (Int_t iEvent = 0; iEvent < runLoader->GetNumberOfEvents(); iEvent++) {
690 fprintf(pipe, "GDC\n");
694 // loop over detectors and DDLs
695 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
696 for (Int_t iDDL = 0; iDDL < kDetectorDDLs[iDet]; iDDL++) {
698 Int_t ddlID = 0x100*iDet + iDDL;
699 Int_t ldcID = Int_t(ldc + 0.0001);
700 ldc += kDetectorLDCs[iDet] / kDetectorDDLs[iDet];
702 char rawFileName[256];
703 sprintf(rawFileName, "raw%d/%s_%d.ddl",
704 iEvent, kDetectors[iDet], ddlID);
706 // check existence and size of raw data file
707 FILE* file = fopen(rawFileName, "rb");
709 fseek(file, 0, SEEK_END);
710 unsigned long size = ftell(file);
711 fseek(file, 0, SEEK_SET);
717 if (ldcID != prevLDC) {
718 fprintf(pipe, " LDC Id %d\n", ldcID);
721 fprintf(pipe, " Equipment Id %d Payload %s\n", ddlID, rawFileName);
726 Int_t result = gSystem->ClosePipe(pipe);
729 return (result == 0);
732 //_____________________________________________________________________________
733 Bool_t AliSimulation::ConvertDateToRoot(const char* dateFileName,
734 const char* rootFileName)
736 // convert a DATE file to a root file with the program "alimdc"
739 const Int_t kDBSize = 1000000000;
740 const Bool_t kFilter = kFALSE;
741 const Int_t kCompression = 1;
743 char* path = gSystem->Which(gSystem->Getenv("PATH"), "alimdc");
745 Error("ConvertDateToRoot", "the program alimdc was not found");
746 if (fStopOnError) return kFALSE;
751 Info("ConvertDateToRoot", "converting DATE file %s to root file %s",
752 dateFileName, rootFileName);
754 gSystem->Exec("rm -rf /tmp/mdc1");
755 gSystem->Exec("rm -rf /tmp/mdc2");
757 sprintf(command, "alimdc %d %d %d %s",
758 kDBSize, kFilter, kCompression, dateFileName);
759 Int_t result = gSystem->Exec(command);
760 sprintf(command, "mv /tmp/mdc1/*.root %s", rootFileName);
761 gSystem->Exec(command);
762 gSystem->Exec("rm -rf /tmp/mdc1");
763 gSystem->Exec("rm -rf /tmp/mdc2");
765 return (result == 0);
769 //_____________________________________________________________________________
770 AliRunLoader* AliSimulation::LoadRun(const char* mode) const
772 // delete existing run loaders, open a new one and load gAlice
774 while (AliRunLoader::GetRunLoader()) delete AliRunLoader::GetRunLoader();
775 AliRunLoader* runLoader =
776 AliRunLoader::Open(fGAliceFileName.Data(),
777 AliConfig::GetDefaultEventFolderName(), mode);
779 Error("LoadRun", "no run loader found in file %s",
780 fGAliceFileName.Data());
783 runLoader->LoadgAlice();
784 gAlice = runLoader->GetAliRun();
786 Error("LoadRun", "no gAlice object found in file %s",
787 fGAliceFileName.Data());
793 //_____________________________________________________________________________
794 Int_t AliSimulation::GetNSignalPerBkgrd(Int_t nEvents) const
796 // get or calculate the number of signal events per background event
798 if (!fBkgrdFileNames) return 1;
799 Int_t nBkgrdFiles = fBkgrdFileNames->GetEntriesFast();
800 if (nBkgrdFiles == 0) return 1;
802 // get the number of signal events
804 AliRunLoader* runLoader =
805 AliRunLoader::Open(fGAliceFileName.Data(), "SIGNAL");
806 if (!runLoader) return 1;
807 nEvents = runLoader->GetNumberOfEvents();
812 for (Int_t iBkgrdFile = 0; iBkgrdFile < nBkgrdFiles; iBkgrdFile++) {
813 // get the number of background events
814 const char* fileName = ((TObjString*)
815 (fBkgrdFileNames->At(iBkgrdFile)))->GetName();
816 AliRunLoader* runLoader =
817 AliRunLoader::Open(fileName, "BKGRD");
818 if (!runLoader) continue;
819 Int_t nBkgrdEvents = runLoader->GetNumberOfEvents();
822 // get or calculate the number of signal per background events
823 Int_t nSignalPerBkgrd = fBkgrdFileNames->At(iBkgrdFile)->GetUniqueID();
824 if (nSignalPerBkgrd <= 0) {
825 nSignalPerBkgrd = (nEvents-1) / nBkgrdEvents + 1;
826 } else if (result && (result != nSignalPerBkgrd)) {
827 Info("GetNSignalPerBkgrd", "the number of signal events per "
828 "background event will be changed from %d to %d for stream %d",
829 nSignalPerBkgrd, result, iBkgrdFile+1);
830 nSignalPerBkgrd = result;
833 if (!result) result = nSignalPerBkgrd;
834 if (nSignalPerBkgrd * nBkgrdEvents < nEvents) {
835 Warning("GetNSignalPerBkgrd", "not enough background events (%d) for "
836 "%d signal events using %d signal per background events for "
838 nBkgrdEvents, nEvents, nSignalPerBkgrd, iBkgrdFile+1);
845 //_____________________________________________________________________________
846 Bool_t AliSimulation::IsSelected(TString detName, TString& detectors) const
848 // check whether detName is contained in detectors
849 // if yes, it is removed from detectors
851 // check if all detectors are selected
852 if ((detectors.CompareTo("ALL") == 0) ||
853 detectors.BeginsWith("ALL ") ||
854 detectors.EndsWith(" ALL") ||
855 detectors.Contains(" ALL ")) {
860 // search for the given detector
861 Bool_t result = kFALSE;
862 if ((detectors.CompareTo(detName) == 0) ||
863 detectors.BeginsWith(detName+" ") ||
864 detectors.EndsWith(" "+detName) ||
865 detectors.Contains(" "+detName+" ")) {
866 detectors.ReplaceAll(detName, "");
870 // clean up the detectors string
871 while (detectors.Contains(" ")) detectors.ReplaceAll(" ", " ");
872 while (detectors.BeginsWith(" ")) detectors.Remove(0, 1);
873 while (detectors.EndsWith(" ")) detectors.Remove(detectors.Length()-1, 1);