/*
*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 The FreeHEP team @ SLAC
*/
public class LorentzianCoreNotNorm extends FunctionCore {
protected boolean providesNormalization;
public LorentzianCoreNotNorm(String str) {
super(1, 3, new double[] {1., 1., 1.});
setTitle("LorentzianCoreNotNorm::"+str);
providesNormalization = false;
String[] names = new String[] { "amplitude","mu", "gamma" };
setParameterNames(names);
}
public LorentzianCoreNotNorm(String str, double[] pVal) {
super(1, 3, pVal);
setTitle("LorentzianCoreNotNorm::"+str);
providesNormalization = false;
String[] names = new String[] { "amplitude","mu", "gamma" };
setParameterNames(names);
}
public double functionValue(double[] var) {
double x = var[0];
double n = p[0]/Math.PI;
double mu = p[1];
double gamma = p[2];
double gammaHalf = gamma/2.;
double gammaHalfSquared = gammaHalf*gammaHalf;
return (n)*(gammaHalf)/((x-mu)*(x-mu)+gammaHalfSquared);
}
public boolean providesGradient() { return false; }
public double[] gradient(double[] var) {
throw new UnsupportedOperationException();
}
public boolean providesParameterGradient() { return false; }
public double[] parameterGradient(double[] var) {
throw new UnsupportedOperationException();
}
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[2];
result[0] = new Handle() {
public void moveTo(double x, double y) {
p[1] = x;
p[0] = y*p[2]*Math.PI/2;
notifyCoreChanged();
}
public double getX() {
return p[1];
}
public double getY() {
return p[0]*2/(p[2]*Math.PI);
}
public Cursor cursor() {
return ImageHandler.getBestCursor("moveCursor.png",LorentzianCoreNotNorm.class,0,0);
}
};
result[1] = new Handle() {
public void moveTo(double x, double y) {
p[2] = 2*(x-p[1]);
p[0] = y*Math.PI*p[2];
notifyCoreChanged();
}
public double getY() {
return p[0]/(Math.PI*p[2]);
}
public double getX() {
return p[1]+p[2]/2;
}
public Cursor cursor() {
return ImageHandler.getBestCursor("moveCursor.png",LorentzianCoreNotNorm.class,0,0);
}
};
return result;
}
}