5#ifndef ISF_ACTSTOOLS_ACTSFATRASSIMTOOL_H
6#define ISF_ACTSTOOLS_ACTSFATRASSIMTOOL_H
9#include "GaudiKernel/ServiceHandle.h"
10#include "GaudiKernel/ToolHandle.h"
28#include "Acts/Utilities/UnitVectors.hpp"
31#include "Acts/Geometry/GeometryContext.hpp"
32#include "Acts/MagneticField/MagneticFieldContext.hpp"
33#include "Acts/EventData/BoundTrackParameters.hpp"
34#include "Acts/Propagator/Navigator.hpp"
35#include "Acts/Propagator/EigenStepper.hpp"
36#include "Acts/Propagator/EigenStepperDefaultExtension.hpp"
37#include "Acts/Propagator/StraightLineStepper.hpp"
38#include "Acts/Propagator/detail/SteppingLogger.hpp"
39#include "Acts/Propagator/ActorList.hpp"
40#include "Acts/Propagator/Propagator.hpp"
41#include "Acts/Definitions/ParticleData.hpp"
42#include "ActsFatras/EventData/GenerationProcess.hpp"
43#include "ActsFatras/Kernel/InteractionList.hpp"
44#include "ActsFatras/Kernel/SingleParticleSimulation.hpp"
45#include "ActsFatras/Kernel/SingleParticleSimulationResult.hpp"
46#include "ActsFatras/Kernel/MultiParticleSimulation.hpp"
47#include "ActsFatras/Physics/Decay/NoDecay.hpp"
48#include "ActsFatras/Physics/StandardInteractions.hpp"
49#include "ActsFatras/Physics/ElectroMagnetic/PhotonConversion.hpp"
50#include "ActsFatras/Selectors/SurfaceSelectors.hpp"
81 return surface.isSensitive();
91 template <
typename propagator_t,
typename interactions_t,
92 typename hit_surface_selector_t,
typename decay_t>
121 std::shared_ptr<const Acts::Logger> localLogger_)
136 template <
typename generator_t>
137 Acts::Result<ActsFatras::SingleParticleSimulationResult>
simulate(
138 const Acts::GeometryContext &geoCtx,
139 const Acts::MagneticFieldContext &magCtx, generator_t &generator,
140 const ActsFatras::Particle &particle)
const {
142 ACTS_VERBOSE(
"Using ActsFatrasSimTool simulate()");
144 using SteppingLogger = Acts::detail::SteppingLogger;
145 using SimulationActor = ActsFatras::detail::SimulationActor<generator_t, decay_t, interactions_t, hit_surface_selector_t>;
146 using Result =
typename SimulationActor::result_type;
147 using Actions = Acts::ActorList<SteppingLogger, SimulationActor, Acts::EndOfWorldReached>;
148 using PropagatorOptions =
typename propagator_t::template Options<Actions>;
151 PropagatorOptions options(geoCtx, magCtx);
154 actor.generator = &generator;
158 actor.initialParticle = particle;
160 Acts::BoundTrackParameters startPoint = Acts::BoundTrackParameters::createCurvilinear(
161 particle.fourPosition(), particle.direction(),
162 particle.qOverP(), std::nullopt, particle.hypothesis());
163 options.pathLimit =
pathLimit * Acts::UnitConstants::cm;
166 options.stepping.maxStepSize =
maxStepSize * Acts::UnitConstants::m;
167 options.direction = Acts::Direction::Forward();
169 auto result =
propagator.propagate(startPoint, options);
170 if (not result.ok()) {
171 return result.error();
193 ActsFatras::StandardChargedElectroMagneticInteractions;
196 ActsFatras::NoDecay>;
202 ActsFatras::NoDecay>;
226 const IInterface* parent);
234 const EventContext& ctx,
238 virtual StatusCode
setupEvent(
const EventContext&)
override {
242 return StatusCode::SUCCESS; };
244 std::vector<SiHitCollection> hitcolls;
249 return StatusCode::SUCCESS; };
254 const EventContext&)
const;
263 if (!thandle.empty() && thandle.retrieve().isFailure()) {
265 return StatusCode::FAILURE;
267 return StatusCode::SUCCESS;
271 const Acts::GeometryContext& anygctx,
273 const Acts::BoundTrackParameters& startParameters,
274 Acts::Direction navDir = Acts::Direction::Forward(),
275 double pathLimit = std::numeric_limits<double>::max())
const;
281 "RandomEngineName",
"Name of random number stream"};
287 PublicToolHandle<ActsTrk::IExtrapolationTool>
m_extrapolationTool{
this,
"ExtrapolationTool",
"ActsExtrapolationTool"};
291 this,
"TrackingGeometryTool",
"ActsTrackingGeometryTool"};
298 std::shared_ptr<const Acts::Logger>
m_logger{
nullptr};
302 this,
"ParticleFilter",
"",
"Particle filter kinematic cuts, etc."};
308 this,
"ActsFatrasWriteHandler",
"ActsFatrasWriteHandler"};
311 "Min pT of the interactions (MeV)"};
314 Gaudi::Property<bool>
m_meanEnergyLoss{
this,
"MeanEnergyLoss",
true,
"Toggle between mean and mode evaluation of energy loss"};
315 Gaudi::Property<bool>
m_includeGgradient{
this,
"IncludeGgradient",
true,
"Boolean flag for inclusion of d(dEds)d(q/p) into energy loss"};
316 Gaudi::Property<double>
m_momentumCutOff{
this,
"MomentumCutOff", 0.,
"Cut-off value for the momentum in SI units"};
318 Gaudi::Property<double>
m_maxStep{
this,
"MaxSteps", 1000,
319 "Max number of steps"};
321 "Maximum number of Runge-Kutta steps for the stepper step call"};
323 "Max step size (converted to Acts::UnitConstants::m)"};
325 "Track path limit (converted to Acts::UnitConstants::cm)"};
327 "Loop protection, it adapts the pathLimit"};
329 "Allowed loop fraction, 1 is a full loop"};
331 "Tolerance for the error of the integration"};
333 "Cut-off value for the step size"};
337 {{0,0}, {1,201}, {2,14}, {3,3}, {4,121}},
"proessType map <ActsFatras,G4>"};
#define ATH_CHECK
Evaluate an expression and check for errors.
AtlasHitsVector< SiHit > SiHitCollection
Define macros for attributes used to control the static checker.
A wrapper class for event-slot-local random engines.
This class provides an interface to generate or decode an identifier for the upper levels of the dete...
The generic ISF particle definition,.
This defines the McEventCollection, which is really just an ObjectVector of McEvent objectsFile: Gene...
The sim hit creator recieves a std::vector of Trk::TrackParameters and uses them to create simulated ...
T * get(TKey *tobj)
get a TObject* from a TKey* (why can't a TObject be a TKey?)
constexpr double energyToAthena(const double actsE)
Converts an energy scalar from Acts to Athena units.
constexpr double lengthToAthena(const double actsL)
Converts a length scalar from Acts to Athena units.
Eigen::Matrix< double, 3, 1 > Vector3D
int SimulationFlavor
Identifier type for simulation flavor.
std::list< ISF::ISFParticle * > ISFParticleContainer
generic ISFParticle container (not necessarily a std::list!)
std::vector< ISF::ISFParticle * > ISFParticleVector
ISFParticle vector.
Single particle simulation with fixed propagator, interactions, and decay.
HitSurfaceSelector selectHitSurface
ChargedInteractions interactions
double maxRungeKuttaStepTrials
const Acts::Logger & logger() const
Provide access to the local logger instance, e.g. for logging macros.
Acts::Result< ActsFatras::SingleParticleSimulationResult > simulate(const Acts::GeometryContext &geoCtx, const Acts::MagneticFieldContext &magCtx, generator_t &generator, const ActsFatras::Particle &particle) const
Simulate a single particle without secondaries.
ChargedPropagator propagator
SingleParticleSimulation(propagator_t &&propagator_, std::shared_ptr< const Acts::Logger > localLogger_)
Alternatively construct the simulator with an external logger.
std::shared_ptr< const Acts::Logger > localLogger
ActsFatras::NoDecay decay