/* SignalSelection.java created 2007-10-03
*
*/
package org.signalml.plugin.export.signal;
import java.io.Serializable;
/**
* This class represents a selected part of a signal.
* Contains the {@link SignalSelectionType type} of selection,
* the starting position in time, the number of selected channel and
* the length of the selection.
*
* @author Michal Dobaczewski © 2007-2008 CC Otwarte Systemy Komputerowe Sp. z o.o.
*/
public class SignalSelection implements Serializable, ExportedSignalSelection {
private static final long serialVersionUID = 1L;
/**
* type of signal selection
*/
protected SignalSelectionType type;
/**
* position where selection starts >= 0
*/
protected double position;
/**
* length of selection in seconds >= 0
*/
protected double length;
/**
* Number of selected channel. (CHANNEL_NULL when no channel is selected -
* if no channel is selected then the selection covers all channels).
*/
protected int channel;
/**
* constructor creating selection of a given type
* @param type type of selection
* @throws NullPointerException if no type given
*
*/
public SignalSelection(SignalSelectionType type) {
if (type == null) {
throw new NullPointerException("No type");
}
this.type = type;
this.channel = CHANNEL_NULL;
}
/**
* constructor
* @param type type of selection
* @param position position where selection starts
* @param length length of selection in seconds
* @throws NullPointerException if no type given
*/
public SignalSelection(SignalSelectionType type, double position, double length) {
if (type == null) {
throw new NullPointerException("No type");
}
this.type = type;
this.position = position;
this.length = length;
this.channel = CHANNEL_NULL;
}
/**
* constructor
* @param type type of selection
* @param position position where selection starts
* @param length length of selection in seconds
* @param channel number of selected channel
* CHANNEL_NULL when no channel is selected
*/
public SignalSelection(SignalSelectionType type, double position, double length, int channel) {
this.type = type;
this.position = position;
this.length = length;
this.channel = ((type != SignalSelectionType.CHANNEL || channel < 0) ? CHANNEL_NULL : channel);
}
/**
* copy constructor
* @param selection selection to be copied
*/
public SignalSelection(SignalSelection selection) {
this.position = selection.position;
this.length = selection.length;
this.channel = selection.channel;
this.type = selection.type;
}
/**
* Copy constructor. Creates a selection using the parameters obtained from
* given object
* @param selection the selections which parameters will be copied
*/
public SignalSelection(ExportedSignalSelection selection) {
this.position = selection.getPosition();
this.length = selection.getLength();
this.channel = selection.getChannel();
this.type = SignalSelectionType.typeByName(selection.getType().getName());
}
/**
* sets parameters of selection
* @param position position where selection starts
* @param length length of selection in seconds
* @param channel number of selected channel
* CHANNEL_NULL when no channel is selected
*/
public void setParameters(double position, double length, int channel) {
this.position = position;
this.length = length;
this.channel = ((type != SignalSelectionType.CHANNEL || channel < 0) ? CHANNEL_NULL : channel);
}
/**
* sets parameters of selection
* @param position position where selection starts
* @param length length of selection in seconds
*/
public void setParameters(double position, double length) {
this.position = position;
this.length = length;
}
/**
*
* @return type of selection
*/
@Override
public SignalSelectionType getType() {
return type;
}
/**
*
* @return position where selection starts
*/
@Override
public double getPosition() {
return position;
}
/*
*
* @param position position where selection starts
*/
public void setPosition(double position) {
this.position = position;
}
/**
*
* @return length of selection in seconds
*/
@Override
public double getLength() {
return length;
}
/**
*
* @param length length of selection in seconds
*/
public void setLength(double length) {
this.length = length;
}
/**
* returns position of the middle of selection
* @return middle of selection
*/
@Override
public double getCenterPosition() {
return position + length / 2;
}
/**
* returns position where selection is ending
* @return position where selection is ending
*/
@Override
public double getEndPosition() {
return position + length;
}
/**
*
* @return number of selected channel
* CHANNEL_NULL when no channel is selected
*/
@Override
public int getChannel() {
return channel;
}
/**
*
* @param channel number of selected channel
* CHANNEL_NULL when no channel is selected
*/
public void setChannel(int channel) {
this.channel = ((type != SignalSelectionType.CHANNEL || channel < 0) ? CHANNEL_NULL : channel);
}
/**
* Assuming that segment has a given size finds that one where selection starts
* @param segmentSize size of a segment
* @return number of the segment where selection starts
*/
@Override
public int getStartSegment(float segmentSize) {
return (int)(position / segmentSize);
}
/**
* Assuming that segment has a given size finds that one where selection ends
* @param segmentSize size of a segment
* @return number of the segment where selection ends
*/
// this is exclusive (returns first segment after the segment in which the selection ends) <- ???
@Override
public int getEndSegment(float segmentSize) {
return (int)((position+length) / segmentSize);
}
/**
* Computes how many segments of given size would fit in selection
* @param segmentSize size of a segment
* @return length of selection in segments
*/
@Override
public int getSegmentLength(float segmentSize) {
return (int)(length / segmentSize);
}
/**
* Compares the current SignalSelection object with another SignalSelection object.
* @param s the SignalSelection that the current SignalSelection is to be compared with.
* @return true if the two SignalSelection objects are equal, otherwise false.
*/
public boolean equals(SignalSelection s) {
if (type != s.type) {
return false;
}
if (position != s.position) {
return false;
}
if (length != s.length) {
return false;
}
if (channel != s.channel) {
return false;
}
return true;
}
/**
* Compares the current SignalSelection object with another object. If obj is not of type SignalSelection false is returned
* @param obj the object that the current SignalSelection is to be compared with.
* @return true if the two objects are equal, otherwise false.
*/
@Override
public boolean equals(Object obj) {
if (obj == null || !(obj instanceof SignalSelection)) {
return false;
}
return equals((SignalSelection) obj);
}
/**
* Checks if intersection of current SignalSelection with another SignalSelection is nonempty
* @param selection the SignalSelection that the current SignalSelection is to be intersect with
* @return true if the two SignalSelection objects overlap, otherwise false.
*/
public boolean overlaps(ExportedSignalSelection selection) {
double sPosition = selection.getPosition();
double sEndPosition = sPosition + selection.getLength();
if (sPosition <= position && sEndPosition <= position) {
return false;
}
double endPosition = position + length;
if (sPosition >= endPosition && sEndPosition >= endPosition) {
return false;
}
return true;
}
/* (non-Javadoc)
* @see org.signalml.plugin.export.signal.ExportedSignalSelection#equals(org.signalml.plugin.export.signal.ExportedSignalSelection)
*/
@Override
public boolean equals(ExportedSignalSelection s) {
if (type != SignalSelectionType.typeByName(s.getType().getName())) {
return false;
}
if (position != s.getPosition()) {
return false;
}
if (length != s.getLength()) {
return false;
}
if (channel != s.getChannel()) {
return false;
}
return true;
}
@Override
public double getTimestamp() {
//now - for offline signal selections, their timestamp is
//equal to their position - this may be changed in the
//future
return getPosition();
}
}