// Copyright FreeHEP, 2002-2007
package hep.aida.ref.xml;
import hep.aida.IAnnotation;
import hep.aida.IAxis;
import hep.aida.IDataPoint;
import hep.aida.IFunction;
import hep.aida.IManagedObject;
import hep.aida.IMeasurement;
import hep.aida.IModelFunction;
import hep.aida.dev.IDevManagedObject;
import hep.aida.ref.Annotation;
import hep.aida.ref.ContainerManagedObject;
import hep.aida.ref.fitter.FitParameterSettings;
import hep.aida.ref.fitter.FitResult;
import hep.aida.ref.function.FunctionCatalog;
import hep.aida.ref.histogram.Cloud1D;
import hep.aida.ref.histogram.Cloud2D;
import hep.aida.ref.histogram.Cloud3D;
import hep.aida.ref.histogram.DataPointSet;
import hep.aida.ref.histogram.FixedAxis;
import hep.aida.ref.histogram.Histogram1D;
import hep.aida.ref.histogram.Histogram2D;
import hep.aida.ref.histogram.Histogram3D;
import hep.aida.ref.histogram.Profile1D;
import hep.aida.ref.histogram.Profile2D;
import hep.aida.ref.histogram.VariableAxis;
import hep.aida.ref.tree.Folder;
import hep.aida.ref.tuple.Tuple;
import hep.aida.ref.xml.binary.AidaWBXML;
import hep.aida.ref.xml.binary.AidaWBXMLConverter;
import hep.aida.ref.xml.binary.AidaWBXMLLookup;
import java.util.ArrayList;
import java.util.Stack;
import java.util.StringTokenizer;
import org.freehep.wbxml.Attributes;
import org.xml.sax.SAXException;
/**
* Implementation of the AIDA handlers for ASCII and Binary XML
*
* @author Tony Johnson
* @author Mark Donszelmann
* @version $Id: AidaHandlerImpl.java 10736 2007-05-16 19:32:45Z serbo $
*/
public class AidaHandlerImpl extends AidaWBXMLLookup implements AidaHandler,
AidaBinaryHandler {
public static final boolean DEBUG = false;
private Cloud1D cloud1d;
private Cloud2D cloud2d;
private Cloud3D cloud3d;
private DataPointSet dataPointSet;
private IAnnotation annotation;
private IAnnotation saveAnnotation;
private IDataPoint dataPoint;
private Stack stack = new Stack();
private String aidaVersion;
private String name;
private String options;
private String path;
private String saveName;
private String saveTitle;
private String title;
//private hep.aida.ref.tree.Tree tree;
private hep.aida.dev.IAddable tree;
private Tuple tuple;
private IAxis[] axes = new IAxis[3];
private double[] binBorders;
private int[] entries1d;
private int[][] entries2d;
private int[][][] entries3d;
private double[] errors1d;
private double[][] errors2d;
private double[][][] errors3d;
private double[] heights1d;
private double[][] heights2d;
private double[][][] heights3d;
private double[] mean = new double[3];
private double[] means1d;
private double[][] meansx2d;
private double[][][] meansx3d;
private double[][] meansy2d;
private double[][][] meansy3d;
private double[][][] meansz3d;
private double[] rms = new double[3];
private double[] rmss1d;
private double[][] rmssx2d;
private double[][][] rmssx3d;
private double[][] rmssy2d;
private double[][][] rmssy3d;
private double[][][] rmssz3d;
private boolean aida22;
private boolean beforeAida33;
private boolean hasBinMeanAndRms;
private double binMax;
private double binMin;
private int column;
private int nAxis;
private int nBin;
private int nBins;
private int nextCoord;
private IFunction function;
private String argName;
private boolean isNormalized;
private String tupleString = "";
private int innerFolders = 0;
// IFitResult objects
private FitResult fitResult;
private ArrayList constrains;
private String fitName;
private String fitTitle;
private String fitPath;
private String fitOptions;
private boolean markAsFilled = true;
public AidaHandlerImpl(hep.aida.dev.IAddable tree) {
this(tree, true);
}
public AidaHandlerImpl(hep.aida.dev.IAddable tree, boolean markAsFilled) {
//this.tree = (hep.aida.ref.tree.Tree) tree;
this.tree = tree;
this.markAsFilled = markAsFilled;
}
// Begin of the IFitResult handling
public void start_fitResult(final org.xml.sax.Attributes atts)
throws SAXException {
start_fitResult(new AttributesAdapter(atts));
}
public void start_fitResult(final Attributes meta) throws SAXException {
int dim = meta.getIntValue(this.FIT_DIMENSION);
fitResult = new FitResult(dim);
fitName = meta.getStringValue(NAME, "");
fitTitle = meta.getStringValue(aida22 ? LABEL : TITLE, "");
fitPath = meta.getStringValue(PATH, "");
fitOptions = meta.getStringValue(OPTIONS, "");
fitResult.setNdf(meta.getIntValue(this.FIT_DEGREES_OF_FREEDOM));
fitResult.setEngineName(meta.getStringValue(this.FIT_ENGINE_NAME));
fitResult.setFitMethodName(meta.getStringValue(this.FIT_METHOD_NAME));
fitResult.setIsValid(meta.getBooleanValue(this.FIT_IS_VALID));
fitResult.setQuality(meta.getDoubleValue(this.FIT_QUALITY));
fitResult.setFitStatus(meta.getIntValue(this.FIT_STATUS));
fitResult.setDataDescription(meta.getStringValue(this.FIT_DATA_DESCRIPTION));
}
public void end_fitResult() throws SAXException {
if (function != null) {
fitResult.setFittedFunction(function);
function = null;
}
if (constrains != null && constrains.size() > 0) {
String[] constr = new String[constrains.size()];
constr = (String[]) constrains.toArray(constr);
constrains.clear();
fitResult.setConstraints(constr);
}
constrains = null;
ContainerManagedObject cmo = new ContainerManagedObject(name);
cmo.setObject(fitResult);
add(path, cmo);
fitResult = null;
fitName = null;
fitTitle = null;
fitPath = null;
fitOptions = null;
}
public void start_covarianceMatrix(final org.xml.sax.Attributes atts)
throws SAXException {
start_covarianceMatrix(new AttributesAdapter(atts));
}
public void start_covarianceMatrix (final Attributes meta) throws SAXException {
}
public void end_covarianceMatrix () throws SAXException {
}
public void handle_fittedParameter(final org.xml.sax.Attributes atts)
throws SAXException {
handle_fittedParameter(new AttributesAdapter(atts));
}
public void handle_fittedParameter(final Attributes meta) throws SAXException {
String fpName = meta.getStringValue(this.FITTED_PARAMETER_NAME);
FitParameterSettings fps = new FitParameterSettings(fpName);
fps.setFixed(meta.getBooleanValue(this.FITTED_PARAMETER_IS_FIXED, false));
double stepSize = meta.getDoubleValue(this.FITTED_PARAMETER_STEP_SIZE, Double.NaN);
if (!Double.isNaN(stepSize)) fps.setStepSize(stepSize);
double bound = meta.getDoubleValue(this.FITTED_PARAMETER_LOWER_BOUND, Double.NEGATIVE_INFINITY);
fps.setLowerBound(bound);
bound = meta.getDoubleValue(this.FITTED_PARAMETER_UPPER_BOUND, Double.POSITIVE_INFINITY);
fps.setUpperBound(bound);
fitResult.setFitParameterSettings(fpName, fps);
}
public void handle_fitConstraint(final org.xml.sax.Attributes atts)
throws SAXException {
handle_fitConstraint(new AttributesAdapter(atts));
}
public void handle_fitConstraint(final Attributes meta) throws SAXException {
if (constrains == null) constrains = new ArrayList();
String fcValue = meta.getStringValue(this.FIT_CONSTRAINT_VALUE);
if (fcValue != null && !fcValue.trim().equals(""))
constrains.add(fcValue);
}
public void handle_matrixElement(final org.xml.sax.Attributes atts)
throws SAXException {
handle_matrixElement(new AttributesAdapter(atts));
}
public void handle_matrixElement(final Attributes meta) throws SAXException {
int i = meta.getIntValue(this.MATRIX_ELEMENT_ROW);
int j = meta.getIntValue(this.MATRIX_ELEMENT_COLUMN);
fitResult.setCovMatrixElement(i, j, meta.getDoubleValue(this.MATRIX_ELEMENT_VALUE));
}
// End of the IFitResult handling
public void end_aida() throws SAXException {
}
public void end_annotation() throws SAXException {
}
public void end_argument() throws SAXException {
}
public void end_arguments() throws SAXException {
if (function instanceof IModelFunction) {
IModelFunction model = (IModelFunction) function;
model.normalize(isNormalized);
}
}
public void end_axis() throws SAXException {
if (binBorders != null) {
axes[nAxis] = new VariableAxis(binBorders);
} else {
axes[nAxis] = new FixedAxis(nBins, binMin, binMax);
}
}
public void end_cloud1d() throws SAXException {
if (annotation != null) {
cloud1d.setAnnotation(annotation);
annotation = null;
}
cloud1d.setTitle((title == null) ? name : title);
add(path, cloud1d);
cloud1d = null;
}
public void end_cloud2d() throws SAXException {
if (annotation != null) {
cloud2d.setAnnotation(annotation);
annotation = null;
}
cloud2d.setTitle((title == null) ? name : title);
add(path, cloud2d);
cloud2d = null;
}
public void end_cloud3d() throws SAXException {
if (annotation != null) {
cloud3d.setAnnotation(annotation);
annotation = null;
}
cloud3d.setTitle((title == null) ? name : title);
add(path, cloud3d);
cloud3d = null;
}
public void end_columns() throws SAXException {
if (innerFolders != 0) {
tupleString += "}";
innerFolders--;
}
}
public void end_data1d() throws SAXException {
}
public void end_data2d() throws SAXException {
}
public void end_data3d() throws SAXException {
}
public void end_dataPoint() throws SAXException {
}
public void end_dataPointSet() throws SAXException {
if (annotation != null) {
dataPointSet.setAnnotation(annotation);
annotation = null;
}
dataPointSet.setTitle((title == null) ? name : title);
add(path, dataPointSet);
dataPointSet = null;
}
public void end_entries1d() throws SAXException {
}
public void end_entries2d() throws SAXException {
if (DEBUG) {
System.err.println("end_entries2d()");
}
}
public void end_entries3d() throws SAXException {
if (DEBUG) {
System.err.println("end_entries3d()");
}
}
public void end_entryITuple() throws SAXException {
Object[] elements = (Object[]) stack.pop();
tuple = (Tuple) elements[0];
column = ((Integer) elements[1]).intValue();
column++;
}
public void end_function() throws SAXException {
((IDevManagedObject) function).setName(name);
if (fitResult == null) add(path, (IManagedObject) function);
}
public void end_histogram1d() throws SAXException {
Histogram1D hist = new Histogram1D();
hist.setName(name);
hist.initHistogram1D(axes[0], options);
hist.setContents(heights1d, errors1d, entries1d, means1d, rmss1d);
//if (!hasBinMeanAndRms) {
hist.setMeanAndRms(mean[0], rms[0]);
//}
if (annotation != null) {
hist.setAnnotation(annotation);
annotation = null;
}
hist.setTitle((title == null) ? name : title);
if (cloud1d != null) {
cloud1d.setHistogram(hist);
annotation = saveAnnotation;
title = saveTitle;
name = saveName;
} else {
add(path, hist);
}
}
public void end_histogram2d() throws SAXException {
Histogram2D hist = new Histogram2D();
hist.setName(name);
hist.initHistogram2D(axes[0], axes[1], options);
hist.setContents(heights2d, errors2d, entries2d, meansx2d, rmssx2d,
meansy2d, rmssy2d);
if (!hasBinMeanAndRms) {
hist.setMeanX(mean[0]);
hist.setRmsX(rms[0]);
hist.setMeanY(mean[1]);
hist.setRmsY(rms[1]);
}
if (annotation != null) {
hist.setAnnotation(annotation);
annotation = null;
}
hist.setTitle((title == null) ? name : title);
if (cloud2d != null) {
cloud2d.setHistogram(hist);
annotation = saveAnnotation;
title = saveTitle;
name = saveName;
} else {
add(path, hist);
}
}
public void end_histogram3d() throws SAXException {
Histogram3D hist = new Histogram3D();
hist.setName(name);
hist.initHistogram3D(axes[0], axes[1], axes[2], options);
hist.setContents(heights3d, errors3d, entries3d, meansx3d, rmssx3d,
meansy3d, rmssy3d, meansz3d, rmssz3d);
if (!hasBinMeanAndRms) {
hist.setMeanX(mean[0]);
hist.setRmsX(rms[0]);
hist.setMeanY(mean[1]);
hist.setRmsY(rms[1]);
hist.setMeanZ(mean[2]);
hist.setRmsZ(rms[2]);
}
if (annotation != null) {
hist.setAnnotation(annotation);
annotation = null;
}
hist.setTitle((title == null) ? name : title);
if (cloud3d != null) {
cloud3d.setHistogram(hist);
annotation = saveAnnotation;
title = saveTitle;
name = saveName;
} else {
add(path, hist);
}
}
public void end_parameters() throws SAXException {
}
public void end_profile1d() throws SAXException {
Profile1D hist = new Profile1D();
hist.setName(name);
hist.initProfile1D(axes[0]);
hist.setContents(heights1d, errors1d, entries1d, rmss1d, means1d);
hist.setMean(mean[0]);
hist.setRms(rms[0]);
if (annotation != null) {
hist.setAnnotation(annotation);
annotation = null;
}
hist.setTitle((title == null) ? name : title);
add(path, hist);
}
public void end_profile2d() throws SAXException {
Profile2D hist = new Profile2D();
hist.setName(name);
hist.initProfile2D(axes[0], axes[1]);
hist.setContents(heights2d, errors2d, entries2d, rmssx2d, meansx2d,
meansy2d);
hist.setMeanX(mean[0]);
hist.setRmsX(rms[0]);
hist.setMeanY(mean[1]);
hist.setRmsY(rms[1]);
if (annotation != null) {
hist.setAnnotation(annotation);
annotation = null;
}
hist.setTitle((title == null) ? name : title);
add(path, hist);
}
public void end_row() throws SAXException {
tuple.addRow();
}
public void end_rows() throws SAXException {
}
public void end_statistics() throws SAXException {
if (DEBUG) {
System.err.println("end_statistics()");
}
}
public void end_tuple() throws SAXException {
if (annotation != null) {
tuple.setAnnotation(annotation);
annotation = null;
}
tuple.setTitle((title == null) ? name : title);
add(path, tuple);
}
public void handle_bin1d(final org.xml.sax.Attributes atts)
throws SAXException {
handle_bin1d(new AttributesAdapter(atts));
}
public void handle_bin1d(final Attributes meta) throws SAXException {
int bin = getBinNum(meta.getIntValue(BIN_NUM), axes[0].bins());
errors1d[bin] = meta.getDoubleValue(ERROR, Double.NaN);
entries1d[bin] = meta.getIntValue(ENTRIES);
heights1d[bin] = meta.getDoubleValue(HEIGHT, (double) entries1d[bin]);
if (hasBinMeanAndRms) {
boolean hasWeightedMean = meta.getType(WEIGHTED_MEAN) >= 0;
boolean hasWeightedRms = meta.getType(WEIGHTED_RMS) >= 0;
boolean hasRms = meta.getType(RMS) >= 0;
hasBinMeanAndRms = hasWeightedMean && (hasWeightedRms || hasRms);
if (hasBinMeanAndRms) {
means1d[bin] = meta.getDoubleValue(WEIGHTED_MEAN);
rmss1d[bin] = meta.getDoubleValue(hasWeightedRms ? WEIGHTED_RMS
: RMS);
}
}
}
public void handle_bin2d(final org.xml.sax.Attributes atts)
throws SAXException {
handle_bin2d(new AttributesAdapter(atts));
}
public void handle_bin2d(final Attributes meta) throws SAXException {
int xBin = getBinNum(meta.getIntValue(BIN_NUM_X), axes[0].bins());
int yBin = getBinNum(meta.getIntValue(BIN_NUM_Y), axes[1].bins());
errors2d[xBin][yBin] = meta.getDoubleValue(ERROR, Double.NaN);
entries2d[xBin][yBin] = meta.getIntValue(ENTRIES);
heights2d[xBin][yBin] = meta.getDoubleValue(HEIGHT,
(double) entries2d[xBin][yBin]);
if (hasBinMeanAndRms) {
boolean hasWeightedMeanX = meta.getType(WEIGHTED_MEAN_X) >= 0;
boolean hasWeightedRmsX = meta.getType(WEIGHTED_RMS_X) >= 0;
boolean hasRms = meta.getType(RMS) >= 0;
boolean hasWeightedMeanY = meta.getType(WEIGHTED_MEAN_Y) >= 0;
hasBinMeanAndRms = hasWeightedMeanX && hasWeightedMeanY
&& (hasWeightedRmsX || hasRms);
if (hasBinMeanAndRms) {
meansx2d[xBin][yBin] = meta.getDoubleValue(WEIGHTED_MEAN_X);
rmssx2d[xBin][yBin] = meta
.getDoubleValue(hasWeightedRmsX ? WEIGHTED_RMS_X : RMS);
meansy2d[xBin][yBin] = meta.getDoubleValue(WEIGHTED_MEAN_Y);
if (meta.getType(WEIGHTED_RMS_Y) >= 0) {
rmssy2d[xBin][yBin] = meta.getDoubleValue(WEIGHTED_RMS_Y);
}
}
}
}
public void handle_bin3d(final org.xml.sax.Attributes atts)
throws SAXException {
handle_bin3d(new AttributesAdapter(atts));
}
public void handle_bin3d(final Attributes meta) throws SAXException {
int xBin = getBinNum(meta.getIntValue(BIN_NUM_X), axes[0].bins());
int yBin = getBinNum(meta.getIntValue(BIN_NUM_Y), axes[1].bins());
int zBin = getBinNum(meta.getIntValue(BIN_NUM_Z), axes[2].bins());
errors3d[xBin][yBin][zBin] = meta.getDoubleValue(ERROR, Double.NaN);
entries3d[xBin][yBin][zBin] = meta.getIntValue(ENTRIES);
heights3d[xBin][yBin][zBin] = meta.getDoubleValue(HEIGHT,
(double) entries3d[xBin][yBin][zBin]);
if (hasBinMeanAndRms) {
boolean hasWeightedMeanX = meta.getType(WEIGHTED_MEAN_X) >= 0;
boolean hasWeightedRmsX = meta.getType(WEIGHTED_RMS_X) >= 0;
boolean hasWeightedMeanY = meta.getType(WEIGHTED_MEAN_Y) >= 0;
boolean hasWeightedRmsY = meta.getType(WEIGHTED_RMS_Y) >= 0;
boolean hasWeightedMeanZ = meta.getType(WEIGHTED_MEAN_Z) >= 0;
boolean hasWeightedRmsZ = meta.getType(WEIGHTED_RMS_Z) >= 0;
hasBinMeanAndRms = hasWeightedMeanX && hasWeightedMeanY
&& hasWeightedMeanZ && hasWeightedRmsX && hasWeightedRmsY
&& hasWeightedRmsZ;
if (hasBinMeanAndRms) {
meansx3d[xBin][yBin][zBin] = meta
.getDoubleValue(WEIGHTED_MEAN_X);
rmssx3d[xBin][yBin][zBin] = meta.getDoubleValue(WEIGHTED_RMS_X);
meansy3d[xBin][yBin][zBin] = meta
.getDoubleValue(WEIGHTED_MEAN_Y);
rmssy3d[xBin][yBin][zBin] = meta.getDoubleValue(WEIGHTED_RMS_Y);
meansz3d[xBin][yBin][zBin] = meta
.getDoubleValue(WEIGHTED_MEAN_Z);
rmssz3d[xBin][yBin][zBin] = meta.getDoubleValue(WEIGHTED_RMS_Z);
}
}
}
public void handle_binBorder(final org.xml.sax.Attributes atts)
throws SAXException {
handle_binBorder(new AttributesAdapter(atts));
}
public void handle_binBorder(final Attributes meta) throws SAXException {
if (binBorders == null) {
binBorders = new double[nBins + 1];
binBorders[0] = binMin;
binBorders[nBins] = binMax;
nBin = 1;
}
binBorders[nBin++] = meta.getDoubleValue(VALUE_DOUBLE);
}
public void handle_codelet(final java.lang.String data,
final org.xml.sax.Attributes atts) throws SAXException {
handle_codelet(data, new AttributesAdapter(atts));
}
public void handle_codelet(final java.lang.String data,
final Attributes meta) throws SAXException {
String codelet = data;
if (codelet.startsWith("\n"))
codelet = codelet.substring(1);
if (codelet.endsWith("\n"))
codelet = codelet.substring(0, codelet.length() - 1);
codelet = codelet.trim();
function = FunctionCatalog.getFunctionCatalog().getFunctionCreator()
.createFromCodelet(codelet);
if (title != null)
function.setTitle(title);
}
public void handle_column(final org.xml.sax.Attributes atts)
throws SAXException {
handle_column(new AttributesAdapter(atts));
}
public void handle_column(final Attributes meta) throws SAXException {
String type = meta.getStringValue(TYPE);
if (!tupleString.equals("") && !tupleString.endsWith(",")
&& !tupleString.endsWith("{"))
tupleString += ",";
tupleString += type + " " + meta.getStringValue(NAME);
if (!beforeAida33 && type.equalsIgnoreCase("ITuple")) {
tupleString += "={";
innerFolders++;
}
}
public void handle_entry(final org.xml.sax.Attributes atts)
throws SAXException {
handle_entry(new AttributesAdapter(atts));
}
public void handle_entry(final Attributes meta) throws SAXException {
Class colType = tuple.columnType(column);
if (colType == Integer.TYPE) {
tuple.fill(column, meta.getIntValue(VALUE_INT));
} else if (colType == Short.TYPE) {
tuple.fill(column, meta.getShortValue(VALUE_SHORT));
} else if (colType == Long.TYPE) {
tuple.fill(column, meta.getLongValue(VALUE_LONG));
} else if (colType == Float.TYPE) {
tuple.fill(column, meta.getFloatValue(VALUE_FLOAT));
} else if (colType == Double.TYPE) {
tuple.fill(column, meta.getDoubleValue(VALUE_DOUBLE));
} else if (colType == Boolean.TYPE) {
tuple.fill(column, meta.getBooleanValue(VALUE_BOOLEAN));
} else if (colType == Byte.TYPE) {
tuple.fill(column, meta.getByteValue(VALUE_BYTE));
} else if (colType == Character.TYPE) {
tuple.fill(column, meta.getCharValue(VALUE_CHAR));
} else if (colType == String.class) {
tuple.fill(column, meta.getStringValue(VALUE_STRING));
} else {
tuple.fill(column, meta.getStringValue(VALUE_STRING)); // fix me!
}
column++;
}
public void handle_entry1d(final org.xml.sax.Attributes atts)
throws SAXException {
handle_entry1d(new AttributesAdapter(atts));
}
public void handle_entry1d(final Attributes meta) throws SAXException {
double value = meta.getDoubleValue(VALUE_X);
double weight = meta.getDoubleValue(WEIGHT, 1);
cloud1d.fill(value, weight);
}
public void handle_entry2d(final org.xml.sax.Attributes atts)
throws SAXException {
handle_entry2d(new AttributesAdapter(atts));
}
public void handle_entry2d(final Attributes meta) throws SAXException {
double x = meta.getDoubleValue(VALUE_X);
double y = meta.getDoubleValue(VALUE_Y);
double weight = meta.getDoubleValue(WEIGHT, 1);
cloud2d.fill(x, y, weight);
}
public void handle_entry3d(final org.xml.sax.Attributes atts)
throws SAXException {
handle_entry3d(new AttributesAdapter(atts));
}
public void handle_entry3d(final Attributes meta) throws SAXException {
double x = meta.getDoubleValue(VALUE_X);
double y = meta.getDoubleValue(VALUE_Y);
double z = meta.getDoubleValue(VALUE_Z);
double weight = meta.getDoubleValue(WEIGHT, 1);
cloud3d.fill(x, y, z, weight);
}
public void handle_implementation(final org.xml.sax.Attributes atts)
throws SAXException {
handle_implementation(new AttributesAdapter(atts));
}
public void handle_implementation(final Attributes meta)
throws SAXException {
if (DEBUG) {
System.err.println("handle_implementation: " + meta);
}
}
public void handle_item(final org.xml.sax.Attributes atts)
throws SAXException {
handle_item(new AttributesAdapter(atts));
}
public void handle_item(final Attributes meta) throws SAXException {
String key = meta.getStringValue(KEY);
String val = meta.getStringValue(VALUE_STRING);
boolean sticky = meta.getBooleanValue(STICKY, false);
annotation.addItem(key, val, sticky);
}
public void handle_measurement(final org.xml.sax.Attributes atts)
throws SAXException {
handle_measurement(new AttributesAdapter(atts));
}
public void handle_measurement(final Attributes meta) throws SAXException {
IMeasurement m = dataPoint.coordinate(nextCoord++);
m.setValue(meta.getDoubleValue(VALUE_DOUBLE));
if (meta.getType(ERROR_PLUS) >= 0) {
m.setErrorPlus(meta.getDoubleValue(ERROR_PLUS));
}
if (meta.getType(ERROR_MINUS) >= 0) {
m.setErrorMinus(meta.getDoubleValue(ERROR_MINUS));
}
}
public void handle_parameter(final org.xml.sax.Attributes atts)
throws SAXException {
handle_parameter(new AttributesAdapter(atts));
}
public void handle_parameter(final Attributes meta) throws SAXException {
String parName = meta.getStringValue(NAME);
function.setParameter(parName, meta.getDoubleValue(VALUE_DOUBLE));
}
public void handle_range(final org.xml.sax.Attributes atts)
throws SAXException {
handle_range(new AttributesAdapter(atts));
}
public void handle_range(final Attributes meta) throws SAXException {
if (function instanceof IModelFunction) {
IModelFunction model = (IModelFunction) function;
int argIndex = -1;
for (int i = 0; i < model.dimension(); i++) {
if (model.variableName(i).equals(argName)) {
argIndex = i;
break;
}
}
double min = meta.getDoubleValue(MIN);
double max = meta.getDoubleValue(MAX);
model.normalizationRange(argIndex).include(min, max);
}
}
public void handle_statistic(final org.xml.sax.Attributes atts)
throws SAXException {
handle_statistic(new AttributesAdapter(atts));
}
public void handle_statistic(final Attributes meta) throws SAXException {
int dir = directionToInt(meta.getStringValue(DIRECTION, "x"));
mean[dir] = meta.getDoubleValue(MEAN);
rms[dir] = meta.getDoubleValue(RMS);
}
public void start_aida(final org.xml.sax.Attributes atts)
throws SAXException {
start_aida(new AttributesAdapter(atts));
}
public void start_aida(final Attributes meta) throws SAXException {
aidaVersion = meta.getStringValue(VERSION);
aida22 = aidaVersion.startsWith("2.2");
StringTokenizer st = new StringTokenizer(aidaVersion, ".");
int nTokens = st.countTokens();
if (nTokens > 3)
throw new RuntimeException("Illegal version for parsing.");
int majorVersion = Integer.parseInt(st.nextToken());
int revisionVersion = Integer.parseInt(st.nextToken());
int patchVersion = 0;
if (nTokens == 3)
Integer.parseInt(st.nextToken());
beforeAida33 = (majorVersion < 3)
|| (majorVersion == 3 && revisionVersion <= 2);
}
public void start_annotation(final org.xml.sax.Attributes atts)
throws SAXException {
start_annotation(new AttributesAdapter(atts));
}
public void start_annotation(final Attributes meta) throws SAXException {
annotation = new Annotation();
}
public void start_argument(final org.xml.sax.Attributes atts)
throws SAXException {
start_argument(new AttributesAdapter(atts));
}
public void start_argument(final Attributes meta) throws SAXException {
argName = meta.getStringValue(NAME);
}
public void start_arguments(final org.xml.sax.Attributes atts)
throws SAXException {
start_arguments(new AttributesAdapter(atts));
}
public void start_arguments(final Attributes meta) throws SAXException {
}
public void start_axis(final org.xml.sax.Attributes atts)
throws SAXException {
start_axis(new AttributesAdapter(atts));
}
public void start_axis(final Attributes meta) throws SAXException {
binMin = meta.getDoubleValue(MIN);
binMax = meta.getDoubleValue(MAX);
nBins = meta.getIntValue(NUMBER_OF_BINS);
nAxis = directionToInt(meta.getStringValue(DIRECTION, "x"));
binBorders = null;
}
public void start_cloud1d(final org.xml.sax.Attributes atts)
throws SAXException {
start_cloud1d(new AttributesAdapter(atts));
}
public void start_cloud1d(final Attributes meta) throws SAXException {
start_managedObject(meta);
cloud1d = new Cloud1D();
cloud1d.initCloud(meta.getIntValue(MAX_ENTRIES), options);
cloud1d.setName(name);
double uE = meta.getDoubleValue(UPPER_EDGE_X, Double.NaN);
double lE = meta.getDoubleValue(LOWER_EDGE_X, Double.NaN);
if (!Double.isNaN(uE)) {
cloud1d.setUpperEdge(uE);
}
if (!Double.isNaN(lE)) {
cloud1d.setLowerEdge(lE);
}
int conversionBins = meta.getIntValue(CONVERSION_BINS, -1);
if (conversionBins >= 0) {
double le = meta.getDoubleValue(CONVERSION_LOWER_EDGE, Double.NaN);
double ue = meta.getDoubleValue(CONVERSION_UPPER_EDGE, Double.NaN);
cloud1d.setConversionParameters(conversionBins, le, ue);
}
}
public void start_cloud2d(final org.xml.sax.Attributes atts)
throws SAXException {
start_cloud2d(new AttributesAdapter(atts));
}
public void start_cloud2d(final Attributes meta) throws SAXException {
start_managedObject(meta);
cloud2d = new Cloud2D();
cloud2d.initCloud(meta.getIntValue(MAX_ENTRIES), options);
cloud2d.setName(name);
double uE = meta.getDoubleValue(UPPER_EDGE_X, Double.NaN);
double lE = meta.getDoubleValue(LOWER_EDGE_X, Double.NaN);
if (!Double.isNaN(uE)) {
cloud2d.setUpperEdgeX(uE);
}
if (!Double.isNaN(lE)) {
cloud2d.setLowerEdgeX(lE);
}
uE = meta.getDoubleValue(UPPER_EDGE_Y, Double.NaN);
lE = meta.getDoubleValue(LOWER_EDGE_Y, Double.NaN);
if (!Double.isNaN(uE)) {
cloud2d.setUpperEdgeY(uE);
}
if (!Double.isNaN(lE)) {
cloud2d.setLowerEdgeY(lE);
}
int conversionBinsX = meta.getIntValue(CONVERSION_BINS_X, -1);
int conversionBinsY = meta.getIntValue(CONVERSION_BINS_Y, -1);
if (conversionBinsX >= 0 && conversionBinsY >= 0) {
double lex = meta.getDoubleValue(CONVERSION_LOWER_EDGE_X,
Double.NaN);
double uex = meta.getDoubleValue(CONVERSION_UPPER_EDGE_X,
Double.NaN);
double ley = meta.getDoubleValue(CONVERSION_LOWER_EDGE_Y,
Double.NaN);
double uey = meta.getDoubleValue(CONVERSION_UPPER_EDGE_Y,
Double.NaN);
cloud2d.setConversionParameters(conversionBinsX, lex, uex,
conversionBinsY, ley, uey);
}
}
public void start_cloud3d(final org.xml.sax.Attributes atts)
throws SAXException {
start_cloud3d(new AttributesAdapter(atts));
}
public void start_cloud3d(final Attributes meta) throws SAXException {
start_managedObject(meta);
cloud3d = new Cloud3D();
cloud3d.initCloud(meta.getIntValue(MAX_ENTRIES), options);
cloud3d.setName(name);
double uE = meta.getDoubleValue(UPPER_EDGE_X, Double.NaN);
double lE = meta.getDoubleValue(LOWER_EDGE_X, Double.NaN);
if (!Double.isNaN(uE)) {
cloud3d.setUpperEdgeX(uE);
}
if (!Double.isNaN(lE)) {
cloud3d.setLowerEdgeX(lE);
}
uE = meta.getDoubleValue(UPPER_EDGE_Y, Double.NaN);
lE = meta.getDoubleValue(LOWER_EDGE_Y, Double.NaN);
if (!Double.isNaN(uE)) {
cloud3d.setUpperEdgeY(uE);
}
if (!Double.isNaN(lE)) {
cloud3d.setLowerEdgeY(lE);
}
uE = meta.getDoubleValue(UPPER_EDGE_Z, Double.NaN);
lE = meta.getDoubleValue(LOWER_EDGE_Z, Double.NaN);
if (!Double.isNaN(uE)) {
cloud3d.setUpperEdgeZ(uE);
}
if (!Double.isNaN(lE)) {
cloud3d.setLowerEdgeZ(lE);
}
int conversionBinsX = meta.getIntValue(CONVERSION_BINS_X, -1);
int conversionBinsY = meta.getIntValue(CONVERSION_BINS_Y, -1);
int conversionBinsZ = meta.getIntValue(CONVERSION_BINS_Z, -1);
if (conversionBinsX >= 0 && conversionBinsY >= 0
&& conversionBinsZ >= 0) {
double lex = meta.getDoubleValue(CONVERSION_LOWER_EDGE_X,
Double.NaN);
double uex = meta.getDoubleValue(CONVERSION_UPPER_EDGE_X,
Double.NaN);
double ley = meta.getDoubleValue(CONVERSION_LOWER_EDGE_Y,
Double.NaN);
double uey = meta.getDoubleValue(CONVERSION_UPPER_EDGE_Y,
Double.NaN);
double lez = meta.getDoubleValue(CONVERSION_LOWER_EDGE_Z,
Double.NaN);
double uez = meta.getDoubleValue(CONVERSION_UPPER_EDGE_Z,
Double.NaN);
cloud3d.setConversionParameters(conversionBinsX, lex, uex,
conversionBinsY, ley, uey, conversionBinsZ, lez, uez);
}
}
public void start_columns(final org.xml.sax.Attributes atts)
throws SAXException {
start_columns(new AttributesAdapter(atts));
}
public void start_columns(final Attributes meta) throws SAXException {
}
public void start_data1d(final org.xml.sax.Attributes atts)
throws SAXException {
start_data1d(new AttributesAdapter(atts));
}
public void start_data1d(final Attributes meta) throws SAXException {
int xBins = axes[0].bins() + 2;
heights1d = new double[xBins];
errors1d = new double[xBins];
entries1d = new int[xBins];
means1d = new double[xBins];
rmss1d = new double[xBins];
hasBinMeanAndRms = true;
}
public void start_data2d(final org.xml.sax.Attributes atts)
throws SAXException {
start_data2d(new AttributesAdapter(atts));
}
public void start_data2d(final Attributes meta) throws SAXException {
int xBins = axes[0].bins() + 2;
int yBins = axes[1].bins() + 2;
heights2d = new double[xBins][yBins];
errors2d = new double[xBins][yBins];
entries2d = new int[xBins][yBins];
meansx2d = new double[xBins][yBins];
rmssx2d = new double[xBins][yBins];
meansy2d = new double[xBins][yBins];
rmssy2d = new double[xBins][yBins];
hasBinMeanAndRms = true;
}
public void start_data3d(final org.xml.sax.Attributes atts)
throws SAXException {
start_data3d(new AttributesAdapter(atts));
}
public void start_data3d(final Attributes meta) throws SAXException {
int xBins = axes[0].bins() + 2;
int yBins = axes[1].bins() + 2;
int zBins = axes[2].bins() + 2;
heights3d = new double[xBins][yBins][zBins];
errors3d = new double[xBins][yBins][zBins];
entries3d = new int[xBins][yBins][zBins];
meansx3d = new double[xBins][yBins][zBins];
rmssx3d = new double[xBins][yBins][zBins];
meansy3d = new double[xBins][yBins][zBins];
rmssy3d = new double[xBins][yBins][zBins];
meansz3d = new double[xBins][yBins][zBins];
rmssz3d = new double[xBins][yBins][zBins];
hasBinMeanAndRms = true;
}
public void start_dataPoint(final org.xml.sax.Attributes atts)
throws SAXException {
start_dataPoint(new AttributesAdapter(atts));
}
public void start_dataPoint(final Attributes meta) throws SAXException {
dataPointSet.addPoint();
dataPoint = dataPointSet.point(dataPointSet.size() - 1);
nextCoord = 0;
}
public void start_dataPointSet(final org.xml.sax.Attributes atts)
throws SAXException {
start_dataPointSet(new AttributesAdapter(atts));
}
public void start_dataPointSet(final Attributes meta) throws SAXException {
start_managedObject(meta);
int dim = meta.getIntValue(DIMENSION);
dataPointSet = new DataPointSet(name, title, dim);
}
public void start_entries1d(final org.xml.sax.Attributes atts)
throws SAXException {
start_entries1d(new AttributesAdapter(atts));
}
public void start_entries1d(final Attributes meta) throws SAXException {
}
public void start_entries2d(final org.xml.sax.Attributes atts)
throws SAXException {
start_entries2d(new AttributesAdapter(atts));
}
public void start_entries2d(final Attributes meta) throws SAXException {
if (DEBUG) {
System.err.println("start_entries2d: " + meta);
}
}
public void start_entries3d(final org.xml.sax.Attributes atts)
throws SAXException {
start_entries3d(new AttributesAdapter(atts));
}
public void start_entries3d(final Attributes meta) throws SAXException {
if (DEBUG) {
System.err.println("start_entries3d: " + meta);
}
}
public void start_entryITuple(final org.xml.sax.Attributes atts)
throws SAXException {
start_entryITuple(new AttributesAdapter(atts));
}
public void start_entryITuple(final Attributes meta) throws SAXException {
stack.push(new Object[] { tuple, new Integer(column) });
tuple = (Tuple) tuple.getObject(column);
column = 0;
}
public void start_function(final org.xml.sax.Attributes atts)
throws SAXException {
start_function(new AttributesAdapter(atts));
}
public void start_function(final Attributes meta) throws SAXException {
start_managedObject(meta);
isNormalized = meta.getBooleanValue(IS_NORMALIZED);
}
public void start_histogram1d(final org.xml.sax.Attributes atts)
throws SAXException {
start_histogram1d(new AttributesAdapter(atts));
}
public void start_histogram1d(final Attributes meta) throws SAXException {
if (cloud1d != null) {
saveAnnotation = annotation;
saveTitle = title;
saveName = name;
}
start_managedObject(meta);
}
public void start_histogram2d(final org.xml.sax.Attributes atts)
throws SAXException {
start_histogram2d(new AttributesAdapter(atts));
}
public void start_histogram2d(final Attributes meta) throws SAXException {
if (cloud2d != null) {
saveAnnotation = annotation;
saveTitle = title;
saveName = name;
}
start_managedObject(meta);
}
public void start_histogram3d(final org.xml.sax.Attributes atts)
throws SAXException {
start_histogram3d(new AttributesAdapter(atts));
}
public void start_histogram3d(final Attributes meta) throws SAXException {
if (cloud3d != null) {
saveAnnotation = annotation;
saveTitle = title;
saveName = name;
}
start_managedObject(meta);
}
public void start_parameters(final org.xml.sax.Attributes atts)
throws SAXException {
start_parameters(new AttributesAdapter(atts));
}
public void start_parameters(final Attributes meta) throws SAXException {
}
public void start_profile1d(final org.xml.sax.Attributes atts)
throws SAXException {
start_profile1d(new AttributesAdapter(atts));
}
public void start_profile1d(final Attributes meta) throws SAXException {
start_managedObject(meta);
}
public void start_profile2d(final org.xml.sax.Attributes atts)
throws SAXException {
start_profile2d(new AttributesAdapter(atts));
}
public void start_profile2d(final Attributes meta) throws SAXException {
start_managedObject(meta);
}
public void start_row(final org.xml.sax.Attributes atts)
throws SAXException {
start_row(new AttributesAdapter(atts));
}
public void start_row(final Attributes meta) throws SAXException {
column = 0;
}
public void start_rows(final org.xml.sax.Attributes atts)
throws SAXException {
start_rows(new AttributesAdapter(atts));
}
public void start_rows(final Attributes meta) throws SAXException {
if (tupleString.endsWith(","))
tupleString = tupleString.substring(0, tupleString.length() - 1);
tuple = new Tuple(name, title, tupleString, options);
}
public void start_statistics(final org.xml.sax.Attributes atts)
throws SAXException {
start_statistics(new AttributesAdapter(atts));
}
public void start_statistics(final Attributes meta) throws SAXException {
if (DEBUG) {
System.err.println("start_statistics: " + meta);
}
}
public void start_tuple(final org.xml.sax.Attributes atts)
throws SAXException {
start_tuple(new AttributesAdapter(atts));
}
public void start_tuple(final Attributes meta) throws SAXException {
start_managedObject(meta);
tupleString = "";
}
private void add(String path, IManagedObject obj) {
if (path == null) {
path = "/";
if (markAsFilled) tree.hasBeenFilled("/");
} else {
tree.mkdirs(path);
StringTokenizer st = new StringTokenizer(path, "/");
String currentpath = "/";
if (st.countTokens() > 0) {
while (st.hasMoreTokens()) {
String token = st.nextToken();
currentpath += token + "/";
if (markAsFilled) {
tree.hasBeenFilled(currentpath);
if (obj instanceof Folder)
tree.hasBeenFilled(currentpath + obj.name());
}
}
}
}
tree.add(path, obj);
}
private int getBinNum(int bin, int nBins) {
switch (bin) {
case -2:
return 0;
case -1:
return nBins + 1;
default:
return bin + 1;
}
}
public void start_managedObject(final org.xml.sax.Attributes atts)
throws SAXException {
start_managedObject(new AttributesAdapter(atts));
}
private void start_managedObject(final Attributes meta) throws SAXException {
name = meta.getStringValue(NAME);
title = meta.getStringValue(aida22 ? LABEL : TITLE);
path = meta.getStringValue(PATH);
options = meta.getStringValue(OPTIONS);
}
private int directionToInt(String direction) {
if (direction.equals("x")) return 0;
if (direction.equals("y")) return 1;
if (direction.equals("z")) return 2;
return 0;
}
private class AttributesAdapter implements Attributes {
private org.xml.sax.Attributes atts;
public AttributesAdapter(org.xml.sax.Attributes atts) {
this.atts = atts;
}
public int[] getTags() {
int[] tags = new int[atts.getLength()];
for (int i=0; i<tags.length; i++) {
tags[i] = AidaWBXMLLookup.getAttribute(atts.getQName(i));
}
return tags;
}
public int getType(int tag) {
return atts.getValue(getAttributeName(tag)) == null ? -1 : AidaWBXMLLookup.getAttributeType(tag);
}
private String getAttributeName(int tag) {
switch (tag) {
case AidaWBXML.VALUE_BOOLEAN:
case AidaWBXML.VALUE_BYTE:
case AidaWBXML.VALUE_CHAR:
case AidaWBXML.VALUE_DOUBLE:
case AidaWBXML.VALUE_FLOAT:
case AidaWBXML.VALUE_INT:
case AidaWBXML.VALUE_LONG:
case AidaWBXML.VALUE_SHORT:
case AidaWBXML.VALUE_STRING:
return "value";
default:
return AidaWBXMLLookup.getAttributeName(tag);
}
}
public String getStringValue(int tag, String def) {
String val = atts.getValue(getAttributeName(tag));
return val != null ? val : def;
}
public double getDoubleValue(int tag, double def) {
String val = atts.getValue(getAttributeName(tag));
return val != null ? AidaWBXMLConverter.toDouble(-1, tag, val) : def;
}
public float getFloatValue(int tag, float def) {
return (float) getDoubleValue(tag, def);
}
public long getLongValue(int tag, long def) {
String val = atts.getValue(getAttributeName(tag));
return val != null ? Long.parseLong(val) : def;
}
public int getIntValue(int tag, int def) {
String val = atts.getValue(getAttributeName(tag));
return val != null ? AidaWBXMLConverter.toInt(-1, tag, val) : def;
}
public short getShortValue(int tag, short def) {
String val = atts.getValue(getAttributeName(tag));
return val != null ? Short.parseShort(val) : def;
}
public char getCharValue(int tag, char def) {
String val = atts.getValue(getAttributeName(tag));
return val != null ? val.charAt(0) : def;
}
public byte getByteValue(int tag, byte def) {
String val = atts.getValue(getAttributeName(tag));
return val != null ? Byte.parseByte(val) : def;
}
public boolean getBooleanValue(int tag, boolean def) {
String val = atts.getValue(getAttributeName(tag));
return val != null ? AidaWBXMLConverter.toBoolean(-1, tag, val) : def;
}
public boolean getBooleanValue(int tag) {
return AidaWBXMLConverter.toBoolean(-1, tag, atts
.getValue(getAttributeName(tag)));
}
public boolean[] getBooleanArray(int tag) {
// FIXME
throw new NumberFormatException();
}
public byte getByteValue(int tag) {
return Byte.parseByte(atts.getValue(getAttributeName(tag)));
}
public byte[] getByteArray(int tag) {
// FIXME
throw new NumberFormatException();
}
public char getCharValue(int tag) {
return atts.getValue(getAttributeName(tag)).charAt(0);
}
public char[] getCharArray(int tag) {
// FIXME
throw new NumberFormatException();
}
public double getDoubleValue(int tag) {
return AidaWBXMLConverter.toDouble(-1, tag, atts
.getValue(getAttributeName(tag)));
}
public double[] getDoubleArray(int tag) {
// FIXME
throw new NumberFormatException();
}
public float getFloatValue(int tag) {
return (float) getDoubleValue(tag);
}
public float[] getFloatArray(int tag) {
// FIXME
throw new NumberFormatException();
}
public int getIntValue(int tag) {
return AidaWBXMLConverter.toInt(-1, tag, atts
.getValue(getAttributeName(tag)));
}
public int[] getIntArray(int tag) {
// FIXME
throw new NumberFormatException();
}
public long getLongValue(int tag) {
return Long.parseLong(atts.getValue(getAttributeName(tag)));
}
public long[] getLongArray(int tag) {
// FIXME
throw new NumberFormatException();
}
public short getShortValue(int tag) {
return Short.parseShort(atts.getValue(getAttributeName(tag)));
}
public short[] getShortArray(int tag) {
// FIXME
throw new NumberFormatException();
}
public String getStringValue(int tag) {
return atts.getValue(getAttributeName(tag));
}
public String[] getStringArray(int tag) {
// FIXME
throw new NumberFormatException();
}
};
}