]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STEER/AliSimulation.cxx
Correct character constantness
[u/mrichter/AliRoot.git] / STEER / AliSimulation.cxx
index 6ae6a146c08f73f325a69cadf5f64eac937b9e64..eefacec4f6df37e554b99c4cb2cc39e62379ce34 100644 (file)
 #include <TObjString.h>
 #include <TSystem.h>
 #include <TFile.h>
+#include <TROOT.h>
 
 #include "AliCodeTimer.h"
 #include "AliCDBStorage.h"
 #include "AliGenEventHeader.h"
 #include "AliMC.h"
 #include "AliHLTSimulation.h"
-#include "AliQADataMakerSteer.h"
 #include "AliSysInfo.h"
+#include "AliMagF.h"
+#include "AliGRPObject.h"
 
 ClassImp(AliSimulation)
 
@@ -183,16 +185,20 @@ AliSimulation::AliSimulation(const char* configFileName,
   fEmbeddingFlag(kFALSE),
   fQADetectors("ALL"),                  
   fQATasks("ALL"),     
+  fQASteer(NULL), 
   fRunQA(kTRUE), 
-  fRunHLT("default")
+  fRunHLT("default"),
+  fWriteGRPEntry(kTRUE)
 {
 // create simulation object with default parameters
   fgInstance = this;
   SetGAliceFile("galice.root");
   
 // for QA
-   for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) 
-       fQACycles[iDet] = 999999;
+       fQASteer = new AliQADataMakerSteer("sim") ; 
+       fQASteer->SetActiveDetectors(fQADetectors) ; 
+       fQATasks = Form("%d %d %d", AliQA::kHITS, AliQA::kSDIGITS, AliQA::kDIGITS) ; 
+       fQASteer->SetTasks(fQATasks) ;  
 }
 
 //_____________________________________________________________________________
@@ -230,9 +236,11 @@ AliSimulation::AliSimulation(const AliSimulation& sim) :
   fSetRunNumberFromDataCalled(sim.fSetRunNumberFromDataCalled),
   fEmbeddingFlag(sim.fEmbeddingFlag),
   fQADetectors(sim.fQADetectors),                  
-  fQATasks(sim.fQATasks),      
+       fQATasks(sim.fQATasks), 
+       fQASteer(sim.fQASteer), 
   fRunQA(sim.fRunQA), 
-  fRunHLT(sim.fRunHLT)
+  fRunHLT(sim.fRunHLT),
+  fWriteGRPEntry(sim.fWriteGRPEntry)
 {
 // copy constructor
 
@@ -251,10 +259,6 @@ AliSimulation::AliSimulation(const AliSimulation& sim) :
     if (sim.fSpecCDBUri[i]) fSpecCDBUri.Add(sim.fSpecCDBUri[i]->Clone());
   }
   fgInstance = this;
-
-// for QA
-   for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) 
-       fQACycles[iDet] = sim.fQACycles[iDet];
 }
 
 //_____________________________________________________________________________
@@ -284,6 +288,8 @@ AliSimulation::~AliSimulation()
   fSpecCDBUri.Delete();
   if (fgInstance==this) fgInstance = 0;
 
+       delete fQASteer ; 
+       
   AliCodeTimer::Instance()->Print();
 }
 
@@ -718,9 +724,9 @@ Bool_t AliSimulation::Run(Int_t nEvents)
   }
 
   
-  
-  // run HLT simulation
-  if (!fRunHLT.IsNull()) {
+  // run HLT simulation on simulated digit data if raw data is not
+  // simulated, otherwise its called as part of WriteRawData
+  if (!fRunHLT.IsNull() && fWriteRawData.IsNull()) {
     if (!RunHLT()) {
       if (fStopOnError) return kFALSE;
     }
@@ -765,7 +771,7 @@ Bool_t AliSimulation::RunTrigger(const char* config, const char* detectors)
    TString trconfiguration = config;
 
    if (trconfiguration.IsNull()) {
-     if (gAlice->GetTriggerDescriptor() != "") {
+     if (strcmp(gAlice->GetTriggerDescriptor(),"")) {
        trconfiguration = gAlice->GetTriggerDescriptor();
      }
      else
@@ -835,7 +841,7 @@ Bool_t AliSimulation::RunSimulation(Int_t nEvents)
   // Either from AliSimulation or from
   // gAlice
   if (fMakeTrigger.IsNull()) {
-    if (gAlice->GetTriggerDescriptor() != "")
+    if (strcmp(gAlice->GetTriggerDescriptor(),""))
       fMakeTrigger = gAlice->GetTriggerDescriptor();
   }
   else
@@ -884,6 +890,11 @@ Bool_t AliSimulation::RunSimulation(Int_t nEvents)
                   "Check your config file: %s", fConfigFileName.Data()));
     return kFALSE;
   }
+
+  // Write GRP entry corresponding to the setting found in Cofig.C
+  if (fWriteGRPEntry)
+    WriteGRPEntry();
+
   if (nEvents <= 0) nEvents = fNEvents;
 
   // get vertex from background file in case of merging
@@ -1080,10 +1091,6 @@ Bool_t AliSimulation::RunHitsDigitization(const char* detectors)
     if (fStopOnError) return kFALSE;
   }
 
