"Cleaned" initialization and usage of the run number.
authoracolla <acolla@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 14 Nov 2007 15:24:28 +0000 (15:24 +0000)
committeracolla <acolla@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 14 Nov 2007 15:24:28 +0000 (15:24 +0000)
--- in Simulation, run number and generator seed can be set:

1. Via environment variables DC_RUN and CONFIG_SEED
2. Via AliSimulation setters SetRunNumber() and SetSeed() (overrides option 1.)
3. Run number can be also set externally with AliCDBManager::Instance()->SetRun()
(overrides options 1. and 2.)

Run number is set in AliHeader during event generation (AliMC::BeginEvent()). In
the subsequent steps it is loaded from the run loader.

--- in Reconstruction, run number is loaded from the event header in the run
loader, or from raw data header.

CDB Manager's Lock implemented in simulation and reconstruction.

STEER/AliReconstruction.cxx
STEER/AliReconstruction.h
STEER/AliSimulation.cxx
STEER/AliSimulation.h

index f6c2068..c34de49 100644 (file)
 #include "AliGeomManager.h"
 #include "AliTrackPointArray.h"
 #include "AliCDBManager.h"
+#include "AliCDBStorage.h"
 #include "AliCDBEntry.h"
 #include "AliAlignObj.h"
 
@@ -194,7 +195,7 @@ ClassImp(AliReconstruction)
 const char* AliReconstruction::fgkDetectorName[AliReconstruction::fgkNDetectors] = {"ITS", "TPC", "TRD", "TOF", "PHOS", "HMPID", "EMCAL", "MUON", "FMD", "ZDC", "PMD", "T0", "VZERO", "ACORDE", "HLT"};
 
 //_____________________________________________________________________________
