27 template<
typename T,
size_t N>
29 operator += (std::array<T, N>& a1,
const std::array<T, N>& a2) {
40 m_trackName(
"Tracks"),
42 m_extensionMapName(
"TrackExtensionMap"),
43 m_newTrackName(
"ExtendedTrack"),
44 m_trackFitter(
"Trk::KalmanFitter/InDetTrackFitter"),
45 m_scoringTool(
"Trk::TrackScoringTool"),
47 m_keepFailedExtensionOnTrack(true),
50 m_suppressHoleSearch(false),
54 m_etabounds{0.8, 1.6, 2.10} {
56 declareProperty(
"TrackName", m_trackName,
"Name of the input Trackcollection");
57 declareProperty(
"Cosmics", m_cosmics,
"switch whether we are running on cosmics");
58 declareProperty(
"ExtensionMap", m_extensionMapName,
"Name of the input extension map");
59 declareProperty(
"NewTrackName", m_newTrackName,
"Name of the output Trackcollection");
60 declareProperty(
"TrackFitter", m_trackFitter,
"Toolhandle for the track fitter");
61 declareProperty(
"ScoringTool", m_scoringTool,
"Toolhandle for the track scorer");
62 declareProperty(
"runOutlier", m_runOutlier,
"switch whether to run outlier logics or not");
64 "switch whether to keep failed extension as outlier hits on the new track");
65 declareProperty(
"RefitPrds", m_refitPrds,
"switch whether to do the fit with re-calibrated clusters (true) or not");
66 declareProperty(
"matEffects", m_matEffects,
"particle hypothesis to assume for material effects in track fit");
67 declareProperty(
"suppressHoleSearch", m_suppressHoleSearch,
"suppressing hole search for comparison");
68 declareProperty(
"tryBremFit", m_tryBremFit =
false,
"brem recover mode");
69 declareProperty(
"caloSeededBrem", m_caloSeededBrem =
false,
"calo seeded brem recovery");
70 declareProperty(
"pTminBrem", m_pTminBrem = 1000.,
"min pT for trying a brem recovery");
71 declareProperty(
"etaBounds", m_etabounds,
"eta intervals for internal monitoring");
94 return StatusCode::SUCCESS;
106 const auto nTracks {tracks->size()};
113 ATH_CHECK(extendedTracksResult.
record(std::unique_ptr<TrackCollection>(
116 <<
"' recorded in StoreGate, size : "
117 << extendedTracksResult->
size());
118 if (extendedTracksResult->
size() != nTracks)
ATH_MSG_WARNING(
"Lost tracks after extension ??? This is a bug !");
119 return StatusCode::SUCCESS;
126 std::unique_ptr<TrackCollection> newTracks(std::make_unique<TrackCollection>());
127 std::array< std::array<std::atomic<int>,
Nregions>,
nTypes> counters{};
129 for (
const Trk::Track* thisTrack : *pTracks) {
134 TrackExtensionMap::const_iterator pThisExtensionPair = trackExtensionMap->find(thisTrack);
136 if (pThisExtensionPair == trackExtensionMap->end()) {
137 ATH_MSG_DEBUG(
"track not in extension map, copy original track to output");
139 std::unique_ptr<Trk::Track> ntrk(std::make_unique<Trk::Track>(*thisTrack));
145 ATH_MSG_DEBUG(
"track found in extension map, processing...");
149 std::unique_ptr<Trk::Track> newtrack;
153 const auto nRIO_OnTrack {pThisExtensionPair->second.size()};
154 std::vector<const Trk::PrepRawData*> vecPrd;
155 vecPrd.reserve(nRIO_OnTrack);
162 const auto& theRIOs_OnTrack {pThisExtensionPair->second};
164 std::transform(theRIOs_OnTrack.begin(), theRIOs_OnTrack.end(), std::back_inserter(vecPrd), getPrepRawDataPtr);
166 ATH_MSG_DEBUG(
"fit track " << thisTrack <<
" with PRDs, number : " << vecPrd.size());
184 thisTrack->trackParameters()->front()->pT() >
m_pTminBrem &&
187 ATH_MSG_DEBUG(
"normal fit track failed, try to recover with brem fit");
196 std::vector<const Trk::PrepRawData*> vecPrdComb;
198 const Trk::Perigee* siPerigee = thisTrack->perigeeParameters();
204 std::unique_ptr<Trk::Track> ntrk(std::make_unique< Trk::Track>(*thisTrack));
210 pThisExtensionPair->first->measurementsOnTrack()->
begin();
211 for (; RIOit != pThisExtensionPair->first->measurementsOnTrack()->
end(); ++RIOit) {
213 if (!rot)
ATH_MSG_ERROR(
"cast to ROT failed, should not happen here !");
217 for (
auto &
i : vecPrd) {
219 (
i->detectorElement()->surface(
i->identify()).center() - siPerigee->position()).
dot(
220 siPerigee->momentum());
222 vecPrdComb.insert(vecPrdComb.begin(),
i);
224 vecPrdComb.push_back(
i);
235 const auto& RIOs_OnTrack {pThisExtensionPair->second};
237 ATH_MSG_DEBUG(
"fit track " << thisTrack <<
" with ROTs, number : " << RIOs_OnTrack.size());
252 thisTrack->trackParameters()->front()->pT() >
m_pTminBrem &&
254 ATH_MSG_DEBUG(
"normal fit track failed, try to recover with brem fit");
265 const Trk::Perigee* siPerigee = thisTrack->perigeeParameters();
271 std::unique_ptr<Trk::Track> ntrk(std::make_unique< Trk::Track>(*thisTrack));
277 pThisExtensionPair->first->measurementsOnTrack()->
begin();
278 for (; RIOit != pThisExtensionPair->first->measurementsOnTrack()->
end(); ++RIOit) {
279 rotSet.push_back(*RIOit);
282 for (
const auto *
i : pThisExtensionPair->second) {
283 double inprod = (
i->associatedSurface().center() - siPerigee->position()).
dot(
284 siPerigee->momentum());
286 rotSet.insert(rotSet.begin(),
i);
300 ATH_MSG_DEBUG(
"refit of extended track failed, copy original track to output");
308 std::unique_ptr<Trk::Track> ntrk(std::make_unique<Trk::Track>(*thisTrack));
324 thisTrack->trackParameters()->front()->pT() >
m_pTminBrem &&
326 ATH_MSG_DEBUG(
"new track has low score, try to recover track using brem fit");
329 std::unique_ptr<Trk::Track> newBremTrack;
343 ATH_MSG_DEBUG(
"recovered new track has score : " << newScore);
345 newtrack = std::move(newBremTrack);
348 if (newScore >= oldScore) {
359 newTracks->
push_back(std::move(newtrack));
365 std::unique_ptr<Trk::Track> ntrk;
369 ntrk = std::make_unique<Trk::Track>(*thisTrack);
382 return newTracks.release();
388 bool updateAll)
const {
395 const auto *
const pTrackParameters {
track->trackParameters()};
397 if (not pTrackParameters) {
398 ATH_MSG_WARNING(
"No track parameters, needed for statistics code in Trk::SimpleAmbiguityProcessorTool!");
400 const double absEta = std::abs(pTrackParameters->front()->eta());
411 const EventContext& ctx,
413 const std::vector<const Trk::MeasurementBase*>& extension)
const
416 auto pExtendedTrajectory = std::make_unique<Trk::TrackStates>();
418 pExtendedTrajectory->reserve(trackStatesOnSurfaces.size() + extension.size());
419 int nSiStates = 0, nExtStates = 0;
424 std::transform(trackStatesOnSurfaces.begin(), trackStatesOnSurfaces.end(), std::back_inserter(
425 *pExtendedTrajectory), cloneTSOS);
426 nSiStates += trackStatesOnSurfaces.size();
429 constexpr std::bitset<Trk::TrackStateOnSurface::NumberOfTrackStateOnSurfaceTypes> outlierPattern(outlierDigit);
435 auto addNewTSOS_ForCosmics = [&pExtendedTrajectory, siTrack, createNewTSOS](
const Trk::MeasurementBase* pm) {
436 const auto& perigee {siTrack->perigeeParameters()};
438 const double inprod = (pm->associatedSurface().center() - perigee->position()).
dot(
439 perigee->momentum());
441 pExtendedTrajectory->insert(pExtendedTrajectory->begin(), createNewTSOS(pm));
443 pExtendedTrajectory->push_back(createNewTSOS(pm));
448 std::transform(extension.begin(), extension.end(), std::back_inserter(*pExtendedTrajectory), createNewTSOS);
451 for (
const auto *
const pMeasurementBase: extension) {
452 addNewTSOS_ForCosmics(pMeasurementBase);
455 nExtStates += pExtendedTrajectory->size();
456 const auto& pFitQuality {siTrack->fitQuality()};
458 new Trk::Track(siTrack->info(), std::move(pExtendedTrajectory), (pFitQuality ? pFitQuality->uniqueClone() :
nullptr));
463 ATH_MSG_DEBUG(
"rejected extension saved as Trk::Track with " << nSiStates <<
464 " fitted hits and " << nExtStates <<
" additional Outliers, score :" << extScore);
473 MsgStream &
out =
msg(MSG::INFO);
474 out <<
"::finalize() -- statistics:" << std::endl;
478 return StatusCode::SUCCESS;
485 out <<
"-------------------------------------------------------------------------------" << std::endl;
486 out <<
" Number of events processed : " << m_Nevents << std::endl;
487 out <<
" statistics by eta range ------All---Barrel---Trans.-- Endcap-- " << std::endl;
488 out <<
"-------------------------------------------------------------------------------" << std::endl;
489 out <<
" Number of tracks at input :" << std::setiosflags(std::ios::dec) << std::setw(iw)
494 out <<
" Number of not extended tracks :" << std::setiosflags(std::ios::dec) << std::setw(iw)
502 out <<
" Number of proposed ext. roads :" << std::setiosflags(std::ios::dec) << std::setw(iw)
509 out <<
"-------------------------------------------------------------------------------" << std::endl;
510 out <<
" Number of track fits :" << std::setiosflags(std::ios::dec) << std::setw(iw)
516 out <<
" + brem fits for electron tracks :" << std::setiosflags(std::ios::dec) << std::setw(iw)
523 out <<
" + brem fit to recover failed fit:" << std::setiosflags(std::ios::dec) << std::setw(iw)
531 out <<
" + brem fit to recover low score :" << std::setiosflags(std::ios::dec) << std::setw(iw)
540 out <<
"-------------------------------------------------------------------------------" << std::endl;
541 out <<
" Number of track fit failing :" << std::setiosflags(std::ios::dec) << std::setw(iw)
546 out <<
" Number of rejected extensions :" << std::setiosflags(std::ios::dec) << std::setw(iw)
553 out <<
" Number of successful extensions :" << std::setiosflags(std::ios::dec) << std::setw(iw)
561 out <<
" including brem fitted tracks :" << std::setiosflags(std::ios::dec) << std::setw(iw)
570 out <<
"-------------------------------------------------------------------------------" << std::endl;
571 out << std::setiosflags(std::ios::fixed | std::ios::showpoint) << std::setprecision(2)
573 <<
" < Endcap < " <<
m_etabounds[2] <<
" )" << std::setprecision(-1) << std::endl;
574 out <<
"-------------------------------------------------------------------------------" << std::endl;