]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STEER/AliGeomManager.cxx
move from Bz to BxByBz in track propagation
[u/mrichter/AliRoot.git] / STEER / AliGeomManager.cxx
index 893603c95a425c7ebea3a73cfe4b43eeef0f2f84..94d504c636c5f52386e59d187c38a06c0022a972 100644 (file)
@@ -111,6 +111,12 @@ void AliGeomManager::LoadGeometry(const char *geomFileName)
   // Load geometry either from a file
   // or from the corresponding CDB entry
 
+  if(fgGeometry->IsLocked()){
+      AliErrorClass("Cannot load a new geometry, the current one being locked. Setting internal geometry to null!!");
+      fgGeometry = NULL;
+      return;
+  }
+
   fgGeometry = NULL;
   if (geomFileName && (!gSystem->AccessPathName(geomFileName))) {
     fgGeometry = TGeoManager::Import(geomFileName);
@@ -130,17 +136,17 @@ void AliGeomManager::LoadGeometry(const char *geomFileName)
     AliInfoClass(Form("From now on using geometry from CDB base folder \"%s\"",
                      AliCDBManager::Instance()->GetURI("Geometry/Align/Data")));
   }
-
+  ResetPNEntriesLUT();
   InitPNEntriesLUT();
   InitNalignable();
 }
 
 //_____________________________________________________________________________
