]> git.uio.no Git - u/mrichter/AliRoot.git/blame - STEER/AliSimulation.cxx
commented logging message
[u/mrichter/AliRoot.git] / STEER / AliSimulation.cxx
CommitLineData
85a5290f 1/**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
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 **************************************************************************/
15
16/* $Id$ */
17
18///////////////////////////////////////////////////////////////////////////////
19// //
20// class for running generation, simulation and digitization //
21// //
22// Hits, sdigits and digits are created for all detectors by typing: //
23// //
24// AliSimulation sim; //
25// sim.Run(); //
26// //
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 //
29// can be set by //
30// //
31// sim.SetNumberOfEvents(n); //
32// //
95601147 33// The name of the configuration file can be passed as argument to the //
34// AliSimulation constructor or can be specified by //
85a5290f 35// //
36// sim.SetConfigFile("..."); //
37// //
38// The generation of particles and the simulation of detector hits can be //
39// switched on or off by //
40// //
41// sim.SetRunGeneration(kTRUE); // generation of primary particles //
42// sim.SetRunSimulation(kFALSE); // but no tracking //
43// //
44// For which detectors sdigits and digits will be created, can be steered //
45// by //
46// //
47// sim.SetMakeSDigits("ALL"); // make sdigits for all detectors //
48// sim.SetMakeDigits("ITS TPC"); // make digits only for ITS and TPC //
49// //
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. //
54// //
55// The creation of digits from hits instead of from sdigits can be selected //
56// by //
57// //
58// sim.SetMakeDigitsFromHits("TRD"); //
59// //
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. //
63// //
05526d44 64// Background events can be merged by calling //
85a5290f 65// //
66// sim.MergeWith("background/galice.root", 2); //
67// //
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. //
05526d44 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. //
85a5290f 74// //
0421c3d1 75// The output of raw data can be switched on by calling //
76// //
77// sim.SetWriteRawData("MUON"); // write raw data for MUON //
78// //
06c7e392 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 //
86// kTRUE. //
87// //
0421c3d1 88// The methods RunSimulation, RunSDigitization, RunDigitization, //
89// RunHitsDigitization and WriteRawData can be used to run only parts of //
06c7e392 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. //
95601147 93// //
18b43626 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 //
96// by calling //
97// //
98// sim.SetEventsPerFile("PHOS", "Reconstructed Points", 3); //
99// //
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. //
105// //
85a5290f 106///////////////////////////////////////////////////////////////////////////////
107
b856a511 108#include <TVirtualMCApplication.h>
e8d02863 109#include <TGeoManager.h>
85a5290f 110#include <TObjString.h>
fd46e2d2 111#include <TStopwatch.h>
af7ba10c 112#include <TSystem.h>
bfbd5665 113#include <TFile.h>
85a5290f 114
e8d02863 115#include "AliCDBStorage.h"
116#include "AliCDBEntry.h"
117#include "AliCDBManager.h"
25be1e5c 118#include "AliGeomManager.h"
e8d02863 119#include "AliAlignObj.h"
120#include "AliCentralTrigger.h"
362c9d61 121#include "AliDAQ.h"
af7ba10c 122#include "AliDigitizer.h"
123#include "AliGenerator.h"
e8d02863 124#include "AliLog.h"
af7ba10c 125#include "AliModule.h"
126#include "AliRun.h"
127#include "AliRunDigitizer.h"
128#include "AliRunLoader.h"
129#include "AliSimulation.h"
130#include "AliVertexGenFile.h"
a5a091ce 131#include "AliCentralTrigger.h"
007155cc 132#include "AliCTPRawData.h"
ca30848f 133#include "AliRawReaderFile.h"
134#include "AliESD.h"
135#include "AliHeader.h"
136#include "AliGenEventHeader.h"
b856a511 137#include "AliMC.h"
85a5290f 138
139ClassImp(AliSimulation)
140
b856a511 141AliSimulation *AliSimulation::fgInstance = 0;
85a5290f 142
143//_____________________________________________________________________________
024cf675 144AliSimulation::AliSimulation(const char* configFileName, const char* cdbUri,
95601147 145 const char* name, const char* title) :
146 TNamed(name, title),
147
148 fRunGeneration(kTRUE),
149 fRunSimulation(kTRUE),
024cf675 150 fLoadAlignFromCDB(kTRUE),
25be1e5c 151 fLoadAlObjsListOfDets("ALL"),
95601147 152 fMakeSDigits("ALL"),
153 fMakeDigits("ALL"),
a5a091ce 154 fMakeTrigger(""),
95601147 155 fMakeDigitsFromHits(""),
0421c3d1 156 fWriteRawData(""),
06c7e392 157 fRawDataFileName(""),
158 fDeleteIntermediateFiles(kFALSE),
95601147 159 fStopOnError(kFALSE),
160
161 fNEvents(1),
162 fConfigFileName(configFileName),
163 fGAliceFileName("galice.root"),
18b43626 164 fEventsPerFile(),
95601147 165 fBkgrdFileNames(NULL),
995ad051 166 fAlignObjArray(NULL),
04bae0a0 167 fUseBkgrdVertex(kTRUE),
024cf675 168 fRegionOfInterest(kFALSE),
ec92bee0 169 fCDBUri(cdbUri),
ca30848f 170 fSpecCDBUri(),
171 fEmbeddingFlag(kFALSE)
85a5290f 172{
173// create simulation object with default parameters
b856a511 174 fgInstance = this;
0421c3d1 175 SetGAliceFile("galice.root");
85a5290f 176}
177
178//_____________________________________________________________________________
179AliSimulation::AliSimulation(const AliSimulation& sim) :
95601147 180 TNamed(sim),
181
182 fRunGeneration(sim.fRunGeneration),
183 fRunSimulation(sim.fRunSimulation),
024cf675 184 fLoadAlignFromCDB(sim.fLoadAlignFromCDB),
25be1e5c 185 fLoadAlObjsListOfDets(sim.fLoadAlObjsListOfDets),
95601147 186 fMakeSDigits(sim.fMakeSDigits),
187 fMakeDigits(sim.fMakeDigits),
a5a091ce 188 fMakeTrigger(sim.fMakeTrigger),
95601147 189 fMakeDigitsFromHits(sim.fMakeDigitsFromHits),
0421c3d1 190 fWriteRawData(sim.fWriteRawData),
06c7e392 191 fRawDataFileName(""),
192 fDeleteIntermediateFiles(kFALSE),
95601147 193 fStopOnError(sim.fStopOnError),
194
195 fNEvents(sim.fNEvents),
196 fConfigFileName(sim.fConfigFileName),
197 fGAliceFileName(sim.fGAliceFileName),
18b43626 198 fEventsPerFile(),
95601147 199 fBkgrdFileNames(NULL),
995ad051 200 fAlignObjArray(NULL),
04bae0a0 201 fUseBkgrdVertex(sim.fUseBkgrdVertex),
024cf675 202 fRegionOfInterest(sim.fRegionOfInterest),
ec92bee0 203 fCDBUri(sim.fCDBUri),
ca30848f 204 fSpecCDBUri(),
205 fEmbeddingFlag(sim.fEmbeddingFlag)
85a5290f 206{
207// copy constructor
208
18b43626 209 for (Int_t i = 0; i < sim.fEventsPerFile.GetEntriesFast(); i++) {
210 if (!sim.fEventsPerFile[i]) continue;
211 fEventsPerFile.Add(sim.fEventsPerFile[i]->Clone());
212 }
213
85a5290f 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());
218 }
ec92bee0 219
220 for (Int_t i = 0; i < sim.fSpecCDBUri.GetEntriesFast(); i++) {
221 if (sim.fSpecCDBUri[i]) fSpecCDBUri.Add(sim.fSpecCDBUri[i]->Clone());
222 }
b856a511 223 fgInstance = this;
85a5290f 224}
225
226//_____________________________________________________________________________
227AliSimulation& AliSimulation::operator = (const AliSimulation& sim)
228{
229// assignment operator
230
231 this->~AliSimulation();
232 new(this) AliSimulation(sim);
233 return *this;
234}
235
236//_____________________________________________________________________________
237AliSimulation::~AliSimulation()
238{
239// clean up
240
18b43626 241 fEventsPerFile.Delete();
024cf675 242// if(fAlignObjArray) fAlignObjArray->Delete(); // fAlignObjArray->RemoveAll() ???
243// delete fAlignObjArray; fAlignObjArray=0;
18b43626 244
95601147 245 if (fBkgrdFileNames) {
246 fBkgrdFileNames->Delete();
247 delete fBkgrdFileNames;
248 }
ec92bee0 249
250 fSpecCDBUri.Delete();
b856a511 251 if (fgInstance==this) fgInstance = 0;
85a5290f 252}
253
254
255//_____________________________________________________________________________
256void AliSimulation::SetNumberOfEvents(Int_t nEvents)
257{
258// set the number of events for one run
259
260 fNEvents = nEvents;
261}
262
024cf675 263//_____________________________________________________________________________
ec92bee0 264void AliSimulation::InitCDBStorage()
024cf675 265{
266// activate a default CDB storage
267// First check if we have any CDB storage set, because it is used
268// to retrieve the calibration and alignment constants
269
270 AliCDBManager* man = AliCDBManager::Instance();
ec92bee0 271 if (man->IsDefaultStorageSet())
024cf675 272 {
ec92bee0 273 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
274 AliWarning("Default CDB storage has been already set !");
275 AliWarning(Form("Ignoring the default storage declared in AliReconstruction: %s",fCDBUri.Data()));
276 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
277 fCDBUri = "";
278 }
279 else {
b8ec52f6 280 AliDebug(2,"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
281 AliDebug(2, Form("Default CDB storage is set to: %s",fCDBUri.Data()));
282 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
ec92bee0 283 man->SetDefaultStorage(fCDBUri);
284 }
285
286 // Now activate the detector specific CDB storage locations
287 for (Int_t i = 0; i < fSpecCDBUri.GetEntriesFast(); i++) {
288 TObject* obj = fSpecCDBUri[i];
289 if (!obj) continue;
b8ec52f6 290 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
291 AliDebug(2, Form("Specific CDB storage for %s is set to: %s",obj->GetName(),obj->GetTitle()));
292 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
c3a7b59a 293 man->SetSpecificStorage(obj->GetName(), obj->GetTitle());
ec92bee0 294 }
727d0766 295 man->Print();
024cf675 296}
297
298//_____________________________________________________________________________
299void AliSimulation::SetDefaultStorage(const char* uri) {
ec92bee0 300// Store the desired default CDB storage location
301// Activate it later within the Run() method
024cf675 302
ec92bee0 303 fCDBUri = uri;
024cf675 304
305}
306
307//_____________________________________________________________________________
c3a7b59a 308void AliSimulation::SetSpecificStorage(const char* calibType, const char* uri) {
ec92bee0 309// Store a detector-specific CDB storage location
310// Activate it later within the Run() method
024cf675 311
c3a7b59a 312 AliCDBPath aPath(calibType);
313 if(!aPath.IsValid()){
314 AliError(Form("Not a valid path: %s", calibType));
315 return;
316 }
317
318 TObject* obj = fSpecCDBUri.FindObject(calibType);
ec92bee0 319 if (obj) fSpecCDBUri.Remove(obj);
c3a7b59a 320 fSpecCDBUri.Add(new TNamed(calibType, uri));
024cf675 321
322}
323
85a5290f 324//_____________________________________________________________________________
325void AliSimulation::SetConfigFile(const char* fileName)
326{
327// set the name of the config file
328
329 fConfigFileName = fileName;
330}
331
0421c3d1 332//_____________________________________________________________________________
333void AliSimulation::SetGAliceFile(const char* fileName)
334{
335// set the name of the galice file
336// the path is converted to an absolute one if it is relative
337
338 fGAliceFileName = fileName;
339 if (!gSystem->IsAbsoluteFileName(fGAliceFileName)) {
340 char* absFileName = gSystem->ConcatFileName(gSystem->WorkingDirectory(),
341 fGAliceFileName);
342 fGAliceFileName = absFileName;
343 delete[] absFileName;
344 }
ac1671c0 345
346 AliDebug(2, Form("galice file name set to %s", fileName));
0421c3d1 347}
348
18b43626 349//_____________________________________________________________________________
350void AliSimulation::SetEventsPerFile(const char* detector, const char* type,
351 Int_t nEvents)
352{
353// set the number of events per file for the given detector and data type
354// ("Hits", "Summable Digits", "Digits", "Reconstructed Points" or "Tracks")
355
356 TNamed* obj = new TNamed(detector, type);
357 obj->SetUniqueID(nEvents);
358 fEventsPerFile.Add(obj);
359}
360
6bae477a 361//_____________________________________________________________________________
362Bool_t AliSimulation::MisalignGeometry(AliRunLoader *runLoader)
363{
364 // Read the alignment objects from CDB.
365 // Each detector is supposed to have the
366 // alignment objects in DET/Align/Data CDB path.
367 // All the detector objects are then collected,
368 // sorted by geometry level (starting from ALIC) and
369 // then applied to the TGeo geometry.
370 // Finally an overlaps check is performed.
371
0717eed2 372 if (!gGeoManager || !gGeoManager->IsClosed()) {
373 AliError("Can't apply the misalignment! gGeoManager doesn't exist or it is still opened!");
374 return kFALSE;
375 }
6bae477a 376 Bool_t delRunLoader = kFALSE;
377 if (!runLoader) {
378 runLoader = LoadRun("READ");
379 if (!runLoader) return kFALSE;
380 delRunLoader = kTRUE;
381 }
382
b856a511 383 // Export ideal geometry
0717eed2 384 gGeoManager->Export("geometry.root");
b856a511 385
25be1e5c 386 // Load alignment data from CDB and apply to geometry through AliGeomManager
6bae477a 387 if(fLoadAlignFromCDB){
25be1e5c 388
389 TString detStr = fLoadAlObjsListOfDets;
390 TString loadAlObjsListOfDets = "";
391
392 TObjArray* detArray = runLoader->GetAliRun()->Detectors();
393 for (Int_t iDet = 0; iDet < detArray->GetEntriesFast(); iDet++) {
394 AliModule* det = (AliModule*) detArray->At(iDet);
395 if (!det || !det->IsActive()) continue;
396 if (IsSelected(det->GetName(), detStr)) {
0717eed2 397 //add det to list of dets to be aligned from CDB
398 loadAlObjsListOfDets += det->GetName();
399 loadAlObjsListOfDets += " ";
25be1e5c 400 }
401 } // end loop over detectors
402 (AliGeomManager::Instance())->ApplyAlignObjsFromCDB(loadAlObjsListOfDets.Data());
403 }else{
404 // Check if the array with alignment objects was
405 // provided by the user. If yes, apply the objects
406 // to the present TGeo geometry
407 if (fAlignObjArray) {
0717eed2 408 if ((AliGeomManager::Instance())->ApplyAlignObjsToGeom(fAlignObjArray) == kFALSE) {
409 AliError("The misalignment of one or more volumes failed!"
410 "Compare the list of simulated detectors and the list of detector alignment data!");
411 if (delRunLoader) delete runLoader;
412 return kFALSE;
6bae477a 413 }
414 }
6bae477a 415 }
416
ef7ff1f9 417 // Update the internal geometry of modules (ITS needs it)
25be1e5c 418 TString detStr = fLoadAlObjsListOfDets;
ef7ff1f9 419 TObjArray* detArray = runLoader->GetAliRun()->Detectors();
420 for (Int_t iDet = 0; iDet < detArray->GetEntriesFast(); iDet++) {
421
422 AliModule* det = (AliModule*) detArray->At(iDet);
423 if (!det || !det->IsActive()) continue;
424 if (IsSelected(det->GetName(), detStr)) {
425 det->UpdateInternalGeometry();
426 }
427 } // end loop over detectors
428
429
6bae477a 430 if (delRunLoader) delete runLoader;
431
a03b0371 432 // Update the TGeoPhysicalNodes
433 gGeoManager->RefreshPhysicalNodes();
434
0717eed2 435 // Export (mis)aligned geometry
436 gGeoManager->Export("misaligned_geometry.root");
437
6bae477a 438 return kTRUE;
439}
440
441
442//_____________________________________________________________________________
443Bool_t AliSimulation::SetRunNumber()
444{
445 // Set the CDB manager run number
446 // The run number is retrieved from gAlice
447
448 if(AliCDBManager::Instance()->GetRun() < 0) {
449 AliRunLoader* runLoader = LoadRun("READ");
450 if (!runLoader) return kFALSE;
451 else {
452 AliCDBManager::Instance()->SetRun(runLoader->GetAliRun()->GetRunNumber());
453 AliInfo(Form("Run number: %d",AliCDBManager::Instance()->GetRun()));
454 delete runLoader;
455 }
456 }
457 return kTRUE;
458}
459
85a5290f 460//_____________________________________________________________________________
461void AliSimulation::MergeWith(const char* fileName, Int_t nSignalPerBkgrd)
462{
463// add a file with background events for merging
464
465 TObjString* fileNameStr = new TObjString(fileName);
466 fileNameStr->SetUniqueID(nSignalPerBkgrd);
95601147 467 if (!fBkgrdFileNames) fBkgrdFileNames = new TObjArray;
85a5290f 468 fBkgrdFileNames->Add(fileNameStr);
469}
470
ca30848f 471void AliSimulation::EmbedInto(const char* fileName, Int_t nSignalPerBkgrd)
472{
473// add a file with background events for embeddin
474 MergeWith(fileName, nSignalPerBkgrd);
475 fEmbeddingFlag = kTRUE;
476}
85a5290f 477
478//_____________________________________________________________________________
479Bool_t AliSimulation::Run(Int_t nEvents)
480{
481// run the generation, simulation and digitization
482
ec92bee0 483 InitCDBStorage();
b0314964 484
85a5290f 485 if (nEvents > 0) fNEvents = nEvents;
486
487 // generation and simulation -> hits
488 if (fRunGeneration) {
85a5290f 489 if (!RunSimulation()) if (fStopOnError) return kFALSE;
490 }
491
6bae477a 492 // Set run number in CDBManager (if it is not already set in RunSimulation)
493 if (!SetRunNumber()) if (fStopOnError) return kFALSE;
494
25be1e5c 495 // If RunSimulation was not called, load the geometry and misalign it
6bae477a 496 if (!gGeoManager) {
497 TGeoManager::Import("geometry.root");
498 if (!gGeoManager) if (fStopOnError) return kFALSE;
25be1e5c 499 // Initialize the geometry manager (if not already done)
500 if(!MisalignGeometry()) if (fStopOnError) return kFALSE;
6bae477a 501 }
25be1e5c 502
85a5290f 503 // hits -> summable digits
504 if (!fMakeSDigits.IsNull()) {
505 if (!RunSDigitization(fMakeSDigits)) if (fStopOnError) return kFALSE;
506 }
507
508 // summable digits -> digits
509 if (!fMakeDigits.IsNull()) {
510 if (!RunDigitization(fMakeDigits, fMakeDigitsFromHits)) {
511 if (fStopOnError) return kFALSE;
512 }
513 }
514
515 // hits -> digits
516 if (!fMakeDigitsFromHits.IsNull()) {
95601147 517 if (fBkgrdFileNames && (fBkgrdFileNames->GetEntriesFast() > 0)) {
ac1671c0 518 AliWarning(Form("Merging and direct creation of digits from hits "
519 "was selected for some detectors. "
520 "No merging will be done for the following detectors: %s",
521 fMakeDigitsFromHits.Data()));
85a5290f 522 }
523 if (!RunHitsDigitization(fMakeDigitsFromHits)) {
524 if (fStopOnError) return kFALSE;
525 }
526 }
527
a5a091ce 528 // digits -> trigger
087426de 529 if (!RunTrigger(fMakeTrigger)) {
530 if (fStopOnError) return kFALSE;
a5a091ce 531 }
532
0421c3d1 533 // digits -> raw data
534 if (!fWriteRawData.IsNull()) {
06c7e392 535 if (!WriteRawData(fWriteRawData, fRawDataFileName,
536 fDeleteIntermediateFiles)) {
0421c3d1 537 if (fStopOnError) return kFALSE;
538 }
539 }
540
85a5290f 541 return kTRUE;
542}
543
a5a091ce 544//_____________________________________________________________________________
545Bool_t AliSimulation::RunTrigger(const char* descriptors)
546{
547 // run the trigger
548
bacbe0fd 549 TStopwatch stopwatch;
550 stopwatch.Start();
a5a091ce 551
bacbe0fd 552 AliRunLoader* runLoader = LoadRun("READ");
553 if (!runLoader) return kFALSE;
554 TString des = descriptors;
555
087426de 556 if (des.IsNull()) {
557 if (gAlice->GetTriggerDescriptor() != "") {
558 des = gAlice->GetTriggerDescriptor();
559 }
560 else {
561 AliWarning("No trigger descriptor is specified. Skipping the trigger simulation...");
562 return kTRUE;
563 }
564 }
565
0f46f5fa 566 runLoader->MakeTree( "GG" );
bacbe0fd 567 AliCentralTrigger* aCTP = runLoader->GetTrigger();
a5a091ce 568 // Load Descriptors
bacbe0fd 569 aCTP->LoadDescriptor( des );
a5a091ce 570
571 // digits -> trigger
bacbe0fd 572 if( !aCTP->RunTrigger( runLoader ) ) {
a5a091ce 573 if (fStopOnError) {
bacbe0fd 574 // delete aCTP;
a5a091ce 575 return kFALSE;
576 }
bacbe0fd 577 }
a5a091ce 578
bacbe0fd 579 AliInfo(Form("Execution time: R:%.2fs C:%.2fs",
580 stopwatch.RealTime(),stopwatch.CpuTime()));
a5a091ce 581
bacbe0fd 582 delete runLoader;
a5a091ce 583
bacbe0fd 584 return kTRUE;
a5a091ce 585}
586
007155cc 587//_____________________________________________________________________________
588Bool_t AliSimulation::WriteTriggerRawData()
589{
590 // Writes the CTP (trigger) DDL raw data
591 // Details of the format are given in the
592 // trigger TDR - pages 134 and 135.
593 AliCTPRawData writer;
594 writer.RawData();
a5a091ce 595
007155cc 596 return kTRUE;
597}
a5a091ce 598
85a5290f 599//_____________________________________________________________________________
95601147 600Bool_t AliSimulation::RunSimulation(Int_t nEvents)
85a5290f 601{
602// run the generation and simulation
603
4df28b43 604 TStopwatch stopwatch;
605 stopwatch.Start();
606
95601147 607 if (!gAlice) {
ac1671c0 608 AliError("no gAlice object. Restart aliroot and try again.");
95601147 609 return kFALSE;
610 }
611 if (gAlice->Modules()->GetEntries() > 0) {
ac1671c0 612 AliError("gAlice was already run. Restart aliroot and try again.");
95601147 613 return kFALSE;
614 }
615
ac1671c0 616 AliInfo(Form("initializing gAlice with config file %s",
617 fConfigFileName.Data()));
815c2b38 618 StdoutToAliInfo(StderrToAliError(
619 gAlice->Init(fConfigFileName.Data());
620 ););
995ad051 621
087426de 622 // Get the trigger descriptor string
623 // Either from AliSimulation or from
624 // gAlice
625 if (fMakeTrigger.IsNull()) {
626 if (gAlice->GetTriggerDescriptor() != "")
627 fMakeTrigger = gAlice->GetTriggerDescriptor();
628 }
629 else
630 gAlice->SetTriggerDescriptor(fMakeTrigger.Data());
631
6bae477a 632 // Set run number in CDBManager
024cf675 633 AliCDBManager::Instance()->SetRun(gAlice->GetRunNumber());
634 AliInfo(Form("Run number: %d",AliCDBManager::Instance()->GetRun()));
635
636 AliRunLoader* runLoader = gAlice->GetRunLoader();
637 if (!runLoader) {
638 AliError(Form("gAlice has no run loader object. "
639 "Check your config file: %s", fConfigFileName.Data()));
640 return kFALSE;
641 }
642 SetGAliceFile(runLoader->GetFileName());
643
6bae477a 644 // Misalign geometry
caf9c464 645#if ROOT_VERSION_CODE < 331527
646 MisalignGeometry(runLoader);
647#endif
995ad051 648
024cf675 649// AliRunLoader* runLoader = gAlice->GetRunLoader();
650// if (!runLoader) {
651// AliError(Form("gAlice has no run loader object. "
652// "Check your config file: %s", fConfigFileName.Data()));
653// return kFALSE;
654// }
655// SetGAliceFile(runLoader->GetFileName());
85a5290f 656
04bae0a0 657 if (!gAlice->Generator()) {
ac1671c0 658 AliError(Form("gAlice has no generator object. "
659 "Check your config file: %s", fConfigFileName.Data()));
04bae0a0 660 return kFALSE;
661 }
05526d44 662 if (nEvents <= 0) nEvents = fNEvents;
04bae0a0 663
664 // get vertex from background file in case of merging
665 if (fUseBkgrdVertex &&
666 fBkgrdFileNames && (fBkgrdFileNames->GetEntriesFast() > 0)) {
05526d44 667 Int_t signalPerBkgrd = GetNSignalPerBkgrd(nEvents);
04bae0a0 668 const char* fileName = ((TObjString*)
669 (fBkgrdFileNames->At(0)))->GetName();
ac1671c0 670 AliInfo(Form("The vertex will be taken from the background "
671 "file %s with nSignalPerBackground = %d",
672 fileName, signalPerBkgrd));
04bae0a0 673 AliVertexGenFile* vtxGen = new AliVertexGenFile(fileName, signalPerBkgrd);
674 gAlice->Generator()->SetVertexGenerator(vtxGen);
675 }
676
85a5290f 677 if (!fRunSimulation) {
85a5290f 678 gAlice->Generator()->SetTrackingFlag(0);
679 }
680
18b43626 681 // set the number of events per file for given detectors and data types
682 for (Int_t i = 0; i < fEventsPerFile.GetEntriesFast(); i++) {
683 if (!fEventsPerFile[i]) continue;
684 const char* detName = fEventsPerFile[i]->GetName();
685 const char* typeName = fEventsPerFile[i]->GetTitle();
686 TString loaderName(detName);
687 loaderName += "Loader";
688 AliLoader* loader = runLoader->GetLoader(loaderName);
689 if (!loader) {
ac1671c0 690 AliError(Form("RunSimulation", "no loader for %s found\n"
691 "Number of events per file not set for %s %s",
692 detName, typeName, detName));
18b43626 693 continue;
694 }
695 AliDataLoader* dataLoader =
696 loader->GetDataLoader(typeName);
697 if (!dataLoader) {
ac1671c0 698 AliError(Form("no data loader for %s found\n"
699 "Number of events per file not set for %s %s",
700 typeName, detName, typeName));
18b43626 701 continue;
702 }
703 dataLoader->SetNumberOfEventsPerFile(fEventsPerFile[i]->GetUniqueID());
ac1671c0 704 AliDebug(1, Form("number of events per file set to %d for %s %s",
705 fEventsPerFile[i]->GetUniqueID(), detName, typeName));
18b43626 706 }
707
ac1671c0 708 AliInfo("running gAlice");
815c2b38 709 StdoutToAliInfo(StderrToAliError(
710 gAlice->Run(nEvents);
711 ););
95601147 712
713 delete runLoader;
85a5290f 714
5f8272e1 715 AliInfo(Form("Execution time: R:%.2fs C:%.2fs",
716 stopwatch.RealTime(),stopwatch.CpuTime()));
4df28b43 717
85a5290f 718 return kTRUE;
719}
720
721//_____________________________________________________________________________
95601147 722Bool_t AliSimulation::RunSDigitization(const char* detectors)
85a5290f 723{
724// run the digitization and produce summable digits
725
4df28b43 726 TStopwatch stopwatch;
727 stopwatch.Start();
728
95601147 729 AliRunLoader* runLoader = LoadRun();
730 if (!runLoader) return kFALSE;
731
85a5290f 732 TString detStr = detectors;
95601147 733 TObjArray* detArray = runLoader->GetAliRun()->Detectors();
85a5290f 734 for (Int_t iDet = 0; iDet < detArray->GetEntriesFast(); iDet++) {
735 AliModule* det = (AliModule*) detArray->At(iDet);
736 if (!det || !det->IsActive()) continue;
737 if (IsSelected(det->GetName(), detStr)) {
ac1671c0 738 AliInfo(Form("creating summable digits for %s", det->GetName()));
de76655b 739 TStopwatch stopwatchDet;
740 stopwatchDet.Start();
85a5290f 741 det->Hits2SDigits();
5f8272e1 742 AliInfo(Form("Execution time for %s: R:%.2fs C:%.2fs",
743 det->GetName(),stopwatchDet.RealTime(),stopwatchDet.CpuTime()));
85a5290f 744 }
745 }
746
747 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
ac1671c0 748 AliError(Form("the following detectors were not found: %s",
749 detStr.Data()));
85a5290f 750 if (fStopOnError) return kFALSE;
751 }
752
95601147 753 delete runLoader;
754
5f8272e1 755 AliInfo(Form("Execution time: R:%.2fs C:%.2fs",
756 stopwatch.RealTime(),stopwatch.CpuTime()));
4df28b43 757
85a5290f 758 return kTRUE;
759}
760
761
762//_____________________________________________________________________________
95601147 763Bool_t AliSimulation::RunDigitization(const char* detectors,
764 const char* excludeDetectors)
85a5290f 765{
766// run the digitization and produce digits from sdigits
767
4df28b43 768 TStopwatch stopwatch;
769 stopwatch.Start();
770
95601147 771 while (AliRunLoader::GetRunLoader()) delete AliRunLoader::GetRunLoader();
772 if (gAlice) delete gAlice;
773 gAlice = NULL;
774
775 Int_t nStreams = 1;
05526d44 776 if (fBkgrdFileNames) nStreams = fBkgrdFileNames->GetEntriesFast() + 1;
777 Int_t signalPerBkgrd = GetNSignalPerBkgrd();
85a5290f 778 AliRunDigitizer* manager = new AliRunDigitizer(nStreams, signalPerBkgrd);
ca30848f 779 // manager->SetEmbeddingFlag(fEmbeddingFlag);
85a5290f 780 manager->SetInputStream(0, fGAliceFileName.Data());
781 for (Int_t iStream = 1; iStream < nStreams; iStream++) {
782 const char* fileName = ((TObjString*)
783 (fBkgrdFileNames->At(iStream-1)))->GetName();
784 manager->SetInputStream(iStream, fileName);
785 }
786
787 TString detStr = detectors;
788 TString detExcl = excludeDetectors;
95601147 789 manager->GetInputStream(0)->ImportgAlice();
790 AliRunLoader* runLoader =
791 AliRunLoader::GetRunLoader(manager->GetInputStream(0)->GetFolderName());
792 TObjArray* detArray = runLoader->GetAliRun()->Detectors();
85a5290f 793 for (Int_t iDet = 0; iDet < detArray->GetEntriesFast(); iDet++) {
794 AliModule* det = (AliModule*) detArray->At(iDet);
795 if (!det || !det->IsActive()) continue;
796 if (IsSelected(det->GetName(), detStr) &&
797 !IsSelected(det->GetName(), detExcl)) {
4df28b43 798 AliDigitizer* digitizer = det->CreateDigitizer(manager);
ca30848f 799
4df28b43 800 if (!digitizer) {
ac1671c0 801 AliError(Form("no digitizer for %s", det->GetName()));
85a5290f 802 if (fStopOnError) return kFALSE;
4df28b43 803 } else {
804 digitizer->SetRegionOfInterest(fRegionOfInterest);
85a5290f 805 }
806 }
807 }
808
809 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
ac1671c0 810 AliError(Form("the following detectors were not found: %s",
811 detStr.Data()));
85a5290f 812 if (fStopOnError) return kFALSE;
813 }
814
815 if (!manager->GetListOfTasks()->IsEmpty()) {
ac1671c0 816 AliInfo("executing digitization");
85a5290f 817 manager->Exec("");
818 }
95601147 819
85a5290f 820 delete manager;
821
5f8272e1 822 AliInfo(Form("Execution time: R:%.2fs C:%.2fs",
823 stopwatch.RealTime(),stopwatch.CpuTime()));
824
85a5290f 825 return kTRUE;
826}
827
828//_____________________________________________________________________________
95601147 829Bool_t AliSimulation::RunHitsDigitization(const char* detectors)
85a5290f 830{
831// run the digitization and produce digits from hits
832
4df28b43 833 TStopwatch stopwatch;
834 stopwatch.Start();
835
591f51bb 836 AliRunLoader* runLoader = LoadRun("READ");
95601147 837 if (!runLoader) return kFALSE;
838
85a5290f 839 TString detStr = detectors;
95601147 840 TObjArray* detArray = runLoader->GetAliRun()->Detectors();
85a5290f 841 for (Int_t iDet = 0; iDet < detArray->GetEntriesFast(); iDet++) {
842 AliModule* det = (AliModule*) detArray->At(iDet);
843 if (!det || !det->IsActive()) continue;
844 if (IsSelected(det->GetName(), detStr)) {
ac1671c0 845 AliInfo(Form("creating digits from hits for %s", det->GetName()));
85a5290f 846 det->Hits2Digits();
847 }
848 }
849
850 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
ac1671c0 851 AliError(Form("the following detectors were not found: %s",
852 detStr.Data()));
85a5290f 853 if (fStopOnError) return kFALSE;
854 }
855
b17cac0f 856 delete runLoader;
591f51bb 857 //PH Temporary fix to avoid interference with the PHOS loder/getter
858 //PH The problem has to be solved in more general way 09/06/05
95601147 859
5f8272e1 860 AliInfo(Form("Execution time: R:%.2fs C:%.2fs",
861 stopwatch.RealTime(),stopwatch.CpuTime()));
4df28b43 862
85a5290f 863 return kTRUE;
864}
865
0421c3d1 866//_____________________________________________________________________________
06c7e392 867Bool_t AliSimulation::WriteRawData(const char* detectors,
868 const char* fileName,
869 Bool_t deleteIntermediateFiles)
0421c3d1 870{
871// convert the digits to raw data
06c7e392 872// First DDL raw data files for the given detectors are created.
873// If a file name is given, the DDL files are then converted to a DATE file.
874// If deleteIntermediateFiles is true, the DDL raw files are deleted
875// afterwards.
876// If the file name has the extension ".root", the DATE file is converted
877// to a root file.
878// If deleteIntermediateFiles is true, the DATE file is deleted afterwards.
0421c3d1 879
880 TStopwatch stopwatch;
881 stopwatch.Start();
882
06c7e392 883 if (!WriteRawFiles(detectors)) {
884 if (fStopOnError) return kFALSE;
885 }
886
887 TString dateFileName(fileName);
888 if (!dateFileName.IsNull()) {
889 Bool_t rootOutput = dateFileName.EndsWith(".root");
890 if (rootOutput) dateFileName += ".date";
891 if (!ConvertRawFilesToDate(dateFileName)) {
892 if (fStopOnError) return kFALSE;
893 }
894 if (deleteIntermediateFiles) {
895 AliRunLoader* runLoader = LoadRun("READ");
896 if (runLoader) for (Int_t iEvent = 0;
897 iEvent < runLoader->GetNumberOfEvents(); iEvent++) {
898 char command[256];
899 sprintf(command, "rm -r raw%d", iEvent);
900 gSystem->Exec(command);
901 }
902 }
903
904 if (rootOutput) {
905 if (!ConvertDateToRoot(dateFileName, fileName)) {
906 if (fStopOnError) return kFALSE;
907 }
908 if (deleteIntermediateFiles) {
909 gSystem->Unlink(dateFileName);
910 }
911 }
912 }
913
5f8272e1 914 AliInfo(Form("Execution time: R:%.2fs C:%.2fs",
915 stopwatch.RealTime(),stopwatch.CpuTime()));
06c7e392 916
917 return kTRUE;
918}
919
920//_____________________________________________________________________________
921Bool_t AliSimulation::WriteRawFiles(const char* detectors)
922{
923// convert the digits to raw data DDL files
924
925 AliRunLoader* runLoader = LoadRun("READ");
0421c3d1 926 if (!runLoader) return kFALSE;
927
06c7e392 928 // write raw data to DDL files
0421c3d1 929 for (Int_t iEvent = 0; iEvent < runLoader->GetNumberOfEvents(); iEvent++) {
ac1671c0 930 AliInfo(Form("processing event %d", iEvent));
0421c3d1 931 runLoader->GetEvent(iEvent);
932 TString baseDir = gSystem->WorkingDirectory();
933 char dirName[256];
934 sprintf(dirName, "raw%d", iEvent);
935 gSystem->MakeDirectory(dirName);
936 if (!gSystem->ChangeDirectory(dirName)) {
ac1671c0 937 AliError(Form("couldn't change to directory %s", dirName));
0421c3d1 938 if (fStopOnError) return kFALSE; else continue;
939 }
940
941 TString detStr = detectors;
942 TObjArray* detArray = runLoader->GetAliRun()->Detectors();
943 for (Int_t iDet = 0; iDet < detArray->GetEntriesFast(); iDet++) {
944 AliModule* det = (AliModule*) detArray->At(iDet);
945 if (!det || !det->IsActive()) continue;
946 if (IsSelected(det->GetName(), detStr)) {
ac1671c0 947 AliInfo(Form("creating raw data from digits for %s", det->GetName()));
0421c3d1 948 det->Digits2Raw();
949 }
950 }
951
007155cc 952 if (!WriteTriggerRawData())
953 if (fStopOnError) return kFALSE;
954
0421c3d1 955 gSystem->ChangeDirectory(baseDir);
956 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
ac1671c0 957 AliError(Form("the following detectors were not found: %s",
958 detStr.Data()));
0421c3d1 959 if (fStopOnError) return kFALSE;
960 }
961 }
962
963 delete runLoader;
06c7e392 964 return kTRUE;
965}
0421c3d1 966
06c7e392 967//_____________________________________________________________________________
968Bool_t AliSimulation::ConvertRawFilesToDate(const char* dateFileName)
969{
970// convert raw data DDL files to a DATE file with the program "dateStream"
971
06c7e392 972 char* path = gSystem->Which(gSystem->Getenv("PATH"), "dateStream");
973 if (!path) {
ac1671c0 974 AliError("the program dateStream was not found");
06c7e392 975 if (fStopOnError) return kFALSE;
976 } else {
977 delete[] path;
978 }
0421c3d1 979
06c7e392 980 AliRunLoader* runLoader = LoadRun("READ");
981 if (!runLoader) return kFALSE;
982
ac1671c0 983 AliInfo(Form("converting raw data DDL files to DATE file %s", dateFileName));
06c7e392 984 char command[256];
f28a8d2d 985 // Note the option -s. It is used in order to avoid
986 // the generation of SOR/EOR events.
987 sprintf(command, "dateStream -s -D -o %s -# %d -C",
06c7e392 988 dateFileName, runLoader->GetNumberOfEvents());
989 FILE* pipe = gSystem->OpenPipe(command, "w");
990
991 for (Int_t iEvent = 0; iEvent < runLoader->GetNumberOfEvents(); iEvent++) {
992 fprintf(pipe, "GDC\n");
993 Float_t ldc = 0;
994 Int_t prevLDC = -1;
995
996 // loop over detectors and DDLs
362c9d61 997 for (Int_t iDet = 0; iDet < AliDAQ::kNDetectors; iDet++) {
998 for (Int_t iDDL = 0; iDDL < AliDAQ::NumberOfDdls(iDet); iDDL++) {
06c7e392 999
362c9d61 1000 Int_t ddlID = AliDAQ::DdlID(iDet,iDDL);
06c7e392 1001 Int_t ldcID = Int_t(ldc + 0.0001);
362c9d61 1002 ldc += AliDAQ::NumberOfLdcs(iDet) / AliDAQ::NumberOfDdls(iDet);
06c7e392 1003
1004 char rawFileName[256];
362c9d61 1005 sprintf(rawFileName, "raw%d/%s",
1006 iEvent, AliDAQ::DdlFileName(iDet,iDDL));
06c7e392 1007
1008 // check existence and size of raw data file
1009 FILE* file = fopen(rawFileName, "rb");
1010 if (!file) continue;
1011 fseek(file, 0, SEEK_END);
1012 unsigned long size = ftell(file);
aa04f81b 1013 fclose(file);
1014 if (!size) continue;
06c7e392 1015
1016 if (ldcID != prevLDC) {
1017 fprintf(pipe, " LDC Id %d\n", ldcID);
1018 prevLDC = ldcID;
1019 }
1020 fprintf(pipe, " Equipment Id %d Payload %s\n", ddlID, rawFileName);
1021 }
1022 }
1023 }
1024
1025 Int_t result = gSystem->ClosePipe(pipe);
1026
1027 delete runLoader;
1028 return (result == 0);
1029}
1030
1031//_____________________________________________________________________________
1032Bool_t AliSimulation::ConvertDateToRoot(const char* dateFileName,
1033 const char* rootFileName)
1034{
1035// convert a DATE file to a root file with the program "alimdc"
1036
1037 // ALIMDC setup
f28a8d2d 1038 const Int_t kDBSize = 2000000000;
c83eb8f4 1039 const Int_t kTagDBSize = 1000000000;
06c7e392 1040 const Bool_t kFilter = kFALSE;
f28a8d2d 1041 const Int_t kCompression = 0;
06c7e392 1042
1043 char* path = gSystem->Which(gSystem->Getenv("PATH"), "alimdc");
1044 if (!path) {
ac1671c0 1045 AliError("the program alimdc was not found");
06c7e392 1046 if (fStopOnError) return kFALSE;
1047 } else {
1048 delete[] path;
1049 }
1050
ac1671c0 1051 AliInfo(Form("converting DATE file %s to root file %s",
1052 dateFileName, rootFileName));
06c7e392 1053
f732bd7d 1054 const char* rawDBFS[2] = { "/tmp/mdc1", "/tmp/mdc2" };
1055 const char* tagDBFS = "/tmp/mdc1/tags";
f732bd7d 1056
1057 // User defined file system locations
1058 if (gSystem->Getenv("ALIMDC_RAWDB1"))
1059 rawDBFS[0] = gSystem->Getenv("ALIMDC_RAWDB1");
1060 if (gSystem->Getenv("ALIMDC_RAWDB2"))
1061 rawDBFS[1] = gSystem->Getenv("ALIMDC_RAWDB2");
1062 if (gSystem->Getenv("ALIMDC_TAGDB"))
1063 tagDBFS = gSystem->Getenv("ALIMDC_TAGDB");
f732bd7d 1064
1065 gSystem->Exec(Form("rm -rf %s",rawDBFS[0]));
1066 gSystem->Exec(Form("rm -rf %s",rawDBFS[1]));
1067 gSystem->Exec(Form("rm -rf %s",tagDBFS));
f732bd7d 1068
1069 gSystem->Exec(Form("mkdir %s",rawDBFS[0]));
1070 gSystem->Exec(Form("mkdir %s",rawDBFS[1]));
1071 gSystem->Exec(Form("mkdir %s",tagDBFS));
f732bd7d 1072
1073 Int_t result = gSystem->Exec(Form("alimdc %d %d %d %d %s",
1074 kDBSize, kTagDBSize, kFilter, kCompression, dateFileName));
1075 gSystem->Exec(Form("mv %s/*.root %s", rawDBFS[0], rootFileName));
1076
1077 gSystem->Exec(Form("rm -rf %s",rawDBFS[0]));
1078 gSystem->Exec(Form("rm -rf %s",rawDBFS[1]));
1079 gSystem->Exec(Form("rm -rf %s",tagDBFS));
06c7e392 1080
1081 return (result == 0);
0421c3d1 1082}
1083
85a5290f 1084
95601147 1085//_____________________________________________________________________________
06c7e392 1086AliRunLoader* AliSimulation::LoadRun(const char* mode) const
95601147 1087{
1088// delete existing run loaders, open a new one and load gAlice
1089
1090 while (AliRunLoader::GetRunLoader()) delete AliRunLoader::GetRunLoader();
1091 AliRunLoader* runLoader =
1092 AliRunLoader::Open(fGAliceFileName.Data(),
06c7e392 1093 AliConfig::GetDefaultEventFolderName(), mode);
95601147 1094 if (!runLoader) {
ac1671c0 1095 AliError(Form("no run loader found in file %s", fGAliceFileName.Data()));
95601147 1096 return NULL;
1097 }
1098 runLoader->LoadgAlice();
1099 gAlice = runLoader->GetAliRun();
1100 if (!gAlice) {
ac1671c0 1101 AliError(Form("no gAlice object found in file %s",
1102 fGAliceFileName.Data()));
95601147 1103 return NULL;
1104 }
1105 return runLoader;
1106}
1107
85a5290f 1108//_____________________________________________________________________________
05526d44 1109Int_t AliSimulation::GetNSignalPerBkgrd(Int_t nEvents) const
1110{
1111// get or calculate the number of signal events per background event
1112
1113 if (!fBkgrdFileNames) return 1;
1114 Int_t nBkgrdFiles = fBkgrdFileNames->GetEntriesFast();
1115 if (nBkgrdFiles == 0) return 1;
1116
1117 // get the number of signal events
1118 if (nEvents <= 0) {
1119 AliRunLoader* runLoader =
ca30848f 1120 AliRunLoader::Open(fGAliceFileName.Data(), "SIGNAL");
05526d44 1121 if (!runLoader) return 1;
ca30848f 1122
05526d44 1123 nEvents = runLoader->GetNumberOfEvents();
1124 delete runLoader;
1125 }
1126
1127 Int_t result = 0;
1128 for (Int_t iBkgrdFile = 0; iBkgrdFile < nBkgrdFiles; iBkgrdFile++) {
1129 // get the number of background events
1130 const char* fileName = ((TObjString*)
1131 (fBkgrdFileNames->At(iBkgrdFile)))->GetName();
ca30848f 1132 AliRunLoader* runLoader =
05526d44 1133 AliRunLoader::Open(fileName, "BKGRD");
1134 if (!runLoader) continue;
1135 Int_t nBkgrdEvents = runLoader->GetNumberOfEvents();
1136 delete runLoader;
ca30848f 1137
05526d44 1138 // get or calculate the number of signal per background events
1139 Int_t nSignalPerBkgrd = fBkgrdFileNames->At(iBkgrdFile)->GetUniqueID();
1140 if (nSignalPerBkgrd <= 0) {
1141 nSignalPerBkgrd = (nEvents-1) / nBkgrdEvents + 1;
1142 } else if (result && (result != nSignalPerBkgrd)) {
ac1671c0 1143 AliInfo(Form("the number of signal events per background event "
1144 "will be changed from %d to %d for stream %d",
1145 nSignalPerBkgrd, result, iBkgrdFile+1));
05526d44 1146 nSignalPerBkgrd = result;
1147 }
1148
1149 if (!result) result = nSignalPerBkgrd;
1150 if (nSignalPerBkgrd * nBkgrdEvents < nEvents) {
ac1671c0 1151 AliWarning(Form("not enough background events (%d) for %d signal events "
1152 "using %d signal per background events for stream %d",
1153 nBkgrdEvents, nEvents, nSignalPerBkgrd, iBkgrdFile+1));
05526d44 1154 }
1155 }
1156
1157 return result;
1158}
1159
1160//_____________________________________________________________________________
85a5290f 1161Bool_t AliSimulation::IsSelected(TString detName, TString& detectors) const
1162{
1163// check whether detName is contained in detectors
1164// if yes, it is removed from detectors
1165
1166 // check if all detectors are selected
1167 if ((detectors.CompareTo("ALL") == 0) ||
1168 detectors.BeginsWith("ALL ") ||
1169 detectors.EndsWith(" ALL") ||
1170 detectors.Contains(" ALL ")) {
1171 detectors = "ALL";
1172 return kTRUE;
1173 }
1174
1175 // search for the given detector
1176 Bool_t result = kFALSE;
1177 if ((detectors.CompareTo(detName) == 0) ||
1178 detectors.BeginsWith(detName+" ") ||
1179 detectors.EndsWith(" "+detName) ||
1180 detectors.Contains(" "+detName+" ")) {
1181 detectors.ReplaceAll(detName, "");
1182 result = kTRUE;
1183 }
1184
1185 // clean up the detectors string
1186 while (detectors.Contains(" ")) detectors.ReplaceAll(" ", " ");
1187 while (detectors.BeginsWith(" ")) detectors.Remove(0, 1);
1188 while (detectors.EndsWith(" ")) detectors.Remove(detectors.Length()-1, 1);
1189
1190 return result;
1191}
ca30848f 1192
1193Bool_t AliSimulation::ConvertRaw2SDigits(const char* rawDirectory, const char* esdFileName)
1194{
1195//
1196// Steering routine to convert raw data in directory rawDirectory/ to fake SDigits.
1197// These can be used for embedding of MC tracks into RAW data using the standard
1198// merging procedure.
1199//
1200// If an ESD file is given the reconstructed vertex is taken from it and stored in the event header.
1201//
1202 if (!gAlice) {
1203 AliError("no gAlice object. Restart aliroot and try again.");
1204 return kFALSE;
1205 }
1206 if (gAlice->Modules()->GetEntries() > 0) {
1207 AliError("gAlice was already run. Restart aliroot and try again.");
1208 return kFALSE;
1209 }
1210
1211 AliInfo(Form("initializing gAlice with config file %s",fConfigFileName.Data()));
1212 StdoutToAliInfo(StderrToAliError(gAlice->Init(fConfigFileName.Data());););
1213//
1214// Initialize CDB
1215 InitCDBStorage();
1216 AliCDBManager* man = AliCDBManager::Instance();
1217 man->SetRun(0); // Should this come from rawdata header ?
1218
1219 Int_t iDet;
1220 //
1221 // Get the runloader
1222 AliRunLoader* runLoader = gAlice->GetRunLoader();
1223 //
1224 // Open esd file if available
1225 TFile* esdFile = TFile::Open(esdFileName);
1226 Bool_t esdOK = (esdFile != 0);
1227 AliESD* esd = new AliESD;
1228 TTree* treeESD = 0;
1229 if (esdOK) {
1230 treeESD = (TTree*) esdFile->Get("esdTree");
1231 if (!treeESD) {
1232 AliWarning("No ESD tree found");
1233 esdOK = kFALSE;
1234 } else {
1235 treeESD->SetBranchAddress("ESD", &esd);
1236 }
1237 }
1238 //
1239 // Create the RawReader
1240 AliRawReaderFile* rawReader = new AliRawReaderFile(rawDirectory);
1241 //
1242 // Get list of detectors
1243 TObjArray* detArray = runLoader->GetAliRun()->Detectors();
1244 //
1245 // Get Header
1246 AliHeader* header = runLoader->GetHeader();
1247 //
1248 // Event loop
1249 Int_t nev = 0;
1250 while(kTRUE) {
1251 if (!(rawReader->NextEvent())) break;
1252 //
1253 // Detector loop
1254 for (iDet = 0; iDet < detArray->GetEntriesFast(); iDet++) {
1255 AliModule* det = (AliModule*) detArray->At(iDet);
1256 AliInfo(Form("Calling Raw2SDigits for %s\n", det->GetName()));
1257 det->Raw2SDigits(rawReader);
1258 rawReader->Reset();
1259 } // detectors
1260
1261 //
1262 // If ESD information available obtain reconstructed vertex and store in header.
1263 if (esdOK) {
1264 treeESD->GetEvent(nev);
1265 const AliESDVertex* esdVertex = esd->GetPrimaryVertex();
1266 Double_t position[3];
1267 esdVertex->GetXYZ(position);
1268 AliGenEventHeader* mcHeader = new AliGenEventHeader("ESD");
1269 TArrayF mcV;
1270 mcV.Set(3);
1271 for (Int_t i = 0; i < 3; i++) mcV[i] = position[i];
1272 mcHeader->SetPrimaryVertex(mcV);
1273 header->Reset(0,nev);
1274 header->SetGenEventHeader(mcHeader);
1275 printf("***** Saved vertex %f %f %f \n", position[0], position[1], position[2]);
1276 }
1277 nev++;
1278//
1279// Finish the event
1280 runLoader->TreeE()->Fill();
1281 runLoader->SetNextEvent();
1282 } // events
1283
1284 delete rawReader;
1285//
1286// Finish the run
1287 runLoader->CdGAFile();
1288 runLoader->WriteHeader("OVERWRITE");
1289 runLoader->WriteRunLoader();
1290
1291 return kTRUE;
1292}