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>
114 #include "AliCodeTimer.h"
115 #include "AliCDBStorage.h"
116 #include "AliCDBEntry.h"
117 #include "AliCDBManager.h"
118 #include "AliGeomManager.h"
119 #include "AliAlignObj.h"
120 #include "AliCentralTrigger.h"
122 #include "AliDigitizer.h"
123 #include "AliGenerator.h"
125 #include "AliModule.h"
127 #include "AliRunDigitizer.h"
128 #include "AliRunLoader.h"
129 #include "AliSimulation.h"
130 #include "AliVertexGenFile.h"
131 #include "AliCentralTrigger.h"
132 #include "AliCTPRawData.h"
133 #include "AliRawReaderFile.h"
134 #include "AliRawReaderRoot.h"
135 #include "AliRawReaderDate.h"
137 #include "AliHeader.h"
138 #include "AliGenEventHeader.h"
141 ClassImp(AliSimulation)
143 AliSimulation *AliSimulation::fgInstance = 0;
145 //_____________________________________________________________________________
146 AliSimulation::AliSimulation(const char* configFileName, const char* cdbUri,
147 const char* name, const char* title) :
150 fRunGeneration(kTRUE),
151 fRunSimulation(kTRUE),
152 fLoadAlignFromCDB(kTRUE),
153 fLoadAlObjsListOfDets("ALL"),
157 fMakeDigitsFromHits(""),
159 fRawDataFileName(""),
160 fDeleteIntermediateFiles(kFALSE),
161 fStopOnError(kFALSE),
164 fConfigFileName(configFileName),
165 fGAliceFileName("galice.root"),
167 fBkgrdFileNames(NULL),
168 fAlignObjArray(NULL),
169 fUseBkgrdVertex(kTRUE),
170 fRegionOfInterest(kFALSE),
173 fEmbeddingFlag(kFALSE)
175 // create simulation object with default parameters
177 SetGAliceFile("galice.root");
180 //_____________________________________________________________________________
181 AliSimulation::AliSimulation(const AliSimulation& sim) :
184 fRunGeneration(sim.fRunGeneration),
185 fRunSimulation(sim.fRunSimulation),
186 fLoadAlignFromCDB(sim.fLoadAlignFromCDB),
187 fLoadAlObjsListOfDets(sim.fLoadAlObjsListOfDets),
188 fMakeSDigits(sim.fMakeSDigits),
189 fMakeDigits(sim.fMakeDigits),
190 fMakeTrigger(sim.fMakeTrigger),
191 fMakeDigitsFromHits(sim.fMakeDigitsFromHits),
192 fWriteRawData(sim.fWriteRawData),
193 fRawDataFileName(""),
194 fDeleteIntermediateFiles(kFALSE),
195 fStopOnError(sim.fStopOnError),
197 fNEvents(sim.fNEvents),
198 fConfigFileName(sim.fConfigFileName),
199 fGAliceFileName(sim.fGAliceFileName),
201 fBkgrdFileNames(NULL),
202 fAlignObjArray(NULL),
203 fUseBkgrdVertex(sim.fUseBkgrdVertex),
204 fRegionOfInterest(sim.fRegionOfInterest),
205 fCDBUri(sim.fCDBUri),
207 fEmbeddingFlag(sim.fEmbeddingFlag)
211 for (Int_t i = 0; i < sim.fEventsPerFile.GetEntriesFast(); i++) {
212 if (!sim.fEventsPerFile[i]) continue;
213 fEventsPerFile.Add(sim.fEventsPerFile[i]->Clone());
216 fBkgrdFileNames = new TObjArray;
217 for (Int_t i = 0; i < sim.fBkgrdFileNames->GetEntriesFast(); i++) {
218 if (!sim.fBkgrdFileNames->At(i)) continue;
219 fBkgrdFileNames->Add(sim.fBkgrdFileNames->At(i)->Clone());
222 for (Int_t i = 0; i < sim.fSpecCDBUri.GetEntriesFast(); i++) {
223 if (sim.fSpecCDBUri[i]) fSpecCDBUri.Add(sim.fSpecCDBUri[i]->Clone());
228 //_____________________________________________________________________________
229 AliSimulation& AliSimulation::operator = (const AliSimulation& sim)
231 // assignment operator
233 this->~AliSimulation();
234 new(this) AliSimulation(sim);
238 //_____________________________________________________________________________
239 AliSimulation::~AliSimulation()
243 fEventsPerFile.Delete();
244 // if(fAlignObjArray) fAlignObjArray->Delete(); // fAlignObjArray->RemoveAll() ???
245 // delete fAlignObjArray; fAlignObjArray=0;
247 if (fBkgrdFileNames) {
248 fBkgrdFileNames->Delete();
249 delete fBkgrdFileNames;
252 fSpecCDBUri.Delete();
253 if (fgInstance==this) fgInstance = 0;
255 AliCodeTimer::Instance()->Print();
259 //_____________________________________________________________________________
260 void AliSimulation::SetNumberOfEvents(Int_t nEvents)
262 // set the number of events for one run
267 //_____________________________________________________________________________
268 void AliSimulation::InitCDBStorage()
270 // activate a default CDB storage
271 // First check if we have any CDB storage set, because it is used
272 // to retrieve the calibration and alignment constants
274 AliCDBManager* man = AliCDBManager::Instance();
275 if (man->IsDefaultStorageSet())
277 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
278 AliWarning("Default CDB storage has been already set !");
279 AliWarning(Form("Ignoring the default storage declared in AliSimulation: %s",fCDBUri.Data()));
280 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
284 AliDebug(2,"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
285 AliDebug(2, Form("Default CDB storage is set to: %s",fCDBUri.Data()));
286 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
287 man->SetDefaultStorage(fCDBUri);
290 // Now activate the detector specific CDB storage locations
291 for (Int_t i = 0; i < fSpecCDBUri.GetEntriesFast(); i++) {
292 TObject* obj = fSpecCDBUri[i];
294 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
295 AliDebug(2, Form("Specific CDB storage for %s is set to: %s",obj->GetName(),obj->GetTitle()));
296 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
297 man->SetSpecificStorage(obj->GetName(), obj->GetTitle());
302 //_____________________________________________________________________________
303 void AliSimulation::SetDefaultStorage(const char* uri) {
304 // Store the desired default CDB storage location
305 // Activate it later within the Run() method
311 //_____________________________________________________________________________
312 void AliSimulation::SetSpecificStorage(const char* calibType, const char* uri) {
313 // Store a detector-specific CDB storage location
314 // Activate it later within the Run() method
316 AliCDBPath aPath(calibType);
317 if(!aPath.IsValid()){
318 AliError(Form("Not a valid path: %s", calibType));
322 TObject* obj = fSpecCDBUri.FindObject(calibType);
323 if (obj) fSpecCDBUri.Remove(obj);
324 fSpecCDBUri.Add(new TNamed(calibType, uri));
328 //_____________________________________________________________________________
329 void AliSimulation::SetConfigFile(const char* fileName)
331 // set the name of the config file
333 fConfigFileName = fileName;
336 //_____________________________________________________________________________
337 void AliSimulation::SetGAliceFile(const char* fileName)
339 // set the name of the galice file
340 // the path is converted to an absolute one if it is relative
342 fGAliceFileName = fileName;
343 if (!gSystem->IsAbsoluteFileName(fGAliceFileName)) {
344 char* absFileName = gSystem->ConcatFileName(gSystem->WorkingDirectory(),
346 fGAliceFileName = absFileName;
347 delete[] absFileName;
350 AliDebug(2, Form("galice file name set to %s", fileName));
353 //_____________________________________________________________________________
354 void AliSimulation::SetEventsPerFile(const char* detector, const char* type,
357 // set the number of events per file for the given detector and data type
358 // ("Hits", "Summable Digits", "Digits", "Reconstructed Points" or "Tracks")
360 TNamed* obj = new TNamed(detector, type);
361 obj->SetUniqueID(nEvents);
362 fEventsPerFile.Add(obj);
365 //_____________________________________________________________________________
366 Bool_t AliSimulation::MisalignGeometry(AliRunLoader *runLoader)
368 // Read the alignment objects from CDB.
369 // Each detector is supposed to have the
370 // alignment objects in DET/Align/Data CDB path.
371 // All the detector objects are then collected,
372 // sorted by geometry level (starting from ALIC) and
373 // then applied to the TGeo geometry.
374 // Finally an overlaps check is performed.
376 if (!AliGeomManager::GetGeometry() || !AliGeomManager::GetGeometry()->IsClosed()) {
377 AliError("Can't apply the misalignment! Geometry is not loaded or it is still opened!");
380 Bool_t delRunLoader = kFALSE;
382 runLoader = LoadRun("READ");
383 if (!runLoader) return kFALSE;
384 delRunLoader = kTRUE;
387 // Export ideal geometry
388 if(!gAlice->IsRootGeometry()) AliGeomManager::GetGeometry()->Export("geometry.root");
390 // Load alignment data from CDB and apply to geometry through AliGeomManager
391 if(fLoadAlignFromCDB){
393 TString detStr = fLoadAlObjsListOfDets;
394 TString loadAlObjsListOfDets = "";
396 TObjArray* detArray = runLoader->GetAliRun()->Detectors();
397 for (Int_t iDet = 0; iDet < detArray->GetEntriesFast(); iDet++) {
398 AliModule* det = (AliModule*) detArray->At(iDet);
399 if (!det || !det->IsActive()) continue;
400 if (IsSelected(det->GetName(), detStr)) {
401 //add det to list of dets to be aligned from CDB
402 loadAlObjsListOfDets += det->GetName();
403 loadAlObjsListOfDets += " ";
405 } // end loop over detectors
406 AliGeomManager::ApplyAlignObjsFromCDB(loadAlObjsListOfDets.Data());
408 // Check if the array with alignment objects was
409 // provided by the user. If yes, apply the objects
410 // to the present TGeo geometry
411 if (fAlignObjArray) {
412 if (AliGeomManager::ApplyAlignObjsToGeom(*fAlignObjArray) == kFALSE) {
413 AliError("The misalignment of one or more volumes failed!"
414 "Compare the list of simulated detectors and the list of detector alignment data!");
415 if (delRunLoader) delete runLoader;
421 // Update the internal geometry of modules (ITS needs it)
422 TString detStr = fLoadAlObjsListOfDets;
423 TObjArray* detArray = runLoader->GetAliRun()->Detectors();
424 for (Int_t iDet = 0; iDet < detArray->GetEntriesFast(); iDet++) {
426 AliModule* det = (AliModule*) detArray->At(iDet);
427 if (!det || !det->IsActive()) continue;
428 if (IsSelected(det->GetName(), detStr)) {
429 det->UpdateInternalGeometry();
431 } // end loop over detectors
434 if (delRunLoader) delete runLoader;
440 //_____________________________________________________________________________
441 Bool_t AliSimulation::SetRunNumber()
443 // Set the CDB manager run number
444 // The run number is retrieved from gAlice
446 if(AliCDBManager::Instance()->GetRun() < 0) {
447 AliRunLoader* runLoader = LoadRun("READ");
448 if (!runLoader) return kFALSE;
450 AliCDBManager::Instance()->SetRun(runLoader->GetAliRun()->GetRunNumber());
451 AliInfo(Form("Run number: %d",AliCDBManager::Instance()->GetRun()));
458 //_____________________________________________________________________________
459 void AliSimulation::MergeWith(const char* fileName, Int_t nSignalPerBkgrd)
461 // add a file with background events for merging
463 TObjString* fileNameStr = new TObjString(fileName);
464 fileNameStr->SetUniqueID(nSignalPerBkgrd);
465 if (!fBkgrdFileNames) fBkgrdFileNames = new TObjArray;
466 fBkgrdFileNames->Add(fileNameStr);
469 void AliSimulation::EmbedInto(const char* fileName, Int_t nSignalPerBkgrd)
471 // add a file with background events for embeddin
472 MergeWith(fileName, nSignalPerBkgrd);
473 fEmbeddingFlag = kTRUE;
476 //_____________________________________________________________________________
477 Bool_t AliSimulation::Run(Int_t nEvents)
479 // run the generation, simulation and digitization
485 if (nEvents > 0) fNEvents = nEvents;
487 // generation and simulation -> hits
488 if (fRunGeneration) {
489 if (!RunSimulation()) if (fStopOnError) return kFALSE;
492 // Set run number in CDBManager (if it is not already set in RunSimulation)
493 if (!SetRunNumber()) if (fStopOnError) return kFALSE;
495 // If RunSimulation was not called, load the geometry and misalign it
496 if (!AliGeomManager::GetGeometry()) {
497 // Initialize the geometry manager
498 AliGeomManager::LoadGeometry("geometry.root");
499 if (!AliGeomManager::GetGeometry()) if (fStopOnError) return kFALSE;
501 if(!MisalignGeometry()) if (fStopOnError) return kFALSE;
504 // hits -> summable digits
505 if (!fMakeSDigits.IsNull()) {
506 if (!RunSDigitization(fMakeSDigits)) if (fStopOnError) return kFALSE;
509 // summable digits -> digits
510 if (!fMakeDigits.IsNull()) {
511 if (!RunDigitization(fMakeDigits, fMakeDigitsFromHits)) {
512 if (fStopOnError) return kFALSE;
517 if (!fMakeDigitsFromHits.IsNull()) {
518 if (fBkgrdFileNames && (fBkgrdFileNames->GetEntriesFast() > 0)) {
519 AliWarning(Form("Merging and direct creation of digits from hits "
520 "was selected for some detectors. "
521 "No merging will be done for the following detectors: %s",
522 fMakeDigitsFromHits.Data()));
524 if (!RunHitsDigitization(fMakeDigitsFromHits)) {
525 if (fStopOnError) return kFALSE;
530 if (!RunTrigger(fMakeTrigger)) {
531 if (fStopOnError) return kFALSE;
534 // digits -> raw data
535 if (!fWriteRawData.IsNull()) {
536 if (!WriteRawData(fWriteRawData, fRawDataFileName,
537 fDeleteIntermediateFiles)) {
538 if (fStopOnError) return kFALSE;
545 //_____________________________________________________________________________
546 Bool_t AliSimulation::RunTrigger(const char* descriptors)
552 AliRunLoader* runLoader = LoadRun("READ");
553 if (!runLoader) return kFALSE;
554 TString des = descriptors;
557 if (gAlice->GetTriggerDescriptor() != "") {
558 des = gAlice->GetTriggerDescriptor();
561 AliWarning("No trigger descriptor is specified. Skipping the trigger simulation...");
566 runLoader->MakeTree( "GG" );
567 AliCentralTrigger* aCTP = runLoader->GetTrigger();
569 aCTP->LoadDescriptor( des );
572 if( !aCTP->RunTrigger( runLoader ) ) {
584 //_____________________________________________________________________________
585 Bool_t AliSimulation::WriteTriggerRawData()
587 // Writes the CTP (trigger) DDL raw data
588 // Details of the format are given in the
589 // trigger TDR - pages 134 and 135.
590 AliCTPRawData writer;
596 //_____________________________________________________________________________
597 Bool_t AliSimulation::RunSimulation(Int_t nEvents)
599 // run the generation and simulation
604 AliError("no gAlice object. Restart aliroot and try again.");
607 if (gAlice->Modules()->GetEntries() > 0) {
608 AliError("gAlice was already run. Restart aliroot and try again.");
612 AliInfo(Form("initializing gAlice with config file %s",
613 fConfigFileName.Data()));
614 StdoutToAliInfo(StderrToAliError(
615 gAlice->Init(fConfigFileName.Data());
618 // Get the trigger descriptor string
619 // Either from AliSimulation or from
621 if (fMakeTrigger.IsNull()) {
622 if (gAlice->GetTriggerDescriptor() != "")
623 fMakeTrigger = gAlice->GetTriggerDescriptor();
626 gAlice->SetTriggerDescriptor(fMakeTrigger.Data());
628 // Set run number in CDBManager
629 AliInfo(Form("Run number: %d",AliCDBManager::Instance()->GetRun()));
631 AliRunLoader* runLoader = gAlice->GetRunLoader();
633 AliError(Form("gAlice has no run loader object. "
634 "Check your config file: %s", fConfigFileName.Data()));
637 SetGAliceFile(runLoader->GetFileName());
640 #if ROOT_VERSION_CODE < 331527
641 AliGeomManager::SetGeometry(gGeoManager);
642 MisalignGeometry(runLoader);
645 // AliRunLoader* runLoader = gAlice->GetRunLoader();
647 // AliError(Form("gAlice has no run loader object. "
648 // "Check your config file: %s", fConfigFileName.Data()));
651 // SetGAliceFile(runLoader->GetFileName());
653 if (!gAlice->Generator()) {
654 AliError(Form("gAlice has no generator object. "
655 "Check your config file: %s", fConfigFileName.Data()));
658 if (nEvents <= 0) nEvents = fNEvents;
660 // get vertex from background file in case of merging
661 if (fUseBkgrdVertex &&
662 fBkgrdFileNames && (fBkgrdFileNames->GetEntriesFast() > 0)) {
663 Int_t signalPerBkgrd = GetNSignalPerBkgrd(nEvents);
664 const char* fileName = ((TObjString*)
665 (fBkgrdFileNames->At(0)))->GetName();
666 AliInfo(Form("The vertex will be taken from the background "
667 "file %s with nSignalPerBackground = %d",
668 fileName, signalPerBkgrd));
669 AliVertexGenFile* vtxGen = new AliVertexGenFile(fileName, signalPerBkgrd);
670 gAlice->Generator()->SetVertexGenerator(vtxGen);
673 if (!fRunSimulation) {
674 gAlice->Generator()->SetTrackingFlag(0);
677 // set the number of events per file for given detectors and data types
678 for (Int_t i = 0; i < fEventsPerFile.GetEntriesFast(); i++) {
679 if (!fEventsPerFile[i]) continue;
680 const char* detName = fEventsPerFile[i]->GetName();
681 const char* typeName = fEventsPerFile[i]->GetTitle();
682 TString loaderName(detName);
683 loaderName += "Loader";
684 AliLoader* loader = runLoader->GetLoader(loaderName);
686 AliError(Form("RunSimulation", "no loader for %s found\n"
687 "Number of events per file not set for %s %s",
688 detName, typeName, detName));
691 AliDataLoader* dataLoader =
692 loader->GetDataLoader(typeName);
694 AliError(Form("no data loader for %s found\n"
695 "Number of events per file not set for %s %s",
696 typeName, detName, typeName));
699 dataLoader->SetNumberOfEventsPerFile(fEventsPerFile[i]->GetUniqueID());
700 AliDebug(1, Form("number of events per file set to %d for %s %s",
701 fEventsPerFile[i]->GetUniqueID(), detName, typeName));
704 AliInfo("running gAlice");
705 StdoutToAliInfo(StderrToAliError(
706 gAlice->Run(nEvents);
715 //_____________________________________________________________________________
716 Bool_t AliSimulation::RunSDigitization(const char* detectors)
718 // run the digitization and produce summable digits
722 AliRunLoader* runLoader = LoadRun();
723 if (!runLoader) return kFALSE;
725 TString detStr = detectors;
726 TObjArray* detArray = runLoader->GetAliRun()->Detectors();
727 for (Int_t iDet = 0; iDet < detArray->GetEntriesFast(); iDet++) {
728 AliModule* det = (AliModule*) detArray->At(iDet);
729 if (!det || !det->IsActive()) continue;
730 if (IsSelected(det->GetName(), detStr)) {
731 AliInfo(Form("creating summable digits for %s", det->GetName()));
732 AliCodeTimerAuto(Form("creating summable digits for %s", det->GetName()));
737 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
738 AliError(Form("the following detectors were not found: %s",
740 if (fStopOnError) return kFALSE;
749 //_____________________________________________________________________________
750 Bool_t AliSimulation::RunDigitization(const char* detectors,
751 const char* excludeDetectors)
753 // run the digitization and produce digits from sdigits
757 while (AliRunLoader::GetRunLoader()) delete AliRunLoader::GetRunLoader();
758 if (gAlice) delete gAlice;
762 if (fBkgrdFileNames) nStreams = fBkgrdFileNames->GetEntriesFast() + 1;
763 Int_t signalPerBkgrd = GetNSignalPerBkgrd();
764 AliRunDigitizer* manager = new AliRunDigitizer(nStreams, signalPerBkgrd);
765 // manager->SetEmbeddingFlag(fEmbeddingFlag);
766 manager->SetInputStream(0, fGAliceFileName.Data());
767 for (Int_t iStream = 1; iStream < nStreams; iStream++) {
768 const char* fileName = ((TObjString*)
769 (fBkgrdFileNames->At(iStream-1)))->GetName();
770 manager->SetInputStream(iStream, fileName);
773 TString detStr = detectors;
774 TString detExcl = excludeDetectors;
775 manager->GetInputStream(0)->ImportgAlice();
776 AliRunLoader* runLoader =
777 AliRunLoader::GetRunLoader(manager->GetInputStream(0)->GetFolderName());
778 TObjArray* detArray = runLoader->GetAliRun()->Detectors();
779 for (Int_t iDet = 0; iDet < detArray->GetEntriesFast(); iDet++) {
780 AliModule* det = (AliModule*) detArray->At(iDet);
781 if (!det || !det->IsActive()) continue;
782 if (IsSelected(det->GetName(), detStr) &&
783 !IsSelected(det->GetName(), detExcl)) {
784 AliDigitizer* digitizer = det->CreateDigitizer(manager);
787 AliError(Form("no digitizer for %s", det->GetName()));
788 if (fStopOnError) return kFALSE;
790 digitizer->SetRegionOfInterest(fRegionOfInterest);
795 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
796 AliError(Form("the following detectors were not found: %s",
798 if (fStopOnError) return kFALSE;
801 if (!manager->GetListOfTasks()->IsEmpty()) {
802 AliInfo("executing digitization");
811 //_____________________________________________________________________________
812 Bool_t AliSimulation::RunHitsDigitization(const char* detectors)
814 // run the digitization and produce digits from hits
818 AliRunLoader* runLoader = LoadRun("READ");
819 if (!runLoader) return kFALSE;
821 TString detStr = detectors;
822 TObjArray* detArray = runLoader->GetAliRun()->Detectors();
823 for (Int_t iDet = 0; iDet < detArray->GetEntriesFast(); iDet++) {
824 AliModule* det = (AliModule*) detArray->At(iDet);
825 if (!det || !det->IsActive()) continue;
826 if (IsSelected(det->GetName(), detStr)) {
827 AliInfo(Form("creating digits from hits for %s", det->GetName()));
832 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
833 AliError(Form("the following detectors were not found: %s",
835 if (fStopOnError) return kFALSE;
839 //PH Temporary fix to avoid interference with the PHOS loder/getter
840 //PH The problem has to be solved in more general way 09/06/05
845 //_____________________________________________________________________________
846 Bool_t AliSimulation::WriteRawData(const char* detectors,
847 const char* fileName,
848 Bool_t deleteIntermediateFiles)
850 // convert the digits to raw data
851 // First DDL raw data files for the given detectors are created.
852 // If a file name is given, the DDL files are then converted to a DATE file.
853 // If deleteIntermediateFiles is true, the DDL raw files are deleted
855 // If the file name has the extension ".root", the DATE file is converted
857 // If deleteIntermediateFiles is true, the DATE file is deleted afterwards.
861 if (!WriteRawFiles(detectors)) {
862 if (fStopOnError) return kFALSE;
865 TString dateFileName(fileName);
866 if (!dateFileName.IsNull()) {
867 Bool_t rootOutput = dateFileName.EndsWith(".root");
868 if (rootOutput) dateFileName += ".date";
869 if (!ConvertRawFilesToDate(dateFileName)) {
870 if (fStopOnError) return kFALSE;
872 if (deleteIntermediateFiles) {
873 AliRunLoader* runLoader = LoadRun("READ");
874 if (runLoader) for (Int_t iEvent = 0;
875 iEvent < runLoader->GetNumberOfEvents(); iEvent++) {
877 sprintf(command, "rm -r raw%d", iEvent);
878 gSystem->Exec(command);
883 if (!ConvertDateToRoot(dateFileName, fileName)) {
884 if (fStopOnError) return kFALSE;
886 if (deleteIntermediateFiles) {
887 gSystem->Unlink(dateFileName);
895 //_____________________________________________________________________________
896 Bool_t AliSimulation::WriteRawFiles(const char* detectors)
898 // convert the digits to raw data DDL files
902 AliRunLoader* runLoader = LoadRun("READ");
903 if (!runLoader) return kFALSE;
905 // write raw data to DDL files
906 for (Int_t iEvent = 0; iEvent < runLoader->GetNumberOfEvents(); iEvent++) {
907 AliInfo(Form("processing event %d", iEvent));
908 runLoader->GetEvent(iEvent);
909 TString baseDir = gSystem->WorkingDirectory();
911 sprintf(dirName, "raw%d", iEvent);
912 gSystem->MakeDirectory(dirName);
913 if (!gSystem->ChangeDirectory(dirName)) {
914 AliError(Form("couldn't change to directory %s", dirName));
915 if (fStopOnError) return kFALSE; else continue;
918 TString detStr = detectors;
919 TObjArray* detArray = runLoader->GetAliRun()->Detectors();
920 for (Int_t iDet = 0; iDet < detArray->GetEntriesFast(); iDet++) {
921 AliModule* det = (AliModule*) detArray->At(iDet);
922 if (!det || !det->IsActive()) continue;
923 if (IsSelected(det->GetName(), detStr)) {
924 AliInfo(Form("creating raw data from digits for %s", det->GetName()));
929 if (!WriteTriggerRawData())
930 if (fStopOnError) return kFALSE;
932 gSystem->ChangeDirectory(baseDir);
933 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
934 AliError(Form("the following detectors were not found: %s",
936 if (fStopOnError) return kFALSE;
945 //_____________________________________________________________________________
946 Bool_t AliSimulation::ConvertRawFilesToDate(const char* dateFileName)
948 // convert raw data DDL files to a DATE file with the program "dateStream"
952 char* path = gSystem->Which(gSystem->Getenv("PATH"), "dateStream");
954 AliError("the program dateStream was not found");
955 if (fStopOnError) return kFALSE;
960 AliRunLoader* runLoader = LoadRun("READ");
961 if (!runLoader) return kFALSE;
963 AliInfo(Form("converting raw data DDL files to DATE file %s", dateFileName));
965 // Note the option -s. It is used in order to avoid
966 // the generation of SOR/EOR events.
967 sprintf(command, "dateStream -s -D -o %s -# %d -C",
968 dateFileName, runLoader->GetNumberOfEvents());
969 FILE* pipe = gSystem->OpenPipe(command, "w");
971 for (Int_t iEvent = 0; iEvent < runLoader->GetNumberOfEvents(); iEvent++) {
972 fprintf(pipe, "GDC\n");
976 // loop over detectors and DDLs
977 for (Int_t iDet = 0; iDet < AliDAQ::kNDetectors; iDet++) {
978 for (Int_t iDDL = 0; iDDL < AliDAQ::NumberOfDdls(iDet); iDDL++) {
980 Int_t ddlID = AliDAQ::DdlID(iDet,iDDL);
981 Int_t ldcID = Int_t(ldc + 0.0001);
982 ldc += AliDAQ::NumberOfLdcs(iDet) / AliDAQ::NumberOfDdls(iDet);
984 char rawFileName[256];
985 sprintf(rawFileName, "raw%d/%s",
986 iEvent, AliDAQ::DdlFileName(iDet,iDDL));
988 // check existence and size of raw data file
989 FILE* file = fopen(rawFileName, "rb");
991 fseek(file, 0, SEEK_END);
992 unsigned long size = ftell(file);
996 if (ldcID != prevLDC) {
997 fprintf(pipe, " LDC Id %d\n", ldcID);
1000 fprintf(pipe, " Equipment Id %d Payload %s\n", ddlID, rawFileName);
1005 Int_t result = gSystem->ClosePipe(pipe);
1008 return (result == 0);
1011 //_____________________________________________________________________________
1012 Bool_t AliSimulation::ConvertDateToRoot(const char* dateFileName,
1013 const char* rootFileName)
1015 // convert a DATE file to a root file with the program "alimdc"
1018 const Int_t kDBSize = 2000000000;
1019 const Int_t kTagDBSize = 1000000000;
1020 const Bool_t kFilter = kFALSE;
1021 const Int_t kCompression = 1;
1023 char* path = gSystem->Which(gSystem->Getenv("PATH"), "alimdc");
1025 AliError("the program alimdc was not found");
1026 if (fStopOnError) return kFALSE;
1031 AliInfo(Form("converting DATE file %s to root file %s",
1032 dateFileName, rootFileName));
1034 const char* rawDBFS[2] = { "/tmp/mdc1", "/tmp/mdc2" };
1035 const char* tagDBFS = "/tmp/mdc1/tags";
1037 // User defined file system locations
1038 if (gSystem->Getenv("ALIMDC_RAWDB1"))
1039 rawDBFS[0] = gSystem->Getenv("ALIMDC_RAWDB1");
1040 if (gSystem->Getenv("ALIMDC_RAWDB2"))
1041 rawDBFS[1] = gSystem->Getenv("ALIMDC_RAWDB2");
1042 if (gSystem->Getenv("ALIMDC_TAGDB"))
1043 tagDBFS = gSystem->Getenv("ALIMDC_TAGDB");
1045 gSystem->Exec(Form("rm -rf %s",rawDBFS[0]));
1046 gSystem->Exec(Form("rm -rf %s",rawDBFS[1]));
1047 gSystem->Exec(Form("rm -rf %s",tagDBFS));
1049 gSystem->Exec(Form("mkdir %s",rawDBFS[0]));
1050 gSystem->Exec(Form("mkdir %s",rawDBFS[1]));
1051 gSystem->Exec(Form("mkdir %s",tagDBFS));
1053 Int_t result = gSystem->Exec(Form("alimdc %d %d %d %d %s",
1054 kDBSize, kTagDBSize, kFilter, kCompression, dateFileName));
1055 gSystem->Exec(Form("mv %s/*.root %s", rawDBFS[0], rootFileName));
1057 gSystem->Exec(Form("rm -rf %s",rawDBFS[0]));
1058 gSystem->Exec(Form("rm -rf %s",rawDBFS[1]));
1059 gSystem->Exec(Form("rm -rf %s",tagDBFS));
1061 return (result == 0);
1065 //_____________________________________________________________________________
1066 AliRunLoader* AliSimulation::LoadRun(const char* mode) const
1068 // delete existing run loaders, open a new one and load gAlice
1070 while (AliRunLoader::GetRunLoader()) delete AliRunLoader::GetRunLoader();
1071 AliRunLoader* runLoader =
1072 AliRunLoader::Open(fGAliceFileName.Data(),
1073 AliConfig::GetDefaultEventFolderName(), mode);
1075 AliError(Form("no run loader found in file %s", fGAliceFileName.Data()));
1078 runLoader->LoadgAlice();
1079 gAlice = runLoader->GetAliRun();
1081 AliError(Form("no gAlice object found in file %s",
1082 fGAliceFileName.Data()));
1088 //_____________________________________________________________________________
1089 Int_t AliSimulation::GetNSignalPerBkgrd(Int_t nEvents) const
1091 // get or calculate the number of signal events per background event
1093 if (!fBkgrdFileNames) return 1;
1094 Int_t nBkgrdFiles = fBkgrdFileNames->GetEntriesFast();
1095 if (nBkgrdFiles == 0) return 1;
1097 // get the number of signal events
1099 AliRunLoader* runLoader =
1100 AliRunLoader::Open(fGAliceFileName.Data(), "SIGNAL");
1101 if (!runLoader) return 1;
1103 nEvents = runLoader->GetNumberOfEvents();
1108 for (Int_t iBkgrdFile = 0; iBkgrdFile < nBkgrdFiles; iBkgrdFile++) {
1109 // get the number of background events
1110 const char* fileName = ((TObjString*)
1111 (fBkgrdFileNames->At(iBkgrdFile)))->GetName();
1112 AliRunLoader* runLoader =
1113 AliRunLoader::Open(fileName, "BKGRD");
1114 if (!runLoader) continue;
1115 Int_t nBkgrdEvents = runLoader->GetNumberOfEvents();
1118 // get or calculate the number of signal per background events
1119 Int_t nSignalPerBkgrd = fBkgrdFileNames->At(iBkgrdFile)->GetUniqueID();
1120 if (nSignalPerBkgrd <= 0) {
1121 nSignalPerBkgrd = (nEvents-1) / nBkgrdEvents + 1;
1122 } else if (result && (result != nSignalPerBkgrd)) {
1123 AliInfo(Form("the number of signal events per background event "
1124 "will be changed from %d to %d for stream %d",
1125 nSignalPerBkgrd, result, iBkgrdFile+1));
1126 nSignalPerBkgrd = result;
1129 if (!result) result = nSignalPerBkgrd;
1130 if (nSignalPerBkgrd * nBkgrdEvents < nEvents) {
1131 AliWarning(Form("not enough background events (%d) for %d signal events "
1132 "using %d signal per background events for stream %d",
1133 nBkgrdEvents, nEvents, nSignalPerBkgrd, iBkgrdFile+1));
1140 //_____________________________________________________________________________
1141 Bool_t AliSimulation::IsSelected(TString detName, TString& detectors) const
1143 // check whether detName is contained in detectors
1144 // if yes, it is removed from detectors
1146 // check if all detectors are selected
1147 if ((detectors.CompareTo("ALL") == 0) ||
1148 detectors.BeginsWith("ALL ") ||
1149 detectors.EndsWith(" ALL") ||
1150 detectors.Contains(" ALL ")) {
1155 // search for the given detector
1156 Bool_t result = kFALSE;
1157 if ((detectors.CompareTo(detName) == 0) ||
1158 detectors.BeginsWith(detName+" ") ||
1159 detectors.EndsWith(" "+detName) ||
1160 detectors.Contains(" "+detName+" ")) {
1161 detectors.ReplaceAll(detName, "");
1165 // clean up the detectors string
1166 while (detectors.Contains(" ")) detectors.ReplaceAll(" ", " ");
1167 while (detectors.BeginsWith(" ")) detectors.Remove(0, 1);
1168 while (detectors.EndsWith(" ")) detectors.Remove(detectors.Length()-1, 1);
1173 Bool_t AliSimulation::ConvertRaw2SDigits(const char* rawDirectory, const char* esdFileName)
1176 // Steering routine to convert raw data in directory rawDirectory/ to fake SDigits.
1177 // These can be used for embedding of MC tracks into RAW data using the standard
1178 // merging procedure.
1180 // If an ESD file is given the reconstructed vertex is taken from it and stored in the event header.
1183 AliError("no gAlice object. Restart aliroot and try again.");
1186 if (gAlice->Modules()->GetEntries() > 0) {
1187 AliError("gAlice was already run. Restart aliroot and try again.");
1191 AliInfo(Form("initializing gAlice with config file %s",fConfigFileName.Data()));
1192 StdoutToAliInfo(StderrToAliError(gAlice->Init(fConfigFileName.Data());););
1196 AliCDBManager* man = AliCDBManager::Instance();
1197 man->SetRun(0); // Should this come from rawdata header ?
1201 // Get the runloader
1202 AliRunLoader* runLoader = gAlice->GetRunLoader();
1204 // Open esd file if available
1205 TFile* esdFile = TFile::Open(esdFileName);
1206 Bool_t esdOK = (esdFile != 0);
1207 AliESD* esd = new AliESD;
1210 treeESD = (TTree*) esdFile->Get("esdTree");
1212 AliWarning("No ESD tree found");
1215 treeESD->SetBranchAddress("ESD", &esd);
1219 // Create the RawReader
1220 TString fileName(rawDirectory);
1221 AliRawReader* rawReader = 0x0;
1222 if (fileName.EndsWith("/")) {
1223 rawReader = new AliRawReaderFile(fileName);
1224 } else if (fileName.EndsWith(".root")) {
1225 rawReader = new AliRawReaderRoot(fileName);
1226 } else if (!fileName.IsNull()) {
1227 rawReader = new AliRawReaderDate(fileName);
1228 rawReader->SelectEvents(7);
1230 // if (!fEquipIdMap.IsNull() && fRawReader)
1231 // fRawReader->LoadEquipmentIdsMap(fEquipIdMap);
1233 // Get list of detectors
1234 TObjArray* detArray = runLoader->GetAliRun()->Detectors();
1237 AliHeader* header = runLoader->GetHeader();
1239 TString detStr = fMakeSDigits;
1243 if (!(rawReader->NextEvent())) break;
1246 for (iDet = 0; iDet < detArray->GetEntriesFast(); iDet++) {
1247 AliModule* det = (AliModule*) detArray->At(iDet);
1248 if (!det || !det->IsActive()) continue;
1249 if (IsSelected(det->GetName(), detStr)) {
1250 AliInfo(Form("Calling Raw2SDigits for %s\n", det->GetName()));
1251 det->Raw2SDigits(rawReader);
1257 // If ESD information available obtain reconstructed vertex and store in header.
1259 treeESD->GetEvent(nev);
1260 const AliESDVertex* esdVertex = esd->GetPrimaryVertex();
1261 Double_t position[3];
1262 esdVertex->GetXYZ(position);
1263 AliGenEventHeader* mcHeader = new AliGenEventHeader("ESD");
1266 for (Int_t i = 0; i < 3; i++) mcV[i] = position[i];
1267 mcHeader->SetPrimaryVertex(mcV);
1268 header->Reset(0,nev);
1269 header->SetGenEventHeader(mcHeader);
1270 printf("***** Saved vertex %f %f %f \n", position[0], position[1], position[2]);
1275 runLoader->TreeE()->Fill();
1276 runLoader->SetNextEvent();
1282 runLoader->CdGAFile();
1283 runLoader->WriteHeader("OVERWRITE");
1284 runLoader->WriteRunLoader();