package hep.aida.ref.histogram;
import hep.aida.ICloud1D;
import hep.aida.ICloud2D;
import hep.aida.ICloud3D;
import hep.aida.IHistogram1D;
import hep.aida.IHistogram2D;
import hep.aida.IHistogram3D;
import hep.aida.IManagedObject;
/**
*
* @author The FreeHEP team @ SLAC.
*
*/
public abstract class HistUtils {
private static double defaultLowerEdge = -1;
private static double defaultUpperEdge = 1;
/**
* Create an IHistogram1D and fill it from an ICloud1D.
*
*/
public static IHistogram1D toShowableHistogram(ICloud1D cloud, int nBins, double lowerEdge, double upperEdge) {
String name = "";
if ( cloud instanceof IManagedObject )
name = ( (IManagedObject) cloud ).name();
if ( Double.isNaN(lowerEdge) )
lowerEdge = defaultLowerEdge;
if ( Double.isNaN(upperEdge) )
upperEdge = defaultUpperEdge;
if ( upperEdge == lowerEdge )
upperEdge = lowerEdge + 1;
IHistogram1D hist = new Histogram1D(name,cloud.title(),new FixedAxis(nBins,lowerEdge,upperEdge));
for(int i=0; i<cloud.entries(); i++) hist.fill( cloud.value(i), cloud.weight(i) );
return hist;
}
/**
* Create an IHistogram2D and fill it from an ICloud2D.
*
*/
public static IHistogram2D toShowableHistogram(ICloud2D cloud, int nBinsX, double lowerEdgeX, double upperEdgeX,
int nBinsY, double lowerEdgeY, double upperEdgeY) {
String name = "";
if ( cloud instanceof IManagedObject )
name = ( (IManagedObject) cloud ).name();
if ( Double.isNaN(lowerEdgeX) )
lowerEdgeX = defaultLowerEdge;
if ( Double.isNaN(upperEdgeX) )
upperEdgeX = defaultUpperEdge;
if ( Double.isNaN(lowerEdgeY) )
lowerEdgeY = defaultLowerEdge;
if ( Double.isNaN(upperEdgeY) )
upperEdgeY = defaultUpperEdge;
if ( upperEdgeX == lowerEdgeX )
upperEdgeX = lowerEdgeX + 1;
if ( upperEdgeY == lowerEdgeY )
upperEdgeY = lowerEdgeY + 1;
IHistogram2D hist = new Histogram2D(name,cloud.title(),new FixedAxis(nBinsX,lowerEdgeX,upperEdgeX),new FixedAxis(nBinsY,lowerEdgeY,upperEdgeY));
for(int i=0; i<cloud.entries(); i++) hist.fill( cloud.valueX(i), cloud.valueY(i), cloud.weight(i) );
return hist;
}
/**
* Create an IHistogram3D and fill it from an ICloud3D.
*
*/
public static IHistogram3D toShowableHistogram(ICloud3D cloud, int nBinsX, double lowerEdgeX, double upperEdgeX,
int nBinsY, double lowerEdgeY, double upperEdgeY,
int nBinsZ, double lowerEdgeZ, double upperEdgeZ) {
String name = "";
if ( cloud instanceof IManagedObject )
name = ( (IManagedObject) cloud ).name();
if ( Double.isNaN(lowerEdgeX) )
lowerEdgeX = defaultLowerEdge;
if ( Double.isNaN(upperEdgeX) )
upperEdgeX = defaultUpperEdge;
if ( Double.isNaN(lowerEdgeY) )
lowerEdgeY = defaultLowerEdge;
if ( Double.isNaN(upperEdgeY) )
upperEdgeY = defaultUpperEdge;
if ( Double.isNaN(lowerEdgeZ) )
lowerEdgeZ = defaultLowerEdge;
if ( Double.isNaN(upperEdgeZ) )
upperEdgeZ = defaultUpperEdge;
if ( upperEdgeX == lowerEdgeX )
upperEdgeX = lowerEdgeX + 1;
if ( upperEdgeY == lowerEdgeY )
upperEdgeY = lowerEdgeY + 1;
if ( upperEdgeZ == lowerEdgeZ )
upperEdgeZ = lowerEdgeZ + 1;
IHistogram3D hist = new Histogram3D(name, cloud.title(),
new FixedAxis(nBinsX,lowerEdgeX,upperEdgeX),
new FixedAxis(nBinsY,lowerEdgeY,upperEdgeY),
new FixedAxis(nBinsZ,lowerEdgeZ,upperEdgeZ));
for(int i=0; i<cloud.entries(); i++) hist.fill( cloud.valueX(i), cloud.valueY(i), cloud.valueZ(i), cloud.weight(i) );
return hist;
}
public static double histogramNormalization(IHistogram1D h1) {
return h1.sumBinHeights()*(h1.axis().upperEdge()-h1.axis().lowerEdge())/h1.axis().bins();
}
public static boolean isValidDouble(double d) {
if ( Double.isNaN(d) )
return false;
if ( Double.isInfinite(d) )
return false;
return true;
}
}