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_KINEMATICS_LOADED
0021 #define LAGER_PHYSICS_KINEMATICS_LOADED
0022 
0023 #include <cmath>
0024 #include <lager/core/interval.hh>
0025 #include <lager/core/particle.hh>
0026 
0027 namespace lager {
0028 namespace physics {
0029 
0030 // =======================================================================================
0031 // calculate the allowed Q2 range for a given lepton beam, target and y
0032 //
0033 // The lower bound is given by the kinematics of t-channel scattering,
0034 // while the upper bound is given by either t-channel kinematics, or the
0035 // requirement that the final W be larger than the target mass
0036 // =======================================================================================
0037 inline interval<double> Q2_range(const particle& beam, const particle& target,
0038                                  const double y) {
0039   const double E = (beam.p()).Dot(target.p()) / target.mass();
0040   const double E2 = E * E;
0041   const double m2 = beam.mass2();
0042   // lower and upper bound from t-channel process on electron leg
0043   const double comp1 = -2. * m2 + 2. * E2 * (1. - y);
0044   const double comp2 = 2. * sqrt((E2 - m2) * (E2 * (1. - y) * (1. - y) - m2));
0045   const double Q2_low = comp1 - comp2;
0046   const double Q2_high1 = comp1 + comp2;
0047   // alternative upper bound from requirement that final state has at least the
0048   // invariant mass of the target mass (W2min = target.mass^2, meaning that 2 M
0049   // nu = Q2)
0050   const double Q2_high2 = 2 * target.mass() * E * y;
0051   return {Q2_low, fmin(Q2_high1, Q2_high2)};
0052 }
0053 
0054 // =======================================================================================
0055 // calculate the allowed t range
0056 //
0057 // input:
0058 //   * W2 (=s)
0059 //   * Q2 (-photon mass squared)
0060 //   * Mt (target mass)
0061 //   * Mv (VM mass)
0062 //   * Mr (recoil mass)
0063 // =======================================================================================
0064 inline interval<double> t_range(const double W2, const double Q2,
0065                                 const double Mt, const double Mv,
0066                                 const double Mr) {
0067   const double Mt2 = Mt * Mt;
0068   const double Mr2 = Mr * Mr;
0069   const double Mv2 = Mv * Mv;
0070   const double W = sqrt(W2);
0071   // CM relations for energy and momenta
0072   const double Et_cm = (W2 + Q2 + Mt2) / (2. * W);
0073   const double Pt_cm = sqrt(Et_cm * Et_cm - Mt2);
0074   const double Er_cm = (W2 - Mv2 + Mr2) / (2. * W);
0075   const double Pr_cm = sqrt(Er_cm * Er_cm - Mr2);
0076   // t_low when recoil direction changes by 90 degrees compared to target,
0077   // t_high when the recoil in the target direction
0078   // note: what we call t_high is also refered to as t_min
0079   const double t_low = Mt2 + Mr2 - 2. * Et_cm * Er_cm - 2. * Pt_cm * Pr_cm;
0080   const double t_high = Mt2 + Mr2 - 2. * Et_cm * Er_cm + 2. * Pt_cm * Pr_cm;
0081   // that's all!
0082   return {t_low, t_high};
0083 }
0084 
0085 } // namespace physics
0086 } // namespace lager
0087 
0088 #endif