Back to home page

EIC code displayed by LXR

 
 

    


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

0001 // lAger: General Purpose l/A-event Generator
0002 // Copyright (C) 2016-2021 Sylvester Joosten <sjoosten@anl.gov>
0003 // 
0004 // This file is part of lAger.
0005 // 
0006 // lAger is free software: you can redistribute it and/or modify
0007 // it under the terms of the GNU General Public License as published by
0008 // the Free Shoftware Foundation, either version 3 of the License, or
0009 // (at your option) any later version.
0010 // 
0011 // lAger is distributed in the hope that it will be useful,
0012 // but WITHOUT ANY WARRANTY; without even the implied warranty of
0013 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0014 // GNU General Public License for more details.
0015 // 
0016 // You should have received a copy of the GNU General Public License
0017 // along with lAger.  If not, see <https://www.gnu.org/licenses/>.
0018 // 
0019 
0020 #ifndef LAGER_PHYSICS_PHOTON_LOADED
0021 #define LAGER_PHYSICS_PHOTON_LOADED
0022 
0023 #include <TLorentzVector.h>
0024 #include <TMath.h>
0025 #include <cmath>
0026 #include <lager/core/particle.hh>
0027 #include <lager/physics/constants.hh> // for ALPHA
0028 
0029 // =============================================================================
0030 // PHOTON and VIRTUAL PHOTON physics
0031 // =============================================================================
0032 
0033 namespace lager {
0034 namespace physics {
0035 
0036 // =============================================================================
0037 // BREMSSTRAHLUNG
0038 // =============================================================================
0039 // approximate bremsstrahlung d/dk for a radiation length t
0040 // using the approximate formula by Tsai and Whitis,
0041 // SLAC-PUB-184 1966 (eq. 25) valid for thicker targets.
0042 // parameters:
0043 //  * t: radiation length
0044 //  * E0: primary beam energy
0045 //  * k: photon energy
0046 inline double bremsstrahlung_approx(const double t, const double E0, const double k) {
0047   double num = std::pow(1.0 - k / E0, 4.0 * t / 3.0) - std::exp(-7.0 * t / 9.0);
0048   double den = 7.0 / 9.0 + (4.0 / 3.0) * std::log(1.0 - k / E0);
0049   return (num / (k * den));
0050 }
0051 
0052 // =============================================================================
0053 // VIRTUAL PHOTON FLUX
0054 // =============================================================================
0055 //
0056 // =============================================================================
0057 // GAMMA_T
0058 //
0059 // transverse virtual photon flux d(logQ2)d(logy)
0060 // this is the default implementation, rather than d/dQ2dy to avoid running
0061 // into machine precision issues when values of Q2 gets small
0062 //
0063 // Based on 
0064 // Budnev, et. al., PhysRept, 1975, Vol15 (4), pp 181-282 
0065 //    equation (6.8) - (6.10)
0066 //    doi:10.1016/0370-1573(75)90009-5.
0067 inline double gamma_t_log(const double Q2, const double y, const particle& beam,
0068                           const particle& target) {
0069   // target-rest-frame lepton energy
0070   const double E = (beam.p()).Dot(target.p()) / target.mass();
0071   const double E2 = E * E;
0072   // beam particle masses
0073   const double m = beam.mass();
0074   const double m2 = m * m;
0075   // other kinematic variables
0076   const double nu = y * E;
0077   const double nu2 = nu * nu;
0078   // density matrix element
0079   const double tworhopp =
0080       (2. * E - nu) * (2. * E - nu) / (nu2 + Q2) + 1 - 4 * m2 / Q2;
0081   // jacobian for dnu -> E dy
0082   // and
0083   // jacobian for dy -> y d(logy)
0084   const double jacobian = E * y;
0085   // putting all together
0086   const double gamma_t = ALPHA / 2. / TMath::TwoPi() * sqrt(nu2 + Q2) /
0087                          (E2 - m2) * tworhopp * jacobian;
0088   return gamma_t;
0089 }
0090 // same as gamma_t_log, but differential in y and Q2
0091 inline double gamma_t(const double Q2, const double y, const particle& beam,
0092                       const particle& target) {
0093   return gamma_t_log(Q2, y, beam, target) / Q2 / y;
0094 }
0095 
0096 // =============================================================================
0097 // EPSILON
0098 //
0099 // epsilon = Gamma_L / Gamma_T = 2rho++ / rho00
0100 // Based on 
0101 // Budnev, et. al., PhysRept, 1975, Vol15 (4), pp 181-282 
0102 //    equation (6.8) - (6.10)
0103 //    doi:10.1016/0370-1573(75)90009-5.
0104 inline double epsilon(const double Q2, const double y, const particle& beam,
0105                       const particle& target) {
0106   // target-rest-frame lepton energy
0107   const double E = (beam.p()).Dot(target.p()) / target.mass();
0108   // beam particle masses
0109   const double m = beam.mass();
0110   const double m2 = m * m;
0111   // other kinematic variables
0112   const double nu = y * E;
0113   const double nu2 = nu * nu;
0114   // density matrix element
0115   const double tworhopp =
0116       (2. * E - nu) * (2. * E - nu) / (nu2 + Q2) + 1 - 4 * m2 / Q2;
0117   // const double rho00 = towrhopp + 4 * m2 / Q2 - 2;
0118   return 1 + (4 * m2 / Q2 - 2) / tworhopp;
0119 }
0120 
0121 
0122 } // physics
0123 } // lager
0124 
0125 #endif