htslib 0.0.1 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,24 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module HTS
4
- module FFI
4
+ module LibHTS
5
+ # constants
6
+ BAM_CMATCH = 0
7
+ BAM_CINS = 1
8
+ BAM_CDEL = 2
9
+ BAM_CREF_SKIP = 3
10
+ BAM_CSOFT_CLIP = 4
11
+ BAM_CHARD_CLIP = 5
12
+ BAM_CPAD = 6
13
+ BAM_CEQUAL = 7
14
+ BAM_CDIFF = 8
15
+ BAM_CBACK = 9
16
+
17
+ BAM_CIGAR_STR = "MIDNSHP=XB"
18
+ BAM_CIGAR_SHIFT = 4
19
+ BAM_CIGAR_MASK = 0xf
20
+ BAM_CIGAR_TYPE = 0x3C1A7
21
+
5
22
  # macros
6
23
  class << self
7
24
  def bam_cigar_op(c)
@@ -13,7 +30,7 @@ module HTS
13
30
  end
14
31
 
15
32
  def bam_cigar_opchr(c)
16
- (BAM_CIGAR_STR + '??????')[bam_cigar_op(c)]
33
+ ("#{BAM_CIGAR_STR}??????")[bam_cigar_op(c)]
17
34
  end
18
35
 
19
36
  def bam_cigar_gen(l, o)
@@ -25,6 +42,19 @@ module HTS
25
42
  end
26
43
  end
27
44
 
45
+ BAM_FPAIRED = 1
46
+ BAM_FPROPER_PAIR = 2
47
+ BAM_FUNMAP = 4
48
+ BAM_FMUNMAP = 8
49
+ BAM_FREVERSE = 16
50
+ BAM_FMREVERSE = 32
51
+ BAM_FREAD1 = 64
52
+ BAM_FREAD2 = 128
53
+ BAM_FSECONDARY = 256
54
+ BAM_FQCFAIL = 512
55
+ BAM_FDUP = 1024
56
+ BAM_FSUPPLEMENTARY = 2048
57
+
28
58
  # macros
29
59
  # function-like macros
30
60
  class << self
@@ -148,13 +178,13 @@ module HTS
148
178
  # Returns a complete line of formatted text for a given type and ID.
149
179
  attach_function \
150
180
  :sam_hdr_find_line_id,
151
- [SamHdr, :string, :string, :string, Kstring],
181
+ [SamHdr, :string, :string, :string, KString],
152
182
  :int
153
183
 
154
184
  # Returns a complete line of formatted text for a given type and index.
155
185
  attach_function \
156
186
  :sam_hdr_find_line_pos,
157
- [SamHdr, :string, :int, Kstring],
187
+ [SamHdr, :string, :int, KString],
158
188
  :int
159
189
 
160
190
  # Remove a line with given type / id from a header
@@ -208,13 +238,13 @@ module HTS
208
238
  # Return the value associated with a key for a header line identified by ID_key:ID_val
209
239
  attach_function \
210
240
  :sam_hdr_find_tag_id,
211
- [SamHdr, :string, :string, :string, :string, Kstring],
241
+ [SamHdr, :string, :string, :string, :string, KString],
212
242
  :int
213
243
 
214
244
  # Return the value associated with a key for a header line identified by position
215
245
  attach_function \
216
246
  :sam_hdr_find_tag_pos,
217
- [SamHdr, :string, :int, :string, Kstring],
247
+ [SamHdr, :string, :int, :string, KString],
218
248
  :int
219
249
 
220
250
  # Remove the key from the line identified by type, ID_key and ID_value.
@@ -410,7 +440,7 @@ module HTS
410
440
  # Get the next read from a SAM/BAM/CRAM iterator
411
441
  def self.sam_itr_next(htsfp, itr, r)
412
442
  # FIXME: check if htsfp is compressed BGZF
413
- hts_log_error('Null iterator') if itr.null?
443
+ hts_log_error("Null iterator") if itr.null?
414
444
  # FIXME: check multi
415
445
  hts_itr_next(htsfp[:fp][:bgzf], itr, r, htsfp)
416
446
  end
@@ -445,12 +475,12 @@ module HTS
445
475
 
