r916: support long cs in sam-to-paf conversion

This commit is contained in:
Heng Li 2019-02-17 09:35:23 -05:00
parent e02bebd96d
commit 19208fb06b
1 changed files with 14 additions and 7 deletions

View File

@ -1,6 +1,6 @@
#!/usr/bin/env k8 #!/usr/bin/env k8
var paftools_version = '2.15-r907-dirty'; var paftools_version = '2.15-r916-dirty';
/***************************** /*****************************
***** Library functions ***** ***** Library functions *****
@ -1590,11 +1590,16 @@ function paf_gff2bed(args)
function paf_sam2paf(args) function paf_sam2paf(args)
{ {
var c, pri_only = false, use_eq = false; var c, pri_only = false, long_cs = false;
while ((c = getopt(args, "p")) != null) while ((c = getopt(args, "pL")) != null) {
if (c == 'p') pri_only = true; if (c == 'p') pri_only = true;
else if (c == 'L') long_cs = true;
}
if (args.length == getopt.ind) { if (args.length == getopt.ind) {
print("Usage: paftools.js sam2paf [-p] <in.sam>"); print("Usage: paftools.js sam2paf [options] <in.sam>");
print("Options:");
print(" -p convert primary or supplementary alignments only");
print(" -L output the cs tag in the long form");
exit(1); exit(1);
} }
@ -1666,8 +1671,8 @@ function paf_sam2paf(args)
} }
// parse MD // parse MD
var cs = []; var cs = [];
if (MD != null && cs_str == null) { if (MD != null && cs_str == null && t[9] != "*") {
var k = 0, cx = 0, cy = 0, mx = 0, my = 0; var k = 0, cx = 0, cy = 0, mx = 0, my = 0; // cx: cigar ref position; cy: cigar query; mx: MD ref; my: MD query
while ((m = re_MD.exec(MD)) != null) { while ((m = re_MD.exec(MD)) != null) {
if (m[2] != null) { // deletion from the reference if (m[2] != null) { // deletion from the reference
var len = m[2].length - 1; var len = m[2].length - 1;
@ -1681,13 +1686,15 @@ function paf_sam2paf(args)
if (my + ml < cy + cl) { if (my + ml < cy + cl) {
if (ml > 0) { if (ml > 0) {
if (m[3] != null) cs.push('*', m[3], t[9][my]); if (m[3] != null) cs.push('*', m[3], t[9][my]);
else if (long_cs) cs.push('=', t[9].substr(my, ml));
else cs.push(':', ml); else cs.push(':', ml);
} }
mx += ml, my += ml, ml = 0; mx += ml, my += ml, ml = 0;
break; break;
} else { } else {
var dl = cy + cl - my; var dl = cy + cl - my;
cs.push(':', dl); if (long_cs) cs.push('=', t[9].substr(my, dl));
else cs.push(':', dl);
cx += cl, cy += cl, ++k; cx += cl, cy += cl, ++k;
mx += dl, my += dl, ml -= dl; mx += dl, my += dl, ml -= dl;
} }