package org.signalml.app.view.document.monitor.signalchecking;
import java.util.HashMap;
import org.signalml.app.document.MonitorSignalDocument;
import org.signalml.app.model.montage.ElectrodeType;
/**
* A {@link GenericAmplifierDiagnosis} class that checks whether average
* signal value is greater than some constant value.
* <ul>
* Parameters that must be passed (keys):
* <li>parameters inherited from {@link GenericAmplifierDiagnosis}:
* <ul><li>{@link GenericAmplifierDiagnosis#SAMPLES_TESTED_FACTOR}</li></ul>
* </ul>
* If average must be obtained from all samples, than SAMPLES_TEST_FACTOR shoud
* equal checking delay (in seconds)
* @author Tomasz Sawicki
*/
public class DCDiagnosis extends GenericAmplifierDiagnosis {
public static final String ELECTRODE_TYPE = "ElectrodeType";
private ElectrodeType electrodeType;
/**
* Constructor.
* @param monitorSignalDocument {@link GenericAmplifierDiagnosis#monitorSignalDocument}
* @param parameters {@link GenericAmplifierDiagnosis#parameters}
*/
public DCDiagnosis(MonitorSignalDocument monitorSignalDocument, HashMap<String, Object> parameters) {
super(monitorSignalDocument, parameters);
}
/**
* Returns an information on each channel based on the information
* from the {@link MonitorSignalDocument} object.
*
* @return a HashMap<String, ChannelState> - the key is channel's label,
* the value - channel state.
*/
@Override
public HashMap<String, ChannelState> signalState() {
if (!areEnoughSamples()) {
return null;
}
electrodeType = (ElectrodeType) getParameters().get(ELECTRODE_TYPE);
HashMap<String, ChannelState> channels = new HashMap<String, ChannelState>();
for (int i = 0; i < getRoundBuffer().getChannelCount(); i++) {
double average = getAverageForChannel(i);
AdditionalChannelData additionalChannelData = new AdditionalChannelData(electrodeType.getMax(), electrodeType.getMin(), electrodeType.getLimit(), average, SignalCheckingMethod.DC);
ChannelState channelState = new ChannelState(true, additionalChannelData);
channels.put(getLabel(i), channelState);
}
return channels;
}
/**
* Gets average value from last {@link GenericAmplifierDiagnosis#samplesToTest} samples.
* @param channelNo number of channel
* @return average value for chosen channel
*/
private double getAverageForChannel(int channelNo) {
double[] samples = getSamplesForAChannel(channelNo);
double sum = 0;
for (int i = 1; i < samples.length; i++) {
sum += Math.abs(samples[i]);
}
return sum / samples.length;
}
}