ATLAS Offline Software
StripSpacePointFormationTool.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 */
4 
13 
14 namespace ActsTrk {
15 
17  const std::string& name,
18  const IInterface* parent)
19  : base_class(type, name, parent)
20  {}
21 
23 
24  ATH_CHECK(detStore()->retrieve(m_stripId,"SCT_ID"));
25 
26  ATH_CHECK(m_lorentzAngleTool.retrieve());
27 
29  ATH_MSG_INFO("Use SCT SP overlap cuts based on layer number parity");
30 
31  return StatusCode::SUCCESS;
32  }
33 
35  const xAOD::StripClusterContainer& clusterContainer,
38  const Amg::Vector3D& beamSpotVertex,
39  std::vector<StripSP>& spacePoints,
40  std::vector<StripSP>& overlapSpacePoints,
41  bool processOverlaps,
42  const std::vector<IdentifierHash>& hashesToProcess,
44  {
49 
83 
86 
87  const auto hashesProc = (hashesToProcess.size() > 0 ? hashesToProcess : stripAccessor.allIdentifiers());
88  for (auto& idHash : hashesProc) {
89  const InDetDD::SiDetectorElement* thisElement = elements.getDetectorElement(idHash);
90  if ( not thisElement->isStereo() ) {
91  // Retrieve the neighbours of the detector element
92  const std::vector<IdentifierHash>* others(properties.neighbours(idHash));
93  if (others==nullptr || others->empty() )
94  continue;
95 
96  // This flag is use to trigger if the search should be performed.
97  // In case there are no clusters on the neighbours of the selected
98  // detector element, the flag stays false.
99  bool search=false;
100  size_t neighbour = 0;
101  while (not search and neighbour<others->size() ) {
102  search = stripAccessor.isIdentifierPresent(others->at(neighbour));
103  neighbour++;
104  }
105  if (not search)
106  continue;
107 
108  // prepare clusters, indices and modules for space point formation
109  std::array<std::vector<std::pair<const xAOD::StripCluster*, size_t>>, nNeighbours> neighbourClusters{};
110  std::array<const InDetDD::SiDetectorElement*, nNeighbours> neighbourElements{};
111 
112  auto groupStart = clusterContainer.begin();
113  // Get the detector element and range for the idHash
114  neighbourElements[0] = thisElement;
115  for (auto& this_range : stripAccessor.rangesForIdentifierDirect(idHash)) {
116  for (auto start=this_range.first; start!=this_range.second; start++) {
117  size_t position = std::distance(groupStart, start);
118  neighbourClusters[0].push_back(std::make_pair(*start, position));
119  }
120  }
121 
122  Identifier thisId = thisElement->identify();
123 
124  // define overlap extends before building space points
125  std::array<double, 14> overlapExtents{};
126  // Default case: you test the opposite element and the overlapping in phi (total 3 elements)
127  int Nmax = 4;
128 
129  // In the barrel, test the eta overlaps as well (total 5 elements)
130  if (m_stripId->is_barrel(thisId))
131  Nmax = 6;
132 
133  // You can remove all the overlaps if requested.
134  // Here you test only the opposite element
135  if(not processOverlaps) Nmax = 2;
136 
137  float hwidth(properties.halfWidth(idHash));
138  int n = 0;
139 
140 
141  // The order of the elements in others is such that you first get the opposite element,
142  // the overlapping in phi and then the overlapping in eta
143  // For this reason you need to re-order the indices, since the SiSpacePointMakerTool will process
144  // first the eta overlaps and then the phi ones
145  const std::array<size_t, nNeighbours> neigbourIndices{ThisOne, Opposite, EtaMinus, EtaPlus, PhiMinus, PhiPlus};
146 
147  for (const auto& otherHash : *others) {
148 
149  if(++n==Nmax) break;
150 
151  if(not stripAccessor.isIdentifierPresent(otherHash))
152  continue;
153 
154  const InDetDD::SiDetectorElement* otherElement = elements.getDetectorElement(otherHash);
155 
156  neighbourElements[neigbourIndices[n]] = otherElement;
157  for (auto& this_range : stripAccessor.rangesForIdentifierDirect(otherHash)) {
158  for (auto start=this_range.first; start!=this_range.second; start++) {
159  size_t position = std::distance(groupStart, start);
160  neighbourClusters[neigbourIndices[n]].push_back(std::make_pair(*start, position));
161  }
162  }
163 
164  switch (n) {
165  case Opposite: {
166  overlapExtents[ 0] = -m_overlapLimitOpposite;
167  overlapExtents[ 1] = m_overlapLimitOpposite;
168  break;
169  }
170  case PhiMinus: {
171  overlapExtents[ 6] =-hwidth;
172  overlapExtents[ 7] =-hwidth+m_overlapLimitPhi;
173  overlapExtents[ 8] = hwidth-m_overlapLimitPhi;
174  overlapExtents[ 9] = hwidth;
175  break;
176  }
177  case PhiPlus: {
178  overlapExtents[10] = hwidth-m_overlapLimitPhi;
179  overlapExtents[11] = hwidth;
180  overlapExtents[12] =-hwidth;
181  overlapExtents[13] =-hwidth+m_overlapLimitPhi;
182  break;
183  }
184  case EtaMinus: {
185  overlapExtents[ 2] = m_overlapLimitEtaMin;
186  overlapExtents[ 3] = m_overlapLimitEtaMax;
187  if (m_useSCTLayerDep_OverlapCuts && (m_stripId->layer_disk(thisId) & 1) != 0) {
188  overlapExtents[ 2] =-m_overlapLimitEtaMax;
189  overlapExtents[ 3] =-m_overlapLimitEtaMin;
190  }
191  break;
192  }
193  default: {
194  overlapExtents[ 4] = m_overlapLimitEtaMin;
195  overlapExtents[ 5] = m_overlapLimitEtaMax;
196  if (m_useSCTLayerDep_OverlapCuts && (m_stripId->layer_disk(thisId) & 1) == 0) {
197  overlapExtents[ 4] = -m_overlapLimitEtaMax;
198  overlapExtents[ 5] = -m_overlapLimitEtaMin;
199  }
200  break;
201  }
202  }
203  }
204 
205  // producing and filling space points
206  ATH_CHECK( fillStripSpacePoints(neighbourElements, neighbourClusters, overlapExtents, beamSpotVertex,
207  spacePoints, overlapSpacePoints) );
208  }
209  }
210  return StatusCode::SUCCESS;
211  }
212 
213  StatusCode
215  const std::array<const InDetDD::SiDetectorElement*, nNeighbours>& elements,
216  const std::array<std::vector<std::pair<const xAOD::StripCluster*, size_t>>, nNeighbours>& clusters,
217  const std::array<double, 14>& overlapExtents,
218  const Amg::Vector3D& beamSpotVertex,
219  std::vector<StripSP>& spacePoints,
220  std::vector<StripSP>& overlapSpacePoints ) const
221  {
222 
223  // This function is called once all the needed quantities are collected.
224  // It is used to build space points checking the compatibility of clusters on pairs of detector elements.
225  // Detector elements and cluster collections are elements and clusters, respectively.
226  // [0] is the trigger element
227  // [1] is the opposite element
228  // [2]-[3] are the elements tested for eta overlaps
229  // [4]-[5] are the elements tested for phi overlaps
230  //
231  // To build space points:
232  // - For the opposite element and the ones tested for eta overlaps, you have to check
233  // if clusters are compatible with the local position of the trigger cluster
234  // requiring that the distance between the two clusters in phi is withing a specified range.
235  // - overlapExtents[0], overlapExtents[1] are filled for the opposite element
236  // - overlapExtents[2], overlapExtents[3], overlapExtents[4], overlapExtents[5] are filled for the eta overlapping elements
237  // - For the elements tested for phi overlaps, you have to check
238  // if clusters are compatible with the local position of the trigger cluster.
239  // This needs that the trigger cluster is at the edge of the trigger module
240  // and that the other cluster is on the compatible edge of its module
241  // - overlapExtents[6], overlapExtents[7], overlapExtents[10], overlapExtents[11]
242  // overlapExtents[8], overlapExtents[9], overlapExtents[12], overlapExtents[13] are filled for the phi overlapping elements
243 
244  constexpr int otherSideIndex{1};
245  constexpr int maxEtaIndex{3};
246  std::array<int, nNeighbours-1> elementIndex{};
247  int nElements = 0;
248 
249  // For the nNeighbours sides, fill elementIndex with the indices of the existing elements.
250  // Same the number of elements in nElements to loop on the later on
251  for(int n=1; n!=nNeighbours; ++n) {
252  if(elements[n]) {
253  elementIndex[nElements++] = n;
254  }
255  }
256  // return if all detector elements are nullptr
257  if(!nElements) return StatusCode::SUCCESS;
258 
259  // trigger element and clusters
260  const InDetDD::SiDetectorElement* element = elements[0];
261  bool isEndcap = element->isEndcap();
262 
263  std::vector<StripInformationHelper> stripInfos;
264  stripInfos.reserve(clusters[0].size());
265 
266  // loop on all clusters on the trigger detector element and save the related information
267  for (auto& cluster_index : clusters[0]) {
268  size_t stripIndex = -1;
269  auto ends = getStripEnds(cluster_index.first, element, stripIndex);
270  const auto& localPos = cluster_index.first->localPosition<1>();
271  StripInformationHelper stripInfo(cluster_index.first->identifierHash(), ends.first, ends.second, beamSpotVertex, localPos(0, 0), cluster_index.second, stripIndex);
272  stripInfos.push_back( std::move(stripInfo) );
273  }
274 
275  double limit = 1. + m_stripLengthTolerance;
276  double slimit = 0.;
277 
278  if(not m_allClusters) {
279  // Start processing the opposite side and the eta overlapping elements
280  int n = 0;
281  for(; n < nElements; ++n) {
282  int currentIndex = elementIndex[n];
283  if(currentIndex > maxEtaIndex) break;
284 
285  // get the detector element and the IdentifierHash
286  const InDetDD::SiDetectorElement* currentElement = elements[currentIndex];
287 
288  // retrieve the range
289  double min = overlapExtents[currentIndex*2-2];
290  double max = overlapExtents[currentIndex*2-1];
291 
292  size_t minStrip, maxStrip = 0;
293 
294  if (m_stripGapParameter != 0.) {
295  updateRange(element, currentElement, slimit, min, max);
297  }
298 
299  StripInformationHelper currentStripInfo;
300  for (auto& cluster_index : clusters[currentIndex]) {
301  bool processed = false;
302  const auto& currentLocalPos = cluster_index.first->localPosition<1>();
303 
304  for(auto& stripInfo : stripInfos) {
305  double diff = currentLocalPos(0, 0)-stripInfo.locX();
306  // In negative endcap, local z is opposite of positive endcap
307  // need to invert the difference for proper comparison
308  if( m_stripId->barrel_ec(currentElement->identify())<0 ) diff = -diff;
309 
310  if(diff < min || diff > max) continue;
311 
312  if (not processed) {
313  processed = true;
314  size_t currentStripIndex = 0;
315  auto ends = getStripEnds(cluster_index.first, currentElement, currentStripIndex);
316  currentStripInfo.set(cluster_index.first->identifierHash(), ends.first, ends.second, beamSpotVertex, currentLocalPos(0, 0), cluster_index.second, currentStripIndex);
317  }
318 
319  // depending on the index you are processing, you save the space point in the correct container
320  if (currentIndex==otherSideIndex) {
321  ATH_CHECK( makeStripSpacePoint(spacePoints, stripInfo, currentStripInfo, isEndcap, limit, slimit) );
322  } else {
323  ATH_CHECK( makeStripSpacePoint(overlapSpacePoints, stripInfo, currentStripInfo, isEndcap, limit, slimit) );
324  }
325  }
326  }
327  }
328  // process the phi overlapping elements
329  // if possible n starts from 4
330  for(; n < nElements; ++n) {
331  int currentIndex = elementIndex[n];
332  const InDetDD::SiDetectorElement* currentElement = elements[currentIndex];
333 
334  double min = overlapExtents[4*currentIndex-10];
335  double max = overlapExtents[4*currentIndex- 9];
336 
337  std::size_t minStrip = 0;
338  std::size_t maxStrip = 0;
339 
340  if (m_stripGapParameter != 0.) {
341  updateRange(element, currentElement, slimit, min, max);
343  }
344 
345  std::vector<StripInformationHelper*> stripPhiInfos;
346  stripPhiInfos.reserve(stripInfos.size());
347 
348  for(auto& stripInfo : stripInfos) {
349  auto stripIndex = stripInfo.stripIndex();
350  auto localPosition = stripInfo.locX();
351  auto centralValue = localPosition;
352  auto minValue = min;
353  auto maxValue = max;
354  if (isEndcap) {
355  centralValue = stripIndex;
356  minValue = minStrip;
357  maxValue = maxStrip;
358  }
359 
360  if (minValue <= centralValue and centralValue <= maxValue) {
361  stripPhiInfos.push_back(&stripInfo);
362  }
363  }
364  // continue if you have no cluster from the phi overlapping region of the trigger element
365  if(stripPhiInfos.empty()) continue;
366 
367  min = overlapExtents[4*currentIndex-8];
368  max = overlapExtents[4*currentIndex-7];
369 
370  if (m_stripGapParameter != 0.) {
371  updateRange(element, currentElement, slimit, min, max);
372  correctPolarRange(currentElement, min, max, minStrip, maxStrip);
373  }
374 
375  for (auto& cluster_index : clusters[currentIndex]) {
376  const auto& currentLocalPos = cluster_index.first->localPosition<1>();
377 
378  size_t currentStripIndex = 0;
379  auto ends = getStripEnds(cluster_index.first, currentElement, currentStripIndex);
380  StripInformationHelper currentStripInfo(cluster_index.first->identifierHash(), ends.first, ends.second, beamSpotVertex, currentLocalPos(0, 0), cluster_index.second, currentStripIndex);
381  auto centralValue = currentLocalPos(0, 0);
382  auto minValue = min;
383  auto maxValue = max;
384  if (isEndcap) {
385  centralValue = currentStripIndex;
386  minValue = minStrip;
387  maxValue = maxStrip;
388  }
389 
390  if (centralValue < minValue or centralValue > maxValue)
391  continue;
392 
393  for(auto& stripInfo : stripPhiInfos) {
394  ATH_CHECK( makeStripSpacePoint(overlapSpacePoints, *stripInfo, currentStripInfo, isEndcap, limit, slimit) );
395  }
396  }
397  }
398  return StatusCode::SUCCESS;
399  }
400 
401  for(int n=0; n!=nElements; ++n) {
402 
403  int currentIndex = elementIndex[n];
404  const InDetDD::SiDetectorElement* currentElement = elements[currentIndex];
405 
406  if (m_stripGapParameter != 0.) {
407  offset(element, currentElement, slimit);
408  }
409 
410  for (auto& cluster_index : clusters[currentIndex]) {
411  size_t currentStripIndex = 0;
412  auto ends = getStripEnds(cluster_index.first, element, currentStripIndex);
413  const auto& currentLocalPos = cluster_index.first->localPosition<1>();
414  StripInformationHelper currentStripInfo(cluster_index.first->identifierHash(), ends.first, ends.second, beamSpotVertex, currentLocalPos(0, 0), cluster_index.second, currentStripIndex);
415 
416  for(auto& stripInfo : stripInfos) {
417  // depending on the index you are processing, you save the space point in the correct container
418  if (currentIndex==otherSideIndex) {
419  ATH_CHECK( makeStripSpacePoint(spacePoints, stripInfo, currentStripInfo, isEndcap, limit, slimit) );
420  } else {
421  ATH_CHECK( makeStripSpacePoint(overlapSpacePoints, stripInfo, currentStripInfo, isEndcap, limit, slimit) );
422  }
423  }
424  }
425  }
426  return StatusCode::SUCCESS;
427  }
428 
430  std::vector<StripSP>& collection,
431  const StripInformationHelper& firstInfo,
432  const StripInformationHelper& secondInfo,
433  bool isEndcap,
434  double limit,
435  double slimit) const
436  {
437  double a =-firstInfo.trajDirection().dot(secondInfo.normal());
438  double b = firstInfo.stripDirection().dot(secondInfo.normal());
439  double l0 = firstInfo.oneOverStrip()*slimit+limit ;
440 
441  if(std::abs(a) > (std::abs(b)*l0)) {
442  return StatusCode::SUCCESS;
443  }
444 
445  double c =-secondInfo.trajDirection().dot(firstInfo.normal());
446  double d = secondInfo.stripDirection().dot(firstInfo.normal());
447  double l1 = secondInfo.oneOverStrip()*slimit+limit ;
448 
449  if(std::abs(c) > (std::abs(d)*l1)) {
450  return StatusCode::SUCCESS;
451  }
452 
453  double m = a/b;
454 
455  if(slimit!=0.) {
456  double n = c/d;
457  if (m > limit || n > limit) {
458  double cs = firstInfo.stripDirection().dot(secondInfo.stripDirection())*(firstInfo.oneOverStrip()*firstInfo.oneOverStrip());
459  double dm = (m-1);
460  double dmn = (n-1.)*cs;
461  if(dmn > dm) dm = dmn;
462  m-=dm; n-=(dm/cs);
463  if(std::abs(m) > limit || std::abs(n) > limit) {
464  return StatusCode::SUCCESS;
465  }
466  } else if (m < -limit || n < -limit) {
467  double cs = firstInfo.stripDirection().dot(secondInfo.stripDirection())*(firstInfo.oneOverStrip()*firstInfo.oneOverStrip());
468  double dm = -(1.+m);
469  double dmn = -(1.+n)*cs;
470  if(dmn > dm) dm = dmn;
471  m+=dm; n+=(dm/cs);
472  if(std::abs(m) > limit || std::abs(n) > limit) {
473  return StatusCode::SUCCESS;
474  }
475  }
476  }
477 
478  Eigen::Matrix<double, 3, 1> globalPosition(m_useTopSp ? secondInfo.position(m) : firstInfo.position(m));
479 
480  // evaluation of the local covariance
481  // Lines taken from SCT_SpacePoint::setupLocalCovarianceSCT()
482  float deltaY = 0.0004; // roughly pitch of SCT (80 mu) / sqrt(12)
483  float covTerm = 1600.*deltaY;
484 
485  Eigen::Matrix<float, 2, 1> variance(0.1, 8.*covTerm);
486  // Swap r/z covariance terms for endcap clusters
487  if ( isEndcap )
488  std::swap( variance(0, 0), variance(1, 0) );
489 
490  // evaluation of measurement details
491  float topHalfStripLength = 0.5*firstInfo.stripDirection().norm();
492  Eigen::Matrix<double, 3, 1> topStripDirection = -firstInfo.stripDirection()/(2.*topHalfStripLength);
493  Eigen::Matrix<double, 3, 1> topStripCenter = 0.5*firstInfo.trajDirection();
494 
495  float bottomHalfStripLength = 0.5*secondInfo.stripDirection().norm();
496  Eigen::Matrix<double, 3, 1> bottomStripDirection = -secondInfo.stripDirection()/(2.*bottomHalfStripLength);
497 
498  Eigen::Matrix<double, 3, 1> stripCenterDistance = firstInfo.stripCenter() - secondInfo.stripCenter();
499 
500  std::vector<std::size_t> measIndexes({firstInfo.clusterIndex(), secondInfo.clusterIndex()});
501 
502 
503  StripSP toAdd;
504  toAdd.idHashes = {firstInfo.idHash(), secondInfo.idHash()};
505  toAdd.globPos = globalPosition.cast<float>();
506  toAdd.cov_r = variance(0,0);
507  toAdd.cov_z = variance(1,0);
508  toAdd.measurementIndexes = measIndexes;
509  toAdd.topHalfStripLength = topHalfStripLength;
510  toAdd.bottomHalfStripLength = bottomHalfStripLength;
511  toAdd.topStripDirection = topStripDirection.cast<float>();
512  toAdd.bottomStripDirection = bottomStripDirection.cast<float>();
513  toAdd.stripCenterDistance = stripCenterDistance.cast<float>();
514  toAdd.topStripCenter = topStripCenter.cast<float>();
515 
516  collection.push_back(toAdd);
517 
518  return StatusCode::SUCCESS;
519  }
520 
522  const InDetDD::SiDetectorElement* element2,
523  double& stripLengthGapTolerance) const
524  {
525  const Amg::Transform3D& T1 = element1->transform();
526  const Amg::Transform3D& T2 = element2->transform();
527  Amg::Vector3D C = element1->center() ;
528  bool isAnnulus = (element1->design().shape() == InDetDD::Annulus);
529 
530  double x12 = T1(0,0)*T2(0,0)+T1(1,0)*T2(1,0)+T1(2,0)*T2(2,0);
531  double r = isAnnulus ? std::sqrt(C[0]*C[0]+C[1]*C[1]) : std::sqrt(T1(0,3)*T1(0,3)+T1(1,3)*T1(1,3));
532  double s = (T1(0,3)-T2(0,3))*T1(0,2)+(T1(1,3)-T2(1,3))*T1(1,2)+(T1(2,3)-T2(2,3))*T1(2,2);
533 
534  double dm = (m_stripGapParameter*r)*std::abs(s*x12);
535  double d = isAnnulus ? dm/.04 : dm/std::sqrt((1.-x12)*(1.+x12));
536 
537  if (std::abs(T1(2,2)) > 0.7) d*=(r/std::abs(T1(2,3)));
538 
539  stripLengthGapTolerance = d;
540 
541  return dm;
542  }
543 
545  const InDetDD::SiDetectorElement* element2,
546  double& stripLengthGapTolerance,
547  double& min, double& max) const
548  {
549  double dm = offset(element1, element2, stripLengthGapTolerance);
550  min -= dm;
551  max += dm;
552  }
553 
555  double& min,
556  double& max,
557  size_t& minStrip,
558  size_t& maxStrip) const
559  {
560  if (element->isBarrel())
561  return;
562 
563  // design for endcap modules
565  = dynamic_cast<const InDetDD::StripStereoAnnulusDesign *> (&element->design());
566  if ( design==nullptr ) {
567  ATH_MSG_FATAL( "Invalid strip annulus design for module with identifier/identifierHash " << element->identify() << "/" << element->identifyHash());
568  return;
569  }
570 
571  // converting min and max from cartesian reference frame to polar frame
572  auto firstPosition = (design->localPositionOfCell(design->strip1Dim(0, 0))+
573  design->localPositionOfCell(design->strip1Dim(design->diodesInRow(0)-1, 0)))*0.5;
574 
575  double radius = firstPosition.xEta();
576 
579 
580  if (not minCellId.isValid()) {
581  minCellId = InDetDD::SiCellId(0);
582  }
583 
584  if (not maxCellId.isValid()) {
585  maxCellId = InDetDD::SiCellId(design->diodesInRow(0)-1);
586  }
587 
588  minStrip = minCellId.strip();
589  maxStrip = maxCellId.strip();
590 
591  // re-evaluate min and max in polar coordinate
592  min = std::atan2(min, radius);
593  max = std::atan2(max, radius);
594  }
595 
596  std::pair<Amg::Vector3D, Amg::Vector3D >
598  const InDetDD::SiDetectorElement* element,
599  size_t& stripIndex) const
600  {
601  const Eigen::Matrix<float,1,1>& localPos = cluster->localPosition<1>();
602 
603  if (element->isEndcap()) {
604  // design for endcap modules
606  = dynamic_cast<const InDetDD::StripStereoAnnulusDesign *> (&element->design());
607  if ( design==nullptr ) {
608  ATH_MSG_FATAL( "Invalid strip annulus design for module with identifier/identifierHash " << element->identify() << "/" << element->identifyHash());
609  return std::pair<Amg::Vector3D, Amg::Vector3D >();
610  }
611 
612  // calculate phi pitch for evaluating the strip index
613  double phiPitchPhi = design->phiWidth()/design->diodesInRow(0);
614  stripIndex = -std::floor(localPos(0, 0) / phiPitchPhi) + design->diodesInRow(0) *0.5 - 0.5;
615 
616  std::pair<Amg::Vector3D, Amg::Vector3D > ends = {
617  element->globalPosition(design->stripPosAtR(stripIndex, 0, design->minR())),
618  element->globalPosition(design->stripPosAtR(stripIndex, 0, design->maxR()))
619  };
620  return ends;
621 
622  }
623 
624  InDetDD::SiLocalPosition localPosition(0., localPos(0, 0), 0.);
625  std::pair<Amg::Vector3D, Amg::Vector3D > ends(element->endsOfStrip(localPosition));
626 
627  return ends;
628  }
629 }
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
beamspotman.r
def r
Definition: beamspotman.py:676
ActsTrk::EtaMinus
@ EtaMinus
Definition: StripInformationHelper.h:13
InDetDD::SiDetectorElement::isEndcap
bool isEndcap() const
ActsTrk::StripInformationHelper::oneOverStrip
const double & oneOverStrip() const
Definition: StripInformationHelper.h:62
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
SCT_ID.h
This is an Identifier helper class for the SCT subdetector. This class is a factory for creating comp...
InDetDD::SolidStateDetectorElementBase::cellIdOfPosition
SiCellId cellIdOfPosition(const Amg::Vector2D &localPos) const
As in previous method but returns SiCellId.
Definition: SolidStateDetectorElementBase.cxx:224
python.SystemOfUnits.s
int s
Definition: SystemOfUnits.py:131
ActsTrk::StripSP
Definition: IStripSpacePointFormationTool.h:18
python.SystemOfUnits.m
int m
Definition: SystemOfUnits.py:91
maxValue
#define maxValue(current, test)
Definition: CompoundLayerMaterialCreator.h:22
ContainerAccessor
Definition: ContainerAccessor.h:25
InDetDD::SiDetectorElementCollection
Definition: SiDetectorElementCollection.h:30
InDetDD::StripStereoAnnulusDesign::strip1Dim
virtual int strip1Dim(int strip, int row) const override
only relevant for SCT.
Definition: StripStereoAnnulusDesign.cxx:294
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
ContainerAccessor::allIdentifiers
std::vector< identifier_t > allIdentifiers() const
Function to return all available identifier (i.e. keys in the map)
Definition: ContainerAccessor.h:84
python.TestDriveDummies.properties
dictionary properties
Definition: TestDriveDummies.py:14
ActsTrk::StripSpacePointFormationTool::correctPolarRange
void correctPolarRange(const InDetDD::SiDetectorElement *element, double &min, double &max, size_t &minStrip, size_t &maxStrip) const
Definition: StripSpacePointFormationTool.cxx:554
makeComparison.deltaY
int deltaY
Definition: makeComparison.py:44
hist_file_dump.d
d
Definition: hist_file_dump.py:143
max
constexpr double max()
Definition: ap_fixedTest.cxx:33
ActsTrk::StripInformationHelper::clusterIndex
const size_t & clusterIndex() const
Definition: StripInformationHelper.h:57
InDetDD::DetectorDesign::shape
virtual DetectorShape shape() const
Shape of element.
Definition: DetectorDesign.cxx:96
InDetDD::SolidStateDetectorElementBase::center
virtual const Amg::Vector3D & center() const override final
Center in global coordinates.
min
constexpr double min()
Definition: ap_fixedTest.cxx:26
mergePhysValFiles.start
start
Definition: DataQuality/DataQualityUtils/scripts/mergePhysValFiles.py:14
InDetDD::SiCellId::isValid
bool isValid() const
Test if its in a valid state.
Definition: SiCellId.h:136
mc.diff
diff
Definition: mc.SFGenPy8_MuMu_DD.py:14
InDetDD::StripStereoAnnulusDesign::phiWidth
double phiWidth() const
Definition: StripStereoAnnulusDesign.h:331
ActsTrk::StripSpacePointFormationTool::m_lorentzAngleTool
ToolHandle< ISiLorentzAngleTool > m_lorentzAngleTool
Using Lorentz angle tool.
Definition: StripSpacePointFormationTool.h:103
SCT_ID::barrel_ec
int barrel_ec(const Identifier &id) const
Values of different levels (failure returns 0)
Definition: SCT_ID.h:728
ISiLorentzAngleTool.h
ActsTrk::StripSpacePointFormationTool::updateRange
void updateRange(const InDetDD::SiDetectorElement *element1, const InDetDD::SiDetectorElement *element2, double &stripLengthGapTolerance, double &min, double &max) const
Definition: StripSpacePointFormationTool.cxx:544
InDetDD::SiCellId::strip
int strip() const
Get strip number. Equivalent to phiIndex().
Definition: SiCellId.h:131
ActsTrk::StripSpacePointFormationTool::StripSpacePointFormationTool
StripSpacePointFormationTool(const std::string &type, const std::string &name, const IInterface *parent)
Definition: StripSpacePointFormationTool.cxx:16
ActsTrk::Opposite
@ Opposite
Definition: StripInformationHelper.h:13
ActsTrk::StripSpacePointFormationTool::m_overlapLimitEtaMin
Gaudi::Property< float > m_overlapLimitEtaMin
Definition: StripSpacePointFormationTool.h:121
ActsTrk::EtaPlus
@ EtaPlus
Definition: StripInformationHelper.h:13
search
void search(TDirectory *td, const std::string &s, std::string cwd, node *n)
recursive directory search for TH1 and TH2 and TProfiles
Definition: hcg.cxx:738
python.CaloAddPedShiftConfig.type
type
Definition: CaloAddPedShiftConfig.py:42
InDetDD::SolidStateDetectorElementBase::identifyHash
virtual IdentifierHash identifyHash() const override final
identifier hash (inline)
ActsTrk::StripInformationHelper
Definition: StripInformationHelper.h:15
StripSpacePointFormationTool.h
ActsTrk::StripSpacePointFormationTool::produceSpacePoints
virtual StatusCode produceSpacePoints(const EventContext &ctx, const xAOD::StripClusterContainer &clusterContainer, const InDet::SiElementPropertiesTable &properties, const InDetDD::SiDetectorElementCollection &elements, const Amg::Vector3D &beamSpotVertex, std::vector< StripSP > &spacePoints, std::vector< StripSP > &overlapSpacePoints, bool processOverlaps, const std::vector< IdentifierHash > &hashesToProcess, const ContainerAccessor< xAOD::StripCluster, IdentifierHash, 1 > &stripAccessor) const override
Definition: StripSpacePointFormationTool.cxx:34
InDetDD::SiLocalPosition
Definition: SiLocalPosition.h:31
InDetDD::StripStereoAnnulusDesign::diodesInRow
virtual int diodesInRow(const int row) const override
Definition: StripStereoAnnulusDesign.h:251
python.setupRTTAlg.size
int size
Definition: setupRTTAlg.py:39
ActsTrk::StripSpacePointFormationTool::m_stripGapParameter
Gaudi::Property< float > m_stripGapParameter
Definition: StripSpacePointFormationTool.h:125
ActsTrk::StripSpacePointFormationTool::m_overlapLimitPhi
Gaudi::Property< float > m_overlapLimitPhi
Definition: StripSpacePointFormationTool.h:120
InDetDD::StripStereoAnnulusDesign::stripPosAtR
SiLocalPosition stripPosAtR(int strip, int row, double r) const
Definition: StripStereoAnnulusDesign.cxx:385
ContainerAccessor::rangesForIdentifierDirect
const boost::container::small_vector< Range, inline_size > rangesForIdentifierDirect(const identifier_t &identifier) const
Function to return the list of ranges corresponding to a given identifier.
Definition: ContainerAccessor.h:69
InDetDD::StripStereoAnnulusDesign::minR
double minR() const
Definition: StripStereoAnnulusDesign.h:322
ActsTrk::StripSpacePointFormationTool::m_overlapLimitOpposite
Gaudi::Property< float > m_overlapLimitOpposite
Definition: StripSpacePointFormationTool.h:119
beamspotman.n
n
Definition: beamspotman.py:731
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
InDetDD::Annulus
@ Annulus
Definition: DetectorDesign.h:42
InDetDD::StripStereoAnnulusDesign
Definition: StripStereoAnnulusDesign.h:50
Amg::Transform3D
Eigen::Affine3d Transform3D
Definition: GeoPrimitives.h:46
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
ActsTrk::StripSpacePointFormationTool::m_stripLengthTolerance
Gaudi::Property< float > m_stripLengthTolerance
The following are parameters to build the space points.
Definition: StripSpacePointFormationTool.h:124
ActsTrk::PhiPlus
@ PhiPlus
Definition: StripInformationHelper.h:13
F600IntegrationConfig.spacePoints
spacePoints
Definition: F600IntegrationConfig.py:65
DataVector
Derived DataVector<T>.
Definition: DataVector.h:794
WriteCalibToCool.swap
swap
Definition: WriteCalibToCool.py:94
DeMoUpdate.toAdd
bool toAdd
Definition: DeMoUpdate.py:1304
ReadCellNoiseFromCool.dm
dm
Definition: ReadCellNoiseFromCool.py:235
lumiFormat.array
array
Definition: lumiFormat.py:91
ActsTrk::StripSpacePointFormationTool::fillStripSpacePoints
StatusCode fillStripSpacePoints(const std::array< const InDetDD::SiDetectorElement *, nNeighbours > &neighbourElements, const std::array< std::vector< std::pair< const xAOD::StripCluster *, size_t >>, nNeighbours > &neighbourClusters, const std::array< double, 14 > &overlapExtents, const Amg::Vector3D &beamSpotVertex, std::vector< StripSP > &spacePoints, std::vector< StripSP > &overlapSpacePoints) const
Definition: StripSpacePointFormationTool.cxx:214
ActsTrk::StripInformationHelper::normal
const Amg::Vector3D & normal() const
Definition: StripInformationHelper.h:61
python.PyKernel.detStore
detStore
Definition: PyKernel.py:41
InDetDD::SiDetectorElement::endsOfStrip
std::pair< Amg::Vector3D, Amg::Vector3D > endsOfStrip(const Amg::Vector2D &position) const
Special method for SCT to retrieve the two ends of a "strip" Returned coordinates are in global frame...
Definition: SiDetectorElement.cxx:339
ActsTrk::StripSpacePointFormationTool::makeStripSpacePoint
StatusCode makeStripSpacePoint(std::vector< StripSP > &, const StripInformationHelper &firstInfo, const StripInformationHelper &secondInfo, bool isEndcap, double limit, double slimit) const
Definition: StripSpacePointFormationTool.cxx:429
ActsTrk::StripSpacePointFormationTool::m_useTopSp
Gaudi::Property< bool > m_useTopSp
Definition: StripSpacePointFormationTool.h:110
ActsTrk::StripInformationHelper::position
Amg::Vector3D position(const double &shift) const
Definition: StripInformationHelper.cxx:39
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
plotBeamSpotMon.b
b
Definition: plotBeamSpotMon.py:77
SCT_ID::layer_disk
int layer_disk(const Identifier &id) const
Definition: SCT_ID.h:734
InDetDD::SiDetectorElement
Definition: SiDetectorElement.h:109
InDet::SiElementPropertiesTable
Definition: SiElementPropertiesTable.h:30
InDetDD::SiDetectorElement::isBarrel
bool isBarrel() const
ActsTrk::StripSpacePointFormationTool::offset
double offset(const InDetDD::SiDetectorElement *element1, const InDetDD::SiDetectorElement *element2, double &stripLengthGapTolerance) const
Definition: StripSpacePointFormationTool.cxx:521
ActsTrk::StripInformationHelper::stripCenter
const Amg::Vector3D & stripCenter() const
Definition: StripInformationHelper.h:58
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
ParticleGun_SamplingFraction.radius
radius
Definition: ParticleGun_SamplingFraction.py:96
SiDetectorElement.h
InDetDD::SiCellId
Definition: SiCellId.h:29
StripClusterAuxContainer.h
StripStereoAnnulusDesign.h
ContainerAccessor.h
ActsTrk::StripSpacePointFormationTool::initialize
virtual StatusCode initialize() override
Definition: StripSpacePointFormationTool.cxx:22
ActsTrk::StripInformationHelper::idHash
const unsigned int & idHash() const
Definition: StripInformationHelper.h:56
a
TList * a
Definition: liststreamerinfos.cxx:10
python.CaloAddPedShiftConfig.int
int
Definition: CaloAddPedShiftConfig.py:45
ActsTrk::PhiMinus
@ PhiMinus
Definition: StripInformationHelper.h:13
ActsTrk::ThisOne
@ ThisOne
Definition: StripInformationHelper.h:13
ActsTrk::StripSpacePointFormationTool::m_useSCTLayerDep_OverlapCuts
Gaudi::Property< bool > m_useSCTLayerDep_OverlapCuts
Definition: StripSpacePointFormationTool.h:126
dumpNswErrorDb.maxStrip
tuple maxStrip
Definition: dumpNswErrorDb.py:63
InDetDD::SolidStateDetectorElementBase::globalPosition
HepGeom::Point3D< double > globalPosition(const HepGeom::Point3D< double > &localPos) const
transform a reconstruction local position into a global position (inline):
RunTileMonitoring.clusters
clusters
Definition: RunTileMonitoring.py:133
dumpNswErrorDb.minStrip
int minStrip
Definition: dumpNswErrorDb.py:62
ReadCellNoiseFromCoolCompare.l0
l0
Definition: ReadCellNoiseFromCoolCompare.py:359
ActsTrk
The AlignStoreProviderAlg loads the rigid alignment corrections and pipes them through the readout ge...
Definition: MuonDetectorBuilderTool.cxx:55
InDetDD::StripStereoAnnulusDesign::localPositionOfCell
virtual SiLocalPosition localPositionOfCell(const SiCellId &cellId) const override
id -> position
Definition: StripStereoAnnulusDesign.cxx:362
skel.l1
l1
Definition: skel.GENtoEVGEN.py:409
InDetDD::SiDetectorElement::isStereo
bool isStereo() const
Check if it is the stereo side (useful for SCT)
Definition: SiDetectorElement.cxx:300
SiCellId.h
InDetDD::SiDetectorElement::design
virtual const SiDetectorDesign & design() const override final
access to the local description (inline):
ActsTrk::StripInformationHelper::set
void set(const unsigned int &idHash, const Amg::Vector3D &stripStart, const Amg::Vector3D &stripEnd, const Amg::Vector3D &beamSpotVertex, const float &locx, const size_t &clusterIndex, const size_t &stripIndex)
Definition: StripInformationHelper.cxx:20
ActsTrk::StripSpacePointFormationTool::m_allClusters
Gaudi::Property< bool > m_allClusters
Definition: StripSpacePointFormationTool.h:109
ActsTrk::StripSpacePointFormationTool::m_overlapLimitEtaMax
Gaudi::Property< float > m_overlapLimitEtaMax
Definition: StripSpacePointFormationTool.h:122
minValue
#define minValue(current, test)
Definition: CompoundLayerMaterialCreator.h:21
ActsTrk::StripInformationHelper::stripDirection
const Amg::Vector3D & stripDirection() const
Definition: StripInformationHelper.h:59
Amg::distance
float distance(const Amg::Vector3D &p1, const Amg::Vector3D &p2)
calculates the distance between two point in 3D space
Definition: GeoPrimitivesHelpers.h:54
ContainerAccessor::isIdentifierPresent
bool isIdentifierPresent(const identifier_t &identifier) const
Function to verify if a given identifier is present in the map, i.e.
Definition: ContainerAccessor.h:77
python.compressB64.c
def c
Definition: compressB64.py:93
updateCoolNtuple.limit
int limit
Definition: updateCoolNtuple.py:45
InDetDD::SiDetectorElementCollection::getDetectorElement
const SiDetectorElement * getDetectorElement(const IdentifierHash &hash) const
Definition: SiDetectorElementCollection.cxx:15
ActsTrk::nNeighbours
@ nNeighbours
Definition: StripInformationHelper.h:13
InDetDD::SolidStateDetectorElementBase::identify
virtual Identifier identify() const override final
identifier of this detector element (inline)
InDetDD::StripStereoAnnulusDesign::maxR
double maxR() const
Definition: StripStereoAnnulusDesign.h:326
ActsTrk::StripSpacePointFormationTool::getStripEnds
std::pair< Amg::Vector3D, Amg::Vector3D > getStripEnds(const xAOD::StripCluster *cluster, const InDetDD::SiDetectorElement *element, size_t &stripIndex) const
Definition: StripSpacePointFormationTool.cxx:597
InDetDD::SolidStateDetectorElementBase::transform
virtual const Amg::Transform3D & transform() const override final
Return local to global transform.
DataVector::begin
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
ActsTrk::StripSpacePointFormationTool::m_stripId
const SCT_ID * m_stripId
Definition: StripSpacePointFormationTool.h:97
SCT_ID::is_barrel
bool is_barrel(const Identifier &id) const
Test for barrel - WARNING: id MUST be sct id, otherwise answer is not accurate. Use SiliconID for gen...
Definition: SCT_ID.h:721
ActsTrk::StripInformationHelper::trajDirection
const Amg::Vector3D & trajDirection() const
Definition: StripInformationHelper.h:60
Identifier
Definition: IdentifierFieldParser.cxx:14