X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fio%2FDasSequenceFeatureFetcher.java;fp=src%2Fjalview%2Fio%2FDasSequenceFeatureFetcher.java;h=f78f943bbac8e4526331d4f01b108af58cb7bc12;hb=0f71bfca98457c30f1051f142c31b6aaa3e23ead;hp=0000000000000000000000000000000000000000;hpb=072fc418c393cbd2a40dfa1d3e46f90178b79572;p=jalview.git diff --git a/src/jalview/io/DasSequenceFeatureFetcher.java b/src/jalview/io/DasSequenceFeatureFetcher.java new file mode 100755 index 0000000..f78f943 --- /dev/null +++ b/src/jalview/io/DasSequenceFeatureFetcher.java @@ -0,0 +1,474 @@ +/* +* Jalview - A Sequence Alignment Editor and Viewer +* Copyright (C) 2006 AM Waterhouse, J Procter, 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 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. +* +* 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 +*/ +package jalview.io; + +import jalview.datamodel.*; + +import jalview.gui.*; + +import java.util.*; + +import java.net.URL; + +import org.biojava.dasobert.das.FeatureThread; +import org.biojava.dasobert.eventmodel.FeatureEvent; +import org.biojava.dasobert.eventmodel.FeatureListener; +import org.biojava.dasobert.dasregistry.DasSource; + +import org.biojava.dasobert.das2.io.DasSourceReaderImpl; +import org.biojava.dasobert.dasregistry.Das1Source; +import org.biojava.dasobert.dasregistry.DasSource; +import org.biojava.dasobert.das2.Das2Source; +import org.biojava.dasobert.das2.DasSourceConverter; + + +import jalview.bin.Cache; +import org.biojava.dasobert.dasregistry.DasCoordinateSystem; + +import javax.swing.*; + +/** + * DOCUMENT ME! + * + * @author $author$ + * @version $Revision$ + */ +public class DasSequenceFeatureFetcher implements Runnable +{ + SequenceI [] sequences; + AlignFrame af; + StringBuffer sbuffer = new StringBuffer(); + Vector selectedSources; + + long startTime; + int threadsRunning = 0; + + + /** + * Creates a new SequenceFeatureFetcher object. + * Uses default + * + * @param align DOCUMENT ME! + * @param ap DOCUMENT ME! + */ + public DasSequenceFeatureFetcher(SequenceI [] sequences, + final AlignFrame af, + Vector selectedSources) + { + this.selectedSources = selectedSources; + this.sequences = sequences; + this.af = af; + + int uniprotCount = 0; + for (int i = 0; i < selectedSources.size(); i++) + { + DasSource source = (DasSource) selectedSources.elementAt(i); + DasCoordinateSystem[] coords = source.getCoordinateSystem(); + for (int c = 0; c < coords.length; c++) + { + if (coords[c].getName().indexOf("UniProt")>-1) + { + uniprotCount++; + break; + } + } + } + + int refCount = 0; + for(int i=0; i0) + { + + int reply = JOptionPane.showInternalConfirmDialog(Desktop.desktop, + "Do you want Jalview to find\n" + +"Uniprot Accession ids for given sequence names?", + "Find Uniprot Accession Ids", + JOptionPane.YES_NO_OPTION, + JOptionPane.QUESTION_MESSAGE); + + if(reply == JOptionPane.YES_OPTION) + { + Thread thread = new Thread(new FetchDBRefs()); + thread.start(); + } + else + startFetching(); + } + else + startFetching(); + + /* System.out.println("User selection is " + + ( ( (float) uniprotCount / (float) selectedSources.size()) * 100) + + " % Uniprot, and "+refCount+" / " +sequences.length+" have uniprot accession"); +*/ + } + + void startFetching() + { + Thread thread = new Thread(this); + thread.start(); + } + + class FetchDBRefs implements Runnable + { + public void run() + { + new DBRefFetcher( + af.getViewport().getAlignment(), af).fetchDBRefs(true); + startFetching(); + } + } + + + /** + * creates a jalview sequence feature from a das feature document + * @param dasfeature + * @return sequence feature object created using dasfeature information + */ + SequenceFeature newSequenceFeature(Map dasfeature, String nickname) + { + try { + /** + * Different qNames for a DAS Feature - are string keys to the HashMaps in features + * "METHOD") || + qName.equals("TYPE") || + qName.equals("START") || + qName.equals("END") || + qName.equals("NOTE") || + qName.equals("LINK") || + qName.equals("SCORE") + */ + String desc = new String(); + if (dasfeature.containsKey("NOTE")) + desc+=(String) dasfeature.get("NOTE"); + + + int start = 0, end = 0; + float score = 0f; + + try{ start = Integer.parseInt( dasfeature.get("START").toString()); } + catch( Exception ex){} + try{ end = Integer.parseInt( dasfeature.get("END").toString()); } + catch (Exception ex){} + try{ score = Integer.parseInt( dasfeature.get("SCORE").toString()); } + catch (Exception ex){} + + + SequenceFeature f = new SequenceFeature( + (String) dasfeature.get("TYPE"), + desc, + start, + end, + score, + nickname); + + if (dasfeature.containsKey("LINK")) + { + f.addLink(f.getType()+" "+f.begin+"_"+f.end + +"|"+ dasfeature.get("LINK")); + } + // (String) dasfeature.get("ID"), + //// (String) dasfeature.get("METHOD"), + // (String) dasfeature.get("SCORE"), + // null + // ); + + return f; + } + catch (Exception e) { + e.printStackTrace(); + Cache.log.debug("Failed to parse "+dasfeature.toString(), e); + return null; + } + } + /** + * fetch and add das features to a sequence using the given source URL and Id to create a feature request + * @param seq + * @param SourceUrl + * @param id + */ + protected void createFeatureFetcher(final SequenceI seq, + final String sourceUrl, + String id, + String nickname) + { + ////////////// + /// fetch DAS features + final Das1Source source = new Das1Source(); + source.setUrl(sourceUrl); + source.setNickname(nickname); + + + Cache.log.debug("new Das Feature Fetcher for " + id + " querying " + + sourceUrl); + + if (id != null && id.length() > 0) + { + setThreadsRunning(+1); + + // int start=seq.getStart(), end = seq.getEnd(); + /* if(af.getViewport().getSelectionGroup()!=null) + { + SequenceI tmp = af.getViewport().getAlignment().findName(seq.getName()); + start = tmp.findPosition( + af.getViewport().getSelectionGroup().getStartRes() + ); + + end = tmp.findPosition( + af.getViewport().getSelectionGroup().getEndRes() + ); + }*/ + + FeatureThread fetcher = new FeatureThread(id + // + ":" + start + "," + end, + , source); + + + fetcher.addFeatureListener(new FeatureListener() + { + public void comeBackLater(FeatureEvent e) + { + setThreadsRunning(-1); + Cache.log.debug("das source " + e.getDasSource().getNickname() + + " asked us to come back in " + e.getComeBackLater() + + " secs."); + } + + public void newFeatures(FeatureEvent e) + { + setThreadsRunning(-1); + Das1Source ds = e.getDasSource(); + + Map[] features = e.getFeatures(); + // add features to sequence + Cache.log.debug("das source " + ds.getUrl() + " returned " + + features.length + " features"); + + if (features.length > 0) + { + for (int i = 0; i < features.length; i++) + { + SequenceFeature f = newSequenceFeature(features[i], + source.getNickname()); + + seq.addSequenceFeature(f); + } + } + else + { + System.out.println("No features found for sequence " +seq.getName() + +" from: "+ e.getDasSource().getNickname()); + } + + } + } + + ); + + //NOTE alignPanel listener will be called after the previous + //anonymous listener!!! + fetcher.addFeatureListener(af); + + fetcher.start(); + } + } + + synchronized void setThreadsRunning(int i) + { + threadsRunning += i; + if(threadsRunning<1) + { + af.setProgressBar("DAS Feature Fetching Complete", startTime); + + if(af.featureSettings!=null) + af.featureSettings.setTableData(); + } + } + + /** + * Spawns a number of dasobert Fetcher threads to add features to sequences in the dataset + */ + public void run() + { + startTime = System.currentTimeMillis(); + af.setProgressBar("Fetching DAS Sequence Features", startTime); + + DasSource [] sources = new jalview.gui.DasSourceBrowser().getDASSource(); + + if(selectedSources==null || selectedSources.size()==0) + { + String active = jalview.bin.Cache.getDefault("DAS_ACTIVE_SOURCE", "uniprot"); + StringTokenizer st = new StringTokenizer(active, "\t"); + Vector selectedSources = new Vector(); + String token; + while (st.hasMoreTokens()) + { + token = st.nextToken(); + for (int i = 0; i < sources.length; i++) + { + if (sources[i].getNickname().equals(token)) + { + selectedSources.addElement(sources[i]); + break; + } + } + } + } + + if(selectedSources == null || selectedSources.size()==0) + { + System.out.println("No DAS Sources active"); + af.setProgressBar("No DAS Sources Active", startTime); + return; + } + + try + { + int seqIndex = 0; + while (seqIndex < sequences.length) + { + DBRefEntry [] uprefs = jalview.util.DBRefUtils.selectRefs(sequences[seqIndex].getDBRef(), + new String[] { + jalview.datamodel.DBRefSource.PDB, + jalview.datamodel.DBRefSource.UNIPROT}); + + for(int sourceIndex=0; sourceIndex -1) + { + id = sequences[seqIndex].getName().substring( + sequences[seqIndex].getName().lastIndexOf("|") + 1); + } + else + { + id = sequences[seqIndex].getName(); + } + if (id != null) + { + // Should try to call a general feature fetcher that queries many sources with name to discover applicable ID references + createFeatureFetcher(sequences[seqIndex], + dasSource.getUrl(), + id, + dasSource.getNickname()); + } + } + } + + seqIndex++; + } + } + catch (Exception ex) + { + ex.printStackTrace(); + } + } + + + public static DasSource[] getDASSources() + { + DasSourceReaderImpl reader = new DasSourceReaderImpl(); + + String registryURL =jalview.bin.Cache.getDefault("DAS_REGISTRY_URL", + "http://das.sanger.ac.uk/registry/das1/sources/" + ); + + try + { + URL url = new URL(registryURL); + + DasSource[] sources = reader.readDasSource(url); + + List das1sources = new ArrayList(); + for (int i = 0; i < sources.length; i++) + { + DasSource ds = sources[i]; + if (ds instanceof Das2Source) + { + Das2Source d2s = (Das2Source) ds; + if (d2s.hasDas1Capabilities()) + { + Das1Source d1s = DasSourceConverter.toDas1Source(d2s); + das1sources.add(d1s); + } + + } + else if (ds instanceof Das1Source) + { + das1sources.add( (Das1Source) ds); + } + } + + return (Das1Source[]) das1sources.toArray(new Das1Source[das1sources.size()]); + } + catch (Exception ex) + { + ex.printStackTrace(); + return null; + } + + } +} + +