Class: HTS::Bam::Record

Inherits:
Object
  • Object
show all
Defined in:
lib/hts/bam/record.rb

Constant Summary collapse

SEQ_NT16_STR =
"=ACMGRSVTWYHKDBN"

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(header, native_record = nil, qname: "*", flag: 0, tid: nil, chrom: nil, pos: -1,, mapq: 0, cigar: nil, mtid: nil, mate_chrom: nil, mate_pos: -1,, insert_size: 0, seq: UNSET, sequence: UNSET, qual: UNSET, qualities: UNSET, quality_string: UNSET, aux: nil) ⇒ Record

Build a BAM record from Ruby values. Coordinates are zero-based, matching the rest of this API. qualities is an Array of numeric Phred scores; use quality_string for a FASTQ/SAM-style Phred+33 String.



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/hts/bam/record.rb', line 18

def initialize(header, native_record = nil, qname: "*", flag: 0, tid: nil, chrom: nil,
               pos: -1, mapq: 0, cigar: nil, mtid: nil, mate_chrom: nil,
               mate_pos: -1, insert_size: 0, seq: UNSET, sequence: UNSET,
               qual: UNSET, qualities: UNSET, quality_string: UNSET, aux: nil)
  @native = native_record || Native::BamRecordHandle.create
  @header = header
  return if native_record

  sequence = normalize_sequence(seq, sequence)
  qualities = normalize_qualities(qual, qualities, quality_string, sequence.bytesize)
  cigar_values = normalize_cigar(cigar)
  validate_cigar_length!(cigar_values, sequence)

  @native.replace(
    normalize_qname(qname), normalize_flag(flag), resolve_tid(tid, chrom, "chrom"),
    normalize_position(pos, "pos"), normalize_mapq(mapq), cigar_values,
    resolve_tid(mtid, mate_chrom, "mate_chrom"), normalize_position(mate_pos, "mate_pos"),
    Integer(insert_size), sequence, qualities
  )
  assign_aux(aux) if aux
end

Instance Attribute Details

#headerObject (readonly)

Returns the value of attribute header.



13
14
15
# File 'lib/hts/bam/record.rb', line 13

def header
  @header
end

Instance Method Details

#aux(key = nil) ⇒ Object



179
180
181
182
# File 'lib/hts/bam/record.rb', line 179

def aux(key = nil)
  accessor = (@aux_accessor ||= Aux.new(self))
  key ? accessor.get(key) : accessor
end

#base(index) ⇒ Object Also known as: base_at



145
146
147
148
149
# File 'lib/hts/bam/record.rb', line 145

def base(index)
  index += len if index.negative?
  code = @native.base_code(index)
  code ? SEQ_NT16_STR[code] : "."
end

#base_mod(auto_parse: true) ⇒ Object



184
# File 'lib/hts/bam/record.rb', line 184

def base_mod(auto_parse: true) = BaseMod.new(self, auto_parse:)

#base_qual(index) ⇒ Object Also known as: qual_at



162
163
164
165
# File 'lib/hts/bam/record.rb', line 162

def base_qual(index)
  index += len if index.negative?
  @native.quality_at(index) || 0
end

#binObject



71
# File 'lib/hts/bam/record.rb', line 71

def bin = core_get(:bin)

#bin=(value) ⇒ Object



73
74
75
# File 'lib/hts/bam/record.rb', line 73

def bin=(value)
  core_set(:bin, value)
end

#chromObject Also known as: contig



79
80
81
82
83
# File 'lib/hts/bam/record.rb', line 79

def chrom
  return "" if tid == -1

  @header.__send__(:native_handle).target_name(tid)
end

#chrom=(name) ⇒ Object Also known as: contig=



85
86
87
# File 'lib/hts/bam/record.rb', line 85

def chrom=(name)
  self.tid = resolve_tid(nil, name, "chrom")
end

#cigarObject



116
# File 'lib/hts/bam/record.rb', line 116

def cigar = Cigar.new(self)

#cigar=(value) ⇒ Object

Raises:

  • (ArgumentError)


118
119
120
121
122
# File 'lib/hts/bam/record.rb', line 118

def cigar=(value)
  raise ArgumentError, "cigar must be a String or Bam::Cigar" unless value.is_a?(String) || value.is_a?(Cigar)

  @native.cigar = value.to_s
end

#each_base(&block) ⇒ Object



129
130
131
132
133
134
# File 'lib/hts/bam/record.rb', line 129

def each_base(&block)
  return to_enum(__method__) unless block_given?

  seq.each_char(&block)
  self
end

#each_base_code(&block) ⇒ Object



136
137
138
139
140
141
# File 'lib/hts/bam/record.rb', line 136

def each_base_code(&block)
  return to_enum(__method__) unless block_given?

  @native.sequence_codes.each(&block)
  self
end

#each_base_mod_raw(max_mods: 10, &block) ⇒ Object



186
187
188
189
190
191
192
193
194
195
196
# File 'lib/hts/bam/record.rb', line 186

