package org.signalml.plugin.newstager.logic.book;
import java.util.Arrays;
import org.signalml.plugin.data.PluginPair;
import org.signalml.plugin.newstager.data.NewStagerBookInfo;
import org.signalml.plugin.newstager.data.NewStagerParameterThresholds;
import org.signalml.plugin.newstager.data.book.NewStagerSingleBookProcessorData;
import org.signalml.plugin.newstager.data.logic.NewStagerBookProcessorResult;
import org.signalml.plugin.newstager.data.tag.NewStagerBookAtomFilterData;
import org.signalml.plugin.newstager.data.tag.NewStagerBookAtomTagBuilderData;
import org.signalml.plugin.newstager.data.tag.NewStagerBookAtomTagCreatorData;
import org.signalml.plugin.newstager.data.tag.NewStagerBookAtomTagHelperData;
import org.signalml.plugin.newstager.data.tag.NewStagerBookProcessorData;
import org.signalml.plugin.newstager.data.tag.NewStagerTagCollectionType;
import org.signalml.plugin.newstager.logic.book.tag.INewStagerTagBuilder;
import org.signalml.plugin.newstager.logic.book.tag.NewStagerAtomTagBuilderChain;
import org.signalml.plugin.newstager.logic.book.tag.NewStagerBookAtomSimpleTagBuilder;
import org.signalml.plugin.newstager.logic.book.tag.NewStagerBookAtomTagCreator;
import org.signalml.plugin.newstager.logic.book.tag.NewStagerHelperValueThresholdTagBuilderChain;
import org.signalml.plugin.newstager.logic.book.tag.NewStagerNonEmptyHelperConditionBuilderChain;
import org.signalml.plugin.newstager.logic.book.tag.NewStagerPrimaryTagBuilder;
import org.signalml.plugin.newstager.logic.book.tag.helper.INewStagerBookAtomPrimaryTagHelper;
import org.signalml.plugin.newstager.logic.book.tag.helper.NewStagerAmpBookAtomFilter;
import org.signalml.plugin.newstager.logic.book.tag.helper.NewStagerBookAtomFilterBase;
import org.signalml.plugin.newstager.logic.book.tag.helper.NewStagerBookAtomPrimaryTagHelper;
import org.signalml.plugin.newstager.logic.book.tag.helper.NewStagerBookAtomSampleHelperSet;
import org.signalml.plugin.newstager.logic.book.tag.helper.NewStagerCountingBuilderHelper;
import org.signalml.plugin.newstager.logic.book.tag.helper.NewStagerKCTagBuilderHelper;
import org.signalml.plugin.newstager.logic.book.tag.helper.NewStagerMuscleTagBuilderHelper;
import org.signalml.plugin.newstager.logic.book.tag.helper.NewStagerSwaTagBuilderHelper;
public class NewStagerSingleBookProcessor {
protected NewStagerTagBuilderSet builderSet;
protected NewStagerBookAtomSampleHelperSet helperSet;
private final NewStagerBookAtomTagCreator tagCreator;
private final NewStagerBookInfo bookInfo;
protected class Pair
extends
PluginPair<NewStagerTagCollectionType, INewStagerBookAtomPrimaryTagHelper> {
public Pair(NewStagerTagCollectionType x,
INewStagerBookAtomPrimaryTagHelper y) {
super(x, y);
}
};
public NewStagerSingleBookProcessor(NewStagerBookProcessorData data) {
this.bookInfo = data.bookInfo;
this.helperSet = new NewStagerBookAtomSampleHelperSet();
NewStagerParameterThresholds thresholds = data.parameters.thresholds;
NewStagerBookInfo bookInfo = data.bookInfo;
this.helperSet.alphaFilter = new NewStagerBookAtomFilterBase(
new NewStagerBookAtomFilterData(bookInfo,
thresholds.alphaThreshold, this.helperSet));
this.helperSet.deltaFilter = new NewStagerBookAtomFilterBase(
new NewStagerBookAtomFilterData(bookInfo,
thresholds.deltaThreshold, this.helperSet));
this.helperSet.gaborDeltaFilter = new NewStagerAmpBookAtomFilter(
new NewStagerBookAtomFilterData(bookInfo,
thresholds.deltaThreshold, this.helperSet));
this.helperSet.spindleFilter = new NewStagerBookAtomFilterBase(
new NewStagerBookAtomFilterData(bookInfo,
thresholds.spindleThreshold, this.helperSet));
this.helperSet.kcFilter = new NewStagerAmpBookAtomFilter(
new NewStagerBookAtomFilterData(bookInfo,
thresholds.kCThreshold, this.helperSet));
this.helperSet.thetaGaborFilter = new NewStagerAmpBookAtomFilter(
new NewStagerBookAtomFilterData(bookInfo,
thresholds.thetaThreshold, this.helperSet));
this.tagCreator = new NewStagerBookAtomTagCreator(
new NewStagerBookAtomTagCreatorData(data.constants,
data.bookInfo));
this.builderSet = new NewStagerTagBuilderSet();
this.createPrimaryHypnogramBuilders(data);
this.createHelpers(data);
this.createMainBuilders(data);
}
private void createHelpers(NewStagerBookProcessorData data) {
NewStagerBookAtomTagHelperData helperData = new NewStagerBookAtomTagHelperData(
data.bookInfo, data.fixedParameters, this.helperSet, data.muscle,
data.signalStatCoeffs);
this.helperSet.swaHelper = new NewStagerSwaTagBuilderHelper(helperData,
this.helperSet.gaborDeltaHelper, 0);
this.helperSet.alphaHelper = new NewStagerSwaTagBuilderHelper(
helperData, this.helperSet.alphaPrimaryHelper, 1);
this.helperSet.spindleHelper = new NewStagerSwaTagBuilderHelper(
helperData, this.helperSet.spindlePrimaryHelper, 0);
this.helperSet.kcHelper = new NewStagerKCTagBuilderHelper(helperData,
this.helperSet.kcFilter);
this.helperSet.thetaHelper = new NewStagerCountingBuilderHelper(
helperData, this.helperSet.thetaGaborFilter);
this.helperSet.muscleHelper = new NewStagerMuscleTagBuilderHelper(
helperData);
}
private void createMainBuilders(NewStagerBookProcessorData data) {
NewStagerBookAtomTagBuilderData chainData = new NewStagerBookAtomTagBuilderData(
data.channelMap, this.helperSet, this.tagCreator);
INewStagerTagBuilder stadium1Builder = new NewStagerBookAtomSimpleTagBuilder(
chainData, NewStagerTagCollectionType.SLEEP_STAGE_1);
INewStagerTagBuilder stadium2Builder = new NewStagerBookAtomSimpleTagBuilder(
chainData, NewStagerTagCollectionType.SLEEP_STAGE_2);
INewStagerTagBuilder stadium3Builder = new NewStagerBookAtomSimpleTagBuilder(
chainData, NewStagerTagCollectionType.SLEEP_STAGE_3);
INewStagerTagBuilder stadium4Builder = new NewStagerBookAtomSimpleTagBuilder(
chainData, NewStagerTagCollectionType.SLEEP_STAGE_4);
INewStagerTagBuilder stadiumRBuilder = new NewStagerBookAtomSimpleTagBuilder(
chainData, NewStagerTagCollectionType.SLEEP_STAGE_R);
INewStagerTagBuilder stadiumWBuilder = new NewStagerBookAtomSimpleTagBuilder(
chainData, NewStagerTagCollectionType.SLEEP_STAGE_W);
NewStagerAtomTagBuilderChain mainChain = new NewStagerAtomTagBuilderChain(
chainData, "mainLoop");
NewStagerAtomTagBuilderChain ampChain = new NewStagerNonEmptyHelperConditionBuilderChain(
chainData, this.helperSet.deltaPrimaryHelper, "SWA > 0");
mainChain.compose(ampChain);
NewStagerAtomTagBuilderChain spindleTopChain = mainChain
.composeChain("spindle check"); // OK
NewStagerNonEmptyHelperConditionBuilderChain spindleChain = new NewStagerNonEmptyHelperConditionBuilderChain(
chainData, this.helperSet.spindlePrimaryHelper);
NewStagerNonEmptyHelperConditionBuilderChain swaChain = new NewStagerNonEmptyHelperConditionBuilderChain(
chainData, this.helperSet.gaborDeltaHelper, "spindle > 0");
swaChain.compose(new NewStagerHelperValueThresholdTagBuilderChain(
chainData, this.helperSet.swaHelper, 0.5d)
.compose(stadium4Builder));
swaChain.compose(new NewStagerHelperValueThresholdTagBuilderChain(
chainData, this.helperSet.swaHelper, 0.2d)
.compose(stadium3Builder));
swaChain.compose(spindleTopChain);
NewStagerAtomTagBuilderChain spindleSubChain = new NewStagerAtomTagBuilderChain(
chainData);
NewStagerHelperValueThresholdTagBuilderChain alphaChain = new NewStagerHelperValueThresholdTagBuilderChain(
chainData, this.helperSet.spindleHelper,
data.fixedParameters.alphaPerc1);
spindleSubChain.compose(alphaChain);
spindleSubChain.compose(stadium2Builder);
NewStagerAtomTagBuilderChain muscleChain = new NewStagerHelperValueThresholdTagBuilderChain(
chainData, this.helperSet.muscleHelper,
data.signalStatCoeffs.toneMThreshold).compose(stadiumWBuilder)
.compose(stadiumRBuilder);
alphaChain.compose(muscleChain);
spindleChain.compose(spindleSubChain);
NewStagerAtomTagBuilderChain kcTopChain = spindleChain.composeChain();
NewStagerAtomTagBuilderChain thetaTopChain = new NewStagerAtomTagBuilderChain(
chainData);
NewStagerHelperValueThresholdTagBuilderChain thetaChain = new NewStagerHelperValueThresholdTagBuilderChain(
chainData, this.helperSet.muscleHelper,
data.signalStatCoeffs.toneMThreshold);
NewStagerAtomTagBuilderChain thetaMuscleChain = new NewStagerAtomTagBuilderChain(
chainData);
thetaMuscleChain.compose(stadiumRBuilder);
thetaChain
.compose(
new NewStagerHelperValueThresholdTagBuilderChain(
chainData, this.helperSet.thetaHelper, 0)
.compose(stadium1Builder)).compose(
stadiumWBuilder);
thetaTopChain.compose(thetaChain).compose(thetaMuscleChain);
NewStagerHelperValueThresholdTagBuilderChain spindleSubChain2 = new NewStagerHelperValueThresholdTagBuilderChain(
chainData, this.helperSet.alphaHelper,
data.fixedParameters.alphaPerc2);
spindleSubChain2.compose(muscleChain);
kcTopChain
.compose(new NewStagerHelperValueThresholdTagBuilderChain(
chainData, this.helperSet.kcHelper, 0)
.compose(stadium2Builder));
kcTopChain.composeChain().compose(spindleSubChain2)
.compose(thetaTopChain);
ampChain.compose(swaChain);
ampChain.compose(spindleTopChain);
spindleTopChain.compose(spindleChain); // OK
spindleTopChain.compose(kcTopChain); // OK
this.builderSet.add(mainChain);
}
private void createPrimaryHypnogramBuilders(NewStagerBookProcessorData data) {
NewStagerBookAtomTagHelperData helperData = new NewStagerBookAtomTagHelperData(
data.bookInfo, data.fixedParameters, this.helperSet, data.muscle,
data.signalStatCoeffs);
this.helperSet.alphaPrimaryHelper = new NewStagerBookAtomPrimaryTagHelper(
helperData, this.helperSet.alphaFilter);
this.helperSet.deltaPrimaryHelper = new NewStagerBookAtomPrimaryTagHelper(
helperData, this.helperSet.deltaFilter);
this.helperSet.spindlePrimaryHelper = new NewStagerBookAtomPrimaryTagHelper(
helperData, this.helperSet.spindleFilter);
this.helperSet.gaborDeltaHelper = new NewStagerBookAtomPrimaryTagHelper(
helperData, this.helperSet.gaborDeltaFilter);
if (data.parameters.primaryHypnogramFlag) {
NewStagerBookAtomTagBuilderData builderData = new NewStagerBookAtomTagBuilderData(
data.channelMap, this.helperSet, this.tagCreator);
for (final Pair p : Arrays.asList(new Pair(
NewStagerTagCollectionType.HYPNO_ALPHA,
this.helperSet.alphaPrimaryHelper), new Pair(
NewStagerTagCollectionType.HYPNO_DELTA,
this.helperSet.gaborDeltaHelper), new Pair(
NewStagerTagCollectionType.HYPNO_SPINDLE,
this.helperSet.spindlePrimaryHelper))) {
this.builderSet
.add(new NewStagerPrimaryTagBuilder(builderData) {
@Override
protected INewStagerBookAtomPrimaryTagHelper getConverter() {
return p.y;
}
@Override
protected NewStagerTagCollectionType getTagType() {
return p.x;
}
});
}
}
}
public void process(NewStagerSingleBookProcessorData data) {
this.builderSet.process(data.atomSample);
}
public NewStagerBookProcessorResult getResult() {
return new NewStagerBookProcessorResult(this.bookInfo,
this.builderSet.getResult());
}
}