File indexing completed on 2025-04-19 09:10:08
0001 #ifndef _SAL_H
0002 #define _SAL_H
0003
0004 #include <iostream>
0005 #include <cstdlib>
0006 #include <cmath>
0007
0008 using namespace std;
0009
0010 #define HEADER_SIZE 16
0011
0012 #define MIN_FAC 0.99999
0013 #define MAX_FAC 1.00001
0014
0015 class SAL {
0016 private:
0017 char last_iq;
0018 double Lambda4sq;
0019 double ipol2(double x, double t, int pn);
0020 double ipol2d(double x, double t, int pn);
0021 double** fi[7];
0022 double** dfi[7];
0023 double** fi2[7];
0024 double** dfi2[7];
0025 double* X;
0026 double* T;
0027
0028 double BetheHeitler(double x, double QQ, double msq);
0029 double PSSuppr(double x, double QQ, double msq);
0030 int InLoc(double X[], int n, double x);
0031 void TriDiagSolve(double diag[], double above[], double below[], double b[], int n);
0032 double* InitSpline(double x[], double y[], int n, double yp0);
0033 double SplineValue(double x[], double y[], double M[], int npt, double xi);
0034
0035
0036 void Aloc(double** a[7]) {
0037 int pn,iq;
0038 try {
0039 for(pn=0; pn<=Nf; pn++){
0040 a[pn] = new double*[nq];
0041 for(iq = 0; iq < nq; iq++) a[pn][iq] = new double[nx];
0042 }
0043 }
0044 catch(...) { cerr << "Could not allocate. Bye ..." <<endl; exit(1); }
0045 }
0046
0047
0048 void Dealloc(double** a[7]) {
0049 int pn,iq;
0050 for(pn=0; pn<=Nf; pn++){
0051 for(iq = 0; iq < nq; iq++) delete[] a[pn][iq];
0052 delete[] a[pn];
0053 }
0054 }
0055
0056
0057 double evSuppr(double QQ, int flav) {
0058 if(QQ <= m2[flav]) return 1;
0059 double tau = log(log(QQ/Lambda4sq)/
0060 log(m2[flav]/Lambda4sq));
0061 return tau > 1 ? 0 : 1 - tau;
0062 }
0063
0064 public:
0065 unsigned char ver,nx,nq, Nf;
0066 unsigned char* Flav;
0067 double x_min, x_max;
0068 double QQ_min, QQ_max;
0069 double eq2[7];
0070 double m2[7];
0071
0072 SAL(char* iname = NULL);
0073
0074 ~SAL() {
0075 Dealloc(fi);
0076 Dealloc(dfi);
0077 Dealloc(fi2);
0078 Dealloc(dfi2);
0079 }
0080
0081
0082 void PDF(double x, double QQ, double f[]);
0083 double F2(double x, double QQ, int hflav=0);
0084
0085 };
0086
0087 class TxGrid {
0088 private:
0089 int Nx;
0090 double aNx, xlo, dx2;
0091 public:
0092 TxGrid(int nx) {
0093 Nx = nx;
0094 aNx = 22;
0095 xlo = 1e-5;
0096 double dx1 = exp(0.5*aNx);
0097 dx2 = (1-xlo)*(dx1+1)/(dx1-1);
0098 }
0099 double x(int ix) {
0100 return dx2/(1+exp(0.5*aNx*(1-(2.0*ix)/Nx))) + (1+xlo - dx2)/2;
0101 }
0102 };
0103
0104
0105
0106
0107 void SALPDF(double x, double QQ, double f[]);
0108 double SALF2(double x, double QQ);
0109
0110 #endif