package org.freehep.math.minuit.example.sim;
import junit.framework.TestCase;
import junit.framework.*;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import org.freehep.math.minuit.FunctionMinimum;
import org.freehep.math.minuit.MinosError;
import org.freehep.math.minuit.MnMigrad;
import org.freehep.math.minuit.MnMinos;
import org.freehep.math.minuit.MnUserParameters;
/**
*
* @version $Id: PaulUnitTest2.java 8584 2006-08-10 23:06:37Z duns $
*/
public class PaulUnitTest2 extends TestCase
{
public PaulUnitTest2(String testName)
{
super(testName);
}
public static junit.framework.Test suite()
{
junit.framework.TestSuite suite = new junit.framework.TestSuite(PaulUnitTest2.class);
return suite;
}
public static void testPaulTest2() throws IOException
{
List<Double> positions = new ArrayList<Double>();
List<Double> measurements = new ArrayList<Double>();
List<Double> var = new ArrayList<Double>();
int nmeas = 0;
Scanner in = new Scanner(PaulTest.class.getResourceAsStream("paul2.txt"));
// read input data
{
while(in.hasNextDouble())
{
double x = in.nextDouble();
double y = in.nextDouble();
double width = in.nextDouble();
double err = in.nextDouble();
double unl = in.nextDouble();
double un2 = in.nextDouble();
if(err < 1.e-8) continue;
positions.add(x);
measurements.add(y);
var.add(err*err);
nmeas += y;
}
}
double[] m = new double[var.size()];
double[] p = new double[var.size()];
double[] v = new double[var.size()];
for (int i=0; i<var.size(); i++)
{
m[i] = measurements.get(i);
p[i] = positions.get(i);
v[i] = var.get(i);
}
// create FCN function
GaussFcn theFCN = new GaussFcn(m, p, v);
double[] meas = theFCN.measurements();
double[] pos = theFCN.positions();
// create initial starting values for parameters
double x = 0.;
double x2 = 0.;
double norm = 0.;
double area = 0.;
double dx = pos[1]-pos[0];
for(int i = 0; i < meas.length; i++)
{
norm += meas[i];
x += (meas[i]*pos[i]);
x2 += (meas[i]*pos[i]*pos[i]);
area += dx*meas[i];
}
double mean = x/norm;
double rms2 = x2/norm - mean*mean;
double[] init_val =
{ mean, Math.sqrt(rms2), area};
MnUserParameters upar = new MnUserParameters();
upar.add("mean", mean, 1.);
upar.add("sigma", Math.sqrt(rms2), 1.);
upar.add("area", area, 10.);
MnMigrad migrad = new MnMigrad(theFCN, upar);
FunctionMinimum min = migrad.minimize();
assertTrue(min.isValid());
assertEquals(86,min.nfcn());
assertEquals(805.354,min.fval(),1e-3);
assertEquals(5.43032e-11,min.edm(),1e-15);
assertEquals(22.2893, min.userParameters().value(0),1e-4);
assertEquals(5.32324, min.userParameters().value(1),1e-5);
assertEquals(2564.95, min.userParameters().value(2),1e-2);
assertEquals(0.1087, min.userParameters().error(0),1e-4);
assertEquals(0.08852, min.userParameters().error(1),1e-5);
assertEquals(51.07, min.userParameters().error(2),1e-2);
assertEquals(0.0118217,min.userCovariance().get(0,0),1e-7);
assertEquals(0.00116002,min.userCovariance().get(1,0),1e-8);
assertEquals(0.12912,min.userCovariance().get(2,0),1e-5);
assertEquals(0.00783559,min.userCovariance().get(1,1),1e-8);
assertEquals(0.193434,min.userCovariance().get(1,2),1e-6);
assertEquals(2608.35,min.userCovariance().get(2,2),1e-2);
System.out.println("start minos");
MnMinos minos = new MnMinos(theFCN, min);
MinosError e0 = minos.minos(0);
MinosError e1 = minos.minos(1);
MinosError e2 = minos.minos(2);
assertTrue(e0.isValid());
assertEquals(-0.108695,e0.lower(),1e-5);
assertEquals(0.108737,e0.upper(),1e-5);
assertTrue(e1.isValid());
assertEquals(-0.087359,e1.lower(),1e-5);
assertEquals(0.0888145,e1.upper(),1e-5);
assertTrue(e2.isValid());
assertEquals(-50.8563,e2.lower(),1e-4);
assertEquals(50.856,e2.upper(),1e-4);
}
}