1 #ifndef BAMLITE_H_ 2 #define BAMLITE_H_ 3 4 #include <stdint.h> 5 #include <zlib.h> 6 7 #ifdef USE_MALLOC_WRAPPERS 8 # include "malloc_wrap.h" 9 #endif 10 11 #define USE_VERBOSE_ZLIB_WRAPPERS 12 13 typedef gzFile bamFile; 14 #ifdef USE_VERBOSE_ZLIB_WRAPPERS 15 /* These print error messages on failure */ 16 # define bam_open(fn, mode) bamlite_gzopen(fn, mode) 17 # define bam_dopen(fd, mode) gzdopen(fd, mode) 18 # define bam_close(fp) bamlite_gzclose(fp) 19 # define bam_read(fp, buf, size) bamlite_gzread(fp, buf, size) 20 #else 21 # define bam_open(fn, mode) gzopen(fn, mode) 22 # define bam_dopen(fd, mode) gzdopen(fd, mode) 23 # define bam_close(fp) gzclose(fp) 24 # define bam_read(fp, buf, size) gzread(fp, buf, size) 25 #endif /* USE_VERBOSE_ZLIB_WRAPPERS */ 26 27 typedef struct { 28 int32_t n_targets; 29 char **target_name; 30 uint32_t *target_len; 31 size_t l_text, n_text; 32 char *text; 33 } bam_header_t; 34 35 #define BAM_FPAIRED 1 36 #define BAM_FPROPER_PAIR 2 37 #define BAM_FUNMAP 4 38 #define BAM_FMUNMAP 8 39 #define BAM_FREVERSE 16 40 #define BAM_FMREVERSE 32 41 #define BAM_FREAD1 64 42 #define BAM_FREAD2 128 43 #define BAM_FSECONDARY 256 44 #define BAM_FQCFAIL 512 45 #define BAM_FDUP 1024 46 47 #define BAM_CIGAR_SHIFT 4 48 #define BAM_CIGAR_MASK ((1 << BAM_CIGAR_SHIFT) - 1) 49 50 #define BAM_CMATCH 0 51 #define BAM_CINS 1 52 #define BAM_CDEL 2 53 #define BAM_CREF_SKIP 3 54 #define BAM_CSOFT_CLIP 4 55 #define BAM_CHARD_CLIP 5 56 #define BAM_CPAD 6 57 58 typedef struct { 59 int32_t tid; 60 int32_t pos; 61 uint32_t bin:16, qual:8, l_qname:8; 62 uint32_t flag:16, n_cigar:16; 63 int32_t l_qseq; 64 int32_t mtid; 65 int32_t mpos; 66 int32_t isize; 67 } bam1_core_t; 68 69 typedef struct { 70 bam1_core_t core; 71 int l_aux, data_len, m_data; 72 uint8_t *data; 73 } bam1_t; 74 75 #ifndef kroundup32 76 #define kroundup32(x) (--(x), (x)|=(x)>>1, (x)|=(x)>>2, (x)|=(x)>>4, (x)|=(x)>>8, (x)|=(x)>>16, ++(x)) 77 #endif 78 79 #define bam1_strand(b) (((b)->core.flag&BAM_FREVERSE) != 0) 80 #define bam1_mstrand(b) (((b)->core.flag&BAM_FMREVERSE) != 0) 81 #define bam1_cigar(b) ((uint32_t*)((b)->data + (b)->core.l_qname)) 82 #define bam1_qname(b) ((char*)((b)->data)) 83 #define bam1_seq(b) ((b)->data + (b)->core.n_cigar*4 + (b)->core.l_qname) 84 #define bam1_qual(b) ((b)->data + (b)->core.n_cigar*4 + (b)->core.l_qname + (((b)->core.l_qseq + 1)>>1)) 85 #define bam1_seqi(s, i) ((s)[(i)/2] >> 4*(1-(i)%2) & 0xf) 86 #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) 87 88 #define bam_init1() ((bam1_t*)calloc(1, sizeof(bam1_t))) 89 #define bam_destroy1(b) do { \ 90 if (b) { free((b)->data); free(b); } \ 91 } while (0) 92 93 extern int bam_is_be; 94 95 #ifdef __cplusplus 96 extern "C" { 97 #endif 98 99 bam_header_t *bam_header_init(void); 100 void bam_header_destroy(bam_header_t *header); 101 bam_header_t *bam_header_read(bamFile fp); 102 int bam_read1(bamFile fp, bam1_t *b); 103 104 #ifdef USE_VERBOSE_ZLIB_WRAPPERS 105 gzFile bamlite_gzopen(const char *fn, const char *mode); 106 int bamlite_gzread(gzFile file, void *ptr, unsigned int len); 107 int bamlite_gzclose(gzFile file); 108 #endif /* USE_VERBOSE_ZLIB_WRAPPERS */ 109 110 #ifdef __cplusplus 111 } 112 #endif 113 114 #endif 115