446
476
  attach_function \
447
477
  :sam_parse1,
448
- [Kstring, SamHdr, Bam1],
478
+ [KString, SamHdr, Bam1],
449
479
  :int
450
480
 
451
481
  attach_function \
452
482
  :sam_format1,
453
- [SamHdr, Bam1, Kstring],
483
+ [SamHdr, Bam1, KString],
454
484
  :int
455
485
 
456
486
  # Read a record from a file
@@ -553,52 +583,52 @@ module HTS
553
583
  attach_function \
554
584
  :bam_plp_init,
555
585
  %i[bam_plp_auto_f pointer],
556
- BamPlp
586
+ :bam_plp
557
587
 
558
588
  attach_function \
559
589
  :bam_plp_destroy,
560
- [BamPlp],
590
+ [:bam_plp],
561
591
  :void
562
592
 
563
593
  attach_function \
564
594
  :bam_plp_push,
565
- [BamPlp, Bam1],
595
+ [:bam_plp, Bam1],
566
596
  :int
567
597
 
568
598
  attach_function \
569
599
  :bam_plp_next,
570
- [BamPlp, :pointer, :pointer, :pointer],
571
- :pointer
600
+ %i[bam_plp pointer pointer pointer],
601
+ BamPileup1.by_ref
572
602
 
573
603
  attach_function \
574
604
  :bam_plp_auto,
575
- [BamPlp, :pointer, :pointer, :pointer],
576
- :pointer
605
+ %i[bam_plp pointer pointer pointer],
606
+ BamPileup1.by_ref
577
607
 
578
608
  attach_function \
579
609
  :bam_plp64_next,
580
- [BamPlp, :pointer, :pointer, :pointer],
581
- :pointer
610
+ %i[bam_plp pointer pointer pointer],
611
+ BamPileup1.by_ref
582
612
 
583
613
  attach_function \
584
614
  :bam_plp64_auto,
585
- [BamPlp, :pointer, :pointer, :pointer],
586
- :pointer
615
+ %i[bam_plp pointer pointer pointer],
616
+ BamPileup1.by_ref
587
617
 
588
618
  attach_function \
589
619
  :bam_plp_set_maxcnt,
590
- [BamPlp, :int],
620
+ %i[bam_plp int],
591
621
  :void
592
622
 
593
623
  attach_function \
594
624
  :bam_plp_reset,
595
- [BamPlp],
625
+ [:bam_plp],
596
626
  :void
597
627
 
598
628
  # sets a callback to initialise any per-pileup1_t fields.
599
629
  attach_function \
600
630
  :bam_plp_insertion,
601
- [:pointer, Kstring, :pointer],
631
+ [BamPileup1, KString, :pointer],
602
632
  :int
603
633
 
604
634
  # sets a callback to initialise any per-pileup1_t fields.
@@ -612,36 +642,36 @@ module HTS
612
642
  attach_function \
613
643
  :bam_mplp_init,
614
644
  %i[int bam_plp_auto_f pointer],
615
- BamMplp.by_ref
645
+ :bam_mplp
616
646
 
617
647
  attach_function \
618
648
  :bam_mplp_init_overlaps,
619
- [BamMplp],
649
+ [:bam_mplp],
620
650
  :int
621
651
 
622
652
  attach_function \
623
653
  :bam_mplp_destroy,
624
- [BamMplp],
654
+ [:bam_mplp],
625
655
  :void
626
656
 
627
657
  attach_function \
628
658
  :bam_mplp_set_maxcnt,
629
- [BamMplp, :int],
659
+ %i[bam_mplp int],
630
660
  :void
631
661
 
632
662
  attach_function \
633
663
  :bam_mplp_auto,
634
- [BamMplp, :pointer, :pointer, :pointer, :pointer],
664
+ %i[bam_mplp pointer pointer pointer pointer], # BamPileup1T
635
665
  :int
636
666
 
637
667
  attach_function \
638
668
  :bam_mplp64_auto,
639
- [BamMplp, :pointer, :pointer, :pointer, :pointer],
669
+ %i[bam_mplp pointer pointer pointer pointer], # BamPileup1T
640
670
  :int
641
671
 
642
672
  attach_function \
