X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fws%2Fdbsources%2FEBIAlfaFold.java;h=97eacabc1fa684ca90b29d8fa7c618e4fac85ce0;hb=256638175cb9041da39d5c79090f537971e43df3;hp=b4cb614322276d6212a368722a07a3dae995bda1;hpb=023163e0fe8837c1ddb75eb30abc058f7747b5c2;p=jalview.git diff --git a/src/jalview/ws/dbsources/EBIAlfaFold.java b/src/jalview/ws/dbsources/EBIAlfaFold.java index b4cb614..97eacab 100644 --- a/src/jalview/ws/dbsources/EBIAlfaFold.java +++ b/src/jalview/ws/dbsources/EBIAlfaFold.java @@ -22,27 +22,41 @@ package jalview.ws.dbsources; import jalview.api.FeatureSettingsModelI; +import jalview.bin.Cache; +import jalview.bin.Console; import jalview.datamodel.AlignmentAnnotation; import jalview.datamodel.AlignmentI; +import jalview.datamodel.ContactMatrix; +import jalview.datamodel.ContactMatrixI; import jalview.datamodel.DBRefEntry; import jalview.datamodel.DBRefSource; import jalview.datamodel.PDBEntry; import jalview.datamodel.PDBEntry.Type; +import jalview.datamodel.SequenceFeature; import jalview.datamodel.SequenceI; +import jalview.datamodel.features.SequenceFeaturesI; import jalview.io.DataSourceType; import jalview.io.FileFormat; import jalview.io.FileFormatI; import jalview.io.FormatAdapter; import jalview.io.PDBFeatureSettings; +import jalview.javascript.json.JSON; import jalview.structure.StructureImportSettings; import jalview.util.HttpUtils; import jalview.util.MessageManager; +import jalview.util.Platform; +import jalview.ws.datamodel.alphafold.PAEContactMatrix; import jalview.ws.ebi.EBIFetchClient; import jalview.ws.utils.UrlDownloadClient; +import java.io.BufferedReader; import java.io.File; +import java.io.FileInputStream; import java.util.ArrayList; import java.util.List; +import java.util.Map; + +import org.jmol.adapter.readers.simple.JSONReader; import com.stevesoft.pat.Regex; @@ -58,6 +72,8 @@ public class EBIAlfaFold extends EbiFileRetrievedProxy private static final int PDB_ID_LENGTH = 4; + private static String AF_VERSION = "2"; + public EBIAlfaFold() { super(); @@ -82,7 +98,9 @@ public class EBIAlfaFold extends EbiFileRetrievedProxy @Override public Regex getAccessionValidator() { - return new Regex("(AF-[A-Z]+[0-9]+[A-Z0-9]+-F1)"); + Regex validator = new Regex("(AF-[A-Z]+[0-9]+[A-Z0-9]+-F1)"); + validator.setIgnoreCase(true); + return validator; } /* @@ -107,9 +125,24 @@ public class EBIAlfaFold extends EbiFileRetrievedProxy return "1"; } - public static String getAlphaFoldCifDownloadUrl(String id) + public static String getAlphaFoldCifDownloadUrl(String id, String vnum) + { + if (vnum == null || vnum.length() == 0) + { + vnum = AF_VERSION; + } + return "https://alphafold.ebi.ac.uk/files/" + id + "-model_v" + vnum + + ".cif"; + } + + public static String getAlphaFoldPaeDownloadUrl(String id, String vnum) { - return "https://alphafold.ebi.ac.uk/files/" + id + "-model_v1.cif"; + if (vnum == null || vnum.length() == 0) + { + vnum = AF_VERSION; + } + return "https://alphafold.ebi.ac.uk/files/" + id + + "-predicted_aligned_error_v" + vnum + ".json"; } /* @@ -120,6 +153,12 @@ public class EBIAlfaFold extends EbiFileRetrievedProxy @Override public AlignmentI getSequenceRecords(String queries) throws Exception { + return getSequenceRecords(queries, null); + } + + public AlignmentI getSequenceRecords(String queries, String retrievalUrl) + throws Exception + { AlignmentI pdbAlignment = null; String chain = null; String id = null; @@ -136,17 +175,22 @@ public class EBIAlfaFold extends EbiFileRetrievedProxy if (!isValidReference(id)) { System.err.println( - "(AFClient) Ignoring invalid pdb query: '" + id + "'"); + "(AFClient) Ignoring invalid alphafold query: '" + id + "'"); stopQuery(); return null; } - String alphaFoldCif = getAlphaFoldCifDownloadUrl(id); + String alphaFoldCif = getAlphaFoldCifDownloadUrl(id, AF_VERSION); + if (retrievalUrl != null) + { + alphaFoldCif = retrievalUrl; + } try { - File tmpFile = File.createTempFile(id, "cif"); + File tmpFile = File.createTempFile(id, ".cif"); + Console.debug("Retrieving structure file for "+id+" from "+alphaFoldCif); UrlDownloadClient.download(alphaFoldCif, tmpFile); - + // may not need this check ? file = tmpFile.getAbsolutePath(); if (file == null) @@ -154,8 +198,8 @@ public class EBIAlfaFold extends EbiFileRetrievedProxy return null; } - pdbAlignment = importDownloadedStructureFromUrl(alphaFoldCif, tmpFile, id, chain, getDbSource(),getDbVersion()); - + pdbAlignment = importDownloadedStructureFromUrl(alphaFoldCif, tmpFile, + id, chain, getDbSource(), getDbVersion()); if (pdbAlignment == null || pdbAlignment.getHeight() < 1) { @@ -164,6 +208,30 @@ public class EBIAlfaFold extends EbiFileRetrievedProxy { id, ((chain == null) ? "' '" : chain) })); } + // 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); + + if (retrievalUrl != null) + { + // manufacture the PAE url from a url like ...-model-vN.cif + paeURL = retrievalUrl.replace("model","predicted_aligned_error").replace(".cif",".json"); + } + Console.debug("Downloading pae from " + paeURL + + " to " + pae.toString() + ""); + + try { + UrlDownloadClient.download(paeURL, pae); + if (!importPaeJSONAsContactMatrix(pdbAlignment, pae)) + { + Console.warn("Couln't import contact matrix from " + paeURL + + " (stored in " + pae.toString() + ")"); + } + } catch (Exception pae_ex) { + Console.debug("Couldn't download PAE",pae_ex); + } + } catch (Exception ex) // Problem parsing PDB file { stopQuery(); @@ -172,8 +240,28 @@ public class EBIAlfaFold extends EbiFileRetrievedProxy return pdbAlignment; } + private boolean importPaeJSONAsContactMatrix(AlignmentI pdbAlignment, + File pae) throws Exception + { + FileInputStream pae_input = new FileInputStream(pae); + + List pae_obj = (List) Platform + .parseJSON(pae_input); + if (pae_obj == null) + { + return false; + } + ContactMatrixI matrix = new PAEContactMatrix( + pdbAlignment.getSequenceAt(0), (Map)pae_obj.get(0)); + + pdbAlignment.getSequenceAt(0).addAlignmentAnnotation(pdbAlignment.addContactList(matrix)); + return true; + } + /** - * general purpose structure importer - designed to yield alignment useful for transfer of annotation to associated sequences + * general purpose structure importer - designed to yield alignment useful for + * transfer of annotation to associated sequences + * * @param alphaFoldCif * @param tmpFile * @param id @@ -183,8 +271,9 @@ public class EBIAlfaFold extends EbiFileRetrievedProxy * @return * @throws Exception */ - public static AlignmentI importDownloadedStructureFromUrl(String alphaFoldCif, - File tmpFile, String id, String chain, String dbSource, String dbVersion) throws Exception + public static AlignmentI importDownloadedStructureFromUrl( + String alphaFoldCif, File tmpFile, String id, String chain, + String dbSource, String dbVersion) throws Exception { String file = tmpFile.getAbsolutePath(); // todo get rid of Type and use FileFormatI instead? @@ -236,6 +325,23 @@ public class EBIAlfaFold extends EbiFileRetrievedProxy dbVersion, (chid == null ? id : id + chid)); // dbentry.setMap() pdbcs.addDBRef(dbentry); + // update any feature groups + List allsf = pdbcs.getFeatures() + .getAllFeatures(); + List newsf = new ArrayList(); + if (allsf != null && allsf.size() > 0) + { + for (SequenceFeature f : allsf) + { + if (file.equals(f.getFeatureGroup())) + { + f = new SequenceFeature(f, f.type, f.begin, f.end, id, + f.score); + } + newsf.add(f); + } + pdbcs.setSequenceFeatures(newsf); + } } } else @@ -279,13 +385,13 @@ public class EBIAlfaFold extends EbiFileRetrievedProxy @Override public String getTestQuery() { - return "1QIP"; + return "AF-O15552-F1"; } @Override public String getDbName() { - return "PDB"; // getDbSource(); + return "ALPHAFOLD"; // getDbSource(); } @Override @@ -308,4 +414,5 @@ public class EBIAlfaFold extends EbiFileRetrievedProxy { return new PDBFeatureSettings(); } + }