package org.signalml.plugin.newstager.logic.book.tag.helper;
import java.util.BitSet;
import org.signalml.plugin.newstager.data.book.NewStagerBookSample;
import org.signalml.plugin.newstager.data.tag.NewStagerBookAtomTagHelperData;
import org.signalml.plugin.newstager.data.tag.NewStagerHelperTagSample;
public class NewStagerSwaTagBuilderHelper extends
NewStagerBookAtomAbstractTagHelper implements
INewStagerBookAtomCoeffHelper {
private final INewStagerBookAtomPrimaryTagHelper helper;
private final int signalOffset;
public NewStagerSwaTagBuilderHelper(NewStagerBookAtomTagHelperData data,
INewStagerBookAtomPrimaryTagHelper helper, int signalOffset) {
super(data);
this.helper = helper;
this.signalOffset = signalOffset;
}
private NewStagerBookSample sample;
private double result;
@Override
public double convertToValue(NewStagerBookSample sample) {
if (this.sample != sample) {
this.sample = sample;
this.compute(sample);
}
return this.result;
}
private void compute(NewStagerBookSample sample) {
int offsetDimension = (int) this.data.bookInfo.offsetDimension;
BitSet bits = new BitSet(offsetDimension);
for (NewStagerHelperTagSample tagSample : this.helper
.convertToTagSamples(sample)) { // TODO change swa_width
int offset = tagSample.offset;
int length = tagSample.length;
int end = (tagSample.position + ((double) length) / 2) > offsetDimension ? ((sample.offset + 1)
* offsetDimension - 1)
: (offset + length);
offset -= (sample.offset + signalOffset) * offsetDimension;
end -= (sample.offset + signalOffset) * offsetDimension;
if (offset <= offsetDimension && end >= 0) {
bits.set(Math.max(0, offset),
Math.min(offsetDimension - 1, end) + 1);
}
}
this.result = ((double) bits.cardinality()) / offsetDimension;
}
}