/* TagComparisonResults.java created 2007-11-14
*
*/
package org.signalml.domain.tag;
import static org.signalml.app.util.i18n.SvarogI18n._;
import org.signalml.domain.montage.SourceMontage;
import org.signalml.domain.signal.samplesource.MultichannelSampleSource;
import org.signalml.plugin.export.signal.Tag;
/**
* This class contains {@link TagComparisonResult results} of comparison
* between two sets of tags (two files with tags).
* Results are divided into different types of tags (page-, block-, channel-).
*
* @author Michal Dobaczewski © 2007-2008 CC Otwarte Systemy Komputerowe Sp. z o.o.
*/
public class TagComparisonResults {
/**
* the {@link TagComparisonResult result} of comparison between page tags
*/
private TagComparisonResult pageTagResult;
/**
* the {@link TagComparisonResult result} of comparison between block tags
*/
private TagComparisonResult blockTagResult;
/**
* an array of {@link TagComparisonResult results} of comparison
* between channel tags (one entry for each channel)
*/
private TagComparisonResult[] channelTagResults;
/**
* the length of the signal
*/
private float totalSignalTime;
/**
* the lengths of channels
*/
private float[] totalChannelTimes;
/**
* the names of channels
*/
private String[] channelNames;
/**
* Constructor. Creates a new object with given
* {@link TagComparisonResult results} of comparison of {@link Tag tags}
* of different types.
* @param pageTagResult the result of comparison between page tags
* @param blockTagResult the result of comparison between block tags
* @param channelTagResults an array with results of comparison
* between channel tags (one channel - one result)
*/
public TagComparisonResults(TagComparisonResult pageTagResult, TagComparisonResult blockTagResult, TagComparisonResult[] channelTagResults) {
this.pageTagResult = pageTagResult;
this.blockTagResult = blockTagResult;
this.channelTagResults = channelTagResults;
this.totalChannelTimes = new float[channelTagResults.length];
this.channelNames = new String[channelTagResults.length];
}
/**
* Returns the number of channels.
* @return the number of channels
*/
public int getChannelCount() {
return channelTagResults.length;
}
/**
* Returns the {@link TagComparisonResult result} of comparison between
* tags for channel of a given index.
* @param index the index of the channel
* @return the result of comparison between tags for channel of a given
* index
*/
public TagComparisonResult getChannelResult(int index) {
return channelTagResults[index];
}
/**
* Returns the {@link TagComparisonResult result} of comparison between
* page tags.
* @return the result of comparison between page tags
*/
public TagComparisonResult getPageTagResult() {
return pageTagResult;
}
/**
* Returns the {@link TagComparisonResult result} of comparison between
* block tags.
* @return the result of comparison between block tags
*/
public TagComparisonResult getBlockTagResult() {
return blockTagResult;
}
/**
* Returns an array of {@link TagComparisonResult results} of comparison
* between channel tags.
* @return an array of result of comparison between channel tags
*/
public TagComparisonResult[] getChannelTagResults() {
return channelTagResults;
}
/**
* Returns the length of the signal (in seconds).
* @return the length of the signal (in seconds)
*/
public float getTotalSignalTime() {
return totalSignalTime;
}
/**
* Sets the length of the signal to a given value.
* @param totalSignalTime the length of the signal (in seconds)
*/
public void setTotalSignalTime(float totalSignalTime) {
this.totalSignalTime = totalSignalTime;
}
/**
* Returns an array of lengths of channels.
* @return an array of lengths of channels
*/
public float[] getTotalChannelTimes() {
return totalChannelTimes;
}
/**
* Returns the length of a given channel.
* @param index the index of a channel
* @return the length of a given channel
*/
public float getTotalChannelTime(int index) {
return totalChannelTimes[index];
}
/**
* Sets lengths of channels to given values.
* @param totalChannelTimes an array of lengths of channels to be set
*/
public void setTotalChannelTimes(float[] totalChannelTimes) {
if (totalChannelTimes.length < channelTagResults.length) {
throw new IndexOutOfBoundsException("Array too short");
}
for (int i=0; i<this.totalChannelTimes.length; i++) {
this.totalChannelTimes[i] = totalChannelTimes[i];
}
}
/**
* Sets channels names to given values.
* @param channelNames an array of channels names to be set
*/
public void setChannelNames(String[] channelNames) {
if (channelNames.length < channelTagResults.length) {
throw new IndexOutOfBoundsException("Array too short");
}
for (int i=0; i<this.channelNames.length; i++) {
this.channelNames[i] = channelNames[i];
}
}
/**
* Returns an array of channels names.
* @return an array of channels names
*/
public String[] getChannelNames() {
return channelNames;
}
/**
* Sets the attributes of this TagComparisonResults using given
* parameters. (A {@link SvarogI18n} must be set before using
* this method).
* @param source the {@link MultichannelSampleSource source} of samples
* @param montage the {@link SourceMontage montage} of source channels
*/
public void getParametersFromSampleSource(MultichannelSampleSource source, SourceMontage montage) {
int channelCount = source.getChannelCount();
if (channelCount < channelTagResults.length - 1) { // -1 for SignalSelection.CHANNEL_NULL
throw new IllegalArgumentException("Source not compatible - not enough channels");
}
if (channelCount > channelTagResults.length) {
channelCount = channelTagResults.length;
}
float samplingFrequency = source.getSamplingFrequency();
totalSignalTime = 0F;
for (int i=0; i<channelCount; i++) {
totalChannelTimes[i] = source.getSampleCount(i) / samplingFrequency;
if (totalChannelTimes[i] > totalSignalTime) {
totalSignalTime = totalChannelTimes[i];
}
channelNames[i] = montage.getSourceChannelLabelAt(i);
}
channelNames[channelCount] = _("MULTICHANNEL TAGS");
}
}