+
+//_____________________________________________________________________________
+void AliSimulation::FinishRun()
+{
+ //
+ // Called at the end of the run.
+ //
+
+ if(IsLegoRun())
+ {
+ AliDebug(1, "Finish Lego");
+ AliRunLoader::Instance()->CdGAFile();
+ fLego->FinishRun();
+ }
+
+ // Clean detector information
+ TIter next(gAlice->Modules());
+ AliModule *detector;
+ while((detector = dynamic_cast<AliModule*>(next()))) {
+ AliDebug(2, Form("%s->FinishRun()", detector->GetName()));
+ detector->FinishRun();
+ }
+
+ AliDebug(1, "AliRunLoader::Instance()->WriteHeader(OVERWRITE)");
+ AliRunLoader::Instance()->WriteHeader("OVERWRITE");
+
+ // Write AliRun info and all detectors parameters
+ AliRunLoader::Instance()->CdGAFile();
+ gAlice->Write(0,TObject::kOverwrite);//write AliRun
+ AliRunLoader::Instance()->Write(0,TObject::kOverwrite);//write RunLoader itself
+
+ if(gAlice->GetMCApp()) gAlice->GetMCApp()->FinishRun();
+ AliRunLoader::Instance()->Synchronize();
+}
+
+//_____________________________________________________________________________
+Int_t AliSimulation::GetDetIndex(const char* detector)
+{
+ // return the detector index corresponding to detector
+ Int_t index = -1 ;
+ for (index = 0; index < fgkNDetectors ; index++) {
+ if ( strcmp(detector, fgkDetectorName[index]) == 0 )
+ break ;
+ }
+ return index ;
+}
+
+//_____________________________________________________________________________
+Bool_t AliSimulation::RunHLT()
+{
+ // Run the HLT simulation
+ // HLT simulation is implemented in HLT/sim/AliHLTSimulation
+ // Disabled if fRunHLT is empty, default vaule is "default".
+ // AliSimulation::SetRunHLT can be used to set the options for HLT simulation
+ // The default simulation depends on the HLT component libraries and their
+ // corresponding agents which define components and chains to run. See
+ // http://web.ift.uib.no/~kjeks/doc/alice-hlt-current/
+ // http://web.ift.uib.no/~kjeks/doc/alice-hlt-current/classAliHLTModuleAgent.html
+ //
+ // The libraries to be loaded can be specified as an option.
+ // <pre>
+ // AliSimulation sim;
+ // sim.SetRunHLT("libAliHLTSample.so");
+ // </pre>
+ // will only load <tt>libAliHLTSample.so</tt>
+
+ // Other available options:
+ // \li loglevel=<i>level</i> <br>
+ // logging level for this processing
+ // \li alilog=off
+ // disable redirection of log messages to AliLog class
+ // \li config=<i>macro</i>
+ // configuration macro
+ // \li chains=<i>configuration</i>
+ // comma separated list of configurations to be run during simulation
+ // \li rawfile=<i>file</i>
+ // source for the RawReader to be created, the default is <i>./</i> if
+ // raw data is simulated
+
+ int iResult=0;
+ AliRunLoader* pRunLoader = LoadRun("READ");
+ if (!pRunLoader) return kFALSE;
+
+ // initialize CDB storage, run number, set CDB lock
+ 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;
+ TString detStr = fWriteRawData;
+ if (!IsSelected("HLT", detStr)) {
+ options+=" writerawfiles=";
+ } else {
+ options+=" writerawfiles=HLT";
+ }
+
+ if (!detStr.IsNull() && !options.Contains("rawfile=")) {
+ // as a matter of fact, HLT will run reconstruction and needs the RawReader
+ // in order to get detector data. By default, RawReaderFile is used to read
+ // the already simulated ddl files. Date and Root files from the raw data
+ // are generated after the HLT simulation.
+ options+=" rawfile=./";
+ }
+
+ AliHLTSimulationInit_t fctInit=(AliHLTSimulationInit_t)(gSystem->DynFindSymbol(ALIHLTSIMULATION_LIBRARY, ALIHLTSIMULATION_INIT));
+ if (fctInit==NULL || (iResult=(fctInit(pHLT, pRunLoader, options.Data())))<0) {
+ AliError(Form("can not init HLT simulation: error %d (init %p)", iResult, fctInit));
+ } else {
+ // run the HLT simulation
+ AliHLTSimulationRun_t fctRun=(AliHLTSimulationRun_t)(gSystem->DynFindSymbol(ALIHLTSIMULATION_LIBRARY, ALIHLTSIMULATION_RUN));
+ if (fctRun==NULL || (iResult=(fctRun(pHLT, pRunLoader)))<0) {
+ AliError(Form("can not run HLT simulation: error %d (run %p)", iResult, fctRun));
+ }
+ }
+
+ // delete the instance
+ AliHLTSimulationDeleteInstance_t fctDelete=(AliHLTSimulationDeleteInstance_t)(gSystem->DynFindSymbol(ALIHLTSIMULATION_LIBRARY, ALIHLTSIMULATION_DELETE_INSTANCE));
+ if (fctDelete==NULL || fctDelete(pHLT)<0) {
+ AliError(Form("can not delete instance of HLT simulation (creator %p)", fctDelete));
+ }
+ pHLT=NULL;
+
+ return iResult>=0?kTRUE:kFALSE;
+}
+
+//_____________________________________________________________________________
+Bool_t AliSimulation::RunQA()
+{
+ // run the QA on summable hits, digits or digits
+
+ if(!gAlice) return kFALSE;
+ fQAManager->SetRunLoader(AliRunLoader::Instance()) ;
+
+ TString detectorsw("") ;
+ Bool_t rv = kTRUE ;
+ fQAManager->SetEventSpecie(fEventSpecie) ;
+ detectorsw = fQAManager->Run(fQADetectors.Data()) ;
+ if ( detectorsw.IsNull() )
+ rv = kFALSE ;
+ return rv ;
+}
+
+//_____________________________________________________________________________
+Bool_t AliSimulation::SetRunQA(TString detAndAction)
+{
+ // Allows to run QA for a selected set of detectors
+ // and a selected set of tasks among HITS, SDIGITS and DIGITS
+ // all selected detectors run the same selected tasks
+
+ if (!detAndAction.Contains(":")) {
+ AliError( Form("%s is a wrong syntax, use \"DetectorList:ActionList\" \n", detAndAction.Data()) ) ;
+ fRunQA = kFALSE ;
+ return kFALSE ;
+ }
+ 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 (fQATasks.Contains("ALL") ) {
+ fQATasks = Form("%d %d %d", AliQA::kHITS, AliQA::kSDIGITS, AliQA::kDIGITS) ;
+ } else {
+ fQATasks.ToUpper() ;
+ TString tempo("") ;
+ if ( fQATasks.Contains("HIT") )
+ tempo = Form("%d ", AliQA::kHITS) ;
+ if ( fQATasks.Contains("SDIGIT") )
+ tempo += Form("%d ", AliQA::kSDIGITS) ;
+ if ( fQATasks.Contains("DIGIT") )
+ tempo += Form("%d ", AliQA::kDIGITS) ;
+ fQATasks = tempo ;
+ if (fQATasks.IsNull()) {
+ AliInfo("No QA requested\n") ;
+ fRunQA = kFALSE ;
+ return kTRUE ;
+ }
+ }
+ 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)) ;
+ 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)) ;
+
+ return kTRUE;
+}
+
+//_____________________________________________________________________________
+void AliSimulation::ProcessEnvironmentVars()
+{
+// Extract run number and random generator seed from env variables
+
+ AliInfo("Processing environment variables");
+
+ // Random Number seed
+
+ // first check that seed is not already set
+ if (fSeed == 0) {
+ if (gSystem->Getenv("CONFIG_SEED")) {
+ fSeed = atoi(gSystem->Getenv("CONFIG_SEED"));
+ }
+ } else {
+ if (gSystem->Getenv("CONFIG_SEED")) {
+ AliInfo(Form("Seed for random number generation already set (%d)"
+ ": CONFIG_SEED variable ignored!", fSeed));
+ }
+ }
+
+ AliInfo(Form("Seed for random number generation = %d ", fSeed));
+
+ // Run Number
+
+ // first check that run number is not already set
+ if(fRun < 0) {
+ if (gSystem->Getenv("DC_RUN")) {
+ fRun = atoi(gSystem->Getenv("DC_RUN"));
+ }
+ } else {
+ if (gSystem->Getenv("DC_RUN")) {
+ AliInfo(Form("Run number already set (%d): DC_RUN variable ignored!", fRun));
+ }
+ }
+
+ AliInfo(Form("Run number = %d", fRun));
+}
+
+//---------------------------------------------------------------------
+void AliSimulation::WriteGRPEntry()
+{
+ // Get the necessary information from galice (generator, trigger etc) and
+ // write a GRP entry corresponding to the settings in the Config.C used
+ // note that Hall probes and Cavern and Surface Atmos pressures are not simulated.
+
+
+ AliInfo("Writing global run parameters entry into the OCDB");
+
+ AliGRPObject* grpObj = new AliGRPObject();
+
+ grpObj->SetRunType("PHYSICS");
+ grpObj->SetTimeStart(0);
+ grpObj->SetTimeEnd(9999);
+
+ const AliGenerator *gen = gAlice->GetMCApp()->Generator();
+ if (gen) {
+ grpObj->SetBeamEnergy(gen->GetEnergyCMS());
+ TString projectile;
+ Int_t a,z;
+ gen->GetProjectile(projectile,a,z);
+ TString target;
+ gen->GetTarget(target,a,z);
+ TString beamType = projectile + "-" + target;
+ beamType.ReplaceAll(" ","");
+ if (!beamType.CompareTo("-")) {
+ grpObj->SetBeamType("UNKNOWN");
+ }
+ else {
+ grpObj->SetBeamType(beamType);
+ // Heavy ion run, the event specie is set to kHighMult
+ fEventSpecie = AliRecoParam::kHighMult;
+ if ((strcmp(beamType,"p-p") == 0) ||
+ (strcmp(beamType,"p-") == 0) ||
+ (strcmp(beamType,"-p") == 0) ||
+ (strcmp(beamType,"P-P") == 0) ||
+ (strcmp(beamType,"P-") == 0) ||
+ (strcmp(beamType,"-P") == 0)) {
+ // Proton run, the event specie is set to kLowMult
+ fEventSpecie = AliRecoParam::kLowMult;
+ }
+ }
+ } else {
+ AliWarning("Unknown beam type and energy! Setting energy to 0");
+ grpObj->SetBeamEnergy(0);
+ grpObj->SetBeamType("UNKNOWN");
+ }
+
+ UInt_t detectorPattern = 0;
+ Int_t nDets = 0;
+ TObjArray *detArray = gAlice->Detectors();
+ for (Int_t iDet = 0; iDet < AliDAQ::kNDetectors-1; iDet++) {
+ if (detArray->FindObject(AliDAQ::OfflineModuleName(iDet))) {
+ detectorPattern |= (1 << iDet);
+ nDets++;
+ }
+ }
+ // CTP
+ if (!fMakeTrigger.IsNull() || strcmp(gAlice->GetTriggerDescriptor(),""))
+ detectorPattern |= (1 << AliDAQ::DetectorID("TRG"));
+
+ // HLT
+ if (!fRunHLT.IsNull())
+ detectorPattern |= (1 << AliDAQ::kHLTId);
+
+ grpObj->SetNumberOfDetectors((Char_t)nDets);
+ 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);
+
+ 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();
+
+ AliCDBId id("GRP/GRP/Data", man->GetRun(), man->GetRun(), 1, 1);
+ AliCDBMetaData *metadata= new AliCDBMetaData();
+
+ metadata->SetResponsible("alice-off@cern.ch");
+ metadata->SetComment("Automatically produced GRP entry for Monte Carlo");
+
+ man->Put(grpObj,id,metadata);
+}
+
+