/* GenericAmplifierDiagnosis.java created 2010-10-26 * */ package org.signalml.app.view.document.monitor.signalchecking; import java.util.HashMap; import org.signalml.app.document.MonitorSignalDocument; import org.signalml.domain.signal.samplesource.RoundBufferMultichannelSampleSource; /** * An abstract class representing an object that - when given a {@link MonitorSignalDocument} * object - will check if the signal from an amplifier is OK. Classes for given amplifier models * will derive from this class. * * @author Tomasz Sawicki */ public abstract class GenericAmplifierDiagnosis { /** * {@link #samplesTestedFactor} parameter key. */ public static final String SAMPLES_TESTED_FACTOR = "SamplesTestedFactor"; /** * The bigger this constant is the more samples will be tested (number * of samples tested = sampling frequency * this factor). Needs to be passed as a parameter. */ private double samplesTestedFactor; /** * Monitor signal document. */ private MonitorSignalDocument monitorSignalDocument; /** * Amp parameters. */ private HashMap<String, Object> parameters; /** * A round buffer containing samples from the amplifier. */ private RoundBufferMultichannelSampleSource roundBuffer; /** * How many samples should be tested. */ private int samplesToTest; /** * Constructor. * * @param monitorSignalDocument represents the currently open monitor document */ public GenericAmplifierDiagnosis(MonitorSignalDocument monitorSignalDocument, HashMap<String, Object> parameters) { this.monitorSignalDocument = monitorSignalDocument; this.parameters = parameters; this.roundBuffer = (RoundBufferMultichannelSampleSource) getMonitorSignalDocument().getSampleSource(); samplesTestedFactor = Double.parseDouble(getParameters().get(SAMPLES_TESTED_FACTOR).toString()); samplesToTest = (int)(getMonitorSignalDocument().getSamplingFrequency() * samplesTestedFactor); } /** * Returns an information on each channel based on the information * from the {@link MonitorSignalDocument} object. * * @return a HashMap<String, Boolean> - the key is channel's label, * the value - true if the signal is OK, false it it's not. If there weren't * enough samples in the system to test the signal state, the return value * is null. */ public abstract HashMap<String, ChannelState> signalState(); /** * Returns the monitor signal document. * @return the monitor signal document */ public final MonitorSignalDocument getMonitorSignalDocument() { return monitorSignalDocument; } /** * Returns the parameters. * @return the parameters */ public final HashMap<String, Object> getParameters() { return parameters; } /** * Returns the round buffer. * @return the round buffer */ public final RoundBufferMultichannelSampleSource getRoundBuffer() { return roundBuffer; } /** * Returns {@link #samplesToTest}. * @return {@link #samplesToTest} */ public final int getSamplesToTest() { return samplesToTest; } /** * Whether are there enough samples to make a test. * @return true if there are enough samples to make a test */ protected boolean areEnoughSamples() { return (getRoundBuffer().getReceivedSampleCount() >= getSamplesToTest()); } /** * Gets last {@link #samplesToTest} samples from a given channel. * @param channelNo channel number * @return last {@link #samplesToTest} samples from chosen channel */ protected double[] getSamplesForAChannel(int channelNo) { double[] samples = new double[getSamplesToTest()]; getRoundBuffer().getSamples(channelNo, samples, getRoundBuffer().getSampleCount(channelNo) - getSamplesToTest(), getSamplesToTest(), 0, false); return samples; } /** * Returns the channel count. * @return the channel count */ protected int getChannelCount() { return roundBuffer.getChannelCount(); } /** * Returns the label for the chosen chanel. * @param channelNo chosen chanel number * @return the label for the chosen chanel */ protected String getLabel(int channelNo) { return roundBuffer.getLabel(channelNo); } /** * Returns max value which will be used in drawing {@link CheckSignalDisplay}. * @param currentValues current values * @param limits limit values * @return max value to draw */ /*protected double getMaxValue(double[] currentValues, double[] limits) { double maxLimit = -1; double maxValue = -1; boolean maxOver = false; for (int i = 0; i < currentValues.length; i++) { if (currentValues[i] > maxValue) { maxValue = currentValues[i]; if (currentValues[i] > limits[i]) { maxOver = true; } } if (limits[i] > maxLimit) { maxLimit = limits[i]; } } if (maxValue < maxLimit) return 1.25 * maxLimit; else if () }*/ }