X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=STEER%2FAliSimulation.cxx;h=6306067d5c144133595faa9377af8e5f6c46d2f3;hb=cd995490fc657af53fda843eac38103f1929f980;hp=04d222e372f6e5ba593940e7fccf6766eaff29b2;hpb=f1c1204db4914a19f49337ab4cfbca57ad086d96;p=u%2Fmrichter%2FAliRoot.git diff --git a/STEER/AliSimulation.cxx b/STEER/AliSimulation.cxx index 04d222e372f..6306067d5c1 100644 --- a/STEER/AliSimulation.cxx +++ b/STEER/AliSimulation.cxx @@ -114,10 +114,12 @@ #include #include #include +#include #include "AliAlignObj.h" #include "AliCDBEntry.h" #include "AliCDBManager.h" +#include "AliGRPManager.h" #include "AliCDBStorage.h" #include "AliCTPRawData.h" #include "AliCentralTrigger.h" @@ -125,7 +127,7 @@ #include "AliCodeTimer.h" #include "AliDAQ.h" #include "AliDigitizer.h" -#include "AliESD.h" +#include "AliESDEvent.h" #include "AliGRPObject.h" #include "AliGenEventHeader.h" #include "AliGenerator.h" @@ -165,7 +167,7 @@ AliSimulation::AliSimulation(const char* configFileName, fLoadAlObjsListOfDets("ALL"), fMakeSDigits("ALL"), fMakeDigits("ALL"), - fMakeTrigger(""), + fTriggerConfig(""), fMakeDigitsFromHits(""), fWriteRawData(""), fRawDataFileName(""), @@ -190,12 +192,18 @@ AliSimulation::AliSimulation(const char* configFileName, fSetRunNumberFromDataCalled(kFALSE), fEmbeddingFlag(kFALSE), fLego(NULL), + fKey(0), + fUseVertexFromCDB(0), + fUseMagFieldFromGRP(0), + fGRPWriteLocation(Form("local://%s", gSystem->pwd())), fQADetectors("ALL"), fQATasks("ALL"), - fQAManager(NULL), fRunQA(kTRUE), fEventSpecie(AliRecoParam::kDefault), + fWriteQAExpertData(kTRUE), + fGeometryFile(), fRunHLT("default"), + fpHLT(NULL), fWriteGRPEntry(kTRUE) { // create simulation object with default parameters @@ -203,10 +211,10 @@ AliSimulation::AliSimulation(const char* configFileName, SetGAliceFile("galice.root"); // for QA - fQAManager = AliQAManager::QAManager("sim") ; - fQAManager->SetActiveDetectors(fQADetectors) ; - fQATasks = Form("%d %d %d", AliQA::kHITS, AliQA::kSDIGITS, AliQA::kDIGITS) ; - fQAManager->SetTasks(fQATasks) ; + AliQAManager * qam = AliQAManager::QAManager(AliQAv1::kSIMMODE) ; + qam->SetActiveDetectors(fQADetectors) ; + fQATasks = Form("%d %d %d", AliQAv1::kHITS, AliQAv1::kSDIGITS, AliQAv1::kDIGITS) ; + qam->SetTasks(fQATasks) ; } //_____________________________________________________________________________ @@ -226,8 +234,8 @@ AliSimulation::~AliSimulation() fSpecCDBUri.Delete(); if (fgInstance==this) fgInstance = 0; - delete fQAManager ; - + AliQAManager::QAManager()->ShowQA() ; + AliQAManager::Destroy() ; AliCodeTimer::Instance()->Print(); } @@ -250,17 +258,19 @@ void AliSimulation::InitQA() if (fInitCDBCalled) return; fInitCDBCalled = kTRUE; - fQAManager = AliQAManager::QAManager("sim") ; - fQAManager->SetActiveDetectors(fQADetectors) ; - fQATasks = Form("%d %d %d", AliQA::kHITS, AliQA::kSDIGITS, AliQA::kDIGITS) ; - fQAManager->SetTasks(fQATasks) ; + AliQAManager * qam = AliQAManager::QAManager(AliQAv1::kSIMMODE) ; + qam->SetActiveDetectors(fQADetectors) ; + fQATasks = Form("%d %d %d", AliQAv1::kHITS, AliQAv1::kSDIGITS, AliQAv1::kDIGITS) ; + qam->SetTasks(fQATasks) ; + if (fWriteQAExpertData) + qam->SetWriteExpert() ; - if (fQAManager->IsDefaultStorageSet()) { + if (qam->IsDefaultStorageSet()) { AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); AliWarning("Default QA reference storage has been already set !"); AliWarning(Form("Ignoring the default storage declared in AliSimulation: %s",fQARefUri.Data())); AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); - fQARefUri = fQAManager->GetDefaultStorage()->GetURI(); + fQARefUri = qam->GetDefaultStorage()->GetURI(); } else { if (fQARefUri.Length() > 0) { AliDebug(2,"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); @@ -273,7 +283,7 @@ void AliSimulation::InitQA() AliWarning(Form("Setting it now to: %s", fQARefUri.Data())); AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); } - fQAManager->SetDefaultStorage(fQARefUri); + qam->SetDefaultStorage(fQARefUri); } } @@ -340,16 +350,11 @@ void AliSimulation::InitRunNumber(){ } if(fRun >= 0) { - AliDebug(2,"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); AliDebug(2, Form("Setting CDB run number to: %d",fRun)); - AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); } else { fRun=0; - AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); - AliWarning("Run number not yet set !!!!"); - AliWarning(Form("Setting it now to: %d", fRun)); - AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); - + AliWarning(Form("Run number not yet set !!!! Setting it now to: %d", + fRun)); } man->SetRun(fRun); @@ -362,7 +367,8 @@ void AliSimulation::SetCDBLock() { // Set CDB lock: from now on it is forbidden to reset the run number // or the default storage or to activate any further storage! - AliCDBManager::Instance()->SetLock(1); + ULong_t key = AliCDBManager::Instance()->SetLock(1); + if (key) fKey = key; } //_____________________________________________________________________________ @@ -380,7 +386,7 @@ void AliSimulation::SetQARefDefaultStorage(const char* uri) { // Activate it later within the Run() method fQARefUri = uri; - AliQA::SetQARefStorage(fQARefUri.Data()) ; + AliQAv1::SetQARefStorage(fQARefUri.Data()) ; } //_____________________________________________________________________________ @@ -527,7 +533,7 @@ Bool_t AliSimulation::MisalignGeometry(AliRunLoader *runLoader) } // Export ideal geometry - if(!gAlice->IsRootGeometry()) AliGeomManager::GetGeometry()->Export("geometry.root"); + if(!IsGeometryFromFile()) AliGeomManager::GetGeometry()->Export("geometry.root"); // Load alignment data from CDB and apply to geometry through AliGeomManager if(fLoadAlignFromCDB){ @@ -603,24 +609,35 @@ Bool_t AliSimulation::Run(Int_t nEvents) // run the generation, simulation and digitization - AliCodeTimerAuto("") + AliCodeTimerAuto("",0) + AliSysInfo::AddStamp("Start_Run"); // Load run number and seed from environmental vars ProcessEnvironmentVars(); + AliSysInfo::AddStamp("ProcessEnvironmentVars"); gRandom->SetSeed(fSeed); if (nEvents > 0) fNEvents = nEvents; + // create and setup the HLT instance + if (!fRunHLT.IsNull() && !CreateHLT()) { + if (fStopOnError) return kFALSE; + // disable HLT + fRunHLT=""; + } + // generation and simulation -> hits if (fRunGeneration) { if (!RunSimulation()) if (fStopOnError) return kFALSE; } + AliSysInfo::AddStamp("RunSimulation"); // initialize CDB storage from external environment // (either CDB manager or AliSimulation setters), // if not already done in RunSimulation() InitCDB(); + AliSysInfo::AddStamp("InitCDB"); // Set run number in CDBManager from data // From this point on the run number must be always loaded from data! @@ -634,7 +651,7 @@ Bool_t AliSimulation::Run(Int_t nEvents) if (!AliGeomManager::GetGeometry()) { // Initialize the geometry manager AliGeomManager::LoadGeometry("geometry.root"); - + AliSysInfo::AddStamp("GetGeometry"); // // Check that the consistency of symbolic names for the activated subdetectors // // in the geometry loaded by AliGeomManager // AliRunLoader* runLoader = LoadRun("READ"); @@ -656,6 +673,7 @@ Bool_t AliSimulation::Run(Int_t nEvents) // Misalign geometry if(!MisalignGeometry()) if (fStopOnError) return kFALSE; } + AliSysInfo::AddStamp("MissalignGeometry"); // hits -> summable digits @@ -690,13 +708,15 @@ Bool_t AliSimulation::Run(Int_t nEvents) } } + AliSysInfo::AddStamp("Hits2Digits"); // digits -> trigger - if (!RunTrigger(fMakeTrigger,fMakeDigits)) { + if (!RunTrigger(fTriggerConfig,fMakeDigits)) { if (fStopOnError) return kFALSE; } + AliSysInfo::AddStamp("RunTrigger"); // digits -> raw data @@ -707,6 +727,7 @@ Bool_t AliSimulation::Run(Int_t nEvents) } } + AliSysInfo::AddStamp("WriteRaw"); // run HLT simulation on simulated digit data if raw data is not // simulated, otherwise its called as part of WriteRawData @@ -715,6 +736,8 @@ Bool_t AliSimulation::Run(Int_t nEvents) if (fStopOnError) return kFALSE; } } + + AliSysInfo::AddStamp("RunHLT"); //QA if (fRunQA) { @@ -724,6 +747,8 @@ Bool_t AliSimulation::Run(Int_t nEvents) return kFALSE ; } + AliSysInfo::AddStamp("RunQA"); + // Cleanup of CDB manager: cache and active storages! AliCDBManager::Instance()->ClearCache(); @@ -775,7 +800,7 @@ Bool_t AliSimulation::RunLego(const char *setup, Int_t nc1, Float_t c1min, // run the generation and simulation - AliCodeTimerAuto("") + AliCodeTimerAuto("",0) // initialize CDB storage and run number from external environment // (either CDB manager or AliSimulation setters) @@ -832,10 +857,10 @@ Bool_t AliSimulation::RunLego(const char *setup, Int_t nc1, Float_t c1min, AliPDG::AddParticlesToPdgDataBase(); - gAlice->GetMCApp()->Init(); - gMC->SetMagField(TGeoGlobalMagField::Instance()->GetField()); + gAlice->GetMCApp()->Init(); + //Must be here because some MCs (G4) adds detectors here and not in Config.C gAlice->InitLoaders(); @@ -873,7 +898,7 @@ Bool_t AliSimulation::RunTrigger(const char* config, const char* detectors) { // run the trigger - AliCodeTimerAuto("") + AliCodeTimerAuto("",0) // initialize CDB storage from external environment // (either CDB manager or AliSimulation setters), @@ -893,8 +918,8 @@ Bool_t AliSimulation::RunTrigger(const char* config, const char* detectors) TString trconfiguration = config; if (trconfiguration.IsNull()) { - if (strcmp(gAlice->GetTriggerDescriptor(),"")) { - trconfiguration = gAlice->GetTriggerDescriptor(); + if(!fTriggerConfig.IsNull()) { + trconfiguration = fTriggerConfig; } else AliWarning("No trigger descriptor is specified. Loading the one that is in the CDB."); @@ -936,13 +961,16 @@ Bool_t AliSimulation::RunSimulation(Int_t nEvents) { // run the generation and simulation - AliCodeTimerAuto("") + AliCodeTimerAuto("",0) // initialize CDB storage and run number from external environment // (either CDB manager or AliSimulation setters) + AliSysInfo::AddStamp("RunSimulation_Begin"); InitCDB(); + AliSysInfo::AddStamp("RunSimulation_InitCDB"); InitRunNumber(); SetCDBLock(); + AliSysInfo::AddStamp("RunSimulation_SetCDBLock"); if (!gAlice) { AliError("no gAlice object. Restart aliroot and try again."); @@ -959,26 +987,70 @@ Bool_t AliSimulation::RunSimulation(Int_t nEvents) // // Initialize ALICE Simulation run // - gAlice->Announce(); + // + // If requested set the mag. field from the GRP entry. + // After this the field is loccked and cannot be changed by Config.C + if (fUseMagFieldFromGRP) { + AliGRPManager grpM; + grpM.ReadGRPEntry(); + grpM.SetMagField(); + AliInfo("Field is locked now. It cannot be changed in Config.C"); + } +// +// Execute Config.C gROOT->LoadMacro(fConfigFileName.Data()); gInterpreter->ProcessLine(gAlice->GetConfigFunction()); + AliSysInfo::AddStamp("RunSimulation_Config"); +// +// If requested obtain the vertex position and vertex sigma_z from the CDB +// This overwrites the settings from the Config.C + if (fUseVertexFromCDB) { + Double_t vtxPos[3] = {0., 0., 0.}; + Double_t vtxSig[3] = {0., 0., 0.}; + AliCDBEntry* entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertex"); + if (entry) { + AliESDVertex* vertex = dynamic_cast (entry->GetObject()); + if (vertex) { + if(vertex->GetXRes()>2.8) { // > pipe radius --> it's a dummy object, don't use it + entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertexSPD"); + if (entry) vertex = dynamic_cast (entry->GetObject()); + } + } + if (vertex) { + vertex->GetXYZ(vtxPos); + vertex->GetSigmaXYZ(vtxSig); + AliInfo("Overwriting Config.C vertex settings !"); + AliInfo(Form("Vertex position from OCDB entry: x = %13.3f, y = %13.3f, z = %13.3f (sigma = %13.3f)\n", + vtxPos[0], vtxPos[1], vtxPos[2], vtxSig[2])); + + AliGenerator *gen = gAlice->GetMCApp()->Generator(); + gen->SetOrigin(vtxPos[0], vtxPos[1], vtxPos[2]); // vertex position + gen->SetSigmaZ(vtxSig[2]); + } + } + } + if(AliCDBManager::Instance()->GetRun() >= 0) { AliRunLoader::Instance()->SetRunNumber(AliCDBManager::Instance()->GetRun()); + AliRunLoader::Instance()->SetNumberOfEventsPerRun(fNEvents); } else { AliWarning("Run number not initialized!!"); } AliRunLoader::Instance()->CdGAFile(); - - AliPDG::AddParticlesToPdgDataBase(); + - gAlice->GetMCApp()->Init(); + AliPDG::AddParticlesToPdgDataBase(); gMC->SetMagField(TGeoGlobalMagField::Instance()->GetField()); + AliSysInfo::AddStamp("RunSimulation_GetField"); + gAlice->GetMCApp()->Init(); + AliSysInfo::AddStamp("RunSimulation_InitMCApp"); + //Must be here because some MCs (G4) adds detectors here and not in Config.C gAlice->InitLoaders(); AliRunLoader::Instance()->MakeTree("E"); @@ -990,17 +1062,10 @@ Bool_t AliSimulation::RunSimulation(Int_t nEvents) AliRunLoader::Instance()->CdGAFile(); gAlice->Write(); gAlice->SetEventNrInRun(-1); //important - we start Begin event from increasing current number in run + AliSysInfo::AddStamp("RunSimulation_InitLoaders"); //___________________________________________________________________________________________ - // Get the trigger descriptor string - // Either from AliSimulation or from - // gAlice - if (fMakeTrigger.IsNull()) { - if (strcmp(gAlice->GetTriggerDescriptor(),"")) - fMakeTrigger = gAlice->GetTriggerDescriptor(); - } - else - gAlice->SetTriggerDescriptor(fMakeTrigger.Data()); + AliSysInfo::AddStamp("RunSimulation_TriggerDescriptor"); // Set run number in CDBManager AliInfo(Form("Run number: %d",AliCDBManager::Instance()->GetRun())); @@ -1030,6 +1095,7 @@ Bool_t AliSimulation::RunSimulation(Int_t nEvents) if(!AliGeomManager::CheckSymNamesLUT(detsToBeChecked.Data())) AliFatalClass("Current loaded geometry differs in the definition of symbolic names!"); MisalignGeometry(runLoader); + AliSysInfo::AddStamp("RunSimulation_MisalignGeometry"); #endif // AliRunLoader* runLoader = AliRunLoader::Instance(); @@ -1049,6 +1115,7 @@ Bool_t AliSimulation::RunSimulation(Int_t nEvents) // Write GRP entry corresponding to the setting found in Cofig.C if (fWriteGRPEntry) WriteGRPEntry(); + AliSysInfo::AddStamp("RunSimulation_WriteGRP"); if (nEvents <= 0) nEvents = fNEvents; @@ -1078,8 +1145,7 @@ Bool_t AliSimulation::RunSimulation(Int_t nEvents) loaderName += "Loader"; AliLoader* loader = runLoader->GetLoader(loaderName); if (!loader) { - AliError(Form("RunSimulation", "no loader for %s found\n" - "Number of events per file not set for %s %s", + AliError(Form("RunSimulation no loader for %s found\n Number of events per file not set for %s %s", detName, typeName, detName)); continue; } @@ -1097,7 +1163,7 @@ Bool_t AliSimulation::RunSimulation(Int_t nEvents) } AliInfo("running gAlice"); - AliSysInfo::AddStamp("Start_simulation"); + AliSysInfo::AddStamp("Start_ProcessRun"); // Create the Root Tree with one branch per detector //Hits moved to begin event -> now we are crating separate tree for each event @@ -1107,7 +1173,7 @@ Bool_t AliSimulation::RunSimulation(Int_t nEvents) // End of this run, close files if(nEvents>0) FinishRun(); - AliSysInfo::AddStamp("Stop_simulation"); + AliSysInfo::AddStamp("Stop_ProcessRun"); delete runLoader; return kTRUE; @@ -1118,7 +1184,7 @@ Bool_t AliSimulation::RunSDigitization(const char* detectors) { // run the digitization and produce summable digits static Int_t eventNr=0; - AliCodeTimerAuto("") + AliCodeTimerAuto("",0) ; // initialize CDB storage, run number, set CDB lock InitCDB(); @@ -1135,8 +1201,9 @@ Bool_t AliSimulation::RunSDigitization(const char* detectors) if (!det || !det->IsActive()) continue; if (IsSelected(det->GetName(), detStr)) { AliInfo(Form("creating summable digits for %s", det->GetName())); - AliCodeTimerAuto(Form("creating summable digits for %s", det->GetName())); + AliCodeTimerStart(Form("creating summable digits for %s", det->GetName())); det->Hits2SDigits(); + AliCodeTimerStop(Form("creating summable digits for %s", det->GetName())); AliSysInfo::AddStamp(Form("Digit_%s_%d",det->GetName(),eventNr), 0,1, eventNr); } } @@ -1159,7 +1226,7 @@ Bool_t AliSimulation::RunDigitization(const char* detectors, { // run the digitization and produce digits from sdigits - AliCodeTimerAuto("") + AliCodeTimerAuto("",0) // initialize CDB storage, run number, set CDB lock InitCDB(); @@ -1225,7 +1292,7 @@ Bool_t AliSimulation::RunHitsDigitization(const char* detectors) { // run the digitization and produce digits from hits - AliCodeTimerAuto("") + AliCodeTimerAuto("",0) // initialize CDB storage, run number, set CDB lock InitCDB(); @@ -1272,20 +1339,29 @@ Bool_t AliSimulation::WriteRawData(const char* detectors, // 'selrawdata' flag can be used to enable writing of detectors raw data // accoring to the trigger cluster. - AliCodeTimerAuto("") + AliCodeTimerAuto("",0) + AliSysInfo::AddStamp("WriteRawData_Start"); TString detStr = detectors; if (!WriteRawFiles(detStr.Data())) { if (fStopOnError) return kFALSE; } + AliSysInfo::AddStamp("WriteRawFiles"); // run HLT simulation on simulated DDL raw files // and produce HLT ddl raw files to be included in date/root file - if (IsSelected("HLT", detStr) && !fRunHLT.IsNull()) { + // bugfix 2009-06-26: the decision whether to write HLT raw data + // is taken in RunHLT. Here HLT always needs to be run in order to + // create HLT digits, unless its switched off. This is due to the + // special placement of the HLT between the generation of DDL files + // and conversion to DATE/Root file. + detStr.ReplaceAll("HLT", ""); + if (!fRunHLT.IsNull()) { if (!RunHLT()) { if (fStopOnError) return kFALSE; } } + AliSysInfo::AddStamp("WriteRawData_RunHLT"); TString dateFileName(fileName); if (!dateFileName.IsNull()) { @@ -1299,20 +1375,23 @@ Bool_t AliSimulation::WriteRawData(const char* detectors, if (!ConvertRawFilesToDate(dateFileName,selDateFileName)) { if (fStopOnError) return kFALSE; } + AliSysInfo::AddStamp("ConvertRawFilesToDate"); if (deleteIntermediateFiles) { AliRunLoader* runLoader = LoadRun("READ"); if (runLoader) for (Int_t iEvent = 0; iEvent < runLoader->GetNumberOfEvents(); iEvent++) { char command[256]; - sprintf(command, "rm -r raw%d", iEvent); + snprintf(command, 256, "rm -r raw%d", iEvent); gSystem->Exec(command); } + delete runLoader; } if (rootOutput) { if (!ConvertDateToRoot(dateFileName, fileName)) { if (fStopOnError) return kFALSE; } + AliSysInfo::AddStamp("ConvertDateToRoot"); if (deleteIntermediateFiles) { gSystem->Unlink(dateFileName); } @@ -1337,7 +1416,7 @@ Bool_t AliSimulation::WriteRawFiles(const char* detectors) { // convert the digits to raw data DDL files - AliCodeTimerAuto("") + AliCodeTimerAuto("",0) AliRunLoader* runLoader = LoadRun("READ"); if (!runLoader) return kFALSE; @@ -1348,7 +1427,7 @@ Bool_t AliSimulation::WriteRawFiles(const char* detectors) runLoader->GetEvent(iEvent); TString baseDir = gSystem->WorkingDirectory(); char dirName[256]; - sprintf(dirName, "raw%d", iEvent); + snprintf(dirName, 256, "raw%d", iEvent); gSystem->MakeDirectory(dirName); if (!gSystem->ChangeDirectory(dirName)) { AliError(Form("couldn't change to directory %s", dirName)); @@ -1398,7 +1477,7 @@ Bool_t AliSimulation::ConvertRawFilesToDate(const char* dateFileName, // The second argument is not empty when the user decides to write // the detectors raw data according to the trigger cluster. - AliCodeTimerAuto("") + AliCodeTimerAuto("",0) char* path = gSystem->Which(gSystem->Getenv("PATH"), "dateStream"); if (!path) { @@ -1418,7 +1497,7 @@ Bool_t AliSimulation::ConvertRawFilesToDate(const char* dateFileName, char command[256]; // Note the option -s. It is used in order to avoid // the generation of SOR/EOR events. - sprintf(command, "dateStream -c -s -D -o %s -# %d -C -run %d", + snprintf(command, 256, "dateStream -c -s -D -o %s -# %d -C -run %d", dateFileName, runLoader->GetNumberOfEvents(),runLoader->GetHeader()->GetRun()); FILE* pipe = gSystem->OpenPipe(command, "w"); @@ -1461,7 +1540,7 @@ Bool_t AliSimulation::ConvertRawFilesToDate(const char* dateFileName, ldc += AliDAQ::NumberOfLdcs(iDet) / AliDAQ::NumberOfDdls(iDet); char rawFileName[256]; - sprintf(rawFileName, "raw%d/%s", + snprintf(rawFileName, 256, "raw%d/%s", iEvent, AliDAQ::DdlFileName(iDet,iDDL)); // check existence and size of raw data file @@ -1490,7 +1569,7 @@ Bool_t AliSimulation::ConvertRawFilesToDate(const char* dateFileName, AliInfo(Form("converting selected by trigger cluster raw data DDL files to DATE file %s", selDateFileName)); - sprintf(command, "dateStream -c -s -D -o %s -# %d -C -run %d", + snprintf(command, 256, "dateStream -c -s -D -o %s -# %d -C -run %d", selDateFileName,selEvents,runLoader->GetHeader()->GetRun()); FILE* pipe2 = gSystem->OpenPipe(command, "w"); @@ -1525,7 +1604,7 @@ Bool_t AliSimulation::ConvertRawFilesToDate(const char* dateFileName, ldc += AliDAQ::NumberOfLdcs(iDet) / AliDAQ::NumberOfDdls(iDet); char rawFileName[256]; - sprintf(rawFileName, "raw%d/%s", + snprintf(rawFileName, 256, "raw%d/%s", iEvent, AliDAQ::DdlFileName(iDet,iDDL)); // check existence and size of raw data file @@ -1715,7 +1794,7 @@ Bool_t AliSimulation::IsSelected(TString detName, TString& detectors) const } //_____________________________________________________________________________ -Bool_t AliSimulation::ConvertRaw2SDigits(const char* rawDirectory, const char* esdFileName) +Bool_t AliSimulation::ConvertRaw2SDigits(const char* rawDirectory, const char* esdFileName, Int_t N) { // // Steering routine to convert raw data in directory rawDirectory/ to fake SDigits. @@ -1750,16 +1829,17 @@ Bool_t AliSimulation::ConvertRaw2SDigits(const char* rawDirectory, const char* e AliPDG::AddParticlesToPdgDataBase(); - gAlice->GetMCApp()->Init(); - gMC->SetMagField(TGeoGlobalMagField::Instance()->GetField()); + gAlice->GetMCApp()->Init(); + //Must be here because some MCs (G4) adds detectors here and not in Config.C gAlice->InitLoaders(); AliRunLoader::Instance()->MakeTree("E"); AliRunLoader::Instance()->LoadKinematics("RECREATE"); AliRunLoader::Instance()->LoadTrackRefs("RECREATE"); AliRunLoader::Instance()->LoadHits("all","RECREATE"); + // // Save stuff at the beginning of the file to avoid file corruption AliRunLoader::Instance()->CdGAFile(); @@ -1776,19 +1856,18 @@ Bool_t AliSimulation::ConvertRaw2SDigits(const char* rawDirectory, const char* e AliRunLoader* runLoader = AliRunLoader::Instance(); // // Open esd file if available - TFile* esdFile = TFile::Open(esdFileName); - Bool_t esdOK = (esdFile != 0); - AliESD* esd = new AliESD; + TFile* esdFile = 0; TTree* treeESD = 0; - if (esdOK) { - treeESD = (TTree*) esdFile->Get("esdTree"); - if (!treeESD) { - AliWarning("No ESD tree found"); - esdOK = kFALSE; - } else { - treeESD->SetBranchAddress("ESD", &esd); - } + AliESDEvent* esd = 0; + if (esdFileName && (strlen(esdFileName)>0)) { + esdFile = TFile::Open(esdFileName); + if (esdFile) { + esd = new AliESDEvent(); + esdFile->GetObject("esdTree", treeESD); + if (treeESD) esd->ReadFromTree(treeESD); + } } + // // Create the RawReader TString fileName(rawDirectory); @@ -1800,6 +1879,8 @@ Bool_t AliSimulation::ConvertRaw2SDigits(const char* rawDirectory, const char* e } else if (!fileName.IsNull()) { rawReader = new AliRawReaderDate(fileName); } + if (!rawReader) return (kFALSE); + // if (!fEquipIdMap.IsNull() && fRawReader) // fRawReader->LoadEquipmentIdsMap(fEquipIdMap); // @@ -1808,28 +1889,32 @@ Bool_t AliSimulation::ConvertRaw2SDigits(const char* rawDirectory, const char* e // // Get Header AliHeader* header = runLoader->GetHeader(); - // - TString detStr = fMakeSDigits; // Event loop Int_t nev = 0; while(kTRUE) { if (!(rawReader->NextEvent())) break; + runLoader->SetEventNumber(nev); + runLoader->GetHeader()->Reset(rawReader->GetRunNumber(), + nev, nev); + runLoader->GetEvent(nev); + AliInfo(Form("We are at event %d",nev)); // // Detector loop + TString detStr = fMakeSDigits; for (iDet = 0; iDet < detArray->GetEntriesFast(); iDet++) { AliModule* det = (AliModule*) detArray->At(iDet); if (!det || !det->IsActive()) continue; if (IsSelected(det->GetName(), detStr)) { - AliInfo(Form("Calling Raw2SDigits for %s\n", det->GetName())); + AliInfo(Form("Calling Raw2SDigits for %s", det->GetName())); det->Raw2SDigits(rawReader); rawReader->Reset(); } } // detectors - + // // If ESD information available obtain reconstructed vertex and store in header. - if (esdOK) { + if (treeESD) { treeESD->GetEvent(nev); const AliESDVertex* esdVertex = esd->GetPrimaryVertex(); Double_t position[3]; @@ -1841,13 +1926,15 @@ Bool_t AliSimulation::ConvertRaw2SDigits(const char* rawDirectory, const char* e mcHeader->SetPrimaryVertex(mcV); header->Reset(0,nev); header->SetGenEventHeader(mcHeader); - printf("***** Saved vertex %f %f %f \n", position[0], position[1], position[2]); + AliInfo(Form("***** Saved vertex %f %f %f \n", position[0], position[1], position[2])); } - nev++; // // Finish the event runLoader->TreeE()->Fill(); - runLoader->SetNextEvent(); + AliInfo(Form("Finished event %d",nev)); + nev++; + if (N>0&&nev>=N) + break; } // events delete rawReader; @@ -1906,6 +1993,62 @@ Int_t AliSimulation::GetDetIndex(const char* detector) return index ; } +//_____________________________________________________________________________ +Bool_t AliSimulation::CreateHLT() +{ + // Init the HLT simulation. + // The function loads the library and creates the instance of AliHLTSimulation. + // the main reason for the decoupled creation is to set the transient OCDB + // objects before the OCDB is locked + + // load the library dynamically + gSystem->Load(ALIHLTSIMULATION_LIBRARY); + + // check for the library version + AliHLTSimulationGetLibraryVersion_t fctVersion=(AliHLTSimulationGetLibraryVersion_t)(gSystem->DynFindSymbol(ALIHLTSIMULATION_LIBRARY, ALIHLTSIMULATION_GET_LIBRARY_VERSION)); + if (!fctVersion) { + AliError(Form("can not load library %s", ALIHLTSIMULATION_LIBRARY)); + return kFALSE; + } + if (fctVersion()!= ALIHLTSIMULATION_LIBRARY_VERSION) { + AliWarning(Form("%s version does not match: compiled for version %d, loaded %d", ALIHLTSIMULATION_LIBRARY, ALIHLTSIMULATION_LIBRARY_VERSION, fctVersion())); + } + + // print compile info + typedef void (*CompileInfo)( const char*& date, const char*& time); + CompileInfo fctInfo=(CompileInfo)gSystem->DynFindSymbol(ALIHLTSIMULATION_LIBRARY, "CompileInfo"); + if (fctInfo) { + const char* date=""; + const char* time=""; + (*fctInfo)(date, time); + if (!date) date="unknown"; + if (!time) time="unknown"; + AliInfo(Form("%s build on %s (%s)", ALIHLTSIMULATION_LIBRARY, date, time)); + } else { + AliInfo(Form("no build info available for %s", ALIHLTSIMULATION_LIBRARY)); + } + + // create instance of the HLT simulation + AliHLTSimulationCreateInstance_t fctCreate=(AliHLTSimulationCreateInstance_t)(gSystem->DynFindSymbol(ALIHLTSIMULATION_LIBRARY, ALIHLTSIMULATION_CREATE_INSTANCE)); + if (fctCreate==NULL || (fpHLT=(fctCreate()))==NULL) { + AliError(Form("can not create instance of HLT simulation (creator %p)", fctCreate)); + return kFALSE; + } + + TString specObjects; + for (Int_t i = 0; i < fSpecCDBUri.GetEntriesFast(); i++) { + if (specObjects.Length()>0) specObjects+=" "; + specObjects+=fSpecCDBUri[i]->GetName(); + } + + AliHLTSimulationSetup_t fctSetup=(AliHLTSimulationSetup_t)(gSystem->DynFindSymbol(ALIHLTSIMULATION_LIBRARY, ALIHLTSIMULATION_SETUP)); + if (fctSetup==NULL || fctSetup(fpHLT, this, specObjects.Data())<0) { + AliWarning(Form("failed to setup HLT simulation (function %p)", fctSetup)); + } + + return kTRUE; +} + //_____________________________________________________________________________ Bool_t AliSimulation::RunHLT() { @@ -1939,52 +2082,22 @@ Bool_t AliSimulation::RunHLT() // raw data is simulated int iResult=0; + + if (!fpHLT && !CreateHLT()) { + return kFALSE; + } + AliHLTSimulation* pHLT=fpHLT; + AliRunLoader* pRunLoader = LoadRun("READ"); if (!pRunLoader) return kFALSE; // initialize CDB storage, run number, set CDB lock + // thats for the case of running HLT simulation without all the other steps + // multiple calls are handled by the function, so we can just call InitCDB(); if (!SetRunNumberFromData()) if (fStopOnError) return kFALSE; SetCDBLock(); - // load the library dynamically - gSystem->Load(ALIHLTSIMULATION_LIBRARY); - - // check for the library version - AliHLTSimulationGetLibraryVersion_t fctVersion=(AliHLTSimulationGetLibraryVersion_t)(gSystem->DynFindSymbol(ALIHLTSIMULATION_LIBRARY, ALIHLTSIMULATION_GET_LIBRARY_VERSION)); - if (!fctVersion) { - AliError(Form("can not load library %s", ALIHLTSIMULATION_LIBRARY)); - return kFALSE; - } - if (fctVersion()!= ALIHLTSIMULATION_LIBRARY_VERSION) { - AliError(Form("%s version does not match: compiled for version %d, loaded %d", ALIHLTSIMULATION_LIBRARY, ALIHLTSIMULATION_LIBRARY_VERSION, fctVersion())); - return kFALSE; - } - - // print compile info - typedef void (*CompileInfo)( char*& date, char*& time); - CompileInfo fctInfo=(CompileInfo)gSystem->DynFindSymbol(ALIHLTSIMULATION_LIBRARY, "CompileInfo"); - if (fctInfo) { - Char_t* date=0; - Char_t* time=0; - (*fctInfo)(date,time); - if (!date) {date=new Char_t[8]; strcpy(date,"unknown");} - if (!time) {time=new Char_t[8]; strcpy(time,"unknown");} - AliInfo(Form("%s build on %s (%s)", ALIHLTSIMULATION_LIBRARY, date, time)); - delete date; - delete time; - } else { - AliInfo(Form("no build info available for %s", ALIHLTSIMULATION_LIBRARY)); - } - - // create instance of the HLT simulation - AliHLTSimulationCreateInstance_t fctCreate=(AliHLTSimulationCreateInstance_t)(gSystem->DynFindSymbol(ALIHLTSIMULATION_LIBRARY, ALIHLTSIMULATION_CREATE_INSTANCE)); - AliHLTSimulation* pHLT=NULL; - if (fctCreate==NULL || (pHLT=(fctCreate()))==NULL) { - AliError(Form("can not create instance of HLT simulation (creator %p)", fctCreate)); - return kFALSE; - } - // init the HLT simulation TString options; if (fRunHLT.CompareTo("default")!=0) options=fRunHLT; @@ -2029,13 +2142,13 @@ Bool_t AliSimulation::RunQA() { // run the QA on summable hits, digits or digits - if(!gAlice) return kFALSE; - fQAManager->SetRunLoader(AliRunLoader::Instance()) ; + //if(!gAlice) return kFALSE; + AliQAManager::QAManager()->SetRunLoader(AliRunLoader::Instance()) ; TString detectorsw("") ; Bool_t rv = kTRUE ; - fQAManager->SetEventSpecie(fEventSpecie) ; - detectorsw = fQAManager->Run(fQADetectors.Data()) ; + AliQAManager::QAManager()->SetEventSpecie(fEventSpecie) ; + detectorsw = AliQAManager::QAManager()->Run(fQADetectors.Data()) ; if ( detectorsw.IsNull() ) rv = kFALSE ; return rv ; @@ -2055,20 +2168,32 @@ Bool_t AliSimulation::SetRunQA(TString detAndAction) } Int_t colon = detAndAction.Index(":") ; fQADetectors = detAndAction(0, colon) ; - if (fQADetectors.Contains("ALL") ) - fQADetectors = Form("%s %s", fMakeDigits.Data(), fMakeDigitsFromHits.Data()) ; - fQATasks = detAndAction(colon+1, detAndAction.Sizeof() ) ; + if (fQADetectors.Contains("ALL") ){ + TString tmp = Form("%s %s", fMakeDigits.Data(), fMakeDigitsFromHits.Data()) ; + Int_t minus = fQADetectors.Last('-') ; + TString toKeep = Form("%s %s", fMakeDigits.Data(), fMakeDigitsFromHits.Data()) ; + TString toRemove("") ; + while (minus >= 0) { + toRemove = fQADetectors(minus+1, fQADetectors.Length()) ; + toRemove = toRemove.Strip() ; + toKeep.ReplaceAll(toRemove, "") ; + fQADetectors.ReplaceAll(Form("-%s", toRemove.Data()), "") ; + minus = fQADetectors.Last('-') ; + } + fQADetectors = toKeep ; + } + fQATasks = detAndAction(colon+1, detAndAction.Sizeof() ) ; if (fQATasks.Contains("ALL") ) { - fQATasks = Form("%d %d %d", AliQA::kHITS, AliQA::kSDIGITS, AliQA::kDIGITS) ; + fQATasks = Form("%d %d %d", AliQAv1::kHITS, AliQAv1::kSDIGITS, AliQAv1::kDIGITS) ; } else { fQATasks.ToUpper() ; TString tempo("") ; if ( fQATasks.Contains("HIT") ) - tempo = Form("%d ", AliQA::kHITS) ; + tempo = Form("%d ", AliQAv1::kHITS) ; if ( fQATasks.Contains("SDIGIT") ) - tempo += Form("%d ", AliQA::kSDIGITS) ; + tempo += Form("%d ", AliQAv1::kSDIGITS) ; if ( fQATasks.Contains("DIGIT") ) - tempo += Form("%d ", AliQA::kDIGITS) ; + tempo += Form("%d ", AliQAv1::kDIGITS) ; fQATasks = tempo ; if (fQATasks.IsNull()) { AliInfo("No QA requested\n") ; @@ -2077,15 +2202,15 @@ Bool_t AliSimulation::SetRunQA(TString detAndAction) } } TString tempo(fQATasks) ; - tempo.ReplaceAll(Form("%d", AliQA::kHITS), AliQA::GetTaskName(AliQA::kHITS)) ; - tempo.ReplaceAll(Form("%d", AliQA::kSDIGITS), AliQA::GetTaskName(AliQA::kSDIGITS)) ; - tempo.ReplaceAll(Form("%d", AliQA::kDIGITS), AliQA::GetTaskName(AliQA::kDIGITS)) ; + tempo.ReplaceAll(Form("%d", AliQAv1::kHITS), AliQAv1::GetTaskName(AliQAv1::kHITS)) ; + tempo.ReplaceAll(Form("%d", AliQAv1::kSDIGITS), AliQAv1::GetTaskName(AliQAv1::kSDIGITS)) ; + tempo.ReplaceAll(Form("%d", AliQAv1::kDIGITS), AliQAv1::GetTaskName(AliQAv1::kDIGITS)) ; AliInfo( Form("QA will be done on \"%s\" for \"%s\"\n", fQADetectors.Data(), tempo.Data()) ) ; fRunQA = kTRUE ; - fQAManager->SetActiveDetectors(fQADetectors) ; - fQAManager->SetTasks(fQATasks) ; - for (Int_t det = 0 ; det < AliQA::kNDET ; det++) - fQAManager->SetWriteExpert(AliQA::DETECTORINDEX_t(det)) ; + AliQAManager::QAManager()->SetActiveDetectors(fQADetectors) ; + AliQAManager::QAManager()->SetTasks(fQATasks) ; + for (Int_t det = 0 ; det < AliQAv1::kNDET ; det++) + AliQAManager::QAManager()->SetWriteExpert(AliQAv1::DETECTORINDEX_t(det)) ; return kTRUE; } @@ -2143,13 +2268,17 @@ void AliSimulation::WriteGRPEntry() grpObj->SetRunType("PHYSICS"); grpObj->SetTimeStart(0); - grpObj->SetTimeEnd(9999); + TDatime curtime; + grpObj->SetTimeStart(0); + grpObj->SetTimeEnd(curtime.Convert()); + grpObj->SetBeamEnergyIsSqrtSHalfGeV(); // new format of GRP: store sqrt(s)/2 in GeV const AliGenerator *gen = gAlice->GetMCApp()->Generator(); + Int_t a = 0; + Int_t z = 0; + if (gen) { - grpObj->SetBeamEnergy(gen->GetEnergyCMS()); TString projectile; - Int_t a,z; gen->GetProjectile(projectile,a,z); TString target; gen->GetTarget(target,a,z); @@ -2157,9 +2286,15 @@ void AliSimulation::WriteGRPEntry() beamType.ReplaceAll(" ",""); if (!beamType.CompareTo("-")) { grpObj->SetBeamType("UNKNOWN"); + grpObj->SetBeamEnergy(gen->GetEnergyCMS()/2); } else { grpObj->SetBeamType(beamType); + if (z != 0) { + grpObj->SetBeamEnergy(gen->GetEnergyCMS()/2 * a / z); + } else { + grpObj->SetBeamEnergy(gen->GetEnergyCMS()/2 ); + } // Heavy ion run, the event specie is set to kHighMult fEventSpecie = AliRecoParam::kHighMult; if ((strcmp(beamType,"p-p") == 0) || @@ -2188,7 +2323,7 @@ void AliSimulation::WriteGRPEntry() } } // CTP - if (!fMakeTrigger.IsNull() || strcmp(gAlice->GetTriggerDescriptor(),"")) + if (!fTriggerConfig.IsNull()) detectorPattern |= (1 << AliDAQ::DetectorID("TRG")); // HLT @@ -2199,35 +2334,35 @@ void AliSimulation::WriteGRPEntry() grpObj->SetDetectorMask((Int_t)detectorPattern); grpObj->SetLHCPeriod("LHC08c"); grpObj->SetLHCState("STABLE_BEAMS"); - grpObj->SetLHCLuminosity(0,(AliGRPObject::Stats)0); - grpObj->SetBeamIntensity(0,(AliGRPObject::Stats)0); - + // AliMagF *field = (AliMagF*)TGeoGlobalMagField::Instance()->GetField(); Float_t solenoidField = field ? TMath::Abs(field->SolenoidField()) : 0; - Float_t factor = field ? field->Factor() : 0; - Float_t l3current = TMath::Abs(factor)*solenoidField*30000./5.; - grpObj->SetL3Current(l3current,(AliGRPObject::Stats)0); - - if (factor > 0) { - grpObj->SetL3Polarity(0); - grpObj->SetDipolePolarity(0); - } - else { - grpObj->SetL3Polarity(1); - grpObj->SetDipolePolarity(1); - } - - if (TMath::Abs(factor) != 0) - grpObj->SetDipoleCurrent(6000,(AliGRPObject::Stats)0); - else - grpObj->SetDipoleCurrent(0,(AliGRPObject::Stats)0); + Float_t factorSol = field ? field->GetFactorSol() : 0; + Float_t currentSol = TMath::Abs(factorSol)>1E-6 ? + TMath::Nint(TMath::Abs(solenoidField/factorSol))/5.*30000.*TMath::Abs(factorSol) : 0; + // + Float_t factorDip = field ? field->GetFactorDip() : 0; + Float_t currentDip = 6000.*TMath::Abs(factorDip); + // + grpObj->SetL3Current(currentSol,(AliGRPObject::Stats)0); + grpObj->SetDipoleCurrent(currentDip,(AliGRPObject::Stats)0); + grpObj->SetL3Polarity(factorSol>0 ? 0:1); + grpObj->SetDipolePolarity(factorDip>0 ? 0:1); + if (field) grpObj->SetUniformBMap(field->IsUniform()); // for special MC with k5kGUniform map + grpObj->SetPolarityConventionLHC(); // LHC convention +/+ current -> -/- field main components + // grpObj->SetCavernTemperature(0,(AliGRPObject::Stats)0); //grpMap->Add(new TObjString("fCavernPressure"),new TObjString("0")); ---> not inserted in simulation with the new object, since it is now an AliDCSSensor // Now store the entry in OCDB AliCDBManager* man = AliCDBManager::Instance(); + + man->SetLock(0, fKey); + + AliCDBStorage* sto = man->GetStorage(fGRPWriteLocation.Data()); + AliCDBId id("GRP/GRP/Data", man->GetRun(), man->GetRun(), 1, 1); AliCDBMetaData *metadata= new AliCDBMetaData(); @@ -2235,7 +2370,8 @@ void AliSimulation::WriteGRPEntry() metadata->SetResponsible("alice-off@cern.ch"); metadata->SetComment("Automatically produced GRP entry for Monte Carlo"); - man->Put(grpObj,id,metadata); + sto->Put(grpObj,id,metadata); + man->SetLock(1, fKey); }