]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STEER/AliMC.cxx
Adding Generate method to build a store with identical values (Laurent)
[u/mrichter/AliRoot.git] / STEER / AliMC.cxx
index 6a8bb1d484b1cf66455fbac494fe81a93522d953..d443cd921752cc542c18933ff6426624b2335fad 100644 (file)
 
 #include <RVersion.h>
 #include <TBrowser.h>
+#include <TClonesArray.h>
+#include <TGeoManager.h>
 #include <TStopwatch.h>
 #include <TSystem.h>
 #include <TVirtualMC.h>
-#include "TGeant3.h"
-
  
 #include "AliLog.h"
 #include "AliDetector.h"
@@ -52,6 +52,9 @@ AliMC::AliMC() :
   fSum2Energy(0),
   fTrRmax(1.e10),
   fTrZmax(1.e10),
+  fRDecayMax(1.e10),
+  fRDecayMin(-1.),
+  fDecayPdg(0),
   fImedia(0),
   fTransParName("\0"),
   fMCQA(0),
@@ -72,6 +75,9 @@ AliMC::AliMC(const char *name, const char *title) :
   fSum2Energy(0),
   fTrRmax(1.e10),
   fTrZmax(1.e10),
+  fRDecayMax(1.e10),
+  fRDecayMin(-1.),
+  fDecayPdg(0),
   fImedia(new TArrayI(1000)),
   fTransParName("\0"),
   fMCQA(0),
@@ -95,6 +101,9 @@ AliMC::AliMC(const AliMC &mc) :
   fSum2Energy(0),
   fTrRmax(1.e10),
   fTrZmax(1.e10),
+  fRDecayMax(1.e10),
+  fRDecayMin(-1.),
+  fDecayPdg(0),
   fImedia(0),
   fTransParName("\0"),
   fMCQA(0),
@@ -102,7 +111,7 @@ AliMC::AliMC(const AliMC &mc) :
   fTrackReferences(0)
 {
   //
-  // Copy constructor for AliRun
+  // Copy constructor for AliMC
   //
   mc.Copy(*this);
 }
@@ -135,9 +144,24 @@ void AliMC::Copy(TObject &) const
 void  AliMC::ConstructGeometry() 
 {
   //
-  // Create modules, materials, geometry
+  // Either load geometry from file or create it through usual
+  // loop on detectors. In the first case the method
+  // AliModule::CreateMaterials() only builds fIdtmed and is postponed
+  // 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);
+    }else{
+      AliInfo(Form("Geometry file %40s not found!\n",geomfilename));
+      return;
+    }
+  }else{
+    // Create modules, materials, geometry
     TStopwatch stw;
     TIter next(gAlice->Modules());
     AliModule *detector;
@@ -150,28 +174,61 @@ void  AliMC::ConstructGeometry()
       AliInfo(Form("%10s R:%.2fs C:%.2fs",
                   detector->GetName(),stw.RealTime(),stw.CpuTime()));
     }
+  }
+  
+}
+
+//_______________________________________________________________________
+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:");
-    TStopwatch stw;
-    TIter next(gAlice->Modules());
-    AliModule *detector;
-    while((detector = dynamic_cast<AliModule*>(next()))) {
-      stw.Start();
-      // Initialise detector and display geometry
-      detector->Init();
-      detector->BuildGeometry();
-      AliInfo(Form("%10s R:%.2fs C:%.2fs",
-                  detector->GetName(),stw.RealTime(),stw.CpuTime()));
-    }
+  AliInfo("Initialisation:");
+  TStopwatch stw;
+  TIter next(gAlice->Modules());
+  AliModule *detector;
+  while((detector = dynamic_cast<AliModule*>(next()))) {
+    stw.Start();
+    // Initialise detector geometry
+    if(gAlice->IsRootGeometry()) detector->CreateMaterials();
+    detector->Init();
+    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();
+  }
 }
 
 //_______________________________________________________________________
@@ -255,13 +312,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 ) 
   {
@@ -287,7 +344,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();
     }
   }
@@ -471,12 +528,12 @@ void AliMC::ResetHits()
 void AliMC::PostTrack()
 {
   // Posts tracks for each module
-     TObjArray &dets = *gAlice->Modules();
-     AliModule *module;
-
-     for(Int_t i=0; i<=gAlice->GetNdets(); i++)
-       if((module = dynamic_cast<AliModule*>(dets[i])))
-        module->PostTrack();
+  TObjArray &dets = *gAlice->Modules();
+  AliModule *module;
+  
+  for(Int_t i=0; i<=gAlice->GetNdets(); i++)
+    if((module = dynamic_cast<AliModule*>(dets[i])))
+      module->PostTrack();
 }
 
 //_______________________________________________________________________
@@ -519,6 +576,7 @@ void AliMC::FinishEvent()
   //
   
   //
+    
   if(gAlice->Lego()) gAlice->Lego()->FinishEvent();
 
   TIter next(gAlice->Modules());
@@ -550,7 +608,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();
@@ -594,6 +652,8 @@ void AliMC::Init()
 
    //=================Create Materials and geometry
    gMC->Init();
+   //Set alignable volumes for the whole geometry
+   SetAllAlignableVolumes();
    //Read the cuts for all materials
    ReadTransPar();
    //Build the special IMEDIA table
@@ -602,9 +662,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);
@@ -800,7 +857,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
 {
@@ -1013,17 +1069,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();
 }
@@ -1073,6 +1129,5 @@ void AliMC::FixParticleDecaytime()
     //
     // Force decay time in transport code
     //
-    TGeant3 * geant = (TGeant3*) gMC;
-    geant->Gcphys()->sumlif = t / p.Beta() / p.Gamma();
+    gMC->ForceDecayTime(t / 2.99792458e10);
 }