/* * The MIT License (MIT) * * Copyright (c) 2007-2015 Broad Institute * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ package org.broad.igv.track; import htsjdk.tribble.Feature; import org.apache.log4j.Logger; import org.broad.igv.Globals; import org.broad.igv.feature.Mutation; import org.broad.igv.prefs.Constants; import org.broad.igv.ui.IGV; import org.broad.igv.ui.TooltipTextFrame; import org.broad.igv.ui.panel.ReferenceFrame; import org.broad.igv.ui.util.UIUtilities; import org.broad.igv.util.HttpUtils; import org.broad.igv.util.LongRunningTask; import org.broad.igv.util.NamedRunnable; import org.broad.igv.util.ResourceLocator; import java.awt.*; import java.awt.event.MouseEvent; import java.io.BufferedReader; import java.io.IOException; import java.io.StringReader; import java.net.URL; /** * @author Jim Robinson * @date 11/8/11 */ public class MutationTrack extends FeatureTrack { private static Logger log = Logger.getLogger(MutationTrack.class); public MutationTrack(ResourceLocator locator, String id, FeatureSource source) { super(locator, id, source); setSortable(true); } @Override public boolean isFilterable() { return true; // Mutation tracks, unlike most FeatureTrack types, can be filtered } @Override public void overlay(RenderContext context, Rectangle rect) { if (!context.getChr().equals(Globals.CHR_ALL) || IGV.getInstance().getSession().getPreferenceAsBoolean(Constants.OVERLAY_MUTATIONS_WHOLE_GENOME)) { renderFeatures(context, rect); } } /** * Return a string for popup text. * * @param chr * @param position in genomic coordinates * @param mouseX * @return */ @Override public String getValueStringAt(String chr, double position, int mouseX, int mouseY, ReferenceFrame frame) { return super.getValueStringAt(chr, position, mouseX, mouseY, frame); //To change body of overridden methods use File | Settings | File Templates. } @Override public boolean handleDataClick(TrackClickEvent te) { Feature f = getFeatureAtMousePosition(te); if (f != null && f instanceof Mutation) { final Mutation mut = (Mutation) f; final MouseEvent me = te.getMouseEvent(); System.out.println("Submitting"); LongRunningTask.submit(new NamedRunnable() { public String getName() { return "Call OMA"; } public void run() { StringBuffer buf = new StringBuffer(); buf.append("<html>"); buf.append("<p style=\"font-size:medium;\"><b>"); buf.append(mut.getDescription()); buf.append("</b></p><br><hr>"); buf.append(mut.getFullDescription()); final String omaURL = mut.getOMAUrl(); if (omaURL != null) { System.out.println("Running"); String omaText = getOMAText(mut, omaURL); if (omaText != null) { buf.append("<hr>"); buf.append(omaText); } } buf.append("</html>"); final TooltipTextFrame tf = new TooltipTextFrame(MutationTrack.this.getName(), buf.toString()); Point p = me.getComponent().getLocationOnScreen(); tf.setLocation(Math.max(0, p.x + me.getX() - 150), Math.max(0, p.y + me.getY() - 150)); UIUtilities.invokeOnEventThread(new Runnable() { public void run() { tf.setVisible(true); } }); } }); return true; } return false; } private String getOMAText(Mutation mut, String url) { try { String omaWebService = url + "&frm=txt&fts=all"; String result = HttpUtils.getInstance().getContentsAsString(new URL(omaWebService)); BufferedReader br = new BufferedReader(new StringReader(result)); String[] headers = br.readLine().split("\t"); String[] values = br.readLine().split("\t"); StringBuffer buf = new StringBuffer(); buf.append("<table>"); buf.append("<tr><td>Data from</td><td><a href=\""); buf.append(url); buf.append("\">Mutation Assessor</a></td><tr>"); buf.append("<tr><td>Type</td><td>" + mut.getMutationType() + "</td></tr>"); int n = Math.min(headers.length, values.length); for (int i = 0; i < n; i++) { final String header = headers[i].trim(); final String value = values[i].trim(); if (header.length() == 0 || value.length() == 0) continue; buf.append("<tr>"); buf.append("<td>"); buf.append(header); buf.append("</td><td>"); if (header.equals("MSA") || header.equals("PDB")) { buf.append("<a href=\"" + value + "\">"); buf.append(header); buf.append("</a>"); } else if (header.equals("Uniprot")) { buf.append("<a href=\"http://www.uniprot.org/uniprot/" + value + "\">"); buf.append(value); buf.append("</a>"); } else if (header.equals("Refseq")) { buf.append("<a href=\"http://www.ncbi.nlm.nih.gov/sites/entrez?db=protein&cmd=search&term=" + value + "\">"); buf.append(value); buf.append("</a>"); } else if (header.toLowerCase().contains("impact")) { if (value.toLowerCase().equals("high") || value.toLowerCase().equals("medium")) { String color = value.toLowerCase().equals("high") ? "red" : "#0033FF"; buf.append("<div style=\"color:" + color + "\"><b>"); buf.append(value); buf.append("</b></div>"); } else { buf.append(value); } } else { buf.append(value); } buf.append("</td></tr>"); } buf.append("</table></p>"); return buf.toString(); } catch (IOException e) { log.error("Error accessing OMA ", e); return null; } } }