package org.signalml.plugin.newstager.logic.mgr; import java.io.File; import java.io.IOException; import java.util.Collection; import java.util.EnumSet; import java.util.Map; import org.signalml.method.ComputationException; import org.signalml.plugin.data.logic.PluginComputationMgrStepResult; import org.signalml.plugin.data.tag.IPluginTagDef; import org.signalml.plugin.exception.PluginToolAbortException; import org.signalml.plugin.exception.PluginToolInterruptedException; import org.signalml.plugin.export.SignalMLException; import org.signalml.plugin.method.logic.AbstractPluginComputationMgrStep; import org.signalml.plugin.newstager.data.logic.NewStagerBookProcessorStepResult; import org.signalml.plugin.newstager.data.logic.NewStagerComputationProgressPhase; import org.signalml.plugin.newstager.data.logic.NewStagerMgrStepData; import org.signalml.plugin.newstager.data.logic.NewStagerTagWriteStepResult; import org.signalml.plugin.newstager.data.tag.NewStagerTagCollectionType; import org.signalml.plugin.newstager.io.NewStagerTagWriter; import org.signalml.plugin.newstager.logic.book.tag.helper.NewStagerTagMergerHelper; import org.signalml.plugin.signal.PluginSignalHelper; public class NewStagerTagWriteStep extends AbstractPluginComputationMgrStep<NewStagerMgrStepData> { private File primaryTagFile; private Integer signalBlockCount; public NewStagerTagWriteStep(NewStagerMgrStepData data) { super(data); this.primaryTagFile = null; } @Override public int getStepNumberEstimate() { return this.getNumberOfOutputFiles() * this.getSignalBlockCountScaled(); } @Override protected NewStagerTagWriteStepResult prepareStepResult() { if (this.primaryTagFile == null) { return null; } return new NewStagerTagWriteStepResult( this.primaryTagFile.getAbsolutePath()); } @Override protected PluginComputationMgrStepResult doRun( PluginComputationMgrStepResult prevStepResult) throws PluginToolAbortException, PluginToolInterruptedException, ComputationException { NewStagerBookProcessorStepResult tagResult; try { tagResult = (NewStagerBookProcessorStepResult) prevStepResult; } catch (ClassCastException e) { throw new ComputationException(e); } this.data.tracker .setProgressPhase(NewStagerComputationProgressPhase.TAG_WRITING_PREPARE_PHASE); Map<NewStagerTagCollectionType, Collection<IPluginTagDef>> tags = NewStagerTagMergerHelper .MergeTags(tagResult, this.data.constants); try { this.writeTagsToFile(tags); } catch (IOException e) { throw new ComputationException(e); } catch (SignalMLException e) { throw new ComputationException(e); } return this.prepareStepResult(); } private void writeTagsToFile( Map<NewStagerTagCollectionType, Collection<IPluginTagDef>> tagMap) throws IOException, SignalMLException { NewStagerTagWriter writer = new NewStagerTagWriter( this.data.stagerData, this.data.constants); if (this.data.stagerData.getParameters().primaryHypnogramFlag) { this.updateTracker(NewStagerComputationProgressPhase.TAG_WRITING_ALPHA); writer.writeTags(NewStagerTagCollectionType.HYPNO_ALPHA, EnumSet.of(NewStagerTagCollectionType.HYPNO_ALPHA), tagMap); this.updateTracker(NewStagerComputationProgressPhase.TAG_WRITING_DELTA); writer.writeTags(NewStagerTagCollectionType.HYPNO_DELTA, EnumSet.of(NewStagerTagCollectionType.HYPNO_DELTA), tagMap); this.updateTracker(NewStagerComputationProgressPhase.TAG_WRITING_SPINDLE); writer.writeTags(NewStagerTagCollectionType.HYPNO_SPINDLE, EnumSet.of(NewStagerTagCollectionType.HYPNO_SPINDLE), tagMap); } this.updateTracker(NewStagerComputationProgressPhase.TAG_WRITING_SLEEP_PAGES); writer.writeTags(NewStagerTagCollectionType.SLEEP_PAGES, NewStagerTagCollectionType.GetSleepStages(), tagMap); this.updateTracker(NewStagerComputationProgressPhase.TAG_WRITING_CONSOLIDATED_SLEEP_PAGES); this.primaryTagFile = writer .writeTags( NewStagerTagCollectionType.CONSOLIDATED_SLEEP_PAGES, NewStagerTagCollectionType.GetConsolidatedSleepStages(), tagMap); } private int getSignalBlockCount() { if (this.signalBlockCount == null) { this.signalBlockCount = PluginSignalHelper.GetBlockCount( this.data.stagerData.getSampleSource(), this.data.constants.getBlockLengthInSamples()); } return this.signalBlockCount; } private int getSignalBlockCountScaled() { return this.getSignalBlockCount() / 20; } private void updateTracker(NewStagerComputationProgressPhase phase) { this.data.tracker.setProgressPhase(phase); boolean primaryFlag = this.data.stagerData.getParameters().primaryHypnogramFlag; int numberOfFiles = this.getNumberOfOutputFiles(); int pos; switch (phase) { case TAG_WRITING_ALPHA: pos = 1; break; case TAG_WRITING_DELTA: pos = 2; break; case TAG_WRITING_SPINDLE: pos = 3; break; case TAG_WRITING_SLEEP_PAGES: pos = primaryFlag ? 4 : 1; case TAG_WRITING_CONSOLIDATED_SLEEP_PAGES: pos = primaryFlag ? 5 : 2; default: return; } int blockCount = this.getSignalBlockCountScaled(); this.data.tracker .advance(this, (int) (((double) pos) / numberOfFiles * blockCount - ((double) pos - 1) / numberOfFiles * blockCount)); } private int getNumberOfOutputFiles() { boolean primaryFlag = this.data.stagerData.getParameters().primaryHypnogramFlag; return primaryFlag ? 5 : 2; } }