// @(#)root/minuit2:$Id: GaussDataGen.cxx 20880 2007-11-19 11:23:41Z rdm $
// Authors: M. Winkler, F. James, L. Moneta, A. Zsenei   2003-2005  

/**********************************************************************
 *                                                                    *
 * Copyright (c) 2005 LCG ROOT Math team,  CERN/PH-SFT                *
 *                                                                    *
 **********************************************************************/

#include "GaussDataGen.h"
#include "GaussFunction.h"
#include "GaussRandomGen.h"
#include "FlatRandomGen.h"

namespace ROOT {

   namespace Minuit2 {


GaussDataGen::GaussDataGen(unsigned int n) {

  // create random generator for mean values of Gaussian [-50, 50)
  FlatRandomGen rand_mean(0., 50.);
  
  // create random generator for sigma values of Gaussian [1., 11.)
  FlatRandomGen rand_var(6., 5.);
  
  // errors of measurements (Gaussian, mean=0., sig = 0.01)
  double mvariance = 0.01*0.01;
  GaussRandomGen rand_mvar(0., 0.01);
  
  // simulate data
  fSimMean = rand_mean();
  fSimVar = rand_var();
  double sim_sig = sqrt(fSimVar);
  double sim_const = 1.;
  GaussFunction gauss_sim(fSimMean, sim_sig, sim_const);

  for(unsigned int i = 0; i < n; i++) {

    //x-position, from -5sigma < mean < +5sigma
    double position = fSimMean-5.*sim_sig + double(i)*10.*sim_sig/double(n);
    fPositions.push_back(position);

    //y-position (function Value)
    double epsilon = rand_mvar();
    fMeasurements.push_back(gauss_sim(position) + epsilon);
    fVariances.push_back(mvariance);
  }

}

  }  // namespace Minuit2

}  // namespace ROOT
