minimap2 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ad687f9f6addf8de0a913d8b3b230539a42f76ce32f77b24576dda10118e3a07
4
- data.tar.gz: 853c9994378f2441ad9dbaff0966a97812a3f7708a5b6516391d150f9c70b558
3
+ metadata.gz: '09e4267638f072ee219b2af3ef1afd3938c3a6d02f5370aa9454b25b871652b7'
4
+ data.tar.gz: ab035c12eb6d6bda353ffab1b5f5923ec8327fea9a4552259b01b02523b7f934
5
5
  SHA512:
6
- metadata.gz: 916210eb2b7ab42f1d81cc9873f6bfa5ca2c9b1084ba63c9dc62f6301c54940115fc36e5b2fc63afbec33a60a18fb632bb8ae3e533009a4b47de619d7a026321
7
- data.tar.gz: 82435ffd47931e66ab1b99c6d85b2d8413d6cf9fb3152f984857b708e988f09b96a4380ae37d76f3f90c5a10a5300c7b891adc0d161dff4414d6aa2d277b1fc7
6
+ metadata.gz: 8f24c1f2d8e07e1be825fbc2a67049d378c1e1d5f3d23312d474e796fa7968b7d85b58b061226dbf4a14e637c27708667a5737da246e4874f03cadf9df4f013e
7
+ data.tar.gz: 5e92b4c08e02416b0385c9a5a6b6c7b46381469ae70447fea80a9269a06e1ac11155a06de3d3a4a97995880f542d8adf9cd6063afa2c133be474644dd6d3245f
data/README.md CHANGED
@@ -1,28 +1,33 @@
1
1
  # Minimap2
2
2
 
