Class: Bio::GFF::GFF2::Record
- Includes:
- Escape
- Defined in:
- lib/bio/db/gff.rb
Overview
Stores GFF2 record.
Direct Known Subclasses
Defined Under Namespace
Classes: Value
Constant Summary
Constants included from Escape
Escape::BACKSLASH, Escape::CHAR2BACKSLASH, Escape::CHAR2BACKSLASH_EXTENDED, Escape::IDENTIFIER_GFF2, Escape::NUMERIC_GFF2, Escape::PROHIBITED_GFF2_COLUMNS, Escape::PROHIBITED_GFF2_TAGS, Escape::UNSAFE_GFF2
Instance Attribute Summary collapse
-
#comment ⇒ Object
Comment for the GFF record.
Attributes inherited from Record
#attributes, #end, #feature, #frame, #score, #seqname, #source, #start, #strand
Class Method Summary collapse
-
.parse(str) ⇒ Object
Parses a GFF2-formatted line and returns a new Bio::GFF::GFF2::Record object.
Instance Method Summary collapse
-
#==(other) ⇒ Object
Returns true if self == other.
-
#add_attribute(tag, value) ⇒ Object
Adds a new tag-value pair.
-
#attributes_to_hash ⇒ Object
Returns hash representation of attributes.
-
#comment_only? ⇒ Boolean
Returns true if the entry is empty except for comment.
-
#comments ⇒ Object
“comments” is deprecated.
-
#comments=(str) ⇒ Object
“comments=” is deprecated.
-
#delete_attribute(tag, value) ⇒ Object
Removes a specific tag-value pair.
-
#delete_attributes(tag) ⇒ Object
Removes all attributes with the specified tag.
-
#get_attribute(tag) ⇒ Object
(also: #attribute)
Gets the attribute value for the given tag.
-
#get_attributes(tag) ⇒ Object
Gets the attribute values for the given tag.
-
#initialize(*arg) ⇒ Record
constructor
Creates a Bio::GFF::GFF2::Record object.
-
#parse(string) ⇒ Object
Parses a GFF2-formatted line and stores data from the string.
-
#replace_attributes(tag, *values) ⇒ Object
Replaces values for the given tags with new values.
-
#set_attribute(tag, value) ⇒ Object
Sets value for the given tag.
-
#sort_attributes_by_tag!(tags = nil) ⇒ Object
Sorts attributes order by given tag name’s order.
-
#to_s ⇒ Object
Return the record as a GFF2 compatible string.
Constructor Details
#initialize(*arg) ⇒ Record
Creates a Bio::GFF::GFF2::Record object. Is typically not called directly, but is called automatically when creating a Bio::GFF::GFF2 object.
Arguments:
-
str: a tab-delimited line in GFF2 format
Arguments:
-
seqname: seqname (String or nil)
-
source: source (String or nil)
-
feature: feature type (String)
-
start_position: start (Integer)
-
end_position: end (Integer)
-
score: score (Float or nil)
-
strand: strand (String or nil)
-
frame: frame (Integer or nil)
-
attributes: attributes (Array or nil)
382 383 384 385 386 387 388 389 390 391 392 393 394 395 |
# File 'lib/bio/db/gff.rb', line 382 def initialize(*arg) if arg.size == 1 then parse(arg[0]) else @seqname, @source, @feature, start, endp, @score, @strand, frame, @attributes = arg @start = start ? start.to_i : nil @end = endp ? endp.to_i : nil @score = score ? score.to_f : nil @frame = frame ? frame.to_i : nil end @attributes ||= [] end |
Instance Attribute Details
#comment ⇒ Object
Comment for the GFF record
398 399 400 |
# File 'lib/bio/db/gff.rb', line 398 def comment @comment end |
Class Method Details
.parse(str) ⇒ Object
Parses a GFF2-formatted line and returns a new Bio::GFF::GFF2::Record object.
361 362 363 |
# File 'lib/bio/db/gff.rb', line 361 def self.parse(str) self.new.parse(str) end |
Instance Method Details
#==(other) ⇒ Object
Returns true if self == other. Otherwise, returns false.
479 480 481 482 483 484 485 486 487 488 489 490 491 |
# File 'lib/bio/db/gff.rb', line 479 def ==(other) super || ((self.class == other.class and self.seqname == other.seqname and self.source == other.source and self.feature == other.feature and self.start == other.start and self.end == other.end and self.score == other.score and self.strand == other.strand and self.frame == other.frame and self.attributes == other.attributes) ? true : false) end |
#add_attribute(tag, value) ⇒ Object
Adds a new tag-value pair.
Arguments:
-
(required) tag: String
-
(required) value: String or Bio::GFF::GFF2::Record::Value object.
- Returns
-
value
583 584 585 |
# File 'lib/bio/db/gff.rb', line 583 def add_attribute(tag, value) @attributes.push([ String.new(tag), value ]) end |
#attributes_to_hash ⇒ Object
Returns hash representation of attributes.
Note: If two or more tag-value pairs with same tag names exist, only the first tag-value pair is used for each tag.
- Returns
-
Hash object
661 662 663 664 665 666 667 668 |
# File 'lib/bio/db/gff.rb', line 661 def attributes_to_hash h = {} @attributes.each do |x| key, val = x h[key] = val unless h[key] end h end |
#comment_only? ⇒ Boolean
Returns true if the entry is empty except for comment. Otherwise, returns false.
439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 |
# File 'lib/bio/db/gff.rb', line 439 def comment_only? if !@seqname and !@source and !@feature and !@start and !@end and !@score and !@strand and !@frame and @attributes.empty? then true else false end end |
#comments ⇒ Object
“comments” is deprecated. Instead, use “comment”.
401 402 403 404 |
# File 'lib/bio/db/gff.rb', line 401 def comments warn "#{self.class.to_s}#comments is deprecated. Instead, use \"comment\"." self.comment end |
#comments=(str) ⇒ Object
“comments=” is deprecated. Instead, use “comment=”.
407 408 409 410 |
# File 'lib/bio/db/gff.rb', line 407 def comments=(str) warn "#{self.class.to_s}#comments= is deprecated. Instead, use \"comment=\"." self.comment = str end |
#delete_attribute(tag, value) ⇒ Object
Removes a specific tag-value pair.
Note that if two or more tag-value pairs found, only the first tag-value pair is removed.
Arguments:
-
(required) tag: String
-
(required) value: String or Bio::GFF::GFF2::Record::Value object.
- Returns
-
if removed, value. Otherwise, nil.
597 598 599 600 601 602 603 604 |
# File 'lib/bio/db/gff.rb', line 597 def delete_attribute(tag, value) removed = nil if i = @attributes.index([ tag, value ]) then ary = @attributes.delete_at(i) removed = ary[1] end removed end |
#delete_attributes(tag) ⇒ Object
Removes all attributes with the specified tag.
Arguments:
-
(required) tag: String
- Returns
-
if removed, self. Otherwise, nil.
612 613 614 615 616 |
# File 'lib/bio/db/gff.rb', line 612 def delete_attributes(tag) @attributes.reject! do |x| x[0] == tag end ? self : nil end |
#get_attribute(tag) ⇒ Object Also known as: attribute
Gets the attribute value for the given tag.
Note that if two or more tag-value pairs with the same name found, only the first value is returned.
Arguments:
-
(required) tag: String
- Returns
-
String, Bio::GFF::GFF2::Record::Value object, or nil.
501 502 503 504 |
# File 'lib/bio/db/gff.rb', line 501 def get_attribute(tag) ary = @attributes.assoc(tag) ary ? ary[1] : nil end |
#get_attributes(tag) ⇒ Object
Gets the attribute values for the given tag. This method always returns an array.
Arguments:
-
(required) tag: String
- Returns
-
Array containing String or \
Bio::GFF::GFF2::Record::Value objects.
514 515 516 517 518 519 520 |
# File 'lib/bio/db/gff.rb', line 514 def get_attributes(tag) ary = @attributes.find_all do |x| x[0] == tag end ary.collect! { |x| x[1] } ary end |
#parse(string) ⇒ Object
Parses a GFF2-formatted line and stores data from the string. Note that all existing data is wiped out.
414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 |
# File 'lib/bio/db/gff.rb', line 414 def parse(string) if /^\s*\#/ =~ string then @comment = string[/\#(.*)/, 1].chomp columns = [] else columns = string.chomp.split("\t", 10) @comment = columns[9][/\#(.*)/, 1].chomp if columns[9] end @seqname, @source, @feature, start, endp, score, @strand, frame = columns[0, 8].collect { |x| str = unescape(x) str == '.' ? nil : str } @start = start ? start.to_i : nil @end = endp ? endp.to_i : nil @score = score ? score.to_f : nil @frame = frame ? frame.to_i : nil @attributes = parse_attributes(columns[8]) end |
#replace_attributes(tag, *values) ⇒ Object
Replaces values for the given tags with new values. Existing values for the tag are completely wiped out and replaced by new tag-value pairs. If the tag does not exist, the tag-value pairs are newly added.
Arguments:
-
(required) tag: String
-
(required) values: String or Bio::GFF::GFF2::Record::Value objects.
- Returns
-
self
556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 |
# File 'lib/bio/db/gff.rb', line 556 def replace_attributes(tag, *values) i = 0 @attributes.reject! do |x| if x[0] == tag then if i >= values.size then true else x[1] = values[i] i += 1 false end else false end end (i...(values.size)).each do |j| @attributes.push [ String.new(tag), values[j] ] end self end |
#set_attribute(tag, value) ⇒ Object
Sets value for the given tag. If the tag exists, the value of the tag is replaced with value. Note that if two or more tag-value pairs with the same name found, only the first tag-value pair is replaced.
If the tag does not exist, the tag-value pair is newly added.
Arguments:
-
(required) tag: String
-
(required) value: String or Bio::GFF::GFF2::Record::Value object.
- Returns
-
value
533 534 535 536 537 538 539 540 541 542 543 544 |
# File 'lib/bio/db/gff.rb', line 533 def set_attribute(tag, value) ary = @attributes.find do |x| x[0] == tag end if ary then ary[1] = value else ary = [ String.new(tag), value ] @attributes.push ary end value end |
#sort_attributes_by_tag!(tags = nil) ⇒ Object
Sorts attributes order by given tag name’s order. If a block is given, the argument tags is ignored, and yields two tag names like Array#sort!.
Arguments:
-
(required or optional) tags: Array containing String objects
- Returns
-
self
626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 |
# File 'lib/bio/db/gff.rb', line 626 def sort_attributes_by_tag!( = nil) h = {} s = @attributes.size @attributes.each_with_index { |x, i| h[x] = i } if block_given? then @attributes.sort! do |x, y| r = yield x[0], y[0] if r == 0 then r = (h[x] || s) <=> (h[y] || s) end r end else unless then raise ArgumentError, 'wrong number of arguments (0 for 1) or wrong argument value' end @attributes.sort! do |x, y| r = (.index(x[0]) || .size) <=> (.index(y[0]) || .size) if r == 0 then r = (h[x] || s) <=> (h[y] || s) end r end end self end |
#to_s ⇒ Object
Return the record as a GFF2 compatible string
456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 |
# File 'lib/bio/db/gff.rb', line 456 def to_s cmnt = if defined?(@comment) and @comment and !@comment.to_s.strip.empty? then @comment.gsub(/[\r\n]+/, ' ') else false end return "\##{cmnt}\n" if self.comment_only? and cmnt [ gff2_column_to_s(@seqname), gff2_column_to_s(@source), gff2_column_to_s(@feature), gff2_column_to_s(@start), gff2_column_to_s(@end), gff2_column_to_s(@score), gff2_column_to_s(@strand), gff2_column_to_s(@frame), attributes_to_s(@attributes) ].join("\t") + (cmnt ? "\t\##{cmnt}\n" : "\n") end |