643
673
  :bam_mplp_reset,
644
- [BamMplp],
674
+ [:bam_mplp],
645
675
  :void
646
676
 
647
677
  # bam_mplp_constructor
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module HTS
4
- module FFI
4
+ module LibHTS
5
5
  attach_function \
6
6
  :tbx_name2id,
7
7
  [Tbx, :string],
@@ -1,7 +1,210 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module HTS
4
- module FFI
4
+ module LibHTS
5
+ # constants
6
+ BCF_HL_FLT = 0 # header line
7
+ BCF_HL_INFO = 1
8
+ BCF_HL_FMT = 2
9
+ BCF_HL_CTG = 3
10
+ BCF_HL_STR = 4 # structured header line TAG=<A=..,B=..>
11
+ BCF_HL_GEN = 5 # generic header line
12
+ BCF_HT_FLAG = 0 # header type
13
+
14
+ BCF_HT_INT = 1
15
+ BCF_HT_REAL = 2
16
+ BCF_HT_STR = 3
17
+ BCF_HT_LONG = (BCF_HT_INT | 0x100) # BCF_HT_INT, but for int64_t values; VCF only!
18
+
19
+ BCF_VL_FIXED = 0 # variable length
20
+ BCF_VL_VAR = 1
21
+ BCF_VL_A = 2
22
+ BCF_VL_G = 3
23
+ BCF_VL_R = 4
24
+
25
+ BCF_DT_ID = 0 # dictionary type
26
+ BCF_DT_CTG = 1
27
+ BCF_DT_SAMPLE = 2
28
+
29
+ BCF_BT_NULL = 0
30
+ BCF_BT_INT8 = 1
31
+ BCF_BT_INT16 = 2
32
+ BCF_BT_INT32 = 3
33
+ BCF_BT_INT64 = 4 # Unofficial, for internal use only.
34
+ BCF_BT_FLOAT = 5
35
+ BCF_BT_CHAR = 7
36
+
37
+ VCF_REF = 0
38
+ VCF_SNP = 1
39
+ VCF_MNP = 2
40
+ VCF_INDEL = 4
41
+ VCF_OTHER = 8
42
+ VCF_BND = 16 # breakend
43
+ VCF_OVERLAP = 32 # overlapping deletion, ALT=*
44
+
45
+ BCF1_DIRTY_ID = 1
46
+ BCF1_DIRTY_ALS = 2
47
+ BCF1_DIRTY_FLT = 4
48
+ BCF1_DIRTY_INF = 8
49
+
50
+ BCF_ERR_CTG_UNDEF = 1
51
+ BCF_ERR_TAG_UNDEF = 2
52
+ BCF_ERR_NCOLS = 4
53
+ BCF_ERR_LIMITS = 8
54
+ BCF_ERR_CHAR = 16
55
+ BCF_ERR_CTG_INVALID = 32
56
+ BCF_ERR_TAG_INVALID = 64
57
+
58
+ # macros
59
+ class << self
60
+ alias bcf_open hts_open
61
+ alias vcf_open hts_open
62
+ alias bcf_close hts_close
63
+ alias vcf_close hts_close
64
+
65
+ def bcf_hdr_nsamples(hdr)
66
+ hdr[:n][BCF_DT_SAMPLE]
67
+ end
68
+
69
+ def bcf_update_info_int32(hdr, line, key, values, n)
70
+ bcf_update_info(hdr, line, key, values, n, BCF_HT_INT)
71
+ end
72
+
73
+ def bcf_update_info_float(hdr, line, key, values, n)
74
+ bcf_update_info(hdr, line, key, values, n, BCF_HT_REAL)
75
+ end
76
+
77
+ def bcf_update_info_flag(hdr, line, key, string, n)
78
+ bcf_update_info(hdr, line, key, string, n, BCF_HT_FLAG)
79
+ end
80
+
81
+ def bcf_update_info_string(hdr, line, key, string)
82
+ bcf_update_info(hdr, line, key, string, 1, BCF_HT_STR)
83
+ end
84
+
85
+ def bcf_update_format_int32(hdr, line, key, values, n)
86
+ bcf_update_format(hdr, line, key, values, n,
87
+ BCF_HT_INT)
88
+ end
89
+
90
+ def bcf_update_format_float(hdr, line, key, values, n)
91
+ bcf_update_format(hdr, line, key, values, n,
92
+ BCF_HT_REAL)
93
+ end
94
+
95
+ def bcf_update_format_char(hdr, line, key, values, n)
96
+ bcf_update_format(hdr, line, key, values, n,
97
+ BCF_HT_STR)
98
+ end
99
+
100
+ def bcf_update_genotypes(hdr, line, gts, n)
101
+ bcf_update_format(hdr, line, "GT", gts, n, BCF_HT_INT)
102
+ end
103
+
104
+ def bcf_gt_phased(idx)
105
+ ((idx + 1) << 1 | 1)
106
+ end
107
+
108
+ def bcf_gt_unphased(idx)
109
+ ((idx + 1) << 1)
110
+ end
111
+
112
+ def bcf_gt_missing
113
+ 0
114
+ end
115
+
116
+ def bcf_gt_is_missing(val)
117
+ ((val) >> 1 ? 0 : 1)
118
+ end
119
+
120
+ def bcf_gt_is_phased(idx)
121
+ ((idx) & 1)
122
+ end
123
+
124
+ def bcf_gt_allele(val)
125
+ (((val) >> 1) - 1)
126
+ end
127
+
128
+ def bcf_alleles2gt(a, b)
129
+ ((a) > (b) ? (a * (a + 1) / 2 + b) : (b * (b + 1) / 2 + a))
130
+ end
131
+
132
+ def bcf_get_info_int32(hdr, line, tag, dst, ndst)
133
+ bcf_get_info_values(hdr, line, tag, dst, ndst, BCF_HT_INT)
134
+ end
135
+
136
+ def bcf_get_info_float(hdr, line, tag, dst, ndst)
137
+ bcf_get_info_values(hdr, line, tag, dst, ndst, BCF_HT_REAL)
138
+ end
139
+
140
+ def bcf_get_info_string(hdr, line, tag, dst, ndst)
141
+ bcf_get_info_values(hdr, line, tag, dst, ndst, BCF_HT_STR)
142
+ end
143
+
144
+ def bcf_get_info_flag(hdr, line, tag, dst, ndst)
145
+ bcf_get_info_values(hdr, line, tag, dst, ndst, BCF_HT_FLAG)
146
+ end
147
+
148
+ def bcf_get_format_int32(hdr, line, tag, dst, ndst)
149
+ bcf_get_format_values(hdr, line, tag, dst, ndst, BCF_HT_INT)
150
+ end
151
+
152
+ def bcf_get_format_float(hdr, line, tag, dst, ndst)
153
+ bcf_get_format_values(hdr, line, tag, dst, ndst, BCF_HT_REAL)
154
+ end
155
+
156
+ def bcf_get_format_char(hdr, line, tag, dst, ndst)
157
+ bcf_get_format_values(hdr, line, tag, dst, ndst, BCF_HT_STR)
158
+ end
159
+
160
+ def bcf_get_genotypes(hdr, line, dst, ndst)
161
+ bcf_get_format_values(hdr, line, "GT", dst, ndst, BCF_HT_INT)
162
+ end
163
+
164
+ def bcf_hdr_int2id(hdr, type, int_id)
165
+ LibHTS::BcfIdpair.new(
166
+ hdr[:id][type].to_ptr +
167
+ LibHTS::BcfIdpair.size * int_id # offsets
168
+ )[:key]
169
+ end
170
+
171
+ def bcf_hdr_name2id(hdr, id)
172
+ bcf_hdr_id2int(hdr, BCF_DT_CTG, id)
173
+ end
174
+
175
+ def bcf_hdr_id2name(hdr, rid)
176
+ return nil if hdr.null? || rid < 0 || rid >= hdr[:n][LibHTS::BCF_DT_CTG]
177
+
178
+ LibHTS::BcfIdpair.new(
179
+ hdr[:id][LibHTS::BCF_DT_CTG].to_ptr +
180
+ LibHTS::BcfIdpair.size * rid # offset
181
+ )[:key]
182
+ end
183
+
184
+ def bcf_hdr_id2length(hdr, type, int_id)
185
+ LibHTS::BcfIdpair.new(
186
+ hdr[:id][LibHTS::BCF_DT_ID].to_ptr +
187
+ LibHTS::BcfIdpair.size * int_id # offset
188
+ )[:val][:info][type] >> 8 & 0xf
189
+ end
190
+
191
+ def bcf_hdr_id2number(hdr, type, int_id)
192
+ LibHTS::BcfIdpair.new(
193
+ hdr[:id][LibHTS::BCF_DT_ID].to_ptr +
194
+ LibHTS::BcfIdpair.size * int_id # offset
195
+ )[:val][:info][type] >> 12
196
+ end
197
+ end
198
+
199
+ # constants
200
+ BCF_UN_STR = 1 # up to ALT inclusive
201
+ BCF_UN_FLT = 2 # up to FILTER
202
+ BCF_UN_INFO = 4 # up to INFO
203
+ BCF_UN_SHR = (BCF_UN_STR | BCF_UN_FLT | BCF_UN_INFO) # all shared information
204
+ BCF_UN_FMT = 8 # unpack format and each sample
205
+ BCF_UN_IND = BCF_UN_FMT # a synonym of BCF_UN_FMT
206
+ BCF_UN_ALL = (BCF_UN_SHR | BCF_UN_FMT) # everything
207
+
5
208
  attach_function \
