]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
fix for a bug in re-initialization of the PNE LUT and for a memory leak (by Ruben)
authorrgrosso <rgrosso@f7af4fe6-9843-0410-8265-dc069ae4e863>
Sun, 22 Mar 2009 12:06:45 +0000 (12:06 +0000)
committerrgrosso <rgrosso@f7af4fe6-9843-0410-8265-dc069ae4e863>
Sun, 22 Mar 2009 12:06:45 +0000 (12:06 +0000)
STEER/AliGeomManager.cxx
STEER/AliGeomManager.h

index 80a8332300a165f4aab760795aa775614e5d9c81..6fdc34b0107e9491f2ec8bfa62151fb5f718e3b3 100644 (file)
@@ -130,7 +130,7 @@ 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();
 }
@@ -140,7 +140,7 @@ 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,14 +391,16 @@ 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)];
+      memset(fgAlignObjs[iLayer-kFirstLayer],0,LayerSize(iLayer)*sizeof(AliAlignObj*));
+    }
     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);
+      if (!fgAlignObjs[iLayer-kFirstLayer][iModule]) fgAlignObjs[iLayer-kFirstLayer][iModule] = 
+                                                      new AliAlignObjParams("",volid,0,0,0,0,0,0,kTRUE);
       const char *symname = SymName(volid);
       if (!GetFromGeometry(symname, *fgAlignObjs[iLayer-kFirstLayer][iModule]))
        AliErrorClass(Form("Failed to extract the alignment object for the volume (ID=%d and path=%s) !",volid,symname));
@@ -1115,15 +1117,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));
     }
@@ -1527,7 +1527,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 +1536,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;
   }
@@ -1753,4 +1754,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;
+  }
+  //
+}
+  
index a8aff5cf981d90f99918f745ff105e83627ad110..63b62078af15a26e71f15bc16f9ae3d7a8711c1c 100644 (file)
@@ -112,6 +112,7 @@ public:
   static TGeoPNEntry* GetPNEntry(Int_t index);
   static TGeoPNEntry* GetPNEntry(ELayerID layerId, Int_t modId);
 
+  static void        ResetPNEntriesLUT();
   static void        InitAlignObjFromGeometry();
   static void        InitPNEntriesLUT();
   static void        InitNalignable();
@@ -126,7 +127,7 @@ public:
   static const char *  fgkDetectorName[fgkNDetectors] ; // name of detectors
   static Int_t       fgNalignable[fgkNDetectors];
 
-  ClassDef(AliGeomManager, 0);
+  ClassDef(AliGeomManager, 0); // Manager of geometry information for alignment
 };
 
 #endif