void linear_interpolation(const VectorScalar &temp0, const VectorScalar &alt0,
                          const VectorScalar &alt1, VectorScalar &temp1)
{
  unsigned int j(0);
  typename Antioch::value_type<VectorScalar>::type a;
  typename Antioch::value_type<VectorScalar>::type b;
  temp1.resize(alt1.size());
  for(unsigned int iz = 0; iz < alt1.size(); iz++)
  {
     while(alt0[j] < alt1[iz])
     {
        j++;
        if(!(j < alt0.size()))break;
     }
     if(j == 0)
     {
        Antioch::set_zero(a);
        b = temp0[j];
     }else if(j < alt0.size() - 1)
     {
        a = (temp0[j] - temp0[j-1])/(alt0[j] - alt0[j-1]);
        b = temp0[j] - a * alt0[j];
     }else
     {
        Antioch::set_zero(a);
        b = temp0.back();
     }
     temp1[iz] = a * alt1[iz] + b;
  }
}
void make_custom(unsigned int choice, VectorScalar & x, VectorScalar & y)
{
  // sum_{bin} Delta x * y
  switch(choice)
  {
      case(0): // 9 bin contained in ref -> [2.5;8.5] within [1;10]
      {
          x.resize(9);   y.resize(9);
          x[0] = 2.50L;  y[0] = 2.25L/0.75L; // 0.50 * 2  + 0.25 * 5
          x[1] = 3.25L;  y[1] = 3.75L/0.75L; // 0.75 * 5
          x[2] = 4.00L;  y[2] = 6.00L/0.75L; // 0.75 * 8
          x[3] = 4.75L;  y[3] = 5.00L/0.75L; // 0.25 * 8  + 0.5  * 6
          x[4] = 5.50L;  y[4] = 5.50L/0.75L; // 0.25 * 6  + 0.25 * 10
          x[5] = 6.25L;  y[5] = 7.50L/0.75L; // 0.75 * 10
          x[6] = 7.00L;  y[6] = 5.25L/0.75L; // 0.75 * 7
          x[7] = 7.75L;  y[7] = 3.75L/0.75L; // 0.25 * 7 + 0.5 * 4
          x[8] = 8.50L;  y[8] = 0.00L/0.75L; // 0. (right stairs)
        break;
      }
      case(1):// 9 bin outside ref -> [0;12] containing [1;10]
      {
          x.resize(9);   y.resize(9);
          x[0] = 0.00L;  y[0] = 0.50L/1.50L; // 0.5 * 1
          x[1] = 1.50L;  y[1] = 2.50L/1.50L; // 0.5 * 1  + 2.0 * 1
          x[2] = 3.00L;  y[2] = 9.00L/1.50L; // 1.0 * 5  + 0.5 * 8
          x[3] = 4.50L;  y[3] = 10.0L/1.50L; // 0.5 * 8  + 1.0 * 6
          x[4] = 6.00L;  y[4] = 13.5L/1.50L; // 1.0 * 10 + 0.5 * 7
          x[5] = 7.50L;  y[5] = 7.50L/1.50L; // 0.50 * 7 + 1.0 * 4
          x[6] = 9.00L;  y[6] = 2.00L/1.50L; // 1.0 * 2 
          x[7] = 10.5L;  y[7] = 0.00L/1.50L; // 0
          x[8] = 12.0L;  y[8] = 0.00L/1.50L; // 0. (right stairs)
        break;
      }
      case(2): // 5 bins beyond only min -> [-1;3.8] in [0;10]
      {
          x.resize(5);    y.resize(5);
          x[0] = -1.00L;  y[0] = 0.00L/1.20L; // 0
          x[1] =  0.20L;  y[1] = 0.40L/1.20L; // 0.4 * 1
          x[2] =  1.40L;  y[2] = 1.80L/1.20L; // 0.6 * 1  + 0.6 * 2
          x[3] =  2.60L;  y[3] = 4.80L/1.20L; // 0.4 * 2  + 0.8 * 5
          x[4] =  3.80L;  y[4] = 00.0L/1.20L; // 0. (right stairs)
        break;
      }
      case(3):// 6 bins beyond only max -> [2;10.75] in [0;10]
      {
          x.resize(6);    y.resize(6);
          x[0] =  2.00L;  y[0] =  5.75L/1.75L; // 1.00 * 2 + 0.75 * 5
          x[1] =  3.75L;  y[1] = 12.25L/1.75L; // 0.25 * 5 + 1.00 * 8 + 0.50 * 6
          x[2] =  5.50L;  y[2] = 14.75L/1.75L; // 0.50 * 6 + 1.00 * 10 + 0.25 * 7
          x[3] =  7.25L;  y[3] =  9.25L/1.75L; // 0.75 * 7 + 1.00 * 4
          x[4] =  9.00L;  y[4] =  2.00L/1.75L; // 1.00 * 2
          x[5] = 10.75L;  y[5] = 00.00L/1.75L; // 0. (right stairs)
        break;
      }
  }

}
void make_reference(VectorScalar & x, VectorScalar & y)
{
  x.resize(10,0);
  y.resize(10,0);
  for(unsigned int i = 0; i < 10; i++)
  {
     x[i] = ((typename Antioch::value_type<VectorScalar>::type)(i+1));
  }
  y[0] = 1.L;
  y[1] = 2.L;
  y[2] = 5.L;
  y[3] = 8.L;
  y[4] = 6.L;
  y[5] = 10.L;
  y[6] = 7.L;
  y[7] = 4.L;
  y[8] = 2.L;
  y[9] = 0.3L;

}