-AliReconstruction::AliReconstruction(const char* gAliceFilename, const char* cdbUri,
+AliReconstruction::AliReconstruction(const char* gAliceFilename,
                                     const char* name, const char* title) :
   TNamed(name, title),
 
@@ -241,9 +242,10 @@ AliReconstruction::AliReconstruction(const char* gAliceFilename, const char* cdb
   fGRPList(NULL),
 
   fAlignObjArray(NULL),
-  fCDBUri(cdbUri),
-  fRemoteCDBUri(""),
+  fCDBUri(),
   fSpecCDBUri(), 
+  fInitCDBCalled(kFALSE),
+  fSetRunNumberFromDataCalled(kFALSE),
   fRunQA(kTRUE) 
 
 {
@@ -307,7 +309,8 @@ AliReconstruction::AliReconstruction(const AliReconstruction& rec) :
 
   fAlignObjArray(rec.fAlignObjArray),
   fCDBUri(rec.fCDBUri),
-  fRemoteCDBUri(rec.fRemoteCDBUri),
+  fInitCDBCalled(rec.fInitCDBCalled),
+  fSetRunNumberFromDataCalled(rec.fSetRunNumberFromDataCalled),
   fSpecCDBUri(), 
   fRunQA(kTRUE)
 {
@@ -351,12 +354,15 @@ AliReconstruction::~AliReconstruction()
 }
 
 //_____________________________________________________________________________
-void AliReconstruction::InitCDBStorage()
+void AliReconstruction::InitCDB()
 {
 // activate a default CDB storage
 // First check if we have any CDB storage set, because it is used 
 // to retrieve the calibration and alignment constants
 
+  if (fInitCDBCalled) return;
+  fInitCDBCalled = kTRUE;
+
   AliCDBManager* man = AliCDBManager::Instance();
   if (man->IsDefaultStorageSet())
   {
@@ -364,33 +370,25 @@ void AliReconstruction::InitCDBStorage()
     AliWarning("Default CDB storage has been already set !");
     AliWarning(Form("Ignoring the default storage declared in AliReconstruction: %s",fCDBUri.Data()));
     AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
-    fCDBUri = "";
+    fCDBUri = man->GetDefaultStorage()->GetURI();
   }
   else {
-    AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
-    AliDebug(2, Form("Default CDB storage is set to: %s",fCDBUri.Data()));
-    AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
+    if (fCDBUri.Length() > 0) 
+    {
+       AliDebug(2,"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
+       AliDebug(2, Form("Default CDB storage is set to: %s", fCDBUri.Data()));
+       AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
+    } else {
+       fCDBUri="local://$ALICE_ROOT";
+       AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
+       AliWarning("Default CDB storage not yet set !!!!");
+       AliWarning(Form("Setting it now to: %s", fCDBUri.Data()));
+       AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
+               
+    }
     man->SetDefaultStorage(fCDBUri);
   }
 
-  // Remote storage (the Grid storage) is used if it is activated
-  // and if the object is not found in the default storage
-  // OBSOLETE: Removed
-  //  if (man->IsRemoteStorageSet())
-  //  {
-  //   AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
-  //   AliWarning("Remote CDB storage has been already set !");
-  //   AliWarning(Form("Ignoring the remote storage declared in AliReconstruction: %s",fRemoteCDBUri.Data()));
-  //   AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
-  //   fRemoteCDBUri = "";
-  //  }
-  //  else {
-  //   AliDebug(2,"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
-  //   AliDebug(2, Form("Remote CDB storage is set to: %s",fRemoteCDBUri.Data()));
-  //   AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
-  //   man->SetRemoteStorage(fRemoteCDBUri);
-  //  }
-
   // Now activate the detector specific CDB storage locations
   for (Int_t i = 0; i < fSpecCDBUri.GetEntriesFast(); i++) {
     TObject* obj = fSpecCDBUri[i];
@@ -400,7 +398,7 @@ void AliReconstruction::InitCDBStorage()
     AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
     man->SetSpecificStorage(obj->GetName(), obj->GetTitle());
   }
-  man->Print();
+  
 }
 
 //_____________________________________________________________________________
@@ -413,17 +411,6 @@ void AliReconstruction::SetDefaultStorage(const char* uri) {
 }
 
 //_____________________________________________________________________________
-void AliReconstruction::SetRemoteStorage(const char* uri) {
-// Store the desired remote CDB storage location
-// Activate it later within the Run() method
-// Remote storage (the Grid storage) is used if it is activated
-// and if the object is not found in the default storage
-
-  fRemoteCDBUri = uri;
-
-}
-
-//_____________________________________________________________________________
 void AliReconstruction::SetSpecificStorage(const char* calibType, const char* uri) {
 // Store a detector-specific CDB storage location
 // Activate it later within the Run() method
@@ -465,19 +452,24 @@ void AliReconstruction::SetSpecificStorage(const char* calibType, const char* ur
 
 }
 
-
-
-
 //_____________________________________________________________________________
-Bool_t AliReconstruction::SetRunNumber()
+Bool_t AliReconstruction::SetRunNumberFromData()
 {
   // The method is called in Run() in order
   // to set a correct run number.
   // In case of raw data reconstruction the
   // run number is taken from the raw data header
 
-  if(AliCDBManager::Instance()->GetRun() < 0) {
-    if (!fRunLoader) {
+  if (fSetRunNumberFromDataCalled) return kTRUE;
+  fSetRunNumberFromDataCalled = kTRUE;
+  
+  AliCDBManager* man = AliCDBManager::Instance();
+  
+  if(man->GetRun() > 0) {
+       AliWarning("Run number is taken from event header! Ignoring settings in AliCDBManager!");
+  } 
+  
+  if (!fRunLoader) {
       AliError("No run loader is found !"); 
       return kFALSE;
     }
@@ -499,13 +491,22 @@ Bool_t AliReconstruction::SetRunNumber()
        AliError("Neither gAlice nor RawReader objects are found !");
        return kFALSE;
       }
-    }
-    AliInfo(Form("CDB Run number: %d",AliCDBManager::Instance()->GetRun()));
   }
+
+  man->Print();  
+  
   return kTRUE;
 }
 
 //_____________________________________________________________________________
+void AliReconstruction::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);
+}
+
+//_____________________________________________________________________________
 Bool_t AliReconstruction::MisalignGeometry(const TString& detectors)
 {
   // Read the alignment objects from CDB.
@@ -581,7 +582,6 @@ Bool_t AliReconstruction::Run(const char* input)
   
   // set the input
   if (!input) input = fInput.Data();
-     
   TString fileName(input);
   if (fileName.EndsWith("/")) {
     fRawReader = new AliRawReaderFile(fileName);
@@ -600,12 +600,17 @@ Bool_t AliReconstruction::Run(const char* input)
    AliSysInfo::AddStamp("LoadLoader");
 
   // Initialize the CDB storage
-  InitCDBStorage();
-   AliSysInfo::AddStamp("LoadCDB");
+  InitCDB();
+  
+  AliSysInfo::AddStamp("LoadCDB");
 
   // Set run number in CDBManager (if it is not already set by the user)
-  if (!SetRunNumber()) if (fStopOnError) return kFALSE;
-
+  if (!SetRunNumberFromData()) if (fStopOnError) return kFALSE;
+  
+  // Set CDB lock: from now on it is forbidden to reset the run number
+  // or the default storage or to activate any further storage!
+  SetCDBLock();
+  
   // Import ideal TGeo geometry and apply misalignment
   if (!gGeoManager) {
     TString geom(gSystem->DirName(fGAliceFileName));
@@ -980,7 +985,7 @@ Bool_t AliReconstruction::Run(const char* input)
 
   gROOT->cd();
   CleanUp(file, fileOld);
-  
+    
   // Create tags for the events in the ESD tree (the ESD tree is always present)
   // In case of empty events the tags will contain dummy values
   AliESDTagCreator *esdtagCreator = new AliESDTagCreator();
@@ -996,6 +1001,11 @@ Bool_t AliReconstruction::Run(const char* input)
 //     qas.Reset() ;
        qas.Run(fRunTracking.Data(), AliQA::kESDS) ;
   }
+  
+  // Cleanup of CDB manager: cache and active storages!
+  AliCDBManager::Instance()->ClearCache();
+  
+  
   return kTRUE;
 }
 
@@ -1863,8 +1873,11 @@ void AliReconstruction::CleanUp(TFile* file, TFile* fileOld)
   }
   delete fVertexer;
   fVertexer = NULL;
-  delete fDiamondProfile;
-  fDiamondProfile = NULL;
+  
+  if(!(AliCDBManager::Instance()->GetCacheFlag())) {
+       delete fDiamondProfile;
+       fDiamondProfile = NULL;
+  }
 
   delete fGRPList;
   fGRPList = NULL;
index 2ba727b..66649ab 100644 (file)
@@ -37,7 +37,6 @@ class AliQADataMaker;
 class AliReconstruction: public TNamed {
 public:
   AliReconstruction(const char* gAliceFilename = "galice.root",
-                   const char* cdbUri = "local://$ALICE_ROOT",
                    const char* name = "AliReconstruction", 
                    const char* title = "reconstruction");
   AliReconstruction(const AliReconstruction& rec);
@@ -96,14 +95,11 @@ public:
 
   void           SetCheckPointLevel(Int_t checkPointLevel)
     {fCheckPointLevel = checkPointLevel;}
+  
   // CDB storage activation
-  void InitCDBStorage();
   void SetDefaultStorage(const char* uri);
-  void SetRemoteStorage(const char* uri);
   void SetSpecificStorage(const char* calibType, const char* uri);
 
-  Bool_t SetRunNumber();
-
   Bool_t MisalignGeometry(const TString& detectors);
 
   void           SetAlignObjArray(TObjArray *array)
@@ -120,6 +116,9 @@ public:
 //  void    SetQACycles(const char * detector, const Int_t cycles) { fQACycles[GetDetIndex(detector)] = cycles ; }
 
 private:
+  void                  InitCDB();
+  void                  SetCDBLock();
+  Bool_t         SetRunNumberFromData();
   Bool_t         RunLocalReconstruction(const TString& detectors);
   Bool_t         RunLocalEventReconstruction(const TString& detectors);
   Bool_t         RunVertexFinder(AliESDEvent*& esd);
@@ -206,8 +205,9 @@ private:
   TObjArray*    fAlignObjArray;      // array with the alignment objects to be applied to the geometry
 
   TString       fCDBUri;             // Uri of the default CDB storage
-  TString       fRemoteCDBUri;       // Uri of the remote CDB storage
   TObjArray      fSpecCDBUri;         // Array with detector specific CDB storages
+  Bool_t        fInitCDBCalled;               //! flag to check if CDB storages are already initialized
+  Bool_t        fSetRunNumberFromDataCalled;  //! flag to check if run number is already loaded from run loader
 
   //Quality Assurance
 //  AliQADataMaker * fQADataMaker[fgkNDetectors];  //! array of QA data maker objects
index 8fcae1d..4507d90 100644 (file)
@@ -146,7 +146,7 @@ AliSimulation *AliSimulation::fgInstance = 0;
 const char* AliSimulation::fgkDetectorName[AliSimulation::fgkNDetectors] = {"ITS", "TPC", "TRD", "TOF", "PHOS", "HMPID", "EMCAL", "MUON", "FMD", "ZDC", "PMD", "T0", "VZERO", "ACORDE", "HLT"};
 
 //_____________________________________________________________________________
-AliSimulation::AliSimulation(const char* configFileName, const char* cdbUri,
+AliSimulation::AliSimulation(const char* configFileName,
                             const char* name, const char* title) :
   TNamed(name, title),
 
@@ -171,9 +171,13 @@ AliSimulation::AliSimulation(const char* configFileName, const char* cdbUri,
   fAlignObjArray(NULL),
   fUseBkgrdVertex(kTRUE),
   fRegionOfInterest(kFALSE),
-  fCDBUri(cdbUri),
-  fRemoteCDBUri(""),
+  fCDBUri(""),
   fSpecCDBUri(),
+  fRun(-1),
+  fSeed(0),
+  fInitCDBCalled(kFALSE),
+  fInitRunNumberCalled(kFALSE),
+  fSetRunNumberFromDataCalled(kFALSE),
   fEmbeddingFlag(kFALSE),
   fRunQA(kTRUE), 
   fRunHLT("default")
@@ -213,8 +217,12 @@ AliSimulation::AliSimulation(const AliSimulation& sim) :
   fUseBkgrdVertex(sim.fUseBkgrdVertex),
   fRegionOfInterest(sim.fRegionOfInterest),
   fCDBUri(sim.fCDBUri),
-  fRemoteCDBUri(sim.fRemoteCDBUri),
   fSpecCDBUri(),
+  fRun(-1),
+  fSeed(0),
+  fInitCDBCalled(sim.fInitCDBCalled),
+  fInitRunNumberCalled(sim.fInitRunNumberCalled),
+  fSetRunNumberFromDataCalled(sim.fSetRunNumberFromDataCalled),
   fEmbeddingFlag(sim.fEmbeddingFlag),
   fRunQA(kTRUE), 
   fRunHLT(sim.fRunHLT)
@@ -282,12 +290,15 @@ void AliSimulation::SetNumberOfEvents(Int_t nEvents)
 }
 
 //_____________________________________________________________________________
-void AliSimulation::InitCDBStorage()
+void AliSimulation::InitCDB()
 {
 // activate a default CDB storage
 // First check if we have any CDB storage set, because it is used 
 // to retrieve the calibration and alignment constants
 
+  if (fInitCDBCalled) return;
+  fInitCDBCalled = kTRUE;
+
   AliCDBManager* man = AliCDBManager::Instance();
   if (man->IsDefaultStorageSet())
   {
@@ -295,33 +306,25 @@ void AliSimulation::InitCDBStorage()
     AliWarning("Default CDB storage has been already set !");
     AliWarning(Form("Ignoring the default storage declared in AliSimulation: %s",fCDBUri.Data()));
     AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
-    fCDBUri = "";
+    fCDBUri = man->GetDefaultStorage()->GetURI();
   }
   else {
-    AliDebug(2,"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
-    AliDebug(2, Form("Default CDB storage is set to: %s",fCDBUri.Data()));
-    AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
+    if (fCDBUri.Length() > 0) 
+    {
+       AliDebug(2,"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
+       AliDebug(2, Form("Default CDB storage is set to: %s", fCDBUri.Data()));
+       AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
+    } else {
+       fCDBUri="local://$ALICE_ROOT";
+       AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
+       AliWarning("Default CDB storage not yet set !!!!");
+       AliWarning(Form("Setting it now to: %s", fCDBUri.Data()));
+       AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
+               
+    }
     man->SetDefaultStorage(fCDBUri);
   }
 
-  // Remote storage (the Grid storage) is used if it is activated
-  // and if the object is not found in the default storage
-  // OBSOLETE: Removed
-  //   if (man->IsRemoteStorageSet())
-  //   {
-  //     AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
-  //     AliWarning("Remote CDB storage has been already set !");
-  //     AliWarning(Form("Ignoring the remote storage declared in AliSimulation: %s",fRemoteCDBUri.Data()));
-  //     AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
-  //     fRemoteCDBUri = "";
-  //   }
-  //   else {
-  //     AliDebug(2,"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
-  //     AliDebug(2, Form("Remote CDB storage is set to: %s",fRemoteCDBUri.Data()));
-  //     AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
-  //     man->SetRemoteStorage(fRemoteCDBUri);
-  //   }
-
   // Now activate the detector specific CDB storage locations
   for (Int_t i = 0; i < fSpecCDBUri.GetEntriesFast(); i++) {
     TObject* obj = fSpecCDBUri[i];
@@ -331,26 +334,61 @@ void AliSimulation::InitCDBStorage()
     AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
     man->SetSpecificStorage(obj->GetName(), obj->GetTitle());
   }
-  man->Print();
+      
 }
 
 //_____________________________________________________________________________
-void AliSimulation::SetDefaultStorage(const char* uri) {
-// Store the desired default CDB storage location
-// Activate it later within the Run() method
+void AliSimulation::InitRunNumber(){
+// check run number. If not set, set it to 0 !!!!
+  
+  if (fInitRunNumberCalled) return;
+  fInitRunNumberCalled = kTRUE;
+  
+  AliCDBManager* man = AliCDBManager::Instance();
+  if (man->GetRun() >= 0)
+  {
+    if(fRun >= 0) {
+       AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
+       AliWarning(Form("Run number is already set in AliCDBManager: %d !", man->GetRun()));
+       AliWarning(Form("Ignoring the run number declared in AliSimulation: %d", fRun));
+       AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
+    }
+    fRun = man->GetRun();
+  }
+  else {
+    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("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
+       
+    }
+    man->SetRun(fRun);
+  }
 
-  fCDBUri = uri;
+  man->Print();
 
 }
 
 //_____________________________________________________________________________
-void AliSimulation::SetRemoteStorage(const char* uri) {
-// Store the desired remote CDB storage location
+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);
+}
+
+//_____________________________________________________________________________
+void AliSimulation::SetDefaultStorage(const char* uri) {
+// Store the desired default CDB storage location
 // Activate it later within the Run() method
-// Remote storage (the Grid storage) is used if it is activated
-// and if the object is not found in the default storage (the local cache)
 
-  fRemoteCDBUri = uri;
+  fCDBUri = uri;
 
 }
 
@@ -372,6 +410,67 @@ void AliSimulation::SetSpecificStorage(const char* calibType, const char* uri) {
 }
 
 //_____________________________________________________________________________
+void AliSimulation::SetRunNumber(Int_t run)
+{
+// sets run number
+// Activate it later within the Run() method
+
+       fRun = run;
+}
+
+//_____________________________________________________________________________
+void AliSimulation::SetSeed(Int_t seed)
+{
+// sets seed number
+// Activate it later within the Run() method
+
+       fSeed = seed;
+}
+
+//_____________________________________________________________________________
+Bool_t AliSimulation::SetRunNumberFromData()
+{
+  // Set the CDB manager run number
+  // The run number is retrieved from gAlice
+
+    if (fSetRunNumberFromDataCalled) return kTRUE;
+    fSetRunNumberFromDataCalled = kTRUE;    
+  
+    AliCDBManager* man = AliCDBManager::Instance();
+    Int_t runData = -1, runCDB = -1;
+  
+    AliRunLoader* runLoader = LoadRun("READ");
+    if (!runLoader) return kFALSE;
+    else {
+       runData = runLoader->GetAliRun()->GetHeader()->GetRun();
+       delete runLoader;
+    }
+  
+    runCDB = man->GetRun();
+    if(runCDB >= 0) {
+       if (runCDB != runData) {
+               AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
+               AliWarning(Form("A run number was previously set in AliCDBManager: %d !", runCDB));
+               AliWarning(Form("It will be replaced with the run number got from run header: %d !", runData));
+               AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");    
+       }
+       
+    }
+      
+    man->SetRun(runData);
+    fRun = runData;
+    
+    if(man->GetRun() < 0) {
+       AliError("Run number not properly initalized!");
+       return kFALSE;
+    }
+  
+    man->Print();
+    
+    return kTRUE;
+}
+
+//_____________________________________________________________________________
 void AliSimulation::SetConfigFile(const char* fileName)
 {
 // set the name of the config file
@@ -423,13 +522,19 @@ Bool_t AliSimulation::MisalignGeometry(AliRunLoader *runLoader)
     AliError("Can't apply the misalignment! Geometry is not loaded or it is still opened!");
     return kFALSE;
   }  
+  
+  // initialize CDB storage, run number, set CDB lock
+  InitCDB();
+//  if (!SetRunNumberFromData()) if (fStopOnError) return kFALSE;
+  SetCDBLock();
+    
   Bool_t delRunLoader = kFALSE;
   if (!runLoader) {
     runLoader = LoadRun("READ");
     if (!runLoader) return kFALSE;
     delRunLoader = kTRUE;
   }
-
+  
   // Export ideal geometry 
   if(!gAlice->IsRootGeometry()) AliGeomManager::GetGeometry()->Export("geometry.root");
 
@@ -483,25 +588,6 @@ Bool_t AliSimulation::MisalignGeometry(AliRunLoader *runLoader)
   return kTRUE;
 }
 
-
-//_____________________________________________________________________________
-Bool_t AliSimulation::SetRunNumber()
-{
-  // Set the CDB manager run number
-  // The run number is retrieved from gAlice
-
-  if(AliCDBManager::Instance()->GetRun() < 0) {
-    AliRunLoader* runLoader = LoadRun("READ");
-    if (!runLoader) return kFALSE;
-    else {
-      AliCDBManager::Instance()->SetRun(runLoader->GetAliRun()->GetRunNumber());
-      AliInfo(Form("Run number: %d",AliCDBManager::Instance()->GetRun()));
-      delete runLoader;
-    }
-  }
-  return kTRUE;
-}
-
 //_____________________________________________________________________________
 void AliSimulation::MergeWith(const char* fileName, Int_t nSignalPerBkgrd)
 {
@@ -526,21 +612,32 @@ Bool_t AliSimulation::Run(Int_t nEvents)
 // run the generation, simulation and digitization
 
  
-   AliCodeTimerAuto("")
+  AliCodeTimerAuto("")
   
-  InitCDBStorage();
+  // Load run number and seed from environmental vars
+  ProcessEnvironmentVars();
 
+  gRandom->SetSeed(fSeed);
+   
   if (nEvents > 0) fNEvents = nEvents;
 
   // generation and simulation -> hits
   if (fRunGeneration) {
     if (!RunSimulation()) if (fStopOnError) return kFALSE;
   }
-
-
-
-  // Set run number in CDBManager (if it is not already set in RunSimulation)
-  if (!SetRunNumber()) if (fStopOnError) return kFALSE;
+           
+  // initialize CDB storage from external environment
+  // (either CDB manager or AliSimulation setters),
+  // if not already done in RunSimulation()
+  InitCDB();
+  
+  // Set run number in CDBManager from data 
+  // From this point on the run number must be always loaded from data!
+  if (!SetRunNumberFromData()) if (fStopOnError) return kFALSE;
+  
+  // Set CDB lock: from now on it is forbidden to reset the run number
+  // or the default storage or to activate any further storage!
+  SetCDBLock();
 
   // If RunSimulation was not called, load the geometry and misalign it
   if (!AliGeomManager::GetGeometry()) {
@@ -558,13 +655,16 @@ Bool_t AliSimulation::Run(Int_t nEvents)
   }
   
 
-  // summable digits -> digits
+  
+  // summable digits -> digits  
   if (!fMakeDigits.IsNull()) {
     if (!RunDigitization(fMakeDigits, fMakeDigitsFromHits)) {
       if (fStopOnError) return kFALSE;
     }
    }
 
+  
+  
   // hits -> digits
   if (!fMakeDigitsFromHits.IsNull()) {
     if (fBkgrdFileNames && (fBkgrdFileNames->GetEntriesFast() > 0)) {
@@ -578,11 +678,15 @@ Bool_t AliSimulation::Run(Int_t nEvents)
     }
   }
 
+  
+  
   // digits -> trigger
   if (!RunTrigger(fMakeTrigger)) {
     if (fStopOnError) return kFALSE;
   }
 
+  
+  
   // digits -> raw data
   if (!fWriteRawData.IsNull()) {
     if (!WriteRawData(fWriteRawData, fRawDataFileName, 
@@ -591,13 +695,15 @@ Bool_t AliSimulation::Run(Int_t nEvents)
     }
   }
 
+  
+  
   // run HLT simulation
   if (!fRunHLT.IsNull()) {
     if (!RunHLT()) {
       if (fStopOnError) return kFALSE;
     }
   }
-
+  
  // //QA
 //     if (fRunQA) {
 //             Bool_t rv = RunQA() ; 
@@ -605,6 +711,10 @@ Bool_t AliSimulation::Run(Int_t nEvents)
 //                     if (fStopOnError) 
 //                             return kFALSE ;         
 //     }
+
+  // Cleanup of CDB manager: cache and active storages!
+  AliCDBManager::Instance()->ClearCache();
+
   return kTRUE;
 }
 
@@ -615,6 +725,19 @@ Bool_t AliSimulation::RunTrigger(const char* descriptors)
 
   AliCodeTimerAuto("")
 
+  // initialize CDB storage from external environment
+  // (either CDB manager or AliSimulation setters),
+  // if not already done in RunSimulation()
+  InitCDB();
+  
+  // Set run number in CDBManager from data 
+  // From this point on the run number must be always loaded from data!
+  if (!SetRunNumberFromData()) if (fStopOnError) return kFALSE;
+  
+  // Set CDB lock: from now on it is forbidden to reset the run number
+  // or the default storage or to activate any further storage!
+  SetCDBLock();
+   
    AliRunLoader* runLoader = LoadRun("READ");
    if (!runLoader) return kFALSE;
    TString des = descriptors;
@@ -666,6 +789,12 @@ Bool_t AliSimulation::RunSimulation(Int_t nEvents)
 
   AliCodeTimerAuto("")
 
+  // initialize CDB storage and run number from external environment
+  // (either CDB manager or AliSimulation setters)
+  InitCDB();
+  InitRunNumber();
+  SetCDBLock();
+  
   if (!gAlice) {
     AliError("no gAlice object. Restart aliroot and try again.");
     return kFALSE;
@@ -680,7 +809,7 @@ Bool_t AliSimulation::RunSimulation(Int_t nEvents)
   StdoutToAliInfo(StderrToAliError(
     gAlice->Init(fConfigFileName.Data());
   ););
-
+  
   // Get the trigger descriptor string
   // Either from AliSimulation or from
   // gAlice
@@ -701,7 +830,7 @@ Bool_t AliSimulation::RunSimulation(Int_t nEvents)
              return kFALSE;
   }
   SetGAliceFile(runLoader->GetFileName());
+      
   // Misalign geometry
 #if ROOT_VERSION_CODE < 331527
   AliGeomManager::SetGeometry(gGeoManager);
@@ -774,7 +903,6 @@ Bool_t AliSimulation::RunSimulation(Int_t nEvents)
 
   delete runLoader;
 
-
   return kTRUE;
 }
 
@@ -785,6 +913,11 @@ Bool_t AliSimulation::RunSDigitization(const char* detectors)
 
   AliCodeTimerAuto("")
 
+  // initialize CDB storage, run number, set CDB lock
+  InitCDB();
+  if (!SetRunNumberFromData()) if (fStopOnError) return kFALSE;
+  SetCDBLock();
+  
   AliRunLoader* runLoader = LoadRun();
   if (!runLoader) return kFALSE;
 
@@ -821,6 +954,11 @@ Bool_t AliSimulation::RunDigitization(const char* detectors,
 
   AliCodeTimerAuto("")
 
+  // initialize CDB storage, run number, set CDB lock
+  InitCDB();
+  if (!SetRunNumberFromData()) if (fStopOnError) return kFALSE;
+  SetCDBLock();
+  
   while (AliRunLoader::GetRunLoader()) delete AliRunLoader::GetRunLoader();
   if (gAlice) delete gAlice;
   gAlice = NULL;
@@ -882,6 +1020,11 @@ Bool_t AliSimulation::RunHitsDigitization(const char* detectors)
 
   AliCodeTimerAuto("")
 
+  // initialize CDB storage, run number, set CDB lock
+  InitCDB();
+  if (!SetRunNumberFromData()) if (fStopOnError) return kFALSE;
+  SetCDBLock();
+  
   AliRunLoader* runLoader = LoadRun("READ");
   if (!runLoader) return kFALSE;
 
@@ -1143,6 +1286,7 @@ AliRunLoader* AliSimulation::LoadRun(const char* mode) const
     return NULL;
   }
   runLoader->LoadgAlice();
+  runLoader->LoadHeader();
   gAlice = runLoader->GetAliRun();
   if (!gAlice) {
     AliError(Form("no gAlice object found in file %s", 
@@ -1237,6 +1381,7 @@ Bool_t AliSimulation::IsSelected(TString detName, TString& detectors) const
   return result;
 }
 
+//_____________________________________________________________________________
 Bool_t AliSimulation::ConvertRaw2SDigits(const char* rawDirectory, const char* esdFileName) 
 {
 //
@@ -1259,9 +1404,9 @@ Bool_t AliSimulation::ConvertRaw2SDigits(const char* rawDirectory, const char* e
     StdoutToAliInfo(StderrToAliError(gAlice->Init(fConfigFileName.Data());););
 //
 //  Initialize CDB     
-    InitCDBStorage();
-    AliCDBManager* man = AliCDBManager::Instance();
-    man->SetRun(0); // Should this come from rawdata header ?
+    InitCDB();
+    //AliCDBManager* man = AliCDBManager::Instance();
+    //man->SetRun(0); // Should this come from rawdata header ?
     
     Int_t iDet;
     //
@@ -1399,6 +1544,11 @@ Bool_t AliSimulation::RunHLT()
   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);
 
@@ -1477,3 +1627,41 @@ Bool_t AliSimulation::RunQA()
        return rv ; 
 }
 
+//_____________________________________________________________________________
+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)); 
+}
index 7f81d35..8f5ca97 100644 (file)
@@ -25,7 +25,6 @@ class AliQADataMakerSteer ;
 class AliSimulation: public TNamed {
 public:
   AliSimulation(const char* configFileName = "Config.C",
-               const char* cdbUri = "local://$ALICE_ROOT",
                const char* name = "AliSimulation", 
                const char* title = "generation, simulation and digitization");
   AliSimulation(const AliSimulation& sim);
@@ -69,12 +68,13 @@ public:
 
   Bool_t         MisalignGeometry(AliRunLoader *runLoader = NULL);
 
-  Bool_t         SetRunNumber();
+  void           SetRunNumber(Int_t run);
+  void           SetSeed(Int_t seed);
+    
+  void                  ProcessEnvironmentVars();
                   
   // CDB storage activation
-  void InitCDBStorage();
   void SetDefaultStorage(const char* uri);
-  void SetRemoteStorage(const char* uri);
   void SetSpecificStorage(const char* calibType, const char* uri);
 
   virtual Bool_t Run(Int_t nEvents = 0);
@@ -107,6 +107,10 @@ public:
   void        SetQA(const Bool_t val) { fRunQA = val ; } 
   
 private:
+  void                  InitCDB();
+  void                  InitRunNumber();
+  void                  SetCDBLock();
+  Bool_t         SetRunNumberFromData();
   AliRunLoader*  LoadRun(const char* mode = "UPDATE") const;
   Int_t          GetNSignalPerBkgrd(Int_t nEvents = 0) const;
   Bool_t         IsSelected(TString detName, TString& detectors) const;
@@ -136,9 +140,14 @@ private:
   Bool_t         fUseBkgrdVertex;     // use vertex from background in case of merging
   Bool_t         fRegionOfInterest;   // digitization in region of interest
 
-  TString       fCDBUri;             // Uri of the default CDB storage
-  TString       fRemoteCDBUri;       // Uri of the remote CDB storage
-  TObjArray      fSpecCDBUri;         // Array with detector specific CDB storages
+  TString       fCDBUri;             //! Uri of the default CDB storage
+  TObjArray      fSpecCDBUri;         //! Array with detector specific CDB storages
+  Int_t         fRun;                //! Run number, will be passed to CDB and gAlice!!
+  Int_t         fSeed;               //! Seed for random number generator 
+  Bool_t        fInitCDBCalled;      //! flag to check if CDB storages are already initialized
+  Bool_t        fInitRunNumberCalled;  //! flag to check if run number is already initialized
+  Bool_t        fSetRunNumberFromDataCalled;  //! flag to check if run number is already loaded from run loader
+  
   Bool_t         fEmbeddingFlag;      // Flag for embedding
   
   //QA stuff