/*
* 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.feature;
//~--- non-JDK imports --------------------------------------------------------
import org.apache.log4j.Logger;
import org.broad.igv.prefs.PreferencesManager;
import org.broad.igv.track.WindowFunction;
import org.broad.igv.ui.IGV;
import org.broad.igv.ui.color.ColorTable;
import org.broad.igv.util.collections.MultiMap;
import java.awt.*;
import java.text.DecimalFormat;
import java.util.List;
import java.util.Map;
/**
* Represents a mutation
* // TODO -- refactor this to not implement "IGVFeature"
*
* @author jrobinso
*/
public class Mutation implements IGVFeature {
private static Logger log = Logger.getLogger(Mutation.class);
private static Map<String, Color> colors;
private String sampleId;
private String chr;
private int start;
private int end;
private String name;
private String omaName;
private String mutationType;
private Color color;
String refAllele;
String altAllele1;
String altAllele2;
private MultiMap<String, String> attributes;
private String valueString;
public Mutation(String runId, String chromosome, int start, int end, String type) {
this.sampleId = runId;
this.chr = chromosome;
this.start = start;
this.end = end;
this.mutationType = type;
}
public Mutation(Mutation mutation) {
this.sampleId = mutation.sampleId;
this.chr = mutation.chr;
this.start = mutation.start;
this.end = mutation.end;
this.mutationType = mutation.mutationType;
this.color = mutation.color;
this.name = mutation.getName();
this.omaName = mutation.getOMAName();
}
private String getOMAName() {
if (refAllele == null) return null;
if (omaName == null) {
String altAllele = altAllele1;
if (refAllele.equals(altAllele1)) {
altAllele = altAllele2;
}
String omaChr = chr.replace("chr", "");
omaName = omaChr + "," + (start + 1) + "," + refAllele + "," + altAllele;
}
return omaName;
}
// TODO -- experimental, note this only works for hg18 FIX
public String getOMAUrl() {
if (refAllele == null) return null;
String genome = IGV.getInstance().getGenomeManager().getGenomeId();
String url = "http://mutationassessor.org/r3/?cm=var&var=" + genome + "," + getOMAName();
return url;
}
public void setChr(String chr) {
this.chr = chr;
}
public void setName(String name) {
this.name = name;
}
public Mutation copy() {
return new Mutation(this);
}
public String getSampleId() {
return sampleId;
}
public String getType() {
return "mutation";
}
public String getMutationType() {
return mutationType;
}
public String getName() {
if (name == null) {
StringBuffer buffer = new StringBuffer();
DecimalFormat format = new DecimalFormat();
String posString = format.format(start + 1);
buffer.append(chr + ":" + posString);
if (end > start + 1) {
buffer.append("-" + end);
}
if (refAllele != null && altAllele1 != null) {
if (!altAllele1.equals(refAllele)) {
buffer.append(" " + refAllele + ">" + altAllele1);
}
if (!altAllele1.equals(altAllele2) && !refAllele.equals(altAllele2)) {
buffer.append(" " + refAllele + ">" + altAllele2);
}
}
name = buffer.toString();
}
return name;
}
public String getDescription() {
StringBuffer desc = new StringBuffer();
desc.append(getName());
desc.append("<br>");
desc.append(mutationType);
return desc.toString();
}
public String getFullDescription() {
if (valueString == null) {
StringBuffer buf = new StringBuffer();
buf.append("Type: ");
buf.append(mutationType);
if (attributes != null) {
attributes.printHtml(buf, 100);
}
valueString = buf.toString();
}
return valueString;
}
public String getValueString(double position, int mouseX, WindowFunction ignored) {
if (refAllele != null) {
StringBuffer buffer = new StringBuffer();
buffer.append(getDescription());
buffer.append("<br>");
buffer.append("<i><b>Click mutation for more...</b></i>");
return buffer.toString();
} else {
return getFullDescription();
}
}
public boolean hasScore() {
return false;
}
public Strand getStrand() {
return Strand.NONE;
}
public boolean overlaps(IGVFeature track) {
return false;
}
public String getChr() {
return chr;
}
@Override
public String getContig() {
return chr;
}
public void setColor(Color color) {
// Ignore
}
public Color getColor() {
ColorTable colorTable = PreferencesManager.getPreferences().getMutationColorScheme();
Color c = colorTable.get(getMutationType());
return c;
}
public int getStart() {
return start;
}
public void setStart(int start) {
this.start = start;
}
public int getEnd() {
return end;
}
public void setEnd(int end) {
this.end = end;
}
public float getScore() {
return 0;
}
/**
* Return true if the feature is completely contained within the bounds of this
* featre.
*
* @param feature
* @return
*/
public boolean contains(IGVFeature feature) {
if (feature == null || !this.getChr().equals(feature.getChr())) {
return false;
}
if ((feature.getStart() >= this.getStart()) && (feature.getEnd() <= this.getEnd())) {
return true;
} else {
return false;
}
}
public boolean contains(double location) {
return location >= start && location <= end;
}
public String getURL() {
return null; //To change body of implemented methods use File | Settings | File Templates.
}
public Exon getExonAt(double location) {
return null;
}
public List<Exon> getExons() {
return null;
}
public String getIdentifier() {
return null;
}
public AminoAcidSequence getAminoAcidSequence(int exonIndex) {
throw new UnsupportedOperationException("Not supported yet.");
}
public int getCdEnd() {
throw new UnsupportedOperationException("Not supported yet.");
}
public int getCdStart() {
throw new UnsupportedOperationException("Not supported yet.");
}
public int getLength() {
throw new UnsupportedOperationException("Not supported yet.");
}
public MultiMap<String, String> getAttributes() {
return null;
}
public void setAttributes(MultiMap<String, String> attributes) {
this.attributes = attributes;
}
public void setRefAllele(String refAllele) {
this.refAllele = refAllele;
}
public void setAltAllele1(String altAllele1) {
this.altAllele1 = altAllele1;
}
public void setAltAllele2(String altAllele2) {
this.altAllele2 = altAllele2;
}
}