X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fws%2Fdbsources%2FEBIAlfaFold.java;fp=src%2Fjalview%2Fws%2Fdbsources%2FEBIAlfaFold.java;h=d9cbbd9ee28c6365764b51a73db82228136b51dc;hb=fea1abc4a4d2c45a1ba6e6127bac5d2466de18fc;hp=dd71ec329a9b58030acf76c1376a89cd0e442f8b;hpb=a8349faec60666eff52c3060565116935b66e544;p=jalview.git diff --git a/src/jalview/ws/dbsources/EBIAlfaFold.java b/src/jalview/ws/dbsources/EBIAlfaFold.java index dd71ec3..d9cbbd9 100644 --- a/src/jalview/ws/dbsources/EBIAlfaFold.java +++ b/src/jalview/ws/dbsources/EBIAlfaFold.java @@ -27,6 +27,8 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -38,7 +40,6 @@ 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; @@ -52,6 +53,7 @@ import jalview.io.FileFormat; import jalview.io.FileFormatI; import jalview.io.FormatAdapter; import jalview.io.PDBFeatureSettings; +import jalview.structure.StructureImportSettings.TFType; import jalview.structure.StructureMapping; import jalview.structure.StructureSelectionManager; import jalview.util.MessageManager; @@ -197,6 +199,7 @@ public class EBIAlfaFold extends EbiFileRetrievedProxy { return null; } + // TODO Get the PAE file somewhere around here and remove from JmolParser pdbAlignment = importDownloadedStructureFromUrl(alphaFoldCif, tmpFile, id, chain, getDbSource(), getDbVersion()); @@ -219,8 +222,8 @@ public class EBIAlfaFold extends EbiFileRetrievedProxy } /** - * get an alphafold pAE for the given id, and add it to sequence 0 in - * pdbAlignment (assuming it came from structurefile parser). + * get an alphafold pAE for the given id and return the File object of the + * downloaded (temp) file * * @param id * @param pdbAlignment @@ -230,8 +233,8 @@ public class EBIAlfaFold extends EbiFileRetrievedProxy * @throws IOException * @throws Exception */ - public static void retrieve_AlphaFold_pAE(String id, - AlignmentI pdbAlignment, String retrievalUrl) throws IOException + public static File fetchAlphaFoldPAE(String id, String retrievalUrl) + throws IOException { // import PAE as contact matrix - assume this will work if there was a // model @@ -244,7 +247,16 @@ public class EBIAlfaFold extends EbiFileRetrievedProxy .replace(".cif", ".json"); } - File pae = null; + // check the cache + File pae = paeDownloadCache.get(paeURL); + if (pae != null && pae.exists() && (new Date().getTime() + - pae.lastModified()) < PAE_CACHE_STALE_TIME) + { + Console.debug( + "Using existing file in PAE cache for '" + paeURL + "'"); + return pae; + } + try { pae = File.createTempFile(id == null ? "af_pae" : id, "pae_json"); @@ -254,21 +266,35 @@ public class EBIAlfaFold extends EbiFileRetrievedProxy } Console.debug("Downloading pae from " + paeURL + " to " + pae.toString() + ""); - UrlDownloadClient.download(paeURL, pae); - addAlphaFoldPAEToSequence(pdbAlignment, pae, 0, null); - } - - public static void addAlphaFoldPAEToSequence(AlignmentI pdbAlignment, - File pae, int index, String seqId) - { - addAlphaFoldPAE(pdbAlignment, pae, index, seqId, false, false); + try + { + UrlDownloadClient.download(paeURL, pae); + } catch (IOException e) + { + throw e; + } + // cache and it if successful + paeDownloadCache.put(paeURL, pae); + return pae; } - public static void addAlphaFoldPAEToStructure(AlignmentI pdbAlignment, - File pae, int index, String structIdOrFile, boolean isStructId) + /** + * 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 { - addAlphaFoldPAE(pdbAlignment, pae, index, structIdOrFile, true, - isStructId); + File pae = fetchAlphaFoldPAE(id, retrievalUrl); + addAlphaFoldPAE(pdbAlignment, pae, 0, null, false, false); } public static void addAlphaFoldPAE(AlignmentI pdbAlignment, File pae, @@ -291,32 +317,8 @@ public class EBIAlfaFold extends EbiFileRetrievedProxy .getStructureSelectionManager(Desktop.instance); if (ssm != null) { - String structFile = isStructId ? ssm.findFileForPDBId(id) : id; - Console.debug("##### AHA! structFile = " + structFile); - Console.debug("##### structFile " - + (ssm.isPDBFileRegistered(structFile) ? "IS " : "is NOT ") - + "registered."); - - StructureMapping[] smArray = ssm.getMapping(structFile); - Console.debug("##### AHA! smArray obtained with " + smArray.length - + " elements"); - - 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); - } + String structFilename = isStructId ? ssm.findFileForPDBId(id) : id; + addPAEToStructure(ssm, structFilename, pae); } } @@ -344,6 +346,47 @@ public class EBIAlfaFold extends EbiFileRetrievedProxy } + public static void addPAEToStructure(StructureSelectionManager ssm, + String structFilename, File pae) + { + FileInputStream paeInput = null; + try + { + paeInput = new FileInputStream(pae); + } catch (FileNotFoundException e) + { + Console.error( + "Could not find pAE file '" + pae.getAbsolutePath() + "'", e); + return; + } + if (ssm == null) + { + ssm = StructureSelectionManager + .getStructureSelectionManager(Desktop.instance); + } + if (ssm != null) + { + StructureMapping[] smArray = ssm.getMapping(structFilename); + + 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); + } + } + } + /** * parses the given pAE matrix and adds it to sequence 0 in the given * alignment @@ -356,36 +399,14 @@ public class EBIAlfaFold extends EbiFileRetrievedProxy * @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, InputStream pae_input, int index, String seqId) throws IOException, ParseException { SequenceI sequence = null; - /* debugging */ - SequenceI[] seqs = pdbAlignment.getSequencesArray(); - if (seqs == null) - Console.debug("******* sequences is null"); - else - { - for (int i = 0; i < seqs.length; i++) - { - SequenceI s = seqs[i]; - } - } - /* end debug */ if (seqId == null) { int seqToGet = index > 0 ? index : 0; sequence = pdbAlignment.getSequenceAt(seqToGet); - Console.debug("***** Got sequence at index " + seqToGet + ": " - + (sequence == null ? null : sequence.getName())); } if (sequence == null) { @@ -401,7 +422,18 @@ public class EBIAlfaFold extends EbiFileRetrievedProxy sequence = sequences[0]; // just use the first sequence with this seqId } } + if (sequence == null) + { + return false; + } + return importPaeJSONAsContactMatrixToSequence(pdbAlignment, pae_input, + sequence); + } + public static boolean importPaeJSONAsContactMatrixToSequence( + AlignmentI pdbAlignment, InputStream pae_input, + SequenceI sequence) throws IOException, ParseException + { JSONObject paeDict = parseJSONtoPAEContactMatrix(pae_input); if (paeDict == null) { @@ -419,13 +451,12 @@ public class EBIAlfaFold extends EbiFileRetrievedProxy } public static JSONObject parseJSONtoPAEContactMatrix( - InputStream pae_input) throws IOException,ParseException + InputStream pae_input) throws IOException, ParseException { Object paeJson = Platform.parseJSON(pae_input); - JSONObject paeDict=null; + JSONObject paeDict = null; if (paeJson instanceof JSONObject) { - Console.debug("***** paeJson is a JSONObject"); paeDict = (JSONObject) paeJson; } else if (paeJson instanceof JSONArray) @@ -443,13 +474,10 @@ public class EBIAlfaFold extends EbiFileRetrievedProxy throws IOException, ParseException { boolean someDone = false; - Console.debug("##### smArray.length=" + smArray.length); for (StructureMapping sm : smArray) { - Console.debug("##### sm[n]=" + sm.getPdbId()); boolean thisDone = importPaeJSONAsContactMatrixToStructure(sm, paeInput); - Console.debug("##### thisDone = " + thisDone); someDone |= thisDone; } return someDone; @@ -459,7 +487,6 @@ public class EBIAlfaFold extends EbiFileRetrievedProxy StructureMapping sm, InputStream paeInput) throws IOException, ParseException { - JSONObject pae_obj = parseJSONtoPAEContactMatrix(paeInput); if (pae_obj == null) { @@ -471,13 +498,7 @@ public class EBIAlfaFold extends EbiFileRetrievedProxy (Map) pae_obj); ((PAEContactMatrix) matrix).makeGroups(5f, true); 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(); + sm.getSequence().addAlignmentAnnotation(cmannot); return true; } @@ -502,8 +523,10 @@ public class EBIAlfaFold extends EbiFileRetrievedProxy String file = tmpFile.getAbsolutePath(); // todo get rid of Type and use FileFormatI instead? FileFormatI fileFormat = FileFormat.MMCif; - AlignmentI pdbAlignment = new FormatAdapter().readFile(tmpFile, - DataSourceType.FILE, fileFormat); + TFType tempfacType = TFType.PLDDT; + AlignmentI pdbAlignment = new FormatAdapter().readFile(tmpFile, file, + DataSourceType.FILE, fileFormat, tempfacType); + if (pdbAlignment != null) { List toremove = new ArrayList(); @@ -516,7 +539,6 @@ public class EBIAlfaFold extends EbiFileRetrievedProxy if (pid.getFile() == file) { chid = pid.getChainCode(); - } } if (chain == null || (chid != null && (chid.equals(chain) @@ -639,4 +661,9 @@ public class EBIAlfaFold extends EbiFileRetrievedProxy return new PDBFeatureSettings(); } + // days * 86400000 + private static final long PAE_CACHE_STALE_TIME = 1 * 86400000; + + private static Map paeDownloadCache = new HashMap<>(); + }