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 <TVirtualMCApplication.h>
109 #include <TGeoManager.h>
110 #include <TObjString.h>
115 #include "AliCodeTimer.h"
116 #include "AliCDBStorage.h"
117 #include "AliCDBEntry.h"
118 #include "AliCDBManager.h"
119 #include "AliGeomManager.h"
120 #include "AliAlignObj.h"
121 #include "AliCentralTrigger.h"
123 #include "AliDigitizer.h"
124 #include "AliGenerator.h"
126 #include "AliModule.h"
128 #include "AliRunDigitizer.h"
129 #include "AliRunLoader.h"
130 #include "AliSimulation.h"
131 #include "AliVertexGenFile.h"
132 #include "AliCentralTrigger.h"
133 #include "AliCTPRawData.h"
134 #include "AliRawReaderFile.h"
135 #include "AliRawReaderRoot.h"
136 #include "AliRawReaderDate.h"
138 #include "AliHeader.h"
139 #include "AliGenEventHeader.h"
141 #include "AliHLTSimulation.h"
142 #include "AliSysInfo.h"
144 #include "AliGRPObject.h"
146 ClassImp(AliSimulation)
148 AliSimulation *AliSimulation::fgInstance = 0;
149 const char* AliSimulation::fgkDetectorName[AliSimulation::fgkNDetectors] = {"ITS", "TPC", "TRD", "TOF", "PHOS", "HMPID", "EMCAL", "MUON", "FMD", "ZDC", "PMD", "T0", "VZERO", "ACORDE", "HLT"};
151 //_____________________________________________________________________________
152 AliSimulation::AliSimulation(const char* configFileName,
153 const char* name, const char* title) :
156 fRunGeneration(kTRUE),
157 fRunSimulation(kTRUE),
158 fLoadAlignFromCDB(kTRUE),
159 fLoadAlObjsListOfDets("ALL"),
163 fMakeDigitsFromHits(""),
165 fRawDataFileName(""),
166 fDeleteIntermediateFiles(kFALSE),
167 fWriteSelRawData(kFALSE),
168 fStopOnError(kFALSE),
171 fConfigFileName(configFileName),
172 fGAliceFileName("galice.root"),
174 fBkgrdFileNames(NULL),
175 fAlignObjArray(NULL),
176 fUseBkgrdVertex(kTRUE),
177 fRegionOfInterest(kFALSE),
182 fInitCDBCalled(kFALSE),
183 fInitRunNumberCalled(kFALSE),
184 fSetRunNumberFromDataCalled(kFALSE),
185 fEmbeddingFlag(kFALSE),
191 fWriteGRPEntry(kTRUE)
193 // create simulation object with default parameters
195 SetGAliceFile("galice.root");
198 fQASteer = new AliQADataMakerSteer("sim") ;
199 fQASteer->SetActiveDetectors(fQADetectors) ;
200 fQATasks = Form("%d %d %d", AliQA::kHITS, AliQA::kSDIGITS, AliQA::kDIGITS) ;
201 fQASteer->SetTasks(fQATasks) ;
204 //_____________________________________________________________________________
205 AliSimulation::AliSimulation(const AliSimulation& sim) :
208 fRunGeneration(sim.fRunGeneration),
209 fRunSimulation(sim.fRunSimulation),
210 fLoadAlignFromCDB(sim.fLoadAlignFromCDB),
211 fLoadAlObjsListOfDets(sim.fLoadAlObjsListOfDets),
212 fMakeSDigits(sim.fMakeSDigits),
213 fMakeDigits(sim.fMakeDigits),
214 fMakeTrigger(sim.fMakeTrigger),
215 fMakeDigitsFromHits(sim.fMakeDigitsFromHits),
216 fWriteRawData(sim.fWriteRawData),
217 fRawDataFileName(""),
218 fDeleteIntermediateFiles(kFALSE),
219 fWriteSelRawData(kFALSE),
220 fStopOnError(sim.fStopOnError),
222 fNEvents(sim.fNEvents),
223 fConfigFileName(sim.fConfigFileName),
224 fGAliceFileName(sim.fGAliceFileName),
226 fBkgrdFileNames(NULL),
227 fAlignObjArray(NULL),
228 fUseBkgrdVertex(sim.fUseBkgrdVertex),
229 fRegionOfInterest(sim.fRegionOfInterest),
230 fCDBUri(sim.fCDBUri),
234 fInitCDBCalled(sim.fInitCDBCalled),
235 fInitRunNumberCalled(sim.fInitRunNumberCalled),
236 fSetRunNumberFromDataCalled(sim.fSetRunNumberFromDataCalled),
237 fEmbeddingFlag(sim.fEmbeddingFlag),
238 fQADetectors(sim.fQADetectors),
239 fQATasks(sim.fQATasks),
240 fQASteer(sim.fQASteer),
242 fRunHLT(sim.fRunHLT),
243 fWriteGRPEntry(sim.fWriteGRPEntry)
247 for (Int_t i = 0; i < sim.fEventsPerFile.GetEntriesFast(); i++) {
248 if (!sim.fEventsPerFile[i]) continue;
249 fEventsPerFile.Add(sim.fEventsPerFile[i]->Clone());
252 fBkgrdFileNames = new TObjArray;
253 for (Int_t i = 0; i < sim.fBkgrdFileNames->GetEntriesFast(); i++) {
254 if (!sim.fBkgrdFileNames->At(i)) continue;
255 fBkgrdFileNames->Add(sim.fBkgrdFileNames->At(i)->Clone());
258 for (Int_t i = 0; i < sim.fSpecCDBUri.GetEntriesFast(); i++) {
259 if (sim.fSpecCDBUri[i]) fSpecCDBUri.Add(sim.fSpecCDBUri[i]->Clone());
264 //_____________________________________________________________________________
265 AliSimulation& AliSimulation::operator = (const AliSimulation& sim)
267 // assignment operator
269 this->~AliSimulation();
270 new(this) AliSimulation(sim);
274 //_____________________________________________________________________________
275 AliSimulation::~AliSimulation()
279 fEventsPerFile.Delete();
280 // if(fAlignObjArray) fAlignObjArray->Delete(); // fAlignObjArray->RemoveAll() ???
281 // delete fAlignObjArray; fAlignObjArray=0;
283 if (fBkgrdFileNames) {
284 fBkgrdFileNames->Delete();
285 delete fBkgrdFileNames;
288 fSpecCDBUri.Delete();
289 if (fgInstance==this) fgInstance = 0;
293 AliCodeTimer::Instance()->Print();
297 //_____________________________________________________________________________
298 void AliSimulation::SetNumberOfEvents(Int_t nEvents)
300 // set the number of events for one run
305 //_____________________________________________________________________________
306 void AliSimulation::InitCDB()
308 // activate a default CDB storage
309 // First check if we have any CDB storage set, because it is used
310 // to retrieve the calibration and alignment constants
312 if (fInitCDBCalled) return;
313 fInitCDBCalled = kTRUE;
315 AliCDBManager* man = AliCDBManager::Instance();
316 if (man->IsDefaultStorageSet())
318 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
319 AliWarning("Default CDB storage has been already set !");
320 AliWarning(Form("Ignoring the default storage declared in AliSimulation: %s",fCDBUri.Data()));
321 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
322 fCDBUri = man->GetDefaultStorage()->GetURI();
325 if (fCDBUri.Length() > 0)
327 AliDebug(2,"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
328 AliDebug(2, Form("Default CDB storage is set to: %s", fCDBUri.Data()));
329 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
331 fCDBUri="local://$ALICE_ROOT";
332 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
333 AliWarning("Default CDB storage not yet set !!!!");
334 AliWarning(Form("Setting it now to: %s", fCDBUri.Data()));
335 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
338 man->SetDefaultStorage(fCDBUri);
341 // Now activate the detector specific CDB storage locations
342 for (Int_t i = 0; i < fSpecCDBUri.GetEntriesFast(); i++) {
343 TObject* obj = fSpecCDBUri[i];
345 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
346 AliDebug(2, Form("Specific CDB storage for %s is set to: %s",obj->GetName(),obj->GetTitle()));
347 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
348 man->SetSpecificStorage(obj->GetName(), obj->GetTitle());
353 //_____________________________________________________________________________
354 void AliSimulation::InitRunNumber(){
355 // check run number. If not set, set it to 0 !!!!
357 if (fInitRunNumberCalled) return;
358 fInitRunNumberCalled = kTRUE;
360 AliCDBManager* man = AliCDBManager::Instance();
361 if (man->GetRun() >= 0)
363 AliFatal(Form("Run number cannot be set in AliCDBManager before start of simulation: "
364 "Use external variable DC_RUN or AliSimulation::SetRun()!"));
368 AliDebug(2,"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
369 AliDebug(2, Form("Setting CDB run number to: %d",fRun));
370 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
373 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
374 AliWarning("Run number not yet set !!!!");
375 AliWarning(Form("Setting it now to: %d", fRun));
376 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
385 //_____________________________________________________________________________
386 void AliSimulation::SetCDBLock() {
387 // Set CDB lock: from now on it is forbidden to reset the run number
388 // or the default storage or to activate any further storage!
390 AliCDBManager::Instance()->SetLock(1);
393 //_____________________________________________________________________________
394 void AliSimulation::SetDefaultStorage(const char* uri) {
395 // Store the desired default CDB storage location
396 // Activate it later within the Run() method
402 //_____________________________________________________________________________
403 void AliSimulation::SetSpecificStorage(const char* calibType, const char* uri) {
404 // Store a detector-specific CDB storage location
405 // Activate it later within the Run() method
407 AliCDBPath aPath(calibType);
408 if(!aPath.IsValid()){
409 AliError(Form("Not a valid path: %s", calibType));
413 TObject* obj = fSpecCDBUri.FindObject(calibType);
414 if (obj) fSpecCDBUri.Remove(obj);
415 fSpecCDBUri.Add(new TNamed(calibType, uri));
419 //_____________________________________________________________________________
420 void AliSimulation::SetRunNumber(Int_t run)
423 // Activate it later within the Run() method
428 //_____________________________________________________________________________
429 void AliSimulation::SetSeed(Int_t seed)
432 // Activate it later within the Run() method
437 //_____________________________________________________________________________
438 Bool_t AliSimulation::SetRunNumberFromData()
440 // Set the CDB manager run number
441 // The run number is retrieved from gAlice
443 if (fSetRunNumberFromDataCalled) return kTRUE;
444 fSetRunNumberFromDataCalled = kTRUE;
446 AliCDBManager* man = AliCDBManager::Instance();
447 Int_t runData = -1, runCDB = -1;
449 AliRunLoader* runLoader = LoadRun("READ");
450 if (!runLoader) return kFALSE;
452 runData = runLoader->GetAliRun()->GetHeader()->GetRun();
456 runCDB = man->GetRun();
458 if (runCDB != runData) {
459 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
460 AliWarning(Form("A run number was previously set in AliCDBManager: %d !", runCDB));
461 AliWarning(Form("It will be replaced with the run number got from run header: %d !", runData));
462 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
467 man->SetRun(runData);
470 if(man->GetRun() < 0) {
471 AliError("Run number not properly initalized!");
480 //_____________________________________________________________________________
481 void AliSimulation::SetConfigFile(const char* fileName)
483 // set the name of the config file
485 fConfigFileName = fileName;
488 //_____________________________________________________________________________
489 void AliSimulation::SetGAliceFile(const char* fileName)
491 // set the name of the galice file
492 // the path is converted to an absolute one if it is relative
494 fGAliceFileName = fileName;
495 if (!gSystem->IsAbsoluteFileName(fGAliceFileName)) {
496 char* absFileName = gSystem->ConcatFileName(gSystem->WorkingDirectory(),
498 fGAliceFileName = absFileName;
499 delete[] absFileName;
502 AliDebug(2, Form("galice file name set to %s", fileName));
505 //_____________________________________________________________________________
506 void AliSimulation::SetEventsPerFile(const char* detector, const char* type,
509 // set the number of events per file for the given detector and data type
510 // ("Hits", "Summable Digits", "Digits", "Reconstructed Points" or "Tracks")
512 TNamed* obj = new TNamed(detector, type);
513 obj->SetUniqueID(nEvents);
514 fEventsPerFile.Add(obj);
517 //_____________________________________________________________________________
518 Bool_t AliSimulation::MisalignGeometry(AliRunLoader *runLoader)
520 // Read the alignment objects from CDB.
521 // Each detector is supposed to have the
522 // alignment objects in DET/Align/Data CDB path.
523 // All the detector objects are then collected,
524 // sorted by geometry level (starting from ALIC) and
525 // then applied to the TGeo geometry.
526 // Finally an overlaps check is performed.
528 if (!AliGeomManager::GetGeometry() || !AliGeomManager::GetGeometry()->IsClosed()) {
529 AliError("Can't apply the misalignment! Geometry is not loaded or it is still opened!");
533 // initialize CDB storage, run number, set CDB lock
535 // if (!SetRunNumberFromData()) if (fStopOnError) return kFALSE;
538 Bool_t delRunLoader = kFALSE;
540 runLoader = LoadRun("READ");
541 if (!runLoader) return kFALSE;
542 delRunLoader = kTRUE;
545 // Export ideal geometry
546 if(!gAlice->IsRootGeometry()) AliGeomManager::GetGeometry()->Export("geometry.root");
548 // Load alignment data from CDB and apply to geometry through AliGeomManager
549 if(fLoadAlignFromCDB){
551 TString detStr = fLoadAlObjsListOfDets;
552 TString loadAlObjsListOfDets = "";
554 TObjArray* detArray = runLoader->GetAliRun()->Detectors();
555 for (Int_t iDet = 0; iDet < detArray->GetEntriesFast(); iDet++) {
556 AliModule* det = (AliModule*) detArray->At(iDet);
557 if (!det || !det->IsActive()) continue;
558 if (IsSelected(det->GetName(), detStr)) {
559 //add det to list of dets to be aligned from CDB
560 loadAlObjsListOfDets += det->GetName();
561 loadAlObjsListOfDets += " ";
563 } // end loop over detectors
564 loadAlObjsListOfDets.Prepend("GRP "); //add alignment objects for non-sensitive modules
565 AliGeomManager::ApplyAlignObjsFromCDB(loadAlObjsListOfDets.Data());
567 // Check if the array with alignment objects was
568 // provided by the user. If yes, apply the objects
569 // to the present TGeo geometry
570 if (fAlignObjArray) {
571 if (AliGeomManager::ApplyAlignObjsToGeom(*fAlignObjArray) == kFALSE) {
572 AliError("The misalignment of one or more volumes failed!"
573 "Compare the list of simulated detectors and the list of detector alignment data!");
574 if (delRunLoader) delete runLoader;
580 // Update the internal geometry of modules (ITS needs it)
581 TString detStr = fLoadAlObjsListOfDets;
582 TObjArray* detArray = runLoader->GetAliRun()->Detectors();
583 for (Int_t iDet = 0; iDet < detArray->GetEntriesFast(); iDet++) {
585 AliModule* det = (AliModule*) detArray->At(iDet);
586 if (!det || !det->IsActive()) continue;
587 if (IsSelected(det->GetName(), detStr)) {
588 det->UpdateInternalGeometry();
590 } // end loop over detectors
593 if (delRunLoader) delete runLoader;
598 //_____________________________________________________________________________
599 void AliSimulation::MergeWith(const char* fileName, Int_t nSignalPerBkgrd)
601 // add a file with background events for merging
603 TObjString* fileNameStr = new TObjString(fileName);
604 fileNameStr->SetUniqueID(nSignalPerBkgrd);
605 if (!fBkgrdFileNames) fBkgrdFileNames = new TObjArray;
606 fBkgrdFileNames->Add(fileNameStr);
609 void AliSimulation::EmbedInto(const char* fileName, Int_t nSignalPerBkgrd)
611 // add a file with background events for embeddin
612 MergeWith(fileName, nSignalPerBkgrd);
613 fEmbeddingFlag = kTRUE;
616 //_____________________________________________________________________________
617 Bool_t AliSimulation::Run(Int_t nEvents)
619 // run the generation, simulation and digitization
624 // Load run number and seed from environmental vars
625 ProcessEnvironmentVars();
627 gRandom->SetSeed(fSeed);
629 if (nEvents > 0) fNEvents = nEvents;
631 // generation and simulation -> hits
632 if (fRunGeneration) {
633 if (!RunSimulation()) if (fStopOnError) return kFALSE;
636 // initialize CDB storage from external environment
637 // (either CDB manager or AliSimulation setters),
638 // if not already done in RunSimulation()
641 // Set run number in CDBManager from data
642 // From this point on the run number must be always loaded from data!
643 if (!SetRunNumberFromData()) if (fStopOnError) return kFALSE;
645 // Set CDB lock: from now on it is forbidden to reset the run number
646 // or the default storage or to activate any further storage!
649 // If RunSimulation was not called, load the geometry and misalign it
650 if (!AliGeomManager::GetGeometry()) {
651 // Initialize the geometry manager
652 AliGeomManager::LoadGeometry("geometry.root");
654 // // Check that the consistency of symbolic names for the activated subdetectors
655 // // in the geometry loaded by AliGeomManager
656 // AliRunLoader* runLoader = LoadRun("READ");
657 // if (!runLoader) return kFALSE;
659 // TString detsToBeChecked = "";
660 // TObjArray* detArray = runLoader->GetAliRun()->Detectors();
661 // for (Int_t iDet = 0; iDet < detArray->GetEntriesFast(); iDet++) {
662 // AliModule* det = (AliModule*) detArray->At(iDet);
663 // if (!det || !det->IsActive()) continue;
664 // detsToBeChecked += det->GetName();
665 // detsToBeChecked += " ";
666 // } // end loop over detectors
667 // if(!AliGeomManager::CheckSymNamesLUT(detsToBeChecked.Data()))
668 if(!AliGeomManager::CheckSymNamesLUT("ALL"))
669 AliFatalClass("Current loaded geometry differs in the definition of symbolic names!");
671 if (!AliGeomManager::GetGeometry()) if (fStopOnError) return kFALSE;
673 if(!MisalignGeometry()) if (fStopOnError) return kFALSE;
677 // hits -> summable digits
678 AliSysInfo::AddStamp("Start_sdigitization");
679 if (!fMakeSDigits.IsNull()) {
680 if (!RunSDigitization(fMakeSDigits)) if (fStopOnError) return kFALSE;
683 AliSysInfo::AddStamp("Stop_sdigitization");
685 AliSysInfo::AddStamp("Start_digitization");
686 // summable digits -> digits
687 if (!fMakeDigits.IsNull()) {
688 if (!RunDigitization(fMakeDigits, fMakeDigitsFromHits)) {
689 if (fStopOnError) return kFALSE;
692 AliSysInfo::AddStamp("Stop_digitization");
697 if (!fMakeDigitsFromHits.IsNull()) {
698 if (fBkgrdFileNames && (fBkgrdFileNames->GetEntriesFast() > 0)) {
699 AliWarning(Form("Merging and direct creation of digits from hits "
700 "was selected for some detectors. "
701 "No merging will be done for the following detectors: %s",
702 fMakeDigitsFromHits.Data()));
704 if (!RunHitsDigitization(fMakeDigitsFromHits)) {
705 if (fStopOnError) return kFALSE;
712 if (!RunTrigger(fMakeTrigger,fMakeDigits)) {
713 if (fStopOnError) return kFALSE;
718 // digits -> raw data
719 if (!fWriteRawData.IsNull()) {
720 if (!WriteRawData(fWriteRawData, fRawDataFileName,
721 fDeleteIntermediateFiles,fWriteSelRawData)) {
722 if (fStopOnError) return kFALSE;
727 // run HLT simulation on simulated digit data if raw data is not
728 // simulated, otherwise its called as part of WriteRawData
729 if (!fRunHLT.IsNull() && fWriteRawData.IsNull()) {
731 if (fStopOnError) return kFALSE;
737 Bool_t rv = RunQA() ;
743 // Cleanup of CDB manager: cache and active storages!
744 AliCDBManager::Instance()->ClearCache();
749 //_____________________________________________________________________________
750 Bool_t AliSimulation::RunTrigger(const char* config, const char* detectors)
756 // initialize CDB storage from external environment
757 // (either CDB manager or AliSimulation setters),
758 // if not already done in RunSimulation()
761 // Set run number in CDBManager from data
762 // From this point on the run number must be always loaded from data!
763 if (!SetRunNumberFromData()) if (fStopOnError) return kFALSE;
765 // Set CDB lock: from now on it is forbidden to reset the run number
766 // or the default storage or to activate any further storage!
769 AliRunLoader* runLoader = LoadRun("READ");
770 if (!runLoader) return kFALSE;
771 TString trconfiguration = config;
773 if (trconfiguration.IsNull()) {
774 if (strcmp(gAlice->GetTriggerDescriptor(),"")) {
775 trconfiguration = gAlice->GetTriggerDescriptor();
778 AliWarning("No trigger descriptor is specified. Loading the one that is in the CDB.");
781 runLoader->MakeTree( "GG" );
782 AliCentralTrigger* aCTP = runLoader->GetTrigger();
783 // Load Configuration
784 if (!aCTP->LoadConfiguration( trconfiguration ))
788 if( !aCTP->RunTrigger( runLoader , detectors ) ) {
800 //_____________________________________________________________________________
801 Bool_t AliSimulation::WriteTriggerRawData()
803 // Writes the CTP (trigger) DDL raw data
804 // Details of the format are given in the
805 // trigger TDR - pages 134 and 135.
806 AliCTPRawData writer;
812 //_____________________________________________________________________________
813 Bool_t AliSimulation::RunSimulation(Int_t nEvents)
815 // run the generation and simulation
819 // initialize CDB storage and run number from external environment
820 // (either CDB manager or AliSimulation setters)
826 AliError("no gAlice object. Restart aliroot and try again.");
829 if (gAlice->Modules()->GetEntries() > 0) {
830 AliError("gAlice was already run. Restart aliroot and try again.");
834 AliInfo(Form("initializing gAlice with config file %s",
835 fConfigFileName.Data()));
836 StdoutToAliInfo(StderrToAliError(
837 gAlice->Init(fConfigFileName.Data());
840 // Get the trigger descriptor string
841 // Either from AliSimulation or from
843 if (fMakeTrigger.IsNull()) {
844 if (strcmp(gAlice->GetTriggerDescriptor(),""))
845 fMakeTrigger = gAlice->GetTriggerDescriptor();
848 gAlice->SetTriggerDescriptor(fMakeTrigger.Data());
850 // Set run number in CDBManager
851 AliInfo(Form("Run number: %d",AliCDBManager::Instance()->GetRun()));
853 AliRunLoader* runLoader = gAlice->GetRunLoader();
855 AliError(Form("gAlice has no run loader object. "
856 "Check your config file: %s", fConfigFileName.Data()));
859 SetGAliceFile(runLoader->GetFileName());
862 #if ROOT_VERSION_CODE < 331527
863 AliGeomManager::SetGeometry(gGeoManager);
865 // Check that the consistency of symbolic names for the activated subdetectors
866 // in the geometry loaded by AliGeomManager
867 TString detsToBeChecked = "";
868 TObjArray* detArray = runLoader->GetAliRun()->Detectors();
869 for (Int_t iDet = 0; iDet < detArray->GetEntriesFast(); iDet++) {
870 AliModule* det = (AliModule*) detArray->At(iDet);
871 if (!det || !det->IsActive()) continue;
872 detsToBeChecked += det->GetName();
873 detsToBeChecked += " ";
874 } // end loop over detectors
875 if(!AliGeomManager::CheckSymNamesLUT(detsToBeChecked.Data()))
876 AliFatalClass("Current loaded geometry differs in the definition of symbolic names!");
877 MisalignGeometry(runLoader);
880 // AliRunLoader* runLoader = gAlice->GetRunLoader();
882 // AliError(Form("gAlice has no run loader object. "
883 // "Check your config file: %s", fConfigFileName.Data()));
886 // SetGAliceFile(runLoader->GetFileName());
888 if (!gAlice->Generator()) {
889 AliError(Form("gAlice has no generator object. "
890 "Check your config file: %s", fConfigFileName.Data()));
894 // Write GRP entry corresponding to the setting found in Cofig.C
898 if (nEvents <= 0) nEvents = fNEvents;
900 // get vertex from background file in case of merging
901 if (fUseBkgrdVertex &&
902 fBkgrdFileNames && (fBkgrdFileNames->GetEntriesFast() > 0)) {
903 Int_t signalPerBkgrd = GetNSignalPerBkgrd(nEvents);
904 const char* fileName = ((TObjString*)
905 (fBkgrdFileNames->At(0)))->GetName();
906 AliInfo(Form("The vertex will be taken from the background "
907 "file %s with nSignalPerBackground = %d",
908 fileName, signalPerBkgrd));
909 AliVertexGenFile* vtxGen = new AliVertexGenFile(fileName, signalPerBkgrd);
910 gAlice->Generator()->SetVertexGenerator(vtxGen);
913 if (!fRunSimulation) {
914 gAlice->Generator()->SetTrackingFlag(0);
917 // set the number of events per file for given detectors and data types
918 for (Int_t i = 0; i < fEventsPerFile.GetEntriesFast(); i++) {
919 if (!fEventsPerFile[i]) continue;
920 const char* detName = fEventsPerFile[i]->GetName();
921 const char* typeName = fEventsPerFile[i]->GetTitle();
922 TString loaderName(detName);
923 loaderName += "Loader";
924 AliLoader* loader = runLoader->GetLoader(loaderName);
926 AliError(Form("RunSimulation", "no loader for %s found\n"
927 "Number of events per file not set for %s %s",
928 detName, typeName, detName));
931 AliDataLoader* dataLoader =
932 loader->GetDataLoader(typeName);
934 AliError(Form("no data loader for %s found\n"
935 "Number of events per file not set for %s %s",
936 typeName, detName, typeName));
939 dataLoader->SetNumberOfEventsPerFile(fEventsPerFile[i]->GetUniqueID());
940 AliDebug(1, Form("number of events per file set to %d for %s %s",
941 fEventsPerFile[i]->GetUniqueID(), detName, typeName));
944 AliInfo("running gAlice");
945 AliSysInfo::AddStamp("Start_simulation");
946 StdoutToAliInfo(StderrToAliError(
947 gAlice->Run(nEvents);
949 AliSysInfo::AddStamp("Stop_simulation");
955 //_____________________________________________________________________________
956 Bool_t AliSimulation::RunSDigitization(const char* detectors)
958 // run the digitization and produce summable digits
959 static Int_t eventNr=0;
962 // initialize CDB storage, run number, set CDB lock
964 if (!SetRunNumberFromData()) if (fStopOnError) return kFALSE;
967 AliRunLoader* runLoader = LoadRun();
968 if (!runLoader) return kFALSE;
970 TString detStr = detectors;
971 TObjArray* detArray = runLoader->GetAliRun()->Detectors();
972 for (Int_t iDet = 0; iDet < detArray->GetEntriesFast(); iDet++) {
973 AliModule* det = (AliModule*) detArray->At(iDet);
974 if (!det || !det->IsActive()) continue;
975 if (IsSelected(det->GetName(), detStr)) {
976 AliInfo(Form("creating summable digits for %s", det->GetName()));
977 AliCodeTimerAuto(Form("creating summable digits for %s", det->GetName()));
979 AliSysInfo::AddStamp(Form("Digit_%s_%d",det->GetName(),eventNr), 0,1, eventNr);
983 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
984 AliError(Form("the following detectors were not found: %s",
986 if (fStopOnError) return kFALSE;
995 //_____________________________________________________________________________
996 Bool_t AliSimulation::RunDigitization(const char* detectors,
997 const char* excludeDetectors)
999 // run the digitization and produce digits from sdigits
1001 AliCodeTimerAuto("")
1003 // initialize CDB storage, run number, set CDB lock
1005 if (!SetRunNumberFromData()) if (fStopOnError) return kFALSE;
1008 while (AliRunLoader::GetRunLoader()) delete AliRunLoader::GetRunLoader();
1009 if (gAlice) delete gAlice;
1013 if (fBkgrdFileNames) nStreams = fBkgrdFileNames->GetEntriesFast() + 1;
1014 Int_t signalPerBkgrd = GetNSignalPerBkgrd();
1015 AliRunDigitizer* manager = new AliRunDigitizer(nStreams, signalPerBkgrd);
1016 // manager->SetEmbeddingFlag(fEmbeddingFlag);
1017 manager->SetInputStream(0, fGAliceFileName.Data());
1018 for (Int_t iStream = 1; iStream < nStreams; iStream++) {
1019 const char* fileName = ((TObjString*)
1020 (fBkgrdFileNames->At(iStream-1)))->GetName();
1021 manager->SetInputStream(iStream, fileName);
1024 TString detStr = detectors;
1025 TString detExcl = excludeDetectors;
1026 manager->GetInputStream(0)->ImportgAlice();
1027 AliRunLoader* runLoader =
1028 AliRunLoader::GetRunLoader(manager->GetInputStream(0)->GetFolderName());
1029 TObjArray* detArray = runLoader->GetAliRun()->Detectors();
1030 for (Int_t iDet = 0; iDet < detArray->GetEntriesFast(); iDet++) {
1031 AliModule* det = (AliModule*) detArray->At(iDet);
1032 if (!det || !det->IsActive()) continue;
1033 if (IsSelected(det->GetName(), detStr) &&
1034 !IsSelected(det->GetName(), detExcl)) {
1035 AliDigitizer* digitizer = det->CreateDigitizer(manager);
1038 AliError(Form("no digitizer for %s", det->GetName()));
1039 if (fStopOnError) return kFALSE;
1041 digitizer->SetRegionOfInterest(fRegionOfInterest);
1046 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
1047 AliError(Form("the following detectors were not found: %s",
1049 if (fStopOnError) return kFALSE;
1052 if (!manager->GetListOfTasks()->IsEmpty()) {
1053 AliInfo("executing digitization");
1062 //_____________________________________________________________________________
1063 Bool_t AliSimulation::RunHitsDigitization(const char* detectors)
1065 // run the digitization and produce digits from hits
1067 AliCodeTimerAuto("")
1069 // initialize CDB storage, run number, set CDB lock
1071 if (!SetRunNumberFromData()) if (fStopOnError) return kFALSE;
1074 AliRunLoader* runLoader = LoadRun("READ");
1075 if (!runLoader) return kFALSE;
1077 TString detStr = detectors;
1078 TObjArray* detArray = runLoader->GetAliRun()->Detectors();
1079 for (Int_t iDet = 0; iDet < detArray->GetEntriesFast(); iDet++) {
1080 AliModule* det = (AliModule*) detArray->At(iDet);
1081 if (!det || !det->IsActive()) continue;
1082 if (IsSelected(det->GetName(), detStr)) {
1083 AliInfo(Form("creating digits from hits for %s", det->GetName()));
1088 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
1089 AliError(Form("the following detectors were not found: %s",
1091 if (fStopOnError) return kFALSE;
1097 //_____________________________________________________________________________
1098 Bool_t AliSimulation::WriteRawData(const char* detectors,
1099 const char* fileName,
1100 Bool_t deleteIntermediateFiles,
1103 // convert the digits to raw data
1104 // First DDL raw data files for the given detectors are created.
1105 // If a file name is given, the DDL files are then converted to a DATE file.
1106 // If deleteIntermediateFiles is true, the DDL raw files are deleted
1108 // If the file name has the extension ".root", the DATE file is converted
1110 // If deleteIntermediateFiles is true, the DATE file is deleted afterwards.
1111 // 'selrawdata' flag can be used to enable writing of detectors raw data
1112 // accoring to the trigger cluster.
1114 AliCodeTimerAuto("")
1116 TString detStr = detectors;
1117 if (!WriteRawFiles(detStr.Data())) {
1118 if (fStopOnError) return kFALSE;
1121 // run HLT simulation on simulated DDL raw files
1122 // and produce HLT ddl raw files to be included in date/root file
1123 if (IsSelected("HLT", detStr) && !fRunHLT.IsNull()) {
1125 if (fStopOnError) return kFALSE;
1129 TString dateFileName(fileName);
1130 if (!dateFileName.IsNull()) {
1131 Bool_t rootOutput = dateFileName.EndsWith(".root");
1132 if (rootOutput) dateFileName += ".date";
1133 TString selDateFileName;
1135 selDateFileName = "selected.";
1136 selDateFileName+= dateFileName;
1138 if (!ConvertRawFilesToDate(dateFileName,selDateFileName)) {
1139 if (fStopOnError) return kFALSE;
1141 if (deleteIntermediateFiles) {
1142 AliRunLoader* runLoader = LoadRun("READ");
1143 if (runLoader) for (Int_t iEvent = 0;
1144 iEvent < runLoader->GetNumberOfEvents(); iEvent++) {
1146 sprintf(command, "rm -r raw%d", iEvent);
1147 gSystem->Exec(command);
1152 if (!ConvertDateToRoot(dateFileName, fileName)) {
1153 if (fStopOnError) return kFALSE;
1155 if (deleteIntermediateFiles) {
1156 gSystem->Unlink(dateFileName);
1159 TString selFileName = "selected.";
1160 selFileName += fileName;
1161 if (!ConvertDateToRoot(selDateFileName, selFileName)) {
1162 if (fStopOnError) return kFALSE;
1164 if (deleteIntermediateFiles) {
1165 gSystem->Unlink(selDateFileName);
1174 //_____________________________________________________________________________
1175 Bool_t AliSimulation::WriteRawFiles(const char* detectors)
1177 // convert the digits to raw data DDL files
1179 AliCodeTimerAuto("")
1181 AliRunLoader* runLoader = LoadRun("READ");
1182 if (!runLoader) return kFALSE;
1184 // write raw data to DDL files
1185 for (Int_t iEvent = 0; iEvent < runLoader->GetNumberOfEvents(); iEvent++) {
1186 AliInfo(Form("processing event %d", iEvent));
1187 runLoader->GetEvent(iEvent);
1188 TString baseDir = gSystem->WorkingDirectory();
1190 sprintf(dirName, "raw%d", iEvent);
1191 gSystem->MakeDirectory(dirName);
1192 if (!gSystem->ChangeDirectory(dirName)) {
1193 AliError(Form("couldn't change to directory %s", dirName));
1194 if (fStopOnError) return kFALSE; else continue;
1197 ofstream runNbFile(Form("run%u",runLoader->GetHeader()->GetRun()));
1200 TString detStr = detectors;
1201 if (IsSelected("HLT", detStr)) {
1202 // Do nothing. "HLT" will be removed from detStr and HLT raw
1203 // data files are generated in RunHLT.
1206 TObjArray* detArray = runLoader->GetAliRun()->Detectors();
1207 for (Int_t iDet = 0; iDet < detArray->GetEntriesFast(); iDet++) {
1208 AliModule* det = (AliModule*) detArray->At(iDet);
1209 if (!det || !det->IsActive()) continue;
1210 if (IsSelected(det->GetName(), detStr)) {
1211 AliInfo(Form("creating raw data from digits for %s", det->GetName()));
1216 if (!WriteTriggerRawData())
1217 if (fStopOnError) return kFALSE;
1219 gSystem->ChangeDirectory(baseDir);
1220 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
1221 AliError(Form("the following detectors were not found: %s",
1223 if (fStopOnError) return kFALSE;
1232 //_____________________________________________________________________________
1233 Bool_t AliSimulation::ConvertRawFilesToDate(const char* dateFileName,
1234 const char* selDateFileName)
1236 // convert raw data DDL files to a DATE file with the program "dateStream"
1237 // The second argument is not empty when the user decides to write
1238 // the detectors raw data according to the trigger cluster.
1240 AliCodeTimerAuto("")
1242 char* path = gSystem->Which(gSystem->Getenv("PATH"), "dateStream");
1244 AliError("the program dateStream was not found");
1245 if (fStopOnError) return kFALSE;
1250 AliRunLoader* runLoader = LoadRun("READ");
1251 if (!runLoader) return kFALSE;
1253 AliInfo(Form("converting raw data DDL files to DATE file %s", dateFileName));
1254 Bool_t selrawdata = kFALSE;
1255 if (strcmp(selDateFileName,"") != 0) selrawdata = kTRUE;
1258 // Note the option -s. It is used in order to avoid
1259 // the generation of SOR/EOR events.
1260 sprintf(command, "dateStream -c -s -D -o %s -# %d -C -run %d",
1261 dateFileName, runLoader->GetNumberOfEvents(),runLoader->GetHeader()->GetRun());
1262 FILE* pipe = gSystem->OpenPipe(command, "w");
1265 AliError(Form("Cannot execute command: %s",command));
1269 Int_t selEvents = 0;
1270 for (Int_t iEvent = 0; iEvent < runLoader->GetNumberOfEvents(); iEvent++) {
1272 UInt_t detectorPattern = 0;
1273 runLoader->GetEvent(iEvent);
1274 if (!runLoader->LoadTrigger()) {
1275 AliCentralTrigger *aCTP = runLoader->GetTrigger();
1276 detectorPattern = aCTP->GetClusterMask();
1277 // Check if the event was triggered by CTP
1279 if (aCTP->GetClassMask()) selEvents++;
1283 AliWarning("No trigger can be loaded! Some fields in the event header will be empty !");
1285 AliWarning("No trigger can be loaded! Writing of selected raw data is abandoned !");
1286 selrawdata = kFALSE;
1290 fprintf(pipe, "GDC DetectorPattern %u\n", detectorPattern);
1294 // loop over detectors and DDLs
1295 for (Int_t iDet = 0; iDet < AliDAQ::kNDetectors; iDet++) {
1296 for (Int_t iDDL = 0; iDDL < AliDAQ::NumberOfDdls(iDet); iDDL++) {
1298 Int_t ddlID = AliDAQ::DdlID(iDet,iDDL);
1299 Int_t ldcID = Int_t(ldc + 0.0001);
1300 ldc += AliDAQ::NumberOfLdcs(iDet) / AliDAQ::NumberOfDdls(iDet);
1302 char rawFileName[256];
1303 sprintf(rawFileName, "raw%d/%s",
1304 iEvent, AliDAQ::DdlFileName(iDet,iDDL));
1306 // check existence and size of raw data file
1307 FILE* file = fopen(rawFileName, "rb");
1308 if (!file) continue;
1309 fseek(file, 0, SEEK_END);
1310 unsigned long size = ftell(file);
1312 if (!size) continue;
1314 if (ldcID != prevLDC) {
1315 fprintf(pipe, " LDC Id %d\n", ldcID);
1318 fprintf(pipe, " Equipment Id %d Payload %s\n", ddlID, rawFileName);
1323 Int_t result = gSystem->ClosePipe(pipe);
1325 if (!(selrawdata && selEvents > 0)) {
1327 return (result == 0);
1330 AliInfo(Form("converting selected by trigger cluster raw data DDL files to DATE file %s", selDateFileName));
1332 sprintf(command, "dateStream -c -s -D -o %s -# %d -C -run %d",
1333 selDateFileName,selEvents,runLoader->GetHeader()->GetRun());
1334 FILE* pipe2 = gSystem->OpenPipe(command, "w");
1336 for (Int_t iEvent = 0; iEvent < runLoader->GetNumberOfEvents(); iEvent++) {
1338 // Get the trigger decision and cluster
1339 UInt_t detectorPattern = 0;
1341 runLoader->GetEvent(iEvent);
1342 if (!runLoader->LoadTrigger()) {
1343 AliCentralTrigger *aCTP = runLoader->GetTrigger();
1344 if (aCTP->GetClassMask() == 0) continue;
1345 detectorPattern = aCTP->GetClusterMask();
1346 detClust = AliDAQ::ListOfTriggeredDetectors(detectorPattern);
1347 AliInfo(Form("List of detectors to be read out: %s",detClust.Data()));
1350 fprintf(pipe2, "GDC DetectorPattern %u\n", detectorPattern);
1354 // loop over detectors and DDLs
1355 for (Int_t iDet = 0; iDet < AliDAQ::kNDetectors; iDet++) {
1356 // Write only raw data from detectors that
1357 // are contained in the trigger cluster(s)
1358 if (!IsSelected(AliDAQ::DetectorName(iDet),detClust)) continue;
1360 for (Int_t iDDL = 0; iDDL < AliDAQ::NumberOfDdls(iDet); iDDL++) {
1362 Int_t ddlID = AliDAQ::DdlID(iDet,iDDL);
1363 Int_t ldcID = Int_t(ldc + 0.0001);
1364 ldc += AliDAQ::NumberOfLdcs(iDet) / AliDAQ::NumberOfDdls(iDet);
1366 char rawFileName[256];
1367 sprintf(rawFileName, "raw%d/%s",
1368 iEvent, AliDAQ::DdlFileName(iDet,iDDL));
1370 // check existence and size of raw data file
1371 FILE* file = fopen(rawFileName, "rb");
1372 if (!file) continue;
1373 fseek(file, 0, SEEK_END);
1374 unsigned long size = ftell(file);
1376 if (!size) continue;
1378 if (ldcID != prevLDC) {
1379 fprintf(pipe2, " LDC Id %d\n", ldcID);
1382 fprintf(pipe2, " Equipment Id %d Payload %s\n", ddlID, rawFileName);
1387 Int_t result2 = gSystem->ClosePipe(pipe2);
1390 return ((result == 0) && (result2 == 0));
1393 //_____________________________________________________________________________
1394 Bool_t AliSimulation::ConvertDateToRoot(const char* dateFileName,
1395 const char* rootFileName)
1397 // convert a DATE file to a root file with the program "alimdc"
1400 const Int_t kDBSize = 2000000000;
1401 const Int_t kTagDBSize = 1000000000;
1402 const Bool_t kFilter = kFALSE;
1403 const Int_t kCompression = 1;
1405 char* path = gSystem->Which(gSystem->Getenv("PATH"), "alimdc");
1407 AliError("the program alimdc was not found");
1408 if (fStopOnError) return kFALSE;
1413 AliInfo(Form("converting DATE file %s to root file %s",
1414 dateFileName, rootFileName));
1416 const char* rawDBFS[2] = { "/tmp/mdc1", "/tmp/mdc2" };
1417 const char* tagDBFS = "/tmp/mdc1/tags";
1419 // User defined file system locations
1420 if (gSystem->Getenv("ALIMDC_RAWDB1"))
1421 rawDBFS[0] = gSystem->Getenv("ALIMDC_RAWDB1");
1422 if (gSystem->Getenv("ALIMDC_RAWDB2"))
1423 rawDBFS[1] = gSystem->Getenv("ALIMDC_RAWDB2");
1424 if (gSystem->Getenv("ALIMDC_TAGDB"))
1425 tagDBFS = gSystem->Getenv("ALIMDC_TAGDB");
1427 gSystem->Exec(Form("rm -rf %s",rawDBFS[0]));
1428 gSystem->Exec(Form("rm -rf %s",rawDBFS[1]));
1429 gSystem->Exec(Form("rm -rf %s",tagDBFS));
1431 gSystem->Exec(Form("mkdir %s",rawDBFS[0]));
1432 gSystem->Exec(Form("mkdir %s",rawDBFS[1]));
1433 gSystem->Exec(Form("mkdir %s",tagDBFS));
1435 Int_t result = gSystem->Exec(Form("alimdc %d %d %d %d %s",
1436 kDBSize, kTagDBSize, kFilter, kCompression, dateFileName));
1437 gSystem->Exec(Form("mv %s/*.root %s", rawDBFS[0], rootFileName));
1439 gSystem->Exec(Form("rm -rf %s",rawDBFS[0]));
1440 gSystem->Exec(Form("rm -rf %s",rawDBFS[1]));
1441 gSystem->Exec(Form("rm -rf %s",tagDBFS));
1443 return (result == 0);
1447 //_____________________________________________________________________________
1448 AliRunLoader* AliSimulation::LoadRun(const char* mode) const
1450 // delete existing run loaders, open a new one and load gAlice
1452 while (AliRunLoader::GetRunLoader()) delete AliRunLoader::GetRunLoader();
1453 AliRunLoader* runLoader =
1454 AliRunLoader::Open(fGAliceFileName.Data(),
1455 AliConfig::GetDefaultEventFolderName(), mode);
1457 AliError(Form("no run loader found in file %s", fGAliceFileName.Data()));
1460 runLoader->LoadgAlice();
1461 runLoader->LoadHeader();
1462 gAlice = runLoader->GetAliRun();
1464 AliError(Form("no gAlice object found in file %s",
1465 fGAliceFileName.Data()));
1471 //_____________________________________________________________________________
1472 Int_t AliSimulation::GetNSignalPerBkgrd(Int_t nEvents) const
1474 // get or calculate the number of signal events per background event
1476 if (!fBkgrdFileNames) return 1;
1477 Int_t nBkgrdFiles = fBkgrdFileNames->GetEntriesFast();
1478 if (nBkgrdFiles == 0) return 1;
1480 // get the number of signal events
1482 AliRunLoader* runLoader =
1483 AliRunLoader::Open(fGAliceFileName.Data(), "SIGNAL");
1484 if (!runLoader) return 1;
1486 nEvents = runLoader->GetNumberOfEvents();
1491 for (Int_t iBkgrdFile = 0; iBkgrdFile < nBkgrdFiles; iBkgrdFile++) {
1492 // get the number of background events
1493 const char* fileName = ((TObjString*)
1494 (fBkgrdFileNames->At(iBkgrdFile)))->GetName();
1495 AliRunLoader* runLoader =
1496 AliRunLoader::Open(fileName, "BKGRD");
1497 if (!runLoader) continue;
1498 Int_t nBkgrdEvents = runLoader->GetNumberOfEvents();
1501 // get or calculate the number of signal per background events
1502 Int_t nSignalPerBkgrd = fBkgrdFileNames->At(iBkgrdFile)->GetUniqueID();
1503 if (nSignalPerBkgrd <= 0) {
1504 nSignalPerBkgrd = (nEvents-1) / nBkgrdEvents + 1;
1505 } else if (result && (result != nSignalPerBkgrd)) {
1506 AliInfo(Form("the number of signal events per background event "
1507 "will be changed from %d to %d for stream %d",
1508 nSignalPerBkgrd, result, iBkgrdFile+1));
1509 nSignalPerBkgrd = result;
1512 if (!result) result = nSignalPerBkgrd;
1513 if (nSignalPerBkgrd * nBkgrdEvents < nEvents) {
1514 AliWarning(Form("not enough background events (%d) for %d signal events "
1515 "using %d signal per background events for stream %d",
1516 nBkgrdEvents, nEvents, nSignalPerBkgrd, iBkgrdFile+1));
1523 //_____________________________________________________________________________
1524 Bool_t AliSimulation::IsSelected(TString detName, TString& detectors) const
1526 // check whether detName is contained in detectors
1527 // if yes, it is removed from detectors
1529 // check if all detectors are selected
1530 if ((detectors.CompareTo("ALL") == 0) ||
1531 detectors.BeginsWith("ALL ") ||
1532 detectors.EndsWith(" ALL") ||
1533 detectors.Contains(" ALL ")) {
1538 // search for the given detector
1539 Bool_t result = kFALSE;
1540 if ((detectors.CompareTo(detName) == 0) ||
1541 detectors.BeginsWith(detName+" ") ||
1542 detectors.EndsWith(" "+detName) ||
1543 detectors.Contains(" "+detName+" ")) {
1544 detectors.ReplaceAll(detName, "");
1548 // clean up the detectors string
1549 while (detectors.Contains(" ")) detectors.ReplaceAll(" ", " ");
1550 while (detectors.BeginsWith(" ")) detectors.Remove(0, 1);
1551 while (detectors.EndsWith(" ")) detectors.Remove(detectors.Length()-1, 1);
1556 //_____________________________________________________________________________
1557 Bool_t AliSimulation::ConvertRaw2SDigits(const char* rawDirectory, const char* esdFileName)
1560 // Steering routine to convert raw data in directory rawDirectory/ to fake SDigits.
1561 // These can be used for embedding of MC tracks into RAW data using the standard
1562 // merging procedure.
1564 // If an ESD file is given the reconstructed vertex is taken from it and stored in the event header.
1567 AliError("no gAlice object. Restart aliroot and try again.");
1570 if (gAlice->Modules()->GetEntries() > 0) {
1571 AliError("gAlice was already run. Restart aliroot and try again.");
1575 AliInfo(Form("initializing gAlice with config file %s",fConfigFileName.Data()));
1576 StdoutToAliInfo(StderrToAliError(gAlice->Init(fConfigFileName.Data());););
1580 //AliCDBManager* man = AliCDBManager::Instance();
1581 //man->SetRun(0); // Should this come from rawdata header ?
1585 // Get the runloader
1586 AliRunLoader* runLoader = gAlice->GetRunLoader();
1588 // Open esd file if available
1589 TFile* esdFile = TFile::Open(esdFileName);
1590 Bool_t esdOK = (esdFile != 0);
1591 AliESD* esd = new AliESD;
1594 treeESD = (TTree*) esdFile->Get("esdTree");
1596 AliWarning("No ESD tree found");
1599 treeESD->SetBranchAddress("ESD", &esd);
1603 // Create the RawReader
1604 TString fileName(rawDirectory);
1605 AliRawReader* rawReader = 0x0;
1606 if (fileName.EndsWith("/")) {
1607 rawReader = new AliRawReaderFile(fileName);
1608 } else if (fileName.EndsWith(".root")) {
1609 rawReader = new AliRawReaderRoot(fileName);
1610 } else if (!fileName.IsNull()) {
1611 rawReader = new AliRawReaderDate(fileName);
1613 // if (!fEquipIdMap.IsNull() && fRawReader)
1614 // fRawReader->LoadEquipmentIdsMap(fEquipIdMap);
1616 // Get list of detectors
1617 TObjArray* detArray = runLoader->GetAliRun()->Detectors();
1620 AliHeader* header = runLoader->GetHeader();
1622 TString detStr = fMakeSDigits;
1626 if (!(rawReader->NextEvent())) break;
1629 for (iDet = 0; iDet < detArray->GetEntriesFast(); iDet++) {
1630 AliModule* det = (AliModule*) detArray->At(iDet);
1631 if (!det || !det->IsActive()) continue;
1632 if (IsSelected(det->GetName(), detStr)) {
1633 AliInfo(Form("Calling Raw2SDigits for %s\n", det->GetName()));
1634 det->Raw2SDigits(rawReader);
1641 // If ESD information available obtain reconstructed vertex and store in header.
1643 treeESD->GetEvent(nev);
1644 const AliESDVertex* esdVertex = esd->GetPrimaryVertex();
1645 Double_t position[3];
1646 esdVertex->GetXYZ(position);
1647 AliGenEventHeader* mcHeader = new AliGenEventHeader("ESD");
1650 for (Int_t i = 0; i < 3; i++) mcV[i] = position[i];
1651 mcHeader->SetPrimaryVertex(mcV);
1652 header->Reset(0,nev);
1653 header->SetGenEventHeader(mcHeader);
1654 printf("***** Saved vertex %f %f %f \n", position[0], position[1], position[2]);
1659 runLoader->TreeE()->Fill();
1660 runLoader->SetNextEvent();
1666 runLoader->CdGAFile();
1667 runLoader->WriteHeader("OVERWRITE");
1668 runLoader->WriteRunLoader();
1673 //_____________________________________________________________________________
1674 Int_t AliSimulation::GetDetIndex(const char* detector)
1676 // return the detector index corresponding to detector
1678 for (index = 0; index < fgkNDetectors ; index++) {
1679 if ( strcmp(detector, fgkDetectorName[index]) == 0 )
1685 //_____________________________________________________________________________
1686 Bool_t AliSimulation::RunHLT()
1688 // Run the HLT simulation
1689 // HLT simulation is implemented in HLT/sim/AliHLTSimulation
1690 // Disabled if fRunHLT is empty, default vaule is "default".
1691 // AliSimulation::SetRunHLT can be used to set the options for HLT simulation
1692 // The default simulation depends on the HLT component libraries and their
1693 // corresponding agents which define components and chains to run. See
1694 // http://web.ift.uib.no/~kjeks/doc/alice-hlt-current/
1695 // http://web.ift.uib.no/~kjeks/doc/alice-hlt-current/classAliHLTModuleAgent.html
1697 // The libraries to be loaded can be specified as an option.
1699 // AliSimulation sim;
1700 // sim.SetRunHLT("libAliHLTSample.so");
1702 // will only load <tt>libAliHLTSample.so</tt>
1704 // Other available options:
1705 // \li loglevel=<i>level</i> <br>
1706 // logging level for this processing
1708 // disable redirection of log messages to AliLog class
1709 // \li config=<i>macro</i>
1710 // configuration macro
1711 // \li chains=<i>configuration</i>
1712 // comma separated list of configurations to be run during simulation
1713 // \li rawfile=<i>file</i>
1714 // source for the RawReader to be created, the default is <i>./</i> if
1715 // raw data is simulated
1718 AliRunLoader* pRunLoader = LoadRun("READ");
1719 if (!pRunLoader) return kFALSE;
1721 // initialize CDB storage, run number, set CDB lock
1723 if (!SetRunNumberFromData()) if (fStopOnError) return kFALSE;
1726 // load the library dynamically
1727 gSystem->Load(ALIHLTSIMULATION_LIBRARY);
1729 // check for the library version
1730 AliHLTSimulationGetLibraryVersion_t fctVersion=(AliHLTSimulationGetLibraryVersion_t)(gSystem->DynFindSymbol(ALIHLTSIMULATION_LIBRARY, ALIHLTSIMULATION_GET_LIBRARY_VERSION));
1732 AliError(Form("can not load library %s", ALIHLTSIMULATION_LIBRARY));
1735 if (fctVersion()!= ALIHLTSIMULATION_LIBRARY_VERSION) {
1736 AliError(Form("%s version does not match: compiled for version %d, loaded %d", ALIHLTSIMULATION_LIBRARY, ALIHLTSIMULATION_LIBRARY_VERSION, fctVersion()));
1740 // print compile info
1741 typedef void (*CompileInfo)( char*& date, char*& time);
1742 CompileInfo fctInfo=(CompileInfo)gSystem->DynFindSymbol(ALIHLTSIMULATION_LIBRARY, "CompileInfo");
1746 (*fctInfo)(date,time);
1747 if (!date) {date=new Char_t[8]; strcpy(date,"unknown");}
1748 if (!time) {time=new Char_t[8]; strcpy(time,"unknown");}
1749 AliInfo(Form("%s build on %s (%s)", ALIHLTSIMULATION_LIBRARY, date, time));
1753 AliInfo(Form("no build info available for %s", ALIHLTSIMULATION_LIBRARY));
1756 // create instance of the HLT simulation
1757 AliHLTSimulationCreateInstance_t fctCreate=(AliHLTSimulationCreateInstance_t)(gSystem->DynFindSymbol(ALIHLTSIMULATION_LIBRARY, ALIHLTSIMULATION_CREATE_INSTANCE));
1758 AliHLTSimulation* pHLT=NULL;
1759 if (fctCreate==NULL || (pHLT=(fctCreate()))==NULL) {
1760 AliError(Form("can not create instance of HLT simulation (creator %p)", fctCreate));
1764 // init the HLT simulation
1766 if (fRunHLT.CompareTo("default")!=0) options=fRunHLT;
1767 TString detStr = fWriteRawData;
1768 if (!IsSelected("HLT", detStr)) {
1769 options+=" writerawfiles=";
1771 options+=" writerawfiles=HLT";
1774 if (!detStr.IsNull() && !options.Contains("rawfile=")) {
1775 // as a matter of fact, HLT will run reconstruction and needs the RawReader
1776 // in order to get detector data. By default, RawReaderFile is used to read
1777 // the already simulated ddl files. Date and Root files from the raw data
1778 // are generated after the HLT simulation.
1779 options+=" rawfile=./";
1782 AliHLTSimulationInit_t fctInit=(AliHLTSimulationInit_t)(gSystem->DynFindSymbol(ALIHLTSIMULATION_LIBRARY, ALIHLTSIMULATION_INIT));
1783 if (fctInit==NULL || (iResult=(fctInit(pHLT, pRunLoader, options.Data())))<0) {
1784 AliError(Form("can not init HLT simulation: error %d (init %p)", iResult, fctInit));
1786 // run the HLT simulation
1787 AliHLTSimulationRun_t fctRun=(AliHLTSimulationRun_t)(gSystem->DynFindSymbol(ALIHLTSIMULATION_LIBRARY, ALIHLTSIMULATION_RUN));
1788 if (fctRun==NULL || (iResult=(fctRun(pHLT, pRunLoader)))<0) {
1789 AliError(Form("can not run HLT simulation: error %d (run %p)", iResult, fctRun));
1793 // delete the instance
1794 AliHLTSimulationDeleteInstance_t fctDelete=(AliHLTSimulationDeleteInstance_t)(gSystem->DynFindSymbol(ALIHLTSIMULATION_LIBRARY, ALIHLTSIMULATION_DELETE_INSTANCE));
1795 if (fctDelete==NULL || fctDelete(pHLT)<0) {
1796 AliError(Form("can not delete instance of HLT simulation (creator %p)", fctDelete));
1800 return iResult>=0?kTRUE:kFALSE;
1803 //_____________________________________________________________________________
1804 Bool_t AliSimulation::RunQA()
1806 // run the QA on summable hits, digits or digits
1808 if(!gAlice) return kFALSE;
1809 fQASteer->SetRunLoader(gAlice->GetRunLoader()) ;
1811 TString detectorsw("") ;
1813 detectorsw = fQASteer->Run(fQADetectors.Data()) ;
1814 if ( detectorsw.IsNull() )
1817 fQASteer->EndOfCycle(detectorsw) ;
1821 //_____________________________________________________________________________
1822 Bool_t AliSimulation::SetRunQA(TString detAndAction)
1824 // Allows to run QA for a selected set of detectors
1825 // and a selected set of tasks among HITS, SDIGITS and DIGITS
1826 // all selected detectors run the same selected tasks
1828 if (!detAndAction.Contains(":")) {
1829 AliError( Form("%s is a wrong syntax, use \"DetectorList:ActionList\" \n", detAndAction.Data()) ) ;
1833 Int_t colon = detAndAction.Index(":") ;
1834 fQADetectors = detAndAction(0, colon) ;
1835 if (fQADetectors.Contains("ALL") )
1836 fQADetectors = Form("%s %s", fMakeDigits.Data(), fMakeDigitsFromHits.Data()) ;
1837 fQATasks = detAndAction(colon+1, detAndAction.Sizeof() ) ;
1838 if (fQATasks.Contains("ALL") ) {
1839 fQATasks = Form("%d %d %d", AliQA::kHITS, AliQA::kSDIGITS, AliQA::kDIGITS) ;
1841 fQATasks.ToUpper() ;
1843 if ( fQATasks.Contains("HIT") )
1844 tempo = Form("%d ", AliQA::kHITS) ;
1845 if ( fQATasks.Contains("SDIGIT") )
1846 tempo += Form("%d ", AliQA::kSDIGITS) ;
1847 if ( fQATasks.Contains("DIGIT") )
1848 tempo += Form("%d ", AliQA::kDIGITS) ;
1850 if (fQATasks.IsNull()) {
1851 AliInfo("No QA requested\n") ;
1856 TString tempo(fQATasks) ;
1857 tempo.ReplaceAll(Form("%d", AliQA::kHITS), AliQA::GetTaskName(AliQA::kHITS)) ;
1858 tempo.ReplaceAll(Form("%d", AliQA::kSDIGITS), AliQA::GetTaskName(AliQA::kSDIGITS)) ;
1859 tempo.ReplaceAll(Form("%d", AliQA::kDIGITS), AliQA::GetTaskName(AliQA::kDIGITS)) ;
1860 AliInfo( Form("QA will be done on \"%s\" for \"%s\"\n", fQADetectors.Data(), tempo.Data()) ) ;
1862 fQASteer->SetActiveDetectors(fQADetectors) ;
1863 fQASteer->SetTasks(fQATasks) ;
1867 //_____________________________________________________________________________
1868 void AliSimulation::ProcessEnvironmentVars()
1870 // Extract run number and random generator seed from env variables
1872 AliInfo("Processing environment variables");
1874 // Random Number seed
1876 // first check that seed is not already set
1878 if (gSystem->Getenv("CONFIG_SEED")) {
1879 fSeed = atoi(gSystem->Getenv("CONFIG_SEED"));
1882 if (gSystem->Getenv("CONFIG_SEED")) {
1883 AliInfo(Form("Seed for random number generation already set (%d)"
1884 ": CONFIG_SEED variable ignored!", fSeed));
1888 AliInfo(Form("Seed for random number generation = %d ", fSeed));
1892 // first check that run number is not already set
1894 if (gSystem->Getenv("DC_RUN")) {
1895 fRun = atoi(gSystem->Getenv("DC_RUN"));
1898 if (gSystem->Getenv("DC_RUN")) {
1899 AliInfo(Form("Run number already set (%d): DC_RUN variable ignored!", fRun));
1903 AliInfo(Form("Run number = %d", fRun));
1906 //---------------------------------------------------------------------
1908 void AliSimulation::WriteGRPEntry()
1910 // Get the necessary information from galice (generator, trigger etc) and
1911 // write a GRP entry corresponding to the settings in the Config.C used
1912 // note that Hall probes and Cavern and Surface Atmos pressures are not simulated.
1915 AliInfo("Writing global run parameters entry into the OCDB");
1917 AliGRPObject* grpObj = new AliGRPObject();
1919 grpObj->SetRunType("PHYSICS");
1920 grpObj->SetTimeStart(0);
1921 grpObj->SetTimeEnd(9999);
1923 const AliGenerator *gen = gAlice->Generator();
1925 grpObj->SetBeamEnergy(gen->GetEnergyCMS());
1928 gen->GetProjectile(projectile,a,z);
1930 gen->GetTarget(target,a,z);
1931 TString beamType = projectile + "-" + target;
1932 beamType.ReplaceAll(" ","");
1933 if (!beamType.CompareTo("-")) {
1935 grpObj->SetBeamType("UNKNOWN");
1938 grpObj->SetBeamType(beamType);
1942 AliWarning("Unknown beam type and energy! Setting energy to 0");
1943 grpObj->SetBeamEnergy(0);
1944 grpObj->SetBeamType("UNKNOWN");
1947 UInt_t detectorPattern = 0;
1949 TObjArray *detArray = gAlice->Detectors();
1950 for (Int_t iDet = 0; iDet < AliDAQ::kNDetectors-1; iDet++) {
1951 if (detArray->FindObject(AliDAQ::OfflineModuleName(iDet))) {
1952 detectorPattern |= (1 << iDet);
1957 if (!fMakeTrigger.IsNull() || strcmp(gAlice->GetTriggerDescriptor(),""))
1958 detectorPattern |= (1 << AliDAQ::DetectorID("TRG"));
1961 if (!fRunHLT.IsNull())
1962 detectorPattern |= (1 << AliDAQ::kHLTId);
1964 grpObj->SetNumberOfDetectors((Char_t)nDets);
1965 grpObj->SetDetectorMask((Int_t)detectorPattern);
1966 grpObj->SetLHCPeriod("LHC08c");
1967 grpObj->SetLHCState("STABLE_BEAMS");
1968 grpObj->SetLHCLuminosity(0,(AliGRPObject::Stats)0);
1969 grpObj->SetBeamIntensity(0,(AliGRPObject::Stats)0);
1971 AliMagF *field = gAlice->Field();
1972 Float_t solenoidField = TMath::Abs(field->SolenoidField());
1973 Float_t factor = field->Factor();
1974 Float_t l3current = TMath::Abs(factor)*solenoidField*30000./5.;
1975 grpObj->SetL3Current(l3current,(AliGRPObject::Stats)0);
1978 grpObj->SetL3Polarity(0);
1979 grpObj->SetDipolePolarity(0);
1982 grpObj->SetL3Polarity(1);
1983 grpObj->SetDipolePolarity(1);
1986 if (TMath::Abs(factor) != 0)
1987 grpObj->SetDipoleCurrent(6000,(AliGRPObject::Stats)0);
1989 grpObj->SetDipoleCurrent(0,(AliGRPObject::Stats)0);
1991 grpObj->SetCavernTemperature(0,(AliGRPObject::Stats)0);
1993 //grpMap->Add(new TObjString("fCavernPressure"),new TObjString("0")); ---> not inserted in simulation with the new object, since it is now an AliDCSSensor
1995 // Now store the entry in OCDB
1996 AliCDBManager* man = AliCDBManager::Instance();
1998 AliCDBId id("GRP/GRP/Data", man->GetRun(), man->GetRun(), 1, 1);
1999 AliCDBMetaData *metadata= new AliCDBMetaData();
2001 metadata->SetResponsible("alice-off@cern.ch");
2002 metadata->SetComment("Automatically produced GRP entry for Monte Carlo");
2004 man->Put(grpObj,id,metadata);