]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STEER/AliMC.cxx
General data base configuration class for DCS sensors (Haavard)
[u/mrichter/AliRoot.git] / STEER / AliMC.cxx
index 91be2cee1d4eb5955e6778dcdf737daafa9c9aa9..531be4140ec0da60de9221ec7ff2340d369d3a89 100644 (file)
 
 #include <RVersion.h>
 #include <TBrowser.h>
+#include <TClonesArray.h>
+#include <TGeoManager.h>
 #include <TStopwatch.h>
 #include <TSystem.h>
 #include <TVirtualMC.h>
-#include <TGeoManager.h>
-
+#include <TROOT.h>
  
 #include "AliLog.h"
 #include "AliDetector.h"
 #include "AliStack.h"
 #include "AliMagF.h"
 #include "AliTrackReference.h"
+#include "AliSimulation.h"
+#include "AliGeomManager.h"
+#include "AliCDBManager.h"
+#include "AliCDBStorage.h"
+#include "AliCDBEntry.h"
 
 
 ClassImp(AliMC)
@@ -53,7 +59,7 @@ AliMC::AliMC() :
   fTrRmax(1.e10),
   fTrZmax(1.e10),
   fRDecayMax(1.e10),
-  fRDecayMin(0),
+  fRDecayMin(-1.),
   fDecayPdg(0),
   fImedia(0),
   fTransParName("\0"),
@@ -76,7 +82,7 @@ AliMC::AliMC(const char *name, const char *title) :
   fTrRmax(1.e10),
   fTrZmax(1.e10),
   fRDecayMax(1.e10),
-  fRDecayMin(0),
+  fRDecayMin(-1.),
   fDecayPdg(0),
   fImedia(new TArrayI(1000)),
   fTransParName("\0"),
@@ -102,7 +108,7 @@ AliMC::AliMC(const AliMC &mc) :
   fTrRmax(1.e10),
   fTrZmax(1.e10),
   fRDecayMax(1.e10),
-  fRDecayMin(0),
+  fRDecayMin(-1.),
   fDecayPdg(0),
   fImedia(0),
   fTransParName("\0"),
@@ -150,15 +156,25 @@ void  AliMC::ConstructGeometry()
   // at InitGeometry().
   //
 
-  if(gAlice->IsRootGeometry()){
-    // Load geometry
-    const char *geomfilename = gAlice->GetGeometryFileName();
-    if(gSystem->ExpandPathName(geomfilename)){
-      AliInfo(Form("Loading geometry from file:\n %40s\n\n",geomfilename));
-      TGeoManager::Import(geomfilename);
+  if(gAlice->IsRootGeometry()){ //load geometry either from CDB or from file
+    if(gAlice->IsGeomFromCDB()){
+      AliInfo("Loading geometry from CDB default storage");
+      AliCDBPath path("GRP","Geometry","Data");
+      AliCDBEntry *entry=AliCDBManager::Instance()->Get(path.GetPath());
+      if(!entry) AliFatal("Unable to load geometry from CDB!");
+      entry->SetOwner(0);
+      gGeoManager = (TGeoManager*) entry->GetObject();
+      if (!gGeoManager) AliFatal("TGeoManager object not found in the specified CDB entry!");
     }else{
-      AliInfo(Form("Geometry file %40s not found!\n",geomfilename));
-      return;
+      // Load geometry
+      const char *geomfilename = gAlice->GetGeometryFileName();
+      if(gSystem->ExpandPathName(geomfilename)){
+       AliInfo(Form("Loading geometry from file:\n %40s",geomfilename));
+       TGeoManager::Import(geomfilename);
+      }else{
+       AliInfo(Form("Geometry file %40s not found!\n",geomfilename));
+       return;
+      }
     }
   }else{
     // Create modules, materials, geometry
@@ -178,11 +194,42 @@ void  AliMC::ConstructGeometry()
   
 }
 
+//_______________________________________________________________________
+Bool_t  AliMC::MisalignGeometry() 
+{
+// Call misalignment code if AliSimulation object was defined.
+
+   if(!gAlice->IsRootGeometry()){
+     //Set alignable volumes for the whole geometry
+     SetAllAlignableVolumes();
+   }
+   // Misalign geometry via AliSimulation instance
+   if (!AliSimulation::GetInstance()) return kFALSE;
+   AliGeomManager::SetGeometry(gGeoManager);
+   return AliSimulation::GetInstance()->MisalignGeometry(gAlice->GetRunLoader());
+}   
+
+//_______________________________________________________________________
+void  AliMC::ConstructOpGeometry() 
+{
+  //
+  // Loop all detector modules and call DefineOpticalProperties() method 
+  //
+
+  TIter next(gAlice->Modules());
+  AliModule *detector;
+  AliInfo("Optical properties definition");
+  while((detector = dynamic_cast<AliModule*>(next()))) {
+    // Initialise detector optical properties
+    detector->DefineOpticalProperties();
+  }  
+}
+
 //_______________________________________________________________________
 void  AliMC::InitGeometry()
 { 
   //
-  // Initialize detectors and display geometry
+  // Initialize detectors
   //
 
   AliInfo("Initialisation:");
@@ -191,14 +238,28 @@ void  AliMC::InitGeometry()
   AliModule *detector;
   while((detector = dynamic_cast<AliModule*>(next()))) {
     stw.Start();
-    // Initialise detector and display geometry
+    // Initialise detector geometry
     if(gAlice->IsRootGeometry()) detector->CreateMaterials();
     detector->Init();
-    detector->BuildGeometry();
     AliInfo(Form("%10s R:%.2fs C:%.2fs",
                 detector->GetName(),stw.RealTime(),stw.CpuTime()));
   }
-  
+}
+
+//_______________________________________________________________________
+void  AliMC::SetAllAlignableVolumes()
+{ 
+  //
+  // Add alignable volumes (TGeoPNEntries) looping on all
+  // active modules
+  //
+
+  AliInfo(Form("Setting entries for all alignable volumes of active detectors"));
+  AliModule *detector;
+  TIter next(gAlice->Modules());
+  while((detector = dynamic_cast<AliModule*>(next()))) {
+    detector->AddAlignableVolumes();
+  }
 }
 
 //_______________________________________________________________________
@@ -226,13 +287,16 @@ void AliMC::ResetGenerator(AliGenerator *generator)
   //
   // Load the event generator
   //
-  if(fGenerator)
-    if(generator)
+  if(fGenerator) {
+    if(generator) {
       AliWarning(Form("Replacing generator %s with %s",
-                     fGenerator->GetName(),generator->GetName()))
-    else
+                     fGenerator->GetName(),generator->GetName()));
+    }
+    else {
       AliWarning(Form("Replacing generator %s with NULL",
                      fGenerator->GetName()));
+    }
+  }
   fGenerator = generator;
 }
 
