X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fext%2Fjmol%2FJmolParser.java;h=45f3d7c918b5353643351543996d9b644043282d;hb=5db8e803feb3d04bf6142d25ded76473ec1cb571;hp=f08e40ed7f8c964be64ad32ff0d969342636c7f5;hpb=7d67fb613ec026dc9a265e351e7fab542e3f1d61;p=jalview.git diff --git a/src/jalview/ext/jmol/JmolParser.java b/src/jalview/ext/jmol/JmolParser.java index f08e40e..45f3d7c 100644 --- a/src/jalview/ext/jmol/JmolParser.java +++ b/src/jalview/ext/jmol/JmolParser.java @@ -20,22 +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.structure.StructureImportSettings; -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; @@ -46,9 +35,21 @@ import org.jmol.c.STR; import org.jmol.modelset.ModelSet; import org.jmol.viewer.Viewer; -import MCview.Atom; -import MCview.PDBChain; -import MCview.Residue; +import com.stevesoft.pat.Regex; + +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 mc_view.Atom; +import mc_view.PDBChain; +import mc_view.Residue; /** * Import and process files with Jmol for file like PDB, mmCIF @@ -60,7 +61,16 @@ public class JmolParser extends StructureFile implements JmolStatusListener { Viewer viewer = null; - public JmolParser(String inFile, DataSourceType sourceType) + private boolean alphaFoldModel; + + public JmolParser(boolean immediate, Object inFile, + DataSourceType sourceType) throws IOException + { + // BH 2018 File or String for filename + super(immediate, inFile, sourceType); + } + + public JmolParser(Object inFile, DataSourceType sourceType) throws IOException { super(inFile, sourceType); @@ -105,8 +115,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); } @@ -127,29 +139,75 @@ 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) { throw new Error(MessageManager.formatMessage( "error.jmol_version_not_compatible_with_jalview_version", - new String[] { JmolViewer.getJmolVersion() }), x); + new String[] + { JmolViewer.getJmolVersion() }), x); } } 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) { @@ -160,28 +218,41 @@ 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); + String tempFString = null; + if (isAlphafoldModel()) + { + tempFString = "Alphafold Reliability"; + } + + tmpchain = new PDBChain(getId(), tmpatom.chain, tempFString); getChains().add(tmpchain); tmpchain.atoms.addElement(tmpatom); } lastID = tmpatom.resNumIns.trim(); } - xferSettings(); + if (isParseImmediately()) + { + // configure parsing settings from the static singleton + xferSettings(); + } makeResidueList(); makeCaBondList(); @@ -198,21 +269,26 @@ public class JmolParser extends StructureFile implements JmolStatusListener prot.add(chainseq); } - if (StructureImportSettings.isProcessSecondaryStructure()) + // look at local setting for adding secondary tructure + if (predictSecondaryStructure) { createAnnotation(chainseq, chain, ms.at); } } } catch (OutOfMemoryError er) { - System.out - .println("OUT OF MEMORY LOADING TRANSFORMING JMOL MODEL TO JALVIEW MODEL"); - throw new IOException( - MessageManager - .getString("exception.outofmemory_loading_mmcif_file")); + System.out.println( + "OUT OF MEMORY LOADING TRANSFORMING JMOL MODEL TO JALVIEW MODEL"); + throw new IOException(MessageManager + .getString("exception.outofmemory_loading_mmcif_file")); } } + private boolean isAlphafoldModel() + { + return alphaFoldModel; + } + private List convertSignificantAtoms(ModelSet ms) { List significantAtoms = new ArrayList(); @@ -236,8 +312,9 @@ public class JmolParser extends StructureFile implements JmolStatusListener curAtom.number = atom.getAtomNumber(); curAtom.resName = atom.getGroup3(true); curAtom.resNumber = atom.getResno(); - curAtom.occupancy = ms.occupancies != null ? ms.occupancies[atom - .getIndex()] : Float.valueOf(atom.getOccupancy100()); + curAtom.occupancy = ms.occupancies != null + ? ms.occupancies[atom.getIndex()] + : Float.valueOf(atom.getOccupancy100()); String fmt = new Format("%4i").form(curAtom.resNumber); curAtom.resNumIns = (fmt + curAtom.insCode); curAtom.tfactor = atom.getBfactor100() / 100f; @@ -259,7 +336,7 @@ public class JmolParser extends StructureFile implements JmolStatusListener HashMap chainTerMap) { // System.out.println("Atom: " + curAtom.getAtomNumber() - // + " Last atom index " + curAtom.group.lastAtomIndex); + // + " Last atom index " + curAtom.group.lastAtomIndex); if (chainTerMap == null || prevAtom == null) { return true; @@ -282,7 +359,8 @@ public class JmolParser extends StructureFile implements JmolStatusListener { return false; } - if ((curAtom.getResno() - chainTerMap.get(curAtomChId).getResno()) < 5) + if ((curAtom.getResno() + - chainTerMap.get(curAtomChId).getResno()) < 5) { chainTerMap.put(curAtomChId, curAtom); return true; @@ -297,7 +375,8 @@ public class JmolParser extends StructureFile implements JmolStatusListener { return false; } - if ((curAtom.getResno() - chainTerMap.get(curAtomChId).getResno()) < 5) + if ((curAtom.getResno() + - chainTerMap.get(curAtomChId).getResno()) < 5) { chainTerMap.put(curAtomChId, curAtom); return true; @@ -305,8 +384,8 @@ public class JmolParser extends StructureFile implements JmolStatusListener return false; } // HETATM with resNum jump > 2 - return !(curAtom.isHetero() && ((curAtom.getResno() - prevAtom - .getResno()) > 2)); + return !(curAtom.isHetero() + && ((curAtom.getResno() - prevAtom.getResno()) > 2)); } private void createAnnotation(SequenceI sequence, PDBChain chain, @@ -336,7 +415,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 @@ -351,10 +430,10 @@ public class JmolParser extends StructureFile implements JmolStatusListener SequenceI sq, char[] secstr, char[] secstrcode, String chainId, int firstResNum) { - char[] seq = sq.getSequence(); + int length = sq.getLength(); boolean ssFound = false; - Annotation asecstr[] = new Annotation[seq.length + firstResNum - 1]; - for (int p = 0; p < seq.length; p++) + Annotation asecstr[] = new Annotation[length + firstResNum - 1]; + for (int p = 0; p < length; p++) { if (secstr[p] >= 'A' && secstr[p] <= 'z') { @@ -411,8 +490,8 @@ public class JmolParser extends StructureFile implements JmolStatusListener * @param secstr * @param secstrcode */ - protected void setSecondaryStructure(STR proteinStructureSubType, - int pos, char[] secstr, char[] secstrcode) + protected void setSecondaryStructure(STR proteinStructureSubType, int pos, + char[] secstr, char[] secstrcode) { switch (proteinStructureSubType) { @@ -489,8 +568,8 @@ public class JmolParser extends StructureFile implements JmolStatusListener @Override public void notifyCallback(CBK cbType, Object[] data) { - String strInfo = (data == null || data[1] == null ? null : data[1] - .toString()); + String strInfo = (data == null || data[1] == null ? null + : data[1].toString()); switch (cbType) { case ECHO: @@ -581,7 +660,7 @@ public class JmolParser extends StructureFile implements JmolStatusListener * Not implemented - returns null */ @Override - public float[][] functionXY(String functionName, int x, int y) + public double[][] functionXY(String functionName, int x, int y) { return null; } @@ -590,7 +669,8 @@ public class JmolParser extends StructureFile implements JmolStatusListener * Not implemented - returns null */ @Override - public float[][][] functionXYZ(String functionName, int nx, int ny, int nz) + public double[][][] functionXYZ(String functionName, int nx, int ny, + int nz) { return null; } @@ -642,7 +722,8 @@ public class JmolParser extends StructureFile implements JmolStatusListener return predictSecondaryStructure; } - public void setPredictSecondaryStructure(boolean predictSecondaryStructure) + public void setPredictSecondaryStructure( + boolean predictSecondaryStructure) { this.predictSecondaryStructure = predictSecondaryStructure; }