annotate SNV/SNVMix2_source/SNVMix2-v0.12.1-rc1/samtools-0.1.6/bam_stat.c @ 0:74f5ea818cea

Uploaded
author ryanmorin
date Wed, 12 Oct 2011 19:50:38 -0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
1 #include <unistd.h>
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
2 #include <assert.h>
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
3 #include "bam.h"
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
4
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
5 typedef struct {
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
6 long long n_reads, n_mapped, n_pair_all, n_pair_map, n_pair_good;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
7 long long n_sgltn, n_read1, n_read2;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
8 long long n_qcfail, n_dup;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
9 long long n_diffchr, n_diffhigh;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
10 } bam_flagstat_t;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
11
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
12 #define flagstat_loop(s, c) do { \
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
13 ++(s)->n_reads; \
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
14 if ((c)->flag & BAM_FPAIRED) { \
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
15 ++(s)->n_pair_all; \
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
16 if ((c)->flag & BAM_FPROPER_PAIR) ++(s)->n_pair_good; \
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
17 if ((c)->flag & BAM_FREAD1) ++(s)->n_read1; \
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
18 if ((c)->flag & BAM_FREAD2) ++(s)->n_read2; \
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
19 if (((c)->flag & BAM_FMUNMAP) && !((c)->flag & BAM_FUNMAP)) ++(s)->n_sgltn; \
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
20 if (!((c)->flag & BAM_FUNMAP) && !((c)->flag & BAM_FMUNMAP)) { \
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
21 ++(s)->n_pair_map; \
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
22 if ((c)->mtid != (c)->tid) { \
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
23 ++(s)->n_diffchr; \
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
24 if ((c)->qual >= 5) ++(s)->n_diffhigh; \
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
25 } \
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
26 } \
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
27 } \
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
28 if (!((c)->flag & BAM_FUNMAP)) ++(s)->n_mapped; \
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
29 if ((c)->flag & BAM_FQCFAIL) ++(s)->n_qcfail; \
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
30 if ((c)->flag & BAM_FDUP) ++(s)->n_dup; \
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
31 } while (0)
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
32
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
33 bam_flagstat_t *bam_flagstat_core(bamFile fp)
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
34 {
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
35 bam_flagstat_t *s;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
36 bam1_t *b;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
37 bam1_core_t *c;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
38 int ret;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
39 s = (bam_flagstat_t*)calloc(1, sizeof(bam_flagstat_t));
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
40 b = bam_init1();
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
41 c = &b->core;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
42 while ((ret = bam_read1(fp, b)) >= 0)
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
43 flagstat_loop(s, c);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
44 bam_destroy1(b);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
45 if (ret != -1)
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
46 fprintf(stderr, "[bam_flagstat_core] Truncated file? Continue anyway.\n");
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
47 return s;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
48 }
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
49 int bam_flagstat(int argc, char *argv[])
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
50 {
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
51 bamFile fp;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
52 bam_header_t *header;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
53 bam_flagstat_t *s;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
54 if (argc == optind) {
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
55 fprintf(stderr, "Usage: samtools flagstat <in.bam>\n");
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
56 return 1;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
57 }
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
58 fp = strcmp(argv[optind], "-")? bam_open(argv[optind], "r") : bam_dopen(fileno(stdin), "r");
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
59 assert(fp);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
60 header = bam_header_read(fp);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
61 s = bam_flagstat_core(fp);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
62 printf("%lld in total\n", s->n_reads);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
63 printf("%lld QC failure\n", s->n_qcfail);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
64 printf("%lld duplicates\n", s->n_dup);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
65 printf("%lld mapped (%.2f%%)\n", s->n_mapped, (float)s->n_mapped / s->n_reads * 100.0);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
66 printf("%lld paired in sequencing\n", s->n_pair_all);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
67 printf("%lld read1\n", s->n_read1);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
68 printf("%lld read2\n", s->n_read2);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
69 printf("%lld properly paired (%.2f%%)\n", s->n_pair_good, (float)s->n_pair_good / s->n_pair_all * 100.0);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
70 printf("%lld with itself and mate mapped\n", s->n_pair_map);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
71 printf("%lld singletons (%.2f%%)\n", s->n_sgltn, (float)s->n_sgltn / s->n_pair_all * 100.0);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
72 printf("%lld with mate mapped to a different chr\n", s->n_diffchr);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
73 printf("%lld with mate mapped to a different chr (mapQ>=5)\n", s->n_diffhigh);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
74 free(s);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
75 bam_header_destroy(header);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
76 bam_close(fp);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
77 return 0;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
78 }