10 #include "GaudiKernel/EventContext.h"
11 #include "GaudiKernel/ISvcLocator.h"
14 #include "Acts/Propagator/MaterialInteractor.hpp"
15 #include "Acts/Propagator/detail/SteppingLogger.hpp"
16 #include "Acts/Surfaces/PerigeeSurface.hpp"
17 #include "Acts/Utilities/Helpers.hpp"
18 #include "Acts/Definitions/Units.hpp"
19 #include "Acts/Utilities/Logger.hpp"
29 #include "CLHEP/Random/RandomEngine.h"
35 using namespace Acts::UnitLiterals;
42 std::pair<std::pair<Acts::Vector3, Acts::Vector3>, RecordedMaterial>;
51 ATH_CHECK(m_extrapolationTool.retrieve());
52 ATH_CHECK(m_propStepWriterSvc.retrieve());
53 ATH_CHECK(m_trackingGeometryTool.retrieve());
54 if (m_writeMaterialTracks) {
55 ATH_CHECK( m_materialTrackWriterSvc.retrieve() );
58 return StatusCode::SUCCESS;
67 CLHEP::HepRandomEngine *rngEngine = rngWrapper->
getEngine(ctx);
69 ATH_MSG_VERBOSE(
"Extrapolating " << m_nParticlePerEvent <<
" particles");
71 for (
size_t i = 0;
i < m_nParticlePerEvent;
i++) {
75 std::vector<double>
etaRange = m_etaRange;
80 std::vector<double> ptRange = m_ptRange;
81 double ptMin = ptRange.at(0) * 1_GeV;
82 double ptMax = ptRange.at(1) * 1_GeV;
84 double pt = rngEngine->flat() * std::abs(ptMax - ptMin) + ptMin;
91 double charge = rngEngine->flat() > 0.5 ? -1 : 1;
95 std::shared_ptr<Acts::PerigeeSurface> surface =
96 Acts::Surface::makeShared<Acts::PerigeeSurface>(
97 Acts::Vector3(0, 0, 0));
102 Acts::BoundVector
pars;
105 std::optional<Acts::BoundSquareMatrix>
cov = std::nullopt;
108 PropagationOutput output;
113 output = m_extrapolationTool->propagationSteps(ctx, startParameters);
114 if(output.first.size() == 0) {
117 if (m_writePropStep) {
118 m_propStepWriterSvc->write(output.first);
121 if(m_writeMaterialTracks){
125 track.second = std::move(output.second);
126 m_materialTrackWriterSvc->write(
track);
133 return StatusCode::SUCCESS;
138 const std::vector<Acts::detail::Step>&
steps)
const {
140 std::lock_guard<std::mutex>
lock(m_writeMutex);
143 std::stringstream lstr;
146 const auto &
pos =
step.position;
147 out <<
"v " <<
pos.x() <<
" " <<
pos.y() <<
" " <<
pos.z() << std::endl;
148 lstr <<
" " << m_objVtxCount;
154 out << lstr.str() << std::endl;