package org.signalml.plugin.newstager.logic.artifact;
import java.util.LinkedList;
import java.util.List;
import org.signalml.plugin.domain.montage.PluginChannel;
import org.signalml.plugin.domain.montage.PluginChannelAccessHelper;
import org.signalml.plugin.exception.PluginAlgorithmDataException;
import org.signalml.plugin.newstager.data.NewStagerArtifactAlgorithmData;
import org.signalml.plugin.newstager.data.logic.NewStagerStatAlgorithmResult;
import org.signalml.plugin.newstager.data.logic.NewStagerStatData;
import org.signalml.plugin.newstager.exception.NewStagerPluginException;
public class NewStagerStatAlgorithm {
private final NewStagerArtifactMontageAlgorithm montageAnalyser;
private final NewStagerArtifactToneEMGAlgorithm emgAnalyser;
private List<Boolean> montageArtifacts;
private List<Double> emgArtifacts;
private double c3a2diff;
private double c3a2diffSquare;
private NewStagerStatData data;
public NewStagerStatAlgorithm(NewStagerStatData data) {
this.data = data;
NewStagerArtifactAlgorithmData algorithmData = new NewStagerArtifactAlgorithmData(
data.channels, data.constants, data.parameters);
this.montageAnalyser = new NewStagerArtifactMontageAlgorithm(
algorithmData);
this.emgAnalyser = new NewStagerArtifactToneEMGAlgorithm(algorithmData);
this.montageArtifacts = new LinkedList<Boolean>();
this.emgArtifacts = new LinkedList<Double>();
this.c3a2diff = 0.0d;
this.c3a2diffSquare = 0.0d;
}
public void compute(double signal[][]) throws NewStagerPluginException {
this.montageArtifacts.add(this.montageAnalyser.run(signal));
this.emgArtifacts.add(this.emgAnalyser.run(signal));
double c3[], a2[];
try {
c3 = PluginChannelAccessHelper.GetChannelSignal(
this.data.channels, PluginChannel.C3, signal);
a2 = PluginChannelAccessHelper.GetChannelSignal(
this.data.channels, PluginChannel.A2, signal);
} catch (PluginAlgorithmDataException e) {
throw new NewStagerPluginException(e);
}
assert(c3.length == a2.length);
for (int i = 0; i < c3.length; ++i) {
double diff = c3[i] - a2[i];
this.c3a2diff += diff;
this.c3a2diffSquare += diff * diff;
}
}
public NewStagerStatAlgorithmResult getResult() {
int length = this.emgArtifacts.size();
assert(length == this.montageArtifacts.size());
double muscle[] = new double[length];
boolean montage[] = new boolean[length];
int i = 0;
for (Double v : this.emgArtifacts) {
muscle[i] = v;
++i;
}
i = 0;
for (Boolean v : this.montageArtifacts) {
montage[i] = v;
++i;
}
int count = length * this.data.constants.getBlockLengthInSamples();
double mean = this.c3a2diff / count;
double dev = this.c3a2diffSquare - 2 * mean * this.c3a2diff + mean
* mean * count;
return new NewStagerStatAlgorithmResult(Math.sqrt(dev / (count - 1)),
muscle, montage);
}
}