JAL-3253 miscellaneous tidying up before merge to JS-develop
[jalview.git] / src / jalview / ws / sifts / SiftsClient.java
index e1b539e..b45d007 100644 (file)
@@ -71,8 +71,8 @@ import javax.xml.bind.Unmarshaller;
 import javax.xml.stream.XMLInputFactory;
 import javax.xml.stream.XMLStreamReader;
 
-import MCview.Atom;
-import MCview.PDBChain;
+import mc_view.Atom;
+import mc_view.PDBChain;
 
 public class SiftsClient implements SiftsClientI
 {
@@ -82,6 +82,22 @@ public class SiftsClient implements SiftsClientI
    */
   private static File mockSiftsFile;
 
+  private static final int BUFFER_SIZE = 4096;
+
+  public static final int UNASSIGNED = Integer.MIN_VALUE;
+
+  private static final int PDB_RES_POS = 0;
+
+  private static final int PDB_ATOM_POS = 1;
+
+  private static final int PDBE_POS = 2;
+
+  private static final String NOT_OBSERVED = "Not_Observed";
+
+  protected static final String SIFTS_FTP_BASE_URL = "http://ftp.ebi.ac.uk/pub/databases/msd/sifts/xml/";
+
+  protected final static String NEWLINE = System.lineSeparator();
+
   private Entry siftsEntry;
 
   private StructureFile pdb;
@@ -100,20 +116,6 @@ public class SiftsClient implements SiftsClientI
    */
   private jalview.datamodel.Mapping seqFromPdbMapping;
 
-  private static final int BUFFER_SIZE = 4096;
-
-  public static final int UNASSIGNED = Integer.MIN_VALUE;
-
-  private static final int PDB_RES_POS = 0;
-
-  private static final int PDB_ATOM_POS = 1;
-
-  private static final String NOT_OBSERVED = "Not_Observed";
-
-  private static final String SIFTS_FTP_BASE_URL = "http://ftp.ebi.ac.uk/pub/databases/msd/sifts/xml/";
-
-  private final static String NEWLINE = System.lineSeparator();
-
   private String curSourceDBRef;
 
   private HashSet<String> curDBRefAccessionIdsString;
@@ -398,7 +400,7 @@ public class SiftsClient implements SiftsClientI
   @Override
   public HashSet<String> getAllMappingAccession()
   {
-    HashSet<String> accessions = new HashSet<String>();
+    HashSet<String> accessions = new HashSet<>();
     List<Entity> entities = siftsEntry.getEntity();
     for (Entity entity : entities)
     {
@@ -458,14 +460,14 @@ public class SiftsClient implements SiftsClientI
   public HashMap<Integer, int[]> getGreedyMapping(String entityId,
           SequenceI seq, java.io.PrintStream os) throws SiftsException
   {
-    List<Integer> omitNonObserved = new ArrayList<Integer>();
-    int nonObservedShiftIndex = 0;
+    List<Integer> omitNonObserved = new ArrayList<>();
+    int nonObservedShiftIndex = 0,pdbeNonObserved=0;
     // System.out.println("Generating mappings for : " + entityId);
     Entity entity = null;
     entity = getEntityById(entityId);
     String originalSeq = AlignSeq.extractGaps(
             jalview.util.Comparison.GapChars, seq.getSequenceAsString());
-    HashMap<Integer, int[]> mapping = new HashMap<Integer, int[]>();
+    HashMap<Integer, int[]> mapping = new HashMap<>();
     DBRefEntryI sourceDBRef;
     sourceDBRef = getValidSourceDBRef(seq);
     // TODO ensure sequence start/end is in the same coordinate system and
@@ -477,7 +479,7 @@ public class SiftsClient implements SiftsClientI
       seqCoordSys = CoordinateSys.PDB;
     }
 
-    HashSet<String> dbRefAccessionIdsString = new HashSet<String>();
+    HashSet<String> dbRefAccessionIdsString = new HashSet<>();
     for (DBRefEntry dbref : seq.getDBRefs())
     {
       dbRefAccessionIdsString.add(dbref.getAccessionId().toLowerCase());
@@ -487,10 +489,10 @@ public class SiftsClient implements SiftsClientI
     curDBRefAccessionIdsString = dbRefAccessionIdsString;
     curSourceDBRef = sourceDBRef.getAccessionId();
 
-    TreeMap<Integer, String> resNumMap = new TreeMap<Integer, String>();
+    TreeMap<Integer, String> resNumMap = new TreeMap<>();
     List<Segment> segments = entity.getSegment();
     SegmentHelperPojo shp = new SegmentHelperPojo(seq, mapping, resNumMap,
-            omitNonObserved, nonObservedShiftIndex);
+            omitNonObserved, nonObservedShiftIndex,pdbeNonObserved);
     processSegments(segments, shp);
     try
     {
@@ -628,6 +630,7 @@ public class SiftsClient implements SiftsClientI
       List<Residue> residues = segment.getListResidue().getResidue();
       for (Residue residue : residues)
       {
+        boolean isObserved = isResidueObserved(residue);
         int pdbeIndex = getLeadingIntegerValue(residue.getDbResNum(),
                 UNASSIGNED);
         int currSeqIndex = UNASSIGNED;
@@ -638,6 +641,19 @@ public class SiftsClient implements SiftsClientI
           if (cRefDb.getDbSource().equalsIgnoreCase(DBRefSource.PDB))
           {
             pdbRefDb = cRefDb;
+            if (firstPDBResNum == UNASSIGNED)
+            {
+              firstPDBResNum = getLeadingIntegerValue(cRefDb.getDbResNum(),
+                      UNASSIGNED);
+            }
+            else
+            {
+              if (isObserved)
+              {
+                // after we find the first observed residue we just increment
+                firstPDBResNum++;
+              }
+            }
           }
           if (cRefDb.getDbCoordSys().equalsIgnoreCase(seqCoordSys.getName())
                   && isAccessionMatched(cRefDb.getDbAccessionId()))
@@ -650,27 +666,37 @@ public class SiftsClient implements SiftsClientI
             }
           }
         }
-        if (seqCoordSys == seqCoordSys.PDB) // FIXME: is seqCoordSys ever PDBe
+        if (!isObserved)
+        {
+          ++pdbeNonObservedCount; // TODO this value is never used
+        }
+        if (seqCoordSys == CoordinateSys.PDB) // FIXME: is seqCoordSys ever PDBe
                                             // ???
         {
           // if the sequence has a primary reference to the PDB, then we are
           // dealing with a sequence extracted directly from the PDB. In that
           // case, numbering is PDBe - non-observed residues
-          currSeqIndex = pdbeIndex;
+          currSeqIndex = seq.getStart() - 1 + pdbeIndex;
         }
-        if (currSeqIndex == UNASSIGNED)
+        if (!isObserved)
         {
-          continue;
+          if (seqCoordSys != CoordinateSys.UNIPROT) // FIXME: PDB or PDBe only
+                                                    // here
+          {
+            // mapping to PDB or PDBe so we need to bookkeep for the
+            // non-observed
+            // SEQRES positions
+            omitNonObserved.add(currSeqIndex);
+            ++nonObservedShiftIndex;
+          }
         }
-        if (!isResidueObserved(residue)
-                && seqCoordSys != seqCoordSys.UNIPROT)
+        if (currSeqIndex == UNASSIGNED)
         {
-          // mapping to PDB or PDBe so we need to bookkeep for the non-observed
-          // SEQRES positions
-          omitNonObserved.add(currSeqIndex);
-          ++nonObservedShiftIndex;
+          // change in logic - unobserved residues with no currSeqIndex
+          // corresponding are still counted in both nonObservedShiftIndex and
+          // pdbeIndex...
+          continue;
         }
-
         // if (currSeqIndex >= seq.getStart() && currSeqIndex <= seqlength) //
         // true
                                                                          // numbering
@@ -687,18 +713,18 @@ public class SiftsClient implements SiftsClientI
                   : getLeadingIntegerValue(pdbRefDb.getDbResNum(),
                           UNASSIGNED);
 
-          if (isResidueObserved(residue)
-                  || seqCoordSys == CoordinateSys.UNIPROT)
+          if (isObserved)
           {
             char resCharCode = ResidueProperties
                     .getSingleCharacterCode(ResidueProperties
                             .getCanonicalAminoAcid(residue.getDbResName()));
             resNumMap.put(currSeqIndex, String.valueOf(resCharCode));
-          }
 
-          mapping.put(currSeqIndex - nonObservedShiftIndex,
-                  new int[]
-                  { Integer.valueOf(resNum), UNASSIGNED });
+            int[] mappingcols = new int[] { Integer.valueOf(resNum),
+                UNASSIGNED, isObserved ? firstPDBResNum : UNASSIGNED };
+
+            mapping.put(currSeqIndex - nonObservedShiftIndex, mappingcols);
+          }
         }
       }
     }
