|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef BCFTOOLS_H |
|
#define BCFTOOLS_H |
|
|
|
#include <stdarg.h> |
|
#include <htslib/hts_defs.h> |
|
#include <htslib/vcf.h> |
|
#include <htslib/synced_bcf_reader.h> |
|
#include <math.h> |
|
|
|
#define FT_TAB_TEXT 0 |
|
#define FT_GZ 1 |
|
#define FT_VCF 2 |
|
#define FT_VCF_GZ (FT_GZ|FT_VCF) |
|
#define FT_BCF (1<<2) |
|
#define FT_BCF_GZ (FT_GZ|FT_BCF) |
|
#define FT_STDIN (1<<3) |
|
|
|
char *bcftools_version(void); |
|
|
|
|
|
void error(const char *format, ...) HTS_NORETURN HTS_FORMAT(HTS_PRINTF_FMT, 1, 2); |
|
|
|
|
|
|
|
|
|
void error_errno(const char *format, ...) HTS_NORETURN HTS_FORMAT(HTS_PRINTF_FMT, 1, 2); |
|
|
|
|
|
int init_index(htsFile *fh, bcf_hdr_t *hdr, char *fname, char **idx_fname); |
|
|
|
void bcf_hdr_append_version(bcf_hdr_t *hdr, int argc, char **argv, const char *cmd); |
|
const char *hts_bcf_wmode(int file_type); |
|
const char *hts_bcf_wmode2(int file_type, const char *fname); |
|
void set_wmode(char dst[8], int file_type, const char *fname, int compression_level); |
|
char *init_tmp_prefix(const char *prefix); |
|
int read_AF(bcf_sr_regions_t *tgt, bcf1_t *line, double *alt_freq); |
|
int parse_overlap_option(const char *arg); |
|
|
|
static inline int iupac2bitmask(char iupac) |
|
{ |
|
const int A = 1; |
|
const int C = 2; |
|
const int G = 4; |
|
const int T = 8; |
|
if ( iupac >= 97 ) iupac -= 32; |
|
if ( iupac == 'A' ) return A; |
|
if ( iupac == 'C' ) return C; |
|
if ( iupac == 'G' ) return G; |
|
if ( iupac == 'T' ) return T; |
|
if ( iupac == 'M' ) return A|C; |
|
if ( iupac == 'R' ) return A|G; |
|
if ( iupac == 'W' ) return A|T; |
|
if ( iupac == 'S' ) return C|G; |
|
if ( iupac == 'Y' ) return C|T; |
|
if ( iupac == 'K' ) return G|T; |
|
if ( iupac == 'V' ) return A|C|G; |
|
if ( iupac == 'H' ) return A|C|T; |
|
if ( iupac == 'D' ) return A|G|T; |
|
if ( iupac == 'B' ) return C|G|T; |
|
if ( iupac == 'N' ) return A|C|G|T; |
|
return -1; |
|
} |
|
static inline char bitmask2iupac(int bitmask) |
|
{ |
|
const char iupac[16] = {'.','A','C','M','G','R','S','V','T','W','Y','H','K','D','B','N'}; |
|
if ( bitmask <= 0 || bitmask > 15 ) return 0; |
|
return iupac[bitmask]; |
|
} |
|
|
|
static inline int iupac_consistent(char iupac, char nt) |
|
{ |
|
static const char iupac_mask[90] = { |
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, |
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, |
|
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,14,2, |
|
13,0,0,4,11,0,0,12,0,3,15,0,0,0,5,6,8,0,7,9,0,10 |
|
}; |
|
if ( iupac > 89 ) return 0; |
|
if ( nt > 90 ) nt -= 32; |
|
if ( nt=='A' ) nt = 1; |
|
else if ( nt=='C' ) nt = 2; |
|
else if ( nt=='G' ) nt = 4; |
|
else if ( nt=='T' ) nt = 8; |
|
return iupac_mask[(int)iupac] & nt ? 1 : 0; |
|
} |
|
|
|
static inline char nt_to_upper(char nt) |
|
{ |
|
if ( nt < 97 ) return nt; |
|
return nt - 32; |
|
} |
|
|
|
static inline double phred_score(double prob) |
|
{ |
|
if ( prob==0 ) return 99; |
|
prob = -4.3429*log(prob); |
|
return prob>99 ? 99 : prob; |
|
} |
|
|
|
static const uint64_t bcf_double_missing = 0x7ff0000000000001; |
|
static const uint64_t bcf_double_vector_end = 0x7ff0000000000002; |
|
static inline void bcf_double_set(double *ptr, uint64_t value) |
|
{ |
|
union { uint64_t i; double d; } u; |
|
u.i = value; |
|
*ptr = u.d; |
|
} |
|
static inline int bcf_double_test(double d, uint64_t value) |
|
{ |
|
union { uint64_t i; double d; } u; |
|
u.d = d; |
|
return u.i==value ? 1 : 0; |
|
} |
|
#define bcf_double_set_vector_end(x) bcf_double_set(&(x),bcf_double_vector_end) |
|
#define bcf_double_set_missing(x) bcf_double_set(&(x),bcf_double_missing) |
|
#define bcf_double_is_vector_end(x) bcf_double_test((x),bcf_double_vector_end) |
|
#define bcf_double_is_missing(x) bcf_double_test((x),bcf_double_missing) |
|
#define bcf_double_is_missing_or_vector_end(x) (bcf_double_test((x),bcf_double_missing) || bcf_double_test((x),bcf_double_vector_end)) |
|
|
|
#endif |
|
|