Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
SegmentFitHelperFunctions.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
5 
10 #include "GaudiKernel/PhysicalConstants.h"
11 #include "GeoModelKernel/throwExcept.h"
15 
16 namespace{
17  constexpr double c_inv = 1. / Gaudi::Units::c_light;
18  constexpr auto printLvl = MSG::VERBOSE;
19 }
20 
21 
22 namespace MuonR4 {
23  namespace SegmentFitHelpers{
24  using namespace SegmentFit;
26 
27 
28  double chiSqTerm(const Amg::Vector3D& posInChamber,
29  const Amg::Vector3D& dirInChamber,
30  const MuonR4::SpacePoint& measurement,
31  MsgStream& msg) {
32  double chi2{0.};
33  switch (measurement.type()) {
35  chi2 = chiSqTermMdt(posInChamber, dirInChamber,
36  measurement, msg);
37  break;
42  chi2 = chiSqTermStrip(posInChamber, dirInChamber, measurement, msg);
43  break;
44  default:
45  if (msg.level() <= MSG::WARNING) {
46  msg<<MSG::WARNING<<__FILE__<<":"<<__LINE__<<" - Unsupported measurement: "
47  <<measurement.msSector()->idHelperSvc()->toString(measurement.identify())<<endmsg;
48  }
49  }
50  return chi2;
51  }
52  double chiSqTermMdt(const Amg::Vector3D& segPos,
53  const Amg::Vector3D& segDir,
54  const MuonR4::SpacePoint& mdtSP,
55  MsgStream& msg) {
56 
58 
59  residual[Amg::y] = std::abs(Amg::signedDistance(mdtSP.positionInChamber(), mdtSP.directionInChamber(), segPos, segDir))
60  - mdtSP.driftRadius();
61  const double chi2{residual.dot(mdtSP.covariance().inverse()* residual)};
62  if (msg.level() <= printLvl) {
63  msg<<printLvl<<"Measurement "<<mdtSP.msSector()->idHelperSvc()->toString(mdtSP.identify());
64  msg<<printLvl<<", position: "<<Amg::toString(mdtSP.positionInChamber())
65  <<", driftRadius: "<<mdtSP.driftRadius()
66  <<", status: "<<static_cast<const xAOD::MdtDriftCircle*>(mdtSP.primaryMeasurement())->status()<<endmsg;
67  msg<<printLvl<<"segment: "<<Amg::toString(segPos) <<" + x "<<Amg::toString(segDir)<<","<<endmsg;
68  msg<<printLvl<<"residual: "<<Amg::toString(residual) <<", covariance: "<<std::endl
69  <<Amg::toString(mdtSP.covariance())<<std::endl<<", inverse: "
70  <<std::endl<<Amg::toString(mdtSP.covariance().inverse())<<", "<<endmsg;
71  msg<<printLvl<<"chi2 term: "<<chi2<<endmsg;
72  }
73  assert(chi2 >=0.);
74  return chi2;
75  }
76  double chiSqTermStrip(const Amg::Vector3D& segPos,
77  const Amg::Vector3D& segDir,
78  const MuonR4::SpacePoint& stripSP,
79  MsgStream& msg){
80  const Amg::Vector3D normal = stripSP.planeNormal();
81  std::optional<double> travelledDist = Amg::intersect<3>(segPos, segDir, normal, normal.dot(stripSP.positionInChamber()));
82  const Amg::Vector3D planeCrossing = segPos + travelledDist.value_or(0) * segDir;
83 
84  const Amg::Vector2D residual{(planeCrossing - stripSP.positionInChamber()).block<2,1>(0,0)};
85  const double chi2 = residual.dot(stripSP.covariance().inverse()* residual);
86  if (msg.level() <= printLvl) {
87  msg<<printLvl<<"Measurement "<<stripSP.msSector()->idHelperSvc()->toString(stripSP.identify())
88  <<", position: "<<Amg::toString(stripSP.positionInChamber())<<endmsg;
89  msg<<printLvl<<"Segment: "<<Amg::toString(segPos) <<" + x "<<Amg::toString(segDir)<<endmsg;
90  msg<<printLvl<<"Plane crossing: "<<Amg::toString(planeCrossing)<<", residual: "<<Amg::toString(residual)
91  <<", covariance: " <<std::endl<<Amg::toString(stripSP.covariance())<<", inverse: "
92  <<std::endl<<Amg::toString(stripSP.covariance().inverse())<<","<<endmsg;
93  msg<<printLvl<<"chi2 term: "<<chi2<<endmsg;
94  }
95  assert(chi2 >=0.);
96  return chi2;
97  }
98 
99  double chiSqTerm(const Amg::Vector3D& segPos, const Amg::Vector3D& segDir,
100  const double timeOffset, std::optional<double> arrivalTime,
101  const CalibratedSpacePoint& hit,
102  MsgStream& msg) {
103  double chi2{0.};
104  switch (hit.type()) {
106  chi2 = chiSqTermMdt(segPos, segDir, hit, msg);
107  break;
112  chi2 = chiSqTermStrip(segPos, segDir, timeOffset, arrivalTime, hit, msg);
113  break;
115  chi2 = chiSqTermBeamspot(segPos,segDir, hit, msg);
116  break;
117  default:
118  if (msg.level() <= MSG::WARNING) {
119  msg<<MSG::WARNING<<__FILE__<<":"<<__LINE__<<" - Unsupported measurement: "
121  }
122  }
123  return chi2;
124  }
125 
126  double chiSqTermMdt(const Amg::Vector3D& segPos,
127  const Amg::Vector3D& segDir,
128  const CalibratedSpacePoint& hit,
129  MsgStream& msg) {
131  if (hit.fitState() != State::Valid) return 0.;
132  const Amg::Vector3D& hitPos{hit.positionInChamber()};
133  const Amg::Vector3D& hitDir{hit.directionInChamber()};
134 
135  // Calculate the closest point along the segment to the wire
136  const Amg::Vector3D closePointSeg = segPos + Amg::intersect<3>(hitPos, hitDir, segPos, segDir).value_or(0)* segDir;
137  // Closest point along the wire to the segment
138  const Amg::Vector3D closePointWire = hitPos + hitDir.dot(closePointSeg - hitPos) * hitDir;
140  residual[Amg::x] = (hitPos - closePointSeg).x();
141  residual[Amg::y] = (closePointWire - closePointSeg).mag() - hit.driftRadius();
142  const double chi2{contract(inverse(hit.covariance()), residual)};
143  if (msg.level() <= printLvl) {
144  const SpacePoint* sp = hit.spacePoint();
145  msg<<printLvl<<"Calibrated measurement "<<sp->msSector()->idHelperSvc()->toString(sp->identify());
146  msg<<printLvl<<", position: "<<Amg::toString(hit.positionInChamber())<<", driftRadius: "<<hit.driftRadius()
147  <<", dimension: "<<sp->dimension()<<endmsg;
148  msg<<printLvl<<", segment: "<<Amg::toString(segPos) <<" + x "<<Amg::toString(segDir)<<endmsg;
149  msg<<printLvl<<", residual: "<<Amg::toString(residual)<<"/ "<<
150  (Amg::lineDistance<3>(hitPos, hitDir, segPos, segDir) -hit.driftRadius())<<std::endl <<", covariance: "<<std::endl
151  <<toString(hit.covariance())<<", inverse: "
152  <<std::endl<<toString(inverse(hit.covariance()))<<", "<<endmsg;
153  msg<<printLvl<<"Chi2 term: "<<chi2<<endmsg;
154  }
155  assert(chi2 >=0.);
156  return chi2;
157  }
158  double chiSqTermStrip(const Amg::Vector3D& segPos,
159  const Amg::Vector3D& segDir,
160  const double offsetTime,
161  std::optional<double> arrivalTime,
162  const CalibratedSpacePoint& strip,
163  MsgStream& msg) {
164 
166  if (strip.fitState() != State::Valid) return 0.;
167 
168  const SpacePoint* spacePoint = strip.spacePoint();
169  const Amg::Vector3D normal = spacePoint->planeNormal();
170  std::optional<double> travelledDist = Amg::intersect<3>(segPos, segDir, normal, normal.dot(spacePoint->positionInChamber()));
171  const Amg::Vector3D planeCrossing = segPos + travelledDist.value_or(0) * segDir;
172  Amg::Vector3D residual{(planeCrossing - strip.positionInChamber())};
173  if (strip.measuresTime() && arrivalTime) {
174  residual[Amg::z] = strip.time() - (*arrivalTime) - travelledDist.value_or(0) * c_inv - offsetTime;
175  } else {
176  residual[Amg::z] = 0;
177  }
178  const double chi2 = contract(inverse(strip.covariance()), residual);
179  if (msg.level() <= printLvl) {
180  msg<<printLvl<<"Calibrated measurement "<<spacePoint->msSector()->idHelperSvc()->toString(spacePoint->identify())
181  <<", position: "<<Amg::toString(strip.positionInChamber())<<endmsg;
182  msg<<printLvl<<"Segment: "<<Amg::toString(segPos) <<" + x "<<Amg::toString(segDir)<<endmsg;
183  msg<<printLvl<<"Plane crossing: "<<Amg::toString(planeCrossing)<<", residual: "<<Amg::toString(residual)
184  <<", covariance: "<<std::endl<<toString(strip.covariance())<<", inverse: "
185  <<std::endl<<toString(inverse(strip.covariance()))<<endmsg;
186  msg<<printLvl<<" -- final chi2 term: "<<chi2<<endmsg;
187  }
188  assert(chi2 >=0.);
189  return chi2;
190  }
191  double chiSqTermBeamspot(const Amg::Vector3D& segPos,
192  const Amg::Vector3D& segDir,
193  const CalibratedSpacePoint& beamSpotMeas,
194  MsgStream& msg) {
195 
197  if (beamSpotMeas.fitState() != State::Valid) return 0.;
198  const Amg::Vector3D planeCrossing{segPos + Amg::intersect<3>(segPos, segDir, Amg::Vector3D::UnitZ(),
199  beamSpotMeas.positionInChamber().z()).value_or(0) * segDir};
200 
201  const Amg::Vector2D residual = (planeCrossing - beamSpotMeas.positionInChamber()).block<2,1>(0,0);
202  const double chi2 = contract(inverse(beamSpotMeas.covariance()), residual);
203  if (msg.level() <= printLvl) {
204  msg<<printLvl<<"Print beamspot constraint "<<Amg::toString(beamSpotMeas.positionInChamber())<<endmsg;
205  msg<<printLvl<<"Segment: "<<Amg::toString(segPos) <<" + x "<<Amg::toString(segDir)<<endmsg;
206  msg<<printLvl<<"Plane crossing: "<<Amg::toString(planeCrossing)<<", residual: "<<Amg::toString(residual)
207  <<", covariance: "<<std::endl<<toString(beamSpotMeas.covariance())<<std::endl
208  <<", inverse: "<<std::endl<<toString(inverse(beamSpotMeas.covariance()))<<std::endl
209  <<"chi2 term: "<<chi2<<endmsg;
210  }
211  return chi2;
212  }
213  std::vector<int> driftSigns(const Amg::Vector3D& segPos,
214  const Amg::Vector3D& segDir,
215  const std::vector<const SpacePoint*>& uncalibHits,
216  MsgStream& msg) {
217 
218  std::vector<int> signs{};
219  signs.reserve(uncalibHits.size());
220  for (const SpacePoint* sp : uncalibHits) {
221  signs.push_back( sp ? driftSign(segPos,segDir, *sp, msg) : 0);
222  }
223  return signs;
224  }
225  std::vector<int> driftSigns(const Amg::Vector3D& segPos, const Amg::Vector3D& segDir,
226  const std::vector<std::unique_ptr<CalibratedSpacePoint>>& calibHits,
227  MsgStream& msg) {
228  std::vector<int> signs{};
229  signs.reserve(calibHits.size());
230  for (const std::unique_ptr<CalibratedSpacePoint>& hit : calibHits) {
231  signs.push_back(driftSign(segPos,segDir, *hit, msg));
232  }
233  return signs;
234  }
235  int driftSign(const Amg::Vector3D& segPos, const Amg::Vector3D& segDir,
236  const SpacePoint& sp, MsgStream& msg) {
238  return 0;
239  }
240  const double signedDist = Amg::signedDistance(segPos, segDir, sp.positionInChamber(), sp.directionInChamber());
241  if (msg.level() <= printLvl) {
242  msg<<printLvl<<"Hit "<<sp.msSector()->idHelperSvc()->toString(sp.identify())<<" drift radius "<<sp.driftRadius()
243  <<", signed distance: "<<signedDist<<", unsigned distance: "
244  <<Amg::lineDistance<3>(segPos, segDir, sp.positionInChamber(), sp.directionInChamber())<<endmsg;
245  }
246  return sign(signedDist);
247  }
248  int driftSign(const Amg::Vector3D& segPos, const Amg::Vector3D& segDir,
249  const CalibratedSpacePoint& calibHit, MsgStream& msg) {
251  return 0;
252  }
253  const double signedDist = Amg::signedDistance(segPos, segDir, calibHit.positionInChamber(), calibHit.directionInChamber());
254  if (msg.level() <= printLvl) {
255  const SpacePoint* sp = calibHit.spacePoint();
256  msg<<printLvl<<"Hit "<<sp->msSector()->idHelperSvc()->toString(sp->identify())<<" drift radius "<<calibHit.driftRadius()
257  <<", signed distance: "<<signedDist<<", unsigned distance: "
258  <<Amg::lineDistance<3>(segPos, segDir, calibHit.positionInChamber(), calibHit.directionInChamber())<<endmsg;
259  }
260  return sign(signedDist);
261  }
262  }
263 }
MuonR4::SegmentFitHelpers::driftSigns
std::vector< int > driftSigns(const Amg::Vector3D &posInChamber, const Amg::Vector3D &dirInChamber, const std::vector< const SpacePoint * > &uncalibHits, MsgStream &msg)
Calculates whether a segment line travereses the tube measurements on the left (-1) or right (1) side...
Definition: SegmentFitHelperFunctions.cxx:213
MuonR4::SpacePoint::msSector
const MuonGMR4::SpectrometerSector * msSector() const
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/SpacePoint.cxx:116
MuonR4::SpacePoint::type
xAOD::UncalibMeasType type() const
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/SpacePoint.cxx:131
ClusterSeg::residual
@ residual
Definition: ClusterNtuple.h:20
Amg::Vector2D
Eigen::Matrix< double, 2, 1 > Vector2D
Definition: GeoPrimitives.h:48
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
Amg::y
@ y
Definition: GeoPrimitives.h:35
xAOD::UncalibMeasType::MMClusterType
@ MMClusterType
xAOD::UncalibMeasType::sTgcStripType
@ sTgcStripType
MuonR4::SegmentFitHelpers::chiSqTerm
double chiSqTerm(const Amg::Vector3D &posInChamber, const Amg::Vector3D &dirInChamber, const SpacePoint &measurement, MsgStream &msg)
Calculates the chi2 contribuation to a linear segment line from an uncalibrated measurement.
Definition: SegmentFitHelperFunctions.cxx:28
x
#define x
MatrixUtils.h
MuonR4::toString
std::string toString(const CalibratedSpacePoint::Covariance_t &mat)
Returns the matrix in string.
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/UtilFunctions.cxx:75
xAOD::UncalibMeasType::TgcStripType
@ TgcStripType
MuonR4::SpacePoint::primaryMeasurement
const xAOD::UncalibratedMeasurement * primaryMeasurement() const
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/SpacePoint.cxx:107
CalibratedSpacePoint.h
MuonR4::SegmentFitHelpers::driftSign
int driftSign(const Amg::Vector3D &posInChamber, const Amg::Vector3D &dirInChamber, const SpacePoint &uncalibHit, MsgStream &msg)
Calculates whether a segement line travereses the tube measurement on the left (-1) or right (1) side...
Definition: SegmentFitHelperFunctions.cxx:235
Amg::z
@ z
Definition: GeoPrimitives.h:36
MuonR4::SegmentFitHelpers::chiSqTermStrip
double chiSqTermStrip(const Amg::Vector3D &posInChamber, const Amg::Vector3D &dirInChamber, const SpacePoint &measurement, MsgStream &msg)
Calculates the chi2 contribuation to a linear segment line from an uncalibrated strip measurement.
Definition: SegmentFitHelperFunctions.cxx:76
Amg::toString
std::string toString(const Translation3D &translation, int precision=4)
GeoPrimitvesToStringConverter.
Definition: GeoPrimitivesToStringConverter.h:40
MuonR4::SegmentFitHelpers::chiSqTermMdt
double chiSqTermMdt(const Amg::Vector3D &posInChamber, const Amg::Vector3D &dirInChamber, const SpacePoint &measurement, MsgStream &msg)
Calculates the chi2 contribuation to a linear segment line from an uncalibrated Mdt measurement.
Definition: SegmentFitHelperFunctions.cxx:52
endmsg
#define endmsg
Definition: AnalysisConfig_Ntuple.cxx:63
MuonR4::inverse
CalibratedSpacePoint::Covariance_t inverse(const CalibratedSpacePoint::Covariance_t &mat)
Inverts the parsed matrix.
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/UtilFunctions.cxx:65
UtilFunctions.h
SegmentFitHelperFunctions.h
Amg::x
@ x
Definition: GeoPrimitives.h:34
chi2
double chi2(TH1 *h0, TH1 *h1)
Definition: comparitor.cxx:525
MuonR4::CalibratedSpacePoint::State
State
State flag to distinguish different space point states.
Definition: CalibratedSpacePoint.h:24
xAOD::Other
@ Other
MuonR4::CalibratedSpacePoint::type
xAOD::UncalibMeasType type() const
Returns the space point type.
Definition: CalibratedSpacePoint.cxx:36
MdtDriftCircle.h
MuonR4::CalibratedSpacePoint::State::Valid
@ Valid
MuonR4::SpacePoint
The muon space point is the combination of two uncalibrated measurements one of them measures the eta...
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/MuonSpacePoint/SpacePoint.h:18
MuonR4::SpacePoint::directionInChamber
const Amg::Vector3D & directionInChamber() const
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/SpacePoint.cxx:122
MuonR4::sign
constexpr double sign(const double x)
Returns the sign of a number.
Definition: MatrixUtils.h:11
MuonGMR4::SpectrometerSector::idHelperSvc
const Muon::IMuonIdHelperSvc * idHelperSvc() const
Returns the IdHelpeSvc.
Definition: SpectrometerSector.cxx:40
MuonR4::CalibratedSpacePoint::fitState
State fitState() const
Returns the state of the calibrated space point.
Definition: CalibratedSpacePoint.cxx:55
MuonR4::CalibratedSpacePoint::positionInChamber
const Amg::Vector3D & positionInChamber() const
The position of the calibrated space point inside the chamber.
Definition: CalibratedSpacePoint.cxx:21
python.PhysicalConstants.c_light
float c_light
Definition: PhysicalConstants.py:63
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
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
SegmentFitterEventData.h
Muon::IMuonIdHelperSvc::toString
virtual std::string toString(const Identifier &id) const =0
print all fields to string
GeoPrimitivesHelpers.h
MuonR4::CalibratedSpacePoint
The calibrated Space point is created during the calibration process.
Definition: CalibratedSpacePoint.h:15
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
AthMessaging.h
Amg::signedDistance
double signedDistance(const Amg::Vector3D &posA, const Amg::Vector3D &dirA, const Amg::Vector3D &posB, const Amg::Vector3D &dirB)
Calculates the signed distance between two lines in 3D space.
Definition: GeoPrimitivesHelpers.h:329
MuonR4::SpacePoint::driftRadius
double driftRadius() const
: Returns the size of the drift radius
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/SpacePoint.cxx:143
merge.status
status
Definition: merge.py:17
MuonR4::CalibratedSpacePoint::covariance
const Covariance_t & covariance() const
Definition: CalibratedSpacePoint.cxx:33
python.Constants.VERBOSE
int VERBOSE
Definition: Control/AthenaCommon/python/Constants.py:13
xAOD::MdtDriftCircle_v1
https://gitlab.cern.ch/atlas/athena/-/blob/master/MuonSpectrometer/MuonReconstruction/MuonRecEvent/Mu...
Definition: MdtDriftCircle_v1.h:21
MuonR4::CalibratedSpacePoint::spacePoint
const SpacePoint * spacePoint() const
The pointer to the space point out of which this space point has been built.
Definition: CalibratedSpacePoint.cxx:18
MuonR4::CalibratedSpacePoint::directionInChamber
const Amg::Vector3D & directionInChamber() const
The direction of the calibrated space point inside the chamber.
Definition: CalibratedSpacePoint.cxx:24
xAOD::UncalibMeasType::RpcStripType
@ RpcStripType
MuonR4::CalibratedSpacePoint::driftRadius
double driftRadius() const
The drift radius of the calibrated space point.
Definition: CalibratedSpacePoint.cxx:27
python.AutoConfigFlags.msg
msg
Definition: AutoConfigFlags.py:7
xAOD::UncalibMeasType::MdtDriftCircleType
@ MdtDriftCircleType
mag
Scalar mag() const
mag method
Definition: AmgMatrixBasePlugin.h:26
MuonR4::SpacePoint::identify
const Identifier & identify() const
: Identifier of the primary measurement
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/SpacePoint.cxx:140
generate::Zero
void Zero(TH1D *hin)
Definition: generate.cxx:32
MuonR4::SegmentFitHelpers::chiSqTermBeamspot
double chiSqTermBeamspot(const Amg::Vector3D &posInChamber, const Amg::Vector3D &dirInChamber, const CalibratedSpacePoint &beamSpotMeas, MsgStream &msg)
Calculates the chi2 contribution from an external beam spot constraint.
Definition: SegmentFitHelperFunctions.cxx:191
MuonR4::contract
double contract(const CalibratedSpacePoint::Covariance_t &mat, const Amg::Vector3D &a, const Amg::Vector3D &b)
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonSpacePoint/src/UtilFunctions.cxx:13