package org.broad.igv.feature.dsi;
import htsjdk.tribble.AsciiFeatureCodec;
import htsjdk.tribble.exception.CodecLineParsingException;
import htsjdk.tribble.readers.LineIterator;
import org.broad.igv.Globals;
import org.broad.igv.feature.genome.Genome;
import org.broad.igv.track.TrackProperties;
import org.broad.igv.util.ParsingUtils;
/**
* Created by jrobinson on 7/19/16.
*/
public class DSICodec extends AsciiFeatureCodec<DSIFeature> {
private final Genome genome;
private TrackProperties trackProperties;
public DSICodec(Genome genome) {
super(DSIFeature.class);
this.genome = genome;
}
@Override
public DSIFeature decode(String line) {
String [] tokens = Globals.tabPattern.split(line);
if(tokens.length > 10) {
String chr = genome == null ? tokens[0].trim() : genome.getCanonicalChrName(tokens[0].trim());
DSIFeature feature = new DSIFeature();
feature.chr = chr;
feature.position = Integer.parseInt(tokens[1]) - 1; // IGV is zero-based internally
feature.base = tokens[2].charAt(0);
feature.total = Integer.parseInt(tokens[3]);
feature.meth = Integer.parseInt(tokens[4]);
feature.unmeth = Integer.parseInt(tokens[5]);
feature.type = tokens[6];
feature.f = "NA".equals(tokens[7]) ? Integer.MIN_VALUE : Integer.parseInt(tokens[7]);
feature.p = "NA".equals(tokens[7]) ? Integer.MIN_VALUE : Integer.parseInt(tokens[8]);
feature.m = "NA".equals(tokens[7]) ? Integer.MIN_VALUE : Integer.parseInt(tokens[9]);
feature.u = "NA".equals(tokens[7]) ? Integer.MIN_VALUE : Integer.parseInt(tokens[10]);
return feature;
}
else {
return null;
}
}
@Override
public boolean canDecode(String path) {
return path.toLowerCase().endsWith(".dsi") || path.toLowerCase().endsWith(".dsi.gz");
}
@Override
public Object readActualHeader(LineIterator reader) {
String line;
try {
while (reader.hasNext()) {
line = reader.peek();
if (line.startsWith("#")) {
reader.next();
} else if (line.startsWith("#track") || line.startsWith("##track")) {
trackProperties = new TrackProperties();
ParsingUtils.parseTrackLine(line, trackProperties);
} else {
break;
}
}
return trackProperties;
} catch (Exception e) {
throw new CodecLineParsingException("Error parsing header: " + e.getMessage(), e);
}
}
}