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
NucleonFormFactors.hh
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#pragma once
18
19// Standard library includes
20#include <cmath>
21#include <memory>
22#include <string>
23#include <vector>
24
25namespace marley {
26
27 class JSON;
28
29 class SachsFormFactors {
30 public:
31
32 SachsFormFactors() {}
33 virtual ~SachsFormFactors() = default;
34
38 virtual double GEp( double Q2 ) = 0;
39
43 virtual double GEn( double Q2 ) = 0;
44
48 virtual double GMp( double Q2 ) = 0;
49
53 virtual double GMn( double Q2 ) = 0;
54
59 virtual double tau( double Q2 );
60 };
61
62 class DipoleSachsFormFactors : public SachsFormFactors {
63
64 public:
65
67 DipoleSachsFormFactors( double Mv ) : Mv_( Mv ) {}
68 virtual ~DipoleSachsFormFactors() = default;
69
70 virtual double GEp( double Q2 ) override final;
71 inline virtual double GEn( double /*Q2*/ ) override final { return 0.; }
72 virtual double GMp( double Q2 ) override final;
73 virtual double GMn( double Q2 ) override final;
74
77 inline double dipole( double Q2 )
78 { return 1.0 / std::pow( 1.0 + Q2 / Mv_ / Mv_, 2 ); }
79
80 protected:
81
83 double Mv_;
84 };
85
86
87 class BBBA05SachsFormFactors : public SachsFormFactors {
88
89 public:
90
91 BBBA05SachsFormFactors() {}
92 virtual ~BBBA05SachsFormFactors() = default;
93
94 virtual double GEp( double Q2 ) override final;
95 virtual double GEn( double Q2 ) override final;
96 virtual double GMp( double Q2 ) override final;
97 virtual double GMn( double Q2 ) override final;
98
99 protected:
100
110 double bbba05_G( double tau, const std::vector< double >& a_coeffs,
111 const std::vector< double >& b_coeffs );
112 };
113
114 class AxialFormFactors {
115 public:
116
117 AxialFormFactors() {}
118 virtual ~AxialFormFactors() = default;
119
121 virtual double FA( double Q2 ) = 0;
122
124 virtual double FP( double Q2 ) = 0;
125 };
126
127 class DipoleAxialFormFactors : public AxialFormFactors {
128 public:
129
130 // @param gA Axial-vector coupling constant (dimensionless)
131 // @param Ma Axial mass parameter (MeV)
132 DipoleAxialFormFactors( double gA, double Ma ) : gA_( gA ), Ma_( Ma ) {}
133 virtual ~DipoleAxialFormFactors() = default;
134
135 inline double FA( double Q2 ) override final
136 { return -gA_ / std::pow( 1.0 + Q2 / Ma_ / Ma_, 2 ); }
137
138 double FP( double Q2 ) override final;
139
140 protected:
141
143 double gA_;
144
146 double Ma_;
147 };
148
150 class NucleonFormFactors {
151 public:
152
153 NucleonFormFactors( const JSON& config );
154
158 inline double F1( double Q2 ) const
159 { return this->F1p( Q2 ) - this->F1n( Q2 ); }
160
164 inline double F2( double Q2 ) const
165 { return this->F2p( Q2 ) - this->F2n( Q2 ); }
166
170 double F1p( double Q2 ) const;
171
175 double F1n( double Q2 ) const;
176
180 double F2p( double Q2 ) const;
181
185 double F2n( double Q2 ) const;
186
190 inline double FA( double Q2 ) const { return axial_ff_->FA( Q2 ); }
191
195 inline double FP( double Q2 ) const { return axial_ff_->FP( Q2 ); }
196
198 inline const SachsFormFactors* sachs_ff() const
199 { return sachs_ff_.get(); }
200
202 inline const AxialFormFactors* axial_ff() const
203 { return axial_ff_.get(); }
204
205 protected:
206
207 std::shared_ptr< SachsFormFactors > sachs_ff_;
208 std::shared_ptr< AxialFormFactors > axial_ff_;
209 };
210
212 class TrivialSachsFormFactors : public SachsFormFactors {
213
214 public:
215
216 TrivialSachsFormFactors() {}
217 virtual ~TrivialSachsFormFactors() = default;
218
219 virtual double GEp( double Q2 ) override final;
220 virtual double GEn( double Q2 ) override final;
221 virtual double GMp( double Q2 ) override final;
222 virtual double GMn( double Q2 ) override final;
223
225 inline virtual double tau( double /*Q2*/ ) override final { return 0.; }
226 };
227
229 class TrivialAxialFormFactors : public AxialFormFactors {
230
231 public:
232
233 TrivialAxialFormFactors() {}
234 virtual ~TrivialAxialFormFactors() = default;
235
236 double FA( double Q2 ) override final;
237 double FP( double Q2 ) override final;
238
239 };
240
241} // marley namespace
virtual double FP(double Q2)=0
Pseudoscalar form factor.
virtual double FA(double Q2)=0
Axial-vector form factor.
virtual double GMp(double Q2) override final
virtual double GEn(double Q2) override final
virtual double GEp(double Q2) override final
virtual double GMn(double Q2) override final
double bbba05_G(double tau, const std::vector< double > &a_coeffs, const std::vector< double > &b_coeffs)
Helper function for the form factor calculation.
double gA_
Axial-vector coupling constant of the nucleon (dimensionless)
double FA(double Q2) override final
Axial-vector form factor.
double Ma_
Axial mass parameter (MeV)
double FP(double Q2) override final
Pseudoscalar form factor.
virtual double GEp(double Q2) override final
double Mv_
Vector mass parameter (MeV)
virtual double GMp(double Q2) override final
virtual double GMn(double Q2) override final
virtual double GEn(double) override final
double F1p(double Q2) const
double F2(double Q2) const
const SachsFormFactors * sachs_ff() const
Get const access to the owned Sachs form factors.
const AxialFormFactors * axial_ff() const
Get const access to the owned axial form factors.
double F1(double Q2) const
double F1n(double Q2) const
double F2n(double Q2) const
double F2p(double Q2) const
double FP(double Q2) const
double FA(double Q2) const
virtual double GMp(double Q2)=0
virtual double GMn(double Q2)=0
virtual double GEp(double Q2)=0
virtual double GEn(double Q2)=0
virtual double tau(double Q2)
double FA(double Q2) override final
Axial-vector form factor.
double FP(double Q2) override final
Pseudoscalar form factor.
virtual double GEp(double Q2) override final
virtual double GEn(double Q2) override final
virtual double GMn(double Q2) override final
virtual double tau(double) override final
Neglect the dependence of the form factors entirely.
virtual double GMp(double Q2) override final