18using CLHEP::c_squared;
21using CLHEP::electron_mass_c2;
27 const bool floss_only,
28 const bool fprint_listing)
29 :
eparticle(primvol, pt, vel, ftime, fpardef, fieldmap),
30 m_print_listing(fprint_listing),
31 m_loss_only(floss_only),
35 mfunname(
"void HeedParticle_BGM::physics()");
36 if (m_print_listing) {
37 mcout <<
"HeedParticle_BGM::physics is started\n";
57 const double mp =
m_mass * c_squared;
61 const double mt = electron_mass_c2;
63 const double invSpeed = 1. /
m_prevpos.speed;
70 mcerr <<
"ERROR in void HeedParticle_BGM::physics()\n";
71 mcerr <<
"beta*gamma is outside range of cross-section table\n";
72 std::streamsize old_prec =
mcerr.precision(15);
74 mcerr.precision(old_prec);
78 mcerr <<
"This particle is:\n";
80 mcerr <<
"This volume is:\n";
86 const double f2 = (bg - b1) * (b2 - b1);
87 const double f1 = 1. - f2;
88 const long qa = matter->
qatom();
94 for (
long na = 0; na < qa; ++na) {
96 long qs = hmd->
apacs[na]->get_qshell();
97 for (
long ns = 0; ns < qs; ++ns) {
99 const double y1 = etcs->etcs_bgm[n1].quan[na][ns];
100 const double y2 = etcs->etcs_bgm[n2].quan[na][ns];
101 const double mean_pois = f1 * y1 + f2 * y2;
102 if (mean_pois <= 0.)
continue;
103 const long qt =
pois(mean_pois * stp);
105 if (qt <= 0)
continue;
106 for (
long nt = 0; nt < qt; nt++) {
108 const double rn = SRANLUX();
109 const double r1 = sampleTransfer(pcm_e, etcs->etcs_bgm[n1].fadda[na][ns], rn);
110 const double r2 = sampleTransfer(pcm_e, etcs->etcs_bgm[n2].fadda[na][ns], rn);
111 const double r = f1 * r1 + f2 * r2;
112 if (m_print_listing) {
117 const double et = r * MeV;
121 const double arange = SRANLUX() * range;
123 if (m_loss_only)
continue;
124 if (m_print_listing)
mcout <<
"generating new cluster\n";
125 m_clusterBank.push_back(
HeedCluster(et, pt, na, ns));
127 double theta_p, theta_t;
133 const double t =
m_prevpos.time + arange * invSpeed;
134 if (m_print_listing)
mcout <<
"generating new virtual photon\n";
145 secondaries.push_back(hp);
154 if (m_print_listing) {
156 mcout <<
"Exiting HeedParticle_BGM::physics\n";
162 Ifile <<
"HeedParticle_BGM (l=" << l
163 <<
"): particle_number=" << m_particle_number <<
" type=";
Energy transfer cross-section.
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
HeedParticle_BGM()
Default constructor.
void print(std::ostream &file, int l) const override
Print-out.
void physics(std::vector< gparticle * > &secondaries) override
Apply any other processes (turn the trajectory, kill the particle, ...).
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).
virtual int get_interval(long n, T &b1, T &b2) const
virtual void print(std::ostream &file, int l) const
eparticle()=default
Default constructor.
HeedFieldMap * m_fieldMap
Pointer to field map.
stvpoint m_prevpos
Previous point.
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_curr_gamma_1
Current .
double m_mass
Mass (not mass * speed_of_light^2)
void random_conic_vec(double theta)
void down(const basis *fabas)
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 sqrt(const DoubleAc &f)
#define Iprint3n(file, name1, name2, name3)
#define Iprintn(file, name)
#define Iprint2n(file, name1, name2)