5 #include <Acts/Utilities/Enumerate.hpp>
12 m_cfg{std::move(
cfg)} {}
15 return segment.
chi2() / segment.
nDoF();
20 std::ranges::stable_sort(toResolve,[
this](
const SegmentVec::value_type&
a,
21 const SegmentVec::value_type&
b){
25 return a->nDoF() >
b->nDoF();
27 return redChi2A < redChi2B;
32 resolved.push_back(std::move(toResolve[0]));
33 toResolve.erase(toResolve.begin());
34 std::vector<std::vector<int>> segmentSigns{
driftSigns(gctx, *resolved.front(), resolved.front()->measurements())};
35 std::vector<MeasurementSet> segMeasurements{
extractPrds(*resolved.front())};
37 for (std::unique_ptr<Segment>& resolveMe : toResolve) {
39 <<
" redChi2: "<<
redChi2(*resolveMe)<<
" nDoF: "<<resolveMe->nDoF());
43 unsigned resolvedIdx{0};
44 for (std::unique_ptr<Segment>& goodSeg : resolved) {
46 <<
" redChi2: "<<
redChi2(*goodSeg)<<
" nDoF: "<<goodSeg->nDoF());
48 std::vector<int>& existSigns{segmentSigns[resolvedIdx++]};
56 const std::vector<int> reEvaluatedSigns{
driftSigns(gctx, *resolveMe, goodSeg->measurements())};
58 unsigned sameSides{0};
59 for (
unsigned s =0 ;
s < existSigns.size(); ++
s) {
60 sameSides += (reEvaluatedSigns[
s] == existSigns[
s]);
63 if (!
m_cfg.
remLeftRightAmbi && sameSides != existSigns.size() && resolveMe->nDoF() == goodSeg->nDoF()) {
64 ATH_MSG_VERBOSE(
"Reference signs: "<<existSigns<<
" / re-evaluated: "<<reEvaluatedSigns);
67 const double resolvedChi2 =
redChi2(*goodSeg);
68 const double resolveMeChi2 =
redChi2(*resolveMe);
71 ATH_MSG_VERBOSE(
"Chi2 good "<<resolvedChi2<<
", candidate chi2: "<<resolveMeChi2);
80 existSigns =
driftSigns(gctx, *resolveMe, resolveMe->measurements());
88 segMeasurements.push_back(std::move(testMeas));
89 segmentSigns.push_back(
driftSigns(gctx, *resolveMe, resolveMe->measurements()));
90 resolved.push_back(std::move(resolveMe));
102 return SeedingAux::strawSigns(
pos,
dir, measurements);
108 for (
const Segment::MeasVec::value_type& hit : segment.
measurements()) {
112 meas.insert(hit->spacePoint()->primaryMeasurement());
113 if (hit->spacePoint()->secondaryMeasurement()) {
114 meas.insert(hit->spacePoint()->secondaryMeasurement());
121 if (measSet1.size() > measSet2.size()) {
123 return measSet1.count(meas);
127 return measSet2.count(meas);