annotate SNV/SNVMix2_source/SNVMix2-v0.12.1-rc1/samtools-0.1.6/bam.h @ 7:351b3acadd17 default tip

Uploaded
author ryanmorin
date Tue, 18 Oct 2011 18:33:15 -0400
parents 74f5ea818cea
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
1 /* The MIT License
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
2
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
3 Copyright (c) 2008 Genome Research Ltd (GRL).
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
4
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
5 Permission is hereby granted, free of charge, to any person obtaining
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
6 a copy of this software and associated documentation files (the
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
7 "Software"), to deal in the Software without restriction, including
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
8 without limitation the rights to use, copy, modify, merge, publish,
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
9 distribute, sublicense, and/or sell copies of the Software, and to
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
10 permit persons to whom the Software is furnished to do so, subject to
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
11 the following conditions:
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
12
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
13 The above copyright notice and this permission notice shall be
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
14 included in all copies or substantial portions of the Software.
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
15
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
17 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
18 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
19 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
20 BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
21 ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
22 CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
23 SOFTWARE.
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
24 */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
25
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
26 /* Contact: Heng Li <lh3@sanger.ac.uk> */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
27
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
28 #ifndef BAM_BAM_H
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
29 #define BAM_BAM_H
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
30
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
31 /*!
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
32 @header
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
33
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
34 BAM library provides I/O and various operations on manipulating files
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
35 in the BAM (Binary Alignment/Mapping) or SAM (Sequence Alignment/Map)
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
36 format. It now supports importing from or exporting to TAM, sorting,
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
37 merging, generating pileup, and quickly retrieval of reads overlapped
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
38 with a specified region.
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
39
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
40 @copyright Genome Research Ltd.
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
41 */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
42
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
43 #include <stdint.h>
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
44 #include <stdlib.h>
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
45 #include <string.h>
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
46 #include <stdio.h>
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
47
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
48 #ifndef BAM_LITE
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
49 #define BAM_VIRTUAL_OFFSET16
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
50 #include "bgzf.h"
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
51 /*! @abstract BAM file handler */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
52 typedef BGZF *bamFile;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
53 #define bam_open(fn, mode) bgzf_open(fn, mode)
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
54 #define bam_dopen(fd, mode) bgzf_fdopen(fd, mode)
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
55 #define bam_close(fp) bgzf_close(fp)
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
56 #define bam_read(fp, buf, size) bgzf_read(fp, buf, size)
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
57 #define bam_write(fp, buf, size) bgzf_write(fp, buf, size)
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
58 #define bam_tell(fp) bgzf_tell(fp)
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
59 #define bam_seek(fp, pos, dir) bgzf_seek(fp, pos, dir)
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
60 #else
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
61 #define BAM_TRUE_OFFSET
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
62 #include <zlib.h>
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
63 typedef gzFile bamFile;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
64 #define bam_open(fn, mode) gzopen(fn, mode)
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
65 #define bam_dopen(fd, mode) gzdopen(fd, mode)
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
66 #define bam_close(fp) gzclose(fp)
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
67 #define bam_read(fp, buf, size) gzread(fp, buf, size)
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
68 /* no bam_write/bam_tell/bam_seek() here */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
69 #endif
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
70
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
71 /*! @typedef
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
72 @abstract Structure for the alignment header.
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
73 @field n_targets number of reference sequences
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
74 @field target_name names of the reference sequences
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
75 @field target_len lengths of the referene sequences
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
76 @field hash hash table for fast name lookup
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
77 @field rg2lib hash table for @RG-ID -> LB lookup
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
78 @field l_text length of the plain text in the header
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
79 @field text plain text
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
80
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
81 @discussion Field hash points to null by default. It is a private
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
82 member.
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
83 */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
84 typedef struct {
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
85 int32_t n_targets;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
86 char **target_name;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
87 uint32_t *target_len;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
88 void *hash, *rg2lib;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
89 int l_text;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
90 char *text;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
91 } bam_header_t;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
92
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
93 /*! @abstract the read is paired in sequencing, no matter whether it is mapped in a pair */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
94 #define BAM_FPAIRED 1
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
95 /*! @abstract the read is mapped in a proper pair */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
96 #define BAM_FPROPER_PAIR 2
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
97 /*! @abstract the read itself is unmapped; conflictive with BAM_FPROPER_PAIR */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
98 #define BAM_FUNMAP 4
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
99 /*! @abstract the mate is unmapped */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
100 #define BAM_FMUNMAP 8
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
101 /*! @abstract the read is mapped to the reverse strand */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
102 #define BAM_FREVERSE 16
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
103 /*! @abstract the mate is mapped to the reverse strand */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
104 #define BAM_FMREVERSE 32
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
105 /*! @abstract this is read1 */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
106 #define BAM_FREAD1 64
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
107 /*! @abstract this is read2 */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
108 #define BAM_FREAD2 128
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
109 /*! @abstract not primary alignment */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
110 #define BAM_FSECONDARY 256
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
111 /*! @abstract QC failure */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
112 #define BAM_FQCFAIL 512
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
113 /*! @abstract optical or PCR duplicate */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
114 #define BAM_FDUP 1024
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
115
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
116 #define BAM_OFDEC 0
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
117 #define BAM_OFHEX 1
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
118 #define BAM_OFSTR 2
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
119
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
120 /*! @abstract defautl mask for pileup */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
121 #define BAM_DEF_MASK (BAM_FUNMAP | BAM_FSECONDARY | BAM_FQCFAIL | BAM_FDUP)
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
122
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
123 #define BAM_CORE_SIZE sizeof(bam1_core_t)
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
124
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
125 /**
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
126 * Describing how CIGAR operation/length is packed in a 32-bit integer.
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
127 */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
128 #define BAM_CIGAR_SHIFT 4
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
129 #define BAM_CIGAR_MASK ((1 << BAM_CIGAR_SHIFT) - 1)
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
130
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
131 /*
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
132 CIGAR operations.
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
133 */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
134 /*! @abstract CIGAR: match */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
135 #define BAM_CMATCH 0
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
136 /*! @abstract CIGAR: insertion to the reference */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
137 #define BAM_CINS 1
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
138 /*! @abstract CIGAR: deletion from the reference */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
139 #define BAM_CDEL 2
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
140 /*! @abstract CIGAR: skip on the reference (e.g. spliced alignment) */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
141 #define BAM_CREF_SKIP 3
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
142 /*! @abstract CIGAR: clip on the read with clipped sequence present in qseq */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
143 #define BAM_CSOFT_CLIP 4
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
144 /*! @abstract CIGAR: clip on the read with clipped sequence trimmed off */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
145 #define BAM_CHARD_CLIP 5
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
146 /*! @abstract CIGAR: padding */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
147 #define BAM_CPAD 6
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
148
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
149 /*! @typedef
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
150 @abstract Structure for core alignment information.
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
151 @field tid chromosome ID, defined by bam_header_t
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
152 @field pos 0-based leftmost coordinate
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
153 @field strand strand; 0 for forward and 1 otherwise
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
154 @field bin bin calculated by bam_reg2bin()
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
155 @field qual mapping quality
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
156 @field l_qname length of the query name
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
157 @field flag bitwise flag
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
158 @field n_cigar number of CIGAR operations
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
159 @field l_qseq length of the query sequence (read)
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
160 */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
161 typedef struct {
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
162 int32_t tid;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
163 int32_t pos;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
164 uint32_t bin:16, qual:8, l_qname:8;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
165 uint32_t flag:16, n_cigar:16;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
166 int32_t l_qseq;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
167 int32_t mtid;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
168 int32_t mpos;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
169 int32_t isize;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
170 } bam1_core_t;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
171
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
172 /*! @typedef
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
173 @abstract Structure for one alignment.
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
174 @field core core information about the alignment
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
175 @field l_aux length of auxiliary data
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
176 @field data_len current length of bam1_t::data
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
177 @field m_data maximum length of bam1_t::data
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
178 @field data all variable-length data, concatenated; structure: cigar-qname-seq-qual-aux
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
179
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
180 @discussion Notes:
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
181
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
182 1. qname is zero tailing and core.l_qname includes the tailing '\0'.
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
183 2. l_qseq is calculated from the total length of an alignment block
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
184 on reading or from CIGAR.
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
185 */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
186 typedef struct {
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
187 bam1_core_t core;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
188 int l_aux, data_len, m_data;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
189 uint8_t *data;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
190 } bam1_t;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
191
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
192 #define bam1_strand(b) (((b)->core.flag&BAM_FREVERSE) != 0)
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
193 #define bam1_mstrand(b) (((b)->core.flag&BAM_FMREVERSE) != 0)
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
194
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
195 /*! @function
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
196 @abstract Get the CIGAR array
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
197 @param b pointer to an alignment
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
198 @return pointer to the CIGAR array
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
199
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
200 @discussion In the CIGAR array, each element is a 32-bit integer. The
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
201 lower 4 bits gives a CIGAR operation and the higher 28 bits keep the
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
202 length of a CIGAR.
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
203 */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
204 #define bam1_cigar(b) ((uint32_t*)((b)->data + (b)->core.l_qname))
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
205
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
206 /*! @function
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
207 @abstract Get the name of the query
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
208 @param b pointer to an alignment
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
209 @return pointer to the name string, null terminated
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
210 */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
211 #define bam1_qname(b) ((char*)((b)->data))
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
212
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
213 /*! @function
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
214 @abstract Get query sequence
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
215 @param b pointer to an alignment
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
216 @return pointer to sequence
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
217
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
218 @discussion Each base is encoded in 4 bits: 1 for A, 2 for C, 4 for G,
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
219 8 for T and 15 for N. Two bases are packed in one byte with the base
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
220 at the higher 4 bits having smaller coordinate on the read. It is
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
221 recommended to use bam1_seqi() macro to get the base.
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
222 */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
223 #define bam1_seq(b) ((b)->data + (b)->core.n_cigar*4 + (b)->core.l_qname)
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
224
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
225 /*! @function
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
226 @abstract Get query quality
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
227 @param b pointer to an alignment
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
228 @return pointer to quality string
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
229 */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
230 #define bam1_qual(b) ((b)->data + (b)->core.n_cigar*4 + (b)->core.l_qname + ((b)->core.l_qseq + 1)/2)
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
231
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
232 /*! @function
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
233 @abstract Get a base on read
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
234 @param s Query sequence returned by bam1_seq()
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
235 @param i The i-th position, 0-based
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
236 @return 4-bit integer representing the base.
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
237 */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
238 #define bam1_seqi(s, i) ((s)[(i)/2] >> 4*(1-(i)%2) & 0xf)
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
239
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
240 /*! @function
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
241 @abstract Get query sequence and quality
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
242 @param b pointer to an alignment
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
243 @return pointer to the concatenated auxiliary data
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
244 */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
245 #define bam1_aux(b) ((b)->data + (b)->core.n_cigar*4 + (b)->core.l_qname + (b)->core.l_qseq + ((b)->core.l_qseq + 1)/2)
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
246
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
247 #ifndef kroundup32
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
248 /*! @function
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
249 @abstract Round an integer to the next closest power-2 integer.
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
250 @param x integer to be rounded (in place)
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
251 @discussion x will be modified.
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
252 */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
253 #define kroundup32(x) (--(x), (x)|=(x)>>1, (x)|=(x)>>2, (x)|=(x)>>4, (x)|=(x)>>8, (x)|=(x)>>16, ++(x))
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
254 #endif
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
255
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
256 /*!
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
257 @abstract Whether the machine is big-endian; modified only in
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
258 bam_header_init().
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
259 */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
260 extern int bam_is_be;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
261
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
262 /*! @abstract Table for converting a nucleotide character to the 4-bit encoding. */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
263 extern unsigned char bam_nt16_table[256];
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
264
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
265 /*! @abstract Table for converting a 4-bit encoded nucleotide to a letter. */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
266 extern char *bam_nt16_rev_table;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
267
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
268 extern char bam_nt16_nt4_table[];
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
269
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
270 #ifdef __cplusplus
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
271 extern "C" {
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
272 #endif
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
273
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
274 /*! @abstract TAM file handler */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
275 typedef struct __tamFile_t *tamFile;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
276
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
277 /*!
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
278 @abstract Open a SAM file for reading, either uncompressed or compressed by gzip/zlib.
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
279 @param fn SAM file name
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
280 @return SAM file handler
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
281 */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
282 tamFile sam_open(const char *fn);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
283
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
284 /*!
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
285 @abstract Close a SAM file handler
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
286 @param fp SAM file handler
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
287 */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
288 void sam_close(tamFile fp);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
289
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
290 /*!
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
291 @abstract Read one alignment from a SAM file handler
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
292 @param fp SAM file handler
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
293 @param header header information (ordered names of chromosomes)
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
294 @param b read alignment; all members in b will be updated
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
295 @return 0 if successful; otherwise negative
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
296 */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
297 int sam_read1(tamFile fp, bam_header_t *header, bam1_t *b);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
298
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
299 /*!
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
300 @abstract Read header information from a TAB-delimited list file.
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
301 @param fn_list file name for the list
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
302 @return a pointer to the header structure
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
303
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
304 @discussion Each line in this file consists of chromosome name and
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
305 the length of chromosome.
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
306 */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
307 bam_header_t *sam_header_read2(const char *fn_list);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
308
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
309 /*!
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
310 @abstract Read header from a SAM file (if present)
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
311 @param fp SAM file handler
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
312 @return pointer to header struct; 0 if no @SQ lines available
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
313 */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
314 bam_header_t *sam_header_read(tamFile fp);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
315
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
316 /*!
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
317 @abstract Parse @SQ lines a update a header struct
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
318 @param h pointer to the header struct to be updated
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
319 @return number of target sequences
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
320
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
321 @discussion bam_header_t::{n_targets,target_len,target_name} will
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
322 be destroyed in the first place.
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
323 */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
324 int sam_header_parse(bam_header_t *h);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
325
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
326 /*!
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
327 @abstract Parse @RG lines a update a header struct
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
328 @param h pointer to the header struct to be updated
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
329 @return number of @RG lines
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
330
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
331 @discussion bam_header_t::rg2lib will be destroyed in the first
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
332 place.
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
333 */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
334 int sam_header_parse_rg(bam_header_t *h);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
335
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
336 #define sam_write1(header, b) bam_view1(header, b)
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
337
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
338 int bam_strmap_put(void *strmap, const char *rg, const char *lib);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
339 const char *bam_strmap_get(const void *strmap, const char *rg);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
340 void *bam_strmap_dup(const void*);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
341 void *bam_strmap_init();
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
342 void bam_strmap_destroy(void *strmap);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
343
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
344 /*!
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
345 @abstract Initialize a header structure.
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
346 @return the pointer to the header structure
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
347
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
348 @discussion This function also modifies the global variable
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
349 bam_is_be.
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
350 */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
351 bam_header_t *bam_header_init();
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
352
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
353 /*!
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
354 @abstract Destroy a header structure.
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
355 @param header pointer to the header
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
356 */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
357 void bam_header_destroy(bam_header_t *header);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
358
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
359 /*!
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
360 @abstract Read a header structure from BAM.
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
361 @param fp BAM file handler, opened by bam_open()
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
362 @return pointer to the header structure
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
363
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
364 @discussion The file position indicator must be placed at the
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
365 beginning of the file. Upon success, the position indicator will
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
366 be set at the start of the first alignment.
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
367 */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
368 bam_header_t *bam_header_read(bamFile fp);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
369
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
370 /*!
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
371 @abstract Write a header structure to BAM.
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
372 @param fp BAM file handler
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
373 @param header pointer to the header structure
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
374 @return always 0 currently
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
375 */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
376 int bam_header_write(bamFile fp, const bam_header_t *header);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
377
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
378 /*!
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
379 @abstract Read an alignment from BAM.
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
380 @param fp BAM file handler
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
381 @param b read alignment; all members are updated.
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
382 @return number of bytes read from the file
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
383
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
384 @discussion The file position indicator must be
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
385 placed right before an alignment. Upon success, this function
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
386 will set the position indicator to the start of the next
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
387 alignment. This function is not affected by the machine
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
388 endianness.
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
389 */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
390 int bam_read1(bamFile fp, bam1_t *b);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
391
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
392 /*!
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
393 @abstract Write an alignment to BAM.
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
394 @param fp BAM file handler
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
395 @param c pointer to the bam1_core_t structure
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
396 @param data_len total length of variable size data related to
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
397 the alignment
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
398 @param data pointer to the concatenated data
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
399 @return number of bytes written to the file
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
400
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
401 @discussion This function is not affected by the machine
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
402 endianness.
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
403 */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
404 int bam_write1_core(bamFile fp, const bam1_core_t *c, int data_len, uint8_t *data);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
405
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
406 /*!
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
407 @abstract Write an alignment to BAM.
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
408 @param fp BAM file handler
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
409 @param b alignment to write
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
410 @return number of bytes written to the file
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
411
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
412 @abstract It is equivalent to:
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
413 bam_write1_core(fp, &b->core, b->data_len, b->data)
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
414 */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
415 int bam_write1(bamFile fp, const bam1_t *b);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
416
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
417 /*! @function
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
418 @abstract Initiate a pointer to bam1_t struct
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
419 */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
420 #define bam_init1() ((bam1_t*)calloc(1, sizeof(bam1_t)))
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
421
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
422 /*! @function
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
423 @abstract Free the memory allocated for an alignment.
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
424 @param b pointer to an alignment
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
425 */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
426 #define bam_destroy1(b) do { \
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
427 free((b)->data); free(b); \
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
428 } while (0)
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
429
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
430 /*!
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
431 @abstract Format a BAM record in the SAM format
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
432 @param header pointer to the header structure
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
433 @param b alignment to print
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
434 @return a pointer to the SAM string
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
435 */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
436 char *bam_format1(const bam_header_t *header, const bam1_t *b);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
437
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
438 char *bam_format1_core(const bam_header_t *header, const bam1_t *b, int of);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
439
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
440 /*! @typedef
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
441 @abstract Structure for one alignment covering the pileup position.
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
442 @field b pointer to the alignment
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
443 @field qpos position of the read base at the pileup site, 0-based
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
444 @field indel indel length; 0 for no indel, positive for ins and negative for del
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
445 @field is_del 1 iff the base on the padded read is a deletion
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
446 @field level the level of the read in the "viewer" mode
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
447
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
448 @discussion See also bam_plbuf_push() and bam_lplbuf_push(). The
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
449 difference between the two functions is that the former does not
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
450 set bam_pileup1_t::level, while the later does. Level helps the
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
451 implementation of alignment viewers, but calculating this has some
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
452 overhead.
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
453 */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
454 typedef struct {
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
455 bam1_t *b;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
456 int32_t qpos;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
457 int indel, level;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
458 uint32_t is_del:1, is_head:1, is_tail:1;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
459 } bam_pileup1_t;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
460
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
461 struct __bam_plbuf_t;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
462 /*! @abstract pileup buffer */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
463 typedef struct __bam_plbuf_t bam_plbuf_t;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
464
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
465 void bam_plbuf_set_mask(bam_plbuf_t *buf, int mask);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
466
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
467 /*! @typedef
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
468 @abstract Type of function to be called by bam_plbuf_push().
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
469 @param tid chromosome ID as is defined in the header
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
470 @param pos start coordinate of the alignment, 0-based
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
471 @param n number of elements in pl array
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
472 @param pl array of alignments
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
473 @param data user provided data
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
474 @discussion See also bam_plbuf_push(), bam_plbuf_init() and bam_pileup1_t.
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
475 */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
476 typedef int (*bam_pileup_f)(uint32_t tid, uint32_t pos, int n, const bam_pileup1_t *pl, void *data);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
477
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
478 /*!
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
479 @abstract Reset a pileup buffer for another pileup process
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
480 @param buf the pileup buffer to be reset
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
481 */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
482 void bam_plbuf_reset(bam_plbuf_t *buf);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
483
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
484 /*!
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
485 @abstract Initialize a buffer for pileup.
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
486 @param func fucntion to be called by bam_pileup_core()
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
487 @param data user provided data
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
488 @return pointer to the pileup buffer
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
489 */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
490 bam_plbuf_t *bam_plbuf_init(bam_pileup_f func, void *data);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
491
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
492 /*!
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
493 @abstract Destroy a pileup buffer.
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
494 @param buf pointer to the pileup buffer
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
495 */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
496 void bam_plbuf_destroy(bam_plbuf_t *buf);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
497
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
498 /*!
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
499 @abstract Push an alignment to the pileup buffer.
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
500 @param b alignment to be pushed
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
501 @param buf pileup buffer
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
502 @see bam_plbuf_init()
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
503 @return always 0 currently
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
504
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
505 @discussion If all the alignments covering a particular site have
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
506 been collected, this function will call the user defined function
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
507 as is provided to bam_plbuf_init(). The coordinate of the site and
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
508 all the alignments will be transferred to the user defined
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
509 function as function parameters.
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
510
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
511 When all the alignments are pushed to the buffer, this function
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
512 needs to be called with b equal to NULL. This will flush the
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
513 buffer. A pileup buffer can only be reused when bam_plbuf_reset()
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
514 is called.
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
515 */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
516 int bam_plbuf_push(const bam1_t *b, bam_plbuf_t *buf);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
517
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
518 int bam_pileup_file(bamFile fp, int mask, bam_pileup_f func, void *func_data);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
519
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
520 struct __bam_lplbuf_t;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
521 typedef struct __bam_lplbuf_t bam_lplbuf_t;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
522
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
523 void bam_lplbuf_reset(bam_lplbuf_t *buf);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
524
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
525 /*! @abstract bam_plbuf_init() equivalent with level calculated. */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
526 bam_lplbuf_t *bam_lplbuf_init(bam_pileup_f func, void *data);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
527
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
528 /*! @abstract bam_plbuf_destroy() equivalent with level calculated. */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
529 void bam_lplbuf_destroy(bam_lplbuf_t *tv);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
530
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
531 /*! @abstract bam_plbuf_push() equivalent with level calculated. */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
532 int bam_lplbuf_push(const bam1_t *b, bam_lplbuf_t *buf);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
533
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
534 struct __bam_index_t;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
535 typedef struct __bam_index_t bam_index_t;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
536
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
537 /*!
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
538 @abstract Build index for a BAM file.
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
539 @discussion Index file "fn.bai" will be created.
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
540 @param fn name of the BAM file
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
541 @return always 0 currently
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
542 */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
543 int bam_index_build(const char *fn);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
544
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
545 /*!
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
546 @abstract Load index from file "fn.bai".
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
547 @param fn name of the BAM file (NOT the index file)
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
548 @return pointer to the index structure
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
549 */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
550 bam_index_t *bam_index_load(const char *fn);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
551
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
552 /*!
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
553 @abstract Destroy an index structure.
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
554 @param idx pointer to the index structure
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
555 */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
556 void bam_index_destroy(bam_index_t *idx);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
557
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
558 /*! @typedef
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
559 @abstract Type of function to be called by bam_fetch().
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
560 @param b the alignment
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
561 @param data user provided data
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
562 */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
563 typedef int (*bam_fetch_f)(const bam1_t *b, void *data);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
564
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
565 /*!
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
566 @abstract Retrieve the alignments that are overlapped with the
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
567 specified region.
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
568
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
569 @discussion A user defined function will be called for each
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
570 retrieved alignment ordered by its start position.
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
571
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
572 @param fp BAM file handler
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
573 @param idx pointer to the alignment index
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
574 @param tid chromosome ID as is defined in the header
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
575 @param beg start coordinate, 0-based
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
576 @param end end coordinate, 0-based
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
577 @param data user provided data (will be transferred to func)
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
578 @param func user defined function
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
579 */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
580 int bam_fetch(bamFile fp, const bam_index_t *idx, int tid, int beg, int end, void *data, bam_fetch_f func);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
581
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
582 /*!
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
583 @abstract Parse a region in the format: "chr2:100,000-200,000".
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
584 @discussion bam_header_t::hash will be initialized if empty.
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
585 @param header pointer to the header structure
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
586 @param str string to be parsed
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
587 @param ref_id the returned chromosome ID
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
588 @param begin the returned start coordinate
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
589 @param end the returned end coordinate
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
590 @return 0 on success; -1 on failure
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
591 */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
592 int bam_parse_region(bam_header_t *header, const char *str, int *ref_id, int *begin, int *end);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
593
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
594 /*!
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
595 @abstract Retrieve data of a tag
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
596 @param b pointer to an alignment struct
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
597 @param tag two-character tag to be retrieved
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
598
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
599 @return pointer to the type and data. The first character is the
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
600 type that can be 'iIsScCdfAZH'.
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
601
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
602 @discussion Use bam_aux2?() series to convert the returned data to
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
603 the corresponding type.
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
604 */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
605 uint8_t *bam_aux_get(const bam1_t *b, const char tag[2]);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
606
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
607 int32_t bam_aux2i(const uint8_t *s);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
608 float bam_aux2f(const uint8_t *s);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
609 double bam_aux2d(const uint8_t *s);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
610 char bam_aux2A(const uint8_t *s);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
611 char *bam_aux2Z(const uint8_t *s);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
612
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
613 int bam_aux_del(bam1_t *b, uint8_t *s);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
614 void bam_aux_append(bam1_t *b, const char tag[2], char type, int len, uint8_t *data);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
615 uint8_t *bam_aux_get_core(bam1_t *b, const char tag[2]); // an alias of bam_aux_get()
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
616
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
617 /*!
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
618 @abstract Calculate the rightmost coordinate of an alignment on the
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
619 reference genome.
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
620
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
621 @param c pointer to the bam1_core_t structure
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
622 @param cigar the corresponding CIGAR array (from bam1_t::cigar)
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
623 @return the rightmost coordinate, 0-based
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
624 */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
625 uint32_t bam_calend(const bam1_core_t *c, const uint32_t *cigar);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
626
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
627 /*!
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
628 @abstract Calculate the length of the query sequence from CIGAR.
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
629 @param c pointer to the bam1_core_t structure
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
630 @param cigar the corresponding CIGAR array (from bam1_t::cigar)
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
631 @return length of the query sequence
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
632 */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
633 int32_t bam_cigar2qlen(const bam1_core_t *c, const uint32_t *cigar);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
634
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
635 typedef struct {
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
636 int32_t qbeg, qend;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
637 int32_t tbeg, tend;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
638 int32_t cbeg, cend;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
639 } bam_segreg_t;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
640
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
641 int bam_segreg(int32_t pos, const bam1_core_t *c, const uint32_t *cigar, bam_segreg_t *reg);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
642
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
643 #ifdef __cplusplus
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
644 }
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
645 #endif
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
646
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
647 /*!
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
648 @abstract Calculate the minimum bin that contains a region [beg,end).
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
649 @param beg start of the region, 0-based
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
650 @param end end of the region, 0-based
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
651 @return bin
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
652 */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
653 static inline int bam_reg2bin(uint32_t beg, uint32_t end)
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
654 {
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
655 --end;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
656 if (beg>>14 == end>>14) return 4681 + (beg>>14);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
657 if (beg>>17 == end>>17) return 585 + (beg>>17);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
658 if (beg>>20 == end>>20) return 73 + (beg>>20);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
659 if (beg>>23 == end>>23) return 9 + (beg>>23);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
660 if (beg>>26 == end>>26) return 1 + (beg>>26);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
661 return 0;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
662 }
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
663
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
664 /*!
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
665 @abstract Copy an alignment
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
666 @param bdst destination alignment struct
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
667 @param bsrc source alignment struct
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
668 @return pointer to the destination alignment struct
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
669 */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
670 static inline bam1_t *bam_copy1(bam1_t *bdst, const bam1_t *bsrc)
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
671 {
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
672 uint8_t *data = bdst->data;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
673 int m_data = bdst->m_data; // backup data and m_data
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
674 if (m_data < bsrc->m_data) { // double the capacity
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
675 m_data = bsrc->m_data; kroundup32(m_data);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
676 data = (uint8_t*)realloc(data, m_data);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
677 }
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
678 memcpy(data, bsrc->data, bsrc->data_len); // copy var-len data
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
679 *bdst = *bsrc; // copy the rest
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
680 // restore the backup
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
681 bdst->m_data = m_data;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
682 bdst->data = data;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
683 return bdst;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
684 }
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
685
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
686 /*!
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
687 @abstract Duplicate an alignment
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
688 @param src source alignment struct
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
689 @return pointer to the destination alignment struct
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
690 */
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
691 static inline bam1_t *bam_dup1(const bam1_t *src)
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
692 {
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
693 bam1_t *b;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
694 b = bam_init1();
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
695 *b = *src;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
696 b->m_data = b->data_len;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
697 b->data = (uint8_t*)calloc(b->data_len, 1);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
698 memcpy(b->data, src->data, b->data_len);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
699 return b;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
700 }
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
701
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
702 #endif