diff --git a/DDCore/include/DD4hep/VolumeManager.h b/DDCore/include/DD4hep/VolumeManager.h index 532a42393cafd2ad081eb2f9c61c3cf16f8aea5b..c98a787e7f985d489b9c81e4e115735865699cc6 100644 --- a/DDCore/include/DD4hep/VolumeManager.h +++ b/DDCore/include/DD4hep/VolumeManager.h @@ -84,6 +84,20 @@ namespace dd4hep { Position localToWorld(const double local[3]) const; /// Transform local coordinates to the world coordinates Position localToWorld(const Position& local) const; + + /// Transform world coordinates to the DetElement coordinates + Position worldToElement(const Position& world) const; + /// Transform world coordinates to the DetElement coordinates + Position worldToElement(const double world[3]) const; + /// Transform world coordinates to the DetElement coordinates + void worldToElement(const double world[3], double element[3]) const; + + /// Transform world coordinates to the local coordinates + Position worldToLocal(const Position& world) const; + /// Transform world coordinates to the local coordinates + Position worldToLocal(const double world[3]) const; + /// Transform world coordinates to the local coordinates + void worldToLocal(const double world[3], double local[3]) const; }; /// Class to support the retrieval of detector elements and volumes given a valid identifier diff --git a/DDCore/src/VolumeManager.cpp b/DDCore/src/VolumeManager.cpp index 25744142cac4c44fada7f650d67ea1c53e48e919..b6dba694eb82b3decb20556436071502fe413a16 100644 --- a/DDCore/src/VolumeManager.cpp +++ b/DDCore/src/VolumeManager.cpp @@ -355,6 +355,43 @@ Position VolumeManagerContext::localToWorld(const Position& local) const { return localToWorld(l); } +/// Transform world coordinates to the DetElement coordinates +Position VolumeManagerContext::worldToElement(const double world[3]) const { + return element.nominal().worldToLocal(world); +} + +/// Transform world coordinates to the DetElement coordinates +Position VolumeManagerContext::worldToElement(const Position& world) const { + return element.nominal().worldToLocal(world); +} + +/// Transform world coordinates to the DetElement coordinates +void VolumeManagerContext::worldToElement(const double world[3], double elt[3]) const { + element.nominal().worldToLocal(world, elt); +} + +/// Transform world coordinates to the local coordinates +Position VolumeManagerContext::worldToLocal(const double world[3]) const { + double elt[3], local[3]; + worldToElement(world, elt); + toElement().MasterToLocal(elt, local); + return { local[0], local[1], local[2] }; +} + +/// Transform world coordinates to the local coordinates +Position VolumeManagerContext::worldToLocal(const Position& world) const { + double global[3]; + world.GetCoordinates(global); + return worldToLocal(global); +} + +/// Transform world coordinates to the DetElement coordinates +void VolumeManagerContext::worldToLocal(const double world[3], double local[3]) const { + double elt[3]; + worldToElement(world, elt); + toElement().MasterToLocal(elt, local); +} + /// Initializing constructor to create a new object VolumeManager::VolumeManager(const Detector& description, const string& nam, DetElement elt, Readout ro, int flags) { printout(INFO, "VolumeManager", " - populating volume ids - be patient ..." );