6
209
  :bcf_hdr_init,
7
210
  [:string],
@@ -14,7 +217,7 @@ module HTS
14
217
 
15
218
  attach_function \
16
219
  :bcf_init,
17
- [:void],
220
+ [],
18
221
  Bcf1.by_ref
19
222
 
20
223
  attach_function \
@@ -54,7 +257,7 @@ module HTS
54
257
 
55
258
  attach_function \
56
259
  :vcf_parse,
57
- [Kstring, BcfHdr, Bcf1],
260
+ [KString, BcfHdr, Bcf1],
58
261
  :int
59
262
 
60
263
  attach_function \
@@ -64,7 +267,7 @@ module HTS
64
267
 
65
268
  attach_function \
66
269
  :vcf_format,
67
- [BcfHdr, Bcf1, Kstring],
270
+ [BcfHdr, Bcf1, KString],
68
271
  :int
69
272
 
70
273
  attach_function \
@@ -119,7 +322,7 @@ module HTS
119
322
 
120
323
  attach_function \
121
324
  :vcf_write_line,
122
- [HtsFile, Kstring],
325
+ [HtsFile, KString],
123
326
  :int
124
327
 
125
328
  attach_function \
@@ -144,7 +347,7 @@ module HTS
144
347
 
145
348
  attach_function \
