From a4c41f64a518eb8655e408b25469bc5860879525 Mon Sep 17 00:00:00 2001 From: Heng Li Date: Sun, 20 Aug 2017 21:54:35 +0800 Subject: [PATCH] the final version to be replaced by intron-eval --- misc/exon-eval.js | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/misc/exon-eval.js b/misc/exon-eval.js index eb963e4..2deb61c 100644 --- a/misc/exon-eval.js +++ b/misc/exon-eval.js @@ -123,10 +123,11 @@ Interval.find_ovlp = function(a, st, en) * Main function * *****************/ -var c, l_fuzzy = 0, min_ov_ratio = 0.95, print_ovlp = false, print_err_only = false, first_only = false; -while ((c = getopt(arguments, "l:r:ep1")) != null) { +var c, l_fuzzy = 0, min_ov_ratio = 0.95, min_span_ratio = 0.9, print_ovlp = false, print_err_only = false, first_only = false; +while ((c = getopt(arguments, "l:r:s:ep1")) != null) { if (c == 'l') l_fuzzy = parseInt(getopt.arg); else if (c == 'r') min_ov_ratio = parseFloat(getopt.arg); + else if (c == 's') min_span_ratio = parseFloat(getopt.arg); else if (c == 'p') print_ovlp = true; else if (c == 'e') print_err_only = print_ovlp = true; else if (c == '1') first_only = true; @@ -163,7 +164,7 @@ for (var chr in anno) { Interval.index_end(e); } -var n_novel = 0, n_partial = 0, n_unmapped = 0, n_mapped = 0, n_exon = 0, n_pri = 0; +var n_novel = 0, n_int_novel = 0, n_ext_novel = 0, n_sgl_novel = 0, n_partial = 0, n_unmapped = 0, n_mapped = 0, n_exon = 0, n_int_exon = 0, n_pri = 0, n_sgl_exon = 0, n_ext_exon = 0; var n_ext_hit = 0, n_int_hit = 0, n_sgl_hit = 0; file = new File(arguments[getopt.ind+1]); @@ -194,9 +195,15 @@ while (file.readline(buf) >= 0) { } exon.push([exon_st, en]); n_exon += exon.length; + n_int_exon += exon.length > 2? exon.length - 2 : 0; + n_sgl_exon += exon.length == 1? 1 : 0; + n_ext_exon += exon.length > 1? 2 : 0; var chr = anno[t[2]]; if (chr == null) { n_novel += exon.length; + n_int_novel += exon.length > 2? exon.length - 2 : 0; + n_sgl_novel += exon.length == 1? 1 : 0; + n_ext_novel += exon.length > 1? 2 : 0; } else { for (var i = 0; i < exon.length; ++i) { var o = Interval.find_ovlp(chr, exon[i][0], exon[i][1]); @@ -219,11 +226,11 @@ while (file.readline(buf) >= 0) { if (i == 0 && exon.length == 1) { if (ov_ratio >= min_ov_ratio) ++n_sgl_hit, hit = true; } else if (i == 0) { - if (en_diff <= l_fuzzy) ++n_ext_hit, hit = true; + if (ov_ratio >= min_ov_ratio && en_diff <= l_fuzzy) ++n_ext_hit, hit = true; } else if (i == exon.length - 1) { - if (st_diff <= l_fuzzy) ++n_ext_hit, hit = true; + if (ov_ratio >= min_ov_ratio && st_diff <= l_fuzzy) ++n_ext_hit, hit = true; } else { - if (en_diff + st_diff <= l_fuzzy) + if (en_diff + st_diff <= l_fuzzy && ol / span >= min_span_ratio) ++n_int_hit, hit = true; } if (hit) break; @@ -241,6 +248,9 @@ while (file.readline(buf) >= 0) { } } else { ++n_novel; + if (i > 0 && i < exon.length - 1) ++n_int_novel; + if (exon.length > 1 && (i == 0 || i == exon.length - 1)) ++n_ext_novel; + if (exon.length == 1) ++n_sgl_novel; if (print_ovlp) print('N', t[0], i+1, t[2], exon[i][0], exon[i][1]); } @@ -259,4 +269,7 @@ if (!print_ovlp) { print("Number of mapped exons: " + n_exon); print("Number of novel exons: " + n_novel); print("Number of correct exons: " + (n_ext_hit + n_int_hit + n_sgl_hit) + " (" + ((n_ext_hit + n_int_hit + n_sgl_hit) / n_exon * 100).toFixed(2) + "%)"); + print("Internal exons: " + n_int_novel + ", " + n_int_hit + " / " + n_int_exon + " = " + (n_int_hit / n_int_exon * 100).toFixed(2) + "%"); + print("External exons: " + n_ext_novel + ", " + n_ext_hit + " / " + n_ext_exon + " = " + (n_ext_hit / n_ext_exon * 100).toFixed(2) + "%"); + print("Singleton exons: " + n_sgl_novel + ", " + n_sgl_hit + " / " + n_sgl_exon + " = " + (n_sgl_hit / n_sgl_exon * 100).toFixed(2) + "%"); }