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();
25 return redChi2A < redChi2B;
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) {
37 unsigned int prdPointer{0};
38 for (std::unique_ptr<Segment>&
reference : resolved) {
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){
47 overlaps.push_back(spacePoint);
49 if (overlaps.empty()) {
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];
59 ATH_MSG_VERBOSE(
"Signs reference: "<<signRef<<
", signs test: "<<signTest);
60 if (signRef.size() - diffSites <= 1 && testPrds.size() == refPrds.size()) {
64 if (overlaps.size() == testPrds.size()) {
68 }
else if (overlaps.size() == refPrds.size()) {
71 refPrds = std::move(testPrds);
77 resolved.push_back(std::move(resolveMe));
78 resolvedPrds.push_back(std::move(testPrds));
89 !meas->spacePoint()) {
93 auto insert_itr = prds.insert(std::make_pair(layerId, meas->spacePoint()));
94 if (!insert_itr.second) {
96 <<
" has already meaasurement "<<idHelperSvc->
toString(insert_itr.first->second->identify())
97 <<
". Cannot add "<<idHelperSvc->
toString(meas->spacePoint()->identify())<<
" for ambiguity resolution.");
105 const std::vector<const SpacePoint*>& measurements)
const {
109 globToLoc.linear() *
segment.direction(), measurements,
msg());