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"
135 #include "AliHeader.h"
136 #include "AliGenEventHeader.h"
139 ClassImp(AliSimulation)
141 AliSimulation *AliSimulation::fgInstance = 0;
143 //_____________________________________________________________________________
144 AliSimulation::AliSimulation(const char* configFileName, const char* cdbUri,
145 const char* name, const char* title) :
148 fRunGeneration(kTRUE),
149 fRunSimulation(kTRUE),
150 fLoadAlignFromCDB(kTRUE),
151 fLoadAlObjsListOfDets("ALL"),
155 fMakeDigitsFromHits(""),
157 fRawDataFileName(""),
158 fDeleteIntermediateFiles(kFALSE),
159 fStopOnError(kFALSE),
162 fConfigFileName(configFileName),
163 fGAliceFileName("galice.root"),
165 fBkgrdFileNames(NULL),
166 fAlignObjArray(NULL),
167 fUseBkgrdVertex(kTRUE),
168 fRegionOfInterest(kFALSE),
171 fEmbeddingFlag(kFALSE)
173 // create simulation object with default parameters
175 SetGAliceFile("galice.root");
178 //_____________________________________________________________________________
179 AliSimulation::AliSimulation(const AliSimulation& sim) :
182 fRunGeneration(sim.fRunGeneration),
183 fRunSimulation(sim.fRunSimulation),
184 fLoadAlignFromCDB(sim.fLoadAlignFromCDB),
185 fLoadAlObjsListOfDets(sim.fLoadAlObjsListOfDets),
186 fMakeSDigits(sim.fMakeSDigits),
187 fMakeDigits(sim.fMakeDigits),
188 fMakeTrigger(sim.fMakeTrigger),
189 fMakeDigitsFromHits(sim.fMakeDigitsFromHits),
190 fWriteRawData(sim.fWriteRawData),
191 fRawDataFileName(""),
192 fDeleteIntermediateFiles(kFALSE),
193 fStopOnError(sim.fStopOnError),
195 fNEvents(sim.fNEvents),
196 fConfigFileName(sim.fConfigFileName),
197 fGAliceFileName(sim.fGAliceFileName),
199 fBkgrdFileNames(NULL),
200 fAlignObjArray(NULL),
201 fUseBkgrdVertex(sim.fUseBkgrdVertex),
202 fRegionOfInterest(sim.fRegionOfInterest),
203 fCDBUri(sim.fCDBUri),
205 fEmbeddingFlag(sim.fEmbeddingFlag)
209 for (Int_t i = 0; i < sim.fEventsPerFile.GetEntriesFast(); i++) {
210 if (!sim.fEventsPerFile[i]) continue;
211 fEventsPerFile.Add(sim.fEventsPerFile[i]->Clone());
214 fBkgrdFileNames = new TObjArray;
215 for (Int_t i = 0; i < sim.fBkgrdFileNames->GetEntriesFast(); i++) {
216 if (!sim.fBkgrdFileNames->At(i)) continue;
217 fBkgrdFileNames->Add(sim.fBkgrdFileNames->At(i)->Clone());
220 for (Int_t i = 0; i < sim.fSpecCDBUri.GetEntriesFast(); i++) {
221 if (sim.fSpecCDBUri[i]) fSpecCDBUri.Add(sim.fSpecCDBUri[i]->Clone());
226 //_____________________________________________________________________________
227 AliSimulation& AliSimulation::operator = (const AliSimulation& sim)
229 // assignment operator
231 this->~AliSimulation();
232 new(this) AliSimulation(sim);
236 //_____________________________________________________________________________
237 AliSimulation::~AliSimulation()
241 fEventsPerFile.Delete();
242 // if(fAlignObjArray) fAlignObjArray->Delete(); // fAlignObjArray->RemoveAll() ???
243 // delete fAlignObjArray; fAlignObjArray=0;
245 if (fBkgrdFileNames) {
246 fBkgrdFileNames->Delete();
247 delete fBkgrdFileNames;
250 fSpecCDBUri.Delete();
251 if (fgInstance==this) fgInstance = 0;
253 AliCodeTimer::Instance()->Print();
257 //_____________________________________________________________________________
258 void AliSimulation::SetNumberOfEvents(Int_t nEvents)
260 // set the number of events for one run
265 //_____________________________________________________________________________
266 void AliSimulation::InitCDBStorage()
268 // activate a default CDB storage
269 // First check if we have any CDB storage set, because it is used
270 // to retrieve the calibration and alignment constants
272 AliCDBManager* man = AliCDBManager::Instance();
273 if (man->IsDefaultStorageSet())
275 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
276 AliWarning("Default CDB storage has been already set !");
277 AliWarning(Form("Ignoring the default storage declared in AliReconstruction: %s",fCDBUri.Data()));
278 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
282 AliDebug(2,"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
283 AliDebug(2, Form("Default CDB storage is set to: %s",fCDBUri.Data()));
284 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
285 man->SetDefaultStorage(fCDBUri);
288 // Now activate the detector specific CDB storage locations
289 for (Int_t i = 0; i < fSpecCDBUri.GetEntriesFast(); i++) {
290 TObject* obj = fSpecCDBUri[i];
292 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
293 AliDebug(2, Form("Specific CDB storage for %s is set to: %s",obj->GetName(),obj->GetTitle()));
294 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
295 man->SetSpecificStorage(obj->GetName(), obj->GetTitle());
300 //_____________________________________________________________________________
301 void AliSimulation::SetDefaultStorage(const char* uri) {
302 // Store the desired default CDB storage location
303 // Activate it later within the Run() method
309 //_____________________________________________________________________________
310 void AliSimulation::SetSpecificStorage(const char* calibType, const char* uri) {
311 // Store a detector-specific CDB storage location
312 // Activate it later within the Run() method
314 AliCDBPath aPath(calibType);
315 if(!aPath.IsValid()){
316 AliError(Form("Not a valid path: %s", calibType));
320 TObject* obj = fSpecCDBUri.FindObject(calibType);
321 if (obj) fSpecCDBUri.Remove(obj);
322 fSpecCDBUri.Add(new TNamed(calibType, uri));
326 //_____________________________________________________________________________
327 void AliSimulation::SetConfigFile(const char* fileName)
329 // set the name of the config file
331 fConfigFileName = fileName;
334 //_____________________________________________________________________________
335 void AliSimulation::SetGAliceFile(const char* fileName)
337 // set the name of the galice file
338 // the path is converted to an absolute one if it is relative
340 fGAliceFileName = fileName;
341 if (!gSystem->IsAbsoluteFileName(fGAliceFileName)) {
342 char* absFileName = gSystem->ConcatFileName(gSystem->WorkingDirectory(),
344 fGAliceFileName = absFileName;
345 delete[] absFileName;
348 AliDebug(2, Form("galice file name set to %s", fileName));
351 //_____________________________________________________________________________
352 void AliSimulation::SetEventsPerFile(const char* detector, const char* type,
355 // set the number of events per file for the given detector and data type
356 // ("Hits", "Summable Digits", "Digits", "Reconstructed Points" or "Tracks")
358 TNamed* obj = new TNamed(detector, type);
359 obj->SetUniqueID(nEvents);
360 fEventsPerFile.Add(obj);
363 //_____________________________________________________________________________
364 Bool_t AliSimulation::MisalignGeometry(AliRunLoader *runLoader)
366 // Read the alignment objects from CDB.
367 // Each detector is supposed to have the
368 // alignment objects in DET/Align/Data CDB path.
369 // All the detector objects are then collected,
370 // sorted by geometry level (starting from ALIC) and
371 // then applied to the TGeo geometry.
372 // Finally an overlaps check is performed.
374 if (!AliGeomManager::GetGeometry() || !AliGeomManager::GetGeometry()->IsClosed()) {
375 AliError("Can't apply the misalignment! Geometry is not loaded or it is still opened!");
378 Bool_t delRunLoader = kFALSE;
380 runLoader = LoadRun("READ");
381 if (!runLoader) return kFALSE;
382 delRunLoader = kTRUE;
385 // Export ideal geometry
386 AliGeomManager::GetGeometry()->Export("geometry.root");
388 // Load alignment data from CDB and apply to geometry through AliGeomManager
389 if(fLoadAlignFromCDB){
391 TString detStr = fLoadAlObjsListOfDets;
392 TString loadAlObjsListOfDets = "";
394 TObjArray* detArray = runLoader->GetAliRun()->Detectors();
395 for (Int_t iDet = 0; iDet < detArray->GetEntriesFast(); iDet++) {
396 AliModule* det = (AliModule*) detArray->At(iDet);
397 if (!det || !det->IsActive()) continue;
398 if (IsSelected(det->GetName(), detStr)) {
399 //add det to list of dets to be aligned from CDB
400 loadAlObjsListOfDets += det->GetName();
401 loadAlObjsListOfDets += " ";
403 } // end loop over detectors
404 AliGeomManager::ApplyAlignObjsFromCDB(loadAlObjsListOfDets.Data());
406 // Check if the array with alignment objects was
407 // provided by the user. If yes, apply the objects
408 // to the present TGeo geometry
409 if (fAlignObjArray) {
410 if (AliGeomManager::ApplyAlignObjsToGeom(*fAlignObjArray) == kFALSE) {
411 AliError("The misalignment of one or more volumes failed!"
412 "Compare the list of simulated detectors and the list of detector alignment data!");
413 if (delRunLoader) delete runLoader;
419 // Update the internal geometry of modules (ITS needs it)
420 TString detStr = fLoadAlObjsListOfDets;
421 TObjArray* detArray = runLoader->GetAliRun()->Detectors();
422 for (Int_t iDet = 0; iDet < detArray->GetEntriesFast(); iDet++) {
424 AliModule* det = (AliModule*) detArray->At(iDet);
425 if (!det || !det->IsActive()) continue;
426 if (IsSelected(det->GetName(), detStr)) {
427 det->UpdateInternalGeometry();
429 } // end loop over detectors
432 if (delRunLoader) delete runLoader;
438 //_____________________________________________________________________________
439 Bool_t AliSimulation::SetRunNumber()
441 // Set the CDB manager run number
442 // The run number is retrieved from gAlice
444 if(AliCDBManager::Instance()->GetRun() < 0) {
445 AliRunLoader* runLoader = LoadRun("READ");
446 if (!runLoader) return kFALSE;
448 AliCDBManager::Instance()->SetRun(runLoader->GetAliRun()->GetRunNumber());
449 AliInfo(Form("Run number: %d",AliCDBManager::Instance()->GetRun()));
456 //_____________________________________________________________________________
457 void AliSimulation::MergeWith(const char* fileName, Int_t nSignalPerBkgrd)
459 // add a file with background events for merging
461 TObjString* fileNameStr = new TObjString(fileName);
462 fileNameStr->SetUniqueID(nSignalPerBkgrd);
463 if (!fBkgrdFileNames) fBkgrdFileNames = new TObjArray;
464 fBkgrdFileNames->Add(fileNameStr);
467 void AliSimulation::EmbedInto(const char* fileName, Int_t nSignalPerBkgrd)
469 // add a file with background events for embeddin
470 MergeWith(fileName, nSignalPerBkgrd);
471 fEmbeddingFlag = kTRUE;
474 //_____________________________________________________________________________
475 Bool_t AliSimulation::Run(Int_t nEvents)
477 // run the generation, simulation and digitization
483 if (nEvents > 0) fNEvents = nEvents;
485 // generation and simulation -> hits
486 if (fRunGeneration) {
487 if (!RunSimulation()) if (fStopOnError) return kFALSE;
490 // Set run number in CDBManager (if it is not already set in RunSimulation)
491 if (!SetRunNumber()) if (fStopOnError) return kFALSE;
493 // If RunSimulation was not called, load the geometry and misalign it
494 if (!AliGeomManager::GetGeometry()) {
495 // Initialize the geometry manager
496 AliGeomManager::LoadGeometry("geometry.root");
497 if (!AliGeomManager::GetGeometry()) if (fStopOnError) return kFALSE;
499 if(!MisalignGeometry()) if (fStopOnError) return kFALSE;
502 // hits -> summable digits
503 if (!fMakeSDigits.IsNull()) {
504 if (!RunSDigitization(fMakeSDigits)) if (fStopOnError) return kFALSE;
507 // summable digits -> digits
508 if (!fMakeDigits.IsNull()) {
509 if (!RunDigitization(fMakeDigits, fMakeDigitsFromHits)) {
510 if (fStopOnError) return kFALSE;
515 if (!fMakeDigitsFromHits.IsNull()) {
516 if (fBkgrdFileNames && (fBkgrdFileNames->GetEntriesFast() > 0)) {
517 AliWarning(Form("Merging and direct creation of digits from hits "
518 "was selected for some detectors. "
519 "No merging will be done for the following detectors: %s",
520 fMakeDigitsFromHits.Data()));
522 if (!RunHitsDigitization(fMakeDigitsFromHits)) {
523 if (fStopOnError) return kFALSE;
528 if (!RunTrigger(fMakeTrigger)) {
529 if (fStopOnError) return kFALSE;
532 // digits -> raw data
533 if (!fWriteRawData.IsNull()) {
534 if (!WriteRawData(fWriteRawData, fRawDataFileName,
535 fDeleteIntermediateFiles)) {
536 if (fStopOnError) return kFALSE;
543 //_____________________________________________________________________________
544 Bool_t AliSimulation::RunTrigger(const char* descriptors)
550 AliRunLoader* runLoader = LoadRun("READ");
551 if (!runLoader) return kFALSE;
552 TString des = descriptors;
555 if (gAlice->GetTriggerDescriptor() != "") {
556 des = gAlice->GetTriggerDescriptor();
559 AliWarning("No trigger descriptor is specified. Skipping the trigger simulation...");
564 runLoader->MakeTree( "GG" );
565 AliCentralTrigger* aCTP = runLoader->GetTrigger();
567 aCTP->LoadDescriptor( des );
570 if( !aCTP->RunTrigger( runLoader ) ) {
582 //_____________________________________________________________________________
583 Bool_t AliSimulation::WriteTriggerRawData()
585 // Writes the CTP (trigger) DDL raw data
586 // Details of the format are given in the
587 // trigger TDR - pages 134 and 135.
588 AliCTPRawData writer;
594 //_____________________________________________________________________________
595 Bool_t AliSimulation::RunSimulation(Int_t nEvents)
597 // run the generation and simulation
602 AliError("no gAlice object. Restart aliroot and try again.");
605 if (gAlice->Modules()->GetEntries() > 0) {
606 AliError("gAlice was already run. Restart aliroot and try again.");
610 AliInfo(Form("initializing gAlice with config file %s",
611 fConfigFileName.Data()));
612 StdoutToAliInfo(StderrToAliError(
613 gAlice->Init(fConfigFileName.Data());
616 // Get the trigger descriptor string
617 // Either from AliSimulation or from
619 if (fMakeTrigger.IsNull()) {
620 if (gAlice->GetTriggerDescriptor() != "")
621 fMakeTrigger = gAlice->GetTriggerDescriptor();
624 gAlice->SetTriggerDescriptor(fMakeTrigger.Data());
626 // Set run number in CDBManager
627 AliInfo(Form("Run number: %d",AliCDBManager::Instance()->GetRun()));
629 AliRunLoader* runLoader = gAlice->GetRunLoader();
631 AliError(Form("gAlice has no run loader object. "
632 "Check your config file: %s", fConfigFileName.Data()));
635 SetGAliceFile(runLoader->GetFileName());
638 #if ROOT_VERSION_CODE < 331527
639 AliGeomManager::SetGeometry(gGeoManager);
640 MisalignGeometry(runLoader);
643 // AliRunLoader* runLoader = gAlice->GetRunLoader();
645 // AliError(Form("gAlice has no run loader object. "
646 // "Check your config file: %s", fConfigFileName.Data()));
649 // SetGAliceFile(runLoader->GetFileName());
651 if (!gAlice->Generator()) {
652 AliError(Form("gAlice has no generator object. "
653 "Check your config file: %s", fConfigFileName.Data()));
656 if (nEvents <= 0) nEvents = fNEvents;
658 // get vertex from background file in case of merging
659 if (fUseBkgrdVertex &&
660 fBkgrdFileNames && (fBkgrdFileNames->GetEntriesFast() > 0)) {
661 Int_t signalPerBkgrd = GetNSignalPerBkgrd(nEvents);
662 const char* fileName = ((TObjString*)
663 (fBkgrdFileNames->At(0)))->GetName();
664 AliInfo(Form("The vertex will be taken from the background "
665 "file %s with nSignalPerBackground = %d",
666 fileName, signalPerBkgrd));
667 AliVertexGenFile* vtxGen = new AliVertexGenFile(fileName, signalPerBkgrd);
668 gAlice->Generator()->SetVertexGenerator(vtxGen);
671 if (!fRunSimulation) {
672 gAlice->Generator()->SetTrackingFlag(0);
675 // set the number of events per file for given detectors and data types
676 for (Int_t i = 0; i < fEventsPerFile.GetEntriesFast(); i++) {
677 if (!fEventsPerFile[i]) continue;
678 const char* detName = fEventsPerFile[i]->GetName();
679 const char* typeName = fEventsPerFile[i]->GetTitle();
680 TString loaderName(detName);
681 loaderName += "Loader";
682 AliLoader* loader = runLoader->GetLoader(loaderName);
684 AliError(Form("RunSimulation", "no loader for %s found\n"
685 "Number of events per file not set for %s %s",
686 detName, typeName, detName));
689 AliDataLoader* dataLoader =
690 loader->GetDataLoader(typeName);
692 AliError(Form("no data loader for %s found\n"
693 "Number of events per file not set for %s %s",
694 typeName, detName, typeName));
697 dataLoader->SetNumberOfEventsPerFile(fEventsPerFile[i]->GetUniqueID());
698 AliDebug(1, Form("number of events per file set to %d for %s %s",
699 fEventsPerFile[i]->GetUniqueID(), detName, typeName));
702 AliInfo("running gAlice");
703 StdoutToAliInfo(StderrToAliError(
704 gAlice->Run(nEvents);
713 //_____________________________________________________________________________
714 Bool_t AliSimulation::RunSDigitization(const char* detectors)
716 // run the digitization and produce summable digits
720 AliRunLoader* runLoader = LoadRun();
721 if (!runLoader) return kFALSE;
723 TString detStr = detectors;
724 TObjArray* detArray = runLoader->GetAliRun()->Detectors();
725 for (Int_t iDet = 0; iDet < detArray->GetEntriesFast(); iDet++) {
726 AliModule* det = (AliModule*) detArray->At(iDet);
727 if (!det || !det->IsActive()) continue;
728 if (IsSelected(det->GetName(), detStr)) {
729 AliInfo(Form("creating summable digits for %s", det->GetName()));
730 AliCodeTimerAuto(Form("creating summable digits for %s", det->GetName()));
735 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
736 AliError(Form("the following detectors were not found: %s",
738 if (fStopOnError) return kFALSE;
747 //_____________________________________________________________________________
748 Bool_t AliSimulation::RunDigitization(const char* detectors,
749 const char* excludeDetectors)
751 // run the digitization and produce digits from sdigits
755 while (AliRunLoader::GetRunLoader()) delete AliRunLoader::GetRunLoader();
756 if (gAlice) delete gAlice;
760 if (fBkgrdFileNames) nStreams = fBkgrdFileNames->GetEntriesFast() + 1;
761 Int_t signalPerBkgrd = GetNSignalPerBkgrd();
762 AliRunDigitizer* manager = new AliRunDigitizer(nStreams, signalPerBkgrd);
763 // manager->SetEmbeddingFlag(fEmbeddingFlag);
764 manager->SetInputStream(0, fGAliceFileName.Data());
765 for (Int_t iStream = 1; iStream < nStreams; iStream++) {
766 const char* fileName = ((TObjString*)
767 (fBkgrdFileNames->At(iStream-1)))->GetName();
768 manager->SetInputStream(iStream, fileName);
771 TString detStr = detectors;
772 TString detExcl = excludeDetectors;
773 manager->GetInputStream(0)->ImportgAlice();
774 AliRunLoader* runLoader =
775 AliRunLoader::GetRunLoader(manager->GetInputStream(0)->GetFolderName());
776 TObjArray* detArray = runLoader->GetAliRun()->Detectors();
777 for (Int_t iDet = 0; iDet < detArray->GetEntriesFast(); iDet++) {
778 AliModule* det = (AliModule*) detArray->At(iDet);
779 if (!det || !det->IsActive()) continue;
780 if (IsSelected(det->GetName(), detStr) &&
781 !IsSelected(det->GetName(), detExcl)) {
782 AliDigitizer* digitizer = det->CreateDigitizer(manager);
785 AliError(Form("no digitizer for %s", det->GetName()));
786 if (fStopOnError) return kFALSE;
788 digitizer->SetRegionOfInterest(fRegionOfInterest);
793 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
794 AliError(Form("the following detectors were not found: %s",
796 if (fStopOnError) return kFALSE;
799 if (!manager->GetListOfTasks()->IsEmpty()) {
800 AliInfo("executing digitization");
809 //_____________________________________________________________________________
810 Bool_t AliSimulation::RunHitsDigitization(const char* detectors)
812 // run the digitization and produce digits from hits
816 AliRunLoader* runLoader = LoadRun("READ");
817 if (!runLoader) return kFALSE;
819 TString detStr = detectors;
820 TObjArray* detArray = runLoader->GetAliRun()->Detectors();
821 for (Int_t iDet = 0; iDet < detArray->GetEntriesFast(); iDet++) {
822 AliModule* det = (AliModule*) detArray->At(iDet);
823 if (!det || !det->IsActive()) continue;
824 if (IsSelected(det->GetName(), detStr)) {
825 AliInfo(Form("creating digits from hits for %s", det->GetName()));
830 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
831 AliError(Form("the following detectors were not found: %s",
833 if (fStopOnError) return kFALSE;
837 //PH Temporary fix to avoid interference with the PHOS loder/getter
838 //PH The problem has to be solved in more general way 09/06/05
843 //_____________________________________________________________________________
844 Bool_t AliSimulation::WriteRawData(const char* detectors,
845 const char* fileName,
846 Bool_t deleteIntermediateFiles)
848 // convert the digits to raw data
849 // First DDL raw data files for the given detectors are created.
850 // If a file name is given, the DDL files are then converted to a DATE file.
851 // If deleteIntermediateFiles is true, the DDL raw files are deleted
853 // If the file name has the extension ".root", the DATE file is converted
855 // If deleteIntermediateFiles is true, the DATE file is deleted afterwards.
859 if (!WriteRawFiles(detectors)) {
860 if (fStopOnError) return kFALSE;
863 TString dateFileName(fileName);
864 if (!dateFileName.IsNull()) {
865 Bool_t rootOutput = dateFileName.EndsWith(".root");
866 if (rootOutput) dateFileName += ".date";
867 if (!ConvertRawFilesToDate(dateFileName)) {
868 if (fStopOnError) return kFALSE;
870 if (deleteIntermediateFiles) {
871 AliRunLoader* runLoader = LoadRun("READ");
872 if (runLoader) for (Int_t iEvent = 0;
873 iEvent < runLoader->GetNumberOfEvents(); iEvent++) {
875 sprintf(command, "rm -r raw%d", iEvent);
876 gSystem->Exec(command);
881 if (!ConvertDateToRoot(dateFileName, fileName)) {
882 if (fStopOnError) return kFALSE;
884 if (deleteIntermediateFiles) {
885 gSystem->Unlink(dateFileName);
893 //_____________________________________________________________________________
894 Bool_t AliSimulation::WriteRawFiles(const char* detectors)
896 // convert the digits to raw data DDL files
900 AliRunLoader* runLoader = LoadRun("READ");
901 if (!runLoader) return kFALSE;
903 // write raw data to DDL files
904 for (Int_t iEvent = 0; iEvent < runLoader->GetNumberOfEvents(); iEvent++) {
905 AliInfo(Form("processing event %d", iEvent));
906 runLoader->GetEvent(iEvent);
907 TString baseDir = gSystem->WorkingDirectory();
909 sprintf(dirName, "raw%d", iEvent);
910 gSystem->MakeDirectory(dirName);
911 if (!gSystem->ChangeDirectory(dirName)) {
912 AliError(Form("couldn't change to directory %s", dirName));
913 if (fStopOnError) return kFALSE; else continue;
916 TString detStr = detectors;
917 TObjArray* detArray = runLoader->GetAliRun()->Detectors();
918 for (Int_t iDet = 0; iDet < detArray->GetEntriesFast(); iDet++) {
919 AliModule* det = (AliModule*) detArray->At(iDet);
920 if (!det || !det->IsActive()) continue;
921 if (IsSelected(det->GetName(), detStr)) {
922 AliInfo(Form("creating raw data from digits for %s", det->GetName()));
927 if (!WriteTriggerRawData())
928 if (fStopOnError) return kFALSE;
930 gSystem->ChangeDirectory(baseDir);
931 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
932 AliError(Form("the following detectors were not found: %s",
934 if (fStopOnError) return kFALSE;
943 //_____________________________________________________________________________
944 Bool_t AliSimulation::ConvertRawFilesToDate(const char* dateFileName)
946 // convert raw data DDL files to a DATE file with the program "dateStream"
950 char* path = gSystem->Which(gSystem->Getenv("PATH"), "dateStream");
952 AliError("the program dateStream was not found");
953 if (fStopOnError) return kFALSE;
958 AliRunLoader* runLoader = LoadRun("READ");
959 if (!runLoader) return kFALSE;
961 AliInfo(Form("converting raw data DDL files to DATE file %s", dateFileName));
963 // Note the option -s. It is used in order to avoid
964 // the generation of SOR/EOR events.
965 sprintf(command, "dateStream -s -D -o %s -# %d -C",
966 dateFileName, runLoader->GetNumberOfEvents());
967 FILE* pipe = gSystem->OpenPipe(command, "w");
969 for (Int_t iEvent = 0; iEvent < runLoader->GetNumberOfEvents(); iEvent++) {
970 fprintf(pipe, "GDC\n");
974 // loop over detectors and DDLs
975 for (Int_t iDet = 0; iDet < AliDAQ::kNDetectors; iDet++) {
976 for (Int_t iDDL = 0; iDDL < AliDAQ::NumberOfDdls(iDet); iDDL++) {
978 Int_t ddlID = AliDAQ::DdlID(iDet,iDDL);
979 Int_t ldcID = Int_t(ldc + 0.0001);
980 ldc += AliDAQ::NumberOfLdcs(iDet) / AliDAQ::NumberOfDdls(iDet);
982 char rawFileName[256];
983 sprintf(rawFileName, "raw%d/%s",
984 iEvent, AliDAQ::DdlFileName(iDet,iDDL));
986 // check existence and size of raw data file
987 FILE* file = fopen(rawFileName, "rb");
989 fseek(file, 0, SEEK_END);
990 unsigned long size = ftell(file);
994 if (ldcID != prevLDC) {
995 fprintf(pipe, " LDC Id %d\n", ldcID);
998 fprintf(pipe, " Equipment Id %d Payload %s\n", ddlID, rawFileName);
1003 Int_t result = gSystem->ClosePipe(pipe);
1006 return (result == 0);
1009 //_____________________________________________________________________________
1010 Bool_t AliSimulation::ConvertDateToRoot(const char* dateFileName,
1011 const char* rootFileName)
1013 // convert a DATE file to a root file with the program "alimdc"
1016 const Int_t kDBSize = 2000000000;
1017 const Int_t kTagDBSize = 1000000000;
1018 const Bool_t kFilter = kFALSE;
1019 const Int_t kCompression = 0;
1021 char* path = gSystem->Which(gSystem->Getenv("PATH"), "alimdc");
1023 AliError("the program alimdc was not found");
1024 if (fStopOnError) return kFALSE;
1029 AliInfo(Form("converting DATE file %s to root file %s",
1030 dateFileName, rootFileName));
1032 const char* rawDBFS[2] = { "/tmp/mdc1", "/tmp/mdc2" };
1033 const char* tagDBFS = "/tmp/mdc1/tags";
1035 // User defined file system locations
1036 if (gSystem->Getenv("ALIMDC_RAWDB1"))
1037 rawDBFS[0] = gSystem->Getenv("ALIMDC_RAWDB1");
1038 if (gSystem->Getenv("ALIMDC_RAWDB2"))
1039 rawDBFS[1] = gSystem->Getenv("ALIMDC_RAWDB2");
1040 if (gSystem->Getenv("ALIMDC_TAGDB"))
1041 tagDBFS = gSystem->Getenv("ALIMDC_TAGDB");
1043 gSystem->Exec(Form("rm -rf %s",rawDBFS[0]));
1044 gSystem->Exec(Form("rm -rf %s",rawDBFS[1]));
1045 gSystem->Exec(Form("rm -rf %s",tagDBFS));
1047 gSystem->Exec(Form("mkdir %s",rawDBFS[0]));
1048 gSystem->Exec(Form("mkdir %s",rawDBFS[1]));
1049 gSystem->Exec(Form("mkdir %s",tagDBFS));
1051 Int_t result = gSystem->Exec(Form("alimdc %d %d %d %d %s",
1052 kDBSize, kTagDBSize, kFilter, kCompression, dateFileName));
1053 gSystem->Exec(Form("mv %s/*.root %s", rawDBFS[0], rootFileName));
1055 gSystem->Exec(Form("rm -rf %s",rawDBFS[0]));
1056 gSystem->Exec(Form("rm -rf %s",rawDBFS[1]));
1057 gSystem->Exec(Form("rm -rf %s",tagDBFS));
1059 return (result == 0);
1063 //_____________________________________________________________________________
1064 AliRunLoader* AliSimulation::LoadRun(const char* mode) const
1066 // delete existing run loaders, open a new one and load gAlice
1068 while (AliRunLoader::GetRunLoader()) delete AliRunLoader::GetRunLoader();
1069 AliRunLoader* runLoader =
1070 AliRunLoader::Open(fGAliceFileName.Data(),
1071 AliConfig::GetDefaultEventFolderName(), mode);
1073 AliError(Form("no run loader found in file %s", fGAliceFileName.Data()));
1076 runLoader->LoadgAlice();
1077 gAlice = runLoader->GetAliRun();
1079 AliError(Form("no gAlice object found in file %s",
1080 fGAliceFileName.Data()));
1086 //_____________________________________________________________________________
1087 Int_t AliSimulation::GetNSignalPerBkgrd(Int_t nEvents) const
1089 // get or calculate the number of signal events per background event
1091 if (!fBkgrdFileNames) return 1;
1092 Int_t nBkgrdFiles = fBkgrdFileNames->GetEntriesFast();
1093 if (nBkgrdFiles == 0) return 1;
1095 // get the number of signal events
1097 AliRunLoader* runLoader =
1098 AliRunLoader::Open(fGAliceFileName.Data(), "SIGNAL");
1099 if (!runLoader) return 1;
1101 nEvents = runLoader->GetNumberOfEvents();
1106 for (Int_t iBkgrdFile = 0; iBkgrdFile < nBkgrdFiles; iBkgrdFile++) {
1107 // get the number of background events
1108 const char* fileName = ((TObjString*)
1109 (fBkgrdFileNames->At(iBkgrdFile)))->GetName();
1110 AliRunLoader* runLoader =
1111 AliRunLoader::Open(fileName, "BKGRD");
1112 if (!runLoader) continue;
1113 Int_t nBkgrdEvents = runLoader->GetNumberOfEvents();
1116 // get or calculate the number of signal per background events
1117 Int_t nSignalPerBkgrd = fBkgrdFileNames->At(iBkgrdFile)->GetUniqueID();
1118 if (nSignalPerBkgrd <= 0) {
1119 nSignalPerBkgrd = (nEvents-1) / nBkgrdEvents + 1;
1120 } else if (result && (result != nSignalPerBkgrd)) {
1121 AliInfo(Form("the number of signal events per background event "
1122 "will be changed from %d to %d for stream %d",
1123 nSignalPerBkgrd, result, iBkgrdFile+1));
1124 nSignalPerBkgrd = result;
1127 if (!result) result = nSignalPerBkgrd;
1128 if (nSignalPerBkgrd * nBkgrdEvents < nEvents) {
1129 AliWarning(Form("not enough background events (%d) for %d signal events "
1130 "using %d signal per background events for stream %d",
1131 nBkgrdEvents, nEvents, nSignalPerBkgrd, iBkgrdFile+1));
1138 //_____________________________________________________________________________
1139 Bool_t AliSimulation::IsSelected(TString detName, TString& detectors) const
1141 // check whether detName is contained in detectors
1142 // if yes, it is removed from detectors
1144 // check if all detectors are selected
1145 if ((detectors.CompareTo("ALL") == 0) ||
1146 detectors.BeginsWith("ALL ") ||
1147 detectors.EndsWith(" ALL") ||
1148 detectors.Contains(" ALL ")) {
1153 // search for the given detector
1154 Bool_t result = kFALSE;
1155 if ((detectors.CompareTo(detName) == 0) ||
1156 detectors.BeginsWith(detName+" ") ||
1157 detectors.EndsWith(" "+detName) ||
1158 detectors.Contains(" "+detName+" ")) {
1159 detectors.ReplaceAll(detName, "");
1163 // clean up the detectors string
1164 while (detectors.Contains(" ")) detectors.ReplaceAll(" ", " ");
1165 while (detectors.BeginsWith(" ")) detectors.Remove(0, 1);
1166 while (detectors.EndsWith(" ")) detectors.Remove(detectors.Length()-1, 1);
1171 Bool_t AliSimulation::ConvertRaw2SDigits(const char* rawDirectory, const char* esdFileName)
1174 // Steering routine to convert raw data in directory rawDirectory/ to fake SDigits.
1175 // These can be used for embedding of MC tracks into RAW data using the standard
1176 // merging procedure.
1178 // If an ESD file is given the reconstructed vertex is taken from it and stored in the event header.
1181 AliError("no gAlice object. Restart aliroot and try again.");
1184 if (gAlice->Modules()->GetEntries() > 0) {
1185 AliError("gAlice was already run. Restart aliroot and try again.");
1189 AliInfo(Form("initializing gAlice with config file %s",fConfigFileName.Data()));
1190 StdoutToAliInfo(StderrToAliError(gAlice->Init(fConfigFileName.Data());););
1194 AliCDBManager* man = AliCDBManager::Instance();
1195 man->SetRun(0); // Should this come from rawdata header ?
1199 // Get the runloader
1200 AliRunLoader* runLoader = gAlice->GetRunLoader();
1202 // Open esd file if available
1203 TFile* esdFile = TFile::Open(esdFileName);
1204 Bool_t esdOK = (esdFile != 0);
1205 AliESD* esd = new AliESD;
1208 treeESD = (TTree*) esdFile->Get("esdTree");
1210 AliWarning("No ESD tree found");
1213 treeESD->SetBranchAddress("ESD", &esd);
1217 // Create the RawReader
1218 AliRawReaderFile* rawReader = new AliRawReaderFile(rawDirectory);
1220 // Get list of detectors
1221 TObjArray* detArray = runLoader->GetAliRun()->Detectors();
1224 AliHeader* header = runLoader->GetHeader();
1229 if (!(rawReader->NextEvent())) break;
1232 for (iDet = 0; iDet < detArray->GetEntriesFast(); iDet++) {
1233 AliModule* det = (AliModule*) detArray->At(iDet);
1234 AliInfo(Form("Calling Raw2SDigits for %s\n", det->GetName()));
1235 det->Raw2SDigits(rawReader);
1240 // If ESD information available obtain reconstructed vertex and store in header.
1242 treeESD->GetEvent(nev);
1243 const AliESDVertex* esdVertex = esd->GetPrimaryVertex();
1244 Double_t position[3];
1245 esdVertex->GetXYZ(position);
1246 AliGenEventHeader* mcHeader = new AliGenEventHeader("ESD");
1249 for (Int_t i = 0; i < 3; i++) mcV[i] = position[i];
1250 mcHeader->SetPrimaryVertex(mcV);
1251 header->Reset(0,nev);
1252 header->SetGenEventHeader(mcHeader);
1253 printf("***** Saved vertex %f %f %f \n", position[0], position[1], position[2]);
1258 runLoader->TreeE()->Fill();
1259 runLoader->SetNextEvent();
1265 runLoader->CdGAFile();
1266 runLoader->WriteHeader("OVERWRITE");
1267 runLoader->WriteRunLoader();