package org.freehep.math.minuit.example.sim;
import java.io.IOException;
import java.io.InputStream;
import java.util.Random;
import java.util.Scanner;
/**
*
* @version $Id: GaussDataGen.java 8584 2006-08-10 23:06:37Z duns $
*/
class GaussDataGen
{
private Random random = new Random();
GaussDataGen()
{
this(100);
}
GaussDataGen(InputStream in) throws IOException
{
Scanner scanner = new Scanner(in);
int npar = scanner.nextInt();
theSimMean = scanner.nextDouble();
theSimVar = scanner.nextDouble();
thePositions = new double[npar];
theMeasurements = new double[npar];
theVariances = new double[npar];
for (int i=0; i<npar; i++)
{
thePositions[i] = scanner.nextDouble();
theMeasurements[i] = scanner.nextDouble();
theVariances[i] = scanner.nextDouble();
}
}
GaussDataGen(int npar)
{
thePositions = new double[npar];
theMeasurements = new double[npar];
theVariances = new double[npar];
// errors of measurements (Gaussian, mean=0., sig = 0.01)
double mvariance = 0.01*0.01;
// simulate data
theSimMean = nextFlat(0,50);
theSimVar = nextFlat(6,5);
double sim_sig = Math.sqrt(theSimVar);
double sim_const = 1.;
GaussFunction gauss_sim = new GaussFunction(theSimMean, sim_sig, sim_const);
for (int i = 0; i < npar; i++)
{
//x-position, from -5sigma < mean < +5sigma
double position = theSimMean-5.*sim_sig + i*10.*sim_sig/npar;
thePositions[i] = position;
//y-position (function value)
double epsilon = nextGaussian(0., 0.01);
theMeasurements[i] = gauss_sim.valueAt(position) + epsilon;
theVariances[i] = mvariance;
}
}
private double nextFlat(double mean, double delta)
{
return 2.*delta*(random.nextDouble() - 0.5) + mean;
}
private double nextGaussian(double mean, double sigma)
{
return random.nextGaussian()*sigma + mean;
}
double[] positions()
{
return thePositions;
}
double[] measurements()
{
return theMeasurements;
}
double[] variances()
{
return theVariances;
}
double sim_mean()
{
return theSimMean;
}
double sim_var()
{
return theSimVar;
}
double sim_const()
{
return 1.;
}
private double theSimMean;
private double theSimVar;
private double[] thePositions;
private double[] theMeasurements;
private double[] theVariances;
}