ATLAS Offline Software
TRT_OverlapDescriptor.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 // TRT_OverlapDescriptor.cxx, (c) ATLAS Detector software
8 
9 // InDet
12 // Trk
13 #include "TrkSurfaces/Surface.h"
15 
17 bool
19  std::vector<Trk::SurfaceIntersection>& cSurfaces,
20  const Trk::Surface& tsf,
21  const Amg::Vector3D& position,
22  const Amg::Vector3D& momentum) const
23 
24 {
25  const Amg::Vector3D dir = momentum.unit();
26  // first add the target surface - if it fits
27  int nextInt = checkAndFill(cSurfaces, tsf, position, dir);
28  if (!nextInt)
29  return true;
30 
31  // make sure we have the correct associated element
32  const auto* tmp = tsf.associatedDetectorElement();
33  const InDetDD::TRT_BaseElement* trtBaseElement =
34  tmp->detectorType() == Trk::DetectorElemType::TRT
35  ? static_cast<const InDetDD::TRT_BaseElement*>(tmp)
36  : nullptr;
37 
38  // we have a trt base element
39  if (trtBaseElement) {
40 
42 
43  // straw Max
44  int strawMax = trtBaseElement->nStraws() - 1;
45  int strawInt = m_trtIdHelper->straw(strawID);
46 
47  if (strawInt != 0 && strawInt < strawMax && strawMax != -999) {
48  // get the next straw
49  Identifier nextID =
50  m_trtIdHelper->straw_id(trtBaseElement->identify(), strawInt + nextInt);
51  const Trk::Surface* nextStraw = (strawInt > 1 && strawInt < strawMax)
52  ? (&(trtBaseElement->surface(nextID)))
53  : nullptr;
54  if (nextStraw)
55  nextInt = checkAndFill(cSurfaces, *nextStraw, position, dir);
56  }
57  }
58 
59  return true;
60 }
61 
62 int
64  std::vector<Trk::SurfaceIntersection>& cSurfaces,
65  const Trk::Surface& sf,
66  const Amg::Vector3D& pos,
67  const Amg::Vector3D& dir) const
68 {
69  Trk::Intersection sfIntersection =
70  sf.straightLineIntersection(pos, dir, false, false);
71  // we have a valid intersection - is it within tolerance ?
72  if (sfIntersection.valid) {
73  // this is the boundary cylinder of the straw surface
74  double rSurface2 = sf.bounds().r() * sf.bounds().r();
75  // what's the distance - hess' normal form
76  const Amg::Vector3D& sCenter = sf.center();
77  const Amg::Vector3D sDirection = sf.transform().rotation().col(2);
78  // d^2 = | (dir) x
79  double d2 =
80  (sDirection.cross((sfIntersection.position - sCenter))).squaredNorm();
81  // check it
82  bool acceptSurface =
83  d2 < (m_outsideTolerance * m_outsideTolerance * rSurface2);
84  if (acceptSurface)
85  cSurfaces.emplace_back(sfIntersection, &sf);
86  // give the break signal if it's really inside
87  return (d2 < (m_breakTolerance * m_breakTolerance * rSurface2)
88  ? 0
89  : (sfIntersection.position.phi() > sf.center().phi() ? 1 : -1));
90  }
91  // base the decision on the position phi value
92  return (pos.phi() > sf.center().phi() ? 1 : -1);
93 }
InDet::TRT_OverlapDescriptor::reachableSurfaces
bool reachableSurfaces(std::vector< Trk::SurfaceIntersection > &cSurfaces, const Trk::Surface &sf, const Amg::Vector3D &pos, const Amg::Vector3D &dir) const
get the compatible surfaces
Definition: TRT_OverlapDescriptor.cxx:18
Trk::Intersection
Definition: Intersection.h:24
Trk::Surface::associatedDetectorElement
const TrkDetElementBase * associatedDetectorElement() const
return associated Detector Element
Surface.h
Trk::DetectorElemType::TRT
@ TRT
InDetDD::TRT_BaseElement::nStraws
unsigned int nStraws() const
Number of straws in the element.
Trk::Surface::associatedDetectorElementIdentifier
Identifier associatedDetectorElementIdentifier() const
return Identifier of the associated Detector Element
InDet::TRT_OverlapDescriptor::m_trtIdHelper
const TRT_ID * m_trtIdHelper
the Id helper
Definition: TRT_OverlapDescriptor.h:69
SurfaceBounds.h
TRT_ID::straw
int straw(const Identifier &id) const
Definition: TRT_ID.h:902
ParticleGun_EoverP_Config.momentum
momentum
Definition: ParticleGun_EoverP_Config.py:63
Identifier
Definition: DetectorDescription/Identifier/Identifier/Identifier.h:32
TRT_OverlapDescriptor.h
InDetDD::TRT_BaseElement::identify
virtual Identifier identify() const override final
identifier of this detector element:
DeMoUpdate.tmp
string tmp
Definition: DeMoUpdate.py:1167
Trk::Intersection::position
Amg::Vector3D position
Definition: Intersection.h:25
beamspotman.dir
string dir
Definition: beamspotman.py:623
TRT_BaseElement.h
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
Trk::Intersection::valid
bool valid
Definition: Intersection.h:28
python.LumiBlobConversion.pos
pos
Definition: LumiBlobConversion.py:18
mapkey::sf
@ sf
Definition: TElectronEfficiencyCorrectionTool.cxx:38
dq_defect_virtual_defect_validation.d2
d2
Definition: dq_defect_virtual_defect_validation.py:81
InDet::TRT_OverlapDescriptor::m_breakTolerance
double m_breakTolerance
if the straight line intersection is within this fraction of the bounds - don't look for neighbours
Definition: TRT_OverlapDescriptor.h:70
Trk::Surface
Definition: Tracking/TrkDetDescr/TrkSurfaces/TrkSurfaces/Surface.h:75
InDetDD::TRT_BaseElement::surface
virtual const Trk::Surface & surface() const override final
Element Surface: access to the Surface (straw layer)
InDet::TRT_OverlapDescriptor::m_outsideTolerance
double m_outsideTolerance
accept even if it outside the bounds by this tolerance
Definition: TRT_OverlapDescriptor.h:71
InDet::TRT_OverlapDescriptor::checkAndFill
int checkAndFill(std::vector< Trk::SurfaceIntersection > &cSurfaces, const Trk::Surface &sf, const Amg::Vector3D &pos, const Amg::Vector3D &dir) const
Definition: TRT_OverlapDescriptor.cxx:63
InDetDD::TRT_BaseElement
Definition: TRT_BaseElement.h:57
TRT_ID::straw_id
Identifier straw_id(int barrel_ec, int phi_module, int layer_or_wheel, int straw_layer, int straw) const
Three ways of getting id for a single straw:
Definition: TRT_ID.h:581