]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STEER/AliMC.cxx
Quick fix for bug 71658
[u/mrichter/AliRoot.git] / STEER / AliMC.cxx
index 12dd60c4b4e1c939ae41b14bede5b6a3a6df2de6..6bd4e9324b0ccaa42f0ab4ad345770ca6bb2b3e1 100644 (file)
@@ -124,8 +124,8 @@ void  AliMC::ConstructGeometry()
   // at InitGeometry().
   //
 
-  if(gAlice->IsRootGeometry()){ //load geometry either from CDB or from file
-    if(gAlice->IsGeomFromCDB()){
+  if(AliSimulation::Instance()->IsGeometryFromFile()){ //load geometry either from CDB or from file
+    if(IsGeometryFromCDB()){
       AliInfo("Loading geometry from CDB default storage");
       AliCDBPath path("GRP","Geometry","Data");
       AliCDBEntry *entry=AliCDBManager::Instance()->Get(path.GetPath());
@@ -135,7 +135,7 @@ void  AliMC::ConstructGeometry()
       if (!gGeoManager) AliFatal("TGeoManager object not found in the specified CDB entry!");
     }else{
       // Load geometry
-      const char *geomfilename = gAlice->GetGeometryFileName();
+      const char *geomfilename = AliSimulation::Instance()->GetGeometryFile();
       if(gSystem->ExpandPathName(geomfilename)){
        AliInfo(Form("Loading geometry from file:\n %40s",geomfilename));
        TGeoManager::Import(geomfilename);
@@ -144,6 +144,7 @@ void  AliMC::ConstructGeometry()
        return;
       }
     }
+    gMC->SetRootGeometry();
   }else{
     // Create modules, materials, geometry
     if (!gGeoManager) new TGeoManager("ALICE", "ALICE geometry");
@@ -166,19 +167,19 @@ 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::Instance()) return kFALSE;
-   AliGeomManager::SetGeometry(gGeoManager);
-   if(!AliGeomManager::CheckSymNamesLUT("ALL"))
+  // Call misalignment code if AliSimulation object was defined.
+  
+  if(!AliSimulation::Instance()->IsGeometryFromFile()){
+    //Set alignable volumes for the whole geometry
+    SetAllAlignableVolumes();
+  }
+  // Misalign geometry via AliSimulation instance
+  if (!AliSimulation::Instance()) return kFALSE;
+  AliGeomManager::SetGeometry(gGeoManager);
+  if(!AliGeomManager::CheckSymNamesLUT("ALL"))
     AliFatal("Current loaded geometry differs in the definition of symbolic names!");
-
-   return AliSimulation::Instance()->MisalignGeometry(AliRunLoader::Instance());
+  
+  return AliSimulation::Instance()->MisalignGeometry(AliRunLoader::Instance());
 }   
 
 //_______________________________________________________________________
@@ -192,6 +193,8 @@ void  AliMC::ConstructOpGeometry()
   AliModule *detector;
   AliInfo("Optical properties definition");
   while((detector = dynamic_cast<AliModule*>(next()))) {
+    // Initialise detector geometry
+    if(AliSimulation::Instance()->IsGeometryFromFile()) detector->CreateMaterials();
     // Initialise detector optical properties
     detector->DefineOpticalProperties();
   }  
@@ -210,14 +213,30 @@ void  AliMC::InitGeometry()
   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::SetGeometryFromCDB()
+{
+  // Set the loading of geometry from cdb instead of creating it
+  // A default CDB storage needs to be set before this method is called
+  if(AliCDBManager::Instance()->IsDefaultStorageSet() &&
+     AliCDBManager::Instance()->GetRun() >= 0)
+    AliSimulation::Instance()->SetGeometryFile("*OCDB*");
+  else
+    AliError("Loading of geometry from CDB ignored. First set a default CDB storage!");
+}
+
+//_______________________________________________________________________
+Bool_t AliMC::IsGeometryFromCDB() const
+{
+  return (strcmp(AliSimulation::Instance()->GetGeometryFile(),"*OCDB*")==0);
+}
+
 //_______________________________________________________________________
 void  AliMC::SetAllAlignableVolumes()
 { 
@@ -300,13 +319,13 @@ void AliMC::BeginPrimary()
 void AliMC::PreTrack()
 {
   // Actions before the track's transport
+
      TObjArray &dets = *gAlice->Modules();
      AliModule *module;
 
      for(Int_t i=0; i<=gAlice->GetNdets(); i++)
        if((module = dynamic_cast<AliModule*>(dets[i])))
         module->PreTrack();
-
 }
 
 //_______________________________________________________________________
@@ -546,6 +565,7 @@ void AliMC::ResetSDigits()
 void AliMC::PostTrack()
 {
   // Posts tracks for each module
+
   TObjArray &dets = *gAlice->Modules();
   AliModule *module;
   
@@ -560,6 +580,7 @@ void AliMC::FinishPrimary()
   //
   // Called  at the end of each primary track
   //
+
   AliRunLoader *runloader=AliRunLoader::Instance();
   //  static Int_t count=0;
   //  const Int_t times=10;
@@ -628,8 +649,6 @@ void AliMC::FinishEvent()
   //
   // Called at the end of the event.
   //
-  
-  //
     
   if(AliSimulation::Instance()->Lego()) AliSimulation::Instance()->Lego()->FinishEvent();
 
@@ -794,12 +813,12 @@ void AliMC::ReadTransPar()
 
 
   const Int_t kncuts=10;
-  const Int_t knflags=11;
+  const Int_t knflags=12;
   const Int_t knpars=kncuts+knflags;
   const char kpars[knpars][7] = {"CUTGAM" ,"CUTELE","CUTNEU","CUTHAD","CUTMUO",
                               "BCUTE","BCUTM","DCUTE","DCUTM","PPCUTM","ANNI",
                               "BREM","COMP","DCAY","DRAY","HADR","LOSS",
-                              "MULS","PAIR","PHOT","RAYL"};
+                              "MULS","PAIR","PHOT","RAYL","STRA"};
   char line[256];
   char detName[7];
   char* filtmp;
@@ -835,10 +854,10 @@ void AliMC::ReadTransPar()
     if(!iret) continue;
     if(line[0]=='*') continue;
     // Read the numbers
-    iret=sscanf(line,"%s %d %f %f %f %f %f %f %f %f %f %f %d %d %d %d %d %d %d %d %d %d %d",
+    iret=sscanf(line,"%s %d %f %f %f %f %f %f %f %f %f %f %d %d %d %d %d %d %d %d %d %d %d %d",
                detName,&itmed,&cut[0],&cut[1],&cut[2],&cut[3],&cut[4],&cut[5],&cut[6],&cut[7],&cut[8],
                &cut[9],&flag[0],&flag[1],&flag[2],&flag[3],&flag[4],&flag[5],&flag[6],&flag[7],
-               &flag[8],&flag[9],&flag[10]);
+               &flag[8],&flag[9],&flag[10],&flag[11]);
     if(!iret) continue;
     if(iret<0) {
       //reading error
@@ -1091,6 +1110,7 @@ void AliMC::ResetTrackReferences()
     fTmpTrackReferences.Clear();
 }
 
+//_______________________________________________________________________
 void AliMC::RemapTrackReferencesIDs(Int_t *map)
 {
   // 
@@ -1113,6 +1133,7 @@ void AliMC::RemapTrackReferencesIDs(Int_t *map)
   fTmpTrackReferences.Compress();
 }
 
+//_______________________________________________________________________
 void AliMC::FixParticleDecaytime()
 {
     //
@@ -1140,12 +1161,13 @@ void AliMC::FixParticleDecaytime()
        // Maximum and minimum decay time
        //
        // Check for curlers first
-       if (fRDecayMax * fRDecayMax / rho / rho / 2. > 1.) return;
+       const Double_t kOvRhoSqr2 = 1./(rho*TMath::Sqrt(2.));
+       if (fRDecayMax * kOvRhoSqr2 > 1.) return;
        
        //
  
-       tmax  = TMath::ACos(1. - fRDecayMax * fRDecayMax / rho / rho / 2.) / omega;   // [ct]
-       tmin  = TMath::ACos(1. - fRDecayMin * fRDecayMin / rho / rho / 2.) / omega;   // [ct]
+       tmax  = TMath::ACos((1.-fRDecayMax*kOvRhoSqr2)*(1.+fRDecayMax*kOvRhoSqr2)) / omega;   // [ct]
+       tmin  = TMath::ACos((1.-fRDecayMin*kOvRhoSqr2)*(1.+fRDecayMin*kOvRhoSqr2)) / omega;   // [ct]
     } else {
        tmax =  fRDecayMax / vt;                                                      // [ct] 
        tmin =  fRDecayMin / vt;                                                      // [ct]
@@ -1170,6 +1192,7 @@ void AliMC::MakeTmpTrackRefsTree()
     fTmpTreeTR->Branch("TrackReferences", "TClonesArray", &pRef, 4000);
 }
 
+//_______________________________________________________________________
 void AliMC::ReorderAndExpandTreeTR()
 {
 //