+//_____________________________________________________________________________
+void AliPHOSv0::AddAlignableVolumes() const
+{
+ //
+ // Create entries for alignable volumes associating the symbolic volume
+ // name with the corresponding volume path. Needs to be syncronized with
+ // eventual changes in the geometry
+ // Alignable volumes are:
+ // 1) PHOS modules as a whole
+ // 2) Cradle
+ // 3) Cradle wheels
+ // 4) Strip units (group of 2x8 crystals)
+
+ TString volpath, symname;
+
+ // Alignable modules
+ // Volume path /ALIC_1/PHOS_<i> => symbolic name /PHOS/Module<i>, <i>=1,2,3,4,5
+
+ TString physModulePath="/ALIC_1/PHOS_";
+ TString symbModuleName="PHOS/Module";
+ Int_t nModules = GetGeometry()->GetNModules();
+
+ for(Int_t iModule=1; iModule<=nModules; iModule++){
+ volpath = physModulePath;
+ volpath += iModule;
+ symname = symbModuleName;
+ symname += iModule;
+ gGeoManager->SetAlignableEntry(symname.Data(),volpath.Data());
+ }
+
+ //Aligning of CPV should be done for volume PCPV_1
+ symbModuleName="PHOS/Module";
+ for(Int_t iModule=1; iModule<=nModules; iModule++){
+ volpath = physModulePath;
+ volpath += iModule;
+ volpath += "/PCPV_1";
+ symname = symbModuleName;
+ symname += iModule;
+ symname += "/CPV";
+ gGeoManager->SetAlignableEntry(symname.Data(),volpath.Data());
+ }
+
+
+ // Alignable cradle walls
+ // Volume path /ALIC_1/PCRA_<i> => symbolic name /PHOS/Cradle<i>, <i>=0,1
+
+ TString physCradlePath="/ALIC_1/PCRA_";
+ TString symbCradleName="PHOS/Cradle";
+ Int_t nCradles = 2;
+
+ for(Int_t iCradle=0; iCradle<nCradles; iCradle++){
+ volpath = physCradlePath;
+ volpath += iCradle;
+ symname = symbCradleName;
+ symname += iCradle;
+ gGeoManager->SetAlignableEntry(symname.Data(),volpath.Data());
+ }
+
+ // Alignable wheels
+ // Volume path /ALIC_1/PWHE_<i> => symbolic name /PHOS/Wheel<i>, i=0,1,2,3
+
+ TString physWheelPath="/ALIC_1/PWHE_";
+ TString symbWheelName="PHOS/Wheel";
+ Int_t nWheels = 4;
+
+ for(Int_t iWheel=0; iWheel<nWheels; iWheel++){
+ volpath = physWheelPath;
+ volpath += iWheel;
+ symname = symbWheelName;
+ symname += iWheel;
+ gGeoManager->SetAlignableEntry(symname.Data(),volpath.Data());
+ }
+
+ //Physical strip path is a combination of: physModulePath + module number +
+ //physStripPath + strip number == ALIC_1/PHOS_N/..../PSTR_M
+ const Int_t nStripsX = GetGeometry()->GetEMCAGeometry()->GetNStripX();
+ const Int_t nStripsZ = GetGeometry()->GetEMCAGeometry()->GetNStripZ();
+ TString partialPhysStripName(100);
+ TString fullPhysStripName(100);
+ TString partialSymbStripName(100);
+ TString fullSymbStripName(100);
+
+ for(Int_t module = 1; module <= nModules; ++module){
+ partialPhysStripName = physModulePath;
+ partialPhysStripName += module;
+ partialPhysStripName += "/PEMC_1/PCOL_1/PTIO_1/PCOR_1/PAGA_1/PTII_1/PSTR_";
+
+ partialSymbStripName = symbModuleName;
+ partialSymbStripName += module;
+ partialSymbStripName += "/Strip_";
+
+ for(Int_t i = 0, ind1D = 1; i < nStripsX; ++i){//ind1D starts from 1 (PSTR_1...PSTR_224...)
+ for(Int_t j = 0; j < nStripsZ; ++j, ++ind1D){
+ fullPhysStripName = partialPhysStripName;
+ fullPhysStripName += ind1D;
+
+ fullSymbStripName = partialSymbStripName;
+ fullSymbStripName += i;//ind1D;
+ fullSymbStripName += '_';
+ fullSymbStripName += j;
+
+ gGeoManager->SetAlignableEntry(fullSymbStripName.Data(), fullPhysStripName.Data());
+ }
+ }
+ }
+}
+