import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Hashtable;
+import java.util.Map;
+import java.util.Map.Entry;
import fr.orsay.lri.varna.models.rna.RNA;
// System.out.println("featuregroup " + _rnasecstr[0].getFeatureGroup());
}
- public java.util.Hashtable sequenceMapping;
+ public java.util.Hashtable<Integer, Annotation> sequenceMapping;
/** DOCUMENT ME!! */
public float graphMin;
{
if (sequenceRef != null)
{
+ boolean rIsDs=sequenceRef.getDatasetSequence()==null,tIsDs=sequenceI.getDatasetSequence()==null;
if (sequenceRef != sequenceI
- && !sequenceRef.equals(sequenceI)
- && sequenceRef.getDatasetSequence() != sequenceI
+ && (rIsDs && !tIsDs && sequenceRef != sequenceI
.getDatasetSequence())
+ && (!rIsDs && tIsDs && sequenceRef.getDatasetSequence() != sequenceI)
+ && (!rIsDs && !tIsDs && sequenceRef.getDatasetSequence() != sequenceI
+ .getDatasetSequence())
+ && !sequenceRef.equals(sequenceI))
{
// if sequenceRef isn't intersecting with sequenceI
// throw away old mapping and reconstruct.
{
return isrna;
}
+
+ /**
+ * transfer annotation to the given sequence using the given mapping from the
+ * current positions or an existing sequence mapping
+ *
+ * @param sq
+ * @param sp2sq
+ * map involving sq as To or From
+ */
+ public void liftOver(SequenceI sq, Mapping sp2sq)
+ {
+ if (sp2sq.getMappedWidth() != sp2sq.getWidth())
+ {
+ // TODO: employ getWord/MappedWord to transfer annotation between cDNA and Protein reference frames
+ throw new Error("liftOver currently not implemented for transfer of annotation between different types of seqeunce");
+ }
+ boolean mapIsTo = (sp2sq != null) ? (sp2sq.getTo() == sq || sp2sq
+ .getTo() == sq.getDatasetSequence()) : false;
+
+ // TODO build a better annotation element map and get rid of annotations[]
+ Hashtable<Integer, Annotation> mapForsq = new Hashtable();
+ if (sequenceMapping != null)
+ {
+ if (sp2sq != null)
+ {
+ for (Entry<Integer, Annotation> ie : sequenceMapping.entrySet())
+ {
+ Integer mpos = Integer.valueOf(mapIsTo ? sp2sq
+ .getMappedPosition(ie.getKey()) : sp2sq.getPosition(ie
+ .getKey()));
+ if (mpos >= sq.getStart() && mpos <= sq.getEnd())
+ {
+ mapForsq.put(mpos, ie.getValue());
+ }
+ }
+ sequenceMapping = mapForsq;
+ sequenceRef = sq;
+ adjustForAlignment();
+ }
+ else
+ {
+ // trim positions
+ }
+ }
+
+ }
}