709 std::vector<std::unique_ptr<const Trk::TrackStateOnSurface>>
states;
710 std::set<IdentifierHash> newMdtHashes;
711 std::set<IdentifierHash> newRpcHashes;
712 std::set<IdentifierHash> newTgcHashes;
713 std::set<IdentifierHash> newCscHashes;
715 std::set<IdentifierHash> newMMHashes;
716 std::set<IdentifierHash> newsTgcHashes;
718 ATH_MSG_DEBUG(
"Adding Missing MDT chambers: regions " <<
data.mdtPerStation.size());
719 std::vector<const MdtPrepDataCollection*> newmcols;
720 for (
const auto& chit :
data.mdtPerStation) {
722 std::vector<const MdtPrepDataCollection*>
cols;
724 std::map<int, std::vector<const MdtPrepData*>> mdtPrds;
725 std::unique_ptr<const Trk::TrackParameters> exParsFirst;
727 std::unique_ptr<const Trk::TrackParameters> exPars{
reachableDetEl(ctx,
track, *mit->front()->detectorElement())};
731 <<
" sector " << sector);
732 newmcols.emplace_back(mit);
733 std::vector<const MdtPrepData*>& col = mdtPrds[sector];
734 col.insert(col.end(), mit->begin(), mit->end());
735 if (!exParsFirst) exParsFirst.swap(exPars);
739 << mit->identifyHash());
742 std::vector<const MdtPrepData*>* prds =
nullptr;
743 std::map<int, std::vector<const MdtPrepData*>>
::iterator sectorIt = mdtPrds.begin();
744 if (mdtPrds.empty()) {
746 }
else if (mdtPrds.size() == 1) {
747 prds = §orIt->second;
750 ATH_MSG_VERBOSE(
"Multiple sectors selected, using main sector: " << hitSummary.mainSector);
751 std::map<int, std::vector<const MdtPrepData*>>
::iterator pos = mdtPrds.find(hitSummary.mainSector);
752 if (
pos != mdtPrds.end())
755 ATH_MSG_DEBUG(
"Failed to find prds in main sector: " << hitSummary.mainSector);
758 if (prds && exParsFirst) {
759 std::unique_ptr<Trk::SegmentCollection> segments =
m_seededSegmentFinder->find(ctx, *exParsFirst, *prds);
764 std::unique_ptr<const Trk::TrackParameters> bestSegmentPars;
776 std::unique_ptr<const Trk::TrackParameters> segPars{
m_extrapolator->extrapolateDirectly(
781 mseg->associatedSurface().globalToLocalDirection(segPars->momentum(),
locDir);
782 double dangleYZ = mseg->localDirection().angleYZ() -
locDir.angleYZ();
784 if (std::abs(dangleYZ) < 0.05) {
786 bestSegmentPars.swap(segPars);
794 std::unique_ptr<Trk::TrackParameters> hitPars{
m_extrapolator->extrapolateDirectly(
797 std::bitset<Trk::TrackStateOnSurface::NumberOfTrackStateOnSurfaceTypes> typePattern;
801 states.emplace_back(tsos);
802 const MdtDriftCircleOnTrack* mdt =
dynamic_cast<const MdtDriftCircleOnTrack*
>(hit);
803 if (mdt) newMdtHashes.insert(mdt->collectionHash());
812 data.mdtCols = std::move(newmcols);
814 unsigned int nstates =
states.size();
817 std::vector<const RpcPrepDataCollection*> newtcols;
819 std::unique_ptr<const Trk::TrackParameters> exPars{
reachableDetEl(ctx,
track, *(rit)->front()->detectorElement())};
821 newtcols.emplace_back(rit);
823 std::set<Identifier> layIds;
825 if (
states.size() != nstates) {
827 newRpcHashes.insert(rit->identifyHash());
831 data.rpcCols = std::move(newtcols);
835 std::vector<const TgcPrepDataCollection*> newtcols;
837 std::unique_ptr<const Trk::TrackParameters> exPars{
reachableDetEl(ctx,
track, *(tgcit)->front()->detectorElement())};
839 newtcols.emplace_back(tgcit);
841 std::set<Identifier> layIds;
843 if (
states.size() != nstates) {
845 newTgcHashes.insert(tgcit->identifyHash());
849 data.tgcCols = std::move(newtcols);
853 std::vector<const CscPrepDataCollection*> newccols;
855 std::unique_ptr<const Trk::TrackParameters> exPars{
reachableDetEl(ctx,
track, *(cit)->front()->detectorElement())};
857 newccols.push_back(cit);
859 std::set<Identifier> layIds;
861 if (
states.size() != nstates) {
863 newCscHashes.insert(cit->identifyHash());
867 data.cscCols = std::move(newccols);
872 std::vector<const sTgcPrepDataCollection*> newstcols;
873 ATH_MSG_DEBUG(
" extractsTgcPrdCols data.stgcCols.size() " <<
data.stgcCols.size());
875 std::unique_ptr<const Trk::TrackParameters> exPars{
reachableDetEl(ctx,
track, *(stgcit)->front()->detectorElement())};
877 newstcols.push_back(stgcit);
879 std::set<Identifier> layIds;
882 if (
states.size() != nstates) {
884 newsTgcHashes.insert(stgcit->identifyHash());
888 data.stgcCols = std::move(newstcols);
894 std::vector<const MMPrepDataCollection*> newmcols;
896 std::unique_ptr<const Trk::TrackParameters> exPars{
reachableDetEl(ctx,
track, *mit->front()->detectorElement())};
898 newmcols.push_back(mit);
900 std::set<Identifier> layIds;
903 if (
states.size() != nstates) {
905 newMMHashes.insert(mit->identifyHash());
909 data.mmCols = std::move(newmcols);
926 auto trackStateOnSurfaces = std::make_unique<Trk::TrackStates>();
927 trackStateOnSurfaces->reserve(
states.size());
928 for (std::unique_ptr<const Trk::TrackStateOnSurface>&
sorted :
states) { trackStateOnSurfaces->push_back(
sorted.release()); }
930 std::unique_ptr<Trk::Track> newTrack = std::make_unique<Trk::Track>(
track.info(), std::move(trackStateOnSurfaces),
931 track.fitQuality() ?
track.fitQuality()->uniqueClone() :
nullptr);
932 std::unique_ptr<Trk::Track> refittedTrack;
941 data.mdtTrack.insert(newMdtHashes.begin(), newMdtHashes.end());
942 data.rpcTrack.insert(newRpcHashes.begin(), newRpcHashes.end());
943 data.tgcTrack.insert(newTgcHashes.begin(), newTgcHashes.end());
944 data.cscTrack.insert(newCscHashes.begin(), newCscHashes.end());
946 data.stgcTrack.insert(newsTgcHashes.begin(), newsTgcHashes.end());
947 data.mmTrack.insert(newMMHashes.begin(), newMMHashes.end());
949 return refittedTrack;