Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
List of all members
ActsTrk::StripSpacePointFormationTool Class Reference

#include <StripSpacePointFormationTool.h>

Inheritance diagram for ActsTrk::StripSpacePointFormationTool:
Collaboration diagram for ActsTrk::StripSpacePointFormationTool:

Public Member Functions

AthAlgTool methods
 StripSpacePointFormationTool (const std::string &type, const std::string &name, const IInterface *parent)
 
virtual ~StripSpacePointFormationTool ()=default
 
virtual StatusCode initialize () override
 

Private Attributes

Id helpers
const SCT_IDm_stripId {}
 
tool handles
ToolHandle< ISiLorentzAngleToolm_lorentzAngleTool
 Using Lorentz angle tool. More...
 
Configuration flags
Gaudi::Property< bool > m_allClusters {this, "AllClusters", false, "Process all clusters without limits."}
 
Gaudi::Property< bool > m_useTopSp {this, "useTopSp", false, "SP global position is for second strip module."}
 
Cut parameters

The following are ranges within which clusters must lie to make a spacepoint.

Opposite and eta neighbours clusters must lie within range of each other. Phi clusters must lie in region of each wafer separately.

Gaudi::Property< float > m_overlapLimitOpposite {this, "OverlapLimitOpposite", 2.8, "Overlap limit for opposite-neighbour."}
 
Gaudi::Property< float > m_overlapLimitPhi {this, "OverlapLimitPhi", 5.64, "Overlap limit for phi-neighbours."}
 
Gaudi::Property< float > m_overlapLimitEtaMin {this, "OverlapLimitEtaMin", 1.68, "Low overlap limit for eta-neighbours."}
 
Gaudi::Property< float > m_overlapLimitEtaMax {this, "OverlapLimitEtaMax", 3.0, "High overlap limit for eta-neighbours."}
 
Gaudi::Property< float > m_stripLengthTolerance {this, "StripLengthTolerance", 0.01}
 The following are parameters to build the space points. More...
 
Gaudi::Property< float > m_stripGapParameter {this, "StripGapParameter", 0.0015, "Recommend 0.001 - 0.0015 for ITK geometry"}
 
Gaudi::Property< bool > m_useSCTLayerDep_OverlapCuts {this,"useSCTLayerDep_OverlapCuts", true}
 

Production of space points

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
 
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
 
StatusCode makeStripSpacePoint (std::vector< StripSP > &, const StripInformationHelper &firstInfo, const StripInformationHelper &secondInfo, bool isEndcap, double limit, double slimit) const
 
void updateRange (const InDetDD::SiDetectorElement *element1, const InDetDD::SiDetectorElement *element2, double &stripLengthGapTolerance, double &min, double &max) const
 
double offset (const InDetDD::SiDetectorElement *element1, const InDetDD::SiDetectorElement *element2, double &stripLengthGapTolerance) const
 
void correctPolarRange (const InDetDD::SiDetectorElement *element, double &min, double &max, size_t &minStrip, size_t &maxStrip) const
 
std::pair< Amg::Vector3D, Amg::Vector3DgetStripEnds (const xAOD::StripCluster *cluster, const InDetDD::SiDetectorElement *element, size_t &stripIndex) const
 

Detailed Description

Definition at line 34 of file StripSpacePointFormationTool.h.

Constructor & Destructor Documentation

◆ StripSpacePointFormationTool()

ActsTrk::StripSpacePointFormationTool::StripSpacePointFormationTool ( const std::string &  type,
const std::string &  name,
const IInterface *  parent 
)

Definition at line 16 of file StripSpacePointFormationTool.cxx.

19  : base_class(type, name, parent)
20  {}

◆ ~StripSpacePointFormationTool()

virtual ActsTrk::StripSpacePointFormationTool::~StripSpacePointFormationTool ( )
virtualdefault

Member Function Documentation

◆ correctPolarRange()

void ActsTrk::StripSpacePointFormationTool::correctPolarRange ( const InDetDD::SiDetectorElement element,
double &  min,
double &  max,
size_t &  minStrip,
size_t &  maxStrip 
) const
private

Definition at line 554 of file StripSpacePointFormationTool.cxx.

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  }

◆ fillStripSpacePoints()

StatusCode ActsTrk::StripSpacePointFormationTool::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
private

Definition at line 214 of file StripSpacePointFormationTool.cxx.

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  }

◆ getStripEnds()

std::pair< Amg::Vector3D, Amg::Vector3D > ActsTrk::StripSpacePointFormationTool::getStripEnds ( const xAOD::StripCluster cluster,
const InDetDD::SiDetectorElement element,
size_t &  stripIndex 
) const
private

Definition at line 597 of file StripSpacePointFormationTool.cxx.

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  }

◆ initialize()

StatusCode ActsTrk::StripSpacePointFormationTool::initialize ( )
overridevirtual

Definition at line 22 of file StripSpacePointFormationTool.cxx.

22  {
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  }

◆ makeStripSpacePoint()

StatusCode ActsTrk::StripSpacePointFormationTool::makeStripSpacePoint ( std::vector< StripSP > &  collection,
const StripInformationHelper firstInfo,
const StripInformationHelper secondInfo,
bool  isEndcap,
double  limit,
double  slimit 
) const
private

Definition at line 429 of file StripSpacePointFormationTool.cxx.

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  }

◆ offset()

double ActsTrk::StripSpacePointFormationTool::offset ( const InDetDD::SiDetectorElement element1,
const InDetDD::SiDetectorElement element2,
double &  stripLengthGapTolerance 
) const
private

Definition at line 521 of file StripSpacePointFormationTool.cxx.

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  }

◆ produceSpacePoints()

StatusCode ActsTrk::StripSpacePointFormationTool::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
overridevirtual

Production of StripSP from strip clusters Strip space points involves a more complex logic since they are made combining clusters from pairs of overlapping detectors.

For each trigger element, first evaluate and collect the quantities you need to build the space points. The detector element array has capacity 6: [0] is the trigger element [1] is the opposite element [2]-[3] are the elements tested for eta overlaps [4]-[5] are the elements tested for phi overlaps For each element you save the corresponding cluster collections and the space point compatibility range as described below.

For the opposite element and the ones tested for eta overlaps, you have to check if clusters are compatible with the local position of the trigger cluster requiring that the distance between the two clusters in phi is withing a specified range.

  • For the clusters on the opposite element: [-m_overlapLimitOpposite, m_overlapLimitOpposite]
  • For the eta overlapping clusters : you use m_overlapLimitEtaMin and m_overlapLimitEtaMax in different combination depending if you are checking a stereo module or not

For each element, the extremes of these ranges are saved in the overlapExtents array which is used later on

  • overlapExtents[0], overlapExtents[1] are filled for the opposite element
  • overlapExtents[2], overlapExtents[3], overlapExtents[4], overlapExtents[5] are filled for the eta overlapping elements

For the elements tested for phi overlaps, you have to check if clusters are compatible with the local position of the trigger cluster. This needs that the trigger cluster is at the edge of the trigger module: e.g. -hwidth < locX_trigger < -hwidth+m_overlapLimitPhi (or hwidth-m_overlapLimitPhi < locX_trigger < hwidth) and that the other cluster is on the compatible edge of its module: e.g. hwidth-m_overlapLimitPhi < locX_other < hwidth (or -hwidth < locX_other < -hwidth+m_overlapLimitPhi)

For each element, the extremes of these ranges are saved in the overlapExtents array which is used later on

  • overlapExtents[6], overlapExtents[7], overlapExtents[10], overlapExtents[11] overlapExtents[8], overlapExtents[9], overlapExtents[12], overlapExtents[13] are filled for the phi overlapping elements

Access to the cluster from a given detector element is possible via the ContainerAccessor.

Definition at line 34 of file StripSpacePointFormationTool.cxx.

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  }

◆ updateRange()

void ActsTrk::StripSpacePointFormationTool::updateRange ( const InDetDD::SiDetectorElement element1,
const InDetDD::SiDetectorElement element2,
double &  stripLengthGapTolerance,
double &  min,
double &  max 
) const
private

Definition at line 544 of file StripSpacePointFormationTool.cxx.

548  {
549  double dm = offset(element1, element2, stripLengthGapTolerance);
550  min -= dm;
551  max += dm;
552  }

Member Data Documentation

◆ m_allClusters

Gaudi::Property< bool > ActsTrk::StripSpacePointFormationTool::m_allClusters {this, "AllClusters", false, "Process all clusters without limits."}
private

Definition at line 109 of file StripSpacePointFormationTool.h.

◆ m_lorentzAngleTool

ToolHandle<ISiLorentzAngleTool> ActsTrk::StripSpacePointFormationTool::m_lorentzAngleTool
private
Initial value:
{this, "LorentzAngleTool", "",
"Tool to retreive Lorentz angle of SCT"}

Using Lorentz angle tool.

Definition at line 103 of file StripSpacePointFormationTool.h.

◆ m_overlapLimitEtaMax

Gaudi::Property< float > ActsTrk::StripSpacePointFormationTool::m_overlapLimitEtaMax {this, "OverlapLimitEtaMax", 3.0, "High overlap limit for eta-neighbours."}
private

Definition at line 122 of file StripSpacePointFormationTool.h.

◆ m_overlapLimitEtaMin

Gaudi::Property< float > ActsTrk::StripSpacePointFormationTool::m_overlapLimitEtaMin {this, "OverlapLimitEtaMin", 1.68, "Low overlap limit for eta-neighbours."}
private

Definition at line 121 of file StripSpacePointFormationTool.h.

◆ m_overlapLimitOpposite

Gaudi::Property< float > ActsTrk::StripSpacePointFormationTool::m_overlapLimitOpposite {this, "OverlapLimitOpposite", 2.8, "Overlap limit for opposite-neighbour."}
private

Definition at line 119 of file StripSpacePointFormationTool.h.

◆ m_overlapLimitPhi

Gaudi::Property< float > ActsTrk::StripSpacePointFormationTool::m_overlapLimitPhi {this, "OverlapLimitPhi", 5.64, "Overlap limit for phi-neighbours."}
private

Definition at line 120 of file StripSpacePointFormationTool.h.

◆ m_stripGapParameter

Gaudi::Property< float > ActsTrk::StripSpacePointFormationTool::m_stripGapParameter {this, "StripGapParameter", 0.0015, "Recommend 0.001 - 0.0015 for ITK geometry"}
private

Definition at line 125 of file StripSpacePointFormationTool.h.

◆ m_stripId

const SCT_ID* ActsTrk::StripSpacePointFormationTool::m_stripId {}
private

Definition at line 97 of file StripSpacePointFormationTool.h.

◆ m_stripLengthTolerance

Gaudi::Property< float > ActsTrk::StripSpacePointFormationTool::m_stripLengthTolerance {this, "StripLengthTolerance", 0.01}
private

The following are parameters to build the space points.

Definition at line 124 of file StripSpacePointFormationTool.h.

◆ m_useSCTLayerDep_OverlapCuts

Gaudi::Property< bool > ActsTrk::StripSpacePointFormationTool::m_useSCTLayerDep_OverlapCuts {this,"useSCTLayerDep_OverlapCuts", true}
private

Definition at line 126 of file StripSpacePointFormationTool.h.

◆ m_useTopSp

Gaudi::Property< bool > ActsTrk::StripSpacePointFormationTool::m_useTopSp {this, "useTopSp", false, "SP global position is for second strip module."}
private

Definition at line 110 of file StripSpacePointFormationTool.h.


The documentation for this class was generated from the following files:
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
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
python.SystemOfUnits.s
int s
Definition: SystemOfUnits.py:131
python.SystemOfUnits.m
int m
Definition: SystemOfUnits.py:91
maxValue
#define maxValue(current, test)
Definition: CompoundLayerMaterialCreator.h:22
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
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
DMTest::C
C_v1 C
Definition: C.h:26
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
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::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)
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
columnar::ContainerId::cluster
@ cluster
ActsTrk::StripSpacePointFormationTool::m_overlapLimitOpposite
Gaudi::Property< float > m_overlapLimitOpposite
Definition: StripSpacePointFormationTool.h:119
beamspotman.n
n
Definition: beamspotman.py:731
InDetDD::Annulus
@ Annulus
Definition: DetectorDesign.h:42
python.LArMinBiasAlgConfig.int
int
Definition: LArMinBiasAlgConfig.py:59
InDetDD::StripStereoAnnulusDesign
Definition: StripStereoAnnulusDesign.h:50
Amg::Transform3D
Eigen::Affine3d Transform3D
Definition: GeoPrimitives.h:46
test_pyathena.parent
parent
Definition: test_pyathena.py:15
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
StripInformationHelper
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
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
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:228
plotBeamSpotMon.b
b
Definition: plotBeamSpotMon.py:77
SCT_ID::layer_disk
int layer_disk(const Identifier &id) const
Definition: SCT_ID.h:734
dumpNswErrorDb.maxStrip
tuple maxStrip
Definition: dumpNswErrorDb.py:27
InDetDD::SiDetectorElement
Definition: SiDetectorElement.h:109
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
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
ParticleGun_SamplingFraction.radius
radius
Definition: ParticleGun_SamplingFraction.py:96
InDetDD::SiCellId
Definition: SiCellId.h:29
a
TList * a
Definition: liststreamerinfos.cxx:10
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
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:26
ReadCellNoiseFromCoolCompare.l0
l0
Definition: ReadCellNoiseFromCoolCompare.py:359
InDetDD::StripStereoAnnulusDesign::localPositionOfCell
virtual SiLocalPosition localPositionOfCell(const SiCellId &cellId) const override
id -> position
Definition: StripStereoAnnulusDesign.cxx:362
skel.l1
l1
Definition: skel.GENtoEVGEN.py:403
InDetDD::SiDetectorElement::isStereo
bool isStereo() const
Check if it is the stereo side (useful for SCT)
Definition: SiDetectorElement.cxx:300
InDetDD::SiDetectorElement::design
virtual const SiDetectorDesign & design() const override final
access to the local description (inline):
python.FPGATrackSimAnalysisConfig.spacePoints
spacePoints
Definition: FPGATrackSimAnalysisConfig.py:563
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
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
Identifier
Definition: IdentifierFieldParser.cxx:14