@@ -798,7 +824,7 @@ public class SiftsClient implements SiftsClientI
    */
   private boolean isResidueObserved(Residue residue)
   {
-    Set<String> annotations = getResidueAnnotaitons(residue,
+    Set<String> annotations = getResidueAnnotations(residue,
             ResidueDetailType.ANNOTATION);
     if (annotations == null || annotations.isEmpty())
     {
@@ -821,10 +847,10 @@ public class SiftsClient implements SiftsClientI
    * @param type
    * @return
    */
-  private Set<String> getResidueAnnotaitons(Residue residue,
+  private Set<String> getResidueAnnotations(Residue residue,
           ResidueDetailType type)
   {
-    HashSet<String> foundAnnotations = new HashSet<String>();
+    HashSet<String> foundAnnotations = new HashSet<>();
     List<ResidueDetail> resDetails = residue.getResidueDetail();
     for (ResidueDetail resDetail : resDetails)
     {
@@ -969,6 +995,10 @@ public class SiftsClient implements SiftsClientI
 
     public int resCount;
 
+    protected SiftsEntitySortPojo()
+    {
+    }
+
     @Override
     public int compareTo(SiftsEntitySortPojo o)
     {
@@ -988,15 +1018,35 @@ public class SiftsClient implements SiftsClientI
 
     private int nonObservedShiftIndex;
 
+    /**
+     * count of number of 'not observed' positions in the PDB record's SEQRES
+     * (total number of residues with coordinates == length(SEQRES) -
+     * pdbeNonObserved
+     */
+    private int pdbeNonObserved;
+
     public SegmentHelperPojo(SequenceI seq, HashMap<Integer, int[]> mapping,
             TreeMap<Integer, String> resNumMap,
-            List<Integer> omitNonObserved, int nonObservedShiftIndex)
+            List<Integer> omitNonObserved, int nonObservedShiftIndex,
+            int pdbeNonObserved)
     {
       setSeq(seq);
       setMapping(mapping);
       setResNumMap(resNumMap);
       setOmitNonObserved(omitNonObserved);
       setNonObservedShiftIndex(nonObservedShiftIndex);
+      setPdbeNonObserved(pdbeNonObserved);
+
+    }
+
+    public void setPdbeNonObserved(int pdbeNonObserved2)
+    {
+      this.pdbeNonObserved = pdbeNonObserved2;
+    }
+
+    public int getPdbeNonObserved()
+    {
+      return pdbeNonObserved;
     }
 
     public SequenceI getSeq()
@@ -1048,6 +1098,7 @@ public class SiftsClient implements SiftsClientI
     {
       this.nonObservedShiftIndex = nonObservedShiftIndex;
     }
+
   }
 
   @Override