bam_header_t *sam_header_read2(const char *fn)
{
bam_header_t *header;
- int c, dret, ret;
+ int c, dret, ret, error = 0;
gzFile fp;
kstream_t *ks;
kstring_t *str;
ks_getuntil(ks, 0, str, &dret);
len = atoi(str->s);
k = kh_put(ref, hash, s, &ret);
+ if (ret == 0) {
+ fprintf(stderr, "[sam_header_read2] duplicated sequence name: %s\n", s);
+ error = 1;
+ }
kh_value(hash, k) = (uint64_t)len<<32 | i;
if (dret != '\n')
while ((c = ks_getc(ks)) != '\n' && c != -1);
gzclose(fp);
free(str->s); free(str);
fprintf(stderr, "[sam_header_read2] %d sequences loaded.\n", kh_size(hash));
+ if (error) return 0;
header = hash2header(hash);
kh_destroy(ref, hash);
return header;
sub wgsim_eval {
my %opts = (g=>5);
- getopts('pcg:', \%opts);
- die("Usage: wgsim_eval.pl [-pc] [-g $opts{g}] <in.sam>\n") if (@ARGV == 0 && -t STDIN);
- my (@c0, @c1);
+ getopts('pcag:', \%opts);
+ die("Usage: wgsim_eval.pl [-pca] [-g $opts{g}] <in.sam>\n") if (@ARGV == 0 && -t STDIN);
+ my (@c0, @c1, %fnfp);
my ($max_q, $flag) = (0, 0);
my $gap = $opts{g};
$flag |= 1 if (defined $opts{p});
}
++$c0[$q];
++$c1[$q] unless ($is_correct);
+ @{$fnfp{$t[4]}} = (0, 0) unless (defined $fnfp{$t[4]});
+ ++$fnfp{$t[4]}[0];
+ ++$fnfp{$t[4]}[1] unless ($is_correct);
print STDERR $line if (($flag&1) && !$is_correct && $q > 0);
}
# print
my ($cc0, $cc1) = (0, 0);
- for (my $i = $max_q; $i >= 0; --$i) {
- $c0[$i] = 0 unless (defined $c0[$i]);
- $c1[$i] = 0 unless (defined $c1[$i]);
- $cc0 += $c0[$i]; $cc1 += $c1[$i];
- printf("%.2dx %12d / %-12d %12d %.3e\n", $i, $c1[$i], $c0[$i], $cc0, $cc1/$cc0);
+ if (!defined($opts{a})) {
+ for (my $i = $max_q; $i >= 0; --$i) {
+ $c0[$i] = 0 unless (defined $c0[$i]);
+ $c1[$i] = 0 unless (defined $c1[$i]);
+ $cc0 += $c0[$i]; $cc1 += $c1[$i];
+ printf("%.2dx %12d / %-12d %12d %.3e\n", $i, $c1[$i], $c0[$i], $cc0, $cc1/$cc0);
+ }
+ } else {
+ for (reverse(sort {$a<=>$b} (keys %fnfp))) {
+ next if ($_ == 0);
+ $cc0 += $fnfp{$_}[0];
+ $cc1 += $fnfp{$_}[1];
+ print join("\t", $_, $cc0, $cc1), "\n";
+ }
}
}
if (aux) { // check if aux is present
bam_header_t *textheader = fp->header;
fp->header = sam_header_read2((const char*)aux);
+ if (fp->header == 0) goto open_err_ret;
append_header_text(fp->header, textheader->text, textheader->l_text);
bam_header_destroy(textheader);
}