package org.signalml.plugin.newartifact.logic.tag.creators;
import java.util.LinkedList;
import java.util.List;
import org.signalml.plugin.newartifact.data.NewArtifactType;
import org.signalml.plugin.newartifact.data.tag.NewArtifactTagData;
import org.signalml.plugin.newartifact.data.tag.NewArtifactTagResult;
import org.signalml.plugin.newartifact.logic.tag.NewArtifactVerticalMaxHelper;
public class EyeMovementTagCreator extends AbstractNewArtifactTagCreator
implements INewArtifactTagCreator {
private static final NewArtifactType CREATOR_TYPE = NewArtifactType.EYE_MOVEMENT;
private static final double FACTOR_A = 0.0;
private static final double FACTOR_B = 0.5;
private static final double TRESHOLD_A = -0.97;
private static final double TRESHOLD_B = 0.1;
private static final double TRESHOLD_ABS_A = 0.99;
private static final double TRESHOLD_ABS_B = 0.5;
@Override
protected String getTagName() {
return "R";
}
@Override
protected String getTagDescription() {
return "Ruchy galek ocznych";
}
@Override
protected int getTagStretch() {
return 4;
}
@Override
public NewArtifactTagResult tag(NewArtifactTagData data) {
final double sensitivity = data.parameters
.getSensitivity(EyeMovementTagCreator.CREATOR_TYPE) / 100.0;
final double factor = EyeMovementTagCreator.FACTOR_A + sensitivity
* (EyeMovementTagCreator.FACTOR_B - EyeMovementTagCreator.FACTOR_A);
final double treshold = EyeMovementTagCreator.TRESHOLD_A + sensitivity
* (EyeMovementTagCreator.TRESHOLD_B - EyeMovementTagCreator.TRESHOLD_A);
final double absTreshold = EyeMovementTagCreator.TRESHOLD_ABS_A + sensitivity
* (EyeMovementTagCreator.TRESHOLD_ABS_B - EyeMovementTagCreator.TRESHOLD_ABS_A);
List<Integer> tags = new LinkedList<Integer>();
double source[][] = data.source;
int blockCount = source[0].length >> 2;
int prevIdx = -1;
for (int i = 0; i < blockCount; ++i) {
int idx = this.findLocalMin(source, (i << 2) + 3, 0, 3);
if (this.checkTagCondition(source, idx, i, treshold, absTreshold)) {
tags.add(i);
if (prevIdx != -1 && i > 1 && this.checkTagCondition(source, prevIdx, i - 1,
treshold + factor, absTreshold)) {
tags.add(i - 1);
}
if (i < blockCount - 1) {
if (this.checkTagCondition(source,
this.findLocalMin(source, ((i + 1) << 2) + 3, 0, 3),
i + 1, treshold + factor, absTreshold)) {
tags.add(i + 1);
}
}
}
prevIdx = idx;
}
return this.constructResult(tags);
}
private int findLocalMin(double source[][], int i, int begin, int end) {
double parameterMin = Double.POSITIVE_INFINITY;
int idx = 0;
for (int j = begin; j < end; ++j) {
double value = source[j][i];
if (value < parameterMin) {
parameterMin = value;
idx = j;
}
}
return idx;
}
private boolean checkTagCondition(double source[][], int channel, int block,
double treshold, double absTreshold) {
double parameterMin = source[channel][(block << 2) + 3];
return (parameterMin < treshold &&
NewArtifactVerticalMaxHelper.GetVMax(source, channel + (block << 2)) > absTreshold);
}
}