-void AliGeomManager::SetGeometry(TGeoManager *geom)
+void AliGeomManager::SetGeometry(TGeoManager * const geom)
 {
   // Load already active geometry
   if (!geom) AliFatalClass("Pointer to the active geometry is 0x0!");
-
+  ResetPNEntriesLUT();
   fgGeometry = geom;
   InitPNEntriesLUT();
   InitNalignable();
@@ -391,11 +397,11 @@ void  AliGeomManager::InitAlignObjFromGeometry()
   // Loop over all alignable volumes and extract
   // the corresponding alignment objects from
   // the TGeo geometry
-
-  if(fgAlignObjs[0]) return;
-
+  //
   for (Int_t iLayer = kFirstLayer; iLayer < AliGeomManager::kLastLayer; iLayer++) {
-    fgAlignObjs[iLayer-kFirstLayer] = new AliAlignObj*[LayerSize(iLayer)];
+    if (!fgAlignObjs[iLayer-kFirstLayer]) {
+      fgAlignObjs[iLayer-kFirstLayer] = new AliAlignObj*[LayerSize(iLayer)];
+    }
     for (Int_t iModule = 0; iModule < LayerSize(iLayer); iModule++) {
       UShort_t volid = LayerToVolUID(iLayer,iModule);
       fgAlignObjs[iLayer-kFirstLayer][iModule] = new AliAlignObjParams("",volid,0,0,0,0,0,0,kTRUE);
@@ -1115,15 +1121,13 @@ void AliGeomManager::InitPNEntriesLUT()
   // The LUTs are static; they are created at the creation of the
   // AliGeomManager instance and recreated if the geometry has changed
   //
-  if (fgPNEntry[0]) return;
-
   if(!fgGeometry) {
     AliErrorClass("Impossible to initialize PNEntries LUT without an active geometry");
     return;
   }
 
   for (Int_t iLayer = 0; iLayer < (kLastLayer - kFirstLayer); iLayer++){
-    fgPNEntry[iLayer] = new TGeoPNEntry*[fgLayerSize[iLayer]];
+    if (!fgPNEntry[iLayer]) fgPNEntry[iLayer] = new TGeoPNEntry*[fgLayerSize[iLayer]];
     for(Int_t modnum=0; modnum<fgLayerSize[iLayer]; modnum++){
       fgPNEntry[iLayer][modnum] = fgGeometry->GetAlignableEntryByUID(LayerToVolUID(iLayer+1,modnum));
     }
@@ -1131,7 +1135,7 @@ void AliGeomManager::InitPNEntriesLUT()
 }
 
 //______________________________________________________________________
-TGeoHMatrix* AliGeomManager::GetMatrix(TGeoPNEntry* pne) 
+TGeoHMatrix* AliGeomManager::GetMatrix(TGeoPNEntry * const pne) 
 {
   // Get the global transformation matrix for a given PNEntry
   // by quering the TGeoManager
@@ -1330,7 +1334,7 @@ Bool_t AliGeomManager::GetOrigGlobalMatrixFromPath(const char *path, TGeoHMatrix
 }
 
 //_____________________________________________________________________________
-TGeoHMatrix* AliGeomManager::GetOrigGlobalMatrix(TGeoPNEntry* pne)
+TGeoHMatrix* AliGeomManager::GetOrigGlobalMatrix(TGeoPNEntry * const pne)
 {
   // The method returns global matrix for the ideal detector geometry
   // using the corresponding TGeoPNEntry as an input.
@@ -1527,7 +1531,6 @@ void AliGeomManager::InitNalignable()
   
   Int_t nAlE = gGeoManager->GetNAlignable(); // total number of alignable entries
   TGeoPNEntry *pne = 0;
-  TString *pneName = 0;
   const char* detName;
   
   for (Int_t iDet = 0; iDet < fgkNDetectors ; iDet++) {
@@ -1537,9 +1540,11 @@ void AliGeomManager::InitNalignable()
     for(Int_t iE = 0; iE < nAlE; iE++)
     {
       pne = gGeoManager->GetAlignableEntry(iE);
-      pneName = new TString(pne->GetName());
-      if(pneName->Contains(detName)) nAlDet++;
-      if(!strcmp(detName,"GRP")) if(pneName->Contains("ABSO") || pneName->Contains("DIPO") || pneName->Contains("FRAME") || pneName->Contains("PIPE") || pneName->Contains("SHIL")) nAlDet++;
+      TString pneName = pne->GetName();
+      if(pneName.Contains(detName)) nAlDet++;
+      if(!strcmp(detName,"GRP")) if(pneName.Contains("ABSO")  || pneName.Contains("DIPO") || 
+                                   pneName.Contains("FRAME") || pneName.Contains("PIPE") || 
+                                   pneName.Contains("SHIL")) nAlDet++;
     }
     fgNalignable[iDet] = nAlDet;
   }
@@ -1575,7 +1580,7 @@ Bool_t AliGeomManager::ApplyAlignObjsFromCDB(const char* AlignDetsList)
   
   while((str = (TObjString*) iter.Next())){
     TString det(str->String());
-    AliInfoClass(Form("Loading alignment objs for %s",det.Data()));
+    AliDebugClass(5,Form("Loading alignment objs for %s",det.Data()));
     if(!LoadAlignObjsFromCDBSingleDet(det.Data(),alignObjArray)){
       alObjsNotLoaded += det.Data();
       alObjsNotLoaded += " ";
@@ -1589,7 +1594,8 @@ Bool_t AliGeomManager::ApplyAlignObjsFromCDB(const char* AlignDetsList)
 
   if(!alObjsLoaded.IsNull()) AliInfoClass(Form("Alignment objects loaded for: %s",
                                               alObjsLoaded.Data()));
-  if(!alObjsNotLoaded.IsNull()) AliInfoClass(Form("Didn't/couldn't load alignment objects for: %s",
+  if(!alObjsNotLoaded.IsNull())
+      AliFatalClass(Form("Could not load alignment objects from OCDB for: %s",
                                                  alObjsNotLoaded.Data()));
  
   return ApplyAlignObjsToGeom(alignObjArray);
@@ -1640,40 +1646,40 @@ Bool_t AliGeomManager::LoadAlignObjsFromCDBSingleDet(const char* detName, TObjAr
 //_____________________________________________________________________________
 Bool_t AliGeomManager::ApplyAlignObjsToGeom(TObjArray& alignObjArray, Bool_t ovlpcheck)
 {
-  // Read collection of alignment objects (AliAlignObj derived) saved
-  // in the TClonesArray alObjArray and apply them to gGeoManager
-  //
-  alignObjArray.Sort();
-  Int_t nvols = alignObjArray.GetEntriesFast();
+    // Read collection of alignment objects (AliAlignObj derived) saved
+    // in the TClonesArray alObjArray and apply them to gGeoManager
+    //
+    alignObjArray.Sort();
+    Int_t nvols = alignObjArray.GetEntriesFast();
 
-  Bool_t flag = kTRUE;
+    Bool_t flag = kTRUE;
 
-  for(Int_t j=0; j<nvols; j++)
-  {
-    AliAlignObj* alobj = (AliAlignObj*) alignObjArray.UncheckedAt(j);
-    flag = alobj->ApplyToGeometry(ovlpcheck);
-    if(!flag)
+    for(Int_t j=0; j<nvols; j++)
     {
-      AliDebugClass(5,Form("Error applying alignment object for volume %s !",alobj->GetSymName()));
-    }else{
-      AliDebugClass(5,Form("Alignment object for volume %s applied successfully",alobj->GetSymName()));
-    }
+       AliAlignObj* alobj = (AliAlignObj*) alignObjArray.UncheckedAt(j);
+       if(!alobj->ApplyToGeometry(ovlpcheck))
+       {
+           flag = kFALSE;
+           AliDebugClass(5,Form("Error applying alignment object for volume %s !",alobj->GetSymName()));
+       }else{
+           AliDebugClass(5,Form("Alignment object for volume %s applied successfully",alobj->GetSymName()));
+       }
 
-  }
+    }
 
-  if (AliDebugLevelClass() > 5) {
-    fgGeometry->CheckOverlaps(0.001);
-    TObjArray* ovexlist = fgGeometry->GetListOfOverlaps();
-    if(ovexlist->GetEntriesFast()){  
-      AliErrorClass("The application of alignment objects to the geometry caused huge overlaps/extrusions!");
-      fgGeometry->PrintOverlaps();
-   }
-  }
+    if (AliDebugLevelClass() > 5) {
+       fgGeometry->CheckOverlaps(0.001);
+       TObjArray* ovexlist = fgGeometry->GetListOfOverlaps();
+       if(ovexlist->GetEntriesFast()){  
+           AliErrorClass("The application of alignment objects to the geometry caused huge overlaps/extrusions!");
+           fgGeometry->PrintOverlaps();
+       }
+    }
 
-  // Update the TGeoPhysicalNodes
-  fgGeometry->RefreshPhysicalNodes();
+    // Update the TGeoPhysicalNodes
+    fgGeometry->RefreshPhysicalNodes();
 
-  return flag;
+    return flag;
 
 }
 
@@ -1753,4 +1759,15 @@ Bool_t AliGeomManager::ApplyAlignObjsToGeom(const char* detName, Int_t runnum, I
   return ApplyAlignObjsToGeom(*alignObjArray);
 }
 
-
+//_____________________________________________________________________________
+void AliGeomManager::ResetPNEntriesLUT()
+{
+  // cleans static arrays containing the information on currently loaded geometry
+  //
+  for (Int_t iLayer = 0; iLayer < (kLastLayer - kFirstLayer); iLayer++){
+    if (!fgPNEntry[iLayer]) continue;
+    for (Int_t modnum=0; modnum<fgLayerSize[iLayer]; modnum++) fgPNEntry[iLayer][modnum] = 0;
+  }
+  //
+}
+