78{
   81 
   83 
   84  unsigned int  numberOfEvents;
   87  map_type      precision;
   89 
   90  precision["spline"]  = JPrecision_t(1.0e-3,  1.0e-1,  1.0e-4);
   91  precision["hermite"] = JPrecision_t(1.0e-3,  1.0e-1,  1.0e-4);
   92  precision["grid"]    = JPrecision_t(1.0e-3,  1.0e-1,  1.0e-4);
   93  precision["polint"]  = JPrecision_t(1.0e-14, 1.0e-12, 1.0e-14);
   94 
   95  try {
   96 
   97    JParser<> zap(
"Example program to test 1D interpolation of a polynome.");
 
   98 
  104 
  105    zap(argc, argv);
  106  }
  107  catch(const exception &error) {
  108    FATAL(error.what() << endl);
 
  109  }
  110 
  111 
  112  const int N = 3;                        
  113  
  119 
  120  const double xmin = -1.0;
 
  121  const double xmax = +1.0;  
 
  122 
  127 
  128  spline .compile();
  129  hermite.compile();
  130  grid   .compile();
  131  polint .compile();
  132  
  134 
  135  Polint.compile();
  136    
  137  if (numberOfEvents != 0) {
  138 
  139    JABC Qspline ("spline");
  140    JABC Qhermite("hermite");
  141    JABC Qgrid   ("grid");
  142    JABC Qpolint ("polint");
  143    
  144    for (unsigned int i = 0; i != numberOfEvents; ++i) {
  145      
  146      const double x  = gRandom->Uniform(xmin, xmax);
 
  147      
  151      
  152      Qspline .f .put(y1 - spline (x).f);
  153      Qhermite.f .put(y1 - hermite(x).f);
  154      Qgrid   .f .put(y1 - grid   (x).f);
  155      Qpolint .f .put(y1 - polint (x).f);
  156 
  157      Qspline .fp.put(fp - spline (x).fp);
  158      Qhermite.fp.put(fp - hermite(x).fp);
  159      Qgrid   .fp.put(fp - grid   (x).fp);
  160      Qpolint .fp.put(fp - polint (x).fp);
  161 
  162      Qspline .v .put(F1 - spline (x).v);
  163      Qhermite.v .put(F1 - hermite(x).v);
  164      Qgrid   .v .put(F1 - grid   (x).v);
  165      Qpolint .v .put(F1 - Polint (x));
  166    }
  167 
  168    if (
debug >= debug_t) {
 
  169    
  170      cout << "RMS:         f          f'         F     " << endl;
  171      cout << "_________________________________________" << endl;
  172      
  173      cout << "spline  "
  174           << 
SCIENTIFIC(10,3) << Qspline .f .getSTDev() << 
' ' 
  175           << 
SCIENTIFIC(10,3) << Qspline .fp.getSTDev() << 
' ' 
  176           << 
SCIENTIFIC(10,3) << Qspline .v .getSTDev() << endl;
 
  177 
  178      cout << "hermite "
  179           << 
SCIENTIFIC(10,3) << Qhermite.f .getSTDev() << 
' ' 
  180           << 
SCIENTIFIC(10,3) << Qhermite.fp.getSTDev() << 
' ' 
  181           << 
SCIENTIFIC(10,3) << Qhermite.v .getSTDev() << endl;
 
  182      
  183      cout << "grid    "
  184           << 
SCIENTIFIC(10,3) << Qgrid   .f .getSTDev() << 
' ' 
  185           << 
SCIENTIFIC(10,3) << Qgrid   .fp.getSTDev() << 
' ' 
  186           << 
SCIENTIFIC(10,3) << Qgrid   .v .getSTDev() << endl;
 
  187      
  188      cout << "polint  "
  189           << 
SCIENTIFIC(10,3) << Qpolint .f .getSTDev() << 
' ' 
  190           << 
SCIENTIFIC(10,3) << Qpolint .fp.getSTDev() << 
' ' 
  191           << 
SCIENTIFIC(10,3) << Qpolint .v .getSTDev() << endl;
 
  192    }
  193 
  194    ASSERT(Qspline .f .getSTDev() <= precision[
"spline"].f);
 
  195    ASSERT(Qspline .fp.getSTDev() <= precision[
"spline"].fp);
 
  196    ASSERT(Qspline .v .getSTDev() <= precision[
"spline"].v);
 
  197 
  198    ASSERT(Qhermite.f .getSTDev() <= precision[
"hermite"].f);
 
  199    ASSERT(Qhermite.fp.getSTDev() <= precision[
"hermite"].fp);
 
  200    ASSERT(Qhermite.v .getSTDev() <= precision[
"hermite"].v);
 
  201 
  202    ASSERT(Qgrid   .f .getSTDev() <= precision[
"grid"].f);
 
  203    ASSERT(Qgrid   .fp.getSTDev() <= precision[
"grid"].fp);
 
  204    ASSERT(Qgrid   .v .getSTDev() <= precision[
"grid"].v);
 
  205 
  206    ASSERT(Qpolint .f .getSTDev() <= precision[
"polint"].f);
 
  207    ASSERT(Qpolint .fp.getSTDev() <= precision[
"polint"].fp);
 
  208    ASSERT(Qpolint .v .getSTDev() <= precision[
"polint"].v);
 
  209 
  210  } else {
  211 
  212    for ( ; ; ) {
  213        
  214      string buffer;
  215      
  216      cout << "> " << flush;
  217 
  219      
  220      if (buffer != "") {
  221        
  222        try {
  223 
  225          
  226          istringstream(buffer) >> 
x;
 
  227 
  228          cout << 
"f1          " << 
f1     (x)   << endl;
 
  229          cout << "spline      " << spline (x).f << endl;
  230          cout << "hermite     " << hermite(x).f << endl;
  231          cout << "grid spline " << grid   (x).f << endl;
  232          cout << "polynomial  " << polint (x).f << endl;
  233        }
  235          cout << exception.what() << endl;
  236        }
  237 
  238      } else {
  239        break;
  240      }
  241    }
  242  }
  243 
  244  return 0;
  245}
#define ASSERT(A,...)
Assert macro.
 
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
 
int numberOfBins
number of bins for average CDF integral of optical module
 
Utility class to parse command line options.
 
const JPolynome F1
Integral.
 
const JPolynome f1(1.0, 2.0, 3.0)
Function.
 
std::istream & getline(std::istream &in, JString &object)
Read string from input stream until end of line.
 
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
 
Recursive template class for polynomial function.
 
double getIntegral(const double x) const
Integral value.
 
double getValue(const double x) const
Function value.
 
double getDerivative(const double x) const
Derivative value.
 
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
 
Auxiliary data structure for floating point format specification.