File indexing completed on 2025-08-06 08:18:26
0001
0002 #include "PHActsTrackPropagator.h"
0003
0004 #include <fun4all/Fun4AllReturnCodes.h>
0005 #include <phool/PHCompositeNode.h>
0006 #include <phool/PHDataNode.h>
0007 #include <phool/PHNode.h>
0008 #include <phool/PHNodeIterator.h>
0009 #include <phool/PHObject.h>
0010 #include <phool/PHTimer.h>
0011 #include <phool/getClass.h>
0012 #include <phool/phool.h>
0013
0014 #include <trackbase/ActsAborter.h>
0015 #include <trackbase/ActsTrackFittingAlgorithm.h>
0016
0017 #include <trackbase_historic/ActsTransformations.h>
0018 #include <trackbase_historic/SvtxTrackMap.h>
0019 #include <trackbase_historic/SvtxTrackState.h>
0020 #include <trackbase_historic/SvtxTrackState_v1.h>
0021
0022 #include <globalvertex/SvtxVertex.h>
0023 #include <globalvertex/SvtxVertexMap.h>
0024
0025 #include <Acts/Geometry/GeometryIdentifier.hpp>
0026 #include <Acts/MagneticField/MagneticFieldProvider.hpp>
0027 #include <Acts/Surfaces/PerigeeSurface.hpp>
0028
0029
0030 PHActsTrackPropagator::PHActsTrackPropagator(const std::string &name)
0031 : SubsysReco(name)
0032 {
0033 }
0034
0035
0036 PHActsTrackPropagator::~PHActsTrackPropagator()
0037 {
0038 }
0039
0040
0041 int PHActsTrackPropagator::Init(PHCompositeNode *)
0042 {
0043 return Fun4AllReturnCodes::EVENT_OK;
0044 }
0045
0046
0047 int PHActsTrackPropagator::InitRun(PHCompositeNode *topNode)
0048 {
0049 int ret = getNodes(topNode);
0050
0051 return ret;
0052 }
0053
0054
0055 int PHActsTrackPropagator::process_event(PHCompositeNode *)
0056 {
0057 ActsPropagator prop(m_tGeometry);
0058 for (auto &[key, track] : *m_trackMap)
0059 {
0060 auto params = prop.makeTrackParams(track, m_vertexMap);
0061 if(!params.ok())
0062 {
0063 continue;
0064 }
0065 auto result = propagateTrack(params.value());
0066 if (result.ok())
0067 {
0068 addTrackState(result, track);
0069 }
0070 }
0071
0072 return Fun4AllReturnCodes::EVENT_OK;
0073 }
0074
0075 void PHActsTrackPropagator::addTrackState(
0076 BoundTrackParamResult &result,
0077 SvtxTrack *svtxTrack)
0078 {
0079 float pathlength = result.value().first / Acts::UnitConstants::cm;
0080 auto params = result.value().second;
0081
0082 SvtxTrackState_v1 out(pathlength);
0083
0084 auto projectionPos = params.position(m_tGeometry->geometry().getGeoContext());
0085 const auto momentum = params.momentum();
0086 out.set_x(projectionPos.x() / Acts::UnitConstants::cm);
0087 out.set_y(projectionPos.y() / Acts::UnitConstants::cm);
0088 out.set_z(projectionPos.z() / Acts::UnitConstants::cm);
0089 out.set_px(momentum.x());
0090 out.set_py(momentum.y());
0091 out.set_pz(momentum.z());
0092
0093 if (Verbosity() > 1)
0094 {
0095 std::cout << "Adding track state for layer " << m_sphenixLayer
0096 << " with path length " << pathlength << " with position "
0097 << projectionPos.transpose() << std::endl;
0098 }
0099
0100 ActsTransformations transformer;
0101 const auto globalCov = transformer.rotateActsCovToSvtxTrack(params);
0102 for (int i = 0; i < 6; ++i)
0103 {
0104 for (int j = 0; j < 6; ++j)
0105 {
0106 out.set_error(i, j, globalCov(i, j));
0107 }
0108 }
0109
0110 svtxTrack->insert_state(&out);
0111 }
0112
0113 PHActsTrackPropagator::BoundTrackParamResult
0114 PHActsTrackPropagator::propagateTrack(const Acts::BoundTrackParameters ¶ms)
0115 {
0116 ActsPropagator propagator(m_tGeometry);
0117 propagator.verbosity(Verbosity());
0118
0119 return propagator.propagateTrack(params, m_sphenixLayer);
0120 }
0121
0122
0123 int PHActsTrackPropagator::End(PHCompositeNode *)
0124 {
0125 return Fun4AllReturnCodes::EVENT_OK;
0126 }
0127
0128
0129 void PHActsTrackPropagator::Print(const std::string &what) const
0130 {
0131 std::cout << "PHActsTrackPropagator:: " << what << std::endl;
0132 }
0133
0134 int PHActsTrackPropagator::getNodes(PHCompositeNode *topNode)
0135 {
0136 m_vertexMap = findNode::getClass<SvtxVertexMap>(topNode, "SvtxVertexMap");
0137 if (!m_vertexMap)
0138 {
0139 std::cout << PHWHERE << "No vertex map on node tree, bailing."
0140 << std::endl;
0141 return Fun4AllReturnCodes::ABORTEVENT;
0142 }
0143
0144 m_tGeometry = findNode::getClass<ActsGeometry>(
0145 topNode, "ActsGeometry");
0146 if (!m_tGeometry)
0147 {
0148 std::cout << "ActsTrackingGeometry not on node tree. Exiting."
0149 << std::endl;
0150
0151 return Fun4AllReturnCodes::ABORTEVENT;
0152 }
0153
0154 m_trackMap = findNode::getClass<SvtxTrackMap>(topNode, "SvtxTrackMap");
0155 if (!m_trackMap)
0156 {
0157 std::cout << PHWHERE << "No SvtxTrackMap on node tree. Bailing."
0158 << std::endl;
0159 return Fun4AllReturnCodes::ABORTEVENT;
0160 }
0161
0162 return Fun4AllReturnCodes::EVENT_OK;
0163 }