package org.signalml.plugin.newstager.logic.mgr; import static org.signalml.plugin.i18n.PluginI18n._; import static org.signalml.plugin.i18n.PluginI18n._R; import java.io.File; import java.util.Collection; import java.util.LinkedList; import java.util.List; import java.util.Map; import org.apache.log4j.Logger; import org.signalml.method.MethodExecutionTracker; import org.signalml.plugin.method.logic.AbstractPluginComputationMgrStepTrackerProxy; import org.signalml.plugin.method.logic.IPluginComputationMgrStep; import org.signalml.plugin.method.logic.PluginCheckedThreadGroup; import org.signalml.plugin.method.logic.PluginComputationMgr; import org.signalml.plugin.newstager.data.NewStagerResult; import org.signalml.plugin.newstager.data.NewStagerSignalStatsResult; import org.signalml.plugin.newstager.data.NewStagerSleepStats; import org.signalml.plugin.newstager.data.logic.NewStagerComputationProgressPhase; import org.signalml.plugin.newstager.data.logic.NewStagerMgrData; import org.signalml.plugin.newstager.data.logic.NewStagerMgrStepData; import org.signalml.plugin.newstager.data.logic.NewStagerTagWriteStepResult; public class NewStagerComputationMgr extends PluginComputationMgr<NewStagerMgrData, NewStagerResult> { protected static final Logger logger = Logger .getLogger(NewStagerComputationMgr.class); protected class TrackerProxy extends AbstractPluginComputationMgrStepTrackerProxy<NewStagerComputationProgressPhase> { public TrackerProxy(PluginCheckedThreadGroup threadGroup, MethodExecutionTracker tracker) { super(threadGroup, tracker); } @Override public void advance(IPluginComputationMgrStep step, int tick) { this.tracker.tick(0, tick); } @Override public boolean isRequestingAbort() { boolean result = super.isRequestingAbort(); if (result) { this.setProgressPhase(NewStagerComputationProgressPhase.ABORT_PHASE); } return result; } @Override protected String getMessageForPhase( NewStagerComputationProgressPhase phase, Object... arguments) { switch (phase) { case SIGNAL_STATS_PREPARE_PHASE: return _("Preparing"); case SIGNAL_STATS_SOURCE_FILE_INITIAL_READ_PHASE: return _("Reading source data"); case SIGNAL_STATS_BLOCK_COMPUTATION_PHASE: return _R("Computing signal statistics (block {0} of {1})", arguments); case BOOK_FILE_INITIAL_READ_PHASE: return _("Reading book file"); case BOOK_PROCESSING_PHASE: return _R("Processing book atoms (segment {0} of {1})", arguments); case TAG_WRITING_PREPARE_PHASE: return _("Preparing to write tag files"); case TAG_WRITING_ALPHA: return _("Writing primary hypnogram tags (alpha)"); case TAG_WRITING_DELTA: return _("Writing primary hypnogram tags (delta)"); case TAG_WRITING_SPINDLE: return _("Writing primary hypnogram tags (spindle)"); case TAG_WRITING_SLEEP_PAGES: return _("Writing sleep tags"); case TAG_WRITING_CONSOLIDATED_SLEEP_PAGES: return _("Writing consolidated sleep tags"); case ABORT_PHASE: return _("Aborting"); default: return null; } } } private List<IPluginComputationMgrStep> steps; private TrackerProxy trackerProxy; @Override protected Collection<IPluginComputationMgrStep> prepareStepChain() { this.steps = new LinkedList<IPluginComputationMgrStep>(); this.trackerProxy = new TrackerProxy(this.getThreadGroup(), tracker); NewStagerMgrStepData data = new NewStagerMgrStepData( this.data.stagerData, this.data.constants, this.trackerProxy, this.getThreadFactory()); this.steps.add(new NewStagerSignalStatsStep(data)); this.steps.add(new NewStagerBookProcessStep(data)); this.steps.add(new NewStagerTagWriteStep(data)); return this.steps; } @Override protected void initializeRun( Map<IPluginComputationMgrStep, Integer> stepTicks) { for (Map.Entry<IPluginComputationMgrStep, Integer> entry : stepTicks .entrySet()) { this.trackerProxy.setTickerLimit(entry.getKey(), entry.getValue()); } } @Override protected NewStagerResult prepareComputationResult() { if (this.steps.size() != 3) { return null; } NewStagerTagWriteStepResult castedWriterResult; NewStagerSignalStatsResult castedStatsResult; try { castedStatsResult = (NewStagerSignalStatsResult) this.stepResults.get(this.steps.get(0)); castedWriterResult = (NewStagerTagWriteStepResult) this.stepResults .get(this.steps.get(2)); } catch (ClassCastException e) { logger.error("Unexpected step result class"); return null; } NewStagerSleepStats thresholds = castedStatsResult.signalStatCoeffs; NewStagerResult result = new NewStagerResult(); result.setTagFile(new File(castedWriterResult.primaryTagFilePath)); result.setAlphaThr(thresholds.alphaThreshold); result.setDeltaThr(thresholds.deltaThreshold); result.setSpindleThr(thresholds.spindleThreshold); result.setEmgTone(thresholds.toneMThreshold); return result; } }