@@ -282,13 +346,13 @@ void AliMC::Stepping()
   // Called at every step during transport
   //
     
-  Int_t id = DetFromMate(gMC->GetMedium());
+  Int_t id = DetFromMate(gMC->CurrentMedium());
   if (id < 0) return;
 
 
   if ( gMC->IsNewTrack()            && 
        gMC->TrackTime() == 0.       &&
-       fRDecayMin > 0.              &&  
+       fRDecayMin >= 0.             &&  
        fRDecayMax > fRDecayMin      &&
        gMC->TrackPid() == fDecayPdg ) 
   {
@@ -314,7 +378,7 @@ void AliMC::Stepping()
     //Call the appropriate stepping routine;
     AliModule *det = dynamic_cast<AliModule*>(gAlice->Modules()->At(id));
     if(det && det->StepManagerIsEnabled()) {
-      fMCQA->StepManager(id);
+      if(AliLog::GetGlobalDebugLevel()>0) fMCQA->StepManager(id);
       det->StepManager();
     }
   }
@@ -546,6 +610,7 @@ void AliMC::FinishEvent()
   //
   
   //
+    
   if(gAlice->Lego()) gAlice->Lego()->FinishEvent();
 
   TIter next(gAlice->Modules());
@@ -577,7 +642,7 @@ void AliMC::FinishEvent()
 
   
   // Write out the kinematics
-  stack->FinishEvent();
+  if (!gAlice->Lego()) stack->FinishEvent();
    
   // Write out the event Header information
   TTree* treeE = runloader->TreeE();
@@ -621,6 +686,10 @@ void AliMC::Init()
 
    //=================Create Materials and geometry
    gMC->Init();
+  // Set alignable volumes for the whole geometry (with old root)
+#if ROOT_VERSION_CODE < 331527
+  SetAllAlignableVolumes();
+#endif
    //Read the cuts for all materials
    ReadTransPar();
    //Build the special IMEDIA table
@@ -629,9 +698,6 @@ void AliMC::Init()
    //Compute cross-sections
    gMC->BuildPhysics();
    
-   //Write Geometry object to current file.
-   gAlice->GetRunLoader()->WriteGeometry();
-
    //Initialise geometry deposition table
    fEventEnergy.Set(gMC->NofVolumes()+1);
    fSummEnergy.Set(gMC->NofVolumes()+1);
@@ -643,9 +709,6 @@ void AliMC::Init()
    // Register MC in configuration 
    AliConfig::Instance()->Add(gMC);
 
-   // Export TGeo geometry
-   if (gGeoManager) gGeoManager->Export("geometry.root");
-
 }
 
 //_______________________________________________________________________
@@ -830,7 +893,6 @@ void AliMC::Browse(TBrowser *b)
   b->Add(fMCQA,"AliMCQA");
 }
 
-//PH
 //_______________________________________________________________________
 void AliMC::AddHit(Int_t id, Int_t track, Int_t *vol, Float_t *hits) const
 {
@@ -1043,17 +1105,17 @@ void AliMC::RemapTrackReferencesIDs(Int_t *map)
   // Called at finish primary
   //
   if (!fTrackReferences) return;
-  for (Int_t i=0;i<fTrackReferences->GetEntries();i++){
-    AliTrackReference * ref = dynamic_cast<AliTrackReference*>(fTrackReferences->UncheckedAt(i));
-    if (ref) {
-      Int_t newID = map[ref->GetTrack()];
-      if (newID>=0) ref->SetTrack(newID);
-      else {
-        //ref->SetTrack(-1);
-        ref->SetBit(kNotDeleted,kFALSE);
-        fTrackReferences->RemoveAt(i);  
-      }      
-    }
+  Int_t nEntries = fTrackReferences->GetEntries();
+  for (Int_t i=0; i < nEntries; i++){
+      AliTrackReference * ref = dynamic_cast<AliTrackReference*>(fTrackReferences->UncheckedAt(i));
+      if (ref) {
+         Int_t newID = map[ref->GetTrack()];
+         if (newID>=0) ref->SetTrack(newID);
+         else {
+             ref->SetBit(kNotDeleted,kFALSE);
+             fTrackReferences->RemoveAt(i);  
+         }      
+      } // if ref
   }
   fTrackReferences->Compress();
 }
@@ -1103,5 +1165,5 @@ void AliMC::FixParticleDecaytime()
     //
     // Force decay time in transport code
     //
-    gMC->ForceDecayTime(t);
+    gMC->ForceDecayTime(t / 2.99792458e10);
 }