]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STEER/AliGeomManager.cxx
The total mult in V0 became float number.
[u/mrichter/AliRoot.git] / STEER / AliGeomManager.cxx
index 2ff8fdc826648209348c859939616319ea4f7ec5..c97a571dee17aa5879a0f09e15d366a3aa4d126b 100644 (file)
@@ -98,6 +98,10 @@ AliAlignObj** AliGeomManager::fgAlignObjs[kLastLayer - kFirstLayer] = {
   0x0
 };
 
+const char* AliGeomManager::fgkDetectorName[AliGeomManager::fgkNDetectors] = {"GRP","ITS","TPC","TRD","TOF","PHOS","HMPID","EMCAL","MUON","FMD","ZDC","PMD","T0","VZERO","ACORDE"};
+Int_t AliGeomManager::fgNalignable[fgkNDetectors] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+
+
 TGeoManager* AliGeomManager::fgGeometry = 0x0;
 
 //_____________________________________________________________________________
@@ -107,10 +111,16 @@ 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);
-    AliInfoClass(Form("From now on using geometry from custom geometry file %s",geomFileName));
+    AliInfoClass(Form("From now on using geometry from custom geometry file \"%s\"",geomFileName));
   }
 
   if (!fgGeometry) {
@@ -123,21 +133,23 @@ void AliGeomManager::LoadGeometry(const char *geomFileName)
     fgGeometry = (TGeoManager*) entry->GetObject();
     if (!fgGeometry) AliFatalClass("Couldn't find TGeoManager in the specified CDB entry!");
     
-    AliInfoClass(Form("From now on using geometry from CDB base folder %s",
+    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();
 }
 
 //_____________________________________________________________________________
@@ -385,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);
@@ -461,7 +473,7 @@ const char* AliGeomManager::SymName(ELayerID layerId, Int_t modId)
 }
 
 //_____________________________________________________________________________
-Bool_t AliGeomManager::CheckSymNamesLUT(const char* detsToBeChecked)
+Bool_t AliGeomManager::CheckSymNamesLUT(const char* /*detsToBeChecked*/)
 {
   // Check the look-up table which associates the unique numerical identity of
   // each alignable volume to the corresponding symbolic volume name.
@@ -525,12 +537,31 @@ Bool_t AliGeomManager::CheckSymNamesLUT(const char* detsToBeChecked)
   }
   if(trdActive) detsString+="TRD ";
 
-  if(fgGeometry->CheckPath("ALIC_1/B077_1/BSEGMO0_1/BTRD0_1/UTR1_1")) detsString+="TRD ";
   if(fgGeometry->CheckPath("ALIC_1/Hmp0_0")) detsString+="HMPID ";
-  if(fgGeometry->CheckPath("ALIC_1/PHOS_1")) detsString+="PHOS ";
+  
+  TString phosMod, cpvMod;
+  TString basePhos("ALIC_1/PHOS_");
+  Bool_t phosActive=kFALSE;
+  Bool_t cpvActive=kFALSE;
+  Bool_t phosMods[5];
+  for(Int_t pmod=0; pmod<5; pmod++)
+  {
+    phosMods[pmod]=kFALSE;
+    phosMod = basePhos;
+    phosMod += (pmod+1);
+    cpvMod = phosMod;
+    cpvMod += "/PCPV_1";
+    if(fgGeometry->CheckPath(phosMod.Data()))
+    {
+      phosActive=kTRUE;
+      phosMods[pmod]=kTRUE;
+      if(fgGeometry->CheckPath(cpvMod.Data())) cpvActive=kTRUE;
+    }
+  }
+  if(phosActive) detsString+="PHOS ";
+
   if(fgGeometry->CheckPath("ALIC_1/XEN1_1")) detsString+="EMCAL";
 
-  
   TString symname;
   const char* sname;
   TGeoPNEntry* pne = 0x0;
@@ -1000,15 +1031,14 @@ Bool_t AliGeomManager::CheckSymNamesLUT(const char* detsToBeChecked)
 
     AliDebugClass(2,"Checking consistency of symbolic names for PHOS layers");
     
-    {
       TString str = "PHOS/Module";
       modnum=0;
 
-      for (Int_t iModule=1; iModule <= 5; iModule++) {
+      for (Int_t iModule=0; iModule < 5; iModule++) {
+       if(!phosMods[iModule]) continue;
        symname = str;
-       symname += iModule;
-       modnum = iModule-1;
-       uid = LayerToVolUID(kPHOS1,modnum);
+       symname += (iModule+1);
+       uid = LayerToVolUID(kPHOS1,iModule);
        pne = fgGeometry->GetAlignableEntryByUID(uid);
        if(!pne)
        {
@@ -1022,20 +1052,10 @@ Bool_t AliGeomManager::CheckSymNamesLUT(const char* detsToBeChecked)
                "Expected was %s, found was %s!", uid, symname.Data(), sname));
          return kFALSE;
        }
-      }
-    }
-
-    /*********************      PHOS CPV layer   ***********************/
-    {
-      TString str = "PHOS/Module";
-      modnum=0;
-
-      for (Int_t iModule=1; iModule <= 5; iModule++) {
-       symname = str;
-       symname += iModule;
+       /*********************      PHOS CPV layer   ***********************/
+       if(!cpvActive) continue;
        symname += "/CPV";
-       modnum = iModule-1;
-       uid = LayerToVolUID(kPHOS2,modnum);
+       uid = LayerToVolUID(kPHOS2,iModule);
        pne = fgGeometry->GetAlignableEntryByUID(uid);
        if(!pne)
        {
@@ -1050,8 +1070,6 @@ Bool_t AliGeomManager::CheckSymNamesLUT(const char* detsToBeChecked)
          return kFALSE;
        }
       }
-    }
-
     AliDebugClass(2,"Consistency check for PHOS symbolic names finished successfully.");
   }
 
