*/
package jalview.ext.jmol;
-import jalview.datamodel.AlignmentAnnotation;
-import jalview.datamodel.Annotation;
-import jalview.datamodel.PDBEntry;
-import jalview.datamodel.SequenceI;
-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.File;
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;
-import javajs.awt.Dimension;
-
import org.jmol.api.JmolStatusListener;
import org.jmol.api.JmolViewer;
import org.jmol.c.CBK;
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.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.structure.StructureImportSettings;
+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;
/**
* Import and process files with Jmol for file like PDB, mmCIF
{
Viewer viewer = null;
- public JmolParser(boolean addAlignmentAnnotations, boolean predictSecStr,
- boolean externalSecStr, String inFile, String type)
+ 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, type);
+ this(inFile, sourceType, null);
+ }
+
+ public JmolParser(Object inFile, DataSourceType sourceType,
+ StructureImportSettings.TFType tempfacType) throws IOException
+ {
+ super(inFile, sourceType, tempfacType);
}
- public JmolParser(boolean addAlignmentAnnotations, boolean predictSecStr,
- boolean externalSecStr, FileParse fp) throws IOException
+ public JmolParser(FileParse fp, boolean doXferSettings) throws IOException
+ {
+ super(fp, doXferSettings);
+ }
+ public JmolParser(FileParse fp) throws IOException
{
super(fp);
}
@Override
public void parse() throws IOException
{
+ parse(true);
+ }
+
+ @Override
+ public void parse(boolean doXferSettings) throws IOException
+ {
setChains(new Vector<PDBChain>());
Viewer jmolModel = getJmolData();
jmolModel.openReader(getDataName(), getDataName(), getReader());
// }
// ;
// 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);
+ transformJmolModelToJalview(jmolModel.ms, doXferSettings);
}
}
{
try
{
- viewer = (Viewer) JmolViewer.allocateViewer(null, null, null, null,
- null, "-x -o -n", this);
+ /*
+ * params -o (output to sysout) -n (nodisplay) -x (exit when finished)
+ * see http://wiki.jmol.org/index.php/Jmol_Application
+ */
+
+ 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 void transformJmolModelToJalview(ModelSet ms) throws IOException
+ 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,
+ boolean localDoXferSettings) 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");
- setId(pdbId);
+ 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()));
+ setPDBIdAvailable(false);
+ }
+ else
+ {
+ setId(pdbId);
+ setPDBIdAvailable(true);
+ setAlphafoldModel(alphaFold.search(pdbId) && isMMCIF);
+ }
List<Atom> 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(pdbId, tmpatom.chain);
+ AnnotationRowBuilder builder = null;
+ if (isAlphafoldModel()
+ || getTemperatureFactorType() == StructureImportSettings.TFType.PLDDT)
+ {
+ builder = new AlphaFoldAnnotationRowBuilder();
+ }
+
+ tmpchain = new PDBChain(getId(), tmpatom.chain, builder);
getChains().add(tmpchain);
tmpchain.atoms.addElement(tmpatom);
}
lastID = tmpatom.resNumIns.trim();
}
- xferSettings();
+ if (isParseImmediately() && localDoXferSettings)
+ {
+ // configure parsing settings from the static singleton
+ xferSettings();
+ }
makeResidueList();
makeCaBondList();
- if (getId() == null)
- {
- setId(safeName(getDataName()));
- }
for (PDBChain chain : getChains())
{
SequenceI chainseq = postProcessChain(chain);
prot.add(chainseq);
}
- if (StructureImportSettings.isProcessSecondaryStructure())
+ // look at local setting for adding secondary tructure
+ if (predictSecondaryStructure)
{
createAnnotation(chainseq, chain, ms.at);
}
}
+ // if Alphafold, fetch the PAE matrix if doesn't already have one
+ if (isAlphafoldModel() && !hasPAEMatrix())
+ {
+ try
+ {
+ Console.info("Retrieving PAE for " + pdbId);
+ File paeFile = EBIAlfaFold.fetchAlphaFoldPAE(pdbId, null);
+ this.setPAEMatrix(paeFile.getAbsolutePath());
+ } catch (Throwable t)
+ {
+ Console.error("Couldn't get the pAE for " + pdbId, t);
+ }
+ }
+ // add a PAEMatrix if set (either by above or otherwise)
+ if (hasPAEMatrix())
+ {
+ try
+ {
+ Alignment al = new Alignment(prot.toArray(new SequenceI[0]));
+ EBIAlfaFold.addAlphaFoldPAE(al, new File(this.getPAEMatrix()), 0,
+ null, false, false, null);
+
+ if (al.getAlignmentAnnotation() != null)
+ {
+ for (AlignmentAnnotation alann : al.getAlignmentAnnotation())
+ {
+ annotations.add(alann);
+ }
+ }
+ } catch (Throwable ff)
+ {
+ Console.error("Couldn't import PAE Matrix from " + getPAEMatrix(),
+ ff);
+ warningMessage += "Couldn't import PAE Matrix"
+ + getNewlineString() + ff.getLocalizedMessage()
+ + getNewlineString();
+ }
+ }
} 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"));
}
}
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;
HashMap<String, org.jmol.modelset.Atom> 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;
{
return false;
}
- if ((curAtom.getResno() - chainTerMap.get(curAtomChId).getResno()) < 5)
+ if ((curAtom.getResno()
+ - chainTerMap.get(curAtomChId).getResno()) < 5)
{
chainTerMap.put(curAtomChId, curAtom);
return true;
{
return false;
}
- if ((curAtom.getResno() - chainTerMap.get(curAtomChId).getResno()) < 5)
+ if ((curAtom.getResno()
+ - chainTerMap.get(curAtomChId).getResno()) < 5)
{
chainTerMap.put(curAtomChId, curAtom);
return true;
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,
/**
* 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
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-sq.getStart())];
+ for (int p = 0; p < length; p++)
{
if (secstr[p] >= 'A' && secstr[p] <= 'z')
{
try
{
- asecstr[p] = new Annotation(String.valueOf(secstr[p]), null,
- secstrcode[p], Float.NaN);
- ssFound = true;
+ asecstr[p] = new Annotation(null, null, secstrcode[p], Float.NaN);
+ ssFound = true;
} catch (Exception e)
{
// e.printStackTrace();
* @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)
{
* Not implemented - returns null
*/
@Override
- public String print()
+ public String print(SequenceI[] seqs, boolean jvSuffix)
{
return null;
}
@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:
* Not implemented - returns null
*/
@Override
- public float[][][] functionXYZ(String functionName, int nx, int ny, int nz)
+ public float[][][] functionXYZ(String functionName, int nx, int ny,
+ int nz)
{
return null;
}
* Not implemented - returns null
*/
@Override
- public Dimension resizeInnerPanel(String data)
+ public int[] resizeInnerPanel(String data)
{
return null;
}
return predictSecondaryStructure;
}
- public void setPredictSecondaryStructure(boolean predictSecondaryStructure)
+ public void setPredictSecondaryStructure(
+ boolean predictSecondaryStructure)
{
this.predictSecondaryStructure = predictSecondaryStructure;
}