/*
* FrequencyDistribution2D.java
*
* Copyright (C) 2002-2006 Alexei Drummond and Andrew Rambaut
*
* This file is part of BEAST.
* See the NOTICE file distributed with this work for additional
* information regarding copyright ownership and licensing.
*
* BEAST is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* BEAST is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with BEAST; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301 USA
*/
package dr.inference.mcmc;
/**
* This class modes a two-dimensional binned frequency distribution.
*
* @version $Id: FrequencyDistribution2D.java,v 1.1 2002/10/29 13:48:24 rambaut Exp $
*
* @author Alexei Drummond
*/
class FrequencyDistribution2D {
double binSize1, binSize2;
double start1 = 0.0, start2 = 0.0;
double[][] bins;
public FrequencyDistribution2D(int numBins, double binSize1, int numBins2, double binSize2) {
init(numBins, binSize1, numBins2, binSize2);
}
private void init(int numBins, double binSize1, int numBins2, double binSize2) {
bins = new double[numBins][numBins2];
this.binSize1 = binSize1;
this.binSize2 = binSize2;
}
public void addPoint(double value1, double value2) {
double diff = value1 - start1;
int index1 = (int)(diff / binSize1);
diff = value2 - start2;
int index2 = (int)(diff / binSize2);
if ((index1 >= 0) && (index1 < bins.length) && (index2 >= 0) && (index2 < bins[0].length)) {
bins[index1][index2] += 1;
}
}
public String toString() {
StringBuffer buffer = new StringBuffer();
double mean;
buffer.append("\t");
for (int i = 0; i < bins.length; i++) {
mean = start2 + (binSize2 * ((double)i + 0.5));
buffer.append(mean + "\t");
}
buffer.append("\n");
for (int i = 0; i < bins.length; i++) {
mean = start1 + (binSize1 * ((double)i + 0.5));
buffer.append(mean + "\t");
for (int j = 0; j < bins[i].length; j++) {
buffer.append(bins[i][j] + "\t");
}
buffer.append("\n");
}
return new String(buffer);
}
}