/* *ExponentialCoreNotNorm .java * * Created on October 5, 2002, 1:14 PM */ package hep.aida.ref.function; import jas.hist.Handle; import java.awt.Cursor; import org.freehep.util.images.ImageHandler; /** * * @author serbo */ /** * Not normalised Gaussian (G) distribution in the form: * f = amplitude*exp(-(x-mean)^2/(2*sigma^2)) has 3 parameters */ public class GaussianCoreNotNorm extends FunctionCore { protected boolean providesNormalization; private final static double fwhm = 2.354/2; public GaussianCoreNotNorm(String str) { super(1, 3, new double[] {1., 0., 1.}); setTitle("GaussianCoreNotNorm::"+str); providesNormalization = false; String[] names = new String[] { "amplitude","mean", "sigma" }; setParameterNames(names); } public GaussianCoreNotNorm(String str, double[] pVal) { super(1, 3, pVal); setTitle("GaussianCoreNotNorm::"+str); providesNormalization = false; String[] names = new String[] { "amplitude","mean", "sigma" }; setParameterNames(names); } // Value of the function WITHOUT Normalization factor (as if N=1) public double functionValue(double[] var) { return p[0]*Math.exp( -Math.pow( var[0] - p[1], 2 )/(2*Math.pow( p[2], 2 )) ); } // Each concrete FunctionCore has to implement those methods that deal with Gradients and Normalization public boolean providesGradient() { return true; } public double[] gradient(double[] var) { return new double[] { functionValue(var)*(-2.)*(var[0] - p[1])/(2*Math.pow( p[2], 2 )) }; } public boolean providesParameterGradient() { return true; } public double[] parameterGradient(double[] var) { double y = functionValue(var); String[] parNames = parameterNames(); double[] grad = new double[] { y/p[0] , y*2.*(var[0] - p[1])/(2*Math.pow( p[2], 2 )), y*2.*Math.pow(var[0] - p[1],2)/(2*Math.pow( p[2], 3 )) }; // System.out.print("*** Gradient : "); // for ( int i = 0; i < grad.length; i++ ) // System.out.print(parNames[i]+" ("+p[i]+") = "+grad[i]+" "); // System.out.println(); return grad; } public boolean providesNormalization() { return providesNormalization; } public double normalizationAmplitude(double[] xMin, double[] xMax) { throw new UnsupportedOperationException(title() + " ***** Can not calculate normalization for a not normalized function"); } public Handle[] getHandles(double xLow, double xHigh, double yLow, double yHigh) { Handle[] result = new Handle[3]; result[0] = new Handle() { public void moveTo(double x, double y) { p[1] = x; p[0] = y; notifyCoreChanged(); } public double getX() { return p[1]; } public double getY() { return p[0]; } public Cursor cursor() { return ImageHandler.getBestCursor("moveCursor.png",GaussianCoreNotNorm.class,0,0); } }; result[1] = new Handle() { public void moveTo(double x, double y) { p[2] = (p[1] - x)/fwhm; notifyCoreChanged(); } public double getY() { return p[0]/2; } public double getX() { return p[1]-p[2]*fwhm; } public Cursor cursor() { return ImageHandler.getBestCursor("resizeEWCursor.png",GaussianCoreNotNorm.class,0,0); } }; result[2] = new Handle() { public void moveTo(double x, double y) { p[2] = (x - p[1])/fwhm; notifyCoreChanged(); } public double getY() { return p[0]/2; } public double getX() { return p[1]+p[2]*fwhm; } public Cursor cursor() { return ImageHandler.getBestCursor("resizeEWCursor.png",GaussianCoreNotNorm.class,0,0); } }; return result; } }