// 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.