package jas.hist.test;
import jas.hist.HasStatistics;
import jas.hist.HasStyle;
import jas.hist.HistogramUpdate;
import jas.hist.JASHist1DHistogramStyle;
import jas.hist.JASHistStyle;
import jas.hist.Rebinnable1DHistogramData;
import jas.hist.Statistics;
import jas.util.xml.HasXMLRepresentation;
import jas.util.xml.XMLWriter;
import java.util.Observable;
public class Gauss extends Observable implements Rebinnable1DHistogramData, HasStyle, HasStatistics, HasXMLRepresentation
{
public Gauss()
{
this("Gaussian",1000,1,0,0);
}
public void writeAsXML(XMLWriter pw)
{
pw.println("<datasource name=\""+getClass().getName()+"\">");
pw.println("<param type=\"String\" value=\""+m_name+"\"/>");
pw.println("<param type=\"int\" value=\""+m_entries+"\"/>");
pw.println("<param type=\"double\" value=\""+(m_max-m_min)+"\"/>");
pw.println("<param type=\"double\" value=\""+m_min+"\"/>");
pw.println("<param type=\"double\" value=\""+m_offset+"\"/>");
pw.println("</datasource>");
}
public Gauss(String name, int entries,double max,double offX,double offY)
{
if (entries > MAXSIZE) throw new IllegalArgumentException("Gauss: Size too big");
m_tuple = new double[MAXSIZE];
m_entries = entries;
m_min = offX;
m_max = offX + max;
m_offset = offY;
m_name = name;
for (int j=0; j<MAXSIZE; j++)
{
double k = Math.random()+Math.random()+Math.random()+Math.random()+Math.random()+Math.random();
k = offX + max*k/6;
m_tuple[j] = k;
}
}
public void setStyle(JASHist1DHistogramStyle style)
{
this.style = style;
}
public JASHistStyle getStyle()
{
return this.style;
}
public String getTitle()
{
return m_name;
}
public double getMin()
{
return m_min;
}
public double getMax()
{
return m_max;
}
public boolean isRebinnable()
{
return true;
}
public String[] getAxisLabels()
{
return null;
}
public int getBins()
{
return 40;
}
public int getAxisType()
{
return Rebinnable1DHistogramData.DOUBLE;
}
public double[][] rebin(int bins, double min, double max, boolean wantErrors, boolean hurry)
{
synchronized (this) { setChanged(); }
double[] hist = new double[bins];
double binWidth = (max - min)/bins;
for (int j=0; j<bins; j++) hist[j] = m_offset;
for (int k=0; k<m_entries; k++)
{
double v = m_tuple[k];
if (v < min) continue;
int bin = (int) ((v - min)/binWidth);
if (bin<bins) hist[bin] += 1;
}
double[][] result = new double[1][];
result[0] = hist;
return result;
}
public int getSize()
{
return m_entries;
}
public void setSize(int newSize)
{
if (newSize > MAXSIZE) throw new IllegalArgumentException("Gauss: Size too big");
m_entries = newSize;
synchronized (this) { notifyObservers(new HistogramUpdate(HistogramUpdate.DATA_UPDATE,true)); }
}
public double getData(int i)
{
return m_tuple[i];
}
public Statistics getStatistics()
{
return stats;
}
double m_tuple[];
int m_entries;
double m_max;
double m_min;
double m_offset;
String m_name;
protected final static int MAXSIZE = 10000;
private JASHist1DHistogramStyle style;
private Statistics stats = new GaussStatistics();
private Statistics paulstats = new PaulStatistics();
public void setStats() {
stats = paulstats;
}
private class GaussStatistics implements Statistics
{
public String[] getStatisticNames()
{
return statNames;
}
public double getStatistic(String name)
{
if (name == statNames[0]) return m_entries;
if (name == statNames[1]) return (m_max + m_min)/2;
if (name == statNames[2]) return (m_max - m_min);
return 0;
}
}
public class PaulStatistics implements Statistics
{
public String[] getStatisticNames()
{
return statNames2;
}
public double getStatistic(String name)
{
if (name == statNames2[0]) return m_entries;
if (name == statNames2[1]) return (m_max + m_min)/2;
if (name == statNames2[2]) return (m_max - m_min);
if (name == statNames2[3]) return (m_entries*10);
return 0;
}
}
private static final String[] statNames = {"Entries","Mean","RMS"};
private static final String[] statNames2 = {"Entries","Mean","RMS", "10Entries"};
}