-  delete runLoader;
-  //PH Temporary fix to avoid interference with the PHOS loder/getter
-  //PH The problem has to be solved in more general way 09/06/05
-
   return kTRUE;
 }
 
@@ -1107,16 +1114,18 @@ Bool_t AliSimulation::WriteRawData(const char* detectors,
   AliCodeTimerAuto("")
   
   TString detStr = detectors;
-  if (IsSelected("HLT", detStr))
-  {
-       // Do nothing. "HLT" will be removed from detStr because the HLT raw
-       // data files are generated in RunHLT.
-  }
-
   if (!WriteRawFiles(detStr.Data())) {
     if (fStopOnError) return kFALSE;
   }
 
+  // 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()) {
+    if (!RunHLT()) {
+      if (fStopOnError) return kFALSE;
+    }
+  }
+
   TString dateFileName(fileName);
   if (!dateFileName.IsNull()) {
     Bool_t rootOutput = dateFileName.EndsWith(".root");
@@ -1185,7 +1194,15 @@ Bool_t AliSimulation::WriteRawFiles(const char* detectors)
       if (fStopOnError) return kFALSE; else continue;
     }
 
+    ofstream runNbFile(Form("run%u",runLoader->GetHeader()->GetRun()));
+    runNbFile.close();
+
     TString detStr = detectors;
