package fr.orsay.lri.varna.models.treealign;
import java.util.ArrayList;
import java.util.List;
/**
* In this model, nodes are either:
* 1. a couple of paired bases, and in that case they may have children,
* in this case singleNode is true
* 2. a single base that comes from a broken base pair
* (broken during planarization), without children,
* in this case singleNode is true
* 3. a list of consecutive non-paired bases, without children.
* in this case singleNode is false
* Note that case 2 happens only if original sequences contained
* pseudoknots, otherwise this case can be ignored.
*
* @author Raphael Champeimont
*
*/
public class RNANodeValue2 implements GraphvizDrawableNodeValue {
/**
* Says whether we have a single node or a list of nodes.
*/
private boolean singleNode = true;
/**
* Defined if singleNode is true.
*/
private RNANodeValue node;
/**
* Defined if singleNode is false;
*/
private List<RNANodeValue> nodes;
public RNANodeValue2(boolean singleNode) {
this.singleNode = singleNode;
if (singleNode) {
node = new RNANodeValue();
} else {
nodes = new ArrayList<RNANodeValue>();
}
}
/**
* In case of a single node, return it.
* Will throw RNANodeValue2WrongTypeException if singleNode = false.
*/
public RNANodeValue getNode() {
if (singleNode) {
return node;
} else {
throw (new RNANodeValue2WrongTypeException());
}
}
public void setNode(RNANodeValue node) {
if (singleNode) {
this.node = node;
} else {
throw (new RNANodeValue2WrongTypeException());
}
}
/**
* In case of multiple nodes, return them.
* Will throw RNANodeValue2WrongTypeException if singleNode = true.
*/
public List<RNANodeValue> getNodes() {
if (!singleNode) {
return nodes;
} else {
throw (new RNANodeValue2WrongTypeException());
}
}
/**
* In case of multiple nodes, return the sequence of nucleotides.
*/
public char[] computeSequence() {
if (!singleNode) {
final int n = nodes.size();
char[] sequence = new char[n];
for (int i=0; i<n; i++) {
sequence[i] = nodes.get(i).getLeftNucleotide().charAt(0);
}
return sequence;
} else {
throw (new RNANodeValue2WrongTypeException());
}
}
public void setNodes(List<RNANodeValue> nodes) {
if (!singleNode) {
this.nodes = nodes;
} else {
throw (new RNANodeValue2WrongTypeException());
}
}
public boolean isSingleNode() {
return singleNode;
}
public String toString() {
return toGraphvizNodeName();
}
public String toGraphvizNodeName() {
if (singleNode) {
return node.toGraphvizNodeName();
} else {
String s = "";
for (RNANodeValue node: nodes) {
if (s != "") {
s += " ";
}
s += node.toGraphvizNodeName();
}
return s;
}
}
}