/* SegmentedSampleSourceFactory.java created 2008-01-27
*
*/
package org.signalml.domain.signal.space;
import org.signalml.app.view.signal.SampleSourceUtils;
import org.signalml.domain.signal.samplesource.MultichannelSampleSource;
import org.signalml.domain.signal.samplesource.MultichannelSegmentedSampleSource;
import org.signalml.domain.tag.StyledTagSet;
import org.signalml.exception.SanityCheckException;
import org.signalml.plugin.export.signal.SignalSelection;
import org.signalml.plugin.export.signal.SignalSelectionType;
/**
* This class represents the factory (creator) of
* {@link MultichannelSegmentedSampleSource segmented sources} of samples.
* Allows to create continuous (not segmented) and segmented source based on
* Only static shared instance is used.
*
* @author Michal Dobaczewski © 2007-2008 CC Otwarte Systemy Komputerowe Sp. z o.o.
*/
public class SegmentedSampleSourceFactory {
private static SegmentedSampleSourceFactory sharedInstance = null;
/**
* The default constructor.
*/
protected SegmentedSampleSourceFactory() {
}
/**
* Returns (and if necessary also creates) the shared factory
* of segmented sources of samples
* @return the shared factory of segmented sources of samples
*/
public static SegmentedSampleSourceFactory getSharedInstance() {
if (sharedInstance == null) {
synchronized (SegmentedSampleSourceFactory.class) {
if (sharedInstance == null)
sharedInstance = new SegmentedSampleSourceFactory();
}
}
return sharedInstance;
}
/**
* Tries to return the continuous (not segmented
* {@link MultichannelSampleSource source} of samples. If it is not
* possible returns the
* {@link MultichannelSegmentedSampleSource segmented one}.
* @param source the source of samples for the whole signal
* @param signalSpace the {@link SignalSpace description} of the
* parameters of the signal or the part of the signal in the
* {@link MultichannelSampleSource source}
* @param tagSet the set of tagged selections
* @param pageSize the length of the page (in seconds)
* @param blockSize the size of the page (in seconds)
* @return the created source of samples
*/
public MultichannelSampleSource getContinuousOrSegmentedSampleSource(MultichannelSampleSource source, SignalSpace signalSpace, StyledTagSet tagSet, float pageSize, float blockSize) {
if (signalSpace.getTimeSpaceType() == TimeSpaceType.WHOLE_SIGNAL && !signalSpace.isWholeSignalCompletePagesOnly()) {
return getContinuousSampleSource(source, signalSpace, tagSet, pageSize, blockSize);
}
return getSegmentedSampleSource(source, signalSpace, tagSet, pageSize, blockSize);
}
public MultichannelSampleSource getContinuousSampleSource(MultichannelSampleSource source, SignalSpace signalSpace, StyledTagSet tagSet, float pageSize, float blockSize) {
ChannelSpaceType channelSpaceType = signalSpace.getChannelSpaceType();
return new ChannelSubsetSampleSource(source, channelSpaceType == ChannelSpaceType.WHOLE_SIGNAL ? null : signalSpace.getChannelSpace());
}
/**
* Creates the
* {@link MultichannelSegmentedSampleSource segmented source} of
* samples.
* If time space is:
* <ul>
* <li>marker based - creates {@link MarkerSegmentedSampleSource}</li>
* <li>selection based - creates {@link SelectionSegmentedSampleSource}</li>
* <li>whole signal - creates {@link SelectionSegmentedSampleSource}, but
* as a selection uses maximum possible page selection</li>
* </ul>
* @param source the source of samples for the whole signal
* @param signalSpace the {@link SignalSpace description} of the
* parameters of the signal or the part of the signal in the
* {@link MultichannelSampleSource source}
* @param tagSet the set of tagged selections
* @param pageSize the length of the page (in seconds)
* @param blockSize the size of the page (in seconds)
* @return the created source of samples
*/
public MultichannelSegmentedSampleSource getSegmentedSampleSource(MultichannelSampleSource source, SignalSpace signalSpace, StyledTagSet tagSet, float pageSize, float blockSize) {
ChannelSpace channelSpace = null;
if (signalSpace.getChannelSpaceType() == ChannelSpaceType.SELECTED) {
channelSpace = signalSpace.getChannelSpace();
}
TimeSpaceType timeSpaceType = signalSpace.getTimeSpaceType();
MultichannelSegmentedSampleSource sampleSource;
SignalSelection selection;
switch (timeSpaceType) {
case MARKER_BASED :
MarkerTimeSpace markerTimeSpace = signalSpace.getMarkerTimeSpace();
sampleSource = new MarkerSegmentedSampleSource(source, tagSet, markerTimeSpace.getMarkerStyleNames(), markerTimeSpace.getStartTime(), markerTimeSpace.getSegmentLength(), channelSpace);
break;
case SELECTION_BASED :
selection = signalSpace.getSelectionTimeSpace();
sampleSource = new SelectionSegmentedSampleSource(source, selection, signalSpace, pageSize, blockSize);
break;
case WHOLE_SIGNAL :
int minSampleCount = SampleSourceUtils.getMinSampleCount(source);
float time = ((float) minSampleCount) / source.getSamplingFrequency();
selection = new SignalSelection(SignalSelectionType.PAGE, 0F, time);
sampleSource = new SelectionSegmentedSampleSource(source, selection, signalSpace, pageSize, blockSize);
break;
default :
throw new SanityCheckException("Unsupported type [" + timeSpaceType + "]");
}
return sampleSource;
}
}