package hep.aida.ref;
import hep.aida.IAxis;
import hep.aida.IHistogram1D;
import hep.aida.IHistogram2D;
import hep.aida.IHistogram3D;
/**
* Histogram conversions, for example to String and XML format;
* This class requires the Colt distribution, whereas the rest of the package is entirelly stand-alone.
*/
public class Converter
{
/**
* Creates a new histogram converter.
*/
public Converter() {}
/**
* Returns all edges of the given axis.
*/
public double[] edges(IAxis axis)
{
int b = axis.bins();
double[] bounds = new double[b+1];
for (int i=0; i<b; i++) bounds[i]=axis.binLowerEdge(i);
bounds[b]=axis.upperEdge();
return bounds;
}
String form(cern.colt.matrix.impl.Former formatter, double value)
{
return formatter.form(value);
}
/**
* Returns an array[h.xAxis().bins()]; ignoring extra bins.
*/
protected double[] toArrayErrors(IHistogram1D h)
{
int xBins = h.xAxis().bins();
double[] array = new double[xBins];
for (int j=xBins; --j >= 0; ) {
array[j] = h.binError(j);
}
return array;
}
/**
* Returns an array[h.xAxis().bins()][h.yAxis().bins()]; ignoring extra bins.
*/
protected double[][] toArrayErrors(IHistogram2D h)
{
int xBins = h.xAxis().bins();
int yBins = h.yAxis().bins();
double[][] array = new double[xBins][yBins];
for (int i=yBins; --i >= 0; ) {
for (int j=xBins; --j >= 0; ) {
array[j][i] = h.binError(j,i);
}
}
return array;
}
/**
* Returns an array[h.xAxis().bins()]; ignoring extra bins.
*/
protected double[] toArrayHeights(IHistogram1D h)
{
int xBins = h.xAxis().bins();
double[] array = new double[xBins];
for (int j=xBins; --j >= 0; ) {
array[j] = h.binHeight(j);
}
return array;
}
/**
* Returns an array[h.xAxis().bins()][h.yAxis().bins()]; ignoring extra bins.
*/
protected double[][] toArrayHeights(IHistogram2D h)
{
int xBins = h.xAxis().bins();
int yBins = h.yAxis().bins();
double[][] array = new double[xBins][yBins];
for (int i=yBins; --i >= 0; ) {
for (int j=xBins; --j >= 0; ) {
array[j][i] = h.binHeight(j,i);
}
}
return array;
}
/**
* Returns an array[h.xAxis().bins()][h.yAxis().bins()][h.zAxis().bins()]; ignoring extra bins.
*/
protected double[][][] toArrayHeights(IHistogram3D h)
{
int xBins = h.xAxis().bins();
int yBins = h.yAxis().bins();
int zBins = h.zAxis().bins();
double[][][] array = new double[xBins][yBins][zBins];
for (int j=xBins; --j >= 0; ) {
for (int i=yBins; --i >= 0; ) {
for (int k=zBins; --k >= 0; ) {
array[j][i][k] = h.binHeight(j,i,k);
}
}
}
return array;
}
/**
* Returns a string representation of the specified array. The string
* representation consists of a list of the arrays's elements, enclosed in square brackets
* (<tt>"[]"</tt>). Adjacent elements are separated by the characters
* <tt>", "</tt> (comma and space).
* @return a string representation of the specified array.
*/
protected static String toString(double[] array) {
StringBuffer buf = new StringBuffer();
buf.append("[");
int maxIndex = array.length - 1;
for (int i = 0; i <= maxIndex; i++) {
buf.append(array[i]);
if (i < maxIndex)
buf.append(", ");
}
buf.append("]");
return buf.toString();
}
/**
* Returns a string representation of the given argument.
*/
public String toString(IAxis axis)
{
StringBuffer buf = new StringBuffer();
buf.append("Range: ["+axis.lowerEdge()+","+axis.upperEdge()+")");
buf.append(", Bins: "+axis.bins());
buf.append(", Bin edges: "+toString(edges(axis))+"\n");
return buf.toString();
}
/**
* Returns a string representation of the given argument.
*/
public String toString(IHistogram1D h)
{
String columnAxisName = null; //"X";
String rowAxisName = null;
hep.aida.bin.BinFunction1D[] aggr = null; //{hep.aida.bin.BinFunctions1D.sum};
String format = "%G";
//String format = "%1.2G";
cern.colt.matrix.impl.Former f = new cern.colt.matrix.impl.FormerFactory().create(format);
String sep = System.getProperty("line.separator");
int[] minMaxBins = h.minMaxBins();
String title = h.title() + ":" + sep +
" Entries="+form(f,h.entries()) + ", ExtraEntries="+form(f,h.extraEntries()) + sep +
" Mean=" +form(f,h.mean()) + ", Rms="+form(f,h.rms()) + sep +
" MinBinHeight=" +form(f,h.binHeight(minMaxBins[0])) + ", MaxBinHeight="+form(f,h.binHeight(minMaxBins[1])) + sep +
" Axis: " +
"Bins="+form(f,h.xAxis().bins()) +
", Min="+form(f,h.xAxis().lowerEdge()) +
", Max="+form(f,h.xAxis().upperEdge());
String[] xEdges = new String[h.xAxis().bins()];
for (int i=0; i<h.xAxis().bins(); i++) xEdges[i]=form(f,h.xAxis().binLowerEdge(i));
String[] yEdges = null;
cern.colt.matrix.DoubleMatrix2D heights = new cern.colt.matrix.impl.DenseDoubleMatrix2D(1,h.xAxis().bins());
heights.viewRow(0).assign(toArrayHeights(h));
//cern.colt.matrix.DoubleMatrix2D errors = new cern.colt.matrix.impl.DenseDoubleMatrix2D(1,h.xAxis().bins());
//errors.viewRow(0).assign(toArrayErrors(h));
return title + sep +
"Heights:" + sep +
new cern.colt.matrix.doublealgo.Formatter().toTitleString(
heights,yEdges,xEdges,rowAxisName,columnAxisName,null,aggr);
/*
+ sep +
"Errors:" + sep +
new cern.colt.matrix.doublealgo.Formatter().toTitleString(
errors,yEdges,xEdges,rowAxisName,columnAxisName,null,aggr);
*/
}
/**
* Returns a string representation of the given argument.
*/
public String toString(IHistogram2D h)
{
String columnAxisName = "X";
String rowAxisName = "Y";
hep.aida.bin.BinFunction1D[] aggr = {hep.aida.bin.BinFunctions1D.sum};
String format = "%G";
//String format = "%1.2G";
cern.colt.matrix.impl.Former f = new cern.colt.matrix.impl.FormerFactory().create(format);
String sep = System.getProperty("line.separator");
int[] minMaxBins = h.minMaxBins();
String title = h.title() + ":" + sep +
" Entries="+form(f,h.entries()) + ", ExtraEntries="+form(f,h.extraEntries()) + sep +
" MeanX=" +form(f,h.meanX()) + ", RmsX="+form(f,h.rmsX()) + sep +
" MeanY=" +form(f,h.meanY()) + ", RmsY="+form(f,h.rmsX()) + sep +
" MinBinHeight=" +form(f,h.binHeight(minMaxBins[0],minMaxBins[1])) + ", MaxBinHeight="+form(f,h.binHeight(minMaxBins[2],minMaxBins[3])) + sep +
" xAxis: " +
"Bins="+form(f,h.xAxis().bins()) +
", Min="+form(f,h.xAxis().lowerEdge()) +
", Max="+form(f,h.xAxis().upperEdge()) + sep +
" yAxis: " +
"Bins="+form(f,h.yAxis().bins()) +
", Min="+form(f,h.yAxis().lowerEdge()) +
", Max="+form(f,h.yAxis().upperEdge());
String[] xEdges = new String[h.xAxis().bins()];
for (int i=0; i<h.xAxis().bins(); i++) xEdges[i]=form(f,h.xAxis().binLowerEdge(i));
String[] yEdges = new String[h.yAxis().bins()];
for (int i=0; i<h.yAxis().bins(); i++) yEdges[i]=form(f,h.yAxis().binLowerEdge(i));
new cern.colt.list.ObjectArrayList(yEdges).reverse(); // keep coord. system
cern.colt.matrix.DoubleMatrix2D heights = new cern.colt.matrix.impl.DenseDoubleMatrix2D(toArrayHeights(h));
heights = heights.viewDice().viewRowFlip(); // keep the histo coord. system
//heights = heights.viewPart(1,1,heights.rows()-2,heights.columns()-2); // ignore under&overflows
//cern.colt.matrix.DoubleMatrix2D errors = new cern.colt.matrix.impl.DenseDoubleMatrix2D(toArrayErrors(h));
//errors = errors.viewDice().viewRowFlip(); // keep the histo coord system
////errors = errors.viewPart(1,1,errors.rows()-2,errors.columns()-2); // ignore under&overflows
return title + sep +
"Heights:" + sep +
new cern.colt.matrix.doublealgo.Formatter().toTitleString(
heights,yEdges,xEdges,rowAxisName,columnAxisName,null,aggr);
/*
+ sep +
"Errors:" + sep +
new cern.colt.matrix.doublealgo.Formatter().toTitleString(
errors,yEdges,xEdges,rowAxisName,columnAxisName,null,aggr);
*/
}
/**
* Returns a string representation of the given argument.
*/
public String toString(IHistogram3D h)
{
String columnAxisName = "X";
String rowAxisName = "Y";
String sliceAxisName = "Z";
hep.aida.bin.BinFunction1D[] aggr = {hep.aida.bin.BinFunctions1D.sum};
String format = "%G";
//String format = "%1.2G";
cern.colt.matrix.impl.Former f = new cern.colt.matrix.impl.FormerFactory().create(format);
String sep = System.getProperty("line.separator");
int[] minMaxBins = h.minMaxBins();
String title = h.title() + ":" + sep +
" Entries="+form(f,h.entries()) + ", ExtraEntries="+form(f,h.extraEntries()) + sep +
" MeanX=" +form(f,h.meanX()) + ", RmsX="+form(f,h.rmsX()) + sep +
" MeanY=" +form(f,h.meanY()) + ", RmsY="+form(f,h.rmsX()) + sep +
" MeanZ=" +form(f,h.meanZ()) + ", RmsZ="+form(f,h.rmsZ()) + sep +
" MinBinHeight=" +form(f,h.binHeight(minMaxBins[0],minMaxBins[1],minMaxBins[2])) + ", MaxBinHeight="+form(f,h.binHeight(minMaxBins[3],minMaxBins[4],minMaxBins[5])) + sep +
" xAxis: " +
"Bins="+form(f,h.xAxis().bins()) +
", Min="+form(f,h.xAxis().lowerEdge()) +
", Max="+form(f,h.xAxis().upperEdge()) + sep +
" yAxis: " +
"Bins="+form(f,h.yAxis().bins()) +
", Min="+form(f,h.yAxis().lowerEdge()) +
", Max="+form(f,h.yAxis().upperEdge()) + sep +
" zAxis: " +
"Bins="+form(f,h.zAxis().bins()) +
", Min="+form(f,h.zAxis().lowerEdge()) +
", Max="+form(f,h.zAxis().upperEdge());
String[] xEdges = new String[h.xAxis().bins()];
for (int i=0; i<h.xAxis().bins(); i++) xEdges[i]=form(f,h.xAxis().binLowerEdge(i));
String[] yEdges = new String[h.yAxis().bins()];
for (int i=0; i<h.yAxis().bins(); i++) yEdges[i]=form(f,h.yAxis().binLowerEdge(i));
new cern.colt.list.ObjectArrayList(yEdges).reverse(); // keep coord. system
String[] zEdges = new String[h.zAxis().bins()];
for (int i=0; i<h.zAxis().bins(); i++) zEdges[i]=form(f,h.zAxis().binLowerEdge(i));
new cern.colt.list.ObjectArrayList(zEdges).reverse(); // keep coord. system
cern.colt.matrix.DoubleMatrix3D heights = new cern.colt.matrix.impl.DenseDoubleMatrix3D(toArrayHeights(h));
heights = heights.viewDice(2,1,0).viewSliceFlip().viewRowFlip(); // keep the histo coord. system
//heights = heights.viewPart(1,1,heights.rows()-2,heights.columns()-2); // ignore under&overflows
//cern.colt.matrix.DoubleMatrix2D errors = new cern.colt.matrix.impl.DenseDoubleMatrix2D(toArrayErrors(h));
//errors = errors.viewDice().viewRowFlip(); // keep the histo coord system
////errors = errors.viewPart(1,1,errors.rows()-2,errors.columns()-2); // ignore under&overflows
return title + sep +
"Heights:" + sep +
new cern.colt.matrix.doublealgo.Formatter().toTitleString(
heights,zEdges,yEdges,xEdges,sliceAxisName,rowAxisName,columnAxisName,"",aggr);
/*
+ sep +
"Errors:" + sep +
new cern.colt.matrix.doublealgo.Formatter().toTitleString(
errors,yEdges,xEdges,rowAxisName,columnAxisName,null,aggr);
*/
}
/**
* Returns a XML representation of the given argument.
*/
public String toXML(IHistogram1D h)
{
StringBuffer buf = new StringBuffer();
String sep = System.getProperty("line.separator");
buf.append("<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>"); buf.append(sep);
buf.append("<!DOCTYPE plotML SYSTEM \"plotML.dtd\">"); buf.append(sep);
buf.append("<plotML>"); buf.append(sep);
buf.append("<plot>"); buf.append(sep);
buf.append("<dataArea>"); buf.append(sep);
buf.append("<data1d>"); buf.append(sep);
buf.append("<bins1d title=\""+h.title()+"\">"); buf.append(sep);
for (int i=0; i<h.xAxis().bins(); i++)
{
buf.append(h.binEntries(i)+","+h.binError(i)); buf.append(sep);
}
buf.append("</bins1d>"); buf.append(sep);
buf.append("<binnedDataAxisAttributes type=\"double\" axis=\"x0\"");
buf.append(" min=\""+h.xAxis().lowerEdge()+"\"");
buf.append(" max=\""+h.xAxis().upperEdge()+"\"");
buf.append(" numberOfBins=\""+h.xAxis().bins()+"\"");
buf.append("/>"); buf.append(sep);
buf.append("<statistics>"); buf.append(sep);
buf.append("<statistic name=\"Entries\" value=\""+h.entries()+"\"/>"); buf.append(sep);
buf.append("<statistic name=\"Underflow\" value=\""+h.binEntries(h.UNDERFLOW)+"\"/>"); buf.append(sep);
buf.append("<statistic name=\"Overflow\" value=\""+h.binEntries(h.OVERFLOW)+"\"/>"); buf.append(sep);
if (!Double.isNaN(h.mean())) {
buf.append("<statistic name=\"Mean\" value=\""+h.mean()+"\"/>"); buf.append(sep);
}
if (!Double.isNaN(h.rms())) {
buf.append("<statistic name=\"RMS\" value=\""+h.rms()+"\"/>"); buf.append(sep);
}
buf.append("</statistics>"); buf.append(sep);
buf.append("</data1d>"); buf.append(sep);
buf.append("</dataArea>"); buf.append(sep);
buf.append("</plot>"); buf.append(sep);
buf.append("</plotML>"); buf.append(sep);
return buf.toString();
}
/**
* Returns a XML representation of the given argument.
*/
public String toXML(IHistogram2D h)
{
StringBuffer out = new StringBuffer();
String sep = System.getProperty("line.separator");
out.append("<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>"); out.append(sep);
out.append("<!DOCTYPE plotML SYSTEM \"plotML.dtd\">"); out.append(sep);
out.append("<plotML>"); out.append(sep);
out.append("<plot>"); out.append(sep);
out.append("<dataArea>"); out.append(sep);
out.append("<data2d type=\"xxx\">"); out.append(sep);
out.append("<bins2d title=\""+h.title()+"\" xSize=\""+h.xAxis().bins()+"\" ySize=\""+h.yAxis().bins()+"\">"); out.append(sep);
for (int i=0; i<h.xAxis().bins(); i++)
for (int j=0; j<h.yAxis().bins(); j++)
{
out.append(h.binEntries(i,j)+","+h.binError(i,j)); out.append(sep);
}
out.append("</bins2d>"); out.append(sep);
out.append("<binnedDataAxisAttributes type=\"double\" axis=\"x0\"");
out.append(" min=\""+h.xAxis().lowerEdge()+"\"");
out.append(" max=\""+h.xAxis().upperEdge()+"\"");
out.append(" numberOfBins=\""+h.xAxis().bins()+"\"");
out.append("/>"); out.append(sep);
out.append("<binnedDataAxisAttributes type=\"double\" axis=\"y0\"");
out.append(" min=\""+h.yAxis().lowerEdge()+"\"");
out.append(" max=\""+h.yAxis().upperEdge()+"\"");
out.append(" numberOfBins=\""+h.yAxis().bins()+"\"");
out.append("/>"); out.append(sep);
//out.append("<statistics>"); out.append(sep);
//out.append("<statistic name=\"Entries\" value=\""+h.entries()+"\"/>"); out.append(sep);
//out.append("<statistic name=\"MeanX\" value=\""+h.meanX()+"\"/>"); out.append(sep);
//out.append("<statistic name=\"RmsX\" value=\""+h.rmsX()+"\"/>"); out.append(sep);
//out.append("<statistic name=\"MeanY\" value=\""+h.meanY()+"\"/>"); out.append(sep);
//out.append("<statistic name=\"RmsY\" value=\""+h.rmsY()+"\"/>"); out.append(sep);
//out.append("</statistics>"); out.append(sep);
out.append("</data2d>"); out.append(sep);
out.append("</dataArea>"); out.append(sep);
out.append("</plot>"); out.append(sep);
out.append("</plotML>"); out.append(sep);
return out.toString();
}
}