39 #include <irplib_utils.h>
41 #include <sinfo_tpl_utils.h>
42 #include <sinfo_pfits.h>
43 #include <sinfo_tpl_dfs.h>
44 #include <sinfo_msg.h>
45 #include <sinfo_error.h>
46 #include <sinfo_utils_wrappers.h>
47 #include <sinfo_globals.h>
48 #include <sinfo_recipes.h>
49 #include <sinfo_function_1d.h>
50 #include <sinfo_functions.h>
51 #include <sinfo_fit.h>
56 static int sinfo_utl_table_test_create(cpl_plugin *) ;
57 static int sinfo_utl_table_test_exec(cpl_plugin *) ;
58 static int sinfo_utl_table_test_destroy(cpl_plugin *) ;
59 static int sinfo_utl_table_test_shift(cpl_parameterlist *, cpl_frameset *) ;
62 sinfo_utl_table_test_amoeba_poly(cpl_parameterlist * parlist,
63 cpl_frameset * framelist);
65 sinfo_utl_table_test_amoeba_boltzmann(cpl_parameterlist * parlist,
66 cpl_frameset * framelist);
68 static cpl_vector* sa_vx=NULL;
69 static cpl_vector* sa_vy=NULL;
72 sinfo_fit_boltzmann(
double p[]);
76 sinfo_fitbkg(
const double x[],
81 sinfo_fac(
const double x,
const double t);
84 sinfo_fit_poly(
double p[]);;
87 sinfo_table_shift_column_spline3(cpl_table* t,
92 sinfo_table_shift_column_poly(cpl_table* t,
98 sinfo_table_shift_column_int(
const cpl_table* t,
104 sinfo_table_shift_simple(cpl_table* inp,
113 static char sinfo_utl_table_test_description[] =
114 "This recipe perform cubes combination.\n"
115 "The input files are several cubeses\n"
116 "their associated tags should be CUBE.\n"
117 "The output is a cube PRO_CUBE resulting from the input cubes\n"
118 "accurding to the value of op where op indicates the operation to be \n"
119 "performed specified by the parameter sinfoni.sinfo_utl_table_test.op\n"
143 cpl_recipe * recipe = cpl_calloc(1,
sizeof *recipe ) ;
144 cpl_plugin * plugin = &recipe->interface ;
146 cpl_plugin_init(plugin,
148 SINFONI_BINARY_VERSION,
149 CPL_PLUGIN_TYPE_RECIPE,
150 "sinfo_utl_table_test",
151 "Combines a cube list in an output cube",
152 sinfo_utl_table_test_description,
154 "Andrea.Modigliani@eso.org",
156 sinfo_utl_table_test_create,
157 sinfo_utl_table_test_exec,
158 sinfo_utl_table_test_destroy) ;
160 cpl_pluginlist_append(list, plugin) ;
175 static int sinfo_utl_table_test_create(cpl_plugin * plugin)
177 cpl_recipe * recipe ;
181 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
182 recipe = (cpl_recipe *)plugin ;
188 recipe->parameters = cpl_parameterlist_new() ;
192 p = cpl_parameter_new_value(
"sinfoni.sinfo_utl_table_test.method",
195 "sinfoni.sinfo_utl_table_test",
197 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"method") ;
198 cpl_parameterlist_append(recipe->parameters, p) ;
201 p = cpl_parameter_new_value(
"sinfoni.sinfo_utl_table_test.wshift",
204 "sinfoni.sinfo_utl_table_test",
207 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"wshift") ;
208 cpl_parameterlist_append(recipe->parameters, p) ;
211 p = cpl_parameter_new_value(
"sinfoni.sinfo_utl_table_test.wstart",
214 "sinfoni.sinfo_utl_table_test",
218 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"wstart") ;
219 cpl_parameterlist_append(recipe->parameters, p) ;
223 p = cpl_parameter_new_value(
"sinfoni.sinfo_utl_table_test.wend",
226 "sinfoni.sinfo_utl_table_test",
230 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"wend") ;
231 cpl_parameterlist_append(recipe->parameters, p) ;
245 static int sinfo_utl_table_test_exec(cpl_plugin * plugin)
247 cpl_recipe * recipe ;
249 cpl_errorstate initial_errorstate = cpl_errorstate_get();
252 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
253 recipe = (cpl_recipe *)plugin ;
255 status+=sinfo_utl_table_test_shift(recipe->parameters, recipe->frames);
256 status+=sinfo_utl_table_test_amoeba_poly(recipe->parameters,
258 status+=sinfo_utl_table_test_amoeba_boltzmann(recipe->parameters,
260 if (!cpl_errorstate_is_equal(initial_errorstate)) {
263 cpl_errorstate_dump(initial_errorstate, CPL_FALSE, NULL);
275 static int sinfo_utl_table_test_destroy(cpl_plugin * plugin)
277 cpl_recipe * recipe ;
280 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
281 recipe = (cpl_recipe *)plugin ;
284 cpl_parameterlist_delete(recipe->parameters) ;
298 sinfo_utl_table_test_shift(cpl_parameterlist * parlist,
299 cpl_frameset * framelist)
303 cpl_table* t_shift=NULL;
305 cpl_parameter* p=NULL;
319 const double pg=3.1415926535897932384626433832795;
322 check(sinfo_dfs_set_groups(framelist),
323 "Cannot identify RAW and CALIB frames") ;
326 check_nomsg(p=cpl_parameterlist_find(parlist,
327 "sinfoni.sinfo_utl_table_test.method"));
328 check_nomsg(op=cpl_parameter_get_string(p));
331 check_nomsg(p=cpl_parameterlist_find(parlist,
332 "sinfoni.sinfo_utl_table_test.wstart"));
333 check_nomsg(ws=cpl_parameter_get_double(p)) ;
337 check_nomsg(p=cpl_parameterlist_find(parlist,
338 "sinfoni.sinfo_utl_table_test.wend"));
339 check_nomsg(we=cpl_parameter_get_double(p)) ;
341 check_nomsg(p=cpl_parameterlist_find(parlist,
342 "sinfoni.sinfo_utl_table_test.wshift"));
343 check_nomsg(wshift=cpl_parameter_get_double(p)) ;
348 check_nomsg(t=cpl_table_new(np));
349 check_nomsg(cpl_table_new_column(t,
"WAVE",CPL_TYPE_DOUBLE));
350 check_nomsg(cpl_table_new_column(t,
"INT",CPL_TYPE_DOUBLE));
351 check_nomsg(cpl_table_fill_column_window(t,
"WAVE",0,np,0));
352 check_nomsg(cpl_table_fill_column_window(t,
"INT",0,np,0));
354 check_nomsg(pw=cpl_table_get_data_double(t,
"WAVE"));
355 check_nomsg(pi=cpl_table_get_data_double(t,
"INT"));
361 ra=(double)i/(
double)np*6.*pg;
365 check_nomsg(cpl_table_save(t, NULL, NULL,
"out_cosine.fits", 0));
380 check_nomsg(t_shift=sinfo_table_shift_simple(t,
"INT",pshift));
381 check_nomsg(cpl_table_save(t_shift,NULL,NULL,
"out_cosine_shift3.fits", 0));
382 sinfo_free_table(&t);
387 sinfo_free_table(&t);
404 sinfo_utl_table_test_amoeba_poly(cpl_parameterlist * parlist,
405 cpl_frameset * framelist)
410 cpl_parameter* p=NULL;
434 check(sinfo_dfs_set_groups(framelist),
435 "Cannot identify RAW and CALIB frames") ;
438 check_nomsg(p=cpl_parameterlist_find(parlist,
439 "sinfoni.sinfo_utl_table_test.method"));
440 check_nomsg(op=cpl_parameter_get_string(p));
443 check_nomsg(p=cpl_parameterlist_find(parlist,
444 "sinfoni.sinfo_utl_table_test.wstart"));
445 check_nomsg(ws=cpl_parameter_get_double(p)) ;
449 check_nomsg(p=cpl_parameterlist_find(parlist,
450 "sinfoni.sinfo_utl_table_test.wend"));
451 check_nomsg(we=cpl_parameter_get_double(p)) ;
453 check_nomsg(p=cpl_parameterlist_find(parlist,
454 "sinfoni.sinfo_utl_table_test.wshift"));
455 check_nomsg(wshift=cpl_parameter_get_double(p)) ;
459 check_nomsg(t=cpl_table_new(np));
460 check_nomsg(cpl_table_new_column(t,
"WAVE",CPL_TYPE_DOUBLE));
461 check_nomsg(cpl_table_new_column(t,
"INT",CPL_TYPE_DOUBLE));
462 check_nomsg(cpl_table_fill_column_window(t,
"WAVE",0,np,0));
463 check_nomsg(cpl_table_fill_column_window(t,
"INT",0,np,0));
465 check_nomsg(pw=cpl_table_get_data_double(t,
"WAVE"));
466 check_nomsg(pi=cpl_table_get_data_double(t,
"INT"));
476 pi[i]=a[0]+a[1]*pw[i]+a[2]*pw[i]*pw[i]+1.*rand()/RAND_MAX;
480 sa_vx=cpl_vector_wrap(np,cpl_table_get_data_double(t,
"WAVE"));
481 sa_vy=cpl_vector_wrap(np,cpl_table_get_data_double(t,
"INT"));
483 ap=(
double**) cpl_calloc(MP,
sizeof(
double*));
485 ap[i]=cpl_calloc(NP,
sizeof(
double));
496 ap[0][0]=-3; ap[0][1]=-3; ap[0][2]=-3;
497 ap[1][0]=+3; ap[1][1]=-3; ap[1][2]=-3;
498 ap[2][0]=+3; ap[2][1]=+3; ap[2][2]=-3;
499 ap[3][0]=+3; ap[3][1]=-3; ap[3][2]=+3;
501 sinfo_msg(
"Before amoeba fit");
504 sinfo_msg(
"ap[%d][%d]=%g",i,j,ap[i][j]);
512 y[i]=sinfo_fit_poly(p0);
515 sinfo_fit_amoeba(ap,y,NP,FTOL,sinfo_fit_poly,&nfunc);
517 sinfo_msg(
"After amoeba fit");
520 sinfo_msg(
"ap[%d][%d]=%g",i,j,ap[i][j]);
524 check_nomsg(cpl_table_new_column(t,
"FIT",CPL_TYPE_DOUBLE));
525 check_nomsg(cpl_table_fill_column_window(t,
"FIT",0,np,0));
526 check_nomsg(pf=cpl_table_get_data_double(t,
"FIT"));
531 pf[i]=ap[0][0]+ap[0][1]*pw[i]+ap[0][2]*pw[i]*pw[i];
534 check_nomsg(cpl_table_save(t,NULL,NULL,
"out_amoeba_poly.fits", 0));
535 cpl_vector_unwrap(sa_vx);
536 cpl_vector_unwrap(sa_vy);
538 sinfo_free_table(&t);
541 cpl_vector_unwrap(sa_vx);
542 cpl_vector_unwrap(sa_vy);
544 sinfo_free_table(&t);
559 sinfo_utl_table_test_amoeba_boltzmann(cpl_parameterlist * parlist,
560 cpl_frameset * framelist)
565 cpl_parameter* p=NULL;
600 check(sinfo_dfs_set_groups(framelist),
601 "Cannot identify RAW and CALIB frames") ;
604 check_nomsg(p=cpl_parameterlist_find(parlist,
605 "sinfoni.sinfo_utl_table_test.method"));
606 check_nomsg(op=cpl_parameter_get_string(p));
609 check_nomsg(p=cpl_parameterlist_find(parlist,
610 "sinfoni.sinfo_utl_table_test.wstart"));
611 check_nomsg(ws=cpl_parameter_get_double(p)) ;
615 check_nomsg(p=cpl_parameterlist_find(parlist,
616 "sinfoni.sinfo_utl_table_test.wend"));
617 check_nomsg(we=cpl_parameter_get_double(p)) ;
619 check_nomsg(p=cpl_parameterlist_find(parlist,
620 "sinfoni.sinfo_utl_table_test.wshift"));
621 check_nomsg(wshift=cpl_parameter_get_double(p)) ;
625 check_nomsg(t=cpl_table_new(np));
626 check_nomsg(cpl_table_new_column(t,
"WAVE",CPL_TYPE_DOUBLE));
627 check_nomsg(cpl_table_new_column(t,
"INT",CPL_TYPE_DOUBLE));
628 check_nomsg(cpl_table_fill_column_window(t,
"WAVE",0,np,0));
629 check_nomsg(cpl_table_fill_column_window(t,
"INT",0,np,0));
631 check_nomsg(pw=cpl_table_get_data_double(t,
"WAVE"));
632 check_nomsg(pi=cpl_table_get_data_double(t,
"INT"));
641 pi[i]=sinfo_fac(pw[i],a[2])*(1.+0.1*rand()/RAND_MAX);
643 check_nomsg(max=cpl_table_get_column_max(t,
"INT"));
644 check_nomsg(cpl_table_duplicate_column(t,
"THERMAL",t,
"INT"));
645 check_nomsg(cpl_table_divide_scalar(t,
"THERMAL",max));
646 check_nomsg(cpl_table_multiply_scalar(t,
"THERMAL",a[1]));
647 check_nomsg(cpl_table_add_scalar(t,
"THERMAL",a[0]));
649 check_nomsg(sa_vx=cpl_vector_wrap(np,cpl_table_get_data_double(t,
"WAVE")));
650 check_nomsg(sa_vy=cpl_vector_wrap(np,cpl_table_get_data_double(t,
"THERMAL")));
652 ap=(
double**) cpl_calloc(MP,
sizeof(
double*));
654 ap[i]=cpl_calloc(NP,
sizeof(
double));
664 bkg_min=cpl_table_get_column_min(t,
"THERMAL");
665 bkg_max=cpl_table_get_column_max(t,
"THERMAL");
674 ap[0][0]=p0_min; ap[0][1]=p1_min; ap[0][2]=p2_min;
675 ap[1][0]=p0_max; ap[1][1]=p1_min; ap[1][2]=p2_min;
676 ap[2][0]=p0_min; ap[2][1]=p1_max; ap[2][2]=p2_min;
677 ap[3][0]=p0_min; ap[3][1]=p1_min; ap[3][2]=p2_max;
679 sinfo_msg(
"Before amoeba fit");
682 sinfo_msg(
"ap[%d][%d]=%g",i,j,ap[i][j]);
690 y[i]=sinfo_fit_boltzmann(p0);
693 sinfo_fit_amoeba(ap,y,NP,FTOL,sinfo_fit_boltzmann,&nfunc);
695 sinfo_msg(
"After amoeba fit");
698 sinfo_msg(
"ap[%d][%d]=%g",i,j,ap[i][j]);
702 check_nomsg(cpl_table_new_column(t,
"FIT",CPL_TYPE_DOUBLE));
703 check_nomsg(cpl_table_fill_column_window(t,
"FIT",0,np,0));
704 check_nomsg(pf=cpl_table_get_data_double(t,
"FIT"));
709 pf[i]=sinfo_fac(pw[i],ap[0][2]);
711 check_nomsg(max=cpl_table_get_column_max(t,
"FIT"));
712 check_nomsg(cpl_table_divide_scalar(t,
"FIT",max));
713 check_nomsg(cpl_table_multiply_scalar(t,
"FIT",ap[0][1]));
714 check_nomsg(cpl_table_add_scalar(t,
"FIT",ap[0][0]));
716 check_nomsg(cpl_table_save(t,NULL,NULL,
"out_amoeba_boltzmann.fits", 0));
721 cpl_vector_unwrap(sa_vx);
722 cpl_vector_unwrap(sa_vy);
723 sinfo_free_table(&t);
725 if (cpl_error_get_code() != CPL_ERROR_NONE) {
737 sinfo_table_shift_column_int(
const cpl_table* t,
750 cknull(t,
"null input table");
751 out=cpl_table_duplicate(t);
753 nrow=cpl_table_get_nrow(t);
754 pi=cpl_table_get_data_double(t,col);
755 po=cpl_table_get_data_double(out,col);
756 sinfo_msg(
"shifting of %d pixels",is);
758 for(i=0;i<nrow;i++) {
759 if( ((i-is) >=0) && ((i-is) < nrow)) {
764 for(i=nrow-1;i>-1;i--) {
765 if( ((i-is) >=0) && ((i-is) < nrow)) {
772 sinfo_free_table(&out);
780 sinfo_table_shift_column_poly(cpl_table* t,
798 float* corrected_spec=NULL ;
800 float* tableptr=NULL;
802 cknull(t,
"null input table");
808 out=cpl_table_duplicate(t);
810 nrow=cpl_table_get_nrow(t);
811 cpl_table_cast_column(t,col,
"FINT",CPL_TYPE_FLOAT);
812 cpl_table_cast_column(out,col,
"FINT",CPL_TYPE_FLOAT);
813 pi=cpl_table_get_data_float(t,
"FINT");
814 po=cpl_table_get_data_float(out,
"FINT");
816 n_points = order + 1 ;
817 if ( n_points % 2 == 0 ) {
818 firstpos = (int)(n_points/2) - 1 ;
820 firstpos = (int)(n_points/2) ;
822 spec=cpl_calloc(nrow,
sizeof(
float)) ;
823 corrected_spec=cpl_calloc(nrow,
sizeof(
float)) ;
824 xnum=cpl_calloc(order+1,
sizeof(
float)) ;
826 for ( i = 0 ; i < n_points ; i++ ) {
831 for(i=0;i<nrow;i++) {
832 corrected_spec[i] = 0. ;
836 for ( z = 0 ; z < nrow ; z++ ) {
838 if (isnan(spec[z]) ) {
841 for ( i = z - firstpos ; i < z-firstpos+n_points ; i++ ) {
842 if ( i < 0 ) continue ;
843 if ( i >= nrow) continue ;
844 corrected_spec[i] = ZERO ;
847 if ( z != 0 && z != nrow - 1 ) {
853 for ( z = 0 ; z < nrow ; z++ ) {
860 if (isnan(corrected_spec[z])) continue ;
861 if ( z - firstpos < 0 ) {
862 tableptr = &spec[0] ;
864 }
else if ( z - firstpos + n_points >= nrow ) {
865 tableptr = &spec[nrow - n_points] ;
866 eval = shift + z + n_points - nrow ;
868 tableptr = &spec[z-firstpos] ;
869 eval = shift + firstpos ;
873 corrected_spec[z]=sinfo_new_nev_ille(xnum,tableptr,order,eval,&flag);
874 if ( z != 0 && z != nrow - 1 ) {
875 new_sum += corrected_spec[z] ;
880 for (z = 0 ; z < nrow ; z++ ) {
881 if ( new_sum == 0. ) {
886 }
else if ( z == nrow - 1 ) {
888 }
else if ( isnan(corrected_spec[z]) ) {
891 corrected_spec[z] *= sum / new_sum ;
892 po[z] = corrected_spec[z] ;
895 check_nomsg(cpl_table_erase_column(t,
"FINT"));
896 check_nomsg(cpl_table_erase_column(out,col));
897 check_nomsg(cpl_table_cast_column(out,
"FINT",col,CPL_TYPE_DOUBLE));
898 check_nomsg(cpl_table_erase_column(out,
"FINT"));
900 sinfo_free_float(&spec) ;
901 sinfo_free_float(&corrected_spec) ;
902 sinfo_free_float(&xnum) ;
908 sinfo_free_float(&spec) ;
909 sinfo_free_float(&corrected_spec) ;
910 sinfo_free_float(&xnum) ;
911 sinfo_free_table(&out);
921 sinfo_table_shift_column_spline3(cpl_table* t,
938 float* corrected_spec=NULL;
940 cknull(t,
"null input table");
941 out=cpl_table_duplicate(t);
943 nrow=cpl_table_get_nrow(t);
944 check_nomsg(cpl_table_cast_column(t,col,
"FINT",CPL_TYPE_FLOAT));
945 check_nomsg(cpl_table_cast_column(out,col,
"FINT",CPL_TYPE_FLOAT));
946 pi=cpl_table_get_data_float(t,
"FINT");
947 po=cpl_table_get_data_float(out,
"FINT");
951 xnum=cpl_calloc(nrow,
sizeof(
float)) ;
953 for ( i = 0 ; i < nrow ; i++ ) {
957 spec=cpl_calloc(nrow,
sizeof(
float)) ;
958 corrected_spec=cpl_calloc(nrow,
sizeof(
float)) ;
959 eval=cpl_calloc(nrow,
sizeof(
float)) ;
962 for ( z = 0 ; z < nrow ; z++ ) {
964 if (isnan(spec[z]) ) {
965 for ( i = z-1 ; i <= z+1 ; i++ ) {
966 if ( i < 0 ) continue ;
967 if ( i >= nrow) continue ;
968 corrected_spec[i] = ZERO ;
973 eval[z] = (float)shift+(
float)z ;
976 if ( -1 == sinfo_function1d_natural_spline(xnum,spec, nrow,
977 eval,corrected_spec, nrow))
984 for ( z = 0 ; z < nrow ; z++ ) {
985 if ( isnan(corrected_spec[z]) ) {
988 new_sum += corrected_spec[z] ;
991 for ( z = 0 ; z < nrow ; z++ ) {
992 if ( new_sum == 0. ) new_sum =1. ;
994 if ( isnan(corrected_spec[z]) ) {
997 corrected_spec[z] *= sum / new_sum ;
998 po[z] = corrected_spec[z] ;
1003 sinfo_free_float(&xnum);
1004 sinfo_free_float(&spec) ;
1005 sinfo_free_float(&corrected_spec) ;
1006 sinfo_free_float(&eval) ;
1008 check_nomsg(cpl_table_erase_column(t,
"FINT"));
1009 check_nomsg(cpl_table_erase_column(out,col));
1010 check_nomsg(cpl_table_cast_column(out,
"FINT",col,CPL_TYPE_DOUBLE));
1011 check_nomsg(cpl_table_erase_column(out,
"FINT"));
1016 sinfo_free_float(&xnum);
1017 sinfo_free_float(&spec) ;
1018 sinfo_free_float(&corrected_spec) ;
1019 sinfo_free_float(&eval) ;
1020 sinfo_free_table(&out);
1028 sinfo_table_shift_simple(cpl_table* inp,
1034 cpl_table* out=NULL;
1041 cknull(inp,
"null input table");
1043 check_nomsg(nrow=cpl_table_get_nrow(inp));
1044 check_nomsg(out=cpl_table_duplicate(inp));
1045 check_nomsg(cpl_table_fill_column_window(out,col,0,nrow,0));
1046 check_nomsg(pi=cpl_table_get_data_double(inp,col));
1047 check_nomsg(po=cpl_table_get_data_double(out,col));
1050 for(i=0;i<nrow;i++) {
1051 if((i+is)>0 && (i+is+1) < nrow) {
1052 m=pi[i+is+1]-pi[i+is];
1053 po[i]=pi[i+is]+m*ds;
1058 sinfo_free_table(&out);
1074 sinfo_fit_poly(
double p[])
1087 check_nomsg(px= cpl_vector_get_data(sa_vx));
1088 check_nomsg(py= cpl_vector_get_data(sa_vy));
1089 check_nomsg(np= cpl_vector_get_size(sa_vx));
1093 fy=p[0]+p[1]*px[i]+p[2]*px[i]*px[i];
1094 chi2+=(py[i]-fy)*(py[i]-fy);
1104 sinfo_fit_boltzmann(
double p[])
1111 cpl_vector* vtmp=NULL;
1118 check_nomsg(px= cpl_vector_get_data(sa_vx));
1119 check_nomsg(py= cpl_vector_get_data(sa_vy));
1120 check_nomsg(np= cpl_vector_get_size(sa_vx));
1121 check_nomsg(vtmp=cpl_vector_duplicate(sa_vy));
1122 check_nomsg(pv=cpl_vector_get_data(vtmp));
1125 pv[i]=sinfo_fac(px[i],p[2]);
1128 check_nomsg(max=cpl_vector_get_max(vtmp));
1130 check_nomsg(cpl_vector_divide_scalar(vtmp,max));
1131 check_nomsg(cpl_vector_multiply_scalar(vtmp,p[1]));
1132 check_nomsg(cpl_vector_add_scalar(vtmp,p[0]));
1137 chi2+=(py[i]-pv[i])*(py[i]-pv[i]);
1147 sinfo_fitbkg(
const double x[],
1152 double fac = sinfo_fac(x[0],a[2]);
1153 *result = a[0]+a[1]*fac;
1159 sinfo_fac(
const double x,
const double t)
1168 return pow(x,-5.)/(expm1(c/(x*fabs(t))));