Class: HTS::Bam
- Includes:
- Enumerable
- Defined in:
- lib/hts/bam.rb,
lib/hts/bam/auxi.rb,
lib/hts/bam/flag.rb,
lib/hts/bam/cigar.rb,
lib/hts/bam/header.rb,
lib/hts/bam/record.rb,
lib/hts/bam/header_record.rb
Overview
A class for working with SAM, BAM, CRAM files.
Defined Under Namespace
Classes: Aux, Cigar, Flag, Header, HeaderRecord, Record
Instance Attribute Summary collapse
-
#file_name ⇒ Object
readonly
Returns the value of attribute file_name.
-
#header ⇒ Object
Returns the value of attribute header.
-
#index_name ⇒ Object
readonly
Returns the value of attribute index_name.
-
#mode ⇒ Object
readonly
Returns the value of attribute mode.
-
#nthreads ⇒ Object
readonly
Returns the value of attribute nthreads.
Class Method Summary collapse
Instance Method Summary collapse
- #<<(record) ⇒ Object
-
#aux(tag) ⇒ Object
FIXME: experimental.
- #build_index(index_name = nil, min_shift: 0, threads: 2) ⇒ Object
-
#chrom ⇒ Array
Get chrom array.
-
#cigar ⇒ Array
Get cigar array.
- #close ⇒ Object
- #each(copy: false, &block) ⇒ Object
-
#each_aux(tag) ⇒ Object
FIXME: experimental.
-
#each_chrom ⇒ Object
Get chrom iterator.
-
#each_cigar ⇒ Object
Get cigar iterator.
-
#each_flag ⇒ Object
Get flag iterator.
-
#each_insert_size ⇒ Object
(also: #each_isize)
Get insert_size iterator.
-
#each_mapq ⇒ Object
Get mapq iterator.
-
#each_mate_chrom ⇒ Object
Get mate_chrom iterator.
-
#each_mate_pos ⇒ Object
(also: #each_mpos)
Get mate_pos iterator.
-
#each_pos ⇒ Object
Get pos iterator.
-
#each_qname ⇒ Object
Get qname iterator.
-
#each_qual ⇒ Object
Get qual iterator.
-
#each_seq ⇒ Object
Get seq iterator.
-
#flag ⇒ Array
Get flag array.
- #index_loaded? ⇒ Boolean
-
#initialize(file_name, mode = "r", index: nil, fai: nil, threads: nil, build_index: false) ⇒ Bam
constructor
A new instance of Bam.
-
#insert_size ⇒ Array
(also: #isize)
Get insert_size array.
- #load_index(index_name = nil) ⇒ Object
-
#mapq ⇒ Array
Get mapq array.
-
#mate_chrom ⇒ Array
Get mate_chrom array.
-
#mate_pos ⇒ Array
(also: #mpos)
Get mate_pos array.
-
#pos ⇒ Array
Get pos array.
-
#qname ⇒ Array
Get qname array.
-
#qual ⇒ Array
Get qual array.
- #query(region, beg = nil, end_ = nil, copy: false, &block) ⇒ Object
-
#seq ⇒ Array
Get seq array.
- #write(record) ⇒ Object
- #write_header(header) ⇒ Object
Methods inherited from Hts
#closed?, #fai=, #file_format, #file_format_version, #rewind, #seek, #set_threads, #struct, #tell, #to_ptr
Constructor Details
#initialize(file_name, mode = "r", index: nil, fai: nil, threads: nil, build_index: false) ⇒ Bam
Returns a new instance of Bam.
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
# File 'lib/hts/bam.rb', line 32 def initialize(file_name, mode = "r", index: nil, fai: nil, threads: nil, build_index: false) if block_given? = "HTS::Bam.new() does not take block; Please use HTS::Bam.open() instead" raise end # NOTE: Do not check for the existence of local files, since file_names may be remote URIs. @file_name = file_name @index_name = index @mode = mode @nthreads = threads @hts_file = LibHTS.hts_open(@file_name, mode) raise Errno::ENOENT, "Failed to open #{@file_name}" if @hts_file.null? # Auto-detect and set reference for CRAM files if fai.nil? && @file_name.end_with?(".cram") # Try to find reference file in the same directory base_name = File.basename(@file_name, ".cram") dir_name = File.dirname(@file_name) potential_ref = File.join(dir_name, "#{base_name}.fa") # For remote URLs, assume reference exists; for local files, check existence fai = potential_ref if @file_name.start_with?("http") || File.exist?(potential_ref) end if fai r = LibHTS.hts_set_fai_filename(@hts_file, fai) raise "Failed to load fasta index: #{fai}" if r < 0 end set_threads(threads) if threads return if @mode[0] == "w" @header = Bam::Header.new(@hts_file) build_index(index) if build_index @idx = load_index(index) @start_position = tell end |
Instance Attribute Details
#file_name ⇒ Object (readonly)
Returns the value of attribute file_name.
18 19 20 |
# File 'lib/hts/bam.rb', line 18 def file_name @file_name end |
#header ⇒ Object
Returns the value of attribute header.
18 19 20 |
# File 'lib/hts/bam.rb', line 18 def header @header end |
#index_name ⇒ Object (readonly)
Returns the value of attribute index_name.
18 19 20 |
# File 'lib/hts/bam.rb', line 18 def index_name @index_name end |
#mode ⇒ Object (readonly)
Returns the value of attribute mode.
18 19 20 |
# File 'lib/hts/bam.rb', line 18 def mode @mode end |
#nthreads ⇒ Object (readonly)
Returns the value of attribute nthreads.
18 19 20 |
# File 'lib/hts/bam.rb', line 18 def nthreads @nthreads end |
Class Method Details
.open(*args, **kw) ⇒ Object
20 21 22 23 24 25 26 27 28 29 30 |
# File 'lib/hts/bam.rb', line 20 def self.open(*args, **kw) file = new(*args, **kw) # do not yield return file unless block_given? begin yield file ensure file.close end file end |
Instance Method Details
#<<(record) ⇒ Object
134 135 136 |
# File 'lib/hts/bam.rb', line 134 def <<(record) write(record) end |
#aux(tag) ⇒ Object
FIXME: experimental
158 159 160 161 162 163 164 165 |
# File 'lib/hts/bam.rb', line 158 def aux(tag) check_closed position = tell ary = map { |r| r.aux(tag) } seek(position) if position ary end |
#build_index(index_name = nil, min_shift: 0, threads: 2) ⇒ Object
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
# File 'lib/hts/bam.rb', line 75 def build_index(index_name = nil, min_shift: 0, threads: 2) check_closed if index_name warn "Create index for #{@file_name} to #{index_name}" else warn "Create index for #{@file_name}" end case LibHTS.sam_index_build3(@file_name, index_name, min_shift, @nthreads || threads) when 0 # successful when -1 then raise "indexing failed" when -2 then raise "opening #{@file_name} failed" when -3 then raise "format not indexable" when -4 then raise "failed to create and/or save the index" else raise "unknown error" end self # for method chaining end |
#chrom ⇒ Array
Get chrom array
144 |
# File 'lib/hts/bam.rb', line 144 define_getter :chrom |
#cigar ⇒ Array
Get cigar array
147 |
# File 'lib/hts/bam.rb', line 147 define_getter :cigar |
#close ⇒ Object
110 111 112 113 114 |
# File 'lib/hts/bam.rb', line 110 def close LibHTS.hts_idx_destroy(@idx) if @idx && !@idx.null? @idx = nil super end |
#each(copy: false, &block) ⇒ Object
197 198 199 200 201 202 203 |
# File 'lib/hts/bam.rb', line 197 def each(copy: false, &block) if copy each_record_copy(&block) else each_record_reuse(&block) end end |
#each_aux(tag) ⇒ Object
FIXME: experimental
186 187 188 189 190 191 192 193 194 195 |
# File 'lib/hts/bam.rb', line 186 def each_aux(tag) check_closed return to_enum(__method__, tag) unless block_given? each do |record| yield record.aux(tag) end self end |
#each_chrom ⇒ Object
Get chrom iterator
172 |
# File 'lib/hts/bam.rb', line 172 define_iterator :chrom |
#each_cigar ⇒ Object
Get cigar iterator
175 |
# File 'lib/hts/bam.rb', line 175 define_iterator :cigar |
#each_flag ⇒ Object
Get flag iterator
171 |
# File 'lib/hts/bam.rb', line 171 define_iterator :flag |
#each_insert_size ⇒ Object Also known as: each_isize
Get insert_size iterator
178 |
# File 'lib/hts/bam.rb', line 178 define_iterator :insert_size |
#each_mapq ⇒ Object
Get mapq iterator
174 |
# File 'lib/hts/bam.rb', line 174 define_iterator :mapq |
#each_mate_chrom ⇒ Object
Get mate_chrom iterator
176 |
# File 'lib/hts/bam.rb', line 176 define_iterator :mate_chrom |
#each_mate_pos ⇒ Object Also known as: each_mpos
Get mate_pos iterator
177 |
# File 'lib/hts/bam.rb', line 177 define_iterator :mate_pos |
#each_pos ⇒ Object
Get pos iterator
173 |
# File 'lib/hts/bam.rb', line 173 define_iterator :pos |
#each_qname ⇒ Object
Get qname iterator
170 |
# File 'lib/hts/bam.rb', line 170 define_iterator :qname |
#each_qual ⇒ Object
Get qual iterator
180 |
# File 'lib/hts/bam.rb', line 180 define_iterator :qual |
#each_seq ⇒ Object
Get seq iterator
179 |
# File 'lib/hts/bam.rb', line 179 define_iterator :seq |
#flag ⇒ Array
Get flag array
143 |
# File 'lib/hts/bam.rb', line 143 define_getter :flag |
#index_loaded? ⇒ Boolean
104 105 106 107 108 |
# File 'lib/hts/bam.rb', line 104 def index_loaded? check_closed !@idx.null? end |
#insert_size ⇒ Array Also known as: isize
Get insert_size array
150 |
# File 'lib/hts/bam.rb', line 150 define_getter :insert_size |
#load_index(index_name = nil) ⇒ Object
94 95 96 97 98 99 100 101 102 |
# File 'lib/hts/bam.rb', line 94 def load_index(index_name = nil) check_closed if index_name LibHTS.sam_index_load2(@hts_file, @file_name, index_name) else LibHTS.sam_index_load3(@hts_file, @file_name, nil, 2) # should be 3 ? (copy remote file to local?) end end |
#mapq ⇒ Array
Get mapq array
146 |
# File 'lib/hts/bam.rb', line 146 define_getter :mapq |
#mate_chrom ⇒ Array
Get mate_chrom array
148 |
# File 'lib/hts/bam.rb', line 148 define_getter :mate_chrom |
#mate_pos ⇒ Array Also known as: mpos
Get mate_pos array
149 |
# File 'lib/hts/bam.rb', line 149 define_getter :mate_pos |
#pos ⇒ Array
Get pos array
145 |
# File 'lib/hts/bam.rb', line 145 define_getter :pos |
#qname ⇒ Array
Get qname array
142 |
# File 'lib/hts/bam.rb', line 142 define_getter :qname |
#qual ⇒ Array
Get qual array
152 |
# File 'lib/hts/bam.rb', line 152 define_getter :qual |
#query(region, beg = nil, end_ = nil, copy: false, &block) ⇒ Object
205 206 207 208 209 210 211 212 213 214 215 216 217 |
# File 'lib/hts/bam.rb', line 205 def query(region, beg = nil, end_ = nil, copy: false, &block) check_closed raise "Index file is required to call the query method." unless index_loaded? if beg && end_ tid = header.get_tid(region) queryi(tid, beg, end_, copy:, &block) elsif beg.nil? && end_.nil? querys(region, copy:, &block) else raise ArgumentError, "beg and end_ must be specified together" end end |
#seq ⇒ Array
Get seq array
151 |
# File 'lib/hts/bam.rb', line 151 define_getter :seq |
#write(record) ⇒ Object
127 128 129 130 131 132 |
# File 'lib/hts/bam.rb', line 127 def write(record) check_closed r = LibHTS.sam_write1(@hts_file, header, record) raise "Failed to write record" if r < 0 end |
#write_header(header) ⇒ Object
116 117 118 119 120 121 |
# File 'lib/hts/bam.rb', line 116 def write_header(header) check_closed @header = header.dup LibHTS.sam_hdr_write(@hts_file, header) end |