Updated with latest from mchmmer branch
[jalview.git] / src / MCview / PDBChain.java
index 8285d88..29b994e 100755 (executable)
@@ -41,11 +41,6 @@ public class PDBChain
 {
   public static final String RESNUM_FEATURE = "RESNUM";
 
-  /**
-   * SequenceFeature group for PDB File features added to sequences
-   */
-  private static final String PDBFILEFEATURE = "PDBFile";
-
   private static final String IEASTATUS = "IEA:jalview";
 
   public String id;
@@ -83,10 +78,10 @@ public class PDBChain
 
   public String pdbid = "";
 
-  public PDBChain(String pdbid, String id)
+  public PDBChain(String thePdbid, String theId)
   {
-    this.pdbid = pdbid == null ? pdbid : pdbid.toLowerCase();
-    this.id = id;
+    this.pdbid = thePdbid == null ? thePdbid : thePdbid.toLowerCase();
+    this.id = theId;
   }
 
   /**
@@ -167,6 +162,50 @@ public class PDBChain
   }
 
   /**
+   * Annotate the residues with their corresponding positions in s1 using the
+   * alignment in as NOTE: This clears all atom.alignmentMapping values on the
+   * structure.
+   * 
+   * @param as
+   * @param s1
+   */
+  public void makeExactMapping(StructureMapping mapping, SequenceI s1)
+  {
+    // first clear out any old alignmentMapping values:
+    for (Atom atom : atoms)
+    {
+      atom.alignmentMapping = -1;
+    }
+    SequenceI ds = s1;
+    while (ds.getDatasetSequence() != null)
+    {
+      ds = ds.getDatasetSequence();
+    }
+    int pdboffset = 0;
+    for (Residue res : residues)
+    {
+      // res.number isn't set correctly for discontinuous/mismapped residues
+      int seqpos = mapping.getSeqPos(res.atoms.get(0).resNumber);
+      char strchar = sequence.getCharAt(pdboffset++);
+      if (seqpos == StructureMapping.UNASSIGNED_VALUE)
+      {
+        continue;
+      }
+      char seqchar = ds.getCharAt(seqpos - ds.getStart());
+
+      boolean sameResidue = Comparison.isSameResidue(
+              seqchar, strchar, false);
+      if (sameResidue)
+      {
+        for (Atom atom : res.atoms)
+        {
+          atom.alignmentMapping = seqpos - 1;
+        }
+      }
+    }
+  }
+
+  /**
    * Copies over the RESNUM seqfeatures from the internal chain sequence to the
    * mapped sequence
    * 
@@ -211,7 +250,8 @@ public class PDBChain
         SequenceFeature tx = new SequenceFeature(feature, newBegin, newEnd,
                 feature.getFeatureGroup(), feature.getScore());
         tx.setStatus(status
-                + ((tx.getStatus() == null || tx.getStatus().length() == 0) ? ""
+                + ((tx.getStatus() == null || tx.getStatus().length() == 0)
+                        ? ""
                         : ":" + tx.getStatus()));
         if (tx.begin != 0 && tx.end != 0)
         {
@@ -346,9 +386,9 @@ public class PDBChain
 
       // Add inserted residues as features to the base residue
       Atom currAtom = resAtoms.get(0);
-      if (currAtom.insCode != ' '
-              && !residues.isEmpty()
-              && residues.lastElement().atoms.get(0).resNumber == currAtom.resNumber)
+      if (currAtom.insCode != ' ' && !residues.isEmpty()
+              && residues.lastElement().atoms
+                      .get(0).resNumber == currAtom.resNumber)
       {
         String desc = currAtom.resName + ":" + currAtom.resNumIns + " "
                 + pdbid + id;
@@ -373,20 +413,21 @@ public class PDBChain
         resAnnotation.addElement(new Annotation(tmpat.tfactor));
         // Keep totting up the sequence
 
-        if ((symbol = ResidueProperties.getAA3Hash().get(tmpat.resName)) == null)
+        if ((symbol = ResidueProperties.getAA3Hash()
+                .get(tmpat.resName)) == null)
         {
           String nucname = tmpat.resName.trim();
           // use the aaIndex rather than call 'toLower' - which would take a bit
           // more time.
           deoxyn = nucname.length() == 2
-                  && ResidueProperties.aaIndex[nucname.charAt(0)] == ResidueProperties.aaIndex['D'];
+                  && ResidueProperties.aaIndex[nucname
+                          .charAt(0)] == ResidueProperties.aaIndex['D'];
           if (tmpat.name.equalsIgnoreCase("CA")
                   || ResidueProperties.nucleotideIndex[nucname
                           .charAt((deoxyn ? 1 : 0))] == -1)
           {
-            char r = ResidueProperties
-                    .getSingleCharacterCode(ResidueProperties
-                            .getCanonicalAminoAcid(tmpat.resName));
+            char r = ResidueProperties.getSingleCharacterCode(
+                    ResidueProperties.getCanonicalAminoAcid(tmpat.resName));
             seq.append(r == '0' ? 'X' : r);
             // System.err.println("PDBReader:Null aa3Hash for " +
             // tmpat.resName);
@@ -402,8 +443,8 @@ public class PDBChain
         {
           if (nucleotide)
           {
-            System.err
-                    .println("Warning: mixed nucleotide and amino acid chain.. its gonna do bad things to you!");
+            System.err.println(
+                    "Warning: mixed nucleotide and amino acid chain.. its gonna do bad things to you!");
           }
           seq.append(ResidueProperties.aa[((Integer) symbol).intValue()]);
         }
@@ -515,8 +556,8 @@ public class PDBChain
       try
       {
         index = ResidueProperties.aa3Hash.get(b.at1.resName).intValue();
-        b.startCol = cs.findColour(ResidueProperties.aa[index].charAt(0),
-                0, null, null, 0f);
+        b.startCol = cs.findColour(ResidueProperties.aa[index].charAt(0), 0,
+                null, null, 0f);
 
         index = ResidueProperties.aa3Hash.get(b.at2.resName).intValue();
         b.endCol = cs.findColour(ResidueProperties.aa[index].charAt(0), 0,
@@ -553,6 +594,12 @@ public class PDBChain
   {
     SequenceI sq = mapping.getSequence();
     SequenceI dsq = sq;
+    if (sqmpping == null)
+    {
+      // SIFTS mappings are recorded in the StructureMapping object...
+
+      sqmpping = mapping.getSeqToPdbMapping();
+    }
     if (sq != null)
     {
       while (dsq.getDatasetSequence() != null)
@@ -566,8 +613,8 @@ public class PDBChain
 
         for (AlignmentAnnotation ana : shadow.getAnnotation())
         {
-          List<AlignmentAnnotation> transfer = sq.getAlignmentAnnotations(
-                  ana.getCalcId(), ana.label);
+          List<AlignmentAnnotation> transfer = sq
+                  .getAlignmentAnnotations(ana.getCalcId(), ana.label);
           if (transfer == null || transfer.size() == 0)
           {
             ana = new AlignmentAnnotation(ana);
@@ -608,7 +655,8 @@ public class PDBChain
         // Useful for debugging mappings - adds annotation for mapped position
         float min = -1, max = 0;
         Annotation[] an = new Annotation[sq.getEnd() - sq.getStart() + 1];
-        for (int i = sq.getStart(), j = sq.getEnd(), k = 0; i <= j; i++, k++)
+        for (int i = sq.getStart(), j = sq
+                .getEnd(), k = 0; i <= j; i++, k++)
         {
           int prn = mapping.getPDBResNum(k + 1);