File indexing completed on 2026-09-27 09:14:58
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020 #ifndef LAGER_GEN_INITIAL_PHOTON_GEN_LOADED
0021 #define LAGER_GEN_INITIAL_PHOTON_GEN_LOADED
0022
0023 #include <TRandom.h>
0024 #include <lager/core/generator.hh>
0025 #include <lager/core/particle.hh>
0026 #include <lager/gen/initial/data.hh>
0027 #include <lager/gen/initial/fixed_target.hh>
0028 #include <lager/gen/initial/generator.hh>
0029 #include <lager/physics/photon.hh>
0030 #include <memory>
0031
0032 namespace lager {
0033 namespace initial {
0034
0035
0036 class no_photon : public photon_generator {
0037 public:
0038 no_photon(const configuration&, const string_path&, std::shared_ptr<TRandom>);
0039
0040 virtual photon generate(const beam&, const target&);
0041 virtual double max_cross_section() const { return 1.; };
0042 virtual double phase_space() const { return 1.; }
0043 };
0044
0045
0046 class bremsstrahlung : public photon_generator {
0047 public:
0048 enum class model { FLAT, PARAM, APPROX, EXACT };
0049
0050 bremsstrahlung(const configuration& cf, const string_path& path,
0051 std::shared_ptr<TRandom> r);
0052
0053 virtual photon generate(const beam&, const target&);
0054 virtual double max_cross_section() const { return max_; }
0055 virtual double phase_space() const { return E_range_.width(); }
0056
0057 protected:
0058 double intensity(const double E, const double beam) const;
0059
0060 private:
0061 const model model_;
0062 const double rl_;
0063
0064 const double E_beam_;
0065 const interval<double> E_range_;
0066 const double max_;
0067 };
0068
0069
0070 class bremsstrahlung_realistic_target : public photon_generator {
0071 public:
0072 bremsstrahlung_realistic_target(const configuration& cf,
0073 const string_path& path,
0074 std::shared_ptr<TRandom> r);
0075
0076 virtual photon generate(const beam&, const target&);
0077 virtual double max_cross_section() const { return max_; }
0078 virtual double phase_space() const { return E_range_.width(); }
0079
0080 protected:
0081 double intensity(const double E, const double beam, const double vz) const;
0082
0083 private:
0084 const realistic_target target_;
0085 const double E_beam_;
0086 const interval<double> E_range_;
0087 const double max_;
0088 };
0089
0090
0091 class vphoton : public photon_generator {
0092 public:
0093 vphoton(const configuration& cf, const string_path& path,
0094 std::shared_ptr<TRandom> r);
0095
0096 virtual photon generate(const beam&, const target&);
0097 virtual double max_cross_section() const { return max_; }
0098 virtual double phase_space() const {
0099 return logy_range_.width() * logQ2_range_.width();
0100 }
0101
0102 protected:
0103 double flux(const double Q2, const double y, const particle& beam,
0104 const particle& target) const {
0105 return physics::gamma_t_log(Q2, y, beam, target);
0106 }
0107
0108 private:
0109 double calc_max_flux(const configuration& cf) const;
0110 interval<double> calc_max_Q2_range(const configuration& cf) const;
0111 interval<double> calc_max_W2_range(const configuration& cf) const;
0112
0113
0114 const interval<double> y_range_;
0115 const interval<double> Q2_range_;
0116
0117 const interval<double> logy_range_;
0118 const interval<double> logQ2_range_;
0119
0120 const interval<double> W2_range_;
0121
0122
0123 const double max_;
0124 };
0125
0126 }
0127 }
0128
0129 #endif