From ca6f4dc5e233db99eccea19a70976fe8dfbdf368 Mon Sep 17 00:00:00 2001 From: Heng Li Date: Mon, 13 Apr 2026 23:43:11 -0400 Subject: [PATCH] convert badread output to evaluation format --- misc/paftools.js | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/misc/paftools.js b/misc/paftools.js index eb005dd..578ddea 100755 --- a/misc/paftools.js +++ b/misc/paftools.js @@ -2405,6 +2405,52 @@ function paf_pbsim2fq(args) buf2.destroy(); } +function paf_badread2fa(args) +{ + if (args.length < 2) { + print("Usage: paftools.js badread2fa "); + exit(1); + } + + var len = {}, file, buf = new Bytes(); + file = new File(args[0]); + while (file.readline(buf) >= 0) { + var t = buf.toString().split("\t"); + len[t[0]] = parseInt(t[1]); + } + file.close(); + + var id = 0, n_discard = 0; + file = new File(args[1]); + while (file.readline(buf) >= 0) { + var line = buf.toString(); + var m, a = null, is_fq = line[0] == '@'? true : false; + if (!/\schimera\s/.test(line) && (m = /\s(\S+),([+-])strand,(\d+)-(\d+)/.exec(line)) != null) { + if (len[m[1]] == null) throw Error("failed to find the contig length of " + m[1]); + m[3] = parseInt(m[3]); + m[4] = parseInt(m[4]); + if (m[2] == '+') + a = [ "S" + (id+1), m[1], m[3], m[4], m[2] ]; + else + a = [ "S" + (id+1), m[1], len[m[1]] - m[4], len[m[1]] - m[3], m[2] ]; + } + file.readline(buf); + var seq = buf.toString(); + if (is_fq) { + file.readline(buf); + file.readline(buf); + } + if (a != null) { + print(">" + a.join("!")); + print(seq); + } else ++n_discard; + ++id; + } + file.close(); + buf.destroy(); + warn("WARNING: discarded " + n_discard + " reads"); +} + function paf_junceval(args) { var c, l_fuzzy = 0, print_ovlp = false, print_err_only = false, first_only = false, chr_only = false, aa = false, is_bed = false; @@ -3729,6 +3775,7 @@ function main(args) else if (cmd == 'bedcov') paf_bedcov(args); else if (cmd == 'mason2fq') paf_mason2fq(args); else if (cmd == 'pbsim2fq') paf_pbsim2fq(args); + else if (cmd == 'badread2fa') paf_badread2fa(args); else if (cmd == 'junceval') paf_junceval(args); else if (cmd == 'exoneval') paf_exoneval(args); else if (cmd == 'ov-eval') paf_ov_eval(args);