Merge branch 'develop' into feature/r2_11_2/JAL-3808_gff2_exonerate
[jalview.git] / src / jalview / ext / jmol / JmolParser.java
index a9c5f5c..2a43244 100644 (file)
@@ -20,6 +20,8 @@
  */
 package jalview.ext.jmol;
 
+import java.util.Locale;
+
 import jalview.datamodel.AlignmentAnnotation;
 import jalview.datamodel.Annotation;
 import jalview.datamodel.PDBEntry;
@@ -45,6 +47,8 @@ import org.jmol.c.STR;
 import org.jmol.modelset.ModelSet;
 import org.jmol.viewer.Viewer;
 
+import com.stevesoft.pat.Regex;
+
 import mc_view.Atom;
 import mc_view.PDBChain;
 import mc_view.Residue;
@@ -59,6 +63,8 @@ public class JmolParser extends StructureFile implements JmolStatusListener
 {
   Viewer viewer = null;
 
+  private boolean alphaFoldModel;
+
   public JmolParser(boolean immediate, Object inFile,
           DataSourceType sourceType) throws IOException
   {
@@ -111,7 +117,7 @@ public class JmolParser extends StructureFile implements JmolStatusListener
       // }
       // ;
       // instead, we distinguish .cif from non-.cif by filename
-      setStructureFileType(getDataName().toLowerCase().endsWith(".cif")
+      setStructureFileType(getDataName().toLowerCase(Locale.ROOT).endsWith(".cif")
               ? PDBEntry.Type.MMCIF.toString()
               : "PDB");
 
@@ -148,17 +154,58 @@ public class JmolParser extends StructureFile implements JmolStatusListener
     }
     return viewer;
   }
+  
+  public static Regex getNewAlphafoldValidator()
+  {
+    Regex validator =  new Regex("(AF-[A-Z]+[0-9]+[A-Z0-9]+-F1)");
+    validator.setIgnoreCase(true);
+    return validator;
+  }
 
+  PDBEntry.Type jmolFiletype=null;
+  /**
+   * resolve a jmol filetype string and update the jmolFiletype field accordingly
+   * @param jmolIdentifiedFileType
+   * @return true if filetype was identified as MMCIF, PDB
+   */
+  public boolean updateFileType(String jmolIdentifiedFileType)
+  {
+    if (jmolIdentifiedFileType == null 
+            || jmolIdentifiedFileType.trim().equals(""))
+    {
+      return false;
+    }
+    if ("mmcif".equalsIgnoreCase(jmolIdentifiedFileType)) {
+      jmolFiletype = PDBEntry.Type.MMCIF;
+      return true;
+    }
+    if ("pdb".equalsIgnoreCase(jmolIdentifiedFileType))
+    {
+      jmolFiletype = PDBEntry.Type.PDB;
+      return true;
+    } 
+    return false;
+  }
+  
   public void transformJmolModelToJalview(ModelSet ms) throws IOException
   {
     try
     {
+      Regex alphaFold = getNewAlphafoldValidator();
       String lastID = "";
       List<SequenceI> rna = new ArrayList<SequenceI>();
       List<SequenceI> prot = new ArrayList<SequenceI>();
       PDBChain tmpchain;
       String pdbId = (String) ms.getInfo(0, "title");
-
+      boolean isMMCIF = false;
+      String jmolFileType_String = (String) ms.getInfo(0, "fileType");
+      if (updateFileType(jmolFileType_String))
+      {
+        setStructureFileType(jmolFiletype.toString());
+      }
+      
+      isMMCIF = PDBEntry.Type.MMCIF.equals(jmolFiletype);
+      
       if (pdbId == null)
       {
         setId(safeName(getDataName()));
@@ -168,6 +215,8 @@ public class JmolParser extends StructureFile implements JmolStatusListener
       {
         setId(pdbId);
         setPDBIdAvailable(true);
+        alphaFoldModel = alphaFold.search(pdbId) && isMMCIF;  
+
       }
       List<Atom> significantAtoms = convertSignificantAtoms(ms);
       for (Atom tmpatom : significantAtoms)
@@ -183,7 +232,13 @@ public class JmolParser extends StructureFile implements JmolStatusListener
           tmpchain.atoms.addElement(tmpatom);
         } else
         {
-          tmpchain = new PDBChain(getId(), tmpatom.chain);
+          String tempFString=null;
+          if (isAlphafoldModel())
+          {
+            tempFString = "Alphafold Reliability";
+          }
+
+          tmpchain = new PDBChain(getId(), tmpatom.chain,tempFString);
           getChains().add(tmpchain);
           tmpchain.atoms.addElement(tmpatom);
         }
@@ -225,6 +280,11 @@ public class JmolParser extends StructureFile implements JmolStatusListener
     }
   }
 
+  private boolean isAlphafoldModel()
+  {
+    return alphaFoldModel;
+  }
+
   private List<Atom> convertSignificantAtoms(ModelSet ms)
   {
     List<Atom> significantAtoms = new ArrayList<Atom>();
@@ -351,7 +411,7 @@ public class JmolParser extends StructureFile implements JmolStatusListener
 
   /**
    * Helper method that adds an AlignmentAnnotation for secondary structure to
-   * the sequence, provided at least one secondary structure prediction has been
+   * the sequence, provided at least one secondary structure assignment has been
    * made
    * 
    * @param modelTitle