/* * Jalview - A Sequence Alignment Editor and Viewer * Copyright (C) 2005 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.dasregistry.Das1Source; import org.biojava.dasobert.eventmodel.FeatureEvent; import org.biojava.dasobert.eventmodel.FeatureListener; import org.biojava.services.das.registry.DasRegistryAxisClient; import org.biojava.services.das.registry.DasSource; import jalview.bin.Cache; /** * DOCUMENT ME! * * @author $author$ * @version $Revision$ */ public class DasSequenceFeatureFetcher implements Runnable { final AlignmentI dataset; final AlignmentPanel ap; StringBuffer sbuffer = new StringBuffer(); /** * Creates a new SequenceFeatureFetcher object. * * @param align DOCUMENT ME! * @param ap DOCUMENT ME! */ public DasSequenceFeatureFetcher(AlignmentI align, AlignmentPanel ap) { this.dataset = align.getDataset(); this.ap = ap; Thread thread = new Thread(this); thread.start(); } /** * 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 // ); // System.out.println(nickname+" "+f.getType()+" "+f.begin+" "+f.end); 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 Sequence 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) { FeatureThread fetcher = new FeatureThread(id + ":" + seq.getStart() + "," +seq.getEnd() , source); fetcher.addFeatureListener(new FeatureListener() { public void comeBackLater(FeatureEvent e) { Cache.log.debug("das source " + e.getDasSource().getNickname() + " asked us to come back in " + e.getComeBackLater() + " secs."); } public void newFeatures(FeatureEvent e) { 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()); if (seq.sequenceFeatures != null) { for (int j = 0; (f != null) && j < seq.sequenceFeatures.length; j++) { if (seq.sequenceFeatures[j].equals(f)) { f = null; } } } if (f != null) { seq.addSequenceFeature(f); } } } } } ); //NOTE alignPanel listener will be called after the previous //anonymous listener!!! fetcher.addFeatureListener(ap); fetcher.start(); } } /** * Spawns a number of dasobert Fetcher threads to add features to sequences in the dataset */ public void run() { DasSource [] sources = new jalview.gui.DasSourceBrowser().getDASSource(); 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 -1) { id = sequence.getName().substring( sequence.getName().lastIndexOf("|") + 1); } else { id = sequence.getName(); } if (id != null) { // Should try to call a general feature fetcher that queries many sources with name to discover applicable ID references createFeatureFetcher(sequence, dasSource.getUrl(), id, dasSource.getNickname()); } } } seqIndex++; } } catch (Exception ex) { ex.printStackTrace(); } } public static DasSource[] getDASSources() { try { String registryURL = jalview.bin.Cache.getDefault("DAS_REGISTRY_URL", "http://servlet.sanger.ac.uk/dasregistry/services/das_registry"); URL url = new URL(registryURL); DasRegistryAxisClient client = new DasRegistryAxisClient(url); DasSource[] services = client.listServices(); return services; } catch (Exception ex) { ex.printStackTrace(); } return null; } }