X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=STEER%2FAliSimulation.cxx;h=6306067d5c144133595faa9377af8e5f6c46d2f3;hb=1fb480e4317e2c7e3a508360e3f3134f8e61cb88;hp=5e90849687a9bd5cedd83e621ef2edd7d2185859;hpb=c54a46e3332b94eb6cd7958e90e777263ab4d390;p=u%2Fmrichter%2FAliRoot.git diff --git a/STEER/AliSimulation.cxx b/STEER/AliSimulation.cxx index 5e90849687a..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" @@ -165,7 +167,7 @@ AliSimulation::AliSimulation(const char* configFileName, fLoadAlObjsListOfDets("ALL"), fMakeSDigits("ALL"), fMakeDigits("ALL"), - fMakeTrigger(""), + fTriggerConfig(""), fMakeDigitsFromHits(""), fWriteRawData(""), fRawDataFileName(""), @@ -190,11 +192,16 @@ 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"), fRunQA(kTRUE), fEventSpecie(AliRecoParam::kDefault), fWriteQAExpertData(kTRUE), + fGeometryFile(), fRunHLT("default"), fpHLT(NULL), fWriteGRPEntry(kTRUE) @@ -360,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; } //_____________________________________________________________________________ @@ -525,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){ @@ -643,9 +651,7 @@ Bool_t AliSimulation::Run(Int_t nEvents) if (!AliGeomManager::GetGeometry()) { // Initialize the geometry manager AliGeomManager::LoadGeometry("geometry.root"); - AliSysInfo::AddStamp("GetGeometry"); - - + AliSysInfo::AddStamp("GetGeometry"); // // Check that the consistency of symbolic names for the activated subdetectors // // in the geometry loaded by AliGeomManager // AliRunLoader* runLoader = LoadRun("READ"); @@ -706,7 +712,7 @@ Bool_t AliSimulation::Run(Int_t nEvents) // digits -> trigger - if (!RunTrigger(fMakeTrigger,fMakeDigits)) { + if (!RunTrigger(fTriggerConfig,fMakeDigits)) { if (fStopOnError) return kFALSE; } @@ -851,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(); @@ -912,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."); @@ -981,13 +987,52 @@ 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); @@ -996,15 +1041,16 @@ Bool_t AliSimulation::RunSimulation(Int_t nEvents) } AliRunLoader::Instance()->CdGAFile(); - - AliPDG::AddParticlesToPdgDataBase(); + - gAlice->GetMCApp()->Init(); - AliSysInfo::AddStamp("RunSimulation_InitMCApp"); + 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"); @@ -1019,15 +1065,6 @@ Bool_t AliSimulation::RunSimulation(Int_t nEvents) 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 @@ -1108,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; } @@ -1345,9 +1381,10 @@ Bool_t AliSimulation::WriteRawData(const char* detectors, 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) { @@ -1390,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)); @@ -1460,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"); @@ -1503,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 @@ -1532,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"); @@ -1567,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 @@ -1757,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. @@ -1792,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(); @@ -1818,11 +1856,17 @@ Bool_t AliSimulation::ConvertRaw2SDigits(const char* rawDirectory, const char* e AliRunLoader* runLoader = AliRunLoader::Instance(); // // Open esd file if available - TFile* esdFile = TFile::Open(esdFileName); + TFile* esdFile = 0; TTree* treeESD = 0; - AliESDEvent* esd = new AliESDEvent(); - esdFile->GetObject("esdTree", treeESD); - if (treeESD) esd->ReadFromTree(treeESD); + 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 @@ -1835,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); // @@ -1843,24 +1889,28 @@ 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. @@ -1876,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; @@ -2090,7 +2142,7 @@ Bool_t AliSimulation::RunQA() { // run the QA on summable hits, digits or digits - if(!gAlice) return kFALSE; + //if(!gAlice) return kFALSE; AliQAManager::QAManager()->SetRunLoader(AliRunLoader::Instance()) ; TString detectorsw("") ; @@ -2216,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()/0.120); TString projectile; - Int_t a,z; gen->GetProjectile(projectile,a,z); TString target; gen->GetTarget(target,a,z); @@ -2230,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) || @@ -2261,7 +2323,7 @@ void AliSimulation::WriteGRPEntry() } } // CTP - if (!fMakeTrigger.IsNull() || strcmp(gAlice->GetTriggerDescriptor(),"")) + if (!fTriggerConfig.IsNull()) detectorPattern |= (1 << AliDAQ::DetectorID("TRG")); // HLT @@ -2272,8 +2334,6 @@ 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; @@ -2289,7 +2349,7 @@ void AliSimulation::WriteGRPEntry() grpObj->SetDipoleCurrent(currentDip,(AliGRPObject::Stats)0); grpObj->SetL3Polarity(factorSol>0 ? 0:1); grpObj->SetDipolePolarity(factorDip>0 ? 0:1); - grpObj->SetUniformBMap(field->IsUniform()); // for special MC with k5kGUniform map + 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); @@ -2298,6 +2358,11 @@ void AliSimulation::WriteGRPEntry() // 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(); @@ -2305,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); }