#ifndef _UNIVPARAM_H #define _UNIVPARAM_H #include #include #include #include #define UNDEF -100 namespace UnivParamNS { const bool isDiffusive[4]={false,true,false,false}; const double DXref[4]={ 600., 300., 600., 600.}; const double DX0[4]={ 0., -600., 0., -600.}; const int nParDX=6; const std::string parNameDX[nParDX]={ "S_{ref} ", "#gamma ", "DX_{max} ", "#lambda ", "f_{#lambda,E}", "icomp" }; const int nParUsed[nParDX-1][4]= { { 4,4,4,4}, { 2,2,2,2 }, { 3,4,3,3 }, { 3,3,3,2}, { 0, 2, 0, 1 } }; // [ipar][icomp] const double parSref_WCD[4][4] = { { 1.497e+01 , 1.183e+00 , 1.383e+01 , 6.365e+03 }, { 1.756e+01 , 2.319e+00 , 4.150e+00 , 1.028e+03 }, { 2.977e+00 , 1.139e+00 , 9.482e+00 , 4.364e+03 }, { 3.785e+00 , 2.341e+00 , 1.391e+01 , 1.257e+04 } }; const double parGamma_WCD[4][4] = { { 9.358e-01 , -4.729e-03 , 0.000e+00 , 0.000e+00 }, { 9.872e-01 , 1.075e-02 , 0.000e+00 , 0.000e+00 }, { 9.372e-01 , -7.725e-03 , 0.000e+00 , 0.000e+00 }, { 9.284e-01 , 1.385e-02 , 0.000e+00 , 0.000e+00 } }; const double parDXmax_WCD[4][4] = { { 1.510e+03 , 1.496e+03 , 4.414e-01 , 0.000e+00 }, { 1.709e+02 , 8.860e+02 , 1.536e+03 , -2.012e+01 }, { 2.324e+03 , 2.096e+03 , 1.562e-01 , 0.000e+00 }, { 4.192e+02 , 3.049e+02 , 3.266e-01 , 0.000e+00 } }; const double parLambda_WCD[4][4] = { { 6.644e+02 , -2.871e+02 , -8.865e+00 , 0.000e+00 }, { 6.666e+01 , 8.771e+00 , -2.854e+00 , 0.000e+00 }, { 6.869e+02 , -2.325e+02 , -5.024e+00 , 0.000e+00 }, { 1.107e+02 , -4.375e+00 , 0.000e+00 , 0.000e+00 } }; const double parfLambdaE_WCD[4][4] = { { 0.000e+00 , 0.000e+00 , 0.000e+00 , 0.000e+00 }, { 5.311e-02 , -1.399e-02 , 0.000e+00 , 0.000e+00 }, { 0.000e+00 , 0.000e+00 , 0.000e+00 , 0.000e+00 }, { -2.383e-02 , 0.000e+00 , 0.000e+00 , 0.000e+00 } }; const double parSref_Scin[4][4] = { { 3.158e+00 , 1.223e+00 , 1.976e+01 , 1.050e+04 }, { 1.217e+01 , 2.126e+00 , 5.521e+00 , 1.386e+03 }, { 1.232e+00 , 1.106e+00 , 1.212e+01 , 6.566e+03 }, { 1.407e+00 , 2.095e+00 , 1.399e+01 , 1.162e+04 } }; const double parGamma_Scin[4][4] = { { 9.357e-01 , -1.028e-03 , 0.000e+00 , 0.000e+00 }, { 9.849e-01 , 1.649e-02 , 0.000e+00 , 0.000e+00 }, { 9.380e-01 , -6.625e-03 , 0.000e+00 , 0.000e+00 }, { 9.278e-01 , 4.080e-02 , 0.000e+00 , 0.000e+00 } }; const double parDXmax_Scin[4][4] = { { 1.395e+03 , 1.323e+03 , 3.193e-01 , 0.000e+00 }, { 1.607e+02 , 1.166e+03 , 2.411e+03 , -1.545e+00 }, { 3.207e+04 , 3.183e+04 , 5.792e-03 , 0.000e+00 }, { 2.132e+02 , 6.270e+01 , 3.511e+00 , 0.000e+00 } }; const double parLambda_Scin[4][4] = { { 5.747e+02 , -1.337e+02 , -3.721e+00 , 0.000e+00 }, { 6.629e+01 , 9.169e+00 , -5.286e+00 , 0.000e+00 }, { 6.712e+03 , -6.263e+03 , -3.254e-03 , 0.000e+00 }, { 9.945e+01 , 6.485e+00 , 0.000e+00 , 0.000e+00 } }; const double parfLambdaE_Scin[4][4] = { { 0.000e+00 , 0.000e+00 , 0.000e+00 , 0.000e+00 }, { 5.309e-02 , -1.535e-02 , 0.000e+00 , 0.000e+00 }, { 0.000e+00 , 0.000e+00 , 0.000e+00 , 0.000e+00 }, { -2.919e-02 , 0.000e+00 , 0.000e+00 , 0.000e+00 } }; const double parSref_MD[4][4] = { { 8.756e+00 , 1.144e+00 , 1.619e+01 , 6.075e+03 }, { 0.000e+00 , 0.000e+00 , 0.000e+00 , 0.000e+00 }, { 0.000e+00 , 0.000e+00 , 0.000e+00 , 0.000e+00 }, { 0.000e+00 , 0.000e+00 , 0.000e+00 , 0.000e+00 } }; const double parGamma_MD[4][4] = { { 9.445e-01 , -1.065e-02 , 0.000e+00 , 0.000e+00 }, { 0.000e+00 , 0.000e+00 , 0.000e+00 , 0.000e+00 }, { 0.000e+00 , 0.000e+00 , 0.000e+00 , 0.000e+00 }, { 0.000e+00 , 0.000e+00 , 0.000e+00 , 0.000e+00 } }; const double parDXmax_MD[4][4] = { { 1.719e+03 , 1.736e+03 , 6.612e-01 , 0.000e+00 }, { 0.000e+00 , 0.000e+00 , 0.000e+00 , 0.000e+00 }, { 0.000e+00 , 0.000e+00 , 0.000e+00 , 0.000e+00 }, { 0.000e+00 , 0.000e+00 , 0.000e+00 , 0.000e+00 } }; const double parLambda_MD[4][4] = { { 6.200e+02 , 0.000e+00 , 0.000e+00 , 0.000e+00 }, { 0.000e+00 , 0.000e+00 , 0.000e+00 , 0.000e+00 }, { 0.000e+00 , 0.000e+00 , 0.000e+00 , 0.000e+00 }, { 0.000e+00 , 0.000e+00 , 0.000e+00 , 0.000e+00 } }; const double parfLambdaE_MD[4][4] = { { 0.000e+00 , 0.000e+00 , 0.000e+00 , 0.000e+00 }, { 0.000e+00 , 0.000e+00 , 0.000e+00 , 0.000e+00 }, { 0.000e+00 , 0.000e+00 , 0.000e+00 , 0.000e+00 }, { 0.000e+00 , 0.000e+00 , 0.000e+00 , 0.000e+00 } }; const double alpha0_par[2]={1.18,0.46}; const double alpha1_par[2]={1.09,0.46}; // The core distance range in which the parameterization is accurate //----------------------------------------------------- const double rAccurate_low =100.e2; const double rAccurate_high=2500.e2; // The core distance range in which the parameterization is well behaved //----------------------------------------------------- const double rLimit_low =10.e2; const double rLimit_high=4000.e2; class UnivParam { private: int fDetectorType; // [0] WCD [1] TopScin [2] BotScin ( The parameterization for TopScin/BotScin is only valid for pQGSJetII ) public: UnivParam(int DetectorType); ~UnivParam(){} double GetrLimit_low() { return rLimit_low; } double GetrLimit_high() { return rLimit_high; } bool IsXmaxBelowGround(double Xmax, double theta) { return ( Xmax > 875.5/cos(theta)? true : false) ; } double GetXmaxLimit(double rMax, double theta, double hGround, double C_XmaxMu); bool CheckDX(double Xmax, double C_XmaxMu, double r, double psi, double theta, double hGround); double DXFunc(double DX, double logE, double *parDX); double GetAlphaFluct(double r, double DX); double RFuncPar(int icomp, int iparDX , int ipar ); double RFunc(double r, int icomp, int iparDX ); double RFunc(double r, int icomp, int iparDX , double *par); double GetS0(double r, double DX, double logE, int icomp, double Nmu ); double GetS0(double r, double DX, double logE, int icomp ); double GetSignal(double r, double Xmax_edep , double Xmax_mu, double logE, double theta, double psi, double rhoGround, double hGround, double Nmu, int icomp0, int iatm); double GetSignal(double r, double Xmax_edep , double logE, double theta, double psi, double rhoGround, double hGround, double Nmu, int icomp0, int iatm); double GetLogE(double vem, double r, double Xmax_edep, double theta, double psi, double rhoGround, double hGround, double Nmu, int iatm); double GetNmuL(double r, double DX, double logE, double s0Mu); double GetMeanXmax(double logE, double fProton, int im); double GetMeanNmu(double logE, double theta, double Xmax, double fProton, int im ); double GetMeanXmax_Auger(double logE); double GetMeanNmu_Auger(double logE, double theta, double Xmax); double GetSigmaXmaxSD(double logE, int ndev ); double GetSigmaXmaxSD(double logE, int ndev, bool IsInfill ); double GetXmaxMu(double Xmax_edep,int im, int ip ); double GetXmaxMu(double Xmax_edep, double C_XmaxMu ); }; } #endif