File indexing completed on 2026-09-27 09:14:54
0001
0002
0003
0004
0005
0006
0007
0008 #ifndef _PRIMAKOFF_
0009 #define _PRIMAKOFF_
0010
0011 #include "amplitude.hpp"
0012
0013 namespace jpacPhoto
0014 {
0015 class primakoff_effect : public amplitude
0016 {
0017 public:
0018
0019 primakoff_effect(reaction_kinematics * xkinem, std::string amp_id = "primakoff_effect")
0020 : amplitude(xkinem, amp_id)
0021 {
0022 set_nParams(4);
0023 check_JP(xkinem->_jp);
0024 };
0025
0026 void set_params(std::vector<double> params)
0027 {
0028 check_nParams(params);
0029 _atomicZ = params[0];
0030 _atomicRadius = params[1];
0031 _skinThickness = params[2];
0032 _photonCoupling = params[3];
0033
0034 calculate_norm();
0035 };
0036
0037 inline void set_LT(int LT)
0038 {
0039 if (LT > 1 || LT < 0)
0040 {
0041 std::cout << "error! invalid parameter in set_LT(). \n";
0042 std::cout << "LT = 0 for longitudinal and 1 for transverse photon.\n";
0043 };
0044
0045 _helProj = LT;
0046 };
0047
0048
0049 inline std::complex<double> helicity_amplitude(std::array<int, 4> helicities, double s, double t)
0050 {
0051 std::cout << "Warning! Individual helicity amplitudes not supported by primakoff_effect!\n";
0052 return 0.;
0053 }
0054
0055
0056 double differential_xsection(double s, double t);
0057 double integrated_xsection(double s);
0058
0059
0060 inline std::vector<std::array<int,2>> allowedJP()
0061 {
0062 return {{1, 1}};
0063 };
0064
0065 private:
0066
0067
0068 int _helProj = 0 ;
0069 int _atomicZ = 0 ;
0070 double _atomicRadius = 0.;
0071 double _skinThickness = 0.;
0072 double _photonCoupling = 0.;
0073
0074
0075 inline double charge_distribution(double r)
0076 {
0077 return 1. / ( 1. + exp((r - _atomicRadius) / _skinThickness) );
0078 };
0079
0080
0081 double form_factor(double x);
0082 double _formFactor;
0083
0084 void calculate_norm();
0085 double _rho0 = 0.;
0086 inline double W_00()
0087 {
0088 return 64. * _atomicZ*_atomicZ * _mA2 * _mA2 * _mA2 * _formFactor * _formFactor / ((_t - 4.*_mA2) * (_t - 4.*_mA2));
0089 };
0090
0091
0092 long double _mX2 = _kinematics->_mX2;
0093 long double _mA2 = _kinematics->_mT2;
0094 long double _mQ2 = -_kinematics->_mB2;
0095
0096 long double _cosX, _sinX2;
0097 long double _pGam, _pX;
0098 long double _nu, _enX;
0099 inline void update_kinematics()
0100 {
0101
0102 _nu = (_s - _mA2 + _mQ2) / (2. * sqrt(_mA2));
0103
0104
0105 _pGam = sqrt(_nu*_nu + _mQ2);
0106
0107
0108 _pX = sqrt(_t*_t + 4.*sqrt(_mA2)*_t*_nu + 4.*_mA2*(_nu*_nu - _mX2));
0109 _pX /= 2. * sqrt(_mA2);
0110
0111
0112 _enX = sqrt(_pX*_pX + _mX2);
0113
0114
0115 _cosX = _t + _mQ2 - _mX2 + 2.*_nu*_enX;
0116 _cosX /= 2. * _pX * _pGam;
0117
0118
0119 _sinX2 = 1. - _cosX * _cosX;
0120 };
0121
0122
0123 long double amplitude_squared();
0124 };
0125 };
0126
0127 #endif