@@ -1103,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));
     }
@@ -1119,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
@@ -1318,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.
@@ -1491,6 +1507,50 @@ void AliGeomManager::CheckOverlapsOverPNs(Double_t threshold)
   delete overlaps;
 }
 
+//_____________________________________________________________________________
+Int_t AliGeomManager::GetNalignable(const char* module)
+{
+  // Get number of declared alignable volumes for given detector in current geometry
+  //
+  
+  // return the detector index corresponding to detector
+  Int_t index = -1 ;
+  for (index = 0; index < fgkNDetectors ; index++) {
+    if ( strcmp(module, fgkDetectorName[index]) == 0 )
+      break ;
+  }
+  return fgNalignable[index];
+}
+  
+//_____________________________________________________________________________
+void AliGeomManager::InitNalignable()
+{
+  // Set number of declared alignable volumes for given detector in current geometry
+  // by looping on the list of PNEntries
+  //
+  
+  Int_t nAlE = gGeoManager->GetNAlignable(); // total number of alignable entries
+  TGeoPNEntry *pne = 0;
+  const char* detName;
+  
+  for (Int_t iDet = 0; iDet < fgkNDetectors ; iDet++) {
+    detName = fgkDetectorName[iDet];
+    Int_t nAlDet = 0;
+    
+    for(Int_t iE = 0; iE < nAlE; iE++)
+    {
+      pne = gGeoManager->GetAlignableEntry(iE);
+      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;
+  }
+
+}
+  
 //_____________________________________________________________________________
 Bool_t AliGeomManager::ApplyAlignObjsFromCDB(const char* AlignDetsList)
 {
@@ -1520,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 += " ";
@@ -1563,8 +1623,10 @@ Bool_t AliGeomManager::LoadAlignObjsFromCDBSingleDet(const char* detName, TObjAr
   entry->SetOwner(1);
   TClonesArray *alignArray = (TClonesArray*) entry->GetObject();       
   alignArray->SetOwner(0);
-  AliDebugClass(2,Form("Found %d alignment objects for %s",
-                      alignArray->GetEntries(),detName));
+  Int_t nAlObjs = alignArray->GetEntries();
+  AliDebugClass(2,Form("Found %d alignment objects for %s",nAlObjs,detName));
+  Int_t nAlVols = GetNalignable(detName);
+  if(nAlObjs!=nAlVols) AliWarningClass(Form("%d alignment objects loaded for %s, which has %d alignable volumes",nAlObjs,detName,GetNalignable(detName)));
 
   AliAlignObj *alignObj=0;
   TIter iter(alignArray);
@@ -1592,16 +1654,24 @@ Bool_t AliGeomManager::ApplyAlignObjsToGeom(TObjArray& alignObjArray, Bool_t ovl
   Bool_t flag = kTRUE;
 
   for(Int_t j=0; j<nvols; j++)
+  {
+    AliAlignObj* alobj = (AliAlignObj*) alignObjArray.UncheckedAt(j);
+    flag = alobj->ApplyToGeometry(ovlpcheck);
+    if(!flag)
     {
-      AliAlignObj* alobj = (AliAlignObj*) alignObjArray.UncheckedAt(j);
-      if (alobj->ApplyToGeometry(ovlpcheck) == kFALSE) 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() >= 1) {
-    fgGeometry->GetTopNode()->CheckOverlaps(1);
+  }
+
+  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();
    }
   }
 
@@ -1689,29 +1759,14 @@ Bool_t AliGeomManager::ApplyAlignObjsToGeom(const char* detName, Int_t runnum, I
 }
 
 //_____________________________________________________________________________
-Int_t AliGeomManager::CheckOverlapsExtrusions(TGeoNode* start, Double_t threshold)
+void AliGeomManager::ResetPNEntriesLUT()
 {
-  // For the given node check for overlaps and extrusions within threshold by means
-  // both of the standard checker and of the checker by sampling.
-  // Returns the total number of overlaps for the given node.
+  // 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;
+  }
   //
-  TGeoVolume* vol = start->GetVolume();
-  gGeoManager->ClearOverlaps();
-  gGeoManager->SetCheckingOverlaps();
-  AliDebugClass(2,Form("Checking overlaps for volume %s",vol->GetName()));
-  vol->CheckOverlaps(threshold); 
-  AliDebugClass(2,Form("Checking overlaps by sampling for node %s",start->GetName()));
-  start->CheckOverlaps(threshold,"s");  
-
-  TObjArray* ovexArray = (TObjArray*)gGeoManager->GetListOfOverlaps();
-  Int_t nOvEx = ovexArray->GetEntriesFast();
-  AliDebugClass(2,Form("Number of overlaps/extrusions: %d", nOvEx));
-  if(AliLog::GetDebugLevel("","AliGeomManager")>2) gGeoManager->PrintOverlaps();
-  ovexArray->Delete();
-  delete ovexArray;
-
-  gGeoManager->SetCheckingOverlaps(kFALSE);
-
-  return nOvEx;
 }
-
+