X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fws%2Fdbsources%2FEBIAlfaFold.java;h=672f0ac8ed25d5822c3653c29f3aad86eee30d68;hb=2ee5edd84da7c509efc15d241527fa62093b41c7;hp=e0ab54dee38381b6ceef4085d616d752ee405f46;hpb=a059dd46fe149a476bd274562cd27b2dc7d390dd;p=jalview.git diff --git a/src/jalview/ws/dbsources/EBIAlfaFold.java b/src/jalview/ws/dbsources/EBIAlfaFold.java index e0ab54d..672f0ac 100644 --- a/src/jalview/ws/dbsources/EBIAlfaFold.java +++ b/src/jalview/ws/dbsources/EBIAlfaFold.java @@ -23,14 +23,22 @@ package jalview.ws.dbsources; import java.io.File; import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; import java.util.ArrayList; import java.util.List; import java.util.Map; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import org.json.simple.parser.ParseException; + import com.stevesoft.pat.Regex; import jalview.api.FeatureSettingsModelI; import jalview.bin.Console; +import jalview.datamodel.AlignedCodonFrame; import jalview.datamodel.AlignmentAnnotation; import jalview.datamodel.AlignmentI; import jalview.datamodel.ContactMatrixI; @@ -38,11 +46,14 @@ import jalview.datamodel.DBRefEntry; import jalview.datamodel.PDBEntry; import jalview.datamodel.SequenceFeature; import jalview.datamodel.SequenceI; +import jalview.gui.Desktop; import jalview.io.DataSourceType; import jalview.io.FileFormat; import jalview.io.FileFormatI; import jalview.io.FormatAdapter; import jalview.io.PDBFeatureSettings; +import jalview.structure.StructureMapping; +import jalview.structure.StructureSelectionManager; import jalview.util.MessageManager; import jalview.util.Platform; import jalview.ws.datamodel.alphafold.PAEContactMatrix; @@ -60,7 +71,7 @@ public class EBIAlfaFold extends EbiFileRetrievedProxy private static final int PDB_ID_LENGTH = 4; - private static String AF_VERSION = "2"; + private static String AF_VERSION = "3"; public EBIAlfaFold() { @@ -196,58 +207,268 @@ public class EBIAlfaFold extends EbiFileRetrievedProxy "exception.no_pdb_records_for_chain", new String[] { id, ((chain == null) ? "' '" : chain) })); } + // done during structure retrieval + // retrieve_AlphaFold_pAE(id, pdbAlignment, retrievalUrl); + + } catch (Exception ex) // Problem parsing PDB file + { + stopQuery(); + throw (ex); + } + return pdbAlignment; + } + + /** + * get an alphafold pAE for the given id, and add it to sequence 0 in + * pdbAlignment (assuming it came from structurefile parser). + * + * @param id + * @param pdbAlignment + * @param retrievalUrl + * - URL of .mmcif from EBI-AlphaFold - will be used to generate the + * pAE URL automatically + * @throws IOException + * @throws Exception + */ + public static void retrieve_AlphaFold_pAE(String id, + AlignmentI pdbAlignment, String retrievalUrl) throws IOException + { + // import PAE as contact matrix - assume this will work if there was a + // model + String paeURL = getAlphaFoldPaeDownloadUrl(id, AF_VERSION); + + if (retrievalUrl != null) + { + // manufacture the PAE url from a url like ...-model-vN.cif + paeURL = retrievalUrl.replace("model", "predicted_aligned_error") + .replace(".cif", ".json"); + } + + File pae = null; + try + { + pae = File.createTempFile(id == null ? "af_pae" : id, "pae_json"); + } catch (IOException e) + { + e.printStackTrace(); + } + Console.debug("Downloading pae from " + paeURL + " to " + pae.toString() + + ""); + UrlDownloadClient.download(paeURL, pae); + addAlphaFoldPAEToSequence(pdbAlignment, pae, 0, null); + } - // import PAE as contact matrix - assume this will work if there was a - // model - File pae = File.createTempFile(id, "pae_json"); - String paeURL = getAlphaFoldPaeDownloadUrl(id, AF_VERSION); + public static void addAlphaFoldPAEToSequence(AlignmentI pdbAlignment, + File pae, int index, String seqId) + { + addAlphaFoldPAE(pdbAlignment, pae, index, seqId, false, false); + } - if (retrievalUrl != null) + public static void addAlphaFoldPAEToStructure(AlignmentI pdbAlignment, + File pae, int index, String structIdOrFile, boolean isStructId) + { + addAlphaFoldPAE(pdbAlignment, pae, index, structIdOrFile, true, + isStructId); + } + + public static void addAlphaFoldPAE(AlignmentI pdbAlignment, File pae, + int index, String id, boolean isStruct, boolean isStructId) + { + FileInputStream paeInput = null; + try + { + paeInput = new FileInputStream(pae); + } catch (FileNotFoundException e) + { + Console.error( + "Could not find pAE file '" + pae.getAbsolutePath() + "'", e); + return; + } + + if (isStruct) + { + StructureSelectionManager ssm = StructureSelectionManager + .getStructureSelectionManager(Desktop.instance); + if (ssm != null) { - // manufacture the PAE url from a url like ...-model-vN.cif - paeURL = retrievalUrl.replace("model", "predicted_aligned_error") - .replace(".cif", ".json"); + String structFile = isStructId ? ssm.findFileForPDBId(id) : id; + + StructureMapping[] smArray = ssm.getMapping(structFile); + + try + { + if (!importPaeJSONAsContactMatrixToStructure(smArray, paeInput)) + { + Console.warn("Could not import contact matrix from '" + + pae.getAbsolutePath() + "' to structure."); + } + } catch (IOException e1) + { + Console.error("Error when importing pAE file '" + + pae.getAbsolutePath() + "'", e1); + } catch (ParseException e2) + { + Console.error("Error when parsing pAE file '" + + pae.getAbsolutePath() + "'", e2); + } } - Console.debug("Downloading pae from " + paeURL + " to " - + pae.toString() + ""); + } + else + { + // attach to sequence?! try { - UrlDownloadClient.download(paeURL, pae); - if (!importPaeJSONAsContactMatrix(pdbAlignment, pae)) + if (!importPaeJSONAsContactMatrixToSequence(pdbAlignment, paeInput, + index, id)) { - Console.warn("Couln't import contact matrix from " + paeURL - + " (stored in " + pae.toString() + ")"); + Console.warn("Could not import contact matrix from '" + + pae.getAbsolutePath() + "' to sequence."); } - } catch (Exception pae_ex) + } catch (IOException e1) + { + Console.error("Error when importing pAE file '" + + pae.getAbsolutePath() + "'", e1); + } catch (ParseException e2) { - Console.debug("Couldn't download PAE", pae_ex); + Console.error("Error when parsing pAE file '" + + pae.getAbsolutePath() + "'", e2); } + } - } catch (Exception ex) // Problem parsing PDB file + } + + /** + * parses the given pAE matrix and adds it to sequence 0 in the given + * alignment + * + * @param pdbAlignment + * @param pae_input + * @return true if there was a pAE matrix added + * @throws ParseException + * @throws IOException + * @throws Exception + */ + public static boolean importPaeJSONAsContactMatrixToSequence( + AlignmentI pdbAlignment, InputStream pae_input) + throws IOException, ParseException + { + return importPaeJSONAsContactMatrixToSequence(pdbAlignment, pae_input, + 0, null); + } + + public static boolean importPaeJSONAsContactMatrixToSequence( + AlignmentI pdbAlignment, File paeFile, int index, String seqId) + throws FileNotFoundException, IOException, ParseException + { + return importPaeJSONAsContactMatrixToSequence(pdbAlignment, + new FileInputStream(paeFile), index, seqId); + } + + public static boolean importPaeJSONAsContactMatrixToSequence( + AlignmentI pdbAlignment, InputStream pae_input, int index, + String seqId) throws IOException, ParseException + { + SequenceI sequence = null; + if (seqId == null) { - stopQuery(); - throw (ex); + int seqToGet = index > 0 ? index : 0; + sequence = pdbAlignment.getSequenceAt(seqToGet); } - return pdbAlignment; + if (sequence == null) + { + SequenceI[] sequences = pdbAlignment.findSequenceMatch(seqId); + if (sequences == null || sequences.length < 1) + { + Console.warn("Could not find sequence with id '" + seqId + + "' to attach pAE matrix to. Ignoring matrix."); + return false; + } + else + { + sequence = sequences[0]; // just use the first sequence with this seqId + } + } + + JSONObject paeDict = parseJSONtoPAEContactMatrix(pae_input); + if (paeDict == null) + { + Console.debug("JSON file did not parse properly."); + return false; + } + ContactMatrixI matrix = new PAEContactMatrix(sequence, + (Map) paeDict); + + AlignmentAnnotation cmannot = sequence.addContactList(matrix); + pdbAlignment.addAnnotation(cmannot); + + return true; + } + + public static JSONObject parseJSONtoPAEContactMatrix( + InputStream pae_input) throws IOException, ParseException + { + Object paeJson = Platform.parseJSON(pae_input); + JSONObject paeDict = null; + if (paeJson instanceof JSONObject) + { + paeDict = (JSONObject) paeJson; + } + else if (paeJson instanceof JSONArray) + { + JSONArray jsonArray = (JSONArray) paeJson; + if (jsonArray.size() > 0) + paeDict = (JSONObject) jsonArray.get(0); + } + + return paeDict; + } + + public static boolean importPaeJSONAsContactMatrixToStructure( + StructureMapping[] smArray, InputStream paeInput) + throws IOException, ParseException + { + boolean someDone = false; + for (StructureMapping sm : smArray) + { + boolean thisDone = importPaeJSONAsContactMatrixToStructure(sm, + paeInput); + someDone |= thisDone; + } + return someDone; } - private boolean importPaeJSONAsContactMatrix(AlignmentI pdbAlignment, - File pae) throws Exception + public static boolean importPaeJSONAsContactMatrixToStructure( + StructureMapping sm, File paeFile) + throws FileNotFoundException, IOException, ParseException { - FileInputStream pae_input = new FileInputStream(pae); + return importPaeJSONAsContactMatrixToStructure(sm, + new FileInputStream(paeFile)); + } - List pae_obj = (List) Platform.parseJSON(pae_input); + public static boolean importPaeJSONAsContactMatrixToStructure( + StructureMapping sm, InputStream paeInput) + throws IOException, ParseException + { + JSONObject pae_obj = parseJSONtoPAEContactMatrix(paeInput); if (pae_obj == null) { + Console.debug("JSON file did not parse properly."); return false; } - ContactMatrixI matrix = new PAEContactMatrix( - pdbAlignment.getSequenceAt(0), - (Map) pae_obj.get(0)); - pdbAlignment.getSequenceAt(0) - .addAlignmentAnnotation(pdbAlignment.addContactList(matrix)); + ContactMatrixI matrix = new PAEContactMatrix(sm.getSequence(), + (Map) pae_obj); + + AlignmentAnnotation cmannot = sm.getSequence().addContactList(matrix); + // sm.getSequence().addAlignmentAnnotation(cmannot); + sm.transfer(cmannot); + // return true; + + StructureSelectionManager ssm = StructureSelectionManager + .getStructureSelectionManager(Desktop.instance); + List acfList = ssm.getSequenceMappings(); + return true; }