Gmtod and Gdtom added.
[u/mrichter/AliRoot.git] / Flugg / FGeometryInit.cxx
index 6d44811bf3e42e7202ac501629b9a5013b4f14b9..1149069b36f5c5950b33c58b8eaee913ad72605a 100644 (file)
@@ -408,7 +408,7 @@ G4int FGeometryInit::GetMedium(int region) const
 }
 
 
-void  FGeometryInit::SetMediumFromName(const char* volName, int medium) 
+void  FGeometryInit::SetMediumFromName(const char* volName, int medium, int volid
  {
   char name4[5];
   char tmp[5];
@@ -432,7 +432,10 @@ void  FGeometryInit::SetMediumFromName(const char* volName, int medium)
            break;
        }
     }
-    if (! strncmp(name4, tmp, 4)) fMediumVolumeMap[ptrVol] = medium;
+    if (! strncmp(name4, tmp, 4)) {
+       fMediumVolumeMap[ptrVol] = medium;
+       fVolIdVolumeMap[ptrVol]  = volid;
+    }
   }
 }
 
@@ -790,3 +793,112 @@ void FGeometryInit::PrintMagneticField(G4std::ostream& os) {
   G4cout << "<== Flugg FGeometryInit::PrintMagneticField()" << G4endl;
 #endif
 }
+
+int FGeometryInit::CurrentVolID(int ir, int& copyNo)
+{
+    G4PhysicalVolumeStore * pVolStore = G4PhysicalVolumeStore::GetInstance();
+    G4VPhysicalVolume * physicalvol = (*pVolStore)[ir- 1];
+    copyNo =  physicalvol->GetCopyNo();
+    int id = fVolIdVolumeMap[physicalvol];
+    return id;
+}
+
+int FGeometryInit::CurrentVolOffID(int ir, int off, int& copyNo)
+{
+    if (off == 0) return CurrentVolID(ir, copyNo);
+    
+    G4PhysicalVolumeStore* pVolStore = G4PhysicalVolumeStore::GetInstance();
+    G4VPhysicalVolume*     physicalvol = (*pVolStore)[ir- 1];
+    G4VPhysicalVolume*     mother = physicalvol; 
+
+    int level = off;
+    while (level > 0) { 
+       if (mother) mother = mother->GetMother();
+       level--;
+    }
+    
+    int id;
+    
+    if (!mother) {
+       G4cout << "Flugg FGeometryInit::CurrentVolOffID mother not found" << G4endl;
+       id = -1;
+       copyNo = -1;
+    } else {
+       copyNo =  mother ->GetCopyNo();
+       id =  fVolIdVolumeMap[mother];
+    }
+    return id;
+}
+
+void  FGeometryInit::Gmtod(double* xm, double* xd, int iflag)
+{
+// Transforms a position from the world reference frame
+// to the current volume reference frame.
+//
+//  Geant3 desription:
+//  ==================
+//       Computes coordinates XD (in DRS) 
+//       from known coordinates XM in MRS 
+//       The local reference system can be initialized by
+//         - the tracking routines and GMTOD used in GUSTEP
+//         - a call to GMEDIA(XM,NUMED)
+//         - a call to GLVOLU(NLEVEL,NAMES,NUMBER,IER) 
+//             (inverse routine is GDTOM) 
+//
+//        If IFLAG=1  convert coordinates 
+//           IFLAG=2  convert direction cosinus
+//
+// ---
+    FluggNavigator        * ptrNavig     = getNavigatorForTracking();
+    //setting variables (and dimension: Fluka uses cm.!)
+    G4ThreeVector pGlob(xm[0],xm[1],xm[2]);
+    pGlob *= 10.0; // in millimeters
+    G4ThreeVector pLoc;
+    
+    if (iflag == 1) {
+       pLoc = 
+           ptrNavig->ComputeLocalPoint(pGlob);
+    } else if (iflag == 2) {
+       pLoc = 
+           ptrNavig->ComputeLocalAxis(pGlob);  
+    } else {
+       G4cout << "Flugg FGeometryInit::Gmtod called with undefined flag" << G4endl;
+    }
+    
+    xd[0] = pLoc[0]; xd[1] = pLoc[1]; xd[2] = pLoc[2];
+}
+
+void  FGeometryInit::Gdtom(double* xd, double* xm, int iflag)
+{
+// Transforms a position from the current volume reference frame
+// to the world reference frame.
+//
+//  Geant3 desription:
+//  ==================
+//  Computes coordinates XM (Master Reference System
+//  knowing the coordinates XD (Detector Ref System)
+//  The local reference system can be initialized by
+//    - the tracking routines and GDTOM used in GUSTEP
+//    - a call to GSCMED(NLEVEL,NAMES,NUMBER)
+//        (inverse routine is GMTOD)
+// 
+//   If IFLAG=1  convert coordinates
+//      IFLAG=2  convert direction cosinus
+//
+// ---
+
+    FluggNavigator        * ptrNavig     = getNavigatorForTracking();
+    G4ThreeVector pLoc(xd[0],xd[1],xd[2]);
+    G4ThreeVector pGlob;
+     if (iflag == 1) {
+        pGlob = ptrNavig->GetLocalToGlobalTransform().
+            TransformPoint(pLoc);
+     } else if (iflag == 2) {
+        pGlob = ptrNavig->GetLocalToGlobalTransform().
+            TransformAxis(pLoc);
+     } else {
+        G4cout << "Flugg FGeometryInit::Gdtom called with undefined flag" << G4endl;
+     }
+     
+     xm[0] = pGlob[0]; xm[1] = pGlob[1]; xm[2] = pGlob[2];
+}