diff --git a/Tracking/Acts/FaserActsKalmanFilter/CMakeLists.txt b/Tracking/Acts/FaserActsKalmanFilter/CMakeLists.txt index 55931d32c715e41b22c094667bcbc8b4ad09be3c..96bec207bbe1220239e15ae37f89e4c5e3e41aba 100755 --- a/Tracking/Acts/FaserActsKalmanFilter/CMakeLists.txt +++ b/Tracking/Acts/FaserActsKalmanFilter/CMakeLists.txt @@ -28,11 +28,13 @@ atlas_add_component(FaserActsKalmanFilter ActsTrackSeedTool.h CircleFit.h CircleFitTrackSeedTool.h -#todo CKF2.h + CKF2.h # CKF2Alignment.h CombinatorialKalmanFilterAlg.h EffPlotTool.h FASERSourceLink.h + TrackFitterFunction.h + TrackFinderFunction.h FaserActsKalmanFilter/FaserActsGeometryContainers.h FaserActsKalmanFilterAlg.h FaserActsRecMultiTrajectory.h @@ -73,13 +75,15 @@ atlas_add_component(FaserActsKalmanFilter src/ActsTrackSeedTool.cxx src/CircleFit.cxx src/CircleFitTrackSeedTool.cxx -#todo src/CKF2.cxx + src/CKF2.cxx # src/CKF2Alignment.cxx src/CreateTrkTrackTool.h src/CreateTrkTrackTool.cxx # src/ClusterTrackSeedTool.cxx #todo src/CombinatorialKalmanFilterAlg.cxx #todo src/EffPlotTool.cxx + src/TrackFitterFunction.cxx + src/TrackFinderFunction.cxx src/FaserActsKalmanFilterAlg.cxx src/FiducialParticleTool.h src/FiducialParticleTool.cxx @@ -100,7 +104,6 @@ atlas_add_component(FaserActsKalmanFilter #todo src/SPSimpleInitialParameterTool.cxx # src/ProtoTrackWriterTool.cxx #todo src/TrackFindingAlgorithmFunction.cxx - src/TrackFittingFunction.cxx #todo src/TrajectoryWriterTool.cxx src/TruthBasedInitialParameterTool.cxx src/SummaryPlotTool.cxx diff --git a/Tracking/Acts/FaserActsKalmanFilter/src/CKF2.cxx b/Tracking/Acts/FaserActsKalmanFilter/src/CKF2.cxx index 87380dd7e41cb3d5b38d2f4b92ca784b95eca8b2..2b24440c888251ff030d204e7edf4fc5b6b96bdc 100644 --- a/Tracking/Acts/FaserActsKalmanFilter/src/CKF2.cxx +++ b/Tracking/Acts/FaserActsKalmanFilter/src/CKF2.cxx @@ -3,8 +3,8 @@ #include "StoreGate/ReadHandle.h" #include "StoreGate/ReadCondHandleKey.h" #include "StoreGate/WriteDecorHandle.h" -#include "TrackerSpacePoint/FaserSCT_SpacePointCollection.h" #include "TrackerSpacePoint/FaserSCT_SpacePoint.h" +#include "TrackerSpacePoint/FaserSCT_SpacePointCollection.h" #include "TrackerIdentifier/FaserSCT_ID.h" #include "TrkPrepRawData/PrepRawData.h" #include "TrackerPrepRawData/FaserSCT_Cluster.h" @@ -16,7 +16,6 @@ #include "Acts/EventData/TrackParameters.hpp" #include "FaserActsKalmanFilter/IndexSourceLink.h" #include "FaserActsKalmanFilter/Measurement.h" -#include "FaserActsRecMultiTrajectory.h" #include "Acts/Surfaces/PerigeeSurface.hpp" #include "Acts/MagneticField/MagneticFieldContext.hpp" #include "TrackSelection.h" @@ -32,11 +31,9 @@ #include "Acts/EventData/Measurement.hpp" #include "Acts/Propagator/PropagatorError.hpp" #include "Acts/TrackFinding/CombinatorialKalmanFilterError.hpp" +#include "Acts/EventData/ProxyAccessor.hpp" -size_t CKF2::TrajectoryInfo::nClusters {0}; - -using TrajectoriesContainer = std::vector<FaserActsRecMultiTrajectory>; -//std::array<Acts::BoundIndices, 2> indices = {Acts::eBoundLoc0, Acts::eBoundLoc1}; +size_t CKF2::TrackInfo::nClusters {0}; CKF2::CKF2(const std::string& name, ISvcLocator* pSvcLocator) : @@ -52,19 +49,18 @@ StatusCode CKF2::initialize() { ATH_CHECK(m_trackCollection.initialize()); // ATH_CHECK(m_allTrackCollection.initialize()); ATH_CHECK(m_eventInfoKey.initialize()); - if (m_performanceWriter && !m_noDiagnostics) { - ATH_CHECK(m_performanceWriterTool.retrieve()); - } - if (m_statesWriter && !m_noDiagnostics) { - ATH_CHECK(m_trajectoryStatesWriterTool.retrieve()); - } - if (m_summaryWriter && !m_noDiagnostics) { - ATH_CHECK(m_trajectorySummaryWriterTool.retrieve()); - } + +//todo if (m_performanceWriter && !m_noDiagnostics) { +//todo ATH_CHECK(m_performanceWriterTool.retrieve()); +//todo } +//todo if (m_statesWriter && !m_noDiagnostics) { +//todo ATH_CHECK(m_trajectoryStatesWriterTool.retrieve()); +//todo } +//todo if (m_summaryWriter && !m_noDiagnostics) { +//todo ATH_CHECK(m_trajectorySummaryWriterTool.retrieve()); +//todo } ATH_CHECK(detStore()->retrieve(m_idHelper,"FaserSCT_ID")); - m_fit = makeTrackFinderFunction(m_trackingGeometryTool->trackingGeometry(), - m_resolvePassive, m_resolveMaterial, m_resolveSensitive); - m_kf = makeTrackFitterFunction(m_trackingGeometryTool->trackingGeometry()); + // FIXME fix Acts logging level if (m_actsLogging == "VERBOSE") { m_logger = Acts::getDefaultLogger("KalmanFitter", Acts::Logging::VERBOSE); @@ -74,6 +70,15 @@ StatusCode CKF2::initialize() { m_logger = Acts::getDefaultLogger("KalmanFitter", Acts::Logging::INFO); } + auto magneticField = std::make_shared<FASERMagneticFieldWrapper>(); + double reverseFilteringMomThreshold = 0.1; //@todo: needs to be validated + //@todo: the multiple scattering and energy loss are originallly turned off + m_fitter = makeTrackFitterFunction(m_trackingGeometryTool->trackingGeometry(), magneticField, + false, false, reverseFilteringMomThreshold, Acts::FreeToBoundCorrection(false), *m_logger); + + m_finder = makeTrackFinderFunction(m_trackingGeometryTool->trackingGeometry(), magneticField, + m_resolvePassive, m_resolveMaterial, m_resolveSensitive, *m_logger); + return StatusCode::SUCCESS; } @@ -101,7 +106,7 @@ StatusCode CKF2::execute() { CHECK(m_trackSeedTool->run(m_maskedLayers, m_backwardPropagation)); std::shared_ptr<const Acts::Surface> initialSurface = m_trackSeedTool->initialSurface(); - std::shared_ptr<std::vector<Acts::CurvilinearTrackParameters>> initialParameters = + std::shared_ptr<std::vector<Acts::BoundTrackParameters>> initialParameters = m_trackSeedTool->initialTrackParameters(); std::shared_ptr<std::vector<IndexSourceLink>> sourceLinks = m_trackSeedTool->sourceLinks(); @@ -112,22 +117,53 @@ StatusCode CKF2::execute() { std::shared_ptr<std::vector<const Tracker::FaserSCT_SpacePoint*>> spacePoints = m_trackSeedTool->spacePoints(); std::shared_ptr<std::vector<std::array<std::vector<const Tracker::FaserSCT_Cluster*>, 3>>> seedClusters = m_trackSeedTool->seedClusters(); - TrajectoryInfo::nClusters = sourceLinks->size(); - TrajectoriesContainer trajectories; - trajectories.reserve(initialParameters->size()); + TrackInfo::nClusters = sourceLinks->size(); - Acts::PropagatorPlainOptions pOptions; - pOptions.maxSteps = m_maxSteps; - if (m_backwardPropagation) { - pOptions.direction = Acts::backward; - } else { - pOptions.direction = Acts::forward; + // construct the container + auto allTrackContainer = std::make_shared<Acts::VectorTrackContainer>(); + auto allTrackStateContainer = std::make_shared<Acts::VectorMultiTrajectory>(); + auto selectedTrackContainer = std::make_shared<Acts::VectorTrackContainer>(); + auto selectedTrackStateContainer = std::make_shared<Acts::VectorMultiTrajectory>(); + + auto trackContainerTemp = std::make_shared<Acts::VectorTrackContainer>(); + auto trackStateContainerTemp = + std::make_shared<Acts::VectorMultiTrajectory>(); + + FaserActsTrackContainer tracks(allTrackContainer, allTrackStateContainer); + FaserActsTrackContainer tracksTemp(trackContainerTemp, trackStateContainerTemp); + FaserActsTrackContainer selectedTracks(selectedTrackContainer, selectedTrackStateContainer); + + tracks.addColumn<unsigned int>("trackGroup"); + tracksTemp.addColumn<unsigned int>("trackGroup"); + selectedTracks.addColumn<unsigned int>("trackGroup"); + Acts::ProxyAccessor<unsigned int> seedNumber("trackGroup"); + + +// // Set the CombinatorialKalmanFilter options +// CKF2::TrackFinderOptions options( +// gctx, magFieldContext, calibContext, +// IndexSourceLinkAccessor(), MeasurementCalibrator(*measurements), +// Acts::MeasurementSelector(measurementSelectorCfg), +// Acts::LoggerWrapper{*m_logger}, pOptions, &(*initialSurface)); + + + //1) calibrator + MeasurementCalibratorAdapter calibrator(MeasurementCalibrator(), *measurements); + + //2) slAccessor + IndexSourceLinkContainer tmp; + for (const auto& sl : *sourceLinks) { + tmp.emplace_hint(tmp.end(), sl); } + IndexSourceLinkAccessor slAccessor; + slAccessor.container = &tmp; + //3) measurement selector Acts::MeasurementSelector::Config measurementSelectorCfg = { - {Acts::GeometryIdentifier(), {m_chi2Max, m_nMax}}, + {Acts::GeometryIdentifier(), {{}, {m_chi2Max}, {m_nMax}}}, }; + // configuration of the GeneralFitterOptions Acts::RotationMatrix3 rotation = Acts::RotationMatrix3::Identity(); rotation.col(0) = Acts::Vector3(0, 0, -1); rotation.col(1) = Acts::Vector3(0, 1, 0); @@ -135,109 +171,73 @@ StatusCode CKF2::execute() { Acts::Translation3 trans(0., 0., origin); Acts::Transform3 trafo(rotation * trans); initialSurface = Acts::Surface::makeShared<Acts::PerigeeSurface>(trafo); + + Acts::PropagatorPlainOptions pOptions; + pOptions.maxSteps = m_maxSteps; + if (m_backwardPropagation) { + pOptions.direction = Acts::Direction::Backward; + } else { + pOptions.direction = Acts::Direction::Forward; + } + + GeneralFitterOptions options{ + gctx, magFieldContext, calibContext, &(*initialSurface), pOptions}; - // Set the CombinatorialKalmanFilter options - CKF2::TrackFinderOptions options( - gctx, magFieldContext, calibContext, - IndexSourceLinkAccessor(), MeasurementCalibrator(*measurements), - Acts::MeasurementSelector(measurementSelectorCfg), - Acts::LoggerWrapper{*m_logger}, pOptions, &(*initialSurface)); // Perform the track finding for all initial parameters m_numberOfTrackSeeds += initialParameters->size(); ATH_MSG_DEBUG("Invoke track finding with " << initialParameters->size() << " seeds."); - IndexSourceLinkContainer tmp; - for (const auto& sl : *sourceLinks) { - tmp.emplace_hint(tmp.end(), sl); - } - for (const auto& init : *initialParameters) { - ATH_MSG_DEBUG(" position: " << init.position(gctx).transpose()); - ATH_MSG_DEBUG(" momentum: " << init.momentum().transpose()); - ATH_MSG_DEBUG(" charge: " << init.charge()); - } + unsigned int nSeed = 0; + std::list<TrackInfo> allTracks; - auto results = (*m_fit)(tmp, *initialParameters, options); - - // results contain a MultiTrajectory for each track seed with a trajectory of each branch of the CKF. - // To simplify the ambiguity solving a list of MultiTrajectories is created, each containing only a single track. - std::list<TrajectoryInfo> allTrajectories; - for (auto &result : results) { - if (not result.ok()) { - // TODO use status bits for different errors - // result.error() == Acts::CombinatorialKalmanFilterError::NoTrackFound - if (result.error() == Acts::PropagatorError::StepCountLimitReached || - result.error() == Acts::CombinatorialKalmanFilterError::PropagationReachesMaxSteps) - { - try - { - if (!eventInfo->updateErrorState(xAOD::EventInfo::SCT, xAOD::EventInfo::Error)) - { - ATH_MSG_WARNING ("Cannot set error state for SCT."); - } - } - catch (...) - { - ATH_MSG_DEBUG ("SCT error state is locked."); - } - } + for (std::size_t iseed = 0; iseed < (*initialParameters).size(); ++iseed) { + ATH_MSG_DEBUG(" position: " << (*initialParameters)[iseed].position(gctx).transpose()); + ATH_MSG_DEBUG(" momentum: " << (*initialParameters)[iseed].momentum().transpose()); + ATH_MSG_DEBUG(" charge: " << (*initialParameters)[iseed].charge()); + // Clear trackContainerTemp and trackStateContainerTemp + tracksTemp.clear(); + + auto result = (*m_finder)((*initialParameters).at(iseed), options, calibrator, slAccessor, Acts::MeasurementSelector(measurementSelectorCfg), tracksTemp); + + if (!result.ok()) { + ATH_MSG_WARNING("Track finding failed for seed " << iseed << " with error" << result.error()); continue; } - CKFResult ckfResult = result.value(); - for (size_t trackTip : ckfResult.lastMeasurementIndices) { - allTrajectories.emplace_back(TrajectoryInfo(FaserActsRecMultiTrajectory( - ckfResult.fittedStates, {trackTip}, {{trackTip, ckfResult.fittedParameters.at(trackTip)}}))); + + auto& tracksForSeed = result.value(); + m_numberOfFittedTracks += tracksForSeed.size(); + for (auto& track : tracksForSeed) { + // Set the seed number, this number decrease by 1 since the seed number + // has already been updated + seedNumber(track) = nSeed - 1; + auto destProxy = tracks.getTrack(tracks.addTrack()); + destProxy.copyFrom(track, true); // make sure we copy track states! + allTracks.push_back(track); } } - m_numberOfFittedTracks += allTrajectories.size(); - // the list of MultiTrajectories is sorted by the number of measurements using the chi2 value as a tie-breaker - allTrajectories.sort([](const TrajectoryInfo &left, const TrajectoryInfo &right) { + // the list of tracks is sorted by the number of measurements using the chi2 value as a tie-breaker + allTracks.sort([](const TrackInfo &left, const TrackInfo &right) { if (left.nMeasurements > right.nMeasurements) return true; if (left.nMeasurements < right.nMeasurements) return false; if (left.chi2 < right.chi2) return true; else return false; }); - // select all tracks with at least 13 heats and with 6 or less shared hits, starting from the best track - // TODO use Gaudi parameters for the number of hits and shared hits - // TODO allow shared hits only in the first station? - // std::vector<FaserActsRecMultiTrajectory> rawTrajectories {}; - // for (auto raw : allTrajectories) - // { - // rawTrajectories.push_back(raw.trajectory); - // } - // for (const FaserActsRecMultiTrajectory &traj : rawTrajectories) { - // const auto params = traj.trackParameters(traj.tips().front()); - // ATH_MSG_DEBUG("Fitted parameters (raw)"); - // ATH_MSG_DEBUG(" params: " << params.parameters().transpose()); - // ATH_MSG_DEBUG(" position: " << params.position(gctx).transpose()); - // ATH_MSG_DEBUG(" momentum: " << params.momentum().transpose()); - // ATH_MSG_DEBUG(" charge: " << params.charge()); - // std::unique_ptr<Trk::Track> track = m_createTrkTrackTool->createTrack(gctx, traj, m_backwardPropagation); - // if (track != nullptr) { - // m_numberOfSelectedTracks++; - // std::unique_ptr<Trk::Track> track2 = m_kalmanFitterTool1->fit(ctx, gctx, track.get(), Acts::BoundVector::Zero(), m_isMC); - // if (track2) { - // outputAllTracks->push_back(std::move(track2)); - // } else { - // outputAllTracks->push_back(std::move(track)); - // ATH_MSG_WARNING("Re-Fit failed."); - // } - // } else { - // ATH_MSG_WARNING("CKF failed."); - // } - // } - - std::vector<FaserActsRecMultiTrajectory> selectedTrajectories {}; - while (not allTrajectories.empty()) { - TrajectoryInfo selected = allTrajectories.front(); - selectedTrajectories.push_back(selected.trajectory); - allTrajectories.remove_if([&](const TrajectoryInfo &p) { + + while (not allTracks.empty()) { + TrackInfo selected = allTracks.front(); + + auto destProxy = selectedTracks.getTrack(selectedTracks.addTrack()); + destProxy.copyFrom(selected.track, true); // make sure we copy track states! + + allTracks.remove_if([&](const TrackInfo &p) { return (p.nMeasurements <= 12) || ((p.clusterSet & selected.clusterSet).count() > 6); }); } +/* for (const FaserActsRecMultiTrajectory &traj : selectedTrajectories) { const auto params = traj.trackParameters(traj.tips().front()); ATH_MSG_DEBUG("Fitted parameters"); @@ -273,6 +273,8 @@ StatusCode CKF2::execute() { } // ATH_CHECK(allTrackContainer.record(std::move(outputAllTracks))); ATH_CHECK(trackContainer.record(std::move(outputTracks))); +*/ + return StatusCode::SUCCESS; } @@ -302,141 +304,47 @@ Acts::MagneticFieldContext CKF2::getMagneticFieldContext(const EventContext& ctx -void CKF2::computeSharedHits(std::vector<IndexSourceLink>* sourceLinks, TrackFinderResult& results) const { - // Compute shared hits from all the reconstructed tracks - // Compute nSharedhits and Update ckf results - // hit index -> list of multi traj indexes [traj, meas] - static_assert(Acts::SourceLinkConcept<IndexSourceLink>, - "Source link does not fulfill SourceLinkConcept"); +void CKF2::computeSharedHits(std::vector<IndexSourceLink>* sourceLinks, FaserActsTrackContainer& tracks) const { std::vector<std::size_t> firstTrackOnTheHit( sourceLinks->size(), std::numeric_limits<std::size_t>::max()); std::vector<std::size_t> firstStateOnTheHit( sourceLinks->size(), std::numeric_limits<std::size_t>::max()); - for (unsigned int iresult = 0; iresult < results.size(); iresult++) { - if (not results.at(iresult).ok()) { - continue; - } - - auto& ckfResult = results.at(iresult).value(); - auto& measIndexes = ckfResult.lastMeasurementIndices; - - for (auto measIndex : measIndexes) { - ckfResult.fittedStates.visitBackwards(measIndex, [&](const auto& state) { - if (not state.typeFlags().test(Acts::TrackStateFlag::MeasurementFlag)) - return; - - std::size_t hitIndex = state.uncalibrated().index(); - - // Check if hit not already used - if (firstTrackOnTheHit.at(hitIndex) == - std::numeric_limits<std::size_t>::max()) { - firstTrackOnTheHit.at(hitIndex) = iresult; - firstStateOnTheHit.at(hitIndex) = state.index(); - return; - } - - // if already used, control if first track state has been marked - // as shared - int indexFirstTrack = firstTrackOnTheHit.at(hitIndex); - int indexFirstState = firstStateOnTheHit.at(hitIndex); - if (not results.at(indexFirstTrack).value().fittedStates.getTrackState(indexFirstState).typeFlags().test(Acts::TrackStateFlag::SharedHitFlag)) - results.at(indexFirstTrack).value().fittedStates.getTrackState(indexFirstState).typeFlags().set(Acts::TrackStateFlag::SharedHitFlag); - - // Decorate this track - results.at(iresult).value().fittedStates.getTrackState(state.index()).typeFlags().set(Acts::TrackStateFlag::SharedHitFlag); - }); - } - } -} - - -namespace { - -using Updater = Acts::GainMatrixUpdater; -using Smoother = Acts::GainMatrixSmoother; - -using Stepper = Acts::EigenStepper<>; -using Navigator = Acts::Navigator; -using Propagator = Acts::Propagator<Stepper, Navigator>; -using CKF = Acts::CombinatorialKalmanFilter<Propagator, Updater, Smoother>; - -using TrackParametersContainer = std::vector<CKF2::TrackParameters>; - -struct TrackFinderFunctionImpl - : public CKF2::TrackFinderFunction { - CKF trackFinder; + for (auto track : tracks) { + for (auto state : track.trackStatesReversed()) { + if (!state.typeFlags().test(Acts::TrackStateFlag::MeasurementFlag)) { + continue; + } - TrackFinderFunctionImpl(CKF&& f) : trackFinder(std::move(f)) {} + std::size_t hitIndex = state.getUncalibratedSourceLink() + .template get<IndexSourceLink>() + .index(); - CKF2::TrackFinderResult operator()( - const IndexSourceLinkContainer& sourcelinks, - const TrackParametersContainer& initialParameters, - const CKF2::TrackFinderOptions& options) - const override { - return trackFinder.findTracks(sourcelinks, initialParameters, options); - }; -}; + // Check if hit not already used + if (firstTrackOnTheHit.at(hitIndex) == + std::numeric_limits<std::size_t>::max()) { + firstTrackOnTheHit.at(hitIndex) = track.index(); + firstStateOnTheHit.at(hitIndex) = state.index(); + continue; + } -} // namespace + // if already used, control if first track state has been marked + // as shared + int indexFirstTrack = firstTrackOnTheHit.at(hitIndex); + int indexFirstState = firstStateOnTheHit.at(hitIndex); + + auto firstState = tracks.getTrack(indexFirstTrack) + .container() + .trackStateContainer() + .getTrackState(indexFirstState); + if (!firstState.typeFlags().test(Acts::TrackStateFlag::SharedHitFlag)) { + firstState.typeFlags().set(Acts::TrackStateFlag::SharedHitFlag); + } -std::shared_ptr<CKF2::TrackFinderFunction> -CKF2::makeTrackFinderFunction( - std::shared_ptr<const Acts::TrackingGeometry> trackingGeometry, - bool resolvePassive, bool resolveMaterial, bool resolveSensitive) { - auto magneticField = std::make_shared<FASERMagneticFieldWrapper>(); - Stepper stepper(std::move(magneticField)); - Navigator::Config cfg{trackingGeometry}; - cfg.resolvePassive = resolvePassive; - cfg.resolveMaterial = resolveMaterial; - cfg.resolveSensitive = resolveSensitive; - Navigator navigator(cfg); - Propagator propagator(std::move(stepper), std::move(navigator)); - CKF trackFinder(std::move(propagator)); - - // build the track finder functions. owns the track finder object. - return std::make_shared<TrackFinderFunctionImpl>(std::move(trackFinder)); + // Decorate this track state + state.typeFlags().set(Acts::TrackStateFlag::SharedHitFlag); + } + } } - -namespace { - -using Updater = Acts::GainMatrixUpdater; -using Smoother = Acts::GainMatrixSmoother; -using Stepper = Acts::EigenStepper<>; -using Propagator = Acts::Propagator<Stepper, Acts::Navigator>; -using Fitter = Acts::KalmanFitter<Propagator, Updater, Smoother>; - -struct TrackFitterFunctionImpl - : public CKF2::TrackFitterFunction { - Fitter trackFitter; - - TrackFitterFunctionImpl(Fitter &&f) : trackFitter(std::move(f)) {} - - CKF2::KFResult operator()( - const std::vector<IndexSourceLink> &sourceLinks, - const Acts::BoundTrackParameters &initialParameters, - const CKF2::TrackFitterOptions &options) - const override { - return trackFitter.fit(sourceLinks, initialParameters, options); - }; -}; - -} // namespace - - -std::shared_ptr<CKF2::TrackFitterFunction> -CKF2::makeTrackFitterFunction( - std::shared_ptr<const Acts::TrackingGeometry> trackingGeometry) { - auto magneticField = std::make_shared<FASERMagneticFieldWrapper>(); - auto stepper = Stepper(std::move(magneticField)); - Acts::Navigator::Config cfg{trackingGeometry}; - cfg.resolvePassive = false; - cfg.resolveMaterial = true; - cfg.resolveSensitive = true; - Acts::Navigator navigator(cfg); - Propagator propagator(std::move(stepper), std::move(navigator)); - Fitter trackFitter(std::move(propagator)); - return std::make_shared<TrackFitterFunctionImpl>(std::move(trackFitter)); -} diff --git a/Tracking/Acts/FaserActsKalmanFilter/src/CKF2.h b/Tracking/Acts/FaserActsKalmanFilter/src/CKF2.h index cd78bf72531931fc3ef7ef3b1b67edc854e46596..d9f717f77731f78bef626f663d457e9c4560efae 100644 --- a/Tracking/Acts/FaserActsKalmanFilter/src/CKF2.h +++ b/Tracking/Acts/FaserActsKalmanFilter/src/CKF2.h @@ -1,11 +1,11 @@ #ifndef FASERACTSKALMANFILTER_CKF2_H #define FASERACTSKALMANFILTER_CKF2_H +#include "TrackFitterFunction.h" +#include "TrackFinderFunction.h" #include "AthenaBaseComps/AthReentrantAlgorithm.h" #include "AthenaBaseComps/AthAlgorithm.h" -#include "TrackerSpacePoint/FaserSCT_SpacePointContainer.h" -#include "TrackerPrepRawData/FaserSCT_ClusterContainer.h" #include "FaserActsGeometryInterfaces/IFaserActsTrackingGeometryTool.h" #include "Acts/TrackFitting/KalmanFitter.hpp" #include "Acts/TrackFinding/CombinatorialKalmanFilter.hpp" @@ -22,7 +22,8 @@ #include <boost/dynamic_bitset.hpp> #include "CreateTrkTrackTool.h" #include "xAODEventInfo/EventInfo.h" -using ConstTrackStateProxy = Acts::detail_lt::TrackStateProxy<IndexSourceLink, 6, true>; + + using ClusterSet = boost::dynamic_bitset<>; class FaserSCT_ID; @@ -44,71 +45,31 @@ public: StatusCode execute() override; StatusCode finalize() override; - using TrackFinderOptions = - Acts::CombinatorialKalmanFilterOptions<IndexSourceLinkAccessor, - MeasurementCalibrator, - Acts::MeasurementSelector>; - using CKFResult = Acts::CombinatorialKalmanFilterResult<IndexSourceLink>; - using TrackFitterResult = Acts::Result<CKFResult>; - using TrackFinderResult = std::vector<TrackFitterResult>; - - using KFResult = - Acts::Result<Acts::KalmanFitterResult<IndexSourceLink>>; - - using TrackFitterOptions = - Acts::KalmanFitterOptions<MeasurementCalibrator, Acts::VoidOutlierFinder, - Acts::VoidReverseFilteringLogic>; - - using TrackParameters = Acts::CurvilinearTrackParameters; - using TrackParametersContainer = std::vector<TrackParameters>; - - // Track Finding - class TrackFinderFunction { - public: - virtual ~TrackFinderFunction() = default; - virtual TrackFinderResult operator()(const IndexSourceLinkContainer&, - const TrackParametersContainer&, - const TrackFinderOptions&) const = 0; - }; - - static std::shared_ptr<TrackFinderFunction> makeTrackFinderFunction( - std::shared_ptr<const Acts::TrackingGeometry> trackingGeometry, - bool resolvePassive, bool resolveMaterial, bool resolveSensitive); - - // Track Fitting - class TrackFitterFunction { - public: - virtual ~TrackFitterFunction() = default; - virtual KFResult operator()(const std::vector<IndexSourceLink>&, - const Acts::BoundTrackParameters&, - const TrackFitterOptions&) const = 0; - }; - - struct TrajectoryInfo { - TrajectoryInfo(const FaserActsRecMultiTrajectory &traj) : - trajectory{traj}, clusterSet{nClusters} { - auto state = Acts::MultiTrajectoryHelpers::trajectoryState(traj.multiTrajectory(), traj.tips().front()); - traj.multiTrajectory().visitBackwards(traj.tips().front(), [&](const ConstTrackStateProxy& state) { + struct TrackInfo { + TrackInfo(const FaserActsTrackContainer::TrackProxy& trk) : + track{trk}, clusterSet{nClusters} { + nMeasurements = trk.nMeasurements(); + chi2 = trk.chi2(); + //@todo: Is this unique? + index = trk.index(); + for (const auto& state : track.trackStatesReversed()) { auto typeFlags = state.typeFlags(); if (not typeFlags.test(Acts::TrackStateFlag::MeasurementFlag)) { - return true; + continue; } - clusterSet.set(state.uncalibrated().index()); - return true; - }); - nMeasurements = state.nMeasurements; - chi2 = state.chi2Sum; + auto sl = state.getUncalibratedSourceLink().template get<IndexSourceLink>(); + clusterSet.set(sl.index()); + } } static size_t nClusters; - FaserActsRecMultiTrajectory trajectory; + FaserActsTrackContainer::TrackProxy track; ClusterSet clusterSet; size_t nMeasurements; double chi2; + size_t index; }; - static std::shared_ptr<TrackFitterFunction> makeTrackFitterFunction( - std::shared_ptr<const Acts::TrackingGeometry> trackingGeometry); virtual Acts::MagneticFieldContext getMagneticFieldContext(const EventContext& ctx) const; @@ -118,9 +79,9 @@ private: size_t m_numberOfFittedTracks {0}; size_t m_numberOfSelectedTracks {0}; - void computeSharedHits(std::vector<IndexSourceLink>* sourceLinks, TrackFinderResult& results) const; - std::shared_ptr<TrackFinderFunction> m_fit; - std::shared_ptr<TrackFitterFunction> m_kf; + void computeSharedHits(std::vector<IndexSourceLink>* sourceLinks, FaserActsTrackContainer& tracks) const; + std::shared_ptr<TrackFinderFunction> m_finder; + std::shared_ptr<TrackFitterFunction> m_fitter; std::unique_ptr<const Acts::Logger> m_logger; const FaserSCT_ID* m_idHelper {nullptr}; const TrackerDD::SCT_DetectorManager* m_detManager {nullptr}; @@ -142,9 +103,9 @@ private: SG::ReadCondHandleKey<FaserFieldCacheCondObj> m_fieldCondObjInputKey {this, "FaserFieldCacheCondObj", "fieldCondObj", "Name of the Magnetic Field conditions object key"}; ToolHandle<ITrackSeedTool> m_trackSeedTool {this, "TrackSeed", "ClusterTrackSeedTool"}; ToolHandle<IFaserActsTrackingGeometryTool> m_trackingGeometryTool {this, "TrackingGeometryTool", "FaserActsTrackingGeometryTool"}; - ToolHandle<PerformanceWriterTool> m_performanceWriterTool {this, "PerformanceWriterTool", "PerformanceWriterTool"}; - ToolHandle<RootTrajectoryStatesWriterTool> m_trajectoryStatesWriterTool {this, "RootTrajectoryStatesWriterTool", "RootTrajectoryStatesWriterTool"}; - ToolHandle<RootTrajectorySummaryWriterTool> m_trajectorySummaryWriterTool {this, "RootTrajectorySummaryWriterTool", "RootTrajectorySummaryWriterTool"}; +//todo ToolHandle<PerformanceWriterTool> m_performanceWriterTool {this, "PerformanceWriterTool", "PerformanceWriterTool"}; +//todo ToolHandle<RootTrajectoryStatesWriterTool> m_trajectoryStatesWriterTool {this, "RootTrajectoryStatesWriterTool", "RootTrajectoryStatesWriterTool"}; +//todo ToolHandle<RootTrajectorySummaryWriterTool> m_trajectorySummaryWriterTool {this, "RootTrajectorySummaryWriterTool", "RootTrajectorySummaryWriterTool"}; ToolHandle<KalmanFitterTool> m_kalmanFitterTool1 {this, "KalmanFitterTool1", "KalmanFitterTool"}; ToolHandle<CreateTrkTrackTool> m_createTrkTrackTool {this, "CreateTrkTrackTool", "CreateTrkTrackTool"}; Gaudi::Property<bool> m_isMC {this, "isMC", false}; diff --git a/Tracking/Acts/FaserActsKalmanFilter/src/TrackFitterFunction.cxx b/Tracking/Acts/FaserActsKalmanFilter/src/TrackFitterFunction.cxx index ec4406108f028c21186b09b64c6acadb37cb90ae..979754d4c98d42d2478748af0bbe06dd1c15cab9 100644 --- a/Tracking/Acts/FaserActsKalmanFilter/src/TrackFitterFunction.cxx +++ b/Tracking/Acts/FaserActsKalmanFilter/src/TrackFitterFunction.cxx @@ -1,15 +1,14 @@ #include "TrackFitterFunction.h" -//#include "TrackerRIO_OnTrack/FaserSCT_ClusterOnTrack.h" +#include "TrackerRIO_OnTrack/FaserSCT_ClusterOnTrack.h" template <typename traj_t> bool FaserActsOutlierFinder::operator()(typename traj_t::ConstTrackStateProxy state) const { //remove the whole IFT if(cluster_z<-10000){ IndexSourceLink sl = state.getUncalibratedSourceLink().template get<IndexSourceLink>(); - //@todo - //const Tracker::FaserSCT_Cluster* cluster = sl.hit(); - //if(cluster->globalPosition().z()<-100)return true; - //if(abs(sl.hit()->globalPosition().z()-cluster_z)<3)return true; + const Tracker::FaserSCT_Cluster* cluster = sl.hit(); + if(cluster->globalPosition().z()<-100)return true; + if(abs(sl.hit()->globalPosition().z()-cluster_z)<3)return true; } if (not state.hasCalibrated() or not state.hasPredicted()) {