htslib 0.0.6 → 0.1.0
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.
- checksums.yaml +4 -4
- data/README.md +69 -28
- data/lib/hts/bam/aux.rb +39 -0
- data/lib/hts/bam/cigar.rb +5 -7
- data/lib/hts/bam/flag.rb +22 -58
- data/lib/hts/bam/header.rb +17 -9
- data/lib/hts/bam/record.rb +102 -56
- data/lib/hts/bam.rb +99 -55
- data/lib/hts/bcf/format.rb +108 -16
- data/lib/hts/bcf/header.rb +24 -3
- data/lib/hts/bcf/info.rb +80 -34
- data/lib/hts/bcf/record.rb +58 -26
- data/lib/hts/bcf.rb +98 -35
- data/lib/hts/faidx.rb +5 -6
- data/lib/hts/ffi_ext/pointer.rb +18 -0
- data/lib/hts/hts.rb +74 -0
- data/lib/hts/libhts/bgzf.rb +10 -5
- data/lib/hts/libhts/constants.rb +25 -7
- data/lib/hts/libhts/cram.rb +292 -0
- data/lib/hts/libhts/hfile.rb +19 -11
- data/lib/hts/libhts/hts.rb +3 -3
- data/lib/hts/libhts/sam_funcs.rb +2 -1
- data/lib/hts/libhts/thread_pool.rb +139 -0
- data/lib/hts/libhts/vcf.rb +14 -0
- data/lib/hts/libhts.rb +9 -3
- data/lib/hts/tbx.rb +46 -0
- data/lib/hts/version.rb +1 -1
- data/lib/htslib.rb +5 -5
- metadata +13 -8
- data/lib/hts/tabix.rb +0 -28
@@ -0,0 +1,292 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module HTS
|
4
|
+
module LibHTS
|
5
|
+
#
|
6
|
+
# attach_function \
|
7
|
+
# :cram_fd_get_header,
|
8
|
+
# [CramFd],
|
9
|
+
# SamHdr.by_ref
|
10
|
+
#
|
11
|
+
# attach_function \
|
12
|
+
# :cram_fd_set_header,
|
13
|
+
# [CramFd, SamHdr.by_ref],
|
14
|
+
# :void
|
15
|
+
#
|
16
|
+
# attach_function \
|
17
|
+
# :cram_fd_get_version,
|
18
|
+
# [CramFd],
|
19
|
+
# :int
|
20
|
+
#
|
21
|
+
# attach_function \
|
22
|
+
# :cram_fd_set_version,
|
23
|
+
# [CramFd, :int],
|
24
|
+
# :void
|
25
|
+
#
|
26
|
+
# attach_function \
|
27
|
+
# :cram_major_vers,
|
28
|
+
# [CramFd],
|
29
|
+
# :int
|
30
|
+
#
|
31
|
+
# attach_function \
|
32
|
+
# :cram_minor_vers,
|
33
|
+
# [CramFd],
|
34
|
+
# :int
|
35
|
+
#
|
36
|
+
# attach_function \
|
37
|
+
# :cram_fd_get_fp,
|
38
|
+
# [CramFd],
|
39
|
+
# HFile.by_ref
|
40
|
+
#
|
41
|
+
# attach_function \
|
42
|
+
# :cram_fd_set_fp,
|
43
|
+
# [CramFd, HFile],
|
44
|
+
# :void
|
45
|
+
#
|
46
|
+
# attach_function \
|
47
|
+
# :cram_container_get_length,
|
48
|
+
# [CramContainer],
|
49
|
+
# :int32
|
50
|
+
#
|
51
|
+
# attach_function \
|
52
|
+
# :cram_container_set_length,
|
53
|
+
# [CramContainer, :int32],
|
54
|
+
# :void
|
55
|
+
#
|
56
|
+
# attach_function \
|
57
|
+
# :cram_container_get_num_blocks,
|
58
|
+
# [CramContainer],
|
59
|
+
# :int32
|
60
|
+
#
|
61
|
+
# attach_function \
|
62
|
+
# :cram_container_set_num_blocks,
|
63
|
+
# [CramContainer, :int32],
|
64
|
+
# :void
|
65
|
+
#
|
66
|
+
# attach_function \
|
67
|
+
# :cram_container_get_landmarks,
|
68
|
+
# [CramContainer, :int32],
|
69
|
+
# :pointer
|
70
|
+
#
|
71
|
+
# attach_function \
|
72
|
+
# :cram_container_set_landmarks,
|
73
|
+
# [CramContainer, :Int32, :pointer],
|
74
|
+
# :void
|
75
|
+
#
|
76
|
+
# attach_function \
|
77
|
+
# :cram_container_is_empty,
|
78
|
+
# [CramFd],
|
79
|
+
# :int
|
80
|
+
#
|
81
|
+
# attach_function \
|
82
|
+
# :cram_block_get_content_id,
|
83
|
+
# [CramBlock],
|
84
|
+
# :int32
|
85
|
+
#
|
86
|
+
# attach_function \
|
87
|
+
# :cram_block_get_comp_size,
|
88
|
+
# [CramBlock],
|
89
|
+
# :int32
|
90
|
+
#
|
91
|
+
# attach_function \
|
92
|
+
# :cram_block_get_uncomp_size,
|
93
|
+
# [CramBlock],
|
94
|
+
# :int32
|
95
|
+
#
|
96
|
+
# attach_function \
|
97
|
+
# :cram_block_get_crc32,
|
98
|
+
# [CramBlock],
|
99
|
+
# :int32
|
100
|
+
#
|
101
|
+
# attach_function \
|
102
|
+
# :cram_block_get_data,
|
103
|
+
# [CramBlock],
|
104
|
+
# :pointer
|
105
|
+
#
|
106
|
+
# attach_function \
|
107
|
+
# :cram_block_get_content_type,
|
108
|
+
# [CramBlock],
|
109
|
+
# CramContentType # ?
|
110
|
+
#
|
111
|
+
# attach_function \
|
112
|
+
# :cram_block_set_content_id,
|
113
|
+
# [CramBlock, :int32],
|
114
|
+
# :void
|
115
|
+
#
|
116
|
+
# attach_function \
|
117
|
+
# :cram_block_set_comp_size,
|
118
|
+
# [CramBlock, :int32],
|
119
|
+
# :void
|
120
|
+
#
|
121
|
+
# attach_function \
|
122
|
+
# :cram_block_set_uncomp_size,
|
123
|
+
# [CramBlock, :int32],
|
124
|
+
# :void
|
125
|
+
#
|
126
|
+
# attach_function \
|
127
|
+
# :cram_block_set_crc32,
|
128
|
+
# [CramBlock, :int32],
|
129
|
+
# :void
|
130
|
+
#
|
131
|
+
# attach_function \
|
132
|
+
# :cram_block_set_data,
|
133
|
+
# [CramBlock, :pointer],
|
134
|
+
# :void
|
135
|
+
#
|
136
|
+
# attach_function \
|
137
|
+
# :cram_block_append,
|
138
|
+
# [CramBlock, :pointer, :int],
|
139
|
+
# :int
|
140
|
+
#
|
141
|
+
# attach_function \
|
142
|
+
# :cram_block_update_size,
|
143
|
+
# [CramBlock],
|
144
|
+
# :void
|
145
|
+
#
|
146
|
+
# attach_function \
|
147
|
+
# :cram_block_get_offset,
|
148
|
+
# [CramBlock],
|
149
|
+
# :size_t
|
150
|
+
#
|
151
|
+
# attach_function \
|
152
|
+
# :cram_block_set_offset,
|
153
|
+
# [CramBlock, :size_t],
|
154
|
+
# :void
|
155
|
+
#
|
156
|
+
# attach_function \
|
157
|
+
# :cram_block_size,
|
158
|
+
# [CramBlock],
|
159
|
+
# :uint32
|
160
|
+
#
|
161
|
+
# attach_function \
|
162
|
+
# :cram_transcode_rg,
|
163
|
+
# [CramFd, CramFd, CramContainer, :int, :pointer, :pointer],
|
164
|
+
# :int
|
165
|
+
#
|
166
|
+
# attach_function \
|
167
|
+
# :cram_copy_slice,
|
168
|
+
# [CramFd, CramFd, :int32],
|
169
|
+
# :int
|
170
|
+
#
|
171
|
+
# attach_function \
|
172
|
+
# :cram_new_block,
|
173
|
+
# [CramContentType, :int],
|
174
|
+
# CramBlock
|
175
|
+
#
|
176
|
+
# attach_function \
|
177
|
+
# :cram_read_block,
|
178
|
+
# [CramFd],
|
179
|
+
# CramBlock
|
180
|
+
#
|
181
|
+
# attach_function \
|
182
|
+
# :cram_write_block,
|
183
|
+
# [CramFd, CramBlock],
|
184
|
+
# :int
|
185
|
+
#
|
186
|
+
# attach_function \
|
187
|
+
# :cram_free_block,
|
188
|
+
# [CramBlock],
|
189
|
+
# :void
|
190
|
+
#
|
191
|
+
# attach_function \
|
192
|
+
# :cram_uncompress_block,
|
193
|
+
# [CramBlock],
|
194
|
+
# :int
|
195
|
+
#
|
196
|
+
# attach_function \
|
197
|
+
# :cram_compress_block,
|
198
|
+
# [CramFd, CramBlock, CramMetrics, :int, :int],
|
199
|
+
# :int
|
200
|
+
#
|
201
|
+
# attach_function \
|
202
|
+
# :cram_compress_block2,
|
203
|
+
# [CramFd, CramSlice, CramBlock, CramMetrics, :int, :int],
|
204
|
+
# :int
|
205
|
+
#
|
206
|
+
# attach_function \
|
207
|
+
# :cram_new_container,
|
208
|
+
# [:int, :int],
|
209
|
+
# CramContainer
|
210
|
+
#
|
211
|
+
# attach_function \
|
212
|
+
# :cram_free_container,
|
213
|
+
# [CramContainer],
|
214
|
+
# :void
|
215
|
+
#
|
216
|
+
# attach_function \
|
217
|
+
# :cram_read_container,
|
218
|
+
# [CramFd],
|
219
|
+
# CramContainer
|
220
|
+
#
|
221
|
+
# attach_function \
|
222
|
+
# :cram_write_container,
|
223
|
+
# [CramFd, CramContainer],
|
224
|
+
# :int
|
225
|
+
#
|
226
|
+
# attach_function \
|
227
|
+
# :cram_store_container,
|
228
|
+
# [CramFd, CramContainer, :string, :pointer],
|
229
|
+
# :int
|
230
|
+
#
|
231
|
+
# attach_function \
|
232
|
+
# :cram_container_size,
|
233
|
+
# [CramContainer],
|
234
|
+
# :int
|
235
|
+
#
|
236
|
+
# attach_function \
|
237
|
+
# :cram_open,
|
238
|
+
# [:string, :string],
|
239
|
+
# CramFd
|
240
|
+
#
|
241
|
+
# attach_function \
|
242
|
+
# :cram_dopen,
|
243
|
+
# [:pointer, :string, :string],
|
244
|
+
# CramFd
|
245
|
+
#
|
246
|
+
# attach_function \
|
247
|
+
# :cram_close,
|
248
|
+
# [CramFd],
|
249
|
+
# :int
|
250
|
+
#
|
251
|
+
|
252
|
+
attach_function \
|
253
|
+
:cram_seek,
|
254
|
+
%i[pointer off_t int], :int # FIXME: pointer should be CramFd
|
255
|
+
|
256
|
+
#
|
257
|
+
# attach_function \
|
258
|
+
# :cram_flush,
|
259
|
+
# [CramFd],
|
260
|
+
# :int
|
261
|
+
#
|
262
|
+
# attach_function \
|
263
|
+
# :cram_eof,
|
264
|
+
# [CramFd],
|
265
|
+
# :int
|
266
|
+
#
|
267
|
+
# attach_function \
|
268
|
+
# :cram_set_option,
|
269
|
+
# [CramFd, HtsFmtOption, ...], # vararg!
|
270
|
+
# :int
|
271
|
+
#
|
272
|
+
# attach_function \
|
273
|
+
# :cram_set_voption,
|
274
|
+
# [CramFd, HtsFmtOption, VaList],
|
275
|
+
# :int
|
276
|
+
#
|
277
|
+
# attach_function \
|
278
|
+
# :cram_set_header,
|
279
|
+
# [CramFd, SamHdr.by_ref],
|
280
|
+
# :int
|
281
|
+
#
|
282
|
+
# attach_function \
|
283
|
+
# :cram_check_eof = :cram_check_EOF,
|
284
|
+
# [CramFd], :int
|
285
|
+
#
|
286
|
+
# attach_function \
|
287
|
+
# :cram_get_refs,
|
288
|
+
# [HtsFile],
|
289
|
+
# RefsT # what is RefsT
|
290
|
+
#
|
291
|
+
end
|
292
|
+
end
|
data/lib/hts/libhts/hfile.rb
CHANGED
@@ -6,13 +6,13 @@ module HTS
|
|
6
6
|
attach_function \
|
7
7
|
:hopen,
|
8
8
|
%i[string string varargs],
|
9
|
-
|
9
|
+
HFILE.by_ref
|
10
10
|
|
11
11
|
# Associate a stream with an existing open file descriptor
|
12
12
|
attach_function \
|
13
13
|
:hdopen,
|
14
14
|
%i[int string],
|
15
|
-
|
15
|
+
HFILE.by_ref
|
16
16
|
|
17
17
|
# Report whether the file name or URL denotes remote storage
|
18
18
|
attach_function \
|
@@ -29,55 +29,63 @@ module HTS
|
|
29
29
|
# Flush (for output streams) and close the stream
|
30
30
|
attach_function \
|
31
31
|
:hclose,
|
32
|
-
[
|
32
|
+
[HFILE],
|
33
33
|
:int
|
34
34
|
|
35
35
|
# Close the stream, without flushing or propagating errors
|
36
36
|
attach_function \
|
37
37
|
:hclose_abruptly,
|
38
|
-
[
|
38
|
+
[HFILE],
|
39
39
|
:void
|
40
40
|
|
41
41
|
# Reposition the read/write stream offset
|
42
42
|
attach_function \
|
43
43
|
:hseek,
|
44
|
-
|
44
|
+
[HFILE, :off_t, :int],
|
45
45
|
:off_t
|
46
46
|
|
47
|
+
# Report the current stream offset
|
48
|
+
def self.htell(fp)
|
49
|
+
# TODO: This is a hack. Is this OK?
|
50
|
+
bg = FFI::Pointer.new(:int, fp.pointer.address + fp.offset_of(:begin)).read_int
|
51
|
+
bf = FFI::Pointer.new(:int, fp.pointer.address + fp.offset_of(:buffer)).read_int
|
52
|
+
fp[:offset] + (bg - bf)
|
53
|
+
end
|
54
|
+
|
47
55
|
# Read from the stream until the delimiter, up to a maximum length
|
48
56
|
attach_function \
|
49
57
|
:hgetdelim,
|
50
|
-
|
58
|
+
[:string, :size_t, :int, HFILE],
|
51
59
|
:ssize_t
|
52
60
|
|
53
61
|
# Read a line from the stream, up to a maximum length
|
54
62
|
attach_function \
|
55
63
|
:hgets,
|
56
|
-
|
64
|
+
[:string, :int, HFILE],
|
57
65
|
:string
|
58
66
|
|
59
67
|
# Peek at characters to be read without removing them from buffers
|
60
68
|
attach_function \
|
61
69
|
:hpeek,
|
62
|
-
|
70
|
+
[HFILE, :pointer, :size_t],
|
63
71
|
:ssize_t
|
64
72
|
|
65
73
|
# For writing streams, flush buffered output to the underlying stream
|
66
74
|
attach_function \
|
67
75
|
:hflush,
|
68
|
-
[
|
76
|
+
[HFILE],
|
69
77
|
:int
|
70
78
|
|
71
79
|
# For hfile_mem: get the internal buffer and it's size from a hfile
|
72
80
|
attach_function \
|
73
81
|
:hfile_mem_get_buffer,
|
74
|
-
|
82
|
+
[HFILE, :pointer],
|
75
83
|
:string
|
76
84
|
|
77
85
|
# For hfile_mem: get the internal buffer and it's size from a hfile.
|
78
86
|
attach_function \
|
79
87
|
:hfile_mem_steal_buffer,
|
80
|
-
|
88
|
+
[HFILE, :pointer],
|
81
89
|
:string
|
82
90
|
end
|
83
91
|
end
|
data/lib/hts/libhts/hts.rb
CHANGED
@@ -61,7 +61,7 @@ module HTS
|
|
61
61
|
# Determine format by peeking at the start of a file
|
62
62
|
attach_function \
|
63
63
|
:hts_detect_format,
|
64
|
-
[
|
64
|
+
[HFILE, HtsFormat],
|
65
65
|
:int
|
66
66
|
|
67
67
|
# Get a human-readable description of the file format
|
@@ -86,7 +86,7 @@ module HTS
|
|
86
86
|
# Open an existing stream as a SAM/BAM/CRAM/VCF/BCF/etc file
|
87
87
|
attach_function \
|
88
88
|
:hts_hopen,
|
89
|
-
|
89
|
+
[HFILE, :string, :string],
|
90
90
|
HtsFile.by_ref
|
91
91
|
|
92
92
|
# For output streams, flush any buffered data
|
@@ -145,7 +145,7 @@ module HTS
|
|
145
145
|
# Create extra threads to aid compress/decompression for this file
|
146
146
|
attach_function \
|
147
147
|
:hts_set_thread_pool,
|
148
|
-
[HtsFile,
|
148
|
+
[HtsFile, HtsTpool],
|
149
149
|
:int
|
150
150
|
|
151
151
|
# Adds a cache of decompressed blocks, potentially speeding up seeks.
|
data/lib/hts/libhts/sam_funcs.rb
CHANGED
@@ -345,7 +345,8 @@ module HTS
|
|
345
345
|
# Get the next read from a SAM/BAM/CRAM iterator
|
346
346
|
def self.sam_itr_next(htsfp, itr, r)
|
347
347
|
# FIXME: check if htsfp is compressed BGZF
|
348
|
-
|
348
|
+
raise("Null iterator") if itr.null?
|
349
|
+
|
349
350
|
# FIXME: check multi
|
350
351
|
hts_itr_next(htsfp[:fp][:bgzf], itr, r, htsfp)
|
351
352
|
end
|
@@ -0,0 +1,139 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module HTS
|
4
|
+
module LibHTS
|
5
|
+
attach_function \
|
6
|
+
:hts_tpool_init,
|
7
|
+
[:int],
|
8
|
+
HtsTpool.by_ref
|
9
|
+
|
10
|
+
attach_function \
|
11
|
+
:hts_tpool_size,
|
12
|
+
[HtsTpool],
|
13
|
+
:int
|
14
|
+
|
15
|
+
# FIXME: struct
|
16
|
+
HtsTpoolProcess = :pointer
|
17
|
+
HtsTpoolResult = :pointer
|
18
|
+
|
19
|
+
attach_function \
|
20
|
+
:hts_tpool_dispatch,
|
21
|
+
[HtsTpool, HtsTpoolProcess, :pointer, :pointer],
|
22
|
+
:int
|
23
|
+
|
24
|
+
attach_function \
|
25
|
+
:hts_tpool_dispatch2,
|
26
|
+
[HtsTpool, HtsTpoolProcess, :pointer, :pointer, :int],
|
27
|
+
:int
|
28
|
+
|
29
|
+
attach_function \
|
30
|
+
:hts_tpool_dispatch3,
|
31
|
+
[HtsTpool, HtsTpoolProcess, :pointer, :pointer, :pointer, :pointer, :int],
|
32
|
+
:int
|
33
|
+
|
34
|
+
attach_function \
|
35
|
+
:hts_tpool_wake_dispatch,
|
36
|
+
[HtsTpoolProcess],
|
37
|
+
:void
|
38
|
+
|
39
|
+
attach_function \
|
40
|
+
:hts_tpool_process_flush,
|
41
|
+
[HtsTpoolProcess],
|
42
|
+
:int
|
43
|
+
|
44
|
+
attach_function \
|
45
|
+
:hts_tpool_process_reset,
|
46
|
+
[HtsTpoolProcess, :int],
|
47
|
+
:int
|
48
|
+
|
49
|
+
attach_function \
|
50
|
+
:hts_tpool_process_qsize,
|
51
|
+
[HtsTpoolProcess],
|
52
|
+
:int
|
53
|
+
|
54
|
+
attach_function \
|
55
|
+
:hts_tpool_destroy,
|
56
|
+
[HtsTpool],
|
57
|
+
:void
|
58
|
+
|
59
|
+
attach_function \
|
60
|
+
:hts_tpool_kill,
|
61
|
+
[HtsTpool],
|
62
|
+
:void
|
63
|
+
|
64
|
+
attach_function \
|
65
|
+
:hts_tpool_next_result,
|
66
|
+
[HtsTpoolProcess],
|
67
|
+
HtsTpoolResult # .by_ref
|
68
|
+
|
69
|
+
attach_function \
|
70
|
+
:hts_tpool_next_result_wait,
|
71
|
+
[HtsTpoolProcess],
|
72
|
+
HtsTpoolResult # .by_ref
|
73
|
+
|
74
|
+
attach_function \
|
75
|
+
:hts_tpool_delete_result,
|
76
|
+
[HtsTpoolResult, :int],
|
77
|
+
:void
|
78
|
+
|
79
|
+
attach_function \
|
80
|
+
:hts_tpool_result_data,
|
81
|
+
[HtsTpoolResult],
|
82
|
+
:pointer
|
83
|
+
|
84
|
+
attach_function \
|
85
|
+
:hts_tpool_process_init,
|
86
|
+
[HtsTpool, :int, :int],
|
87
|
+
HtsTpoolProcess # .by_ref
|
88
|
+
|
89
|
+
attach_function \
|
90
|
+
:hts_tpool_process_destroy,
|
91
|
+
[HtsTpoolProcess],
|
92
|
+
:void
|
93
|
+
|
94
|
+
attach_function \
|
95
|
+
:hts_tpool_process_empty,
|
96
|
+
[HtsTpoolProcess],
|
97
|
+
:int
|
98
|
+
|
99
|
+
attach_function \
|
100
|
+
:hts_tpool_process_len,
|
101
|
+
[HtsTpoolProcess],
|
102
|
+
:int
|
103
|
+
|
104
|
+
attach_function \
|
105
|
+
:hts_tpool_process_sz,
|
106
|
+
[HtsTpoolProcess],
|
107
|
+
:int
|
108
|
+
|
109
|
+
attach_function \
|
110
|
+
:hts_tpool_process_shutdown,
|
111
|
+
[HtsTpoolProcess],
|
112
|
+
:void
|
113
|
+
|
114
|
+
attach_function \
|
115
|
+
:hts_tpool_process_is_shutdown,
|
116
|
+
[HtsTpoolProcess],
|
117
|
+
:int
|
118
|
+
|
119
|
+
attach_function \
|
120
|
+
:hts_tpool_process_attach,
|
121
|
+
[HtsTpool, HtsTpoolProcess],
|
122
|
+
:void
|
123
|
+
|
124
|
+
attach_function \
|
125
|
+
:hts_tpool_process_detach,
|
126
|
+
[HtsTpool, HtsTpoolProcess],
|
127
|
+
:void
|
128
|
+
|
129
|
+
attach_function \
|
130
|
+
:hts_tpool_process_ref_incr,
|
131
|
+
[HtsTpoolProcess],
|
132
|
+
:void
|
133
|
+
|
134
|
+
attach_function \
|
135
|
+
:hts_tpool_process_ref_decr,
|
136
|
+
[HtsTpoolProcess],
|
137
|
+
:void
|
138
|
+
end
|
139
|
+
end
|
data/lib/hts/libhts/vcf.rb
CHANGED
@@ -221,6 +221,20 @@ module HTS
|
|
221
221
|
LibHTS::BcfIdpair.size * int_id # offset
|
222
222
|
)[:val][:info][type] >> 12
|
223
223
|
end
|
224
|
+
|
225
|
+
def bcf_hdr_id2type(hdr, type, int_id)
|
226
|
+
LibHTS::BcfIdpair.new(
|
227
|
+
hdr[:id][LibHTS::BCF_DT_ID].to_ptr +
|
228
|
+
LibHTS::BcfIdpair.size * int_id # offset
|
229
|
+
)[:val][:info][type] >> 4 & 0xf
|
230
|
+
end
|
231
|
+
|
232
|
+
def bcf_hdr_id2coltype(hdr, type, int_id)
|
233
|
+
LibHTS::BcfIdpair.new(
|
234
|
+
hdr[:id][LibHTS::BCF_DT_ID].to_ptr +
|
235
|
+
LibHTS::BcfIdpair.size * int_id # offset
|
236
|
+
)[:val][:info][type] & 0xf
|
237
|
+
end
|
224
238
|
end
|
225
239
|
end
|
226
240
|
end
|
data/lib/hts/libhts.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require_relative "ffi_ext/struct"
|
4
|
+
require_relative "ffi_ext/pointer"
|
4
5
|
|
5
6
|
module HTS
|
6
7
|
module LibHTS
|
@@ -12,6 +13,9 @@ module HTS
|
|
12
13
|
raise LoadError, "#{e}\nCould not find #{HTS.lib_path}"
|
13
14
|
end
|
14
15
|
|
16
|
+
# @!macro attach_function
|
17
|
+
# @!method $1(${2--2})
|
18
|
+
# @return [${-1}] the return value of $0
|
15
19
|
def self.attach_function(*)
|
16
20
|
super
|
17
21
|
rescue FFI::NotFoundError => e
|
@@ -23,11 +27,13 @@ end
|
|
23
27
|
require_relative "libhts/constants"
|
24
28
|
|
25
29
|
# This is alphabetical order.
|
30
|
+
require_relative "libhts/kfunc"
|
26
31
|
require_relative "libhts/bgzf"
|
27
|
-
require_relative "libhts/faidx"
|
28
32
|
require_relative "libhts/hfile"
|
29
33
|
require_relative "libhts/hts"
|
30
34
|
require_relative "libhts/sam"
|
31
|
-
require_relative "libhts/
|
32
|
-
require_relative "libhts/tbx"
|
35
|
+
require_relative "libhts/cram"
|
33
36
|
require_relative "libhts/vcf"
|
37
|
+
require_relative "libhts/tbx"
|
38
|
+
require_relative "libhts/faidx"
|
39
|
+
require_relative "libhts/thread_pool"
|
data/lib/hts/tbx.rb
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "../htslib"
|
4
|
+
|
5
|
+
require_relative "hts"
|
6
|
+
|
7
|
+
module HTS
|
8
|
+
class Tbx < Hts
|
9
|
+
include Enumerable
|
10
|
+
|
11
|
+
attr_reader :file_name
|
12
|
+
|
13
|
+
def self.open(*args, **kw)
|
14
|
+
file = new(*args, **kw) # do not yield
|
15
|
+
return file unless block_given?
|
16
|
+
|
17
|
+
begin
|
18
|
+
yield file
|
19
|
+
ensure
|
20
|
+
file.close
|
21
|
+
end
|
22
|
+
file
|
23
|
+
end
|
24
|
+
|
25
|
+
def initialize(file_name, threads: nil)
|
26
|
+
if block_given?
|
27
|
+
message = "HTS::Tbx.new() dose not take block; Please use HTS::Tbx.open() instead"
|
28
|
+
raise message
|
29
|
+
end
|
30
|
+
|
31
|
+
@file_name = file_name
|
32
|
+
|
33
|
+
# NOTE: Do not check for the existence of local files, since file_names may be remote URIs.
|
34
|
+
|
35
|
+
@mode = "r"
|
36
|
+
@hts_file = LibHTS.hts_open(@file_name, @mode)
|
37
|
+
|
38
|
+
raise Errno::ENOENT, "Failed to open #{@file_name}" if @hts_file.null?
|
39
|
+
|
40
|
+
if threads&.> 0
|
41
|
+
r = LibHTS.hts_set_threads(@hts_file, threads)
|
42
|
+
raise "Failed to set number of threads: #{threads}" if r < 0
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
data/lib/hts/version.rb
CHANGED
data/lib/htslib.rb
CHANGED
@@ -37,9 +37,9 @@ module HTS
|
|
37
37
|
# You can change the path of the shared library with `HTS.lib_path=`
|
38
38
|
# before calling the LibHTS module.
|
39
39
|
autoload :LibHTS, "hts/libhts"
|
40
|
-
end
|
41
40
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
41
|
+
autoload :Bam, "hts/bam"
|
42
|
+
autoload :Bcf, "hts/bcf"
|
43
|
+
autoload :Tbx, "hts/tbx"
|
44
|
+
autoload :Faidx, "hts/faidx"
|
45
|
+
end
|