|
|
|||
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
| [ Source navigation ] | [ Diff markup ] | [ Identifier search ] | [ general search ] |
|
This page was automatically generated by the 2.3.7 LXR engine. The LXR team |
|