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;
//_____________________________________________________________________________
// 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) {
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();
}
//_____________________________________________________________________________
// 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);
}
//_____________________________________________________________________________
-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.
- // The LUT is now hold inside the geometry and handled by TGeo.
+ // The LUT is now held inside the geometry and handled by TGeo.
// The method is meant to be launched when loading a geometry to verify that
// no changes in the symbolic names have been introduced, which would prevent
// backward compatibility with alignment objects.
}
if(phosActive) detsString+="PHOS ";
- if(fgGeometry->CheckPath("ALIC_1/XEN1_1")) detsString+="EMCAL";
+ // Check over the ten EMCAL full supermodules and the two EMCAL half supermodules
+ TString emcalSM;
+ TString baseEmcalSM("ALIC_1/XEN1_1/SM");
+ Bool_t emcalActive=kFALSE;
+ Bool_t emcalSMs[12] = {kFALSE};
+ for(Int_t sm=0; sm<12; sm++)
+ {
+ emcalSM=baseEmcalSM;
+ if(sm<10){
+ emcalSM += "OD_";
+ emcalSM += (sm+1);
+ }else{
+ emcalSM += "10_";
+ emcalSM += (sm-9);
+ }
+ if(fgGeometry->CheckPath(emcalSM.Data()))
+ {
+ emcalActive=kTRUE;
+ emcalSMs[sm]=kTRUE;
+ }
+ }
+ if(emcalActive) detsString+="EMCAL ";
+
TString symname;
const char* sname;
modnum=0;
for (Int_t iModule=1; iModule <= 12; iModule++) {
+ if(!emcalSMs[iModule-1]) continue;
symname = str;
symname += iModule;
if(iModule >10) {
// 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));
}
}
//______________________________________________________________________
-TGeoHMatrix* AliGeomManager::GetMatrix(TGeoPNEntry* pne)
+TGeoHMatrix* AliGeomManager::GetMatrix(TGeoPNEntry * const pne)
{
// Get the global transformation matrix for a given PNEntry
// by quering the TGeoManager
}
//_____________________________________________________________________________
-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.
}
//_____________________________________________________________________________
-Bool_t AliGeomManager::IsModuleInGeom(const char* module)
+Int_t AliGeomManager::GetNalignable(const char* module)
{
- // Return true if the module passed as argument is present in the current geometry
+ // Get number of declared alignable volumes for given detector in current geometry
//
- TString subdet(module);
-
- if(subdet==TString("ACORDE"))
- {
- if(fgGeometry->GetAlignableEntry("ACORDE/Array1")) return kTRUE;
- }else if(subdet==TString("EMCAL"))
- {
- if(fgGeometry->GetAlignableEntry("EMCAL/FullSupermodule0") || fgGeometry->GetAlignableEntry("EMCAL/CosmicTestSupermodule0")) return kTRUE;
- }else if(subdet==TString("FMD"))
- {
- if(fgGeometry->GetAlignableEntry("FMD/FMD1_T")) return kTRUE;
- }else if(subdet==TString("HMPID"))
- {
- if(fgGeometry->GetAlignableEntry("/HMPID/Chamber0")) return kTRUE;
- }else if(subdet==TString("ITS"))
- {
- if(fgGeometry->GetAlignableEntry("ITS")) return kTRUE;
- }else if(subdet==TString("MUON"))
- {
- if(fgGeometry->GetAlignableEntry("/MUON/GM0")) return kTRUE;
- }else if(subdet==TString("PMD"))
- {
- if(fgGeometry->GetAlignableEntry("PMD/Sector1")) return kTRUE;
- }else if(subdet==TString("PHOS"))
- {
- if(fgGeometry->GetAlignableEntry("PHOS/Cradle0")) return kTRUE;
- }else if(subdet==TString("T0"))
- {
- if(fgGeometry->GetAlignableEntry("/ALIC_1/0STR_1")) return kTRUE;
- }else if(subdet==TString("TRD"))
- {
- if(fgGeometry->GetAlignableEntry("TRD/sm00")) return kTRUE;
- }else if(subdet==TString("TPC"))
- {
- if(fgGeometry->GetAlignableEntry("TPC/EndcapA/Sector1/InnerChamber")) return kTRUE;
- }else if(subdet==TString("TOF"))
- {
- if(fgGeometry->GetAlignableEntry("TOF/sm00/strip01")) return kTRUE;
- }else if(subdet==TString("VZERO"))
- {
- if(fgGeometry->GetAlignableEntry("VZERO/V0C")) return kTRUE;
- }else if(subdet==TString("ZDC"))
- {
- if(fgGeometry->GetAlignableEntry("ZDC/NeutronZDC_C")) return kTRUE;
- }else if(subdet==TString("FRAME"))
- {
- if(fgGeometry->GetAlignableEntry("FRAME/Sector0")) return kTRUE;
- }else
- AliErrorClass(Form("%s is not a valid ALICE module name",module));
-
- return kFALSE;
+ // 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)
{
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 += " ";
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);
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);
//_____________________________________________________________________________
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++)
{
- AliWarningClass(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;
}
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;
+ }
+ //
+}
+