/**
*
*/
package de.uni_luebeck.inb.krabbenhoeft.eQTL.client.tracks;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.AsyncCallback;
import de.uni_luebeck.inb.krabbenhoeft.eQTL.api.gwt.DasTrackEntry;
import de.uni_luebeck.inb.krabbenhoeft.eQTL.api.gwt.FetchDasTrack;
import de.uni_luebeck.inb.krabbenhoeft.eQTL.api.gwt.FetchDasTrackAsync;
import de.uni_luebeck.inb.krabbenhoeft.eQTL.client.AutoRetry;
import de.uni_luebeck.inb.krabbenhoeft.eQTL.client.scroller.GenomeDisplayTrack;
public class ChromosomeBandTrack extends GenomeDisplayTrack<Boolean> {
DasTrackEntry[] cachedBands;
public ChromosomeBandTrack() {
super("bands", Integer.MAX_VALUE);
}
@Override
public void changedChromosome() {
cachedBands = null;
final FetchDasTrackAsync ensemblAsync = (FetchDasTrackAsync) GWT.create(FetchDasTrack.class);
new AutoRetry<DasTrackEntry[]>() {
public void success(DasTrackEntry[] result) {
cachedBands = result;
long clen = 0;
for (DasTrackEntry DasTrackEntry : result)
clen = Math.max(clen, DasTrackEntry.to);
updateContentLength(clen);
}
public void invoke(AsyncCallback<DasTrackEntry[]> callback) {
ensemblAsync.getTrackForSegment("karyotype", chromosome, 0, 1000000000000L, callback);
}
}.run();
}
@Override
public void fetchData(String chromosome, long fromBP, long toBP, AsyncCallback<Boolean[]> callback) {
callback.onSuccess(new Boolean[0]);
}
@Override
protected void renderBlockInternal(int topY, long fromBP, long toBP, long bpPerPixel, de.uni_luebeck.inb.krabbenhoeft.eQTL.client.scroller.GenomeDisplayTrack.Block<Boolean> b) {
final String col[] = new String[] { "chr-band-white", "chr-band-grey", "chr-band-black" };
if (cachedBands == null) {
b.html = null;
return;
}
b.bottomY = topY + 30;
b.html = "";
for (int i = 0; i < cachedBands.length; i++) {
DasTrackEntry band = cachedBands[i];
if (band.to < fromBP)
continue;
if (band.from > toBP)
continue;
long from = Math.max(band.from, fromBP) - fromBP;
long to = Math.min(band.to, toBP) - fromBP;
from /= bpPerPixel;
to /= bpPerPixel;
long width = to - from;
if (width <= 0)
continue;
boolean showlabel = band.from > fromBP && (band.to - band.from) / bpPerPixel > 15;
String displabel = showlabel ? band.label : "";
b.html += genBox(col[band.type - 1], (int) from, topY, (int) width, 21, 30, "", genAutomation(fromBP, i), displabel);
}
}
}