/* Attempts to pick a smooth value for a point, according to the algorithm implented for "smooth" markers in Soas. See DOI: 10.1016/j.bioelechem.2009.02.010 Warning: be wary of this function as it will return a correct value only for rather noisy data ! */ static VALUE function_smooth_pick(int argc, VALUE *argv, VALUE self) { long len = function_sanity_check(self); const double *x = Dvector_Data_for_Read(get_x_vector(self),NULL); const double *y = Dvector_Data_for_Read(get_y_vector(self),NULL); long idx; long range; switch(argc) { case 2: range = NUM2LONG(argv[1]); break; case 1: range = len > 500 ? 50 : len/10; break; default: rb_raise(rb_eArgError, "smooth_a=t should have 1 or 2 parameters"); } idx = NUM2LONG(argv[0]); if(idx < 0) idx = len + idx; return rb_float_new(smooth_pick(x,y,len,idx,range)); }