3
+ [![Gem Version](https://img.shields.io/gem/v/minimap2?color=brightgreen)](https://rubygems.org/gems/minimap2)
3
4
  [![CI](https://github.com/kojix2/ruby-minimap2/workflows/CI/badge.svg)](https://github.com/kojix2/ruby-minimap2/actions)
5
+ [![The MIT License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE.txt)
6
+ [![Docs Latest](https://img.shields.io/badge/docs-stable-blue.svg)](https://rubydoc.info/gems/minimap2)
4
7
 
5
8
  :dna: [minimap2](https://github.com/lh3/minimap2) - the long-read mapper - for [Ruby](https://github.com/ruby/ruby)
6
9
 
7
10
  ## Installation
8
11
 
9
- You need to install it from the source code. Because you need to build minimap2 and create a shared library.
10
- Open your terminal and type the following commands in order.
12
+ You need to install ruby-minimap2 from the source code. Because you need to build minimap2 and create a shared library. Open your terminal and type the following commands in order.
13
+
14
+ Build
11
15
 
12
16
  ```sh
13
17
  git clone --recurse-submodules https://github.com/kojix2/ruby-minimap2
14
18
  cd ruby-minimap2
15
19
  bundle install
16
20
  bundle exec rake minimap2:build
17
- bundle exec rake install
18
21
  ```
19
22
 
20
- You can run tests to see if the installation was successful.
23
+ Install
21
24
 
22
25
  ```
23
- bundle exec rake test
26
+ bundle exec rake install
24
27
  ```
25
28
 
29
+ Ruby-minimap2 is tested on Ubuntu and macOS.
30
+
26
31
  ## Quick Start
27
32
 
28
33
  ```ruby
@@ -37,40 +42,115 @@ seq = aligner.seq("MT_human", 100, 200)
37
42
  # mapping
38
43
  aligner.align(seq) do |h|
39
44
  pp h.to_h
45
+ # {:ctg => "MT_human",
46
+ # :ctg_len => 16569,
47
+ # :r_st => 100,
48
+ # :r_en => 200,
49
+ # :strand => 1,
50
+ # :trans_strand => 0,
51
+ # :blen => 100,
52
+ # :mlen => 100,
53
+ # :nm => 0,
54
+ # :primary => 1,
55
+ # :q_st => 0,
56
+ # :q_en => 100,
57
+ # :mapq => 60,
58
+ # :cigar => [[100, 0]],
59
+ # :read_num => 1,
60
+ # :cs => "",
61
+ # :md => "",
62
+ # :cigar_str => "100M"}
40
63
  end
41
64
  ```
42
65
 
43
- ## APIs
66
+ ## APIs Overview
44
67
 
45
- See
46
- * [Mappy: Minimap2 Python Binding](https://github.com/lh3/minimap2/tree/master/python)
68
+ See the [RubyDoc.info document](https://rubydoc.info/gems/minimap2) for details.
47
69
 
48
70
  ```markdown
49
71
  * Minimap2 module
72
+ - fastx_read
73
+ - revcomp
74
+
50
75
  * Aligner class
76
+ * attributes
77
+ - index
78
+ - idx_opt
79
+ - map_opt
80
+ * methods
81
+ - new(path, preset: nil)
82
+ - align
83
+
51
84
  * Alignment class
85
+ * attributes
86
+ - ctg
87
+ - ctg_len
88
+ - r_st
89
+ - r_en
90
+ - strand
91
+ - trans_strand
92
+ - blen
93
+ - mlen
94
+ - nm
95
+ - primary
96
+ - q_st
97
+ - q_en
98
+ - mapq
99
+ - cigar
100
+ - read_num
101
+ - cs
102
+ - md
103
+ - cigar_str
104
+ * methods
105
+ - to_h
106
+ - to_s
107
+
108
+ * FFI module
109
+ * IdxOpt class
110
+ * MapOpt class
52
111
  ```
53
112
 
113
+ The ruby-minimap2 API is compliant with mappy, the official Python binding for Minimap2. However, there are a few differences. For example, the `map` method has been renamed to `align` since map is the common name for iterators in Ruby.
114
+
115
+ * [Mappy: Minimap2 Python Binding](https://github.com/lh3/minimap2/tree/master/python)
116
+
117
+ ruby-minimap2 is built on top of [Ruby-FFI](https://github.com/ffi/ffi). Native functions can be called from the FFI module, which also provides a way to access some C structs such as IdxOpt and MapOpt.
118
+
54
119
  ## Development
55
120
 
121
+ Fork your repository and clone.
122
+
56
123
  ```sh
57
124
  git clone --recurse-submodules https://github.com/kojix2/ruby-minimap2
58
125
  # git clone https://github.com/kojix2/ruby-minimap2
59
126
  # cd ruby-minimap2
60
127
  # git submodule update -i
128
+ ```
129
+
130
+ Build.
131
+
132
+ ```sh
61
133
  cd ruby-minimap2
62
- bundle install
134
+ bundle install # Install dependent packages including Ruby-FFI
63
135
  bundle exec rake minimap2:build
136
+ ```
137
+
138
+ Run tests.
139
+
140
+ ```
64
141
  bundle exec rake test
65
142
  ```
66
143
 
67
144
  ## Contributing
68
145
 
69
- ruby-minimap2 is a library under development and there are many points to be improved.
70
- If you improve the source code, please feel free to send us your pull request.
71
- Typo corrections are also welcome.
146
+ ruby-minimap2 is a library under development and there are many points to be improved. Please feel free to send us your pull request.
72
147
 
73
- Bug reports and pull requests are welcome on GitHub at https://github.com/kojix2/ruby-minimap2.
148
+ * [Report bugs](https://github.com/kojix2/ruby-minimap2/issues)
149
+ * Fix bugs and [submit pull requests](https://github.com/kojix2/ruby-minimap2/pulls)
150
+ * Write, clarify, or fix documentation
151
+ * Suggest or add new features
152
+ * Create tools based on ruby-minimap2
153
+ * Update minimap2 in github submodule
74
154
 
75
155
  ## License
76
156
 
data/lib/minimap2.rb CHANGED
@@ -1,15 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # dependencies
4
- require "ffi"
4
+ require 'ffi'
5
5
 
6
6
  # bit fields
7
- require_relative "minimap2/ffi_helper"
7
+ require_relative 'minimap2/ffi_helper'
8
8
 
9
9
  # modules
10
- require_relative "minimap2/aligner"
11
- require_relative "minimap2/alignment"
12
- require_relative "minimap2/version"
10
+ require_relative 'minimap2/aligner'
11
+ require_relative 'minimap2/alignment'
12
+ require_relative 'minimap2/version'
13
13
 
14
14
  # Minimap2 mapper for long read sequences
15
15
  # https://github.com/lh3/minimap2
@@ -22,15 +22,15 @@ module Minimap2
22
22
  attr_accessor :ffi_lib
23
23
  end
24
24
 
25
- lib_name = ::FFI.map_library_name("minimap2")
26
- self.ffi_lib = if ENV["MINIMAPDIR"]
27
- File.expand_path(lib_name, ENV["MINIMAPDIR"])
25
+ lib_name = ::FFI.map_library_name('minimap2')
26
+ self.ffi_lib = if ENV['MINIMAPDIR']
27
+ File.expand_path(lib_name, ENV['MINIMAPDIR'])
28
28
  else
29
29
  File.expand_path("../vendor/#{lib_name}", __dir__)
30
30
  end
31
31
 
32
32
  # friendlier error message
33
- autoload :FFI, "minimap2/ffi"
33
+ autoload :FFI, 'minimap2/ffi'
34
34
 
35
35
  # methods from mappy
36
36
  class << self
@@ -2,10 +2,34 @@
2
2
 
3
3
  module Minimap2
4
4
  class Aligner
5
- attr_reader :index_options, :map_options, :index
5
+ attr_reader :idx_opt, :map_opt, :index
6
+
7
+ # Create a new aligner
8
+ #
9
+ # @param fn_idx_in [String] index or sequence file name.
10
+ # @param seq [String] a single sequence to index.
11
+ # @param preset [String] minimap2 preset.
12
+ # @param k [Integer] k-mer length, no larger than 28.
13
+ # @param w [Integer] minimizer window size, no larger than 255.
14
+ # @param min_cnt [Integer] mininum number of minimizers on a chain.
15
+ # @param min_chain_score [Integer] minimum chaing score.
16
+ # @param min_dp_score
17
+ # @param bw [Integer] chaining and alignment band width.
18
+ # @param best_n [Integer] max number of alignments to return.
19
+ # @param n_threads [Integer] number of indexing threads.
20
+ # @param fn_idx_out [String] name of file to which the index is written.
21
+ # This parameter has no effect if seq is set.
22
+ # @param max_frag_len [Integer]
23
+ # @param extra_flags [Integer] additional flags defined in minimap.h.
24
+ # @param scoring [Array] scoring system.
25
+ # It is a tuple/list consisting of 4, 6 or 7 positive integers.
26
+ # The first 4 elements specify match scoring, mismatch penalty, gap open and gap extension penalty.
27
+ # The 5th and 6th elements, if present, set long-gap open and long-gap extension penalty.
28
+ # The 7th sets a mismatch penalty involving ambiguous bases.
6
29
 
7
30
  def initialize(
8
- fn_idx_in, # FIXME
31
+ fn_idx_in = nil,
32
+ seq: nil,
9
33
  preset: nil,
10
34
  k: nil,
11
35
  w: nil,
@@ -18,76 +42,81 @@ module Minimap2
18
42
  fn_idx_out: nil,
19
43
  max_frag_len: nil,
20
44
  extra_flags: nil,
21
- seq: nil,
22
45
  scoring: nil
23
46
  )
24
47
 
25
- @index_options = FFI::IdxOpt.new
26
- @map_options = FFI::MapOpt.new
48
+ @idx_opt = FFI::IdxOpt.new
49
+ @map_opt = FFI::MapOpt.new
27
50
 
28
- if preset
29
- FFI.mm_set_opt(preset, index_options, map_options)
30
- else
31
- # set the default options
32
- FFI.mm_set_opt(0, index_options, map_options)
33
- end
51
+ r = FFI.mm_set_opt(preset, idx_opt, map_opt)
52
+ raise ArgumentError, "Unknown preset name: #{preset}" if r == -1
34
53
 
35
54
  # always perform alignment
36
- map_options[:flag] |= 4
37
- index_options[:batch_size] = 0x7fffffffffffffff
55
+ map_opt[:flag] |= 4
56
+ idx_opt[:batch_size] = 0x7fffffffffffffff
38
57
 
39
58
  # override preset options
40
- index_options[:k] = k if k
41
- index_options[:w] = w if w
42
- map_options[:min_cnt] = min_cnt if min_cnt
43
- map_options[:min_chain_score] = min_chain_score if min_chain_score
44
- map_options[:min_dp_max] = min_dp_score if min_dp_score
45
- map_options[:bw] = bw if bw
46
- map_options[:best_n] = best_n if best_n
47
- map_options[:max_frag_len] = max_frag_len if max_frag_len
48
- map_options[:flag] |= extra_flags if extra_flags
59
+ idx_opt[:k] = k if k
60
+ idx_opt[:w] = w if w
61
+ map_opt[:min_cnt] = min_cnt if min_cnt
62
+ map_opt[:min_chain_score] = min_chain_score if min_chain_score
63
+ map_opt[:min_dp_max] = min_dp_score if min_dp_score
64
+ map_opt[:bw] = bw if bw
65
+ map_opt[:best_n] = best_n if best_n
66
+ map_opt[:max_frag_len] = max_frag_len if max_frag_len
67
+ map_opt[:flag] |= extra_flags if extra_flags
49
68
  if scoring && scoring.size >= 4
50
- map_options[:a] = scoring[0]
51
- map_options[:b] = scoring[1]
52
- map_options[:q] = scoring[2]
53
- map_options[:e] = scoring[3]
54
- map_options[:q2] = map_options.q
55
- map_options[:e2] = map_options.e
69
+ map_opt[:a] = scoring[0]
70
+ map_opt[:b] = scoring[1]
71
+ map_opt[:q] = scoring[2]
72
+ map_opt[:e] = scoring[3]
73
+ map_opt[:q2] = map_opt.q
74
+ map_opt[:e2] = map_opt.e
56
75
  if scoring.size >= 6
57
- map_options[:q2] = scoring[4]
58
- map_options[:e2] = scoring[5]
59
- map_options[:sc_ambi] = scoring[6] if scoring.size >= 7
76
+ map_opt[:q2] = scoring[4]
77
+ map_opt[:e2] = scoring[5]
78
+ map_opt[:sc_ambi] = scoring[6] if scoring.size >= 7
60
79
  end
61
80
  end
62
81
 
63
- if seq
64
- @index = FFI.mappy_idx_seq(
65
- index_options.w, index_options.k, index_options & 1,
66
- index_options.bucket_bits, seq, seq.size
67
- )
68
- FFI.mm_mapopt_update(map_options, index)
69
- map_options.mid_occ = 1000 # don't filter high-occ seeds
70
- else
71
- reader = FFI.mm_idx_reader_open(fn_idx_in, index_options, fn_idx_out)
82
+ if fn_idx_in
83
+ warn "Since fn_idx_in is specified, the seq argument will be ignored." if seq
84
+ reader = FFI.mm_idx_reader_open(fn_idx_in, idx_opt, fn_idx_out)
72
85
 
73
86
  # The Ruby version raises an error here
74
87
  raise "Cannot open : #{fn_idx_in}" if reader.null?
75
88
 
76
89
  @index = FFI.mm_idx_reader_read(reader, n_threads)
77
90
  FFI.mm_idx_reader_close(reader)
78
- FFI.mm_mapopt_update(map_options, index)
91
+ FFI.mm_mapopt_update(map_opt, index)
79
92
  FFI.mm_idx_index_name(index)
93
+ elsif seq
94
+ @index = FFI.mappy_idx_seq(
95
+ idx_opt[:w], idx_opt[:k], idx_opt[:flag] & 1,
96
+ idx_opt[:bucket_bits], seq, seq.size
97
+ )
98
+ FFI.mm_mapopt_update(map_opt, index)
99
+ map_opt[:mid_occ] = 1000 # don't filter high-occ seeds
80
100
  end
81
101
  end
82
102
 
83
- # FIXME: naming
84
- def destroy
103
+ # Explicitly releases the memory of the index object.
104
+ def free_index
85
105
  FFI.mm_idx_destroy(index) unless index.null?
86
106
  end
87
107
 
88
- # NOTE: Name change: map -> align
89
- # In the Ruby language, the name map means iterator.
90
- # The original name is map, but here I use the method name align.
108
+ # @param seq [String]
109
+ # @param seq2 [String]
110
+ # @param buf [FFI::TBuf]
111
+ # @param cs [true, false]
112
+ # @param md [true, false]
113
+ # @param max_frag_len [Integer]
114
+ # @param extra_flags [Integer]
115
+ # @note Name change: map -> align
116
+ # In the Ruby language, the name map means iterator.
117
+ # The original name is map, but here I use the method name align.
118
+ # @note The use of Enumerator is being considered. The method names may change again.
119
+
91
120
  def align(
92
121
  seq, seq2 = nil,
93
122
  buf: nil,
@@ -99,14 +128,14 @@ module Minimap2
99
128
 
100
129
  return if index.null?
101
130
 
102
- map_options.max_frag_len = max_frag_len if max_frag_len
103
- map_options.flag |= extra_flags if extra_flags
131
+ map_opt.max_frag_len = max_frag_len if max_frag_len
132
+ map_opt.flag |= extra_flags if extra_flags
104
133
 
105
134
  buf ||= FFI::TBuf.new
106
135
  km = FFI.mm_tbuf_get_km(buf)
107
136
  n_regs_ptr = ::FFI::MemoryPointer.new :int
108
137
 
109
- ptr = FFI.mm_map_aux(index, seq, seq2, n_regs_ptr, buf, map_options)
138
+ ptr = FFI.mm_map_aux(index, seq, seq2, n_regs_ptr, buf, map_opt)
110
139
  n_regs = n_regs_ptr.read_int
111
140
 
112
141
  regs = Array.new(n_regs) { |i| FFI::Reg1.new(ptr + i * FFI::Reg1.size) }
@@ -124,13 +153,13 @@ module Minimap2
124
153
  # convert the 32-bit CIGAR encoding to Ruby array
125
154
  cigar = c.map { |x| [x >> 4, x & 0xf] }
126
155
 
127
- _cs = ""
156
+ _cs = ''
128
157
  if cs
129
158
  l_cs_str = FFI.mm_gen_cs(km, cs_str, m_cs_str, @index, regs[i], seq, 1)
130
159
  _cs = cs_str.read_pointer.read_string(l_cs_str)
131
160
  end
132
161
 
133
- _md = ""
162
+ _md = ''
134
163
  if md
135
164
  l_cs_str = FFI.mm_gen_md(km, cs_str, m_cs_str, @index, regs[i], seq)
136
165
  _md = cs_str.read_pointer.read_string(l_cs_str)
@@ -149,6 +178,11 @@ module Minimap2
149
178
  end
150
179
  end
151
180
 
181
+ # retrieve a subsequence from the index.
182
+ # @params name
183
+ # @params start
184
+ # @params stop
185
+
152
186
  def seq(name, start = 0, stop = 0x7fffffff)
153
187
  lp = ::FFI::MemoryPointer.new(:int)
154
188
  s = FFI.mappy_fetch_seq(index, name, start, stop, lp)
@@ -158,10 +192,12 @@ module Minimap2
158
192
  s.read_string(l)
159
193
  end
160
194
 
195
+ # k-mer length, no larger than 28
161
196
  def k
162
197
  index[:k]
163
198
  end
164
199
 
200
+ # minimizer window size, no larger than 255
165
201
  def w
166
202
  index[:w]
167
203
  end
@@ -1,13 +1,57 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Minimap2
4
+ # Alignment result
5
+ #
6
+ # @!attribute ctg
7
+ # @return [String] name of the reference sequence the query is mapped to.
8
+ # @!attribute ctg_len
9
+ # @return [Integer] total length of the reference sequence.
10
+ # @!attribute r_st
11
+ # @return [Integer] start positions on the reference.
12
+ # @!attribute r_en
13
+ # @return [Integer] end positions on the reference.
14
+ # @!attribute strand
15
+ # @return [Integer] +1 if on the forward strand; -1 if on the reverse strand.
16
+ # @!attribute trans_strand
17
+ # @return [Integer] transcript strand.
18
+ # +1 if on the forward strand; -1 if on the reverse strand; 0 if unknown.
19
+ # @!attribute blen
20
+ # @return [Integer] length of the alignment, including both alignment matches and gaps
21
+ # but excluding ambiguous bases.
22
+ # @!attribute mlen
23
+ # @return [Integer] length of the matching bases in the alignment,
24
+ # excluding ambiguous base matches.
25
+ # @!attribute nm
26
+ # @return [Integer] number of mismatches, gaps and ambiguous poistions in the alignment.
27
+ # @!attribute primary
28
+ # @return [Integer] if the alignment is primary (typically the best and the first to generate)
29
+ # @!attribute q_st
30
+ # @return [Integer] start positions on the query.
31
+ # @!attribute q_en
32
+ # @return [Integer] end positions on the query.
33
+ # @!attribute mapq
34
+ # @return [Integer] mapping quality.
35
+ # @!attribute cigar
36
+ # @return [Array] CIGAR returned as an array of shape (n_cigar,2).
37
+ # The two numbers give the length and the operator of each CIGAR operation.
38
+ # @!attribute read_num
39
+ # @return [Integer] read number that the alignment corresponds to;
40
+ # 1 for the first read and 2 for the second read.
41
+ # @!attribute cs
42
+ # @return [String] the cs tag.
43
+ # @!attribute md
44
+ # @return [String] the MD tag as in the SAM format.
45
+ # It is an empty string unless the md argument is applied when calling Aligner#align.
46
+ # @!attribute cigar_str
47
+ # @return [String] CIGAR string.
48
+
4
49
  class Alignment
5
50
  def self.keys
6
51
  %i[ctg ctg_len r_st r_en strand trans_strand blen mlen nm primary
7
52
  q_st q_en mapq cigar read_num cs md cigar_str]
8
53
  end
9
54
 
10
- # Read only
11
55
  attr_reader(*keys)
12
56
 
13
57
  def initialize(h, cigar, cs = nil, md = nil)
@@ -29,7 +73,7 @@ module Minimap2
29
73
  @cs = cs
30
74
  @md = md
31
75
 
32
- @cigar_str = cigar.map { |x| x[0].to_s + "MIDNSH"[x[1]] }.join
76
+ @cigar_str = cigar.map { |x| x[0].to_s + 'MIDNSH'[x[1]] }.join
33
77
  end
34
78
 
35
79
  def primary?
@@ -42,19 +86,19 @@ module Minimap2
42
86
 
43
87
  def to_s
44
88
  strand = if @strand.positive?
45
- "+"
89
+ '+'
46
90
  elsif @strand.negative?
47
- "-"
91
+ '-'
48
92
  else
49
- "?"
93
+ '?'
50
94
  end
51
- tp = @primary != 0 ? "tp:A:P" : "tp:A:S"
95
+ tp = @primary != 0 ? 'tp:A:P' : 'tp:A:S'
52
96
  ts = if @trans_strand.positive?
53
- "ts:A:+"
97
+ 'ts:A:+'
54
98
  elsif @trans_strand.negative?
55
- "ts:A:-"
99
+ 'ts:A:-'
56
100
  else
57
- "ts:A:."
101
+ 'ts:A:.'
58
102
  end
59
103
  a = [@q_st, @q_en, strand, @ctg, @ctg_len, @r_st, @r_en,
60
104
  @mlen, @blen, @mapq, tp, ts, "cg:Z:#{@cigar_str}"]
data/lib/minimap2/ffi.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # bit fields
4
- require_relative "ffi_helper"
4
+ require_relative 'ffi_helper'
5
5
 
6
6
  module Minimap2
7
7
  # Native APIs
@@ -22,6 +22,6 @@ module Minimap2
22
22
  end
23
23
  end
24
24
 
25
- require_relative "ffi/constants"
26
- require_relative "ffi/functions"
27
- require_relative "ffi/mappy"
25
+ require_relative 'ffi/constants'
26
+ require_relative 'ffi/functions'
27
+ require_relative 'ffi/mappy'
@@ -6,15 +6,15 @@ module Minimap2
6
6
  :mm_set_opt_raw, :mm_set_opt,
7
7
  [:pointer, IdxOpt.by_ref, MapOpt.by_ref],
8
8
  :int
9
-
9
+
10
10
  private_class_method :mm_set_opt_raw
11
-
11
+
12
12
  def self.mm_set_opt(preset, io, mo)
13
- if preset == 0
14
- ptr = ::FFI::Pointer.new(:int, 0)
15
- else
16
- ptr = ::FFI::MemoryPointer.from_string(preset.to_s)
17
- end
13
+ ptr = if preset
14
+ ::FFI::MemoryPointer.from_string(preset.to_s)
15
+ else
16
+ ::FFI::Pointer.new(:int, 0)
17
+ end
18
18
  mm_set_opt_raw(ptr, io, mo)
19
19
  end
20
20
 
@@ -38,7 +38,7 @@ module Minimap2
38
38
  :seq, KString,
39
39
  :qual, KString,
40
40
  :last_char, :int,
41
- :f, :pointer # FIXME: KStream
41
+ :f, :pointer # KStream
42
42
  end
43
43
 
44
44
  attach_function \
@@ -88,7 +88,7 @@ module Minimap2
88
88
 
89
89
  attach_function \
90
90
  :mappy_idx_seq,
91
- %i[int int int int pointer int],
91
+ %i[int int int int string int],
92
92
  Idx.by_ref
93
93
 
94
94
  attach_function \
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "ffi"
3
+ require 'ffi'
4
4
 
5
5
  module FFI
6
6
  class BitStruct < Struct
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Minimap2
4
- VERSION = "0.0.1"
4
+ VERSION = '0.0.2'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: minimap2
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - kojix2
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-03-04 00:00:00.000000000 Z
11
+ date: 2021-03-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ffi
@@ -112,7 +112,6 @@ files:
112
112
  - lib/minimap2/ffi/mappy.rb
113
113
  - lib/minimap2/ffi_helper.rb
114
114
  - lib/minimap2/version.rb
115
- - vendor/libminimap2.so
116
115
  homepage: https://github.com/kojix2/ruby-minimap2
117
116
  licenses:
118
117
  - MIT
Binary file