NVBIO
Main Page
Modules
Classes
Examples
File List
File Members
All
Classes
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Friends
Macros
Groups
Pages
contrib
htslib
htslib
sam.h
Go to the documentation of this file.
1
#ifndef BAM_H
2
#define BAM_H
3
4
#include <stdint.h>
5
#include "
hts.h
"
6
7
/**********************
8
*** SAM/BAM header ***
9
**********************/
10
21
typedef
struct
{
22
int32_t
n_targets
, ignore_sam_err;
23
uint32_t
l_text
;
24
uint32_t
*
target_len
;
25
int8_t
*
cigar_tab
;
26
char
**
target_name
;
27
char
*
text
;
28
void
*
sdict
;
29
}
bam_hdr_t
;
30
31
/****************************
32
*** CIGAR related macros ***
33
****************************/
34
35
#define BAM_CMATCH 0
36
#define BAM_CINS 1
37
#define BAM_CDEL 2
38
#define BAM_CREF_SKIP 3
39
#define BAM_CSOFT_CLIP 4
40
#define BAM_CHARD_CLIP 5
41
#define BAM_CPAD 6
42
#define BAM_CEQUAL 7
43
#define BAM_CDIFF 8
44
#define BAM_CBACK 9
45
46
#define BAM_CIGAR_STR "MIDNSHP=XB"
47
#define BAM_CIGAR_SHIFT 4
48
#define BAM_CIGAR_MASK 0xf
49
#define BAM_CIGAR_TYPE 0x3C1A7
50
51
#define bam_cigar_op(c) ((c)&BAM_CIGAR_MASK)
52
#define bam_cigar_oplen(c) ((c)>>BAM_CIGAR_SHIFT)
53
#define bam_cigar_opchr(c) (BAM_CIGAR_STR[bam_cigar_op(c)])
54
#define bam_cigar_gen(l, o) ((l)<<BAM_CIGAR_SHIFT|(o))
55
56
/* bam_cigar_type returns a bit flag with:
57
* bit 1 set if the cigar operation consumes the query
58
* bit 2 set if the cigar operation consumes the reference
59
*
60
* For reference, the unobfuscated truth table for this function is:
61
* BAM_CIGAR_TYPE QUERY REFERENCE
62
* --------------------------------
63
* BAM_CMATCH 1 1
64
* BAM_CINS 1 0
65
* BAM_CDEL 0 1
66
* BAM_CREF_SKIP 0 1
67
* BAM_CSOFT_CLIP 1 0
68
* BAM_CHARD_CLIP 0 0
69
* BAM_CPAD 0 0
70
* BAM_CEQUAL 1 1
71
* BAM_CDIFF 1 1
72
* BAM_CBACK 0 0
73
* --------------------------------
74
*/
75
#define bam_cigar_type(o) (BAM_CIGAR_TYPE>>((o)<<1)&3) // bit 1: consume query; bit 2: consume reference
76
78
#define BAM_FPAIRED 1
79
80
#define BAM_FPROPER_PAIR 2
81
82
#define BAM_FUNMAP 4
83
84
#define BAM_FMUNMAP 8
85
86
#define BAM_FREVERSE 16
87
88
#define BAM_FMREVERSE 32
89
90
#define BAM_FREAD1 64
91
92
#define BAM_FREAD2 128
93
94
#define BAM_FSECONDARY 256
95
96
#define BAM_FQCFAIL 512
97
98
#define BAM_FDUP 1024
99
100
#define BAM_FSUPPLEMENTARY 2048
101
102
/*************************
103
*** Alignment records ***
104
*************************/
105
119
typedef
struct
{
120
int32_t
tid
;
121
int32_t
pos
;
122
uint32_t
bin:16, qual:8, l_qname:8;
123
uint32_t
flag:16, n_cigar:16;
124
int32_t
l_qseq
;
125
int32_t
mtid
;
126
int32_t
mpos
;
127
int32_t
isize
;
128
}
bam1_core_t
;
129
145
typedef
struct
{
146
bam1_core_t
core
;
147
int
l_data,
m_data
;
148
uint8_t
*
data
;
149
#ifndef BAM_NO_ID
150
uint64_t
id
;
151
#endif
152
}
bam1_t
;
153
159
#define bam_is_rev(b) (((b)->core.flag&BAM_FREVERSE) != 0)
160
165
#define bam_is_mrev(b) (((b)->core.flag&BAM_FMREVERSE) != 0)
166
171
#define bam_get_qname(b) ((char*)(b)->data)
172
181
#define bam_get_cigar(b) ((uint32_t*)((b)->data + (b)->core.l_qname))
182
192
#define bam_get_seq(b) ((b)->data + ((b)->core.n_cigar<<2) + (b)->core.l_qname)
193
198
#define bam_get_qual(b) ((b)->data + ((b)->core.n_cigar<<2) + (b)->core.l_qname + (((b)->core.l_qseq + 1)>>1))
199
204
#define bam_get_aux(b) ((b)->data + ((b)->core.n_cigar<<2) + (b)->core.l_qname + (((b)->core.l_qseq + 1)>>1) + (b)->core.l_qseq)
205
210
#define bam_get_l_aux(b) ((b)->l_data - ((b)->core.n_cigar<<2) - (b)->core.l_qname - (b)->core.l_qseq - (((b)->core.l_qseq + 1)>>1))
211
217
#define bam_seqi(s, i) ((s)[(i)>>1] >> ((~(i)&1)<<2) & 0xf)
218
219
/**************************
220
*** Exported functions ***
221
**************************/
222
223
#ifdef __cplusplus
224
extern
"C"
{
225
#endif
226
227
/***************
228
*** BAM I/O ***
229
***************/
230
231
bam_hdr_t
*
bam_hdr_init
(
void
);
232
bam_hdr_t
*
bam_hdr_read
(
BGZF
*fp);
233
int
bam_hdr_write
(
BGZF
*fp,
const
bam_hdr_t
*h);
234
void
bam_hdr_destroy
(
bam_hdr_t
*h);
235
int
bam_name2id
(
bam_hdr_t
*h,
const
char
*ref);
236
bam_hdr_t
*
bam_hdr_dup
(
const
bam_hdr_t
*h0);
237
238
bam1_t
*
bam_init1
(
void
);
239
void
bam_destroy1
(
bam1_t
*b);
240
int
bam_read1
(
BGZF
*fp,
bam1_t
*b);
241
int
bam_write1
(
BGZF
*fp,
const
bam1_t
*b);
242
bam1_t
*
bam_copy1
(
bam1_t
*bdst,
const
bam1_t
*bsrc);
243
bam1_t
*
bam_dup1
(
const
bam1_t
*bsrc);
244
245
int
bam_cigar2qlen
(
int
n_cigar,
const
uint32_t
*
cigar
);
246
int
bam_cigar2rlen
(
int
n_cigar,
const
uint32_t
*cigar);
247
259
int32_t
bam_endpos
(
const
bam1_t
*b);
260
261
int
bam_str2flag
(
const
char
*str);
262
char
*
bam_flag2str
(
int
flag);
264
/*************************
265
*** BAM/CRAM indexing ***
266
*************************/
267
268
// These BAM iterator functions work only on BAM files. To work with either
269
// BAM or CRAM files use the sam_index_load() & sam_itr_*() functions.
270
#define bam_itr_destroy(iter) hts_itr_destroy(iter)
271
#define bam_itr_queryi(idx, tid, beg, end) sam_itr_queryi(idx, tid, beg, end)
272
#define bam_itr_querys(idx, hdr, region) sam_itr_querys(idx, hdr, region)
273
#define bam_itr_next(htsfp, itr, r) hts_itr_next((htsfp)->fp.bgzf, (itr), (r), 0)
274
275
// Load .csi or .bai BAM index file.
276
#define bam_index_load(fn) hts_idx_load((fn), HTS_FMT_BAI)
277
278
int
bam_index_build
(
const
char
*fn,
int
min_shift);
279
280
// Load BAM (.csi or .bai) or CRAM (.crai) index file.
281
hts_idx_t
*
sam_index_load
(
htsFile
*fp,
const
char
*fn);
282
283
#define sam_itr_destroy(iter) hts_itr_destroy(iter)
284
hts_itr_t
*
sam_itr_queryi
(
const
hts_idx_t
*idx,
int
tid,
int
beg,
int
end);
285
hts_itr_t
*
sam_itr_querys
(
const
hts_idx_t
*idx,
bam_hdr_t
*hdr,
const
char
*region);
286
#define sam_itr_next(htsfp, itr, r) hts_itr_next((htsfp)->fp.bgzf, (itr), (r), (htsfp))
287
288
/***************
289
*** SAM I/O ***
290
***************/
291
292
#define sam_open(fn, mode) (hts_open((fn), (mode)))
293
#define sam_close(fp) hts_close(fp)
294
295
int
sam_open_mode
(
char
*mode,
const
char
*fn,
const
char
*format);
296
297
typedef
htsFile
samFile
;
298
bam_hdr_t
*
sam_hdr_parse
(
int
l_text,
const
char
*
text
);
299
bam_hdr_t
*
sam_hdr_read
(samFile *fp);
300
int
sam_hdr_write
(samFile *fp,
const
bam_hdr_t
*h);
301
302
int
sam_parse1
(
kstring_t
*s,
bam_hdr_t
*h,
bam1_t
*b);
303
int
sam_format1
(
const
bam_hdr_t
*h,
const
bam1_t
*b,
kstring_t
*str);
304
int
sam_read1
(samFile *fp,
bam_hdr_t
*h,
bam1_t
*b);
305
int
sam_write1
(samFile *fp,
const
bam_hdr_t
*h,
const
bam1_t
*b);
306
307
/*************************************
308
*** Manipulating auxiliary fields ***
309
*************************************/
310
311
uint8_t
*
bam_aux_get
(
const
bam1_t
*b,
const
char
tag[2]);
312
int32_t
bam_aux2i
(
const
uint8_t
*s);
313
double
bam_aux2f
(
const
uint8_t
*s);
314
char
bam_aux2A
(
const
uint8_t
*s);
315
char
*
bam_aux2Z
(
const
uint8_t
*s);
316
317
void
bam_aux_append
(
bam1_t
*b,
const
char
tag[2],
char
type,
int
len,
uint8_t
*data);
318
int
bam_aux_del
(
bam1_t
*b,
uint8_t
*s);
319
320
#ifdef __cplusplus
321
}
322
#endif
323
324
/**************************
325
*** Pileup and Mpileup ***
326
**************************/
327
328
#if !defined(BAM_NO_PILEUP)
329
348
typedef
struct
{
349
bam1_t
*
b
;
350
int32_t
qpos
;
351
int
indel,
level
;
352
uint32_t
is_del:1, is_head:1, is_tail:1, is_refskip:1, aux:28;
353
}
bam_pileup1_t
;
354
355
typedef
int (*
bam_plp_auto_f
)(
void
*data,
bam1_t
*b);
356
357
struct
__bam_plp_t;
358
typedef
struct
__bam_plp_t *
bam_plp_t
;
359
360
struct
__bam_mplp_t
;
361
typedef
struct
__bam_mplp_t
*
bam_mplp_t
;
362
363
#ifdef __cplusplus
364
extern
"C"
{
365
#endif
366
373
bam_plp_t
bam_plp_init
(
bam_plp_auto_f
func,
void
*data);
374
void
bam_plp_destroy
(
bam_plp_t
iter
);
375
int
bam_plp_push
(
bam_plp_t
iter,
const
bam1_t
*b);
376
const
bam_pileup1_t
*
bam_plp_next
(
bam_plp_t
iter,
int
*_tid,
int
*_pos,
int
*_n_plp);
377
const
bam_pileup1_t
*
bam_plp_auto
(
bam_plp_t
iter,
int
*_tid,
int
*_pos,
int
*_n_plp);
378
void
bam_plp_set_maxcnt
(
bam_plp_t
iter,
int
maxcnt);
379
void
bam_plp_reset
(
bam_plp_t
iter);
380
381
bam_mplp_t
bam_mplp_init
(
int
n
,
bam_plp_auto_f
func,
void
**data);
390
void
bam_mplp_init_overlaps
(bam_mplp_t iter);
391
void
bam_mplp_destroy
(bam_mplp_t iter);
392
void
bam_mplp_set_maxcnt
(bam_mplp_t iter,
int
maxcnt);
393
int
bam_mplp_auto
(bam_mplp_t iter,
int
*_tid,
int
*_pos,
int
*
n_plp
,
const
bam_pileup1_t
**
plp
);
394
395
#ifdef __cplusplus
396
}
397
#endif
398
399
#endif // ~!defined(BAM_NO_PILEUP)
400
401
#endif
Generated on Wed Feb 25 2015 08:32:48 for NVBIO by
1.8.4