def each_base_mod_raw(max_mods: 10, &block)
  return enum_for(__method__, max_mods:) unless block

  mods = BaseMod.new(self)
  begin
    mods.each_raw(max_mods:, &block)
  ensure
    mods.close
  end
  self
end

#each_cigar_rawObject



202
203
204
205
206
207
# File 'lib/hts/bam/record.rb', line 202

def each_cigar_raw
  return to_enum(__method__) unless block_given?

  @native.cigar_values.each { |encoded| yield encoded & 15, encoded >> 4 }
  self
end

#each_qual(&block) ⇒ Object



155
156
157
158
159
160
# File 'lib/hts/bam/record.rb', line 155

def each_qual(&block)
  return to_enum(__method__) unless block_given?

  @native.qualities.each(&block)
  self
end

#endposObject



77
# File 'lib/hts/bam/record.rb', line 77

def endpos = @native.endpos

#flagObject



168
# File 'lib/hts/bam/record.rb', line 168

def flag = Flag.new(flag_value)

#flag=(value) ⇒ Object



171
172
173
174
175
176
177
# File 'lib/hts/bam/record.rb', line 171

def flag=(value)
  case value
  when Integer then core_set(:flag, value)
  when Flag then core_set(:flag, value.value)
  else raise "Invalid flag type: #{value.class}"
  end
end

#flag_valueObject



169
# File 'lib/hts/bam/record.rb', line 169

def flag_value = core_get(:flag)

#insert_sizeObject Also known as: isize



103
# File 'lib/hts/bam/record.rb', line 103

def insert_size = core_get(:isize)

#insert_size=(value) ⇒ Object Also known as: isize=



105
106
107
# File 'lib/hts/bam/record.rb', line 105

def insert_size=(value)
  core_set(:isize, value)
end

#lenObject



143
# File 'lib/hts/bam/record.rb', line 143

def len = core_get(:length)

#mapqObject



110
# File 'lib/hts/bam/record.rb', line 110

def mapq = core_get(:mapq)

#mapq=(value) ⇒ Object



112
113
114
# File 'lib/hts/bam/record.rb', line 112

def mapq=(value)
  core_set(:mapq, value)
end

#mate_chromObject Also known as: mate_contig



90
91
92
93
94
# File 'lib/hts/bam/record.rb', line 90

def mate_chrom
  return "" if mtid == -1

  @header.__send__(:native_handle).target_name(mtid)
end

#mate_chrom=(name) ⇒ Object Also known as: mate_contig=



96
97
98
# File 'lib/hts/bam/record.rb', line 96

def mate_chrom=(name)
  self.mtid = resolve_tid(nil, name, "mate_chrom")
end

#mate_posObject Also known as: mpos



64
# File 'lib/hts/bam/record.rb', line 64

def mate_pos = core_get(:mpos)

#mate_pos=(value) ⇒ Object Also known as: mpos=



66
67
68
# File 'lib/hts/bam/record.rb', line 66

def mate_pos=(value)
  core_set(:mpos, value)
end

#mate_strandObject



102
# File 'lib/hts/bam/record.rb', line 102

def mate_strand = mate_reverse? ? "-" : "+"

#mtidObject



52
# File 'lib/hts/bam/record.rb', line 52

def mtid = core_get(:mtid)

#mtid=(value) ⇒ Object



54
55
56
# File 'lib/hts/bam/record.rb', line 54

def mtid=(value)
  core_set(:mtid, value)
end

#posObject



58
# File 'lib/hts/bam/record.rb', line 58

def pos = core_get(:pos)

#pos=(value) ⇒ Object



60
61
62
# File 'lib/hts/bam/record.rb', line 60

def pos=(value)
  core_set(:pos, value)
end

#qlenObject



124
# File 'lib/hts/bam/record.rb', line 124

def qlen = @native.qlen

#qnameObject



40
# File 'lib/hts/bam/record.rb', line 40

def qname = @native.qname

#qname=(name) ⇒ Object



42
43
44
# File 'lib/hts/bam/record.rb', line 42

def qname=(name)
  @native.qname = name
end

#qualObject



152
# File 'lib/hts/bam/record.rb', line 152

def qual = @native.qualities

#qual_stringObject



153
# File 'lib/hts/bam/record.rb', line 153

def qual_string = @native.quality_string

#rlenObject



125
# File 'lib/hts/bam/record.rb', line 125

def rlen = @native.rlen

#seqObject Also known as: sequence



126
# File 'lib/hts/bam/record.rb', line 126

def seq = @native.sequence

#strandObject



101
# File 'lib/hts/bam/record.rb', line 101

def strand = reverse? ? "-" : "+"

#tidObject



46
# File 'lib/hts/bam/record.rb', line 46

def tid = core_get(:tid)

#tid=(value) ⇒ Object



48
49
50
# File 'lib/hts/bam/record.rb', line 48

def tid=(value)
  core_set(:tid, value)
end

#to_sObject



209
# File 'lib/hts/bam/record.rb', line 209

def to_s = @native.format(@header.__send__(:native_handle))