X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fws%2FDBRefFetcher.java;h=c1fe276676973d08f180c17f30df232d0bb9c61d;hb=ad75f8e44a6c2cdd69cb86f7fbf5fbef3ef9836d;hp=4b7c07e6d1b0dcd72ab01909a98a0c732fdd0a39;hpb=37c97b109c3a03f4640bce3855069f8ad8e17123;p=jalview.git diff --git a/src/jalview/ws/DBRefFetcher.java b/src/jalview/ws/DBRefFetcher.java index 4b7c07e..c1fe276 100644 --- a/src/jalview/ws/DBRefFetcher.java +++ b/src/jalview/ws/DBRefFetcher.java @@ -1,24 +1,24 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Development Version 2.4.1) - * Copyright (C) 2009 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle + * Jalview - A Sequence Alignment Editor and Viewer (Version 2.6) + * Copyright (C) 2010 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. + * This file is part of Jalview. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * Jalview is free software: you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * Jalview is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with Jalview. If not, see . */ package jalview.ws; import jalview.analysis.AlignSeq; +import jalview.bin.Cache; import jalview.datamodel.AlignmentI; import jalview.datamodel.DBRefEntry; import jalview.datamodel.DBRefSource; @@ -59,6 +59,7 @@ public class DBRefFetcher implements Runnable StringBuffer sbuffer = new StringBuffer(); boolean running = false; + /** * picr client instance */ @@ -72,39 +73,45 @@ public class DBRefFetcher implements Runnable SequenceFetcher sfetcher; + private SequenceI[] alseqs; + public DBRefFetcher() { } /** - * Creates a new SequenceFeatureFetcher object and fetches from the - * currently selected set of databases. + * Creates a new SequenceFeatureFetcher object and fetches from the currently + * selected set of databases. * * @param seqs - * fetch references for these sequences + * fetch references for these sequences * @param af - * the parent alignframe for progress bar monitoring. + * the parent alignframe for progress bar monitoring. */ public DBRefFetcher(SequenceI[] seqs, AlignFrame af) { this(seqs, af, null); } + /** - * Creates a new SequenceFeatureFetcher object and fetches from the - * currently selected set of databases. + * Creates a new SequenceFeatureFetcher object and fetches from the currently + * selected set of databases. * * @param seqs - * fetch references for these sequences + * fetch references for these sequences * @param af - * the parent alignframe for progress bar monitoring. - * @param sources array of database source strings to query references from + * the parent alignframe for progress bar monitoring. + * @param sources + * array of database source strings to query references from */ public DBRefFetcher(SequenceI[] seqs, AlignFrame af, String[] sources) { this.af = af; + alseqs = new SequenceI[seqs.length]; SequenceI[] ds = new SequenceI[seqs.length]; for (int i = 0; i < seqs.length; i++) { + alseqs[i] = seqs[i]; if (seqs[i].getDatasetSequence() != null) ds[i] = seqs[i].getDatasetSequence(); else @@ -113,12 +120,14 @@ public class DBRefFetcher implements Runnable this.dataset = ds; // TODO Jalview 2.5 lots of this code should be in the gui package! sfetcher = jalview.gui.SequenceFetcher.getSequenceFetcherSingleton(af); - if (sources==null) + if (sources == null) { // af.featureSettings_actionPerformed(null); - String[] defdb=null,otherdb = sfetcher.getDbInstances(jalview.ws.dbsources.DasSequenceSource.class); - Vector selsources = new Vector(), dasselsrc= (af.featureSettings!=null) ? af.featureSettings.getSelectedSources() - : new jalview.gui.DasSourceBrowser().getSelectedSources(); + String[] defdb = null, otherdb = sfetcher + .getDbInstances(jalview.ws.dbsources.DasSequenceSource.class); + Vector selsources = new Vector(), dasselsrc = (af.featureSettings != null) ? af.featureSettings + .getSelectedSources() : new jalview.gui.DasSourceBrowser() + .getSelectedSources(); Enumeration en = dasselsrc.elements(); while (en.hasMoreElements()) { @@ -126,12 +135,14 @@ public class DBRefFetcher implements Runnable selsources.addElement(src.getNickname()); } int osel = 0; - for (int o=0;otherdb!=null && o0) + String[] otherdb = sfetcher + .getDbInstances(jalview.ws.dbsources.DasSequenceSource.class); + if (otherdb != null && otherdb.length > 0) { - String[] newsrc = new String[dbSources.length+otherdb.length]; - System.arraycopy(dbSources, 0, newsrc,0,dbSources.length); - System.arraycopy(otherdb, 0, newsrc,dbSources.length, otherdb.length); + String[] newsrc = new String[dbSources.length + otherdb.length]; + System.arraycopy(dbSources, 0, newsrc, 0, dbSources.length); + System.arraycopy(otherdb, 0, newsrc, dbSources.length, otherdb.length); dbSources = newsrc; } } + /** * start the fetcher thread * * @param waitTillFinished - * true to block until the fetcher has finished + * true to block until the fetcher has finished */ public void fetchDBRefs(boolean waitTillFinished) { @@ -209,9 +229,9 @@ public class DBRefFetcher implements Runnable * could be either seq name or dbref id * * @param seq - * SequenceI + * SequenceI * @param key - * String + * String */ void addSeqId(SequenceI seq, String key) { @@ -254,8 +274,13 @@ public class DBRefFetcher implements Runnable running = true; long startTime = System.currentTimeMillis(); af.setProgressBar("Fetching db refs", startTime); - try { - picrClient = new uk.ac.ebi.www.picr.AccessionMappingService.AccessionMapperServiceLocator().getAccessionMapperPort(); + try + { + if (Cache.getDefault("DBREFFETCH_USEPICR", false)) + { + picrClient = new uk.ac.ebi.www.picr.AccessionMappingService.AccessionMapperServiceLocator() + .getAccessionMapperPort(); + } } catch (Exception e) { System.err.println("Couldn't locate PICR service instance.\n"); @@ -304,10 +329,10 @@ public class DBRefFetcher implements Runnable { // Still queries to make for current seqIndex StringBuffer queryString = new StringBuffer(""); - int numq=0,nqSize = (maxqlen > queries.size()) ? queries.size() - : maxqlen; - - while (queries.size()>0 && numq < nqSize) + int numq = 0, nqSize = (maxqlen > queries.size()) ? queries + .size() : maxqlen; + + while (queries.size() > 0 && numq < nqSize) { String query = (String) queries.elementAt(0); if (dbsource.isValidReference(query)) @@ -326,7 +351,9 @@ public class DBRefFetcher implements Runnable { if (jalview.bin.Cache.log.isDebugEnabled()) { - jalview.bin.Cache.log.debug("Querying "+dbsource.getDbName()+" with : '"+queryString.toString()+"'"); + jalview.bin.Cache.log.debug("Querying " + + dbsource.getDbName() + " with : '" + + queryString.toString() + "'"); } retrieved = dbsource.getSequenceRecords(queryString.toString()); } catch (Exception ex) @@ -353,14 +380,12 @@ public class DBRefFetcher implements Runnable { dbSources[db] }); // jalview.datamodel.DBRefSource.UNIPROT // }); // check for existing dbrefs to use - if (uprefs != null && uprefs.length>0) + if (uprefs != null && uprefs.length > 0) { for (int j = 0; j < uprefs.length; j++) { addSeqId(sequence, uprefs[j].getAccessionId()); - queries - .addElement(uprefs[j].getAccessionId() - .toUpperCase()); + queries.addElement(uprefs[j].getAccessionId().toUpperCase()); } } else @@ -372,25 +397,40 @@ public class DBRefFetcher implements Runnable { String token = st.nextToken(); UPEntry[] presp = null; - try { - presp=picrClient.getUPIForAccession(token, null, picrClient.getMappedDatabaseNames(), null, true); - } catch (Exception e) { - System.err.println("Exception with Picr for '"+token+"'\n"); - e.printStackTrace(); + if (picrClient != null) + { + // resolve the string against PICR to recover valid IDs + try + { + presp = picrClient + .getUPIForAccession(token, null, + picrClient.getMappedDatabaseNames(), + null, true); + } catch (Exception e) + { + System.err.println("Exception with Picr for '" + token + + "'\n"); + e.printStackTrace(); + } } - if (presp!=null && presp.length>0) + if (presp != null && presp.length > 0) { - for (int id=0;id 0) { - output - .setText("Your sequences have been verified against known sequence databases. Some of the ids have been\n" - + "altered, most likely the start/end residue will have been updated.\n" - + "Save your alignment to maintain the updated id.\n\n" - + sbuffer.toString()); + output.setText("Your sequences have been verified against known sequence databases. Some of the ids have been\n" + + "altered, most likely the start/end residue will have been updated.\n" + + "Save your alignment to maintain the updated id.\n\n" + + sbuffer.toString()); Desktop.addInternalFrame(output, "Sequence names updated ", 600, 300); // The above is the dataset, we must now find out the index // of the viewed sequence @@ -431,13 +470,15 @@ public class DBRefFetcher implements Runnable AlignmentI retrievedAl) // File // file) { - if (retrievedAl == null || retrievedAl.getHeight() == 0) { return; } - SequenceI[] retrieved = recoverDbSequences(retrievedAl.getSequencesArray()); + SequenceI[] retrieved = recoverDbSequences(retrievedAl + .getSequencesArray()); SequenceI sequence = null; + boolean transferred = false; + StringBuffer messages = new StringBuffer(); // Vector entries = new Uniprot().getUniprotEntries(file); @@ -451,9 +492,16 @@ public class DBRefFetcher implements Runnable // taking into account all accessionIds and names in the file Vector sequenceMatches = new Vector(); // look for corresponding accession ids - DBRefEntry[] entryRefs = jalview.util.DBRefUtils.selectRefs(entry - .getDBRef(), new String[] - { dbSource }); + DBRefEntry[] entryRefs = jalview.util.DBRefUtils.selectRefs( + entry.getDBRef(), new String[] + { dbSource }); + if (entryRefs == null) + { + System.err + .println("Dud dbSource string ? no entryrefs selected for " + + dbSource + " on " + entry.getName()); + continue; + } for (int j = 0; j < entryRefs.length; j++) { String accessionId = entryRefs[j].getAccessionId(); // .getAccession().elementAt(j).toString(); @@ -530,11 +578,11 @@ public class DBRefFetcher implements Runnable absStart = nonGapped.indexOf(entrySeq); if (absStart == -1) { // verification failed. - sbuffer.append(sequence.getName() + messages.append(sequence.getName() + " SEQUENCE NOT %100 MATCH \n"); continue; } - + transferred = true; sbuffer.append(sequence.getName() + " HAS " + absStart + " PREFIXED RESIDUES COMPARED TO " + dbSource + "\n"); // @@ -554,6 +602,7 @@ public class DBRefFetcher implements Runnable } else { + transferred = true; // update start and end of local sequence to place it in entry's // reference frame. // apply identity map map from whole of local sequence to matching @@ -565,20 +614,24 @@ public class DBRefFetcher implements Runnable // absStart+sequence.getStart()+entrySeq.length()-1}, // new int[] { entry.getStart(), entry.getEnd() }, 1, 1); // relocate local features for updated start - if (updateRefFrame && sequence.getSequenceFeatures() != null) + if (updateRefFrame) { - SequenceFeature[] sf = sequence.getSequenceFeatures(); - int start = sequence.getStart(); - int end = sequence.getEnd(); - int startShift = 1 - absStart - start; // how much the features are - // to be shifted by - for (int sfi = 0; sfi < sf.length; sfi++) + if (sequence.getSequenceFeatures() != null) { - if (sf[sfi].getBegin() >= start && sf[sfi].getEnd() <= end) + SequenceFeature[] sf = sequence.getSequenceFeatures(); + int start = sequence.getStart(); + int end = sequence.getEnd(); + int startShift = 1 - absStart - start; // how much the features + // are + // to be shifted by + for (int sfi = 0; sfi < sf.length; sfi++) { - // shift feature along by absstart - sf[sfi].setBegin(sf[sfi].getBegin() + startShift); - sf[sfi].setEnd(sf[sfi].getEnd() + startShift); + if (sf[sfi].getBegin() >= start && sf[sfi].getEnd() <= end) + { + // shift feature along by absstart + sf[sfi].setBegin(sf[sfi].getBegin() + startShift); + sf[sfi].setEnd(sf[sfi].getEnd() + startShift); + } } } } @@ -595,39 +648,71 @@ public class DBRefFetcher implements Runnable // finally, update local sequence reference frame if we're allowed sequence.setStart(absStart); sequence.setEnd(absEnd); + // search for alignment sequences to update coordinate frame for + for (int alsq = 0; alsq < alseqs.length; alsq++) + { + if (alseqs[alsq].getDatasetSequence() == sequence) + { + String ngAlsq = AlignSeq.extractGaps("-. ", + alseqs[alsq].getSequenceAsString()).toUpperCase(); + int oldstrt = alseqs[alsq].getStart(); + alseqs[alsq].setStart(sequence.getSequenceAsString() + .toUpperCase().indexOf(ngAlsq) + + sequence.getStart()); + if (oldstrt != alseqs[alsq].getStart()) + { + alseqs[alsq].setEnd(ngAlsq.length() + + alseqs[alsq].getStart() - 1); + } + } + } + // TODO: search for all other references to this dataset sequence, and + // update start/end + // TODO: update all AlCodonMappings which involve this alignment + // sequence (e.g. Q30167 cdna translation from exon2 product (vamsas + // demo) } // and remove it from the rest // TODO: decide if we should remove annotated sequence from set sdataset.remove(sequence); - // TODO: should we make a note of sequences that have received new DB ids, so we can query all enabled DAS servers for them ? + // TODO: should we make a note of sequences that have received new DB + // ids, so we can query all enabled DAS servers for them ? } } + if (!transferred) + { + // report the ID/sequence mismatches + sbuffer.append(messages); + } } /** * loop thru and collect additional sequences in Map. + * * @param sequencesArray * @return */ private SequenceI[] recoverDbSequences(SequenceI[] sequencesArray) { Vector nseq = new Vector(); - for (int i=0;sequencesArray!=null && i0) { + if (nseq.size() > 0) + { sequencesArray = new SequenceI[nseq.size()]; nseq.toArray(sequencesArray); }