package hep.aida.ref.test.jaida;
import hep.aida.IAnalysisFactory;
import hep.aida.ICloud1D;
import hep.aida.ICloud2D;
import hep.aida.ICloud3D;
import hep.aida.IDataPoint;
import hep.aida.IDataPointSet;
import hep.aida.IDataPointSetFactory;
import hep.aida.IFitFactory;
import hep.aida.IFitResult;
import hep.aida.IFitter;
import hep.aida.IFunction;
import hep.aida.IFunctionFactory;
import hep.aida.IHistogram1D;
import hep.aida.IHistogram2D;
import hep.aida.IHistogram3D;
import hep.aida.IHistogramFactory;
import hep.aida.IManagedObject;
import hep.aida.IProfile1D;
import hep.aida.IProfile2D;
import hep.aida.ITree;
import hep.aida.ITuple;
import hep.aida.ITupleFactory;
import hep.aida.ref.fitter.FitParameterSettings;
import hep.aida.ref.fitter.FitResult;
import hep.aida.util.XMLUtils;
import java.io.IOException;
import java.util.Random;
import junit.framework.TestCase;
/**
* Test conversion IManagedObject <-> XML String
* also test conversion IFitResult <-> XML String
*
* @author serbo
* @version $Id: TestXMLToString.java 13796 2010-12-15 22:04:40Z turri $
*/
public class TestXMLToString extends TestCase {
private ITree tree;
public TestXMLToString(String testName) {
super(testName);
}
public void testMO() throws IOException {
String[] names = tree.listObjectNames("/", true);
String[] types = tree.listObjectTypes("/", true);
for (int i=0; i<names.length; i++) {
// Skip directories
if (types[i].equalsIgnoreCase("dir")) continue;
// FIXME: skip Histograms, Clouds, and Profiles
if (types[i].indexOf("Hist") > 0) continue;
if (types[i].indexOf("Cloud") > 0) continue;
if (types[i].indexOf("Prof") > 0) continue;
IManagedObject mo1 = tree.find(names[i]);
String xmlString1 = XMLUtils.createXMLString(mo1);
IManagedObject mo2 = XMLUtils.createManagedObject(xmlString1);
String xmlString2 = XMLUtils.createXMLString(mo2);
assertEquals(xmlString1, xmlString2);
hep.aida.test.AidaTestCase.assertEquals(mo1, mo2);
}
}
public void testFitResult() throws IOException {
String functionPath = "/Functions/P1 Function";
IFunction function = (IFunction) tree.find(functionPath);
// Create and fill FitResult
FitResult fitResult1 = new FitResult(2);
fitResult1.setNdf(18);
fitResult1.setEngineName("jminuit");
fitResult1.setFitMethodName("Chi2");
fitResult1.setIsValid(true);
fitResult1.setQuality(0.987654321);
fitResult1.setFitStatus(2);
fitResult1.setDataDescription("Testing conversion: IFitResult <-> XML String");
fitResult1.setFittedFunction(function);
String fpName = "p0";
FitParameterSettings fps = new FitParameterSettings(fpName);
fps.setFixed(false);
fps.setStepSize(0.123456789);
fitResult1.setFitParameterSettings(fpName, fps);
fpName = "p1";
fps = new FitParameterSettings(fpName);
fps.setLowerBound(-987654321);
fps.setUpperBound(987654321);
fitResult1.setFitParameterSettings(fpName, fps);
for (int i=0; i<2; i++) {
for (int j=0; j<2; j++) {
fitResult1.setCovMatrixElement(i, j, (i+1)*(j+2));
}
}
String[] constraints = { "p0 < 10", "p1 > 0" };
fitResult1.setConstraints(constraints);
// Test conversion
String xmlString1 = XMLUtils.createXMLString(fitResult1);
IFitResult fitResult2 = XMLUtils.createFitResult(xmlString1);
String xmlString2 = XMLUtils.createXMLString(fitResult2);
assertEquals(xmlString1, xmlString2);
// FIXME: need assert to compare IFitResults
hep.aida.test.AidaTestCase.assertEquals(fitResult1, fitResult2);
}
/* Can not use Optimizer here - it is in the different package
public void testFitResult() throws IOException {
IAnalysisFactory af = IAnalysisFactory.create();
IFitFactory fitF = af.createFitFactory();
IFunctionFactory funcF = af.createFunctionFactory(tree);
IFitter fitter = fitF.createFitter("Chi2","jminuit");
IFunction line = funcF.createFunctionByName("line","p1");
String dpsPath = "/DataPointSets/DataPointSet 2D";
IDataPointSet dps = (IDataPointSet) tree.find(dpsPath);
IFitResult result1 = fitter.fit(dps,line);
String xmlString1 = XMLUtils.createXMLString(result1);
IFitResult result2 = XMLUtils.createFitResult(xmlString1);
String xmlString2 = XMLUtils.createXMLString(result2);
assertEquals(xmlString1, xmlString2);
//hep.aida.test.AidaTestCase.assertEquals(result1, result);
}
*/
protected void setUp() throws Exception {
super.setUp();
int nBins = 10;
int nEntries = 15;
double xMin = -2;
double xMax = 2;
double yMin = -2.5;
double yMax = 2.5;
double zMin = -3;
double zMax = 3;
IAnalysisFactory af = IAnalysisFactory.create();
tree = af.createTreeFactory().create();
IDataPointSetFactory df = af.createDataPointSetFactory(tree);
IHistogramFactory hf = af.createHistogramFactory(tree);
ITupleFactory tf = af.createTupleFactory(tree);
IFunctionFactory ff = af.createFunctionFactory(tree);
Random r = new Random();
tree.mkdirs("/DataPointSets");
tree.cd("/DataPointSets");
IDataPointSet d1 = df.create("DataPointSet 1D", "DataPointSet 1D Title", 1);
d1.annotation().addItem("testAnnotationWithTab", "\tabc\t");
IDataPointSet d2 = df.create("DataPointSet 2D", "DataPointSet 2D Title", 2);
IDataPointSet d3 = df.create("DataPointSet 3D", "DataPointSet 3D Title", 3);
IDataPointSet d4 = df.create("DataPointSet 4D", "DataPointSet 4D Title", 4);
tree.mkdirs("/Functions");
tree.cd("/Functions");
IFunction f1 = ff.createFunctionByName("P1 Function","p1");
f1.setParameter("p0", -2);
f1.setParameter("p1", 1);
IFunction f2 = ff.createFunctionFromScript("Script Function", 1, "a*(x[0] - b)", "a,b", "simple a*(x[0] - b) function");
f2.setParameter("a", 1);
f2.setParameter("b", 2);
tree.mkdirs("/Histograms");
tree.cd("/Histograms");
IHistogram1D h1 = hf.createHistogram1D("Histogram 1D", "Histogram 1D - normal", nBins, xMin, xMax);
IHistogram2D h2 = hf.createHistogram2D("Histogram 2D", "Histogram 2D - normal", nBins, xMin, xMax, nBins, yMin, yMax);
IHistogram3D h3 = hf.createHistogram3D("Histogram 3D", "Histogram 3D - normal", nBins, xMin, xMax, nBins, yMin, yMax, nBins, zMin, zMax);
tree.mkdirs("/Clouds");
tree.cd("/Clouds");
ICloud1D c11 = hf.createCloud1D("Cloud 1D conv", "Cloud1D - converted", 10);
ICloud2D c21 = hf.createCloud2D("Cloud 2D conv", "Cloud2D - converted", 10);
ICloud3D c31 = hf.createCloud3D("Cloud 3D conv", "Cloud3D - converted", 10);
ICloud1D c12 = hf.createCloud1D("Cloud 1D", "Cloud1D - not converted", -1);
ICloud2D c22 = hf.createCloud2D("Cloud 2D", "Cloud2D - not converted", -1);
ICloud3D c32 = hf.createCloud3D("Cloud 3D", "Cloud3D - not converted", -1);
tree.mkdirs("/Profiles");
tree.cd("/Profiles");
IProfile1D p1 = hf.createProfile1D("Profile 1D", "Profile 1D - normal", nBins, xMin, xMax);
IProfile2D p2 = hf.createProfile2D("Profile 2D", "Profile 2D - normal", nBins, xMin, xMax, nBins, yMin, yMax);
tree.mkdirs("/Tuples");
tree.cd("/Tuples");
String numberColumns = "boolean bool_col =false, byte byte_col =0, short short_col =0, int int_col =0, long long_col =0, float float_col =0, double double_col =0";
ITuple numberTuple = tf.create("Number Tuple", "Tuple with Numbers Only", numberColumns);
String stringColumns = "char char_col, string string_col";
ITuple stringTuple = tf.create("String Tuple", "Tuple with Strings and Characters", stringColumns);
String subtupleColumns = "int event_number=0, int nTracks=0, ITuple tracks = { double px = 0., py = 0., pz = 0., int nHits=0, ITuple hits = {int x,y,z} }";
ITuple subtupleTuple = tf.create("Structure Tuple", "Tuple with Internal Structure", subtupleColumns);
// Fill in some funny names and titles
tree.mkdirs("/Funny_Names");
tree.cd("/Funny_Names");
String title = "<HTML>TITLE<sub>subscripted</sub> <i>can also</i> <b>do</b> text<sup>superscripted</sup> and Ψ, λ, π";
IHistogram1D h111 = hf.createHistogram1D("FH 1", title, nBins, xMin, xMax);
IHistogram1D h112 = hf.createHistogram1D("FH 2 part\\/All", "Ratio of part/All", nBins, xMin, xMax);
ITuple fsTuple = tf.create("Funny String Tuple", "Tuple with Funny Strings", "string funny_string");
// Fill AIDA objects with data
String abc = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
for (int i=0; i<nEntries; i++) {
double x = r.nextGaussian();
double y = r.nextGaussian();
double z = r.nextGaussian();
double w = r.nextDouble();
d1.addPoint();
IDataPoint p = d1.point(i);
p.coordinate(0).setValue(x);
d2.addPoint();
p = d2.point(i);
p.coordinate(0).setValue(i);
p.coordinate(1).setValue(i+y);
p.coordinate(1).setErrorPlus(0.1);
p.coordinate(1).setErrorMinus(0.1);
d3.addPoint();
p = d3.point(i);
p.coordinate(0).setValue(x);
p.coordinate(1).setValue(y);
p.coordinate(2).setValue(z);
d4.addPoint();
p = d4.point(i);
p.coordinate(0).setValue(x);
p.coordinate(1).setValue(y);
p.coordinate(2).setValue(z);
p.coordinate(3).setValue(w);
h1.fill(x, w);
h111.fill(x, w);
h112.fill(w);
h2.fill(x, y, w);
h3.fill(x, y, z, w);
c11.fill(x, w);
c21.fill(x, y, w);
c31.fill(x, y, z, w);
c12.fill(x, w);
c22.fill(x, y, w);
c32.fill(x, y, z, w);
p1.fill(x, y, w);
p2.fill(x, y, z, w);
numberTuple.fill(0, r.nextBoolean());
numberTuple.fill(1, (byte) (r.nextInt(8) & 0x7) );
numberTuple.fill(2, (short) (r.nextInt(16) & 0xF) );
numberTuple.fill(3, r.nextInt());
numberTuple.fill(4, r.nextLong());
numberTuple.fill(5, r.nextFloat());
numberTuple.fill(6, r.nextDouble());
numberTuple.addRow();
// Fill Tuple with characters and Strings
int index = i % abc.length();
String str = "String_Entry_" + String.valueOf(i);
stringTuple.fill(0, abc.charAt(index));
stringTuple.fill(1, str);
stringTuple.addRow();
String funnyString = "<HTML>" + String.valueOf(913+index) + ";";
fsTuple.fill(0, funnyString);
fsTuple.addRow();
int nTracks = r.nextInt(nEntries);
subtupleTuple.fill(0, i);
subtupleTuple.fill(1, nTracks);
ITuple track = subtupleTuple.getTuple( 2 );
for (int j=0; j<nTracks; j++) {
track.fill(0,r.nextGaussian());
track.fill(1,r.nextGaussian());
track.fill(2,r.nextGaussian());
int nHits = r.nextInt(10);
track.fill(3, nHits);
ITuple hits = track.getTuple( 4 );
for ( int k = 0; k<nHits; k++ ) {
hits.fill(0,r.nextInt(10));
hits.fill(1,r.nextInt(10));
hits.fill(2,r.nextInt(10));
hits.addRow();
}
track.addRow();
}
subtupleTuple.addRow();
}
}
protected void tearDown() throws Exception {
tree.close();
tree = null;
}
}