import java.util.Enumeration;
import java.util.Hashtable;
-import java.util.Vector;
/**
* DOCUMENT ME!
threshold = new GraphLine(annotation.threshold);
}
if (annotation.annotations!=null) {
- Vector anvec = new Vector();
Annotation[] ann = annotation.annotations;
this.annotations = new Annotation[ann.length];
for (int i=0; i<ann.length; i++) {
annotations[i] = new Annotation(ann[i]);
- anvec.addElement(ann[i]); // for lookup if sequenceMapping exists.
};
if (annotation.sequenceRef!=null) {
this.sequenceRef = annotation.sequenceRef;
if (annotation.sequenceMapping!=null)
{
+ Integer p=null;
sequenceMapping = new Hashtable();
Enumeration pos=annotation.sequenceMapping.keys();
while (pos.hasMoreElements()) {
- Integer p = (Integer) pos.nextElement();
- Annotation a = (Annotation) sequenceMapping.get(p);
- sequenceMapping.put(p, annotations[anvec.indexOf(a)]);
+ // could optimise this!
+ p = (Integer) pos.nextElement();
+ Annotation a = (Annotation) annotation.sequenceMapping.get(p);
+ if (a==null)
+ {
+ continue;
+ }
+ for (int i=0; i<ann.length; i++)
+ {
+ if (ann[i]==a)
+ {
+ sequenceMapping.put(p, annotations[i]);
+ }
+ }
}
- anvec.removeAllElements();
} else {
this.sequenceMapping = null;
}
}
/**
+ * clip the annotation to the columns given by startRes and endRes (inclusive)
+ * and prune any existing sequenceMapping to just those columns.
+ * @param startRes
+ * @param endRes
+ */
+ public void restrict(int startRes, int endRes)
+ {
+ Annotation[] temp = new Annotation[endRes-startRes+1];
+ System.arraycopy(annotations, startRes, temp, 0, endRes-startRes+1);
+ if (sequenceRef!=null) {
+ // Clip the mapping, if it exists.
+ int spos = sequenceRef.findPosition(startRes);
+ int epos = sequenceRef.findPosition(endRes);
+ if (sequenceMapping!=null)
+ {
+ Hashtable newmapping = new Hashtable();
+ Enumeration e = sequenceMapping.keys();
+ while (e.hasMoreElements())
+ {
+ Integer pos = (Integer) e.nextElement();
+ if (pos.intValue()>=spos && pos.intValue()<=epos)
+ {
+ newmapping.put(pos, sequenceMapping.get(pos));
+ }
+ }
+ sequenceMapping.clear();
+ sequenceMapping = newmapping;
+ }
+ }
+ annotations=temp;
+ }
+ /**
+ * set the annotation row to be at least length Annotations
+ * @param length minimum number of columns required in the annotation row
+ * @return false if the annotation row is greater than length
+ */
+ public boolean padAnnotation(int length) {
+ if (annotations==null)
+ {
+ annotations = new Annotation[length];
+ return true;
+ }
+ if (annotations.length<length)
+ {
+ Annotation[] na = new Annotation[length];
+ System.arraycopy(annotations, 0, na, 0, annotations.length);
+ annotations = na;
+ return true;
+ }
+ return annotations.length>length;
+
+ }
+
+ /**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public void setSequenceRef(SequenceI sequenceI)
{
- if (sequenceI!=null) {
- if (sequenceRef!=null) {
- if (sequenceRef!=sequenceI && !sequenceRef.equals(sequenceI)) {
+ if (sequenceI != null)
+ {
+ if (sequenceRef != null)
+ {
+ if (sequenceRef != sequenceI && !sequenceRef.equals(sequenceI) && sequenceRef.getDatasetSequence()!=sequenceI.getDatasetSequence())
+ {
+ // if sequenceRef isn't intersecting with sequenceI
// throw away old mapping and reconstruct.
- sequenceRef=null;
- if (sequenceMapping!=null)
+ sequenceRef = null;
+ if (sequenceMapping != null)
{
- sequenceMapping=null;
+ sequenceMapping = null;
// compactAnnotationArray();
}
- createSequenceMapping(sequenceI, 1,true);
+ createSequenceMapping(sequenceI, 1, true);
adjustForAlignment();
- } else {
+ }
+ else
+ {
// Mapping carried over
sequenceRef = sequenceI;
}
- } else {
+ }
+ else
+ {
// No mapping exists
createSequenceMapping(sequenceI, 1, true);
adjustForAlignment();
}
- } else {
+ }
+ else
+ {
// throw away the mapping without compacting.
- sequenceMapping=null;
+ sequenceMapping = null;
sequenceRef = null;
}
}