146
349
  :bcf_hdr_format,
147
- [BcfHdr, :int, Kstring],
350
+ [BcfHdr, :int, KString],
148
351
  :int
149
352
 
150
353
  attach_function \
@@ -204,7 +407,7 @@ module HTS
204
407
 
205
408
  attach_function \
206
409
  :bcf_hrec_format,
207
- [BcfHrec, Kstring],
410
+ [BcfHrec, KString],
208
411
  :int
209
412
 
210
413
  attach_function \
@@ -369,27 +572,27 @@ module HTS
369
572
 
370
573
  attach_function \
371
574
  :bcf_fmt_array,
372
- [Kstring, :int, :int, :pointer],
575
+ [KString, :int, :int, :pointer],
373
576
  :int
374
577
 
375
578
  attach_function \
376
579
  :bcf_fmt_sized_array,
377
- [Kstring, :pointer],
580
+ [KString, :pointer],
378
581
  :uint8_t
379
582
 
380
583
  attach_function \
381
584
  :bcf_enc_vchar,
382
- [Kstring, :int, :string],
585
+ [KString, :int, :string],
383
586
  :int
384
587
 
385
588
  attach_function \
386
589
  :bcf_enc_vint,
387
- [Kstring, :int, :pointer, :int],
590
+ [KString, :int, :pointer, :int],
388
591
  :int
389
592
 
390
593
  attach_function \
391
594
  :bcf_enc_vfloat,
392
- [Kstring, :int, :pointer],
595
+ [KString, :int, :pointer],
393
596
  :int
