/* * 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; } } }