19using CLHEP::c_squared;
22using CLHEP::electron_mass_c2;
27 const bool fcoulomb_scattering,
28 const bool floss_only,
29 const bool fprint_listing)
30 :
eparticle(primvol, pt, vel, ftime, fpardef, fieldmap),
31 m_coulomb_scattering(fcoulomb_scattering),
32 m_loss_only(floss_only),
33 m_print_listing(fprint_listing),
37 mfunname(
"void HeedParticle::physics()");
38 if (m_print_listing) {
39 mcout <<
"HeedParticle::physics is started\n";
50 auto etcs =
dynamic_cast<const EnTransfCS*
>(av);
55 const double* aetemp = emesh->
get_ae();
59 const double mp =
m_mass * c_squared;
62 const double mt = electron_mass_c2;
64 const double invSpeed = 1. /
m_prevpos.speed;
68 const long qa = matter->
qatom();
70 for (
long na = 0; na < qa; ++na) {
72 const long qs = hmd->
apacs[na]->get_qshell();
73 for (
long ns = 0; ns < qs; ++ns) {
75 if (etcs->quan[na][ns] <= 0.0)
continue;
77 const long qt =
pois(etcs->quan[na][ns] * stp);
79 if (qt <= 0)
continue;
80 for (
long nt = 0; nt < qt; ++nt) {
82 const double r = sampleTransfer(pcm, etcs->fadda[na][ns], SRANLUX());
84 const double et = r * MeV;
88 const double arange = SRANLUX() * range;
90 if (m_loss_only)
continue;
91 if (m_print_listing)
mcout <<
"generating new cluster\n";
92 if (m_store_clusters) {
93 m_clusterBank.emplace_back(
HeedCluster(et, pt, na, ns));
96 double theta_p, theta_t;
102 const double t =
m_prevpos.time + arange * invSpeed;
103 if (m_print_listing)
mcout <<
"generating new virtual photon\n";
114 secondaries.push_back(hp);
124 if (m_coulomb_scattering) {
127 const double sigma = etcs->sigma_ms *
sqrt(x);
132 if (m_print_listing) {
134 mcout <<
"Exiting HeedParticle::physics\n";
139 if (!m_coulomb_scattering)
return;
142 auto etcs =
dynamic_cast<const EnTransfCS*
>(av);
144 if (etcs->quanC > 0.) {
147 fmrange = std::min(fmrange, 0.1 / etcs->quanC);
153 file <<
"HeedParticle: particle_number=" << m_particle_number <<
" type=";
159 file <<
"\n edep=" << m_edep <<
"\n";
const double * get_ae(void) const
Return all left sides.
long get_q() const
Return number of bins.
Retrieve electric and magnetic field from Sensor.
std::vector< const AtomPhotoAbsCS * > apacs
double radiation_length
Radiation Length.
void print(std::ostream &file, int l) const override
Print-out.
void physics_mrange(double &fmrange) override
void physics(std::vector< gparticle * > &secondaries) override
Apply any other processes (turn the trajectory, kill the particle, ...).
HeedParticle()
Default constructor.
long m_na_absorbing
Index of absorbing atom.
long m_ns_absorbing
Index of absorbing shell.
bool m_delta_generated
Flag that delta-electrons are already generated (or cannot be created).
eparticle()=default
Default constructor.
HeedFieldMap * m_fieldMap
Pointer to field map.
stvpoint m_prevpos
Previous point.
void turn(const double ctheta, const double stheta)
Change the direction of the particle.
stvpoint m_currpos
Current point.
bool m_alive
Status flag whether the particle is active.
static std::atomic< long > s_counter
Instance counter.
Abstract base classs for volume "manipulators".
double m_curr_ekin
Current kinetic energy.
void print(std::ostream &file, int l) const override
Print-out.
double m_mass
Mass (not mass * speed_of_light^2)
void random_conic_vec(double theta)
void down(const basis *fabas)
DoubleAc cos(const DoubleAc &f)
void theta_two_part(const double Ep0, const double Ep1, const double Mp, const double Mt, double &theta_p, double &theta_t)
Scattering angles as function of incident and final projectile energy.
long pois(const double amu)
T t_hisran_step_ar(const M &mesh, const D &integ_y, T rannum)
DoubleAc fabs(const DoubleAc &f)
DoubleAc sin(const DoubleAc &f)
DoubleAc sqrt(const DoubleAc &f)
#define Iprint3n(file, name1, name2, name3)
#define Iprintn(file, name)
#define Iprint2n(file, name1, name2)