394
597
 
395
598
  attach_function \
data/lib/hts/libhts.rb ADDED
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "ffi_ext/struct"
4
+
5
+ module HTS
6
+ module LibHTS
7
+ extend FFI::Library
8
+
9
+ begin
10
+ ffi_lib HTS.lib_path
11
+ rescue LoadError => e
12
+ raise LoadError, "#{e}\nCould not find #{HTS.lib_path}"
13
+ end
14
+
15
+ def self.attach_function(*)
16
+ super
17
+ rescue FFI::NotFoundError => e
18
+ warn e.message
19
+ end
20
+ end
21
+ end
22
+
23
+ require_relative "libhts/constants"
24
+
25
+ # This is alphabetical order.
26
+ require_relative "libhts/bgzf"
27
+ require_relative "libhts/faidx"
28
+ require_relative "libhts/hfile"
29
+ require_relative "libhts/hts"
30
+ require_relative "libhts/sam"
31
+ require_relative "libhts/kfunc"
32
+ require_relative "libhts/tbx"
33
+ require_relative "libhts/vcf"
data/lib/hts/tabix.rb ADDED
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Based on hts-python
4
+ # https://github.com/quinlan-lab/hts-python
5
+
6
+ module HTS
7
+ class Tabix
8
+ class << self
9
+ alias open new
10
+ end
11
+ def initialize
12
+ # IO like API
13
+ if block_given?
14
+ begin
15
+ yield self
16
+ ensure
17
+ close
18
+ end
19
+ end
20
+ end
21
+
22
+ def build; end
23
+
24
+ def sequences; end
25
+
26
+ # def __call__\
27
+ end
28
+ end
data/lib/hts/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module HTS
4
- VERSION = '0.0.1'
4
+ VERSION = "0.0.5"
5
5
  end
data/lib/htslib.rb CHANGED
@@ -1,30 +1,45 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'ffi'
3
+ require "ffi"
4
4
 
5
- require 'hts/version'
5
+ require "hts/version"
6
6
 
7
7
  module HTS
8
8
  class Error < StandardError; end
9
9
 
10
10
  class << self
11
- attr_accessor :ffi_lib
12
- end
13
-
14
- suffix = ::FFI::Platform::LIBSUFFIX
11
+ attr_accessor :lib_path
15
12
 
16
- self.ffi_lib = if ENV['HTSLIBDIR']
17
- File.expand_path("libhts.#{suffix}", ENV['HTSLIBDIR'])
13
+ def search_htslib(name = nil)
14
+ name ||= "libhts.#{FFI::Platform::LIBSUFFIX}"
15
+ lib_path = if ENV["HTSLIBDIR"]
16
+ File.expand_path(name, ENV["HTSLIBDIR"])
18
17
  else
19
- File.expand_path("../vendor/libhts.#{suffix}", __dir__)
18
+ File.expand_path("../vendor/#{name}", __dir__)
20
19
  end
21
- autoload :FFI, 'hts/ffi'
22
- end
20
+ return lib_path if File.exist?(lib_path)
21
+
22
+ begin
23
+ require "pkg-config"
24
+ lib_dir = PKGConfig.variable("htslib", "libdir")
25
+ lib_path = File.expand_path(name, lib_dir)
26
+ rescue PackageConfig::NotFoundError
27
+ warn "htslib.pc was not found in the pkg-config search path."
28
+ end
29
+ return lib_path if File.exist?(lib_path)
30
+
31
+ warn "htslib shared library '#{name}' not found."
32
+ end
33
+ end
34
+
35
+ self.lib_path = search_htslib
23
36
 
24
- # alias
25
- HTSlib = HTS
37
+ # You can change the path of the shared library with `HTS.lib_path=`
38
+ # before calling the LibHTS module.
39
+ autoload :LibHTS, "hts/libhts"
40
+ end
26
41
 
27
- require_relative 'hts/bam'
28
- require_relative 'hts/fai'
29
- require_relative 'hts/tbx'
30
- require_relative 'hts/vcf'
42
+ require_relative "hts/bam"
43
+ require_relative "hts/faidx"
44
+ require_relative "hts/tabix"
45
+ require_relative "hts/bcf"