package org.signalml.plugin.newstager.logic.book.tag.helper;
import org.signalml.plugin.newstager.data.book.NewStagerAdaptedAtom;
import org.signalml.plugin.newstager.data.book.NewStagerBookSample;
import org.signalml.plugin.newstager.data.tag.NewStagerBookAtomTagHelperData;
public class NewStagerKCTagBuilderHelper extends
NewStagerBookAtomAbstractTagHelper implements
INewStagerBookAtomCoeffHelper {
private static final double THRESHOLD = 1.4d;
private INewStagerBookAtomFilter kcGaborFilter;
private NewStagerBookSample sample;
private double result;
public NewStagerKCTagBuilderHelper(NewStagerBookAtomTagHelperData data, INewStagerBookAtomFilter kcGaborFilter) {
super(data);
this.kcGaborFilter = kcGaborFilter;
this.sample = null;
}
@Override
public double convertToValue(NewStagerBookSample sample) {
if (this.sample != sample) {
this.sample = sample;
this.computeResult(sample);
}
return this.result;
}
private void computeResult(NewStagerBookSample sample) {
double mean = 0.0d;
double ampli[] = {0d, 0d, 0d};
int length = Math.min(3, sample.atoms.length);
for (int i = 0; i < length; ++i) {
double amplitude = sample.atoms[i].amplitude;
mean += amplitude;
ampli[i] = amplitude;
}
mean /= length;
int count = 0;
for (NewStagerAdaptedAtom atom : this.kcGaborFilter.filter(sample.atoms)) {
boolean selected = true;
for (int i = 0; i < 3; ++i) {
if (atom.position != ampli[i]) { //FIXME compare amplitude with position?
selected = false;
break;
}
}
if (selected) {
if (atom.amplitude > THRESHOLD * (mean - atom.amplitude / 3)) {
++count;
}
} else {
if (atom.amplitude > THRESHOLD * mean) {
++count;
}
}
}
this.result = count;
}
}