MARLEY (Model of Argon Reaction Low Energy Yields) v2.0.0
A Monte Carlo event generator for tens-of-MeV neutrino interactions
Loading...
Searching...
No Matches
WeisskopfSingleParticleModel.cc
1
4//
5// This file is part of MARLEY (Model of Argon Reaction Low Energy Yields)
6//
7// MARLEY is free software: you can redistribute it and/or modify it under the
8// terms of version 3 of the GNU General Public License as published by the
9// Free Software Foundation.
10//
11// For the full text of the license please see COPYING or
12// visit http://opensource.org/licenses/GPL-3.0
13//
14// Please respect the MCnet academic usage guidelines. See GUIDELINES
15// or visit https://www.montecarlonet.org/GUIDELINES for details.
16
17#include "marley/marley_utils.hh"
18#include "marley/Error.hh"
19#include "marley/Logger.hh"
20#include "marley/MassTable.hh"
21#include "marley/WeisskopfSingleParticleModel.hh"
22
24
26 int A, double D0) : marley::GammaStrengthFunctionModel(Z, A), D0_(D0)
27{
28 if (D0_ <= 0.) throw marley::Error("Invalid"
29 " level spacing parameter " + std::to_string(D0_)
30 + " MeV passed to the constructor of"
31 " marley::WeisskopfGammaStrengthFunctionModel.");
32}
33
34// Computes the partial decay width for a gamma transition under the Weisskopf
35// single-particle approximation.
36double marley::WeisskopfSingleParticleModel::partial_decay_width(TrType type,
37 int l, double e_gamma)
38{
39 return D0_ * std::pow(e_gamma, 2*l + 1)
40 * strength_function(type, l, e_gamma);
41}
42
44 int l, double /*e_gamma unused*/)
45{
47
48 // Compute double factorial of 2l + 1
49 int dfact = 1;
50 for (int n = 2*l + 1; n > 0; n -= 2) dfact *= n;
51
52 // Multipolarity factor (dimensionless)
53 double lambda = (l + 1.) / (l * std::pow(dfact, 2))
54 * std::pow(3.0 / (l + 3.), 2);
55
56 // Estimated nuclear radius (fm)
57 double R = marley_utils::r0 * std::pow(A_, 1.0/3.0);
58
59 // Electric transition strength function (MeV^[-2l-1])
60 double el_sf = 2 * marley_utils::alpha * lambda
61 * std::pow(R / marley_utils::hbar_c, 2*l) / D0_;
62
63 if (type == TrType::electric) {
64 return el_sf;
65 }
66
67 else if (type == TrType::magnetic) {
68 static const double mp = marley::MassTable::Instance().get_particle_mass(
69 marley_utils::PROTON);
70 return 10. * el_sf * std::pow(marley_utils::hbar_c / (mp * R), 2);
71 }
72
73 else if (type == TrType::unphysical) {
74 MARLEY_LOG( WARN, "physics.deexcitation" )
75 << "Unphysical EM transition encountered in"
76 << " WeisskopfSingleParticleModel::strength_function()."
77 << " The strength function will be set to zero.";
78 return 0.;
79 }
80
81 // @todo Improve error message
82 else throw marley::Error( "Invalid transition type"
83 " given for Weisskopf gamma-ray strength function calculation" );
84}
85
87 TrType type, int l, double e_gamma)
88{
89 return 2. * marley_utils::pi * strength_function(type, l, e_gamma)
90 * std::pow(e_gamma, 2*l + 1);
91}
Base class for all exceptions thrown by MARLEY functions.
Definition Error.hh:26
TransitionType
Electromagnetic transitions in nuclei may be classified by their multipolarity (electric vs....
static void check_multipolarity(int l)
Check that l > 0 and throw a marley::Error if it is not.
static const MassTable & Instance()
Get a const reference to the singleton instance of the MassTable.
Definition MassTable.cc:69
double get_particle_mass(int pdg_code) const
Get the mass of a particle.
Definition MassTable.cc:84
virtual double strength_function(TransitionType type, int l, double e_gamma) override
Returns the gamma-ray strength function (MeV –2 –1) for the requested gamma energy and multipolarity.
virtual double transmission_coefficient(TransitionType type, int l, double e_gamma) override
Returns the gamma-ray transmission coefficient (dimensionless) for the requested gamma energy and mul...
WeisskopfSingleParticleModel(int Z, int A, double D0=1.)