+    if (IsSelected("HLT", detStr)) {
+      // Do nothing. "HLT" will be removed from detStr and HLT raw
+      // data files are generated in RunHLT.
+    }
+
     TObjArray* detArray = runLoader->GetAliRun()->Detectors();
     for (Int_t iDet = 0; iDet < detArray->GetEntriesFast(); iDet++) {
       AliModule* det = (AliModule*) detArray->At(iDet);
@@ -1246,23 +1263,29 @@ Bool_t AliSimulation::ConvertRawFilesToDate(const char* dateFileName,
 
   Int_t selEvents = 0;
   for (Int_t iEvent = 0; iEvent < runLoader->GetNumberOfEvents(); iEvent++) {
-    fprintf(pipe, "GDC\n");
-    Float_t ldc = 0;
-    Int_t prevLDC = -1;
 
-    if (selrawdata) {
+    UInt_t detectorPattern = 0;
+    runLoader->GetEvent(iEvent);
+    if (!runLoader->LoadTrigger()) {
+      AliCentralTrigger *aCTP = runLoader->GetTrigger();
+      detectorPattern = aCTP->GetClusterMask();
       // Check if the event was triggered by CTP
-      runLoader->GetEvent(iEvent);
-      if (!runLoader->LoadTrigger()) {
-       AliCentralTrigger *aCTP = runLoader->GetTrigger();
+      if (selrawdata) {
        if (aCTP->GetClassMask()) selEvents++;
       }
-      else {
+    }
+    else {
+      AliWarning("No trigger can be loaded! Some fields in the event header will be empty !");
+      if (selrawdata) {
        AliWarning("No trigger can be loaded! Writing of selected raw data is abandoned !");
        selrawdata = kFALSE;
       }
     }
 
+    fprintf(pipe, "GDC DetectorPattern %u\n", detectorPattern);
+    Float_t ldc = 0;
+    Int_t prevLDC = -1;
+
     // loop over detectors and DDLs
     for (Int_t iDet = 0; iDet < AliDAQ::kNDetectors; iDet++) {
       for (Int_t iDDL = 0; iDDL < AliDAQ::NumberOfDdls(iDet); iDDL++) {
@@ -1308,16 +1331,18 @@ Bool_t AliSimulation::ConvertRawFilesToDate(const char* dateFileName,
   for (Int_t iEvent = 0; iEvent < runLoader->GetNumberOfEvents(); iEvent++) {
 
     // Get the trigger decision and cluster
+    UInt_t detectorPattern = 0;
     TString detClust;
     runLoader->GetEvent(iEvent);
     if (!runLoader->LoadTrigger()) {
       AliCentralTrigger *aCTP = runLoader->GetTrigger();
       if (aCTP->GetClassMask() == 0) continue;
-      detClust = aCTP->GetTriggeredDetectors();
+      detectorPattern = aCTP->GetClusterMask();
+      detClust = AliDAQ::ListOfTriggeredDetectors(detectorPattern);
       AliInfo(Form("List of detectors to be read out: %s",detClust.Data()));
     }
 
-    fprintf(pipe2, "GDC\n");
+    fprintf(pipe2, "GDC DetectorPattern %u\n", detectorPattern);
     Float_t ldc = 0;
     Int_t prevLDC = -1;
 
@@ -1661,8 +1686,8 @@ Bool_t AliSimulation::RunHLT()
   // 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/
-  // http://web.ift.uib.no/~kjeks/doc/alice-hlt/classAliHLTModuleAgent.html
+  // 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>
@@ -1678,8 +1703,11 @@ Bool_t AliSimulation::RunHLT()
   //     disable redirection of log messages to AliLog class
   // \li config=<i>macro</i>
   //     configuration macro
-  // \li localrec=<i>configuration</i>
+  // \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");
@@ -1708,12 +1736,14 @@ Bool_t AliSimulation::RunHLT()
   typedef void (*CompileInfo)( char*& date, char*& time);
   CompileInfo fctInfo=(CompileInfo)gSystem->DynFindSymbol(ALIHLTSIMULATION_LIBRARY, "CompileInfo");
   if (fctInfo) {
-    char* date="";
-    char* time="";
-    (*fctInfo)(date, time);
-    if (!date) date="unknown";
-    if (!time) time="unknown";
+    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));
   }
@@ -1729,11 +1759,21 @@ Bool_t AliSimulation::RunHLT()
   // init the HLT simulation
   TString options;
   if (fRunHLT.CompareTo("default")!=0) options=fRunHLT;
-  if (!IsSelected("HLT", fWriteRawData)) {
+  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));
@@ -1759,23 +1799,17 @@ Bool_t AliSimulation::RunHLT()
 Bool_t AliSimulation::RunQA()
 {
        // run the QA on summable hits, digits or digits
-
-       AliQADataMakerSteer qas("sim") ; 
-    qas.SetRunLoader(gAlice->GetRunLoader()) ;
+       
+  if(!gAlice) return kFALSE;
+       fQASteer->SetRunLoader(gAlice->GetRunLoader()) ;
 
        TString detectorsw("") ;  
        Bool_t rv = kTRUE ; 
-       if (fQATasks.Contains(Form("%d", AliQA::kHITS))) 
-               detectorsw =  qas.Run(fQADetectors.Data(), AliQA::kHITS) ; 
-//     qas.Reset() ; 
-       if (fQATasks.Contains(Form("%d", AliQA::kSDIGITS))) 
-               detectorsw += qas.Run(fQADetectors.Data(), AliQA::kSDIGITS) ;   
-//     qas.Reset() ; 
-       if (fQATasks.Contains(Form("%d", AliQA::kDIGITS))) 
-               detectorsw += qas.Run(fQADetectors.Data(), AliQA::kDIGITS) ;    
-
+       detectorsw = fQASteer->Run(fQADetectors.Data()) ; 
        if ( detectorsw.IsNull() ) 
                rv = kFALSE ; 
+  else 
+    fQASteer->EndOfCycle(detectorsw) ; 
        return rv ; 
 }
 
@@ -1795,7 +1829,7 @@ Bool_t AliSimulation::SetRunQA(TString detAndAction)
        fQADetectors = detAndAction(0, colon) ; 
        if (fQADetectors.Contains("ALL") )
                fQADetectors = Form("%s %s", fMakeDigits.Data(), fMakeDigitsFromHits.Data()) ; 
-       fQATasks   = detAndAction(colon+1, detAndAction.Sizeof() ) ; 
+               fQATasks   = detAndAction(colon+1, detAndAction.Sizeof() ) ; 
        if (fQATasks.Contains("ALL") ) {
                fQATasks = Form("%d %d %d", AliQA::kHITS, AliQA::kSDIGITS, AliQA::kDIGITS) ; 
        } else {
@@ -1820,6 +1854,8 @@ Bool_t AliSimulation::SetRunQA(TString detAndAction)
     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 ;
+       fQASteer->SetActiveDetectors(fQADetectors) ; 
+       fQASteer->SetTasks(fQATasks) ; 
        return kTRUE; 
 } 
 
@@ -1862,4 +1898,100 @@ void AliSimulation::ProcessEnvironmentVars()
     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->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;
+    if (!beamType.CompareTo("-")) {
+
+       grpObj->SetBeamType("UNKNOWN");
+    }
+    else {
+       grpObj->SetBeamType(beamType);
+    }
+  }
+  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++;
+    }
+  }
+  // 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 = gAlice->Field();
+  Float_t solenoidField = TMath::Abs(field->SolenoidField());
+  Float_t factor = field->Factor();
+  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());
+  AliCDBMetaData *metadata= new AliCDBMetaData();
+
+  metadata->SetResponsible("alice-off@cern.ch");
+  metadata->SetComment("Automatically produced GRP entry for Monte Carlo");
+  man->Put(grpObj,id,metadata);
+}
+