package org.signalml.plugin.newartifact.logic.tag;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import org.signalml.plugin.data.tag.IPluginTagDef;
import org.signalml.plugin.data.tag.PluginChannelTagDef;
import org.signalml.plugin.data.tag.PluginTagGroup;
import org.signalml.plugin.export.signal.ExportedSignalSelectionType;
import org.signalml.plugin.export.signal.SignalSelectionType;
import org.signalml.plugin.newartifact.data.tag.NewArtifactTagResult;
public class NewArtifactTagMerger {
private final static String NAME = "a";
private final static int STRETCH_FACTOR = 4;
private final static String DESCRIPTION = "artefakt <- Artefakt";
private List<PluginTagGroup> groups;
public NewArtifactTagMerger() {
this.groups = new LinkedList<PluginTagGroup>();
}
public void addTag(NewArtifactTagResult tagResult) {
this.groups.add(tagResult.tagGroup);
}
public NewArtifactTagResult merge() {
return new NewArtifactTagResult(this.mergeGroups(this.groups));
}
private PluginTagGroup mergeGroups(
Collection<PluginTagGroup> groupCollection) {
float stretchFactor = NewArtifactTagMerger.STRETCH_FACTOR;
Collection<IPluginTagDef> tags = new LinkedList<IPluginTagDef>();
ExportedSignalSelectionType type = SignalSelectionType.PAGE;
for (PluginTagGroup group : groupCollection) {
if (group.stretchFactor == stretchFactor) {
tags.addAll(group.tags);
} else {
double scale = stretchFactor / group.stretchFactor;
for (IPluginTagDef tag : group.tags) {
tags.add(new PluginChannelTagDef(tag.getOffset() * scale,
tag.getLength() * scale, tag.getChannel()));
}
}
if (group.type == SignalSelectionType.BLOCK) {
if (type == SignalSelectionType.PAGE) {
type = group.type;
}
} else {
if (group.type == SignalSelectionType.CHANNEL
&& type != SignalSelectionType.CHANNEL) {
type = group.type;
}
}
}
return new PluginTagGroup(NewArtifactTagMerger.NAME, type, tags,
stretchFactor, NewArtifactTagMerger.DESCRIPTION);
}
}