package org.molgenis.mutation.ui.html;
import java.io.Serializable;
import java.util.Formatter;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.text.StrBuilder;
import org.molgenis.framework.ui.html.HtmlInput;
import org.molgenis.mutation.dto.ExonDTO;
import org.molgenis.mutation.dto.MutationSummaryDTO;
/*
* A panel that prints a genomic sequence based on exons and mutations
*/
public class SequencePanel extends HtmlInput<String> implements Serializable
{
private static final long serialVersionUID = 715300797597319262L;
private ExonDTO exonDTO;
private List<MutationSummaryDTO> mutationSummaryDTOList;
boolean showNuclSequence = true;
boolean showAaSequence = true;
boolean showBasePositions = true;
private String baseUrl;
public SequencePanel(ExonDTO exonDTO, List<MutationSummaryDTO> mutationSummaryDTOList, String baseUrl)
{
this.exonDTO = exonDTO;
this.mutationSummaryDTOList = mutationSummaryDTOList;
this.baseUrl = baseUrl;
}
public SequencePanel(String name, String label)
{
super(name, label);
this.setLabel(label);
this.setClazz("scrollable");
}
@Override
/**
* Each input is rendered with a label and in its own div to enable scripting.
*/
public String toHtml()
{
StrBuilder result = new StrBuilder();
result.appendln("<div class=\"" + this.getClazz() + "\">");
result.appendln("<pre>");
if (this.showNuclSequence)
{
result.append(this.exonDTO.getNuclSequenceFlankLeft());
result.append("<span class=\"seq\">");
int startPos = this.exonDTO.getGdnaStart();
int endPos = this.exonDTO.getGdnaEnd();
for (int i = startPos; ("R".equals(this.exonDTO.getOrientation()) ? i >= endPos : i <= endPos); i = ("R"
.equals(this.exonDTO.getOrientation()) ? i - 1 : i + 1))
{
// System.out.println(">>> SequencePanel: seqlen==" +
// exonDTO.getNuclSequence().length() + ", startPos==" +
// startPos + ", i==" + i);
boolean hasMutation = false;
for (MutationSummaryDTO mutationSummaryVO : this.mutationSummaryDTOList)
{
// System.out.println(">>> SequencePanel: m.cdna==" +
// mutationSummaryVO.getCdnaNotation() + ", m.gdna=" +
// mutationSummaryVO.getGdnaNotation());
String url = this.baseUrl;
url = StringUtils.replace(url, "mid=", "mid=" + mutationSummaryVO.getIdentifier());
String tooltip = mutationSummaryVO.getNiceNotation();
if (mutationSummaryVO.getGdnaStart() == i)
{
hasMutation = true;
result.append("<span class=\"mut\">");
result.append("<a class=\"mut\" href=\"" + url + "\" alt=\"" + tooltip + "\" title=\""
+ tooltip + "\">");
break;
}
}
if (StringUtils.equals(this.exonDTO.getOrientation(), "R")) result.append(this.exonDTO
.getNuclSequence().substring(startPos - i, startPos - i + 1)); // ${exonSummaryVO.nuclSequence?substring(exonSummaryVO.exon.getGdna_Position()
// -
// i,
// exonSummaryVO.exon.getGdna_Position()
// -
// i
// +
// 1)}
else if (StringUtils.equals(this.exonDTO.getOrientation(), "F")) result.append(this.exonDTO
.getNuclSequence().substring(i - startPos, i - startPos + 1));
if (hasMutation)
{
result.append("</a></span>");
}
}
result.append("</span>");
result.appendln(this.exonDTO.getNuclSequenceFlankRight());
}
if (!this.exonDTO.getIsIntron())
{
// print aa sequence
if (this.showAaSequence)
{
result.appendPadding(this.exonDTO.getNuclSequenceFlankLeft().length(), ' ');
result.append("<span class=\"seq\">");
result.append(this.exonDTO.getAaSequence());
result.appendln("</span>");
}
// print base numbers
if (this.showBasePositions)
{
result.appendPadding(this.exonDTO.getNuclSequenceFlankLeft().length(), ' ');
result.append("<span>");
result.append(this.printBasePositions(this.exonDTO));
result.appendln("</span>");
}
}
result.appendln("</pre>\n");
result.appendln("</div>\n");
return result.toString();
}
public void setShowNuclSequence(boolean showNuclSequence)
{
this.showNuclSequence = showNuclSequence;
}
public void setShowAaSequence(boolean showAaSequence)
{
this.showAaSequence = showAaSequence;
}
public void setShowBasePositions(boolean showBasePositions)
{
this.showBasePositions = showBasePositions;
}
public void setBaseUrl(String baseUrl)
{
this.baseUrl = baseUrl;
}
private String printBasePositions(ExonDTO exonSummaryVO)
{
// <#list exon.cdna_position..exon.cdna_position + exon.length as i>
StringBuffer buf = new StringBuffer();
for (int i = exonSummaryVO.getCdnaStart(); i < exonSummaryVO.getCdnaEnd(); i++)
if (i % 10 == 0) buf.append(new Formatter().format("%4s", i).toString());
else if (i % 10 < 7) // (i % 10 > 3 || i < 4)
buf.append(" "); // new Integer(i % 10).toString(); //" ";
// else
// return "";
return buf.toString();
}
}