package org.signalml.plugin.newartifact.logic.tag.creators;
import java.util.List;
import java.util.SortedSet;
import java.util.TreeSet;
import org.signalml.plugin.newartifact.data.NewArtifactType;
import org.signalml.plugin.newartifact.data.tag.NewArtifactTagData;
import org.signalml.plugin.newartifact.data.tag.NewArtifactTagResult;
public class BreathingTagCreator extends AbstractNewArtifactTagCreator implements
INewArtifactTagCreator {
private static final NewArtifactType CREATOR_TYPE = NewArtifactType.BREATHING;
private static final double FACTOR_A = 1;
private static final double FACTOR_B = 0.88;
private static final double TRESHOLD_A = 1;
private static final double TRESHOLD_B = 0.5;
@Override
protected String getTagName() {
return "G";
}
@Override
protected String getTagDescription() {
return "Galw. oddech.";
}
@Override
protected int getTagStretch() {
return 4;
}
@Override
public NewArtifactTagResult tag(NewArtifactTagData data) {
final double sensitivity = data.parameters
.getSensitivity(BreathingTagCreator.CREATOR_TYPE) / 100.0;
final double factor = BreathingTagCreator.FACTOR_A + sensitivity
* (BreathingTagCreator.FACTOR_B - BreathingTagCreator.FACTOR_A);
final double treshold = BreathingTagCreator.TRESHOLD_A + sensitivity
* (BreathingTagCreator.TRESHOLD_B - BreathingTagCreator.TRESHOLD_A);
double source[][] = data.source;
int blockCount = source[0].length;
int eegChannels[] = data.eegChannels;
boolean exclusion[] = this.getExclusionMatrix(data);
double tresholdMatrix[] = this.getTresholdMatrix(data, exclusion, treshold);
List<Integer> tags = this.createTagsUsingTreshold(data, tresholdMatrix, exclusion);
SortedSet<Integer> sortedTags = new TreeSet<Integer>(tags);
if (factor != 1.0) {
for (Integer j : tags) {
if (j != 0 && j != blockCount - 1) {
boolean hasPrev = false;
boolean hasNext = false;
for (int i = 0; i < eegChannels.length; ++i) {
double channelData[] = source[eegChannels[i]];
if (channelData[j] > tresholdMatrix[i]) {// redundant
hasPrev = hasPrev
|| channelData[j - 1] > tresholdMatrix[i]
* factor;
hasNext = hasNext
|| channelData[j + 1] > tresholdMatrix[i]
* factor;
}
if (hasPrev && hasNext) {
break;
}
}
if (hasPrev) {
sortedTags.add(j - 1);
}
if (hasNext) {
sortedTags.add(j + 1);
}
}
}
}
return this.constructResult(sortedTags);
}
}