Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
StripClusteringTool.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 #include "StripClusteringTool.h"
6 
7 
8 #include <Acts/Clusterization/Clusterization.hpp>
9 
13 #include <TrkSurfaces/Surface.h>
14 
15 #include <algorithm>
16 #include <stdexcept>
17 
18 
19 namespace ActsTrk {
20 constexpr double ONE_TWELFTH = 1./12.;
21 
22 // Required by ACTS clusterization
23 static
24 int getCellColumn(const StripClusteringTool::Cell& cell)
25 {
26  return cell.index;
27 }
28 
29 // Required by ACTS clusterization
30 static
31 int& getCellLabel(StripClusteringTool::Cell& cell)
32 {
33  return cell.label;
34 }
35 
36 // Required by ACTS clusterization
37 static
38 void clusterAddCell(StripClusteringTool::Cluster& cl, const StripClusteringTool::Cell& cell)
39 {
40  cl.ids.push_back(cell.id);
41  if (cl.ids.size() < (sizeof(cl.hitsInThirdTimeBin) * 8)) {
42  cl.hitsInThirdTimeBin |= cell.timeBits.test(0) << cl.ids.size();
43  }
44 }
45 
47  const std::string& type, const std::string& name, const IInterface* parent)
48  : base_class(type,name,parent)
49 {
50 }
51 
53 {
54  ATH_MSG_DEBUG("Initializing " << name() << "...");
55 
56  ATH_CHECK(m_conditionsTool.retrieve(DisableTool{!m_stripDetElStatus.empty()} ));
57  ATH_CHECK(m_lorentzAngleTool.retrieve());
59 
62 
63  return StatusCode::SUCCESS;
64 }
65 
67 {
68  for (size_t i = 0; i < m_timeBinStr.size(); i++) {
69  if (i >= 3) {
70  ATH_MSG_WARNING("Time bin string has excess characters");
71  break;
72  }
73  switch (std::toupper(m_timeBinStr[i])) {
74  case 'X': m_timeBinBits[i] = -1; break;
75  case '0': m_timeBinBits[i] = 0; break;
76  case '1': m_timeBinBits[i] = 1; break;
77  default:
78  ATH_MSG_FATAL("Invalid time bin string: " << m_timeBinStr);
79  return StatusCode::FAILURE;
80  }
81  }
82  return StatusCode::SUCCESS;
83 }
84 
86 StripClusteringTool::getStripDetElStatus(const EventContext& ctx) const
87 {
88  if (m_stripDetElStatus.empty()) {
89  return nullptr;
90  }
91 
93  if (!status.isValid()) {
94  std::stringstream msg;
95  msg << "Failed to get " << m_stripDetElStatus.key() << " from StoreGate in " << name();
96  throw std::runtime_error(msg.str());
97  }
98 
99  return status.cptr();
100 }
101 
103 StripClusteringTool::clusterize(const RawDataCollection& RDOs,
104  const IDHelper& stripID,
105  const EventContext& ctx,
106  ClusterContainer& container) const
107 {
108  IdentifierHash idHash = RDOs.identifyHash();
109 
110  const InDet::SiDetectorElementStatus *stripDetElStatus = getStripDetElStatus(ctx);
111 
112  bool goodModule = true;
113  if (m_checkBadModules.value()) {
114  if (stripDetElStatus != nullptr) {
115  goodModule = stripDetElStatus->isGood(idHash);
116  } else {
117  goodModule = m_conditionsTool->isGood(idHash, ctx);
118  }
119  }
120 
123  stripDetElStatus->isGood(idHash), m_conditionsTool->isGood(idHash));
124 
125  if (!goodModule) {
126  ATH_MSG_DEBUG("Strip module failed status check");
127  return StatusCode::SUCCESS;
128  }
129 
130  // If more than a certain number of RDOs set module to bad
131  // in this case we skip clusterization
132  if (m_maxFiredStrips != 0u) {
133  unsigned int nFiredStrips = 0u;
134  for (const SCT_RDORawData* rdo : RDOs) {
135  nFiredStrips += rdo->getGroupSize();
136  }
137  if (nFiredStrips > m_maxFiredStrips)
138  return StatusCode::SUCCESS;
139  }
140 
142  ATH_CHECK( stripDetEleHandle.isValid() );
143  const InDetDD::SiDetectorElementCollection* stripDetEle(*stripDetEleHandle);
144  if (stripDetEle == nullptr) {
145  ATH_MSG_FATAL("Invalid SiDetectorElementCollection");
146  return StatusCode::FAILURE;
147  }
148 
149  const InDetDD::SiDetectorElement* element =
150  stripDetEle->getDetectorElement(idHash);
151 
152  const InDetDD::SiDetectorDesign& design = element->design();
153  // get the pitch, this will be the local covariance for the cluster
154  float pitch = element->isBarrel()
155  ? design.phiPitch()
156  : dynamic_cast<const InDetDD::StripStereoAnnulusDesign&>(element->design()).phiPitchPhi();
157  Eigen::Matrix<float,1,1> localCov(pitch * pitch * ONE_TWELFTH);
158 
159 
160  std::optional<std::pair<CellCollection,bool>> unpckd
161  = unpackRDOs(RDOs, stripID, stripDetElStatus, ctx);
162  if (not unpckd.has_value()) {
163  ATH_MSG_FATAL("Error encountered while unpacking strip RDOs!");
164  return StatusCode::FAILURE;
165  }
166 
167  auto& [cells, badStripOnModule] = *unpckd;
168 
170  Acts::Ccl::createClusters<CellCollection, ClusterCollection, 1>(cells);
171 
172 
173  std::size_t previousSizeContainer = container.size();
174  // Fast insertion trick
175  std::vector<xAOD::StripCluster*> toAddCollection;
176  toAddCollection.reserve(clusters.size());
177  for (std::size_t i(0); i<clusters.size(); ++i)
178  toAddCollection.push_back(new xAOD::StripCluster());
179  container.insert(container.end(), toAddCollection.begin(), toAddCollection.end());
180 
181  double lorentzShift
182  = m_lorentzAngleTool->getLorentzShift(idHash, ctx);
183 
184  for (std::size_t i(0); i<clusters.size(); ++i) {
185  Cluster& cl = clusters[i];
186  // Bad strips on a module invalidates the hitsInThirdTimeBin word.
187  // Therefore set it to 0 if that's the case.
188  // We are currently not using this, but keeping it here should we need it in the future
189  // if (badStripOnModule) {
190  // cl.hitsInThirdTimeBin = 0;
191  // }
192 
193  try {
195  lorentzShift,
196  localCov,
197  stripID,
198  element,
199  design,
200  *container[previousSizeContainer+i]));
201  } catch (const std::exception& e) {
202  ATH_MSG_FATAL("Exception thrown while creating xAOD::StripCluster:"
203  << e.what());
204  ATH_MSG_FATAL("Detector Element identifier: " << element->identify());
205  ATH_MSG_FATAL("Strip Identifiers in cluster:");
206  for (const Identifier& id : cl.ids)
207  ATH_MSG_FATAL(" " << id);
208  return StatusCode::FAILURE;
209  }
210  }
211 
212  return StatusCode::SUCCESS;
213 }
214 
215 
216 static
217 std::pair<
218  Eigen::Matrix<float,1,1>,
219  Eigen::Matrix<float,3,1>>
220 computePosition(const StripClusteringTool::Cluster& cluster,
221  double lorentzShift,
222  const IStripClusteringTool::IDHelper& stripID,
223  const InDetDD::SiDetectorElement* element,
224  const InDetDD::SiDetectorDesign& design)
225 {
226  std::size_t size = cluster.ids.size();
227  InDetDD::SiCellId frontId = stripID.strip(cluster.ids.front());
229  if (size > 1) {
230  InDetDD::SiCellId backId = stripID.strip(cluster.ids.back());
231  InDetDD::SiLocalPosition backPos =
232  design.localPositionOfCell(backId);
233  pos = 0.5 * (pos + backPos);
234  }
235 
236  // update the xPhi position
237  pos.xPhi( pos.xPhi() + lorentzShift );
238 
239  if (!element->isBarrel()) {
240  const InDetDD::StripStereoAnnulusDesign& annulusDesign =
241  dynamic_cast<const InDetDD::StripStereoAnnulusDesign&>
242  (design);
243  pos = annulusDesign.localPositionOfCellPC(element->cellIdOfPosition(pos));
244  }
245 
246  return std::make_pair(Eigen::Matrix<float,1,1>(pos.xPhi()),
247  Eigen::Matrix<float,3,1>(element->surface().localToGlobal(pos).cast<float>()));
248 }
249 
250 
251 // N.B. the cluster is added to the container
254  double lorentzShift,
255  Eigen::Matrix<float,1,1>& localCov,
256  const StripID& stripID,
257  const InDetDD::SiDetectorElement* element,
258  const InDetDD::SiDetectorDesign& design,
259  xAOD::StripCluster& cl) const
260 {
261  auto [localPos, globalPos]
262  = computePosition(cluster, lorentzShift, stripID, element, design);
263 
264  // For Strip Clusters the identifier is taken from the front rod list object
265  // This is the same strategy used in Athena:
266  // Since clusterId is arbitary (it only needs to be unique) just use ID of first strip
267  // For strip Cluster it has been found that "identifierOfPosition" does not produces unique values
268  cl.setMeasurement<1>(element->identifyHash(), localPos, localCov);
269  cl.setIdentifier( cluster.ids.front().get_compact() );
270  cl.globalPosition() = globalPos;
271  cl.setRDOlist(cluster.ids);
272  cl.setChannelsInPhi(cluster.ids.size());
273 
274  return StatusCode::SUCCESS;
275 }
276 
277 
278 bool StripClusteringTool::passTiming(const std::bitset<3>& timePattern) const {
279  // Convert the given timebin to a bit set and test each bit
280  // if bit is -1 (i.e. X) it always passes, other wise require exact match of 0/1
281  // N.B bitset has opposite order to the bit pattern we define
282  if (m_timeBinBits[0] != -1 and timePattern.test(2) != static_cast<bool>(m_timeBinBits[0])) return false;
283  if (m_timeBinBits[1] != -1 and timePattern.test(1) != static_cast<bool>(m_timeBinBits[1])) return false;
284  if (m_timeBinBits[2] != -1 and timePattern.test(0) != static_cast<bool>(m_timeBinBits[2])) return false;
285  return true;
286 }
287 
288 
289 bool StripClusteringTool::isBadStrip(const EventContext& ctx,
290  const InDet::SiDetectorElementStatus *stripDetElStatus,
291  const StripID& stripID,
292  IdentifierHash waferHash,
293  Identifier stripId) const
294 {
295  if (stripDetElStatus) {
296  const int strip_i{stripID.strip(stripId)};
298  stripDetElStatus,
299  stripDetElStatus->isCellGood(waferHash.value(), strip_i),
300  m_conditionsTool->isGood(stripId, InDetConditions::SCT_STRIP));
301  return not stripDetElStatus->isCellGood(waferHash.value(), strip_i) ;
302  }
303  return not m_conditionsTool->isGood(stripId, InDetConditions::SCT_STRIP, ctx);
304 }
305 
306 
307 std::optional<std::pair<StripClusteringTool::CellCollection, bool>>
309  const StripID& stripID,
310  const InDet::SiDetectorElementStatus *stripDetElStatus,
311  const EventContext& ctx) const
312 {
314  // reserve memory. number evaluated on ttbar pu200
315  cells.reserve(60);
316  bool badStripOnModule{false};
317 
318  for (const StripRDORawData * raw : RDOs) {
319  const SCT3_RawData* raw3 = dynamic_cast<const SCT3_RawData*>(raw);
320  if (!raw3) {
321  ATH_MSG_ERROR("Casting into SCT3_RawData failed");
322  return {};
323  }
324 
325  std::bitset<3> timePattern(raw3->getTimeBin());
326  if (!passTiming(timePattern)) {
327  ATH_MSG_DEBUG("Strip failed timing check");
328  continue;
329  }
330 
331  Identifier firstStripId = raw->identify();
332  Identifier waferId = stripID.wafer_id(firstStripId);
333  IdentifierHash waferHash = stripID.wafer_hash(waferId);
334  size_t iFirstStrip = static_cast<size_t>(stripID.strip(firstStripId));
335  size_t iMaxStrip = std::min(
336  iFirstStrip + raw->getGroupSize(),
337  static_cast<size_t>(stripID.strip_max(waferId)) + 1
338  );
339 
340  for (size_t i = iFirstStrip; i < iMaxStrip; i++) {
341  Identifier stripIdent = stripID.strip_id(waferId, i);
342  if (isBadStrip(ctx, stripDetElStatus, stripID, waferHash, stripIdent)) {
343  // Bad strip, throw it out to minimize useless work.
344  ATH_MSG_DEBUG("Bad strip encountered:" << stripIdent
345  << ", wafer is: " << waferId);
346  badStripOnModule = true;
347  } else {
348  // Good strip!
349  cells.emplace_back(i, stripIdent, std::move(timePattern));
350  }
351  }
352  }
353  return std::make_pair(std::move(cells), badStripOnModule);
354 }
355 
356 } // namespace ActsTrk
AllowedVariables::e
e
Definition: AsgElectronSelectorTool.cxx:37
RunTileCalibRec.cells
cells
Definition: RunTileCalibRec.py:271
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
InDetDD::SolidStateDetectorElementBase::cellIdOfPosition
SiCellId cellIdOfPosition(const Amg::Vector2D &localPos) const
As in previous method but returns SiCellId.
Definition: SolidStateDetectorElementBase.cxx:224
ReadCellNoiseFromCool.cell
cell
Definition: ReadCellNoiseFromCool.py:53
ActsTrk::StripClusteringTool::isBadStrip
bool isBadStrip(const EventContext &ctx, const InDet::SiDetectorElementStatus *sctDetElStatus, const StripID &idHelper, IdentifierHash waferHash, Identifier stripId) const
Definition: StripClusteringTool.cxx:289
ActsTrk::StripClusteringTool::m_lorentzAngleTool
ToolHandle< ISiLorentzAngleTool > m_lorentzAngleTool
Definition: StripClusteringTool.h:93
InDetDD::SiDetectorElementCollection
Definition: SiDetectorElementCollection.h:30
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
Surface.h
IdentifierHash::value
unsigned int value() const
SCT_ModuleSideDesign.h
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
ActsTrk::StripClusteringTool::clusterize
virtual StatusCode clusterize(const InDetRawDataCollection< StripRDORawData > &RDOs, const StripID &stripID, const EventContext &ctx, xAOD::StripClusterContainer &container) const override
Definition: StripClusteringTool.cxx:103
min
constexpr double min()
Definition: ap_fixedTest.cxx:26
InDetDD::DetectorDesign::localPositionOfCell
virtual SiLocalPosition localPositionOfCell(const SiCellId &cellId) const =0
readout or diode id -> position.
StripClusteringTool.h
InDetDD::SolidStateDetectorElementBase::surface
Trk::Surface & surface()
Element Surface.
SG::ReadCondHandle::isValid
bool isValid()
Definition: ReadCondHandle.h:206
ActsTrk::StripClusteringTool::CellCollection
std::vector< Cell > CellCollection
Definition: StripClusteringTool.h:47
ActsTrk::StripClusteringTool::ClusterCollection
std::vector< Cluster > ClusterCollection
Definition: StripClusteringTool.h:48
SCT_RDORawData
Definition: SCT_RDORawData.h:24
ActsTrk::StripClusteringTool::unpackRDOs
std::optional< std::pair< std::vector< Cell >, bool > > unpackRDOs(const InDetRawDataCollection< StripRDORawData > &RDOs, const StripID &idHelper, const InDet::SiDetectorElementStatus *sctDetElStatus, const EventContext &ctx) const
Definition: StripClusteringTool.cxx:308
InDet::SiDetectorElementStatus::isCellGood
bool isCellGood(IdentifierHash hash, unsigned short cell_i) const
Definition: SiDetectorElementStatus.h:107
SG::VarHandleKey::key
const std::string & key() const
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:141
SG::VarHandleKey::empty
bool empty() const
Test if the key is blank.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:150
ActsTrk::StripClusteringTool::m_checkBadModules
Gaudi::Property< bool > m_checkBadModules
Definition: StripClusteringTool.h:104
Trk::u
@ u
Enums for curvilinear frames.
Definition: ParamDefs.h:77
python.CaloAddPedShiftConfig.type
type
Definition: CaloAddPedShiftConfig.py:42
InDetDD::SolidStateDetectorElementBase::identifyHash
virtual IdentifierHash identifyHash() const override final
identifier hash (inline)
InDetDD::SiLocalPosition
Definition: SiLocalPosition.h:31
SG::makeHandle
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
Definition: ReadCondHandle.h:270
ActsTrk::StripClusteringTool::m_timeBinBits
int m_timeBinBits[3]
Definition: StripClusteringTool.h:113
ActsTrk::StripClusteringTool::Cluster
Definition: StripClusteringTool.h:42
python.setupRTTAlg.size
int size
Definition: setupRTTAlg.py:39
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
SCT3_RawData.h
VALIDATE_STATUS_ARRAY
#define VALIDATE_STATUS_ARRAY(use_info, info_val, summary_val)
Definition: SiDetectorElementStatus.h:51
lumiFormat.i
int i
Definition: lumiFormat.py:85
InDet::SiDetectorElementStatus
Definition: SiDetectorElementStatus.h:62
SCT3_RawData
Definition: SCT3_RawData.h:24
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
InDetDD::StripStereoAnnulusDesign
Definition: StripStereoAnnulusDesign.h:50
calibdata.exception
exception
Definition: calibdata.py:496
InDetRawDataCollection
Definition: InDetRawDataCollection.h:31
test_pyathena.parent
parent
Definition: test_pyathena.py:15
xAOD::StripCluster_v1
Definition: StripCluster_v1.h:17
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
SCT3_RawData::getTimeBin
int getTimeBin() const
Definition: SCT3_RawData.h:92
SCT_ID::wafer_hash
IdentifierHash wafer_hash(const Identifier &wafer_id) const
wafer hash from id - optimized
Definition: SCT_ID.h:492
ActsTrk::StripClusteringTool::initialize
virtual StatusCode initialize() override
Definition: StripClusteringTool.cxx:52
SG::VarHandleKey::initialize
StatusCode initialize(bool used=true)
If this object is used as a property, then this should be called during the initialize phase.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:103
ActsTrk::StripClusteringTool::m_maxFiredStrips
Gaudi::Property< unsigned int > m_maxFiredStrips
Definition: StripClusteringTool.h:107
ActsTrk::StripClusteringTool::decodeTimeBins
StatusCode decodeTimeBins()
Definition: StripClusteringTool.cxx:66
ActsTrk::StripClusteringTool::Cell
Definition: StripClusteringTool.h:32
InDet::SiDetectorElementStatus::isGood
bool isGood(IdentifierHash hash) const
Definition: SiDetectorElementStatus.h:97
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:228
ActsTrk::StripClusteringTool::m_timeBinStr
StringProperty m_timeBinStr
Definition: StripClusteringTool.h:91
ActsTrk::StripClusteringTool::m_stripDetElStatus
SG::ReadHandleKey< InDet::SiDetectorElementStatus > m_stripDetElStatus
Definition: StripClusteringTool.h:98
InDetDD::SiDetectorElement
Definition: SiDetectorElement.h:109
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
InDetDD::SiDetectorElement::isBarrel
bool isBarrel() const
ActsTrk::StripClusteringTool::makeCluster
StatusCode makeCluster(const StripClusteringTool::Cluster &cluster, double LorentzShift, Eigen::Matrix< float, 1, 1 > &localCov, const StripID &stripID, const InDetDD::SiDetectorElement *element, const InDetDD::SiDetectorDesign &design, xAOD::StripCluster &container) const
Definition: StripClusteringTool.cxx:253
python.LumiBlobConversion.pos
pos
Definition: LumiBlobConversion.py:18
ActsTrk::StripClusteringTool::getStripDetElStatus
const InDet::SiDetectorElementStatus * getStripDetElStatus(const EventContext &ctx) const
Definition: StripClusteringTool.cxx:86
ActsTrk::StripClusteringTool::passTiming
bool passTiming(const std::bitset< 3 > &timePattern) const
Definition: StripClusteringTool.cxx:278
InDetDD::SiCellId
Definition: SiCellId.h:29
StripStereoAnnulusDesign.h
ActsTrk::StripClusteringTool::m_stripDetEleCollKey
SG::ReadCondHandleKey< InDetDD::SiDetectorElementCollection > m_stripDetEleCollKey
Definition: StripClusteringTool.h:110
SCT_ID
Definition: SCT_ID.h:68
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
SCT_ID::strip
int strip(const Identifier &id) const
Definition: SCT_ID.h:764
SCT_ID::strip_max
int strip_max(const Identifier &id) const
Definition: SCT_ID.cxx:196
RunTileMonitoring.clusters
clusters
Definition: RunTileMonitoring.py:133
ActsTrk::ONE_TWELFTH
constexpr double ONE_TWELFTH
Definition: StripClusteringTool.cxx:20
ActsTrk
The AlignStoreProviderAlg loads the rigid alignment corrections and pipes them through the readout ge...
Definition: MuonDetectorBuilderTool.cxx:55
merge.status
status
Definition: merge.py:17
SCT_ID::wafer_id
Identifier wafer_id(int barrel_ec, int layer_disk, int phi_module, int eta_module, int side) const
For a single side of module.
Definition: SCT_ID.h:464
IdentifierHash
This is a "hash" representation of an Identifier. This encodes a 32 bit index which can be used to lo...
Definition: IdentifierHash.h:25
InDetDD::SiDetectorDesign
Definition: SiDetectorDesign.h:50
InDetConditions::SCT_STRIP
@ SCT_STRIP
Definition: InDetHierarchy.h:14
ActsTrk::StripClusteringTool::m_conditionsTool
ToolHandle< IInDetConditionsTool > m_conditionsTool
Definition: StripClusteringTool.h:101
InDetDD::SiDetectorElement::design
virtual const SiDetectorDesign & design() const override final
access to the local description (inline):
InDetDD::StripStereoAnnulusDesign::localPositionOfCellPC
SiLocalPosition localPositionOfCellPC(const SiCellId &cellId) const
This is for debugging only.
Definition: StripStereoAnnulusDesign.cxx:428
dq_make_web_display.cl
cl
print [x.__class__ for x in toList(dqregion.getSubRegions()) ]
Definition: dq_make_web_display.py:26
InDetDD::DetectorDesign::phiPitch
virtual double phiPitch() const =0
Pitch in phi direction.
InDetDD::SiDetectorElementCollection::getDetectorElement
const SiDetectorElement * getDetectorElement(const IdentifierHash &hash) const
Definition: SiDetectorElementCollection.cxx:15
python.AutoConfigFlags.msg
msg
Definition: AutoConfigFlags.py:7
InDetDD::SolidStateDetectorElementBase::identify
virtual Identifier identify() const override final
identifier of this detector element (inline)
ActsTrk::StripClusteringTool::StripClusteringTool
StripClusteringTool(const std::string &type, const std::string &name, const IInterface *parent)
Definition: StripClusteringTool.cxx:46
Trk::Surface::localToGlobal
virtual void localToGlobal(const Amg::Vector2D &locp, const Amg::Vector3D &mom, Amg::Vector3D &glob) const =0
Specified by each surface type: LocalToGlobal method without dynamic memory allocation.
SCT_ID::strip_id
Identifier strip_id(int barrel_ec, int layer_disk, int phi_module, int eta_module, int side, int strip) const
For an individual strip.
Definition: SCT_ID.h:535
Identifier
Definition: IdentifierFieldParser.cxx:14