ATLAS Offline Software
SegmentAmbiSolver.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
6 
7 namespace MuonR4 {
10 
12  AthMessaging{name} {}
13 
14 
16  SegmentVec&& toResolve) const {
17 
18  std::ranges::stable_sort(toResolve,[](const std::unique_ptr<Segment>& a,
19  const std::unique_ptr<Segment>&b){
20  const double redChi2A = a->chi2() / a->nDoF();
21  const double redChi2B = b->chi2() / b->nDoF();
22  if (redChi2A < 5. && redChi2B < 5.){
23  return a->nDoF() > b->nDoF();
24  }
25  return redChi2A < redChi2B;
26  });
27  SegmentVec resolved{};
29  resolved.push_back(std::move(toResolve[0]));
30  std::vector<MeasByLayerMap> resolvedPrds{extractPrds(*resolved[0])};
31  toResolve.erase(toResolve.begin());
32  for (std::unique_ptr<Segment>& resolveMe : toResolve) {
33  MeasByLayerMap testPrds{extractPrds(*resolveMe)};
34 
36 
37  unsigned int prdPointer{0};
38  for (std::unique_ptr<Segment>& reference : resolved) {
39  MeasByLayerMap& refPrds{resolvedPrds[prdPointer++]};
40  std::vector<const SpacePoint*> overlaps{};
41  overlaps.reserve(testPrds.size());
42  for (auto& [layerId, spacePoint] : testPrds) {
43  MeasByLayerMap::const_iterator ref_itr = refPrds.find(layerId);
44  if (ref_itr == refPrds.end() || ref_itr->second != spacePoint){
45  continue;
46  }
47  overlaps.push_back(spacePoint);
48  }
49  if (overlaps.empty()) {
50  continue;
51  }
52  std::vector<int> signRef{driftSigns(gctx, *reference, overlaps)},
53  signTest{driftSigns(gctx, *resolveMe, overlaps)};
55  unsigned int diffSites{0};
56  for (unsigned sIdx = 0; sIdx < signRef.size(); ++sIdx) {
57  diffSites += signRef[sIdx] != signTest[sIdx];
58  }
59  ATH_MSG_VERBOSE("Signs reference: "<<signRef<<", signs test: "<<signTest);
60  if (signRef.size() - diffSites <= 1 && testPrds.size() == refPrds.size()) {
61  ATH_MSG_VERBOSE("Both segments are describing different solutions.");
62  continue;
63  }
64  if (overlaps.size() == testPrds.size()) {
65  ATH_MSG_VERBOSE("The test segment is a subset of the reference.");
66  reso = Resolution::subSet;
67  break;
68  } else if (overlaps.size() == refPrds.size()) {
69  ATH_MSG_VERBOSE("The test segment is a superset of the reference.");
70  reso = Resolution::superSet;
71  refPrds = std::move(testPrds);
72  reference = std::move(resolveMe);
73  break;
74  }
75  }
76  if(reso == Resolution::noOverlap) {
77  resolved.push_back(std::move(resolveMe));
78  resolvedPrds.push_back(std::move(testPrds));
79  }
80 
81  }
82  return resolved;
83  }
85  MeasByLayerMap prds{};
86  const Muon::IMuonIdHelperSvc* idHelperSvc = segment.chamber()->idHelperSvc();
87  for (const Segment::MeasType& meas : segment.measurements()) {
88  if(meas->fitState() != CalibratedSpacePoint::State::Valid ||
89  !meas->spacePoint()) {
90  continue;
91  }
92  const Identifier layerId = idHelperSvc->layerId(meas->spacePoint()->identify());
93  auto insert_itr = prds.insert(std::make_pair(layerId, meas->spacePoint()));
94  if (!insert_itr.second) {
95  ATH_MSG_WARNING("Layer "<<idHelperSvc->toString(layerId)
96  <<" has already meaasurement "<<idHelperSvc->toString(insert_itr.first->second->identify())
97  <<". Cannot add "<<idHelperSvc->toString(meas->spacePoint()->identify())<<" for ambiguity resolution.");
98  }
99  }
100  return prds;
101  }
102 
104  const Segment& segment,
105  const std::vector<const SpacePoint*>& measurements) const {
106 
107  const Amg::Transform3D globToLoc{segment.chamber()->globalToLocalTrans(gctx)};
108  return SegmentFitHelpers::driftSigns(globToLoc*segment.position(),
109  globToLoc.linear() * segment.direction(), measurements, msg());
110  }
111 }
MuonR4::SegmentFitHelpers::driftSigns
std::vector< int > driftSigns(const Amg::Vector3D &posInChamber, const Amg::Vector3D &dirInChamber, const std::vector< HoughHitType > &uncalibHits, MsgStream &msg)
Calculates whether a segement line travereses the tube measurements on the left (-1) or right (1) sid...
Definition: SegmentFitHelperFunctions.cxx:210
MuonR4::Segment
Placeholder for what will later be the muon segment EDM representation.
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonPatternEvent/MuonPatternEvent/Segment.h:19
MuonR4::SegmentAmbiSolver::driftSigns
std::vector< int > driftSigns(const ActsGeometryContext &gctx, const Segment &segment, const std::vector< const SpacePoint * > &measurements) const
Definition: SegmentAmbiSolver.cxx:103
reference
Definition: hcg.cxx:437
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
MuonR4::Segment::MeasType
std::unique_ptr< CalibratedSpacePoint > MeasType
Definition: MuonSpectrometer/MuonPhaseII/Event/MuonPatternEvent/MuonPatternEvent/Segment.h:22
MuonR4::SegmentAmbiSolver::Resolution::noOverlap
@ noOverlap
Muon::IMuonIdHelperSvc::layerId
virtual Identifier layerId(const Identifier &id) const =0
create a layer ID, returns tube id for the MDTs
SegmentFitHelperFunctions.h
Amg::Transform3D
Eigen::Affine3d Transform3D
Definition: GeoPrimitives.h:46
MuonR4::SegmentAmbiSolver::resolveAmbiguity
SegmentVec resolveAmbiguity(const ActsGeometryContext &gctx, SegmentVec &&toResolve) const
Definition: SegmentAmbiSolver.cxx:15
AthMessaging
Class to provide easy MsgStream access and capabilities.
Definition: AthMessaging.h:55
AthMessaging::msg
MsgStream & msg() const
The standard message stream.
Definition: AthMessaging.h:164
ActsGeometryContext
Include the GeoPrimitives which need to be put first.
Definition: ActsGeometryContext.h:27
MuonR4::CalibratedSpacePoint::State::Valid
@ Valid
MuonR4::SegmentAmbiSolver::MeasByLayerMap
std::unordered_map< Identifier, const SpacePoint * > MeasByLayerMap
Definition: SegmentAmbiSolver.h:33
MuonR4::SegmentAmbiSolver::Resolution::subSet
@ subSet
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:221
plotBeamSpotMon.b
b
Definition: plotBeamSpotMon.py:77
MuonR4::SegmentAmbiSolver::extractPrds
MeasByLayerMap extractPrds(const Segment &segment) const
Definition: SegmentAmbiSolver.cxx:84
MuonR4::MeasByLayerMap
SegmentAmbiSolver::MeasByLayerMap MeasByLayerMap
Definition: SegmentAmbiSolver.cxx:8
MuonR4::SegmentAmbiSolver::SegmentAmbiSolver
SegmentAmbiSolver(const std::string &name)
Definition: SegmentAmbiSolver.cxx:11
MuonR4::SegmentAmbiSolver::SegmentVec
std::vector< std::unique_ptr< Segment > > SegmentVec
Definition: SegmentAmbiSolver.h:22
SegmentAmbiSolver.h
MuonR4
This header ties the generic definitions in this package.
Definition: HoughEventData.h:16
MuonR4::SegmentVec
SegmentAmbiSolver::SegmentVec SegmentVec
Definition: SegmentAmbiSolver.cxx:9
a
TList * a
Definition: liststreamerinfos.cxx:10
Muon::IMuonIdHelperSvc::toString
virtual std::string toString(const Identifier &id) const =0
print all fields to string
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
if
if(febId1==febId2)
Definition: LArRodBlockPhysicsV0.cxx:569
Muon::IMuonIdHelperSvc
Interface for Helper service that creates muon Identifiers and can be used to print Identifiers.
Definition: IMuonIdHelperSvc.h:26
MuonR4::SegmentAmbiSolver::Resolution
Resolution
Definition: SegmentAmbiSolver.h:27
MuonR4::SegmentAmbiSolver::Resolution::superSet
@ superSet
NSWL1::PadTriggerAdapter::segment
Muon::NSW_PadTriggerSegment segment(const NSWL1::PadTrigger &data)
Definition: PadTriggerAdapter.cxx:5
Identifier
Definition: IdentifierFieldParser.cxx:14