package org.signalml.plugin.newartifact.logic.algorithm;
import java.util.Arrays;
import org.signalml.plugin.domain.montage.PluginChannel;
import org.signalml.plugin.newartifact.data.NewArtifactConstants;
import org.signalml.plugin.newartifact.exception.NewArtifactPluginException;
import org.signalml.plugin.newartifact.logic.stat.Stat;
public class EyeMoveArtifactAlgorithm extends NewArtifactAlgorithmBase {
private static double DEFAULT_EOG_CORRELATION = 7.0D;
private static double DEFAULT_F78_CORRELATION = 8.0D;
private static double DEFAULT_T34_CORRELATION = 9.0D;
private Stat correlationAlgorithm;
public EyeMoveArtifactAlgorithm(NewArtifactConstants constants) {
super(constants);
this.resultBuffer = new double[4][this.constants.channelCount];
this.correlationAlgorithm = new Stat();
}
@Override
public double[][] computeHead(NewArtifactAlgorithmData data) {
return this.zeros(4, data.constants.channelCount);
}
@Override
public double[][] computeTail(NewArtifactAlgorithmData data) {
return this.zeros(4, data.constants.channelCount);
}
@Override
public double[][] compute(NewArtifactAlgorithmData data) {
int blockLength = data.constants.getBlockLength();
int tailLength = data.constants.getPaddingLength();
PreprocessHelper.Preprocess(data.signal, data.constants);
double signal[][] = new double[data.signal.length][];
for (int i = 0; i < signal.length; ++i) {
signal[i] = Arrays.copyOfRange(data.signal[i], tailLength,
blockLength + tailLength);
}
double resultBuffer[] = this.resultBuffer[3];
Arrays.fill(resultBuffer, 0.0D);
resultBuffer[0] = this.computeCorrelation(signal, data,
PluginChannel.EOGL, PluginChannel.EOGP, 0,
EyeMoveArtifactAlgorithm.DEFAULT_EOG_CORRELATION);
resultBuffer[1] = this.computeCorrelation(signal, data,
PluginChannel.F7, PluginChannel.F8, 1,
EyeMoveArtifactAlgorithm.DEFAULT_F78_CORRELATION);
resultBuffer[2] = this.computeCorrelation(signal, data,
PluginChannel.T3, PluginChannel.T4, 2,
EyeMoveArtifactAlgorithm.DEFAULT_T34_CORRELATION);
return this.resultBuffer;
}
private double computeCorrelation(double signal[][],
NewArtifactAlgorithmData data, PluginChannel channel1,
PluginChannel channel2, int resultColumn, double defaultValue) {
int channelNumber1, channelNumber2;
try {
channelNumber1 = this.getChannelNumber(data, channel1);
channelNumber2 = this.getChannelNumber(data, channel2);
} catch (NewArtifactPluginException e) {
return defaultValue;
}
this.computeSingleCorrelation(signal, channelNumber1, channelNumber2,
resultColumn);
return this.correlationAlgorithm.computeCorrelation(
signal[channelNumber1], signal[channelNumber2]);
}
private void computeSingleCorrelation(double signal[][], int channel1,
int channel2, int resultColumn) {
double channel1Data[] = signal[channel1];
double channel2Data[] = signal[channel2];
double resultBuffer[] = this.resultBuffer[resultColumn];
for (int i = 0; i < signal.length; ++i) {
if (i != channel1 && i != channel2) {
double c1 = this.correlationAlgorithm.computeCorrelation(
channel1Data, signal[i]);
double c2 = this.correlationAlgorithm.computeCorrelation(
channel2Data, signal[i]);
resultBuffer[i] = Math.max(Math.abs(c1), Math.abs(c2));
} else {
resultBuffer[i] = 0;
}
}
}
}