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>
113 #include "AliDigitizer.h"
114 #include "AliGenerator.h"
115 #include "AliModule.h"
117 #include "AliRunDigitizer.h"
118 #include "AliRunLoader.h"
119 #include "AliSimulation.h"
120 #include "AliVertexGenFile.h"
121 #include "AliCentralTrigger.h"
123 #include "AliDAQConfig.h"
124 #include "AliAlignObj.h"
125 #include "AliAlignObjAngles.h"
126 #include "AliAlignObjMatrix.h"
128 ClassImp(AliSimulation)
131 //_____________________________________________________________________________
132 AliSimulation::AliSimulation(const char* configFileName,
133 const char* name, const char* title) :
136 fRunGeneration(kTRUE),
137 fRunSimulation(kTRUE),
141 fMakeDigitsFromHits(""),
143 fRawDataFileName(""),
144 fDeleteIntermediateFiles(kFALSE),
145 fStopOnError(kFALSE),
148 fConfigFileName(configFileName),
149 fGAliceFileName("galice.root"),
151 fBkgrdFileNames(NULL),
152 fUseBkgrdVertex(kTRUE),
153 fRegionOfInterest(kFALSE)
155 // create simulation object with default parameters
157 SetGAliceFile("galice.root");
160 //_____________________________________________________________________________
161 AliSimulation::AliSimulation(const AliSimulation& sim) :
164 fRunGeneration(sim.fRunGeneration),
165 fRunSimulation(sim.fRunSimulation),
166 fMakeSDigits(sim.fMakeSDigits),
167 fMakeDigits(sim.fMakeDigits),
168 fMakeTrigger(sim.fMakeTrigger),
169 fMakeDigitsFromHits(sim.fMakeDigitsFromHits),
170 fWriteRawData(sim.fWriteRawData),
171 fRawDataFileName(""),
172 fDeleteIntermediateFiles(kFALSE),
173 fStopOnError(sim.fStopOnError),
175 fNEvents(sim.fNEvents),
176 fConfigFileName(sim.fConfigFileName),
177 fGAliceFileName(sim.fGAliceFileName),
179 fBkgrdFileNames(NULL),
180 fUseBkgrdVertex(sim.fUseBkgrdVertex),
181 fRegionOfInterest(sim.fRegionOfInterest)
185 for (Int_t i = 0; i < sim.fEventsPerFile.GetEntriesFast(); i++) {
186 if (!sim.fEventsPerFile[i]) continue;
187 fEventsPerFile.Add(sim.fEventsPerFile[i]->Clone());
190 fBkgrdFileNames = new TObjArray;
191 for (Int_t i = 0; i < sim.fBkgrdFileNames->GetEntriesFast(); i++) {
192 if (!sim.fBkgrdFileNames->At(i)) continue;
193 fBkgrdFileNames->Add(sim.fBkgrdFileNames->At(i)->Clone());
197 //_____________________________________________________________________________
198 AliSimulation& AliSimulation::operator = (const AliSimulation& sim)
200 // assignment operator
202 this->~AliSimulation();
203 new(this) AliSimulation(sim);
207 //_____________________________________________________________________________
208 AliSimulation::~AliSimulation()
212 fEventsPerFile.Delete();
214 if (fBkgrdFileNames) {
215 fBkgrdFileNames->Delete();
216 delete fBkgrdFileNames;
221 //_____________________________________________________________________________
222 void AliSimulation::SetNumberOfEvents(Int_t nEvents)
224 // set the number of events for one run
229 //_____________________________________________________________________________
230 void AliSimulation::SetConfigFile(const char* fileName)
232 // set the name of the config file
234 fConfigFileName = fileName;
237 //_____________________________________________________________________________
238 void AliSimulation::SetGAliceFile(const char* fileName)
240 // set the name of the galice file
241 // the path is converted to an absolute one if it is relative
243 fGAliceFileName = fileName;
244 if (!gSystem->IsAbsoluteFileName(fGAliceFileName)) {
245 char* absFileName = gSystem->ConcatFileName(gSystem->WorkingDirectory(),
247 fGAliceFileName = absFileName;
248 delete[] absFileName;
251 AliDebug(2, Form("galice file name set to %s", fileName));
254 //_____________________________________________________________________________
255 void AliSimulation::SetEventsPerFile(const char* detector, const char* type,
258 // set the number of events per file for the given detector and data type
259 // ("Hits", "Summable Digits", "Digits", "Reconstructed Points" or "Tracks")
261 TNamed* obj = new TNamed(detector, type);
262 obj->SetUniqueID(nEvents);
263 fEventsPerFile.Add(obj);
266 //_____________________________________________________________________________
267 Bool_t AliSimulation::ApplyDisplacements(const char* fileName, const char* ClArrayName)
269 // read collection of alignment objects (AliAlignObj derived) saved
270 // in the TClonesArray ClArrayName in the file fileName and apply
271 // them to the TGeo geometry passed as argument
274 TFile* inFile = TFile::Open(fileName,"READ");
275 if (!inFile || !inFile->IsOpen()) {
276 AliErrorClass(Form("Could not open file %s !",fileName));
280 TClonesArray* AlObjArray = ((TClonesArray*) inFile->Get(ClArrayName));
283 return AliSimulation::ApplyDisplacements(AlObjArray);
287 //_____________________________________________________________________________
288 Bool_t AliSimulation::ApplyDisplacements(TClonesArray* AlObjArray)
290 // Read collection of alignment objects (AliAlignObj derived) saved
291 // in the TClonesArray ClArrayName and apply them to the geometry
292 // manager singleton.
294 Int_t nvols = AlObjArray->GetEntriesFast();
296 AliAlignObj::ELayerID layerId; // unique identity for volume in the alobj
297 Int_t modId; // unique identity for volume in the alobj
298 Bool_t ispathvalid; // false if volume path for alobj is not valid for TGeo
302 for(Int_t j=0; j<nvols; j++)
304 AliAlignObj* alobj = (AliAlignObj*) AlObjArray->UncheckedAt(j);
305 const char* volpath = alobj->GetVolPath();
306 TGeoPhysicalNode* node = (TGeoPhysicalNode*) gGeoManager->MakePhysicalNode(volpath);
307 alobj->GetMatrix(dm);
308 alobj->GetVolUID(layerId, modId);
309 ispathvalid = gGeoManager->cd(volpath);
311 AliWarningClass(Form("Volume path %s not valid!",volpath));
314 TGeoHMatrix* hm = gGeoManager->GetCurrentMatrix();
315 hm->MultiplyLeft(&dm);
316 AliInfoClass(Form("Aligning volume %s of detector layer %d with local ID %d",volpath,layerId,modId));
324 //_____________________________________________________________________________
325 Bool_t AliSimulation::ApplyDisplacements(AliCDBParam* param, AliCDBId& Id)
327 // read collection of alignment objects (AliAlignObj derived) saved
328 // in the TClonesArray ClArrayName in the AliCDBEntry identified by
329 // param (to get the AliCDBStorage) and Id; apply the alignment objects
330 // to the TGeo geometry passed as argument
333 AliCDBStorage* storage = AliCDBManager::Instance()->GetStorage(param);
334 AliCDBEntry* entry = storage->Get(Id);
335 TClonesArray* AlObjArray = ((TClonesArray*) entry->GetObject());
337 return AliSimulation::ApplyDisplacements(AlObjArray);
341 //_____________________________________________________________________________
342 Bool_t AliSimulation::ApplyDisplacements(const char* uri, const char* path, Int_t runnum, Int_t version, Int_t sversion)
344 // read collection of alignment objects (AliAlignObj derived) saved
345 // in the TClonesArray ClArrayName in the AliCDBEntry identified by
346 // param (to get the AliCDBStorage) and Id; apply the alignment objects
347 // to the TGeo geometry passed as argument
350 AliCDBParam* param = AliCDBManager::Instance()->CreateParameter(uri);
351 AliCDBId id(path, runnum, runnum, version, sversion);
353 return ApplyDisplacements(param, id);
357 //_____________________________________________________________________________
358 void AliSimulation::MergeWith(const char* fileName, Int_t nSignalPerBkgrd)
360 // add a file with background events for merging
362 TObjString* fileNameStr = new TObjString(fileName);
363 fileNameStr->SetUniqueID(nSignalPerBkgrd);
364 if (!fBkgrdFileNames) fBkgrdFileNames = new TObjArray;
365 fBkgrdFileNames->Add(fileNameStr);
369 //_____________________________________________________________________________
370 Bool_t AliSimulation::Run(Int_t nEvents)
372 // run the generation, simulation and digitization
374 if (nEvents > 0) fNEvents = nEvents;
376 // generation and simulation -> hits
377 if (fRunGeneration) {
378 if (!RunSimulation()) if (fStopOnError) return kFALSE;
381 // hits -> summable digits
382 if (!fMakeSDigits.IsNull()) {
383 if (!RunSDigitization(fMakeSDigits)) if (fStopOnError) return kFALSE;
386 // summable digits -> digits
387 if (!fMakeDigits.IsNull()) {
388 if (!RunDigitization(fMakeDigits, fMakeDigitsFromHits)) {
389 if (fStopOnError) return kFALSE;
394 if (!fMakeDigitsFromHits.IsNull()) {
395 if (fBkgrdFileNames && (fBkgrdFileNames->GetEntriesFast() > 0)) {
396 AliWarning(Form("Merging and direct creation of digits from hits "
397 "was selected for some detectors. "
398 "No merging will be done for the following detectors: %s",
399 fMakeDigitsFromHits.Data()));
401 if (!RunHitsDigitization(fMakeDigitsFromHits)) {
402 if (fStopOnError) return kFALSE;
407 if (!fMakeTrigger.IsNull()) {
408 if (!RunTrigger(fMakeTrigger)) {
409 if (fStopOnError) return kFALSE;
413 // digits -> raw data
414 if (!fWriteRawData.IsNull()) {
415 if (!WriteRawData(fWriteRawData, fRawDataFileName,
416 fDeleteIntermediateFiles)) {
417 if (fStopOnError) return kFALSE;
424 //_____________________________________________________________________________
425 Bool_t AliSimulation::RunTrigger(const char* descriptors)
429 TStopwatch stopwatch;
432 AliRunLoader* runLoader = LoadRun("READ");
433 if (!runLoader) return kFALSE;
434 TString des = descriptors;
436 AliCentralTrigger* aCTP = new AliCentralTrigger( des );
439 if( !aCTP->RunTrigger( runLoader ) ) {
447 // Process each event
448 for (Int_t iEvent = 0; iEvent < runLoader->GetNumberOfEvents(); iEvent++) {
449 AliInfo(Form("processing event %d", iEvent));
450 runLoader->GetEvent(iEvent);
452 TObjArray* detArray = runLoader->GetAliRun()->Detectors();
453 for (Int_t iDet = 0; iDet < detArray->GetEntriesFast(); iDet++) {
454 AliModule* det = (AliModule*) detArray->At(iDet);
455 if (!det || !det->IsActive()) continue;
456 if (IsSelected(det->GetName(), detStr)) {
457 AliInfo(Form("triggering from digits for %s", det->GetName()));
459 // AliLoader* loader = fLoader[iDet];
460 // loader->LoadDigits("read");
461 // TTree* digitsTree = loader->TreeD();
462 // det->Trigger( digitsTree );
464 AliTriggerDetector* tdet = det->CreateTriggerDetector();
465 TObjArray* detInp = dtrg->GetTriggerInputs();
466 for( Int_t i=0; i<detInp->GetEntriesFast(); i++ )
467 fInputs.AddLast( detInp->At(i) );
469 AliInfo(Form("Execution time for %s: R:%.2fs C:%.2fs",
470 det->GetName(),stopwatchDet.RealTime(),stopwatchDet.CpuTime()));
474 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
475 AliError(Form("the following detectors were not found: %s",
483 // Check trigger conditions
484 centralTP->TriggerConditions();
486 // Write trigger ????
491 AliInfo(Form("Execution time: R:%.2fs C:%.2fs",
492 stopwatch.RealTime(),stopwatch.CpuTime()));
502 //_____________________________________________________________________________
503 Bool_t AliSimulation::RunSimulation(Int_t nEvents)
505 // run the generation and simulation
507 TStopwatch stopwatch;
511 AliError("no gAlice object. Restart aliroot and try again.");
514 if (gAlice->Modules()->GetEntries() > 0) {
515 AliError("gAlice was already run. Restart aliroot and try again.");
519 AliInfo(Form("initializing gAlice with config file %s",
520 fConfigFileName.Data()));
521 StdoutToAliInfo(StderrToAliError(
522 gAlice->Init(fConfigFileName.Data());
524 AliRunLoader* runLoader = gAlice->GetRunLoader();
526 AliError(Form("gAlice has no run loader object. "
527 "Check your config file: %s", fConfigFileName.Data()));
530 SetGAliceFile(runLoader->GetFileName());
532 if (!gAlice->Generator()) {
533 AliError(Form("gAlice has no generator object. "
534 "Check your config file: %s", fConfigFileName.Data()));
537 if (nEvents <= 0) nEvents = fNEvents;
539 // get vertex from background file in case of merging
540 if (fUseBkgrdVertex &&
541 fBkgrdFileNames && (fBkgrdFileNames->GetEntriesFast() > 0)) {
542 Int_t signalPerBkgrd = GetNSignalPerBkgrd(nEvents);
543 const char* fileName = ((TObjString*)
544 (fBkgrdFileNames->At(0)))->GetName();
545 AliInfo(Form("The vertex will be taken from the background "
546 "file %s with nSignalPerBackground = %d",
547 fileName, signalPerBkgrd));
548 AliVertexGenFile* vtxGen = new AliVertexGenFile(fileName, signalPerBkgrd);
549 gAlice->Generator()->SetVertexGenerator(vtxGen);
552 if (!fRunSimulation) {
553 gAlice->Generator()->SetTrackingFlag(0);
556 // set the number of events per file for given detectors and data types
557 for (Int_t i = 0; i < fEventsPerFile.GetEntriesFast(); i++) {
558 if (!fEventsPerFile[i]) continue;
559 const char* detName = fEventsPerFile[i]->GetName();
560 const char* typeName = fEventsPerFile[i]->GetTitle();
561 TString loaderName(detName);
562 loaderName += "Loader";
563 AliLoader* loader = runLoader->GetLoader(loaderName);
565 AliError(Form("RunSimulation", "no loader for %s found\n"
566 "Number of events per file not set for %s %s",
567 detName, typeName, detName));
570 AliDataLoader* dataLoader =
571 loader->GetDataLoader(typeName);
573 AliError(Form("no data loader for %s found\n"
574 "Number of events per file not set for %s %s",
575 typeName, detName, typeName));
578 dataLoader->SetNumberOfEventsPerFile(fEventsPerFile[i]->GetUniqueID());
579 AliDebug(1, Form("number of events per file set to %d for %s %s",
580 fEventsPerFile[i]->GetUniqueID(), detName, typeName));
583 AliInfo("running gAlice");
584 StdoutToAliInfo(StderrToAliError(
585 gAlice->Run(nEvents);
590 AliInfo(Form("Execution time: R:%.2fs C:%.2fs",
591 stopwatch.RealTime(),stopwatch.CpuTime()));
596 //_____________________________________________________________________________
597 Bool_t AliSimulation::RunSDigitization(const char* detectors)
599 // run the digitization and produce summable digits
601 TStopwatch stopwatch;
604 AliRunLoader* runLoader = LoadRun();
605 if (!runLoader) return kFALSE;
607 TString detStr = detectors;
608 TObjArray* detArray = runLoader->GetAliRun()->Detectors();
609 for (Int_t iDet = 0; iDet < detArray->GetEntriesFast(); iDet++) {
610 AliModule* det = (AliModule*) detArray->At(iDet);
611 if (!det || !det->IsActive()) continue;
612 if (IsSelected(det->GetName(), detStr)) {
613 AliInfo(Form("creating summable digits for %s", det->GetName()));
614 TStopwatch stopwatchDet;
615 stopwatchDet.Start();
617 AliInfo(Form("Execution time for %s: R:%.2fs C:%.2fs",
618 det->GetName(),stopwatchDet.RealTime(),stopwatchDet.CpuTime()));
622 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
623 AliError(Form("the following detectors were not found: %s",
625 if (fStopOnError) return kFALSE;
630 AliInfo(Form("Execution time: R:%.2fs C:%.2fs",
631 stopwatch.RealTime(),stopwatch.CpuTime()));
637 //_____________________________________________________________________________
638 Bool_t AliSimulation::RunDigitization(const char* detectors,
639 const char* excludeDetectors)
641 // run the digitization and produce digits from sdigits
643 TStopwatch stopwatch;
646 while (AliRunLoader::GetRunLoader()) delete AliRunLoader::GetRunLoader();
647 if (gAlice) delete gAlice;
651 if (fBkgrdFileNames) nStreams = fBkgrdFileNames->GetEntriesFast() + 1;
652 Int_t signalPerBkgrd = GetNSignalPerBkgrd();
653 AliRunDigitizer* manager = new AliRunDigitizer(nStreams, signalPerBkgrd);
654 manager->SetInputStream(0, fGAliceFileName.Data());
655 for (Int_t iStream = 1; iStream < nStreams; iStream++) {
656 const char* fileName = ((TObjString*)
657 (fBkgrdFileNames->At(iStream-1)))->GetName();
658 manager->SetInputStream(iStream, fileName);
661 TString detStr = detectors;
662 TString detExcl = excludeDetectors;
663 manager->GetInputStream(0)->ImportgAlice();
664 AliRunLoader* runLoader =
665 AliRunLoader::GetRunLoader(manager->GetInputStream(0)->GetFolderName());
666 TObjArray* detArray = runLoader->GetAliRun()->Detectors();
667 for (Int_t iDet = 0; iDet < detArray->GetEntriesFast(); iDet++) {
668 AliModule* det = (AliModule*) detArray->At(iDet);
669 if (!det || !det->IsActive()) continue;
670 if (IsSelected(det->GetName(), detStr) &&
671 !IsSelected(det->GetName(), detExcl)) {
672 AliDigitizer* digitizer = det->CreateDigitizer(manager);
674 AliError(Form("no digitizer for %s", det->GetName()));
675 if (fStopOnError) return kFALSE;
677 digitizer->SetRegionOfInterest(fRegionOfInterest);
682 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
683 AliError(Form("the following detectors were not found: %s",
685 if (fStopOnError) return kFALSE;
688 if (!manager->GetListOfTasks()->IsEmpty()) {
689 AliInfo("executing digitization");
695 AliInfo(Form("Execution time: R:%.2fs C:%.2fs",
696 stopwatch.RealTime(),stopwatch.CpuTime()));
701 //_____________________________________________________________________________
702 Bool_t AliSimulation::RunHitsDigitization(const char* detectors)
704 // run the digitization and produce digits from hits
706 TStopwatch stopwatch;
709 AliRunLoader* runLoader = LoadRun("READ");
710 if (!runLoader) return kFALSE;
712 TString detStr = detectors;
713 TObjArray* detArray = runLoader->GetAliRun()->Detectors();
714 for (Int_t iDet = 0; iDet < detArray->GetEntriesFast(); iDet++) {
715 AliModule* det = (AliModule*) detArray->At(iDet);
716 if (!det || !det->IsActive()) continue;
717 if (IsSelected(det->GetName(), detStr)) {
718 AliInfo(Form("creating digits from hits for %s", det->GetName()));
723 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
724 AliError(Form("the following detectors were not found: %s",
726 if (fStopOnError) return kFALSE;
730 //PH Temporary fix to avoid interference with the PHOS loder/getter
731 //PH The problem has to be solved in more general way 09/06/05
733 AliInfo(Form("Execution time: R:%.2fs C:%.2fs",
734 stopwatch.RealTime(),stopwatch.CpuTime()));
739 //_____________________________________________________________________________
740 Bool_t AliSimulation::WriteRawData(const char* detectors,
741 const char* fileName,
742 Bool_t deleteIntermediateFiles)
744 // convert the digits to raw data
745 // First DDL raw data files for the given detectors are created.
746 // If a file name is given, the DDL files are then converted to a DATE file.
747 // If deleteIntermediateFiles is true, the DDL raw files are deleted
749 // If the file name has the extension ".root", the DATE file is converted
751 // If deleteIntermediateFiles is true, the DATE file is deleted afterwards.
753 TStopwatch stopwatch;
756 if (!WriteRawFiles(detectors)) {
757 if (fStopOnError) return kFALSE;
760 TString dateFileName(fileName);
761 if (!dateFileName.IsNull()) {
762 Bool_t rootOutput = dateFileName.EndsWith(".root");
763 if (rootOutput) dateFileName += ".date";
764 if (!ConvertRawFilesToDate(dateFileName)) {
765 if (fStopOnError) return kFALSE;
767 if (deleteIntermediateFiles) {
768 AliRunLoader* runLoader = LoadRun("READ");
769 if (runLoader) for (Int_t iEvent = 0;
770 iEvent < runLoader->GetNumberOfEvents(); iEvent++) {
772 sprintf(command, "rm -r raw%d", iEvent);
773 gSystem->Exec(command);
778 if (!ConvertDateToRoot(dateFileName, fileName)) {
779 if (fStopOnError) return kFALSE;
781 if (deleteIntermediateFiles) {
782 gSystem->Unlink(dateFileName);
787 AliInfo(Form("Execution time: R:%.2fs C:%.2fs",
788 stopwatch.RealTime(),stopwatch.CpuTime()));
793 //_____________________________________________________________________________
794 Bool_t AliSimulation::WriteRawFiles(const char* detectors)
796 // convert the digits to raw data DDL files
798 AliRunLoader* runLoader = LoadRun("READ");
799 if (!runLoader) return kFALSE;
801 // write raw data to DDL files
802 for (Int_t iEvent = 0; iEvent < runLoader->GetNumberOfEvents(); iEvent++) {
803 AliInfo(Form("processing event %d", iEvent));
804 runLoader->GetEvent(iEvent);
805 TString baseDir = gSystem->WorkingDirectory();
807 sprintf(dirName, "raw%d", iEvent);
808 gSystem->MakeDirectory(dirName);
809 if (!gSystem->ChangeDirectory(dirName)) {
810 AliError(Form("couldn't change to directory %s", dirName));
811 if (fStopOnError) return kFALSE; else continue;
814 TString detStr = detectors;
815 TObjArray* detArray = runLoader->GetAliRun()->Detectors();
816 for (Int_t iDet = 0; iDet < detArray->GetEntriesFast(); iDet++) {
817 AliModule* det = (AliModule*) detArray->At(iDet);
818 if (!det || !det->IsActive()) continue;
819 if (IsSelected(det->GetName(), detStr)) {
820 AliInfo(Form("creating raw data from digits for %s", det->GetName()));
825 gSystem->ChangeDirectory(baseDir);
826 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
827 AliError(Form("the following detectors were not found: %s",
829 if (fStopOnError) return kFALSE;
837 //_____________________________________________________________________________
838 Bool_t AliSimulation::ConvertRawFilesToDate(const char* dateFileName)
840 // convert raw data DDL files to a DATE file with the program "dateStream"
842 char* path = gSystem->Which(gSystem->Getenv("PATH"), "dateStream");
844 AliError("the program dateStream was not found");
845 if (fStopOnError) return kFALSE;
850 AliRunLoader* runLoader = LoadRun("READ");
851 if (!runLoader) return kFALSE;
853 AliInfo(Form("converting raw data DDL files to DATE file %s", dateFileName));
855 sprintf(command, "dateStream -o %s -# %d -C",
856 dateFileName, runLoader->GetNumberOfEvents());
857 FILE* pipe = gSystem->OpenPipe(command, "w");
859 for (Int_t iEvent = 0; iEvent < runLoader->GetNumberOfEvents(); iEvent++) {
860 fprintf(pipe, "GDC\n");
864 // loop over detectors and DDLs
865 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
866 for (Int_t iDDL = 0; iDDL < kDetectorDDLs[iDet]; iDDL++) {
868 Int_t ddlID = 0x100*iDet + iDDL;
869 Int_t ldcID = Int_t(ldc + 0.0001);
870 ldc += kDetectorLDCs[iDet] / kDetectorDDLs[iDet];
872 char rawFileName[256];
873 sprintf(rawFileName, "raw%d/%s_%d.ddl",
874 iEvent, kDetectors[iDet], ddlID);
876 // check existence and size of raw data file
877 FILE* file = fopen(rawFileName, "rb");
879 fseek(file, 0, SEEK_END);
880 unsigned long size = ftell(file);
884 if (ldcID != prevLDC) {
885 fprintf(pipe, " LDC Id %d\n", ldcID);
888 fprintf(pipe, " Equipment Id %d Payload %s\n", ddlID, rawFileName);
893 Int_t result = gSystem->ClosePipe(pipe);
896 return (result == 0);
899 //_____________________________________________________________________________
900 Bool_t AliSimulation::ConvertDateToRoot(const char* dateFileName,
901 const char* rootFileName)
903 // convert a DATE file to a root file with the program "alimdc"
906 const Int_t kDBSize = 1000000000;
907 const Int_t kTagDBSize = 1000000000;
908 const Bool_t kFilter = kFALSE;
909 const Int_t kCompression = 1;
911 char* path = gSystem->Which(gSystem->Getenv("PATH"), "alimdc");
913 AliError("the program alimdc was not found");
914 if (fStopOnError) return kFALSE;
919 AliInfo(Form("converting DATE file %s to root file %s",
920 dateFileName, rootFileName));
922 gSystem->Exec("rm -rf /tmp/mdc1");
923 gSystem->Exec("rm -rf /tmp/mdc2");
925 gSystem->Exec("mkdir /tmp/mdc1");
926 gSystem->Exec("mkdir /tmp/mdc2");
929 sprintf(command, "alimdc %d %d %d %d %s",
930 kDBSize, kTagDBSize, kFilter, kCompression, dateFileName);
931 Int_t result = gSystem->Exec(command);
932 sprintf(command, "mv /tmp/mdc1/*.root %s", rootFileName);
933 gSystem->Exec(command);
934 gSystem->Exec("rm -rf /tmp/mdc1");
935 gSystem->Exec("rm -rf /tmp/mdc2");
937 return (result == 0);
941 //_____________________________________________________________________________
942 AliRunLoader* AliSimulation::LoadRun(const char* mode) const
944 // delete existing run loaders, open a new one and load gAlice
946 while (AliRunLoader::GetRunLoader()) delete AliRunLoader::GetRunLoader();
947 AliRunLoader* runLoader =
948 AliRunLoader::Open(fGAliceFileName.Data(),
949 AliConfig::GetDefaultEventFolderName(), mode);
951 AliError(Form("no run loader found in file %s", fGAliceFileName.Data()));
954 runLoader->LoadgAlice();
955 gAlice = runLoader->GetAliRun();
957 AliError(Form("no gAlice object found in file %s",
958 fGAliceFileName.Data()));
964 //_____________________________________________________________________________
965 Int_t AliSimulation::GetNSignalPerBkgrd(Int_t nEvents) const
967 // get or calculate the number of signal events per background event
969 if (!fBkgrdFileNames) return 1;
970 Int_t nBkgrdFiles = fBkgrdFileNames->GetEntriesFast();
971 if (nBkgrdFiles == 0) return 1;
973 // get the number of signal events
975 AliRunLoader* runLoader =
976 AliRunLoader::Open(fGAliceFileName.Data(), "SIGNAL");
977 if (!runLoader) return 1;
978 nEvents = runLoader->GetNumberOfEvents();
983 for (Int_t iBkgrdFile = 0; iBkgrdFile < nBkgrdFiles; iBkgrdFile++) {
984 // get the number of background events
985 const char* fileName = ((TObjString*)
986 (fBkgrdFileNames->At(iBkgrdFile)))->GetName();
987 AliRunLoader* runLoader =
988 AliRunLoader::Open(fileName, "BKGRD");
989 if (!runLoader) continue;
990 Int_t nBkgrdEvents = runLoader->GetNumberOfEvents();
993 // get or calculate the number of signal per background events
994 Int_t nSignalPerBkgrd = fBkgrdFileNames->At(iBkgrdFile)->GetUniqueID();
995 if (nSignalPerBkgrd <= 0) {
996 nSignalPerBkgrd = (nEvents-1) / nBkgrdEvents + 1;
997 } else if (result && (result != nSignalPerBkgrd)) {
998 AliInfo(Form("the number of signal events per background event "
999 "will be changed from %d to %d for stream %d",
1000 nSignalPerBkgrd, result, iBkgrdFile+1));
1001 nSignalPerBkgrd = result;
1004 if (!result) result = nSignalPerBkgrd;
1005 if (nSignalPerBkgrd * nBkgrdEvents < nEvents) {
1006 AliWarning(Form("not enough background events (%d) for %d signal events "
1007 "using %d signal per background events for stream %d",
1008 nBkgrdEvents, nEvents, nSignalPerBkgrd, iBkgrdFile+1));
1015 //_____________________________________________________________________________
1016 Bool_t AliSimulation::IsSelected(TString detName, TString& detectors) const
1018 // check whether detName is contained in detectors
1019 // if yes, it is removed from detectors
1021 // check if all detectors are selected
1022 if ((detectors.CompareTo("ALL") == 0) ||
1023 detectors.BeginsWith("ALL ") ||
1024 detectors.EndsWith(" ALL") ||
1025 detectors.Contains(" ALL ")) {
1030 // search for the given detector
1031 Bool_t result = kFALSE;
1032 if ((detectors.CompareTo(detName) == 0) ||
1033 detectors.BeginsWith(detName+" ") ||
1034 detectors.EndsWith(" "+detName) ||
1035 detectors.Contains(" "+detName+" ")) {
1036 detectors.ReplaceAll(detName, "");
1040 // clean up the detectors string
1041 while (detectors.Contains(" ")) detectors.ReplaceAll(" ", " ");
1042 while (detectors.BeginsWith(" ")) detectors.Remove(0, 1);
1043 while (detectors.EndsWith(" ")) detectors.Remove(detectors.Length()-1, 1);