htslib 0.0.0.pre
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE.txt +21 -0
- data/README.md +45 -0
- data/lib/hts/bam.rb +85 -0
- data/lib/hts/fai.rb +14 -0
- data/lib/hts/ffi.rb +31 -0
- data/lib/hts/ffi/bgzf.rb +192 -0
- data/lib/hts/ffi/faidx.rb +139 -0
- data/lib/hts/ffi/hfile.rb +81 -0
- data/lib/hts/ffi/hts.rb +324 -0
- data/lib/hts/ffi/kfunc.rb +36 -0
- data/lib/hts/ffi/sam.rb +648 -0
- data/lib/hts/ffi/struct.rb +12 -0
- data/lib/hts/ffi/tbx.rb +68 -0
- data/lib/hts/ffi_constants.rb +430 -0
- data/lib/hts/tbx.rb +12 -0
- data/lib/hts/vcf.rb +28 -0
- data/lib/hts/version.rb +5 -0
- data/lib/htslib.rb +18 -0
- metadata +145 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: c4cf91042ebfca63fa53176e80b71d93e0a3deb8938edbeccb306ac66b2f4d9b
|
4
|
+
data.tar.gz: 33ef01ac381c684c1da7ef03e12043164c70e58849e03c97d7fd9f89f19382c7
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a0334a54d5e96243652ded099b6d07352f6a145e01dbb7853a0a00f1e040ac5175f0f95c4262600bb4e76ea282e1d283ff12b1b44e54f8d75f1a206a6f5ca319
|
7
|
+
data.tar.gz: 006b404fa6a9a05a316bd214bf4a3b737d46a8cc6e9b3fd05772e3547b03960e254bc3aad5d04d26ce741709e8926e6d57eca4a396b345cfe5165646d28a6a11
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2020 kojix2
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
# HTSlib
|
2
|
+
|
3
|
+
![CI](https://github.com/kojix2/ruby-htslib/workflows/CI/badge.svg?branch=master)
|
4
|
+
|
5
|
+
:apple: Feel free to fork it out if you can develop it!
|
6
|
+
|
7
|
+
:bowtie: Just a prototype.
|
8
|
+
|
9
|
+
## Installation
|
10
|
+
|
11
|
+
```sh
|
12
|
+
gem install htslib
|
13
|
+
```
|
14
|
+
|
15
|
+
Set environment variable HTSLIBDIR.
|
16
|
+
|
17
|
+
```sh
|
18
|
+
export HTSLIBDIR="/your/path/to/htslib"
|
19
|
+
```
|
20
|
+
|
21
|
+
## Requirements
|
22
|
+
|
23
|
+
* [htslib](https://github.com/samtools/htslib)
|
24
|
+
|
25
|
+
## Usage
|
26
|
+
|
27
|
+
```ruby
|
28
|
+
require 'htslib'
|
29
|
+
|
30
|
+
a = HTS::FFI.hts_open("a.bam", "r")
|
31
|
+
b = HTS::FFI.hts_get_format(a)
|
32
|
+
p b[:category]
|
33
|
+
p b[:format]
|
34
|
+
```
|
35
|
+
|
36
|
+
## Development
|
37
|
+
|
38
|
+
## Contributing
|
39
|
+
|
40
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/kojix2/ruby-htslib.
|
41
|
+
|
42
|
+
|
43
|
+
## License
|
44
|
+
|
45
|
+
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
data/lib/hts/bam.rb
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
# Create a skeleton using hts-python as a reference.
|
2
|
+
# https://github.com/quinlan-lab/hts-python
|
3
|
+
|
4
|
+
class BamHeader
|
5
|
+
def initialize; end
|
6
|
+
|
7
|
+
def seqs; end
|
8
|
+
end
|
9
|
+
|
10
|
+
class Cigar
|
11
|
+
def initialize; end
|
12
|
+
|
13
|
+
def to_s; end
|
14
|
+
|
15
|
+
def inspect; end
|
16
|
+
end
|
17
|
+
|
18
|
+
class Alignment
|
19
|
+
def initialize; end
|
20
|
+
|
21
|
+
def self.rom_sam_str; end
|
22
|
+
|
23
|
+
def tags; end
|
24
|
+
|
25
|
+
def qname; end
|
26
|
+
|
27
|
+
def qname=; end
|
28
|
+
|
29
|
+
def rnext; end
|
30
|
+
|
31
|
+
def pnext; end
|
32
|
+
|
33
|
+
def rname; end
|
34
|
+
|
35
|
+
def strand; end
|
36
|
+
|
37
|
+
def base_qualities; end
|
38
|
+
|
39
|
+
def pos; end
|
40
|
+
|
41
|
+
def pos=; end
|
42
|
+
|
43
|
+
def isize; end
|
44
|
+
|
45
|
+
def mapping_quality; end
|
46
|
+
|
47
|
+
def cigar; end
|
48
|
+
|
49
|
+
def qlen; end
|
50
|
+
|
51
|
+
def rlen; end
|
52
|
+
|
53
|
+
def seqs; end
|
54
|
+
|
55
|
+
def flag_str; end
|
56
|
+
|
57
|
+
def flag; end
|
58
|
+
|
59
|
+
# def eql?
|
60
|
+
# def hash
|
61
|
+
|
62
|
+
def inspect; end
|
63
|
+
|
64
|
+
def to_s; end
|
65
|
+
end
|
66
|
+
|
67
|
+
class Bam
|
68
|
+
def initialize; end
|
69
|
+
|
70
|
+
def self.header_from_fasta; end
|
71
|
+
|
72
|
+
def inspect; end
|
73
|
+
|
74
|
+
def write; end
|
75
|
+
|
76
|
+
def close; end
|
77
|
+
|
78
|
+
def flush; end
|
79
|
+
|
80
|
+
def to_s; end
|
81
|
+
|
82
|
+
def each; end
|
83
|
+
|
84
|
+
# def call
|
85
|
+
end
|
data/lib/hts/fai.rb
ADDED
data/lib/hts/ffi.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module HTS
|
4
|
+
module FFI
|
5
|
+
extend ::FFI::Library
|
6
|
+
|
7
|
+
begin
|
8
|
+
ffi_lib HTS.ffi_lib
|
9
|
+
rescue LoadError => e
|
10
|
+
raise LoadError, "Could not find HTSlib.#{FFI::Platform::LIBSUFFIX}"
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.attach_function(*)
|
14
|
+
super
|
15
|
+
rescue ::FFI::NotFoundError => e
|
16
|
+
warn e.message
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
require_relative 'ffi/struct'
|
22
|
+
require_relative 'ffi_constants'
|
23
|
+
|
24
|
+
# alphabetical order
|
25
|
+
require_relative 'ffi/bgzf'
|
26
|
+
require_relative 'ffi/faidx'
|
27
|
+
require_relative 'ffi/hfile'
|
28
|
+
require_relative 'ffi/hts'
|
29
|
+
require_relative 'ffi/sam'
|
30
|
+
require_relative 'ffi/kfunc'
|
31
|
+
require_relative 'ffi/tbx'
|
data/lib/hts/ffi/bgzf.rb
ADDED
@@ -0,0 +1,192 @@
|
|
1
|
+
# BGZF
|
2
|
+
module HTS
|
3
|
+
module FFI
|
4
|
+
# Open an existing file descriptor for reading or writing.
|
5
|
+
attach_function \
|
6
|
+
:bgzf_dopen,
|
7
|
+
%i[int string],
|
8
|
+
BGZF.by_ref
|
9
|
+
|
10
|
+
# Open the specified file for reading or writing.
|
11
|
+
attach_function \
|
12
|
+
:bgzf_open,
|
13
|
+
%i[string string],
|
14
|
+
BGZF.by_ref
|
15
|
+
|
16
|
+
# Open an existing hFILE stream for reading or writing.
|
17
|
+
attach_function \
|
18
|
+
:bgzf_hopen,
|
19
|
+
%i[HFILE string],
|
20
|
+
BGZF.by_ref
|
21
|
+
|
22
|
+
# Close the BGZF and free all associated resources.
|
23
|
+
attach_function \
|
24
|
+
:bgzf_close,
|
25
|
+
[:HFILE],
|
26
|
+
:int
|
27
|
+
|
28
|
+
# Read up to _length_ bytes from the file storing into _data_.
|
29
|
+
attach_function \
|
30
|
+
:bgzf_read,
|
31
|
+
%i[HFILE pointer size_t],
|
32
|
+
:ssize_t
|
33
|
+
|
34
|
+
# Write _length_ bytes from _data_ to the file. If no I/O errors occur,
|
35
|
+
# the complete _length_ bytes will be written (or queued for writing).
|
36
|
+
attach_function \
|
37
|
+
:bgzf_write,
|
38
|
+
[BGZF, :pointer, :size_t],
|
39
|
+
:ssize_t
|
40
|
+
|
41
|
+
# Write _length_ bytes from _data_ to the file, the index will be used to
|
42
|
+
# decide the amount of uncompressed data to be writen to each bgzip block.
|
43
|
+
attach_function \
|
44
|
+
:bgzf_block_write,
|
45
|
+
[BGZF, :pointer, :size_t],
|
46
|
+
:ssize_t
|
47
|
+
|
48
|
+
# Returns the next byte in the file without consuming it.
|
49
|
+
attach_function \
|
50
|
+
:bgzf_peek,
|
51
|
+
[BGZF],
|
52
|
+
:int
|
53
|
+
|
54
|
+
# Read up to _length_ bytes directly from the underlying stream without
|
55
|
+
# decompressing. Bypasses BGZF blocking, so must be used with care in
|
56
|
+
# specialised circumstances only.
|
57
|
+
attach_function \
|
58
|
+
:bgzf_raw_read,
|
59
|
+
[BGZF, :pointer, :size_t],
|
60
|
+
:ssize_t
|
61
|
+
|
62
|
+
# Write _length_ bytes directly to the underlying stream without
|
63
|
+
# compressing. Bypasses BGZF blocking, so must be used with care
|
64
|
+
# in specialised circumstances only.
|
65
|
+
attach_function \
|
66
|
+
:bgzf_raw_write,
|
67
|
+
[BGZF, :pointer, :size_t],
|
68
|
+
:ssize_t
|
69
|
+
|
70
|
+
# Write the data in the buffer to the file.
|
71
|
+
attach_function \
|
72
|
+
:bgzf_flush,
|
73
|
+
[BGZF],
|
74
|
+
:int
|
75
|
+
|
76
|
+
# Set the file to read from the location specified by _pos_.
|
77
|
+
attach_function \
|
78
|
+
:bgzf_seek,
|
79
|
+
[BGZF, :int64, :int],
|
80
|
+
:int64
|
81
|
+
|
82
|
+
# Check if the BGZF end-of-file (EOF) marker is present
|
83
|
+
attach_function \
|
84
|
+
:bgzf_check_EOF,
|
85
|
+
[BGZF],
|
86
|
+
:int
|
87
|
+
|
88
|
+
# Return the file's compression format
|
89
|
+
attach_function \
|
90
|
+
:bgzf_compression,
|
91
|
+
[BGZF],
|
92
|
+
:int
|
93
|
+
|
94
|
+
# Check if a file is in the BGZF format
|
95
|
+
attach_function \
|
96
|
+
:bgzf_is_bgzf,
|
97
|
+
[:string],
|
98
|
+
:int
|
99
|
+
|
100
|
+
# Set the cache size. Only effective when compiled with -DBGZF_CACHE.
|
101
|
+
attach_function \
|
102
|
+
:bgzf_set_cache_size,
|
103
|
+
[BGZF, :int],
|
104
|
+
:void
|
105
|
+
|
106
|
+
# Flush the file if the remaining buffer size is smaller than _size_
|
107
|
+
attach_function \
|
108
|
+
:bgzf_flush_try,
|
109
|
+
[BGZF, :ssize_t],
|
110
|
+
:int
|
111
|
+
|
112
|
+
# Read one byte from a BGZF file. It is faster than bgzf_read()
|
113
|
+
attach_function \
|
114
|
+
:bgzf_getc,
|
115
|
+
[BGZF],
|
116
|
+
:int
|
117
|
+
|
118
|
+
# Read one line from a BGZF file. It is faster than bgzf_getc()
|
119
|
+
attach_function \
|
120
|
+
:bgzf_getline,
|
121
|
+
[BGZF, :int, Kstring],
|
122
|
+
:int
|
123
|
+
|
124
|
+
# Read the next BGZF block.
|
125
|
+
attach_function \
|
126
|
+
:bgzf_read_block,
|
127
|
+
[BGZF],
|
128
|
+
:int
|
129
|
+
|
130
|
+
# Enable multi-threading (when compiled with -DBGZF_MT) via a shared
|
131
|
+
# thread pool.
|
132
|
+
attach_function \
|
133
|
+
:bgzf_thread_pool,
|
134
|
+
[BGZF, :pointer, :int],
|
135
|
+
:int
|
136
|
+
|
137
|
+
# Enable multi-threading (only effective when the library was compiled
|
138
|
+
# with -DBGZF_MT)
|
139
|
+
attach_function \
|
140
|
+
:bgzf_mt,
|
141
|
+
[BGZF, :int, :int],
|
142
|
+
:int
|
143
|
+
|
144
|
+
# Compress a single BGZF block.
|
145
|
+
attach_function \
|
146
|
+
:bgzf_compress,
|
147
|
+
%i[pointer pointer pointer size_t int],
|
148
|
+
:int
|
149
|
+
|
150
|
+
# Position BGZF at the uncompressed offset
|
151
|
+
attach_function \
|
152
|
+
:bgzf_useek,
|
153
|
+
[BGZF, :off_t, :int],
|
154
|
+
:int
|
155
|
+
|
156
|
+
# Position in uncompressed BGZF
|
157
|
+
attach_function \
|
158
|
+
:bgzf_utell,
|
159
|
+
[BGZF],
|
160
|
+
:off_t
|
161
|
+
|
162
|
+
# Tell BGZF to build index while compressing.
|
163
|
+
attach_function \
|
164
|
+
:bgzf_index_build_init,
|
165
|
+
[BGZF],
|
166
|
+
:int
|
167
|
+
|
168
|
+
# Load BGZF index
|
169
|
+
attach_function \
|
170
|
+
:bgzf_index_load,
|
171
|
+
[BGZF, :string, :string],
|
172
|
+
:int
|
173
|
+
|
174
|
+
# Load BGZF index from an hFILE
|
175
|
+
attach_function \
|
176
|
+
:bgzf_index_load_hfile,
|
177
|
+
[BGZF, :HFILE, :string],
|
178
|
+
:int
|
179
|
+
|
180
|
+
# Save BGZF index
|
181
|
+
attach_function \
|
182
|
+
:bgzf_index_dump,
|
183
|
+
[BGZF, :string, :string],
|
184
|
+
:int
|
185
|
+
|
186
|
+
# Write a BGZF index to an hFILE
|
187
|
+
attach_function \
|
188
|
+
:bgzf_index_dump_hfile,
|
189
|
+
[BGZF, :HFILE, :string],
|
190
|
+
:int
|
191
|
+
end
|
192
|
+
end
|
@@ -0,0 +1,139 @@
|
|
1
|
+
module HTS
|
2
|
+
module FFI
|
3
|
+
# Build index for a FASTA or FASTQ or bgzip-compressed FASTA or FASTQ file.
|
4
|
+
attach_function \
|
5
|
+
:fai_build3,
|
6
|
+
%i[string string string],
|
7
|
+
:int
|
8
|
+
|
9
|
+
# Build index for a FASTA or FASTQ or bgzip-compressed FASTA or FASTQ file.
|
10
|
+
attach_function \
|
11
|
+
:fai_build,
|
12
|
+
[:string],
|
13
|
+
:int
|
14
|
+
|
15
|
+
# Destroy a faidx_t struct
|
16
|
+
attach_function \
|
17
|
+
:fai_destroy,
|
18
|
+
[Faidx],
|
19
|
+
:void
|
20
|
+
|
21
|
+
# Load FASTA indexes.
|
22
|
+
attach_function \
|
23
|
+
:fai_load3,
|
24
|
+
%i[string string string int],
|
25
|
+
Faidx.by_ref
|
26
|
+
|
27
|
+
# Load index from "fn.fai".
|
28
|
+
attach_function \
|
29
|
+
:fai_load,
|
30
|
+
[:string],
|
31
|
+
Faidx.by_ref
|
32
|
+
|
33
|
+
# Load FASTA or FASTQ indexes.
|
34
|
+
attach_function \
|
35
|
+
:fai_load3_format,
|
36
|
+
[:string, :string, :string, :int, FaiFormatOptions],
|
37
|
+
Faidx.by_ref
|
38
|
+
|
39
|
+
# Load index from "fn.fai".
|
40
|
+
attach_function \
|
41
|
+
:fai_load_format,
|
42
|
+
[:string, FaiFormatOptions],
|
43
|
+
Faidx.by_ref
|
44
|
+
|
45
|
+
# Fetch the sequence in a region
|
46
|
+
attach_function \
|
47
|
+
:fai_fetch,
|
48
|
+
[Faidx, :string, :pointer],
|
49
|
+
:string
|
50
|
+
|
51
|
+
# Fetch the sequence in a region
|
52
|
+
attach_function \
|
53
|
+
:fai_fetch64,
|
54
|
+
[Faidx, :string, :pointer],
|
55
|
+
:string
|
56
|
+
|
57
|
+
# Fetch the quality string for a region for FASTQ files
|
58
|
+
attach_function \
|
59
|
+
:fai_fetchqual,
|
60
|
+
[Faidx, :string, :pointer],
|
61
|
+
:string
|
62
|
+
|
63
|
+
attach_function \
|
64
|
+
:fai_fetchqual64,
|
65
|
+
[Faidx, :string, :pointer],
|
66
|
+
:string
|
67
|
+
|
68
|
+
# Fetch the number of sequences
|
69
|
+
attach_function \
|
70
|
+
:faidx_fetch_nseq,
|
71
|
+
[Faidx],
|
72
|
+
:int
|
73
|
+
|
74
|
+
# Fetch the sequence in a region
|
75
|
+
attach_function \
|
76
|
+
:faidx_fetch_seq,
|
77
|
+
[Faidx, :string, :int, :int, :pointer],
|
78
|
+
:string
|
79
|
+
|
80
|
+
# Fetch the sequence in a region
|
81
|
+
attach_function \
|
82
|
+
:faidx_fetch_seq64,
|
83
|
+
[Faidx, :string, :int64, :int64, :pointer],
|
84
|
+
:string
|
85
|
+
|
86
|
+
# Fetch the quality string in a region for FASTQ files
|
87
|
+
attach_function \
|
88
|
+
:faidx_fetch_qual,
|
89
|
+
[Faidx, :string, :int, :int, :pointer],
|
90
|
+
:string
|
91
|
+
|
92
|
+
# Fetch the quality string in a region for FASTQ files
|
93
|
+
attach_function \
|
94
|
+
:faidx_fetch_qual64,
|
95
|
+
[Faidx, :string, :int64, :int64, :pointer],
|
96
|
+
:string
|
97
|
+
|
98
|
+
# Query if sequence is present
|
99
|
+
attach_function \
|
100
|
+
:faidx_has_seq,
|
101
|
+
[Faidx, :string],
|
102
|
+
:int
|
103
|
+
|
104
|
+
# Return number of sequences in fai index
|
105
|
+
attach_function \
|
106
|
+
:faidx_nseq,
|
107
|
+
[Faidx],
|
108
|
+
:int
|
109
|
+
|
110
|
+
# Return name of i-th sequence
|
111
|
+
attach_function \
|
112
|
+
:faidx_iseq,
|
113
|
+
[Faidx, :int],
|
114
|
+
:string
|
115
|
+
|
116
|
+
# Return sequence length, -1 if not present
|
117
|
+
attach_function \
|
118
|
+
:faidx_seq_len,
|
119
|
+
[Faidx, :string],
|
120
|
+
:int
|
121
|
+
|
122
|
+
# Parses a region string.
|
123
|
+
attach_function \
|
124
|
+
:fai_parse_region,
|
125
|
+
[Faidx, :string, :pointer, :pointer, :pointer, :int], :string
|
126
|
+
|
127
|
+
# Sets the cache size of the underlying BGZF compressed file
|
128
|
+
attach_function \
|
129
|
+
:fai_set_cache_size,
|
130
|
+
[Faidx, :int],
|
131
|
+
:void
|
132
|
+
|
133
|
+
# Determines the path to the reference index file
|
134
|
+
attach_function \
|
135
|
+
:fai_path,
|
136
|
+
[:string],
|
137
|
+
:string
|
138
|
+
end
|
139
|
+
end
|