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;
//_____________________________________________________________________________
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")));
}
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!");
fgGeometry = geom;
InitPNEntriesLUT();
+ InitNalignable();
}
//_____________________________________________________________________________
}
//_____________________________________________________________________________
-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.
}
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;
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)
{
"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)
{
return kFALSE;
}
}
- }
-
AliDebugClass(2,"Consistency check for PHOS symbolic names finished successfully.");
}
}
//______________________________________________________________________
-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.
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;
+ TString *pneName = 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);
+ 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++;
+ }
+ fgNalignable[iDet] = nAlDet;
+ }
+
+}
+
//_____________________________________________________________________________
Bool_t AliGeomManager::ApplyAlignObjsFromCDB(const char* AlignDetsList)
{
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 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();
}
}
return ApplyAlignObjsToGeom(*alignObjArray);
}
+
+