Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-09-27 09:14:54

0001 // Axial-vector meson photoproduction proceeding through the primakoff effect
0002 //
0003 // Author:       Daniel Winney (2020)
0004 // Affiliation:  Joint Physics Analysis Center (JPAC)
0005 // Email:        dwinney@iu.edu
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         // Constructor 
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         // individual helicity amplitudes not supported but need to provide definition for virtual class.
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         // instead we override the definition of differential_xsection in amplitude.hpp
0056         double differential_xsection(double s, double t);
0057         double integrated_xsection(double s);
0058 
0059         // only axial-vector kinematics allowed
0060         inline std::vector<std::array<int,2>> allowedJP()
0061         {
0062             return {{1, 1}};
0063         };
0064 
0065         private:
0066 
0067         // Parameters
0068         int    _helProj              = 0 ;  // longitudinal (0) or transverse (1) photon
0069         int    _atomicZ              = 0 ;  // atomic number
0070         double _atomicRadius         = 0.;  // radius parameter
0071         double _skinThickness        = 0.;  // skin thickness parameter
0072         double _photonCoupling       = 0.;  // X -> gamma gamma* coupling
0073 
0074         // Fermi model nuclear charge distribution
0075         inline double charge_distribution(double r)
0076         {
0077             return 1. / ( 1. + exp((r - _atomicRadius) / _skinThickness) );
0078         };
0079 
0080         // Normalized fourier transform of the above charge_distributions 
0081         double form_factor(double x);
0082         double _formFactor; // Form factor at energy t
0083         
0084         void calculate_norm();     
0085         double _rho0 = 0.;  // normalizaton
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         // Kinematic quantities   
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             // lab frame momentum transfer
0102             _nu = (_s - _mA2 + _mQ2) / (2. * sqrt(_mA2));
0103 
0104             // Momentum of photon
0105             _pGam = sqrt(_nu*_nu + _mQ2);
0106 
0107             // // Momentum of the X
0108             _pX  = sqrt(_t*_t + 4.*sqrt(_mA2)*_t*_nu + 4.*_mA2*(_nu*_nu - _mX2));
0109             _pX /= 2. * sqrt(_mA2);
0110 
0111             // Energy of the X
0112             _enX = sqrt(_pX*_pX + _mX2);
0113 
0114             // Cosine of scattering angle of the X in the lab frame
0115             _cosX  = _t + _mQ2 - _mX2 + 2.*_nu*_enX;
0116             _cosX /= 2. * _pX * _pGam;
0117 
0118             // // Sine of the above 
0119             _sinX2 = 1. - _cosX * _cosX;
0120         };
0121 
0122         // Spin summed amplitude squared
0123         long double amplitude_squared();
0124     };
0125 };
0126 
0127 #endif