File indexing completed on 2025-08-05 08:15:40
0001 #ifndef TPCGENERATOR_ROSSEGGER_H
0002 #define TPCGENERATOR_ROSSEGGER_H
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020 #include <cmath>
0021 #include <cstdio>
0022 #include <map>
0023 #include <string>
0024
0025 class TH2;
0026 class TH3;
0027
0028 #define NumberOfOrders 15
0029
0030 class Rossegger
0031 {
0032 public:
0033 explicit Rossegger(const std::string &filename);
0034 Rossegger(double a = 30, double b = 80, double L = 80, double epsilon = 1E-4);
0035 virtual ~Rossegger() {}
0036
0037 void Verbosity(int v)
0038 {
0039 printf("verbosity set to %d. was %d\n", v, verbosity);
0040 verbosity = v;
0041 return;
0042 };
0043 double Rmn(int m, int n, double r);
0044 double Rmn_for_zeroes(int m, double x);
0045 double Rmn1(int m, int n, double r);
0046 double Rmn2(int m, int n, double r);
0047 double RPrime(int m, int n, double a, double r);
0048
0049 double Rnk(int n, int k, double r);
0050 double Rnk_for_zeroes(int n, double mu);
0051
0052 double Limu(double mu, double x);
0053 double Kimu(double mu, double x);
0054
0055 double Ez(double r, double phi, double z, double r1, double phi1, double z1);
0056 double Er(double r, double phi, double z, double r1, double phi1, double z1);
0057 double Ephi(double r, double phi, double z, double r1, double phi1, double z1);
0058
0059
0060 double Rmn_(int m, int n, double r);
0061
0062 double Rmn1_(int m, int n, double r);
0063 double Rmn2_(int m, int n, double r);
0064 double RPrime_(int m, int n, double a, double r);
0065 double Rnk_(int n, int k, double r);
0066 double Rnk_for_zeroes_(int n, double mu);
0067 double Ez_(double r, double phi, double z, double r1, double phi1, double z1);
0068 double Er_(double r, double phi, double z, double r1, double phi1, double z1);
0069 double Ephi_(double r, double phi, double z, double r1, double phi1, double z1);
0070
0071 protected:
0072 bool fByFile = false;
0073 double a = NAN;
0074 double b = NAN;
0075 double L = NAN;
0076 int verbosity = 0;
0077 double pi = M_PI;
0078 double epsilon = NAN;
0079
0080 bool tweak = false;
0081
0082 double MinimumDR = NAN;
0083 double MinimumDPHI = NAN;
0084 double MinimumDZ = NAN;
0085
0086 double FindNextZero(double xstart, double epsilon, int order, double (Rossegger::*func)(int, double));
0087 void FindBetamn(double epsilon);
0088 void FindMunk(double epsilon);
0089 bool CheckZeroes(double epsilon);
0090
0091 void LoadZeroes(const std::string &destfile);
0092 void SaveZeroes(const std::string &destfile);
0093
0094 double Betamn[NumberOfOrders][NumberOfOrders]{};
0095 double N2mn[NumberOfOrders][NumberOfOrders]{};
0096 double Munk[NumberOfOrders][NumberOfOrders]{};
0097 double N2nk[NumberOfOrders][NumberOfOrders]{};
0098
0099 void PrecalcFreeConstants();
0100
0101 double BetaN[NumberOfOrders]{};
0102 double BetaN_a[NumberOfOrders]{};
0103 double BetaN_b[NumberOfOrders]{};
0104 double km_BetaN_a[NumberOfOrders][NumberOfOrders]{};
0105 double im_BetaN_a[NumberOfOrders][NumberOfOrders]{};
0106 double km_BetaN_b[NumberOfOrders][NumberOfOrders]{};
0107 double im_BetaN_b[NumberOfOrders][NumberOfOrders]{};
0108 double bessel_denominator[NumberOfOrders][NumberOfOrders]{};
0109
0110 void PrecalcDerivedConstants();
0111 double ym_Betamn_a[NumberOfOrders][NumberOfOrders]{};
0112 double jm_Betamn_a[NumberOfOrders][NumberOfOrders]{};
0113 double liMunk_BetaN_a[NumberOfOrders][NumberOfOrders]{};
0114 double kiMunk_BetaN_a[NumberOfOrders][NumberOfOrders]{};
0115 double sinh_Betamn_L[NumberOfOrders][NumberOfOrders]{};
0116 double sinh_pi_Munk[NumberOfOrders][NumberOfOrders]{};
0117
0118 TH2 *Tags = nullptr;
0119 std::map<std::string, TH3 *> Grid;
0120 };
0121
0122 #endif