ATLAS Offline Software
Loading...
Searching...
No Matches
GeoSiHit.icc
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3*/
4
5#include "GeoPrimitives/CLHEPtoEigenConverter.h"
6#include "HGTD_Identifier/HGTD_ID.h"
7#include "HGTD_ReadoutGeometry/HGTD_DetectorManager.h"
8#include "InDetIdentifier/PixelID.h"
9#include "InDetIdentifier/SCT_ID.h"
10#include "InDetIdentifier/PLR_ID.h"
11#include "InDetReadoutGeometry/SiDetectorElement.h"
12#include "InDetSimEvent/SiHit.h"
13#include "PixelReadoutGeometry/PixelDetectorManager.h"
14#include "SCT_ReadoutGeometry/SCT_DetectorManager.h"
15
16
17inline GeoSiHit::GeoSiHit (const SiHit & h) {
18 m_hit = &h;
19}
20
21
22inline HepGeom::Point3D<double> GeoSiHit::getGlobalPosition() const {
23
24 int Barrel = m_hit->getBarrelEndcap();
25 if (Barrel== 1) Barrel = -2;
26 Identifier id;
27 const InDetDD::SolidStateDetectorElementBase *geoelement{};
28 if (m_hit->isPixel()) {
29 id = pixID()->wafer_id(Barrel,
30 m_hit->getLayerDisk(),
31 m_hit->getPhiModule(),
32 m_hit->getEtaModule());
33 geoelement = pixMgr()->getDetectorElement(id);
34 } else if (m_hit->isSCT()) {
35 id = sctID()->wafer_id(Barrel,
36 m_hit->getLayerDisk(),
37 m_hit->getPhiModule(),
38 m_hit->getEtaModule(),
39 m_hit->getSide() );
40 geoelement = sctMgr()->getDetectorElement(id);
41 } else if (m_hit->isPLR()) {
42 id = plrID()->wafer_id(Barrel,
43 m_hit->getLayerDisk(),
44 m_hit->getPhiModule(),
45 m_hit->getEtaModule());
46 geoelement = plrMgr()->getDetectorElement(id);
47 } else if (m_hit->isHGTD()) {
48 id = hgtdID()->wafer_id(Barrel,
49 m_hit->getLayerDisk(),
50 m_hit->getPhiModule(),
51 m_hit->getEtaModule());
52 geoelement = hgtdMgr()->getDetectorElement(id);
53 }
54
55 if (geoelement) {
56 if(m_hit->isHGTD()){
57 // This special treatment is necessary because the localStartPosition and localEndPosition
58 // of the SiHit in the HGTD SD class https://gitlab.cern.ch/atlas/athena/-/blob/master/HighGranularityTimingDetector/HGTD_G4/HGTD_G4_SD/src/HGTDSensorGmxSD.cxx#L83-L89
59 // are set with coordinates in the (y, z, x) order.
60 const HepGeom::Point3D<double> localHit = m_hit->localStartPosition();
61 HepGeom::Point3D<double> flippedHit;
62 flippedHit[0]=localHit.y();
63 flippedHit[1]=localHit.z();
64 flippedHit[2]=localHit.x();
65 const HepGeom::Point3D<double> globalStartPos = Amg::EigenTransformToCLHEP(geoelement->transformHit()) * (flippedHit);
66 double x=globalStartPos.x();
67 double y=globalStartPos.y();
68 double z=globalStartPos.z();
69 return HepGeom::Point3D<double>(x,y,z);
70 }else{
71 const HepGeom::Point3D<double> globalStartPos = Amg::EigenTransformToCLHEP(geoelement->transformHit()) * HepGeom::Point3D<double>(m_hit->localStartPosition());
72
73 double x=globalStartPos.x();
74 double y=globalStartPos.y();
75 double z=globalStartPos.z();
76 return HepGeom::Point3D<double>(x,y,z);
77 }
78 }
79
80 return HepGeom::Point3D<double>(0.0,0.0,0.0);
81}