|
|
Go to the documentation of this file.
10 #include <Math/RotationY.h>
11 #include <Math/RotationZ.h>
56 std::vector<std::unique_ptr<Particle> > &secondaries,
77 double gbteth(
const double ener,
101 A_ =
cfg.getParameter<
double>(
"A");
102 Z_ =
cfg.getParameter<
double>(
"Z");
109 std::vector<std::unique_ptr<fastsim::Particle> > &secondaries,
120 if (radLengths < 1E-10) {
127 if (radLengths > 4.) {
128 particle.
momentum().SetXYZT(0., 0., 0., 0.);
133 if (particle.
momentum().E() - particle.
momentum().mass() < minPhotonEnergy_) {
150 Petrfunc->SetParameters(particle.
momentum().E(), A_, Z_);
154 double distance = radLengths * radLenInCm_;
159 if (bremProba < 1E-10) {
171 double phi = particle.
momentum().Phi();
174 for (
unsigned int i = 0;
i < nPhotons; ++
i) {
183 photonMom = ROOT::Math::RotationZ(phi) * (ROOT::Math::RotationY(
theta) * photonMom);
198 double xp = Petrfunc->GetRandom();
226 const double alfa = 0.625;
228 const double d = 0.13 * (0.8 + 1.3 / Z_) * (100.0 + (1.0 / ener)) * (1.0 + efrac);
229 const double w1 = 9.0 / (9.0 +
d);
230 const double umax = ener *
M_PI / partm;
234 double beta = (random.
flatShoot() <= w1) ? alfa : 3.0 * alfa;
288 double Z13 =
pow(
Z, -1. / 3.);
289 double Z23 =
pow(
Z, -2. / 3.);
292 double emass = 0.0005109990615;
293 double mumass = 0.105658367;
295 double alpha = 0.00729735;
296 double constant = 1.85736e-30;
299 if (nu * E >= E - mumass)
302 double Dn = 1.54 * (
pow(
A, 0.27));
303 double Dnl =
pow(Dn, (1. - 1. /
Z));
305 double delta = (mumass * mumass * nu) / (2. * E * (1. - nu));
307 double Phi_n = TMath::Log(
B * Z13 * (mumass +
delta * (Dnl * ee - 2)) / (Dnl * (emass +
delta * ee *
B * Z13)));
312 TMath::Log((Bl * Z23 * mumass) / (1. +
delta * mumass / (emass * emass * ee)) / (emass +
delta * ee * Bl * Z23));
313 if (Phi_e < 0 || nu * E >= E / (1. + (mumass * mumass / (2. * emass * E))))
317 double f = 16. / 3. *
alpha * constant *
Z * (
Z * Phi_n + Phi_e) * (1. / nu) * (1. - nu + 0.75 * nu * nu);
void interact(Particle &particle, const SimplifiedGeometry &layer, std::vector< std::unique_ptr< Particle > > &secondaries, const RandomEngineAndDistribution &random) override
Perform the interaction.
Implementation of Bremsstrahlung from mu+/mu- in the tracker layers based on a Petrukhin Model (nucle...
const math::XYZTLorentzVector & momentum() const
Return momentum of the particle.
double radLenInCm_
Radiation length of material (usually silicon X0=9.360)
Implementation of a generic detector layer (base class for forward/barrel layers).
double minPhotonEnergyFraction_
Cut on minimum fraction of particle's energy which has to be carried by photon.
double PetrukhinFunc(double *x, double *p)
math::XYZTLorentzVector brem(Particle &particle, double xmin, const RandomEngineAndDistribution &random) const
Compute Brem photon energy and angles, if any.
Sin< T >::type sin(const T &t)
Base class for any interaction model between a particle and a tracker layer.
double density_
Density of material (usually silicon rho=2.329)
Cos< T >::type cos(const T &t)
TF1 * Petrfunc
The Petrukhin Function.
Geom::Theta< T > theta() const
#define DEFINE_EDM_PLUGIN(factory, type, name)
const math::XYZTLorentzVector & position() const
Return position of the particle.
constexpr std::array< uint8_t, layerIndexSize > layer
~MuonBremsstrahlung() override
Default destructor.
double gbteth(const double ener, const double partm, const double efrac, const RandomEngineAndDistribution &random) const
A universal angular distribution.
double minPhotonEnergy_
Cut on minimum energy of bremsstrahlung photons.
int pdgId() const
Return pdgId of the particle.
Definition of a generic FastSim Particle which can be propagated through the detector (formerly Parti...
static constexpr double muMass
Muon mass [GeV].
double flatShoot(double xmin=0.0, double xmax=1.0) const
MuonBremsstrahlung(const std::string &name, const edm::ParameterSet &cfg)
Constructor.
static const std::string B
XYZTLorentzVectorD XYZTLorentzVector
Lorentz vector with cylindrical internal representation using pseudorapidity.
static double PetrukhinFunc(double *x, double *p)
Petrukhin Function: Returns cross section using nuclear-electron screening correction from G4 style.
Power< A, B >::type pow(const A &a, const B &b)
Abs< T >::type abs(const T &t)
double A_
Atomic weight of material (usually silicon A=28.0855)
double Z_
Atomic number of material (usually silicon Z=14)
unsigned int poissonShoot(double mean) const
static constexpr double NA
Avogadro's number.