65 std::vector<Electron>
ions;
75 bool NewTrack(
const double x0,
const double y0,
const double z0,
76 const double t0,
const double dx0,
const double dy0,
77 const double dz0)
override;
78 bool GetCluster(
double& xc,
double& yc,
double& zc,
double& tc,
int& nc,
79 double& ec,
double& extra)
override;
83 bool GetCluster(
double& xc,
double& yc,
double& zc,
double& tc,
84 int& ne,
int& ni,
double& ec,
double& extra);
94 bool GetCluster(
double& xc,
double& yc,
double& zc,
double& tc,
95 int& ne,
int& ni,
int& np,
double& ec,
double& extra);
104 bool GetElectron(
const unsigned int i,
double& x,
double& y,
double& z,
105 double& t,
double& e,
double& dx,
double& dy,
double& dz);
111 bool GetIon(
const unsigned int i,
double& x,
double& y,
double& z,
121 bool GetPhoton(
const unsigned int i,
double& x,
double& y,
double& z,
122 double& t,
double& e,
double& dx,
double& dy,
145 const double t0,
const double e0,
146 const double dx0,
const double dy0,
147 const double dz0,
int& ne,
int& ni);
156 const double t0,
const double e0,
157 const double dx0,
const double dy0,
158 const double dz0,
int& ne);
169 void TransportPhoton(
const double x0,
const double y0,
const double z0,
170 const double t0,
const double e0,
const double dx0,
171 const double dy0,
const double dz0,
172 int& ne,
int& ni,
int& np);
182 void TransportPhoton(
const double x0,
const double y0,
const double z0,
183 const double t0,
const double e0,
const double dx0,
184 const double dy0,
const double dz0,
int& ne,
int& ni);
192 void TransportPhoton(
const double x0,
const double y0,
const double z0,
193 const double t0,
const double e0,
const double dx0,
194 const double dy0,
const double dz0,
int& ne);
216 const double stepAngleStraight,
217 const double stepAngleCurved) {
219 m_radStraight = radStraight;
220 m_stepAngleStraight = stepAngleStraight;
221 m_stepAngleCurved = stepAngleCurved;
224 double& stepAngleStraight,
double& stepAngleCurved) {
226 radStraight = m_radStraight;
227 stepAngleStraight = m_stepAngleStraight;
228 stepAngleCurved = m_stepAngleCurved;
232 m_coulombScattering = on;
241 m_doPhotonReabsorption = on;
246 m_usePacsOutput = on;
252 void SetEnergyMesh(
const double e0,
const double e1,
const int nsteps);
264 bool m_oneStepFly =
false;
266 bool m_ready =
false;
267 bool m_hasActiveTrack =
false;
269 double m_mediumDensity = -1.;
270 std::string m_mediumName =
"";
272 bool m_usePacsOutput =
false;
274 bool m_doPhotonReabsorption =
true;
275 bool m_coulombScattering =
false;
276 bool m_useBfieldAuto =
true;
277 bool m_doDeltaTransport =
true;
279 std::vector<Cluster> m_clusters;
280 size_t m_cluster = 0;
283 std::unique_ptr<Heed::particle_def> m_particle_def;
285 std::unique_ptr<Heed::HeedMatterDef> m_matter;
286 std::unique_ptr<Heed::GasDef> m_gas;
287 std::unique_ptr<Heed::MatterDef> m_material;
290 double m_emin = 2.e-6;
291 double m_emax = 2.e-1;
292 unsigned int m_nEnergyIntervals = 200;
293 std::unique_ptr<Heed::EnergyMesh> m_energyMesh;
296 std::unique_ptr<Heed::EnTransfCS> m_transferCs;
297 std::unique_ptr<Heed::ElElasticScat> m_elScat;
298 std::unique_ptr<Heed::ElElasticScatLowSigma> m_lowSigma;
299 std::unique_ptr<Heed::PairProd> m_pairProd;
300 std::unique_ptr<Heed::HeedDeltaElectronCS> m_deltaCs;
303 std::unique_ptr<HeedChamber> m_chamber;
304 std::unique_ptr<Heed::HeedFieldMap> m_fieldMap;
307 double m_lX = 0., m_lY = 0., m_lZ = 0.;
308 double m_cX = 0., m_cY = 0., m_cZ = 0.;
312 double m_maxStep = 100.;
314 double m_radStraight = 1000.;
316 double m_stepAngleStraight = 0.1;
318 double m_stepAngleCurved = 0.2;
320 bool SetupGas(
Medium* medium);
321 bool SetupMaterial(
Medium* medium);
322 bool SetupDelta(
const std::string& databasePath);
324 std::vector<Cluster>& clusters);
326 const std::vector<Heed::HeedCondElectron>& conductionElectrons,
327 std::vector<Electron>& electrons);
328 bool IsInside(
const double x,
const double y,
const double z);
329 bool UpdateBoundingBox(
bool& update);
Abstract base class for media.
Generate tracks using Heed++.
void EnableMagneticField()
Take the magnetic field into account in the stepping algorithm.
void SetEnergyMesh(const double e0, const double e1, const int nsteps)
void EnablePhotonReabsorption(const bool on=true)
Simulate (or not) the photons produced in the atomic relaxation cascade.
void EnablePhotoAbsorptionCrossSectionOutput(const bool on)
Write the photoabsorption cross-sections used to a text file.
void EnableElectricField()
Take the electric field into account in the stepping algorithm.
void DisableMagneticField()
Do not take the magnetic field into account in the stepping algorithm.
double GetPhotoAbsorptionCrossSection(const double e) const
Return the photoabsorption cross-section at a given energy.
void EnableOneStepFly(const bool on)
void TransportDeltaElectron(const double x0, const double y0, const double z0, const double t0, const double e0, const double dx0, const double dy0, const double dz0, int &ne, int &ni)
void DisableDeltaElectronTransport()
Switch simulation of delta electrons off.
double GetFanoFactor() const
Return the Fano factor of the medium (of the last simulated track).
void EnableCoulombScattering(const bool on=true)
bool GetPhoton(const unsigned int i, double &x, double &y, double &z, double &t, double &e, double &dx, double &dy, double &dz) const
bool NewTrack(const double x0, const double y0, const double z0, const double t0, const double dx0, const double dy0, const double dz0) override
bool Initialise(Medium *medium, const bool verbose=false)
Compute the differential cross-section for a given medium.
void SetSteppingLimits(const double maxStep, const double radStraight, const double stepAngleStraight, const double stepAngleCurved)
void EnableDeltaElectronTransport()
Switch simulation of delta electrons on.
bool GetElectron(const unsigned int i, double &x, double &y, double &z, double &t, double &e, double &dx, double &dy, double &dz)
bool GetIon(const unsigned int i, double &x, double &y, double &z, double &t) const
const std::vector< Cluster > & GetClusters() const
virtual ~TrackHeed()
Destructor.
TrackHeed()
Default constructor.
void TransportPhoton(const double x0, const double y0, const double z0, const double t0, const double e0, const double dx0, const double dy0, const double dz0, int &ne, int &ni, int &np)
double GetW() const
Return the W value of the medium (of the last simulated track).
void SetParticleUser(const double m, const double z)
bool GetCluster(double &xc, double &yc, double &zc, double &tc, int &nc, double &ec, double &extra) override
double GetClusterDensity() override
void DisableElectricField()
Do not take the electric field into account in the stepping algorithm.
void GetSteppingLimits(double &maxStep, double &radStraight, double &stepAngleStraight, double &stepAngleCurved)
double GetStoppingPower() override
Get the stopping power (mean energy loss [eV] per cm).
Track()=delete
Default constructor.
Retrieve electric and magnetic field from Sensor.
std::vector< Electron > ions
std::vector< Photon > photons
std::vector< Electron > electrons