import jalview.datamodel.AlignmentAnnotation;
import jalview.datamodel.SequenceI;
+import java.util.ArrayList;
import java.util.HashMap;
+import java.util.List;
public class StructureMapping
{
// and atomNo
HashMap<Integer, int[]> mapping;
+ /**
+ * Constructor
+ *
+ * @param seq
+ * @param pdbfile
+ * @param pdbid
+ * @param chain
+ * @param mapping
+ * a map from sequence to two values, { resNo, atomNo } in the
+ * structure
+ * @param mappingDetails
+ */
public StructureMapping(SequenceI seq, String pdbfile, String pdbid,
String chain, HashMap<Integer, int[]> mapping,
String mappingDetails)
}
/**
+ * Returns a (possibly empty) list of [start, end] residue positions in the
+ * mapped structure, corresponding to the given range of sequence positions
+ *
+ * @param fromSeqPos
+ * @param toSeqPos
+ * @return
+ */
+ public List<int[]> getPDBResNumRanges(int fromSeqPos, int toSeqPos)
+ {
+ List<int[]> result = new ArrayList<int[]>();
+ int startRes = -1;
+ int endRes = -1;
+
+ for (int i = fromSeqPos; i <= toSeqPos; i++)
+ {
+ int resNo = getPDBResNum(i);
+ if (resNo == UNASSIGNED_VALUE)
+ {
+ continue; // no mapping from this sequence position
+ }
+ if (startRes == -1)
+ {
+ startRes = resNo;
+ endRes = resNo;
+ }
+ if (resNo >= startRes && resNo <= endRes)
+ {
+ // within the current range - no change
+ continue;
+ }
+ if (resNo == startRes - 1)
+ {
+ // extend beginning of current range
+ startRes--;
+ continue;
+ }
+ if (resNo == endRes + 1)
+ {
+ // extend end of current range
+ endRes++;
+ continue;
+ }
+
+ /*
+ * resNo is not within or contiguous with last range,
+ * so write out the last range
+ */
+ result.add(new int[] { startRes, endRes });
+ startRes = resNo;
+ endRes = resNo;
+ }
+
+ /*
+ * and add the last range
+ */
+ if (startRes != -1)
+ {
+ result.add(new int[] { startRes, endRes });
+ }
+
+ return result;
+ }
+
+ /**
*
* @param pdbResNum
* @return -1 or the corresponding sequence position for a pdb residue number
--- /dev/null
+package jalview.structure;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertTrue;
+
+import java.util.HashMap;
+import java.util.List;
+
+import org.testng.annotations.Test;
+
+public class StructureMappingTest
+{
+ @Test(groups = "Functional")
+ public void testgetPDBResNumRanges()
+ {
+ HashMap<Integer, int[]> map = new HashMap<Integer, int[]>();
+
+ StructureMapping mapping = new StructureMapping(null, null, null, null,
+ map, null);
+
+ List<int[]> ranges = mapping.getPDBResNumRanges(1, 2);
+ assertTrue(ranges.isEmpty());
+
+ map.put(1, new int[] { 12, 20 }); // 1 maps to 12
+ ranges = mapping.getPDBResNumRanges(2, 3);
+ assertTrue(ranges.isEmpty());
+ ranges = mapping.getPDBResNumRanges(1, 2);
+ assertEquals(ranges.size(), 1);
+ assertEquals(ranges.get(0)[0], 12);
+ assertEquals(ranges.get(0)[1], 12);
+
+ map.put(2, new int[] { 13, 20 }); // 2 maps to 13
+ ranges = mapping.getPDBResNumRanges(1, 2);
+ assertEquals(ranges.size(), 1);
+ assertEquals(ranges.get(0)[0], 12);
+ assertEquals(ranges.get(0)[1], 13);
+
+ map.put(3, new int[] { 15, 20 }); // 3 maps to 15 - break
+ ranges = mapping.getPDBResNumRanges(1, 5);
+ assertEquals(ranges.size(), 2);
+ assertEquals(ranges.get(0)[0], 12);
+ assertEquals(ranges.get(0)[1], 13);
+ assertEquals(ranges.get(1)[0], 15);
+ assertEquals(ranges.get(1)[1], 15);
+ }
+}