예제 #1
0
Double_t RooIpatia2__LnBK(double ni, double x) {
  Double_t nu = TMath::Abs(ni);
  if ( x < 1.e-06 && nu > 0.) return RooIpatia2__low_x_LnBK(nu,x);
  if ( x < 1.e-04 && nu > 0. && nu < 55.) return RooIpatia2__low_x_LnBK(nu,x);
  if ( x < 0.1 && nu >= 55.) return RooIpatia2__low_x_LnBK(nu,x);

  return gsl_sf_bessel_lnKnu(nu, x);
  //return TMath::Log(ROOT::Math::cyl_bessel_k(nu, x));
}
Double_t RooGeneralizedHyperbolic__LnBK(double ni, double x) {
  Double_t nu = abs(ni);
  if ( x < 1e-06 && nu > 0) return RooGeneralizedHyperbolic__low_x_LnBK(nu,x);
  if ( x < 1e-04 && nu > 0 && nu < 55) return RooGeneralizedHyperbolic__low_x_LnBK(nu,x);
  if ( x < 0.1 && nu >= 55) return RooGeneralizedHyperbolic__low_x_LnBK(nu,x);
  
  return gsl_sf_bessel_lnKnu(nu, x);
  //return ROOT::Math::cyl_bessel_k(nu, x);
}
예제 #3
0
void Egig(const int n,const double* p, const double* a, const double* b, double* Eg , double* Eig , double* Elogg )
{
	#ifdef _OPENMP
		int nP = omp_get_num_procs();
	#else
		int nP = 1;
	#endif




	int thread = 0;	
	int i;
	double   sqrt_ab;
	double log_Kp, log_Kp1;
	double eps = 1e-7;//fabs(p[i] ) *1.4901e-08;
	#ifdef _OPENMP
		omp_set_num_threads(nP);
	#endif
	#pragma omp parallel private(i, sqrt_ab, log_Kp,log_Kp1) shared(a,b,p,Eg, Eig,Elogg)
	{
		#pragma omp for 	
		for(int i = 0; i < n; i++)
		{
			sqrt_ab = sqrt(a[i] * b[i]);
			log_Kp  = gsl_sf_bessel_lnKnu(fabs(p[i]) , sqrt_ab);
			if(Eg){
				log_Kp1 = gsl_sf_bessel_lnKnu( fabs( p[i] + 1), sqrt_ab);
				Eg[i] = exp( (log(b[i]) - log(a[i])) / 2 + log_Kp1 -log_Kp);
			}
			if(Eig)
			{
				log_Kp1 = gsl_sf_bessel_lnKnu(fabs( p[i] - 1), sqrt_ab);
				Eig[i] = exp( ( - log(b[i]) + log(a[i])) / 2 + log_Kp1 -log_Kp);
			}
			if(Elogg){
				
				log_Kp1 = gsl_sf_bessel_lnKnu(fabs( p[i] + eps), sqrt_ab);
				Elogg[i] =  (log(b[i] ) -log(a[i])) /2; 
				Elogg[i] += (exp(log_Kp1 -log_Kp  ) - 1) / eps;
			}
		}
	}
}