package com.isti.traceview.transformations.response; import java.util.List; import javax.swing.JFrame; import javax.swing.JOptionPane; import org.jfree.data.xy.XYDataset; import org.jfree.data.xy.XYSeries; import org.jfree.data.xy.XYSeriesCollection; import com.isti.jevalresp.RespUtils; import com.isti.traceview.TraceViewException; import com.isti.traceview.common.TimeInterval; import com.isti.traceview.data.PlotDataProvider; import com.isti.traceview.data.Response; import com.isti.traceview.data.Response.FreqParameters; import com.isti.traceview.filters.IFilter; import com.isti.traceview.transformations.ITransformation; import com.isti.xmax.XMAXException; import com.isti.xmax.gui.XMAXframe; public class TransResp implements ITransformation { public static final String NAME = "Response"; private static final double minFreqValue = 0.0001; private static final int numberFreqs = 500; @Override public void transform(List<PlotDataProvider> input, TimeInterval ti, IFilter filter, Object configuration, JFrame parentFrame) { if (input.size() == 0) { JOptionPane.showMessageDialog(parentFrame, "Please select channels", "RESP computation warning", JOptionPane.WARNING_MESSAGE); } else { try { @SuppressWarnings("unused") ViewResp vr = new ViewResp(parentFrame, createDataset(input, ti)); } catch (XMAXException e) { JOptionPane.showMessageDialog(parentFrame, e.getMessage(), "Warning", JOptionPane.WARNING_MESSAGE); } catch (TraceViewException e) { JOptionPane.showMessageDialog(parentFrame, e.getMessage(), "Warning", JOptionPane.WARNING_MESSAGE); } } ((XMAXframe) parentFrame).getGraphPanel().forceRepaint(); } @Override public void setMaxDataLength(int dataLength) { } /** * Creates a dataset, consisting of two series of cartesian data. * * @return The dataset. */ private XYDataset createDataset(List<PlotDataProvider> input, TimeInterval ti) throws TraceViewException, XMAXException { XYSeriesCollection dataset = new XYSeriesCollection(); for (PlotDataProvider channel : input) { XYSeries series = new XYSeries(channel.getName()); double maxFreqValue = 500.0 / channel.getRawData().get(0).getSampleRate(); final double sampFreq = (maxFreqValue - minFreqValue) / (numberFreqs - 1.0); FreqParameters fp = new FreqParameters(minFreqValue, maxFreqValue, sampFreq, numberFreqs); final double[] frequenciesArray = RespUtils.generateFreqArray(fp.startFreq, fp.endFreq, fp.numFreq, false); Response resp = channel.getResponse(); if (resp == null) throw new XMAXException("Can't load response for channel " + channel.getName()); final double respAmp[] = resp.getRespAmp(ti.getStartTime(), fp.startFreq, fp.endFreq, numberFreqs); for (int i = 0; i < numberFreqs; i++) { series.add(Math.log10(frequenciesArray[i]), Math.log10(respAmp[i])); } dataset.addSeries(series); } return dataset; } @Override public String getName() { return TransResp.NAME; } }