From: Jim Procter Date: Wed, 16 Feb 2022 13:27:25 +0000 (+0000) Subject: Merge branch 'develop' into features/r2_11_2_alphafold/JAL-2349_JAL-3855 X-Git-Tag: Release_2_11_4_0~562^2 X-Git-Url: http://source.jalview.org/gitweb/?a=commitdiff_plain;h=8286731258d314669ee6facb627947fe159ac1eb;p=jalview.git Merge branch 'develop' into features/r2_11_2_alphafold/JAL-2349_JAL-3855 combined new logic for 2.11.2 3d-beacons with original hack to resolve PAE and CIF Conflicts: src/jalview/ws/dbsources/EBIAlfaFold.java --- 8286731258d314669ee6facb627947fe159ac1eb diff --cc src/jalview/ws/dbsources/EBIAlfaFold.java index 6c7818b,4449b0b..bbb1f8b --- a/src/jalview/ws/dbsources/EBIAlfaFold.java +++ b/src/jalview/ws/dbsources/EBIAlfaFold.java @@@ -22,11 -22,8 +22,12 @@@ 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; @@@ -161,8 -156,10 +174,11 @@@ public class EBIAlfaFold extends EbiFil 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) { @@@ -244,17 -176,6 +195,29 @@@ { 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); - UrlDownloadClient.download(paeURL, pae); ++ ++ 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)) + { - Cache.log.debug("Couln't import contact matrix from " + paeURL ++ 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(); @@@ -263,24 -184,110 +226,128 @@@ 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 + * @param alphaFoldCif + * @param tmpFile + * @param id + * @param chain + * @param dbSource + * @param dbVersion + * @return + * @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? + FileFormatI fileFormat = FileFormat.MMCif; + AlignmentI pdbAlignment = new FormatAdapter().readFile(tmpFile, + DataSourceType.FILE, fileFormat); + if (pdbAlignment != null) + { + List toremove = new ArrayList(); + for (SequenceI pdbcs : pdbAlignment.getSequences()) + { + String chid = null; + // Mapping map=null; + for (PDBEntry pid : pdbcs.getAllPDBEntries()) + { + if (pid.getFile() == file) + { + chid = pid.getChainCode(); + + } + } + if (chain == null || (chid != null && (chid.equals(chain) + || chid.trim().equals(chain.trim()) + || (chain.trim().length() == 0 && chid.equals("_"))))) + { + // FIXME seems to result in 'PDB|1QIP|1qip|A' - 1QIP is redundant. + // TODO: suggest simplify naming to 1qip|A as default name defined + pdbcs.setName(id + SEPARATOR + pdbcs.getName()); + // Might need to add more metadata to the PDBEntry object + // like below + /* + * PDBEntry entry = new PDBEntry(); // Construct the PDBEntry + * entry.setId(id); if (entry.getProperty() == null) + * entry.setProperty(new Hashtable()); + * entry.getProperty().put("chains", pdbchain.id + "=" + + * sq.getStart() + "-" + sq.getEnd()); + * sq.getDatasetSequence().addPDBId(entry); + */ + // Add PDB DB Refs + // We make a DBRefEtntry because we have obtained the PDB file from + // a + // verifiable source + // JBPNote - PDB DBRefEntry should also carry the chain and mapping + // information + if (dbSource != null) + { + DBRefEntry dbentry = new DBRefEntry(dbSource, + + 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 + { + // mark this sequence to be removed from the alignment + // - since it's not from the right chain + toremove.add(pdbcs); + } + } + // now remove marked sequences + for (SequenceI pdbcs : toremove) + { + pdbAlignment.deleteSequence(pdbcs); + if (pdbcs.getAnnotation() != null) + { + for (AlignmentAnnotation aa : pdbcs.getAnnotation()) + { + pdbAlignment.deleteAnnotation(aa); + } + } + } + } + return pdbAlignment; + } + /* * (non-Javadoc) * diff --cc test/jalview/ws/seqfetcher/DbRefFetcherTest.java index bf34ea5,b987e02..851ab2d --- a/test/jalview/ws/seqfetcher/DbRefFetcherTest.java +++ b/test/jalview/ws/seqfetcher/DbRefFetcherTest.java @@@ -36,8 -35,8 +37,9 @@@ import jalview.datamodel.SequenceFeatur import jalview.datamodel.SequenceI; import jalview.gui.JvOptionPane; import jalview.util.DBRefUtils; + import jalview.ws.DBRefFetcher; import jalview.ws.SequenceFetcher; +import jalview.ws.dbsources.EBIAlfaFold; import jalview.ws.dbsources.Pdb; import jalview.ws.dbsources.Uniprot;