From e1003af1a7bbdbf929fd1209d695bc2d2af855dd Mon Sep 17 00:00:00 2001 From: Shujie Li Date: Thu, 18 Aug 2022 15:37:10 -0700 Subject: [PATCH 1/4] initial script to save trajectory info in to the Trajectory branch --- .../TrajectoriesFromTrackFinding.cpp | 250 ++++++++++++++++++ 1 file changed, 250 insertions(+) create mode 100644 JugTrack/src/components/TrajectoriesFromTrackFinding.cpp diff --git a/JugTrack/src/components/TrajectoriesFromTrackFinding.cpp b/JugTrack/src/components/TrajectoriesFromTrackFinding.cpp new file mode 100644 index 00000000..3b99b92d --- /dev/null +++ b/JugTrack/src/components/TrajectoriesFromTrackFinding.cpp @@ -0,0 +1,250 @@ +#include + +// Gaudi +#include "GaudiAlg/GaudiAlgorithm.h" +#include "GaudiKernel/ToolHandle.h" +#include "GaudiAlg/Transformer.h" +#include "GaudiAlg/GaudiTool.h" +#include "GaudiKernel/RndmGenerators.h" +#include "Gaudi/Property.h" + +#include "DDRec/CellIDPositionConverter.h" +#include "DDRec/SurfaceManager.h" +#include "DDRec/Surface.h" + +#include "JugBase/DataHandle.h" +#include "JugBase/IGeoSvc.h" +#include "JugBase/UniqueID.h" + +#include "Acts/EventData/MultiTrajectory.hpp" +#include "Acts/EventData/MultiTrajectoryHelpers.hpp" + +// Event Model related classes +#include "eicd/BasicParticleCollection.h" +#include "eicd/TrackerHitCollection.h" +#include "eicd/TrackParametersCollection.h" +#include "eicd/TrajectoryCollection.h" +#include "JugTrack/IndexSourceLink.hpp" +#include "JugTrack/Track.hpp" +#include "JugTrack/Trajectories.hpp" + +#include "Acts/Utilities/Helpers.hpp" +#include "Acts/Geometry/GeometryIdentifier.hpp" +#include "Acts/MagneticField/ConstantBField.hpp" +#include "Acts/MagneticField/InterpolatedBFieldMap.hpp" +#include "Acts/MagneticField/SharedBField.hpp" +#include "Acts/Propagator/EigenStepper.hpp" +#include "Acts/Surfaces/PerigeeSurface.hpp" + +#include "eicd/VectorPolar.h" + +#include + +namespace Jug::Reco { + + /** Extrac the particles form fit trajectories. + * + * \ingroup tracking + */ + class TrajectoriesFromTrackFinding : public GaudiAlgorithm { + // class TrajectoriesFromTrackFinding : public GaudiAlgorithm, AlgorithmIDMixin { + public: + DataHandle m_inputTrajectories{"inputTrajectories", Gaudi::DataHandle::Reader, this}; + DataHandle m_outputTrajectory{"outputTrajectoryParameters", Gaudi::DataHandle::Writer, this}; + + public: + // ill-formed: using GaudiAlgorithm::GaudiAlgorithm; + TrajectoriesFromTrackFinding(const std::string& name, ISvcLocator* svcLoc) + : GaudiAlgorithm(name, svcLoc) + // , AlgorithmIDMixin(name, info()) + { + declareProperty("inputTrajectories", m_inputTrajectories,""); + declareProperty("outputTrajectoryParameters", m_outputTrajectory, "ACTS Trajectory Parameters"); + } + + StatusCode initialize() override { + if (GaudiAlgorithm::initialize().isFailure()) + return StatusCode::FAILURE; + return StatusCode::SUCCESS; + } + + StatusCode execute() override { + // input collection + const TrajectoriesContainer* trajectories = m_inputTrajectories.get(); + + // ActsExamples::ProcessCode ActsExamples::RootTrajectoryStatesWriter::writeT( + // const AlgorithmContext& ctx, const TrajectoriesContainer& trajectories) { + // using HitParticlesMap = IndexMultimap; + // using HitSimHitsMap = IndexMultimap; + + // create output collections + auto traj_pars = m_outputTrajectory.createAndPut(); + + if (msgLevel(MSG::DEBUG)) { + debug() << std::size(*trajectories) << " trajectories " << endmsg; + } + + // Loop over the trajectories + for (size_t itraj = 0; itraj < trajectories->size(); ++itraj) { + const auto& traj = (*trajectories)[itraj]; + + // Get the entry index for the single trajectory + // The trajectory entry indices and the multiTrajectory + const auto& mj = traj.multiTrajectory(); + const auto& trackTips = traj.tips(); + if (trackTips.empty()) { + if (msgLevel(MSG::DEBUG)) { + debug() << "Empty multiTrajectory." << endmsg; + } + continue; + } + + auto& trackTip = trackTips.front(); + + // Collect the trajectory summary info + auto trajState = Acts::MultiTrajectoryHelpers::trajectoryState(mj, trackTip); + unsigned int m_nStates = trajState.nStates; + unsigned int m_nMeasurements = trajState.nMeasurements; + unsigned int m_nOutliers = trajState.nOutliers; + unsigned int m_nHoles = trajState.nHoles; + float m_chi2Sum = trajState.chi2Sum; + unsigned int m_ndf = trajState.NDF; + unsigned int m_nSharedHits = trajState.nSharedHits; + + unsigned int hasFit=0; + if (traj.hasTrackParameters(trackTip)) + hasFit=1; + + if (msgLevel(MSG::DEBUG)) { + + debug() << "hasFit = " << hasFit<push_back(traj_par); + +// +// corresponding eicd structure +// + // Description: "Raw trajectory from the tracking algorithm" + // Author: "S. Joosten, S. Li" + // Members: + // - uint32_t type // 0 (does not have good track fit), 1 (has good track fit) + // - uint32_t nStates // Number of tracking steps + // - uint32_t nMeasurements // Number of hits used + // - uint32_t nOutliers // Number of hits not considered + // - uint32_t nHoles // Number of missing hits + // - float chi2 // Total chi2 + // - uint32_t ndf // Number of degrees of freedom + // - uint32_t nSharedHits // Number of shared hits with other trajectories + // VectorMembers: + // - float measurementChi2 // Chi2 for each of the measurements + // - float outlierChi2 // Chi2 for each of the outliers + // OneToManyRelations: + // - eic::TrackerHit measurementHits // Measurement hits used in this trajectory + // - eic::TrackerHit outlierHits // Outlier hits not used in this trajectory + +// +//// to do: get hits info (e.g. position) +// + // // Get the trackStates on the trajectory + // m_nParams = {0, 0, 0}; + // mj.visitBackwards(trackTip, [&](const auto& state) { + // // we only fill the track states with non-outlier measurement + // auto typeFlags = state.typeFlags(); + // if (not typeFlags.test(Acts::TrackStateFlag::MeasurementFlag)) { + // return true; + // } + + // const auto& surface = state.referenceSurface(); + + // // get the truth hits corresponding to this trackState + // // Use average truth in the case of multiple contributing sim hits + // const auto& sl = + // static_cast(state.uncalibrated()); + // const auto hitIdx = sl.index(); + // auto indices = makeRange(hitSimHitsMap.equal_range(hitIdx)); + // auto [truthLocal, truthPos4, truthUnitDir] = + // averageSimHits(ctx.geoContext, surface, simHits, indices); + // // momemtum averaging makes even less sense than averaging position and + // // direction. use the first momentum or set q/p to zero + // float truthQOP = 0.0f; + // if (not indices.empty()) { + // // we assume that the indices are within valid ranges so we do not + // // need to check their validity again. + // const auto simHitIdx0 = indices.begin()->second; + // const auto& simHit0 = *simHits.nth(simHitIdx0); + // const auto p = + // simHit0.momentum4Before().template segment<3>(Acts::eMom0).norm(); + // truthQOP = truthQ / p; + // } + + // // fill the truth hit info + // m_t_x.push_back(truthPos4[Acts::ePos0]); + // m_t_y.push_back(truthPos4[Acts::ePos1]); + // m_t_z.push_back(truthPos4[Acts::ePos2]); + // m_t_r.push_back(perp(truthPos4.template segment<3>(Acts::ePos0))); + // m_t_dx.push_back(truthUnitDir[Acts::eMom0]); + // m_t_dy.push_back(truthUnitDir[Acts::eMom1]); + // m_t_dz.push_back(truthUnitDir[Acts::eMom2]); + + // // get the truth track parameter at this track State + // float truthLOC0 = truthLocal[Acts::ePos0]; + // float truthLOC1 = truthLocal[Acts::ePos1]; + // float truthTIME = truthPos4[Acts::eTime]; + // float truthPHI = phi(truthUnitDir); + // float truthTHETA = theta(truthUnitDir); + + // // fill the truth track parameter at this track State + // m_t_eLOC0.push_back(truthLOC0); + // m_t_eLOC1.push_back(truthLOC1); + // m_t_ePHI.push_back(truthPHI); + // m_t_eTHETA.push_back(truthTHETA); + // m_t_eQOP.push_back(truthQOP); + // m_t_eT.push_back(truthTIME); + + // // get the geometry ID + // auto geoID = surface.geometryId(); + // m_volumeID.push_back(geoID.volume()); + // m_layerID.push_back(geoID.layer()); + // m_moduleID.push_back(geoID.sensitive()); + + + } + return StatusCode::SUCCESS; + } + + }; + DECLARE_COMPONENT(TrajectoriesFromTrackFinding) + +} // namespace Jug::Reco -- GitLab From 7d9cc3d5fa9a19a5e09013e387896459a27abf55 Mon Sep 17 00:00:00 2001 From: Shujie Li Date: Thu, 18 Aug 2022 20:01:27 -0700 Subject: [PATCH 2/4] remove legend dependency --- JugTrack/src/components/TrajectoriesFromTrackFinding.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/JugTrack/src/components/TrajectoriesFromTrackFinding.cpp b/JugTrack/src/components/TrajectoriesFromTrackFinding.cpp index 3b99b92d..35e460a5 100644 --- a/JugTrack/src/components/TrajectoriesFromTrackFinding.cpp +++ b/JugTrack/src/components/TrajectoriesFromTrackFinding.cpp @@ -14,7 +14,6 @@ #include "JugBase/DataHandle.h" #include "JugBase/IGeoSvc.h" -#include "JugBase/UniqueID.h" #include "Acts/EventData/MultiTrajectory.hpp" #include "Acts/EventData/MultiTrajectoryHelpers.hpp" @@ -47,7 +46,6 @@ namespace Jug::Reco { * \ingroup tracking */ class TrajectoriesFromTrackFinding : public GaudiAlgorithm { - // class TrajectoriesFromTrackFinding : public GaudiAlgorithm, AlgorithmIDMixin { public: DataHandle m_inputTrajectories{"inputTrajectories", Gaudi::DataHandle::Reader, this}; DataHandle m_outputTrajectory{"outputTrajectoryParameters", Gaudi::DataHandle::Writer, this}; @@ -56,7 +54,6 @@ namespace Jug::Reco { // ill-formed: using GaudiAlgorithm::GaudiAlgorithm; TrajectoriesFromTrackFinding(const std::string& name, ISvcLocator* svcLoc) : GaudiAlgorithm(name, svcLoc) - // , AlgorithmIDMixin(name, info()) { declareProperty("inputTrajectories", m_inputTrajectories,""); declareProperty("outputTrajectoryParameters", m_outputTrajectory, "ACTS Trajectory Parameters"); -- GitLab From 39da05d954165c3c8a91100c8f2c6683fa099e28 Mon Sep 17 00:00:00 2001 From: Shujie Li Date: Thu, 18 Aug 2022 21:23:33 -0700 Subject: [PATCH 3/4] remove more expired dependency... --- JugTrack/src/components/TrajectoriesFromTrackFinding.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/JugTrack/src/components/TrajectoriesFromTrackFinding.cpp b/JugTrack/src/components/TrajectoriesFromTrackFinding.cpp index 35e460a5..2bff8982 100644 --- a/JugTrack/src/components/TrajectoriesFromTrackFinding.cpp +++ b/JugTrack/src/components/TrajectoriesFromTrackFinding.cpp @@ -19,7 +19,6 @@ #include "Acts/EventData/MultiTrajectoryHelpers.hpp" // Event Model related classes -#include "eicd/BasicParticleCollection.h" #include "eicd/TrackerHitCollection.h" #include "eicd/TrackParametersCollection.h" #include "eicd/TrajectoryCollection.h" -- GitLab From abac70575ef5344035023d46c3ff38d1c8e280e3 Mon Sep 17 00:00:00 2001 From: Shujie Li Date: Thu, 18 Aug 2022 22:09:15 -0700 Subject: [PATCH 4/4] remove more expired dependency... --- JugTrack/src/components/TrajectoriesFromTrackFinding.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/JugTrack/src/components/TrajectoriesFromTrackFinding.cpp b/JugTrack/src/components/TrajectoriesFromTrackFinding.cpp index 2bff8982..7c8686cb 100644 --- a/JugTrack/src/components/TrajectoriesFromTrackFinding.cpp +++ b/JugTrack/src/components/TrajectoriesFromTrackFinding.cpp @@ -34,8 +34,6 @@ #include "Acts/Propagator/EigenStepper.hpp" #include "Acts/Surfaces/PerigeeSurface.hpp" -#include "eicd/VectorPolar.h" - #include namespace Jug::Reco { -- GitLab