X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fext%2Fjmol%2FJmolParser.java;h=269fc31519b159d52450f4fbe49742743a698fb2;hb=51ff7ec3b6914f3c69b35e91e69d10c88aaf5270;hp=e94da73a687c655ee81a5b4a645fb9c21c8ca321;hpb=b879c4a2d32d3489e63ac06917e81637e6bb4068;p=jalview.git diff --git a/src/jalview/ext/jmol/JmolParser.java b/src/jalview/ext/jmol/JmolParser.java index e94da73..269fc31 100644 --- a/src/jalview/ext/jmol/JmolParser.java +++ b/src/jalview/ext/jmol/JmolParser.java @@ -20,21 +20,11 @@ */ package jalview.ext.jmol; -import jalview.datamodel.AlignmentAnnotation; -import jalview.datamodel.Annotation; -import jalview.datamodel.PDBEntry; -import jalview.datamodel.SequenceI; -import jalview.io.DataSourceType; -import jalview.io.FileParse; -import jalview.io.StructureFile; -import jalview.schemes.ResidueProperties; -import jalview.util.Format; -import jalview.util.MessageManager; - import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Vector; @@ -45,6 +35,23 @@ import org.jmol.c.STR; import org.jmol.modelset.ModelSet; import org.jmol.viewer.Viewer; +import com.stevesoft.pat.Regex; + +import jalview.bin.Console; +import jalview.datamodel.Alignment; +import jalview.datamodel.AlignmentAnnotation; +import jalview.datamodel.Annotation; +import jalview.datamodel.PDBEntry; +import jalview.datamodel.SequenceI; +import jalview.datamodel.annotations.AlphaFoldAnnotationRowBuilder; +import jalview.datamodel.annotations.AnnotationRowBuilder; +import jalview.io.DataSourceType; +import jalview.io.FileParse; +import jalview.io.StructureFile; +import jalview.schemes.ResidueProperties; +import jalview.util.Format; +import jalview.util.MessageManager; +import jalview.ws.dbsources.EBIAlfaFold; import mc_view.Atom; import mc_view.PDBChain; import mc_view.Residue; @@ -59,6 +66,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,9 +120,10 @@ public class JmolParser extends StructureFile implements JmolStatusListener // } // ; // instead, we distinguish .cif from non-.cif by filename - setStructureFileType(getDataName().toLowerCase().endsWith(".cif") - ? PDBEntry.Type.MMCIF.toString() - : "PDB"); + setStructureFileType( + getDataName().toLowerCase(Locale.ROOT).endsWith(".cif") + ? PDBEntry.Type.MMCIF.toString() + : "PDB"); transformJmolModelToJalview(jmolModel.ms); } @@ -134,9 +144,8 @@ public class JmolParser extends StructureFile implements JmolStatusListener * params -o (output to sysout) -n (nodisplay) -x (exit when finished) * see http://wiki.jmol.org/index.php/Jmol_Application */ - - viewer = (Viewer) JmolViewer.allocateViewer(null, null, null, null, - null, "-x -o -n", this); + + viewer = JalviewJmolBinding.getJmolData(this); // ensure the 'new' (DSSP) not 'old' (Ramachandran) SS method is used viewer.setBooleanProperty("defaultStructureDSSP", true); } catch (ClassCastException x) @@ -150,15 +159,60 @@ 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 rna = new ArrayList(); List prot = new ArrayList(); 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) { @@ -169,22 +223,32 @@ public class JmolParser extends StructureFile implements JmolStatusListener { setId(pdbId); setPDBIdAvailable(true); + alphaFoldModel = alphaFold.search(pdbId) && isMMCIF; + } List significantAtoms = convertSignificantAtoms(ms); for (Atom tmpatom : significantAtoms) { - try + if (tmpatom.resNumIns.trim().equals(lastID)) + { + // phosphorylated protein - seen both CA and P.. + continue; + } + tmpchain = findChain(tmpatom.chain); + if (tmpchain != null) { - tmpchain = findChain(tmpatom.chain); - if (tmpatom.resNumIns.trim().equals(lastID)) - { - // phosphorylated protein - seen both CA and P.. - continue; - } tmpchain.atoms.addElement(tmpatom); - } catch (Exception e) + } + else { - tmpchain = new PDBChain(getId(), tmpatom.chain); + AnnotationRowBuilder builder = null; + String tempFString = null; + if (isAlphafoldModel()) + { + builder = new AlphaFoldAnnotationRowBuilder(); + } + + tmpchain = new PDBChain(getId(), tmpatom.chain, builder); getChains().add(tmpchain); tmpchain.atoms.addElement(tmpatom); } @@ -217,6 +281,28 @@ public class JmolParser extends StructureFile implements JmolStatusListener createAnnotation(chainseq, chain, ms.at); } } + if (isAlphafoldModel()) + { + // TODO - work out how to handle different ways that pAE is provided + // + try + { + Console.info("retrieving pAE for " + pdbId); + Alignment al = new Alignment(prot.toArray(new SequenceI[0])); + EBIAlfaFold.retrieve_AlphaFold_pAE(pdbId, al, null); + if (al.getAlignmentAnnotation() != null) + { + for (AlignmentAnnotation alann : al.getAlignmentAnnotation()) + { + annotations.add(alann); + } + } + ; + } catch (Throwable t) + { + Console.error("Couldn't get the pAE for " + pdbId, t); + } + } } catch (OutOfMemoryError er) { System.out.println( @@ -226,6 +312,11 @@ public class JmolParser extends StructureFile implements JmolStatusListener } } + private boolean isAlphafoldModel() + { + return alphaFoldModel; + } + private List convertSignificantAtoms(ModelSet ms) { List significantAtoms = new ArrayList(); @@ -352,7 +443,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 @@ -376,8 +467,7 @@ public class JmolParser extends StructureFile implements JmolStatusListener { try { - asecstr[p] = new Annotation(String.valueOf(secstr[p]), null, - secstrcode[p], Float.NaN); + asecstr[p] = new Annotation(null, null, secstrcode[p], Float.NaN); ssFound = true; } catch (Exception e) {