package org.signalml.app.method.ep.helpers.minmax; import java.util.ArrayList; import java.util.List; import org.signalml.app.method.ep.model.minmax.ChannelStatistics; import org.signalml.method.ep.EvokedPotentialResult; /** * Calculates the min/max values and times for a given {@link EvokedPotentialResult} * for a given tag group number. * @author Piotr Szachewicz */ public class ChannelStatisticsCalculator { private EvokedPotentialResult result; private int tagGroupNumber; private List<ChannelStatistics> statistics; /** * Constructor. * @param result the result of averaging * @param tagGroupNumber the number of tag group from the EvokedPotentialResult * for which statistics will be calculated. */ public ChannelStatisticsCalculator(EvokedPotentialResult result, int tagGroupNumber) { this.tagGroupNumber = tagGroupNumber; this.result = result; calculateStatistics(); } protected void calculateStatistics() { statistics = new ArrayList<ChannelStatistics>(); double[][] samples = result.getAverageSamples().get(tagGroupNumber); for (int channelNumber = 0; channelNumber < result.getAverageSamples().get(tagGroupNumber).length; channelNumber++) { double[] channelSamples = samples[channelNumber]; statistics.add(calculateChannelStatistics(channelNumber, channelSamples)); } } protected ChannelStatistics calculateChannelStatistics(int channelNumber, double[] channelSamples) { double maxValue = -Double.MAX_VALUE; double maxTime = 0.0; for (int i = 0; i < channelSamples.length; i++) { if (channelSamples[i] > maxValue) { maxValue = channelSamples[i]; maxTime = sampleNumberToTime(i); } } double minValue = Double.MAX_VALUE; double minTime = 0.0; for (int i = 0; i < channelSamples.length; i++) { if (channelSamples[i] < minValue) { minValue = channelSamples[i]; minTime = sampleNumberToTime(i); } } ChannelStatistics channelStatistics = new ChannelStatistics(result.getLabels()[channelNumber], minTime, minValue, maxTime, maxValue); return channelStatistics; } protected double sampleNumberToTime(int sampleNumber) { return ((double) sampleNumber) / result.getSamplingFrequency() + result.getStartTime(); } public List<ChannelStatistics> getStatistics() { return statistics; } }