ATLAS Offline Software
MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/SpacePoint.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
6 
12 
19 
20 namespace {
22  inline void updateInstanceCounts(std::shared_ptr<const unsigned>& currCounter,
23  std::shared_ptr<unsigned>&& newCounter) {
24  if (!newCounter) {
25  return;
26  }
27  ++(*newCounter);
28  currCounter = std::move(newCounter);
29  }
30 }
31 
32 namespace MuonR4{
34  const xAOD::UncalibratedMeasurement* primaryMeas,
35  const xAOD::UncalibratedMeasurement* secondaryMeas):
36  m_primaryMeas{primaryMeas},
37  m_secondaryMeas{secondaryMeas},
38  m_dir{xAOD::channelDirInChamber(gctx, primaryMeas)},
39  m_normal{xAOD::channelNormalInChamber(gctx, primaryMeas)} {
40 
41  AmgSymMatrix(2) Jac{AmgSymMatrix(2)::Identity()}, uvcov {AmgSymMatrix(2)::Identity()};
42 
43 
44  if (primaryMeas->numDimensions() == 1) {
45  uvcov(0,0) = primaryMeas->localCovariance<1>()[0];
46  }
47  Jac.col(0) = m_normal.block<2,1>(0,0).unit();
48  if (secondaryMeas) {
50  const Amg::Vector3D pos1{xAOD::positionInChamber(gctx, primaryMeas)};
51  const Amg::Vector3D pos2{xAOD::positionInChamber(gctx, secondaryMeas)};
53  const Amg::Vector3D dir2{xAOD::channelDirInChamber(gctx, secondaryMeas)};
55  m_pos = pos1 + Amg::intersect<3>(pos2,dir2, pos1, m_dir).value_or(0) * m_dir;
56  Jac.col(1) = xAOD::channelNormalInChamber(gctx, secondaryMeas).block<2,1>(0,0).unit();
57  uvcov(1,1) = secondaryMeas->localCovariance<1>()[0];
58  } else {
59  m_pos = xAOD::positionInChamber(gctx, primaryMeas);
60  Jac.col(1) = m_dir.block<2,1>(0,0).unit();
61  if (primaryMeas->type() == xAOD::UncalibMeasType::MdtDriftCircleType) {
62  const xAOD::MdtDriftCircle* dc = static_cast<const xAOD::MdtDriftCircle*>(primaryMeas);
63  uvcov(1,1) = 0.5* dc->readoutElement()->activeTubeLength(dc->measurementHash());
64  } else if (primaryMeas->type() == xAOD::UncalibMeasType::RpcStripType) {
65  if (primaryMeas->numDimensions() == 1) {
66  const xAOD::RpcStrip* strip = static_cast<const xAOD::RpcStrip*>(primaryMeas);
67  uvcov(1,1) = strip->measuresPhi() ? 0.5* strip->readoutElement()->stripPhiLength():
68  0.5* strip->readoutElement()->stripEtaLength();
69  }
70  } else if (primaryMeas->type() == xAOD::UncalibMeasType::TgcStripType) {
71  const xAOD::TgcStrip* strip = static_cast<const xAOD::TgcStrip*>(primaryMeas);
72  if (strip->measuresPhi()) {
73  uvcov(1,1) = 0.5 * strip->readoutElement()->stripLayout(strip->gasGap()).stripLength(strip->channelNumber());
74  } else {
75  uvcov(1,1) = 0.5 * strip->readoutElement()->wireGangLayout(strip->gasGap()).stripLength(strip->channelNumber());
76  }
77  } else if (primaryMeas->type() == xAOD::UncalibMeasType::MMClusterType) {
78  const xAOD::MMCluster* clust = static_cast<const xAOD::MMCluster*>(primaryMeas);
79  uvcov(1,1) = 0.5 * clust->readoutElement()->stripLayer(clust->measurementHash()).design().stripLength(clust->channelNumber());
80  } else if (primaryMeas->type() == xAOD::UncalibMeasType::sTgcStripType) {
81  const xAOD::sTgcMeasurement* meas = static_cast<const xAOD::sTgcMeasurement*>(primaryMeas);
82  switch (meas->channelType()) {
83  case sTgcIdHelper::sTgcChannelTypes::Strip:
84  uvcov(1,1) = 0.5 * meas->readoutElement()->stripDesign(meas->measurementHash()).stripLength(meas->channelNumber());
85  break;
86  case sTgcIdHelper::sTgcChannelTypes::Wire:
87  uvcov(1,1) = 0.5 * meas->readoutElement()->wireDesign(meas->measurementHash()).stripLength(meas->channelNumber());
88  break;
90  case sTgcIdHelper::sTgcChannelTypes::Pad:
91  break;
92  }
93  }
94  uvcov(1,1) = std::pow(uvcov(1,1), 2);
95  }
96 
100  if (primaryMeas->numDimensions() == 2) {
101  uvcov = xAOD::toEigen(primaryMeas->localCovariance<2>());
102  m_secondaryMeas = m_primaryMeas;
103  }
104  m_measCovariance = Jac * uvcov * Jac.inverse();
105  }
106 
108  return m_primaryMeas;
109  }
111  return m_secondaryMeas;
112  }
114  return m_chamber;
115  }
117  return m_msSector;
118  }
120  return m_pos;
121  }
123  return m_dir;
124  }
126  return m_normal;
127  }
129  return directionInChamber().cross(normalInChamber()).unit();
130  }
132  return primaryMeasurement()->type();
133  }
134  bool SpacePoint::measuresPhi() const {
135  return secondaryMeasurement() || !m_measEta;
136  }
137  bool SpacePoint::measuresEta() const {
138  return secondaryMeasurement() || m_measEta;
139  }
142  }
143  double SpacePoint::driftRadius() const {
145  static_cast<const xAOD::MdtDriftCircle*>(m_primaryMeas)->driftRadius() : 0.;
146  }
148  return Amg::Vector2D{ Amg::error(m_measCovariance,0),Amg::error(m_measCovariance,1) };
149  }
150  const AmgSymMatrix(2)& SpacePoint::covariance() const {
151  return m_measCovariance;
152  }
153  void SpacePoint::setInstanceCounts(std::shared_ptr<unsigned int> etaCounts,
154  std::shared_ptr<unsigned int> phiCounts) {
155  updateInstanceCounts(m_etaInstances, std::move(etaCounts));
156  updateInstanceCounts(m_phiInstances, std::move(phiCounts));
157  }
158  unsigned int SpacePoint::nEtaInstanceCounts() const { return (*m_etaInstances); }
159  unsigned int SpacePoint::nPhiInstanceCounts() const { return (*m_phiInstances); }
160  unsigned int SpacePoint::dimension() const {
161  return (secondaryMeasurement() != nullptr) + 1;
162  }
163 
164 }
MuonR4::SpacePoint::msSector
const MuonGMR4::SpectrometerSector * msSector() const
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/SpacePoint.cxx:116
xAOD::identify
const Identifier & identify(const UncalibratedMeasurement *meas)
Returns the associated identifier from the muon measurement.
Definition: MuonSpectrometer/MuonPhaseII/Event/xAOD/xAODMuonPrepData/Root/UtilFunctions.cxx:61
UtilFunctions.h
MuonR4::SpacePoint::type
xAOD::UncalibMeasType type() const
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/SpacePoint.cxx:131
MuonR4::SpacePoint::normalInChamber
const Amg::Vector3D & normalInChamber() const
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/SpacePoint.cxx:125
m_dir
TDirectory & m_dir
The directory we need to return to.
Definition: OutputStreamData.cxx:41
MuonR4::SpacePoint::m_phiInstances
std::shared_ptr< const unsigned > m_phiInstances
In how many space points is the phi measurement used.
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/MuonSpacePoint/SpacePoint.h:93
MuonGMR4::SpectrometerSector
A spectrometer sector forms the envelope of all chambers that are placed in the same MS sector & laye...
Definition: SpectrometerSector.h:40
xAOD::MMCluster_v1
Definition: MMCluster_v1.h:20
MuonGMR4::StripDesign::stripLength
virtual double stripLength(int stripNumb) const
Returns length of the strip.
xAOD::sTgcMeasurement_v1::measurementHash
IdentifierHash measurementHash() const
Returns the hash of the measurement channel w.r.t ReadoutElement.
Definition: sTgcMeasurement_v1.cxx:29
Amg::Vector2D
Eigen::Matrix< double, 2, 1 > Vector2D
Definition: GeoPrimitives.h:48
xAOD::TgcStrip_v1
Definition: TgcStrip_v1.h:19
MuonGMR4::sTgcReadoutElement::stripDesign
const StripDesign & stripDesign(const Identifier &measId) const
Retrieves the readoutElement Layer given the Identifier/Hash.
EventPrimitivesHelpers.h
xAOD::MdtDriftCircle_v1::measurementHash
IdentifierHash measurementHash() const
Returns the hash of the measurement channel (tube (x) layer)
Definition: MdtDriftCircle_v1.cxx:29
MuonR4::SpacePoint::planeNormal
Amg::Vector3D planeNormal() const
Returns the vector pointing out of the measurement plane.
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/SpacePoint.cxx:128
xAOD::UncalibMeasType::MMClusterType
@ MMClusterType
MuonGMR4::MdtReadoutElement::activeTubeLength
double activeTubeLength(const IdentifierHash &hash) const
Definition: MuonPhaseII/MuonDetDescr/MuonReadoutGeometryR4/src/MdtReadoutElement.cxx:173
MuonR4::SpacePoint::setInstanceCounts
void setInstanceCounts(std::shared_ptr< unsigned > etaCounts, std::shared_ptr< unsigned > phiCounts)
Set the number of space points built with the same eta / phi prd.
xAOD::MMCluster_v1::readoutElement
const MuonGMR4::MmReadoutElement * readoutElement() const
Retrieve the associated MmReadoutElement.
SpacePoint.h
MuonR4::SpacePoint::secondaryMeasurement
const xAOD::UncalibratedMeasurement * secondaryMeasurement() const
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/SpacePoint.cxx:110
MuonR4::SpacePoint::m_msSector
const MuonGMR4::SpectrometerSector * m_msSector
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/MuonSpacePoint/SpacePoint.h:78
xAOD::UncalibMeasType::sTgcStripType
@ sTgcStripType
xAOD::RpcStrip_v1
Definition: RpcStrip_v1.h:11
xAOD::channelDirInChamber
Amg::Vector3D channelDirInChamber(const ActsGeometryContext &gctx, const UncalibratedMeasurement *meas)
Definition: MuonSpectrometer/MuonPhaseII/Event/xAOD/xAODMuonPrepData/Root/UtilFunctions.cxx:118
RpcStrip.h
keylayer_zslicemap.strip
strip
Definition: keylayer_zslicemap.py:151
MuonR4::SpacePoint::measuresPhi
bool measuresPhi() const
: Does the space point contain a phi measurement
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/SpacePoint.cxx:134
xAOD::MdtDriftCircle_v1::readoutElement
const MuonGMR4::MdtReadoutElement * readoutElement() const
Retrieve the associated MdtReadoutElement.
xAOD::UncalibMeasType::TgcStripType
@ TgcStripType
xAOD::sTgcMeasurement_v1::channelNumber
uint16_t channelNumber() const
Channel number of the Measurement.
MuonR4::SpacePoint::m_chamber
const MuonGMR4::Chamber * m_chamber
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/MuonSpacePoint/SpacePoint.h:77
MuonR4::SpacePoint::m_etaInstances
std::shared_ptr< const unsigned > m_etaInstances
In how many space points is the eta measurement used.
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/MuonSpacePoint/SpacePoint.h:91
MuonR4::SpacePoint::primaryMeasurement
const xAOD::UncalibratedMeasurement * primaryMeasurement() const
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/SpacePoint.cxx:107
MuonGMR4::Chamber
Definition: Chamber.h:22
sTgcReadoutElement.h
MuonGMR4::sTgcReadoutElement::wireDesign
const WireGroupDesign & wireDesign(const Identifier &measId) const
Retrieves the readoutElement Layer given the Identifier/Hash.
MuonR4::SpacePoint::m_normal
Amg::Vector3D m_normal
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/MuonSpacePoint/SpacePoint.h:83
MuonR4::SpacePoint::m_secondaryMeas
const xAOD::UncalibratedMeasurement * m_secondaryMeas
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/MuonSpacePoint/SpacePoint.h:75
xAOD::UncalibratedMeasurement_v1
Definition: UncalibratedMeasurement_v1.h:13
xAOD::sTgcMeasurement_v1::channelType
virtual sTgcChannelTypes channelType() const =0
Returns the channel type of the measurement (Pad/Wire/Strip)
xAOD::MMCluster_v1::channelNumber
uint16_t channelNumber() const
returns the number of the central strip
xAOD::UncalibratedMeasurement_v1::type
virtual xAOD::UncalibMeasType type() const =0
Returns the type of the measurement type as a simple enumeration.
xAOD::positionInChamber
Amg::Vector3D positionInChamber(const ActsGeometryContext &gctx, const UncalibratedMeasurement *meas)
Returns the position of the uncalibrated muon measurement in the attached Muon chamber frame.
Definition: MuonSpectrometer/MuonPhaseII/Event/xAOD/xAODMuonPrepData/Root/UtilFunctions.cxx:86
xAOD::channelNormalInChamber
Amg::Vector3D channelNormalInChamber(const ActsGeometryContext &gctx, const UncalibratedMeasurement *meas)
Definition: MuonSpectrometer/MuonPhaseII/Event/xAOD/xAODMuonPrepData/Root/UtilFunctions.cxx:149
ActsGeometryContext
Include the GeoPrimitives which need to be put first.
Definition: ActsGeometryContext.h:27
MdtDriftCircle.h
MuonGMR4::MmReadoutElement::stripLayer
const StripLayer & stripLayer(const Identifier &measId) const
TgcStrip.h
MuonR4::SpacePoint::directionInChamber
const Amg::Vector3D & directionInChamber() const
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/SpacePoint.cxx:122
sTgcMeasurement.h
Amg::error
double error(const Amg::MatrixX &mat, int index)
return diagonal error of the matrix caller should ensure the matrix is symmetric and the index is in ...
Definition: EventPrimitivesHelpers.h:40
xAOD::sTgcMeasurement_v1::readoutElement
const MuonGMR4::sTgcReadoutElement * readoutElement() const
Retrieve the associated sTgcReadoutElement.
xAOD::MMCluster_v1::measurementHash
IdentifierHash measurementHash() const
Returns the hash of the measurement channel.
Definition: MMCluster_v1.cxx:20
MuonR4::SpacePoint::m_pos
Amg::Vector3D m_pos
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/MuonSpacePoint/SpacePoint.h:81
MuonR4::SpacePoint::m_dir
Amg::Vector3D m_dir
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/MuonSpacePoint/SpacePoint.h:82
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
MuonGMR4::StripLayer::design
const StripDesign & design() const
Returns the underlying strip design.
RpcReadoutElement.h
MuonR4::SpacePoint::SpacePoint
SpacePoint(const ActsGeometryContext &gctx, const xAOD::UncalibratedMeasurement *primMeas, const xAOD::UncalibratedMeasurement *secondMeas=nullptr)
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/SpacePoint.cxx:33
MuonR4
This header ties the generic definitions in this package.
Definition: HoughEventData.h:16
MuonR4::SpacePoint::positionInChamber
const Amg::Vector3D & positionInChamber() const
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/SpacePoint.cxx:119
MuonR4::SpacePoint::nPhiInstanceCounts
unsigned int nPhiInstanceCounts() const
How many space points have been built in total with the same phi prd
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/SpacePoint.cxx:159
MuonR4::SpacePoint::m_measEta
bool m_measEta
Flag indicating that the measurement is an eta measurement.
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/MuonSpacePoint/SpacePoint.h:80
MuonR4::SpacePoint::measuresEta
bool measuresEta() const
: Does the space point contain an eta measurement
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/SpacePoint.cxx:137
MdtReadoutElement.h
unit
const PlainObject unit() const
This is a plugin that makes Eigen look like CLHEP & defines some convenience methods.
Definition: AmgMatrixBasePlugin.h:21
MuonR4::SpacePoint::dimension
unsigned int dimension() const
Is the space point a 1D or combined 2D measurement.
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/SpacePoint.cxx:160
MuonR4::SpacePoint::chamber
const MuonGMR4::Chamber * chamber() const
: Pointer to the associated chamber
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/SpacePoint.cxx:113
xAOD::UncalibMeasType
UncalibMeasType
Define the type of the uncalibrated measurement.
Definition: MeasurementDefs.h:25
MuonR4::SpacePoint::uncertainty
Amg::Vector2D uncertainty() const
: Returns the uncertainties on the space point
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/SpacePoint.cxx:147
MMCluster.h
MuonR4::SpacePoint::driftRadius
double driftRadius() const
: Returns the size of the drift radius
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/SpacePoint.cxx:143
xAOD::MdtDriftCircle_v1
https://gitlab.cern.ch/atlas/athena/-/blob/master/MuonSpectrometer/MuonReconstruction/MuonRecEvent/Mu...
Definition: MdtDriftCircle_v1.h:21
MuonR4::AmgSymMatrix
const AmgSymMatrix(2) &SpacePoint
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/SpacePoint.cxx:150
pow
constexpr int pow(int base, int exp) noexcept
Definition: ap_fixedTest.cxx:15
TgcReadoutElement.h
xAOD::UncalibMeasType::RpcStripType
@ RpcStripType
xAOD::UncalibMeasType::MdtDriftCircleType
@ MdtDriftCircleType
MuonR4::SpacePoint::m_primaryMeas
const xAOD::UncalibratedMeasurement * m_primaryMeas
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/MuonSpacePoint/SpacePoint.h:74
MuonR4::SpacePoint::identify
const Identifier & identify() const
: Identifier of the primary measurement
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/SpacePoint.cxx:140
MuonR4::SpacePoint::nEtaInstanceCounts
unsigned int nEtaInstanceCounts() const
How many space points have been built in total with the same eta prd.
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/SpacePoint.cxx:158
MmReadoutElement.h
xAOD::sTgcMeasurement_v1
Definition: sTgcMeasurement_v1.h:21
Identifier
Definition: IdentifierFieldParser.cxx:14