package org.signalml.app.method.ep;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.imageio.ImageIO;
import javax.swing.BoxLayout;
import org.signalml.app.view.common.components.panels.AbstractPanel;
import org.signalml.method.ep.EvokedPotentialResult;
/** EvokedPotentialGraphPanel
*
*
* @author Michal Dobaczewski © 2007-2008 CC Otwarte Systemy Komputerowe Sp. z o.o.
*/
public class EvokedPotentialGraphPanel extends AbstractPanel {
private static final long serialVersionUID = 1L;
public static enum ChartType {
NORMAL,
STRIPPED,
TOP,
BOTTOM
}
EvokedPotentialResult result;
private EvokedPotentialChart[] chartPanels;
double[] timeValues;
double globalMin;
double globalMax;
public EvokedPotentialGraphPanel() {
super();
}
public EvokedPotentialResult getResult() {
return result;
}
public void setResult(EvokedPotentialResult result) {
if (this.result != result) {
this.result = result;
this.removeAll();
createCharts();
this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
for (EvokedPotentialChart chartPanel: chartPanels) {
add(chartPanel);
}
revalidate();
repaint();
}
}
private void createCharts() {
int channel, e;
int channelCount = result.getChannelCount();
int sampleCount = result.getSampleCount();
chartPanels = new EvokedPotentialChart[channelCount];
globalMin = Double.MAX_VALUE;
globalMax = -Double.MAX_VALUE;
for (double[][] samples: result.getAverageSamples()) {
for (channel=0; channel<channelCount; channel++) {
for (e=0; e<sampleCount; e++) {
if (samples[channel][e] < globalMin) {
globalMin = samples[channel][e];
}
if (samples[channel][e] > globalMax) {
globalMax = samples[channel][e];
}
}
}
}
if (globalMin == globalMax) {
//if all the samples are equal to 0, we want the graphs to show it with some
//margins
globalMin -= 100.0;
globalMax += 100.0;
}
timeValues = new double[sampleCount];
float samplingFrequency = result.getSamplingFrequency();
for (e=0; e<sampleCount; e++) {
timeValues[e] = (((double) e) / samplingFrequency) + result.getStartTime();
}
for (channel=0; channel<channelCount; channel++) {
List<double[]> channelSamples = new ArrayList<double[]>();
for (int i = 0; i < result.getAverageSamples().size(); i++) {
double[][] data = result.getAverageSamples().get(i);
channelSamples.add(data[channel]);
}
ChartType chartType;
if (channel == channelCount-1) {
chartType = ChartType.BOTTOM;
}
else if (channel == 0 && channelCount != 1) {
chartType = ChartType.TOP;
} else {
chartType = ChartType.STRIPPED;
}
chartPanels[channel] = new EvokedPotentialChart(timeValues, channelSamples, globalMin, globalMax,
result.getLabels()[channel], chartType, result);
}
}
public void savePanelToFile(File file) throws IOException {
BufferedImage bi = new BufferedImage(this.getSize().width, this.getSize().height, BufferedImage.TYPE_INT_ARGB);
Graphics g = bi.createGraphics();
this.paint(g);
g.dispose();
ImageIO.write(bi,"png", file);
}
}