// Copyright FreeHEP, 2001-2007
package hep.aida.ref.xml;
import hep.aida.IAnnotation;
import hep.aida.IAxis;
import hep.aida.ICloud1D;
import hep.aida.ICloud2D;
import hep.aida.ICloud3D;
import hep.aida.IConstants;
import hep.aida.IDataPoint;
import hep.aida.IDataPointSet;
import hep.aida.IFitResult;
import hep.aida.IFitParameterSettings;
import hep.aida.IFunction;
import hep.aida.IHistogram1D;
import hep.aida.IHistogram2D;
import hep.aida.IHistogram3D;
import hep.aida.IManagedObject;
import hep.aida.IMeasurement;
import hep.aida.IModelFunction;
import hep.aida.IProfile1D;
import hep.aida.IProfile2D;
import hep.aida.IRangeSet;
import hep.aida.ITree;
import hep.aida.ITuple;
import hep.aida.ref.AidaUtils;
import hep.aida.ref.Annotation;
import hep.aida.ref.histogram.Cloud;
import hep.aida.ref.histogram.Cloud1D;
import hep.aida.ref.histogram.Cloud2D;
import hep.aida.ref.histogram.Cloud3D;
import hep.aida.ref.histogram.Histogram1D;
import hep.aida.ref.histogram.Histogram2D;
import hep.aida.ref.histogram.Histogram3D;
import hep.aida.ref.histogram.VariableAxis;
import hep.aida.ref.tuple.AbstractTuple;
import hep.aida.ref.tuple.Tuple;
import hep.aida.ref.xml.ascii.AidaAsciiXMLWriter;
import hep.aida.ref.xml.binary.AidaWBXML;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.Writer;
import org.freehep.wbxml.WBXMLTagWriter;
import org.freehep.wbxml.WBXMLWriter;
/**
* Convert AIDA objects to XML (binary or ASCII).
*
* @author tonyj
* @author Mark Donszelmann
* @version $Id: AidaXMLWriter.java 13402 2007-11-02 21:19:21Z serbo $
*/
public class AidaXMLWriter {
protected String[] skip;
protected WBXMLTagWriter xml;
private static final String X = "x";
private static final String Y = "y";
private static final String Z = "z";
public AidaXMLWriter(Writer writer) throws IOException {
this(writer, null);
}
AidaXMLWriter(Writer writer, String[] skip) throws IOException {
xml = new AidaAsciiXMLWriter(writer);
xml.openDoc("1.0", "ISO-8859-1", false);
init(skip);
}
AidaXMLWriter(DataOutputStream dos) throws IOException {
this(dos, null);
}
AidaXMLWriter(DataOutputStream dos, String[] skip) throws IOException {
xml = new WBXMLWriter(dos, AidaWBXML.attributes.length - 1);
xml.openDoc("BinaryAIDA/1.0", "UTF-8", false);
init(skip);
}
private void init(String[] skip) throws IOException {
this.skip = skip;
xml.referToDTD("aida", "http://aida.freehep.org/schemas/"
+ IConstants.AIDA_VERSION + "/aida.dtd");
xml.setAttribute(AidaWBXML.VERSION,
IConstants.AIDA_VERSION);
xml.openTag(AidaWBXML.AIDA);
xml.setAttribute(AidaWBXML.PACKAGE, "FreeHEP");
xml.setAttribute(AidaWBXML.VERSION, "1.1");
xml.printTag(AidaWBXML.IMPLEMENTATION);
}
public void close() throws IOException {
xml.closeTag();
xml.close();
}
void toXML(ITree tree) {
String[] objNames = tree.listObjectNames("/", true);
String[] objTypes = null;
if (skip != null && skip.length > 0)
objTypes = tree.listObjectTypes("/", true);
for (int i = 0; i < objNames.length; i++) {
// Skip directories
if (objNames[i].endsWith("/") && !objNames[i].endsWith("\\/")) {
continue;
}
String dirName = AidaUtils.parseDirName(objNames[i]);
// Skip writing some types to file
if (skip != null && skip.length > 0
&& AidaUtils.findInArray(objTypes[i], skip) >= 0)
continue;
IManagedObject obj = tree.find(objNames[i]);
if (obj instanceof AidaObjectProxy.ObjectProvider)
obj = ((AidaObjectProxy.ObjectProvider) obj).getManagedObject();
toXML(obj, dirName);
}
}
public void toXML(IManagedObject o, String path) {
try {
// Skip writing some types to file
if (o != null && skip != null && skip.length > 0
&& AidaUtils.findInArray(o.type(), skip) >= 0)
return;
if (o instanceof AidaObjectProxy.ObjectProvider)
o = ((AidaObjectProxy.ObjectProvider) o).getManagedObject();
if (o instanceof IHistogram1D) {
toXML((IHistogram1D) o, path);
} else if (o instanceof IHistogram2D) {
toXML((IHistogram2D) o, path);
} else if (o instanceof IHistogram3D) {
toXML((IHistogram3D) o, path);
} else if (o instanceof ICloud1D) {
toXML((ICloud1D) o, path);
} else if (o instanceof ICloud2D) {
toXML((ICloud2D) o, path);
} else if (o instanceof ICloud3D) {
toXML((ICloud3D) o, path);
} else if (o instanceof ITuple) {
toXML((ITuple) o, path);
} else if (o instanceof IDataPointSet) {
toXML((IDataPointSet) o, path);
} else if (o instanceof IProfile1D) {
toXML((IProfile1D) o, path);
} else if (o instanceof IProfile2D) {
toXML((IProfile2D) o, path);
} else if (o instanceof IFunction) {
toXML((IFunction) o, path);
}
// otherwise silently ignore
} catch (IOException e) {
// FIXME: ignored
}
}
// Beginning of the IFitResult
public void toXML(IFitResult f, String path) throws IOException {
if ((path != null) && !path.equals("")) {
xml.setAttribute(AidaWBXML.PATH, path);
}
xml.setAttribute(AidaWBXML.FIT_DIMENSION, f.fittedParameterNames().length);
xml.setAttribute(AidaWBXML.FIT_ENGINE_NAME, f.engineName());
xml.setAttribute(AidaWBXML.FIT_METHOD_NAME, f.fitMethodName());
xml.setAttribute(AidaWBXML.FIT_IS_VALID, f.isValid());
xml.setAttribute(AidaWBXML.FIT_QUALITY, f.quality());
xml.setAttribute(AidaWBXML.FIT_STATUS, f.fitStatus());
xml.setAttribute(AidaWBXML.FIT_DEGREES_OF_FREEDOM, f.ndf());
xml.setAttribute(AidaWBXML.FIT_DATA_DESCRIPTION, f.dataDescription());
xml.openTag(AidaWBXML.FIT_RESULT);
if (f.fittedFunction() != null) toXML(f.fittedFunction(), path);
String[] con = f.constraints();
if (con != null && con.length > 0) writeFitConstrains(con);
String[] names = f.fittedParameterNames();
if (names != null && names.length > 0) {
writeFittedParameters(f);
writeFitCovarianceMatrix(f);
}
xml.closeTag();
}
private void writeFittedParameters(IFitResult f) throws IOException {
String[] names = f.fittedParameterNames();
double[] vals = f.fittedParameters();
double[] ep = f.errorsPlus();
double[] em = f.errorsMinus();
for (int i=0; i
Ads help maintain this website.