/*
* FunctionUtils.java
*
* Created on February 18, 2004, 1:53 PM
*/
package hep.aida.ref.function;
import hep.aida.IFunction;
import hep.aida.IHistogram1D;
import hep.aida.IHistogram2D;
import hep.aida.IHistogram3D;
import java.util.Random;
/**
*
* @author serbo
*/
public abstract class FunctionUtils {
private static Random r = new Random();
public static void setRandomSeed(long seed) { r.setSeed(seed); }
/**
* Fills IHistogram1D with random entries according to the
* provided distribution.
*
* @param hist Histogram to be filled
* @param func
* @param entries How many entries to put in the Histogram
* @param yMax Maximum value the function can take on the
* range. This does not have to be the exact value,
* just make sure that function never takes value
* bigger than yMax.
*/
public static void fill(IHistogram1D hist, IFunction func, int entries, double yMax) {
double lowerEdge = hist.axis().lowerEdge();
double upperEdge = hist.axis().upperEdge();
double[] vars = new double[1];
int count = 0;
while ( count < entries ) {
vars[0] = lowerEdge + r.nextDouble()*(upperEdge-lowerEdge);
double y = r.nextDouble()*yMax;
double f = func.value(vars);
if ( y < f ) {
count++;
hist.fill(vars[0]);
}
}
}
public static void fill(IHistogram2D hist, IFunction func, int entries, double yMax) {
double lowerEdgeX = hist.xAxis().lowerEdge();
double upperEdgeX = hist.xAxis().upperEdge();
double lowerEdgeY = hist.yAxis().lowerEdge();
double upperEdgeY = hist.yAxis().upperEdge();
double[] vars = new double[2];
int count = 0;
while ( count < entries ) {
vars[0] = lowerEdgeX + r.nextDouble()*(upperEdgeX-lowerEdgeX);
vars[1] = lowerEdgeY + r.nextDouble()*(upperEdgeY-lowerEdgeY);
double y = r.nextDouble()*yMax;
double f = func.value(vars);
if ( y < f ) {
count++;
hist.fill(vars[0], vars[1]);
}
}
}
public static void fill(IHistogram3D hist, IFunction func, int entries, double yMax) {
double lowerEdgeX = hist.xAxis().lowerEdge();
double upperEdgeX = hist.xAxis().upperEdge();
double lowerEdgeY = hist.yAxis().lowerEdge();
double upperEdgeY = hist.yAxis().upperEdge();
double lowerEdgeZ = hist.zAxis().lowerEdge();
double upperEdgeZ = hist.zAxis().upperEdge();
double[] vars = new double[3];
int count = 0;
while ( count < entries ) {
vars[0] = lowerEdgeX + r.nextDouble()*(upperEdgeX-lowerEdgeX);
vars[1] = lowerEdgeY + r.nextDouble()*(upperEdgeY-lowerEdgeY);
vars[2] = lowerEdgeZ + r.nextDouble()*(upperEdgeZ-lowerEdgeZ);
double y = r.nextDouble()*yMax;
double f = func.value(vars);
if ( y < f ) {
count++;
hist.fill(vars[0], vars[1], vars[3]);
}
}
}
}