Class Bio::GFF::GFF2::Record
In: lib/bio/db/gff.rb
Parent: GFF::Record

Stores GFF2 record.

Methods

Included Modules

Escape

Classes and Modules

Class Bio::GFF::GFF2::Record::Value

Attributes

comment  [RW]  Comment for the GFF record

Public Class methods

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)

[Source]

     # File lib/bio/db/gff.rb, line 382
382:         def initialize(*arg)
383:           if arg.size == 1 then
384:             parse(arg[0])
385:           else
386:             @seqname, @source, @feature,
387:             start, endp, @score, @strand, frame,
388:             @attributes = arg
389:             @start = start ? start.to_i : nil
390:             @end   = endp  ? endp.to_i : nil
391:             @score = score ? score.to_f : nil
392:             @frame = frame ? frame.to_i : nil
393:           end
394:           @attributes ||= []
395:         end

Parses a GFF2-formatted line and returns a new Bio::GFF::GFF2::Record object.

[Source]

     # File lib/bio/db/gff.rb, line 361
361:         def self.parse(str)
362:           self.new.parse(str)
363:         end

Public Instance methods

Returns true if self == other. Otherwise, returns false.

[Source]

     # File lib/bio/db/gff.rb, line 478
478:         def ==(other)
479:           super ||
480:             ((self.class == other.class and
481:               self.seqname == other.seqname and
482:               self.source  == other.source and
483:               self.feature == other.feature and
484:               self.start   == other.start and
485:               self.end     == other.end and
486:               self.score   == other.score and
487:               self.strand  == other.strand and
488:               self.frame   == other.frame and
489:               self.attributes == other.attributes) ? true : false)
490:         end

Adds a new tag-value pair.


Arguments:

Returns:value

[Source]

     # File lib/bio/db/gff.rb, line 582
582:         def add_attribute(tag, value)
583:           @attributes.push([ String.new(tag), value ])
584:         end
attribute(tag)

Alias for get_attribute

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

[Source]

     # File lib/bio/db/gff.rb, line 660
660:         def attributes_to_hash
661:           h = {}
662:           @attributes.each do |x|
663:             key, val = x
664:             h[key] = val unless h[key]
665:           end
666:           h
667:         end

Returns true if the entry is empty except for comment. Otherwise, returns false.

[Source]

     # File lib/bio/db/gff.rb, line 439
439:         def comment_only?
440:           if !@seqname and
441:               !@source and
442:               !@feature and
443:               !@start and
444:               !@end and
445:               !@score and
446:               !@strand and
447:               !@frame and
448:               @attributes.empty? then
449:             true
450:           else
451:             false
452:           end
453:         end

"comments" is deprecated. Instead, use "comment".

[Source]

     # File lib/bio/db/gff.rb, line 401
401:         def comments
402:           warn "#{self.class.to_s}#comments is deprecated. Instead, use \"comment\"."
403:           self.comment
404:         end

"comments=" is deprecated. Instead, use "comment=".

[Source]

     # File lib/bio/db/gff.rb, line 407
407:         def comments=(str)
408:           warn "#{self.class.to_s}#comments= is deprecated. Instead, use \"comment=\"."
409:           self.comment = str
410:         end

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:

Returns:if removed, value. Otherwise, nil.

[Source]

     # File lib/bio/db/gff.rb, line 596
596:         def delete_attribute(tag, value)
597:           removed = nil
598:           if i = @attributes.index([ tag, value ]) then
599:             ary = @attributes.delete_at(i)
600:             removed = ary[1]
601:           end
602:           removed
603:         end

Removes all attributes with the specified tag.


Arguments:

Returns:if removed, self. Otherwise, nil.

[Source]

     # File lib/bio/db/gff.rb, line 611
611:         def delete_attributes(tag)
612:           @attributes.reject! do |x|
613:             x[0] == tag
614:           end ? self : nil
615:         end

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:

Returns:String, Bio::GFF::GFF2::Record::Value object, or nil.

[Source]

     # File lib/bio/db/gff.rb, line 500
500:         def get_attribute(tag)
501:           ary = @attributes.assoc(tag)
502:           ary ? ary[1] : nil
503:         end

Gets the attribute values for the given tag. This method always returns an array.


Arguments:

Returns:Array containing String or # Bio::GFF::GFF2::Record::Value objects.

[Source]

     # File lib/bio/db/gff.rb, line 513
513:         def get_attributes(tag)
514:           ary = @attributes.find_all do |x|
515:             x[0] == tag
516:           end
517:           ary.collect! { |x| x[1] }
518:           ary
519:         end

Parses a GFF2-formatted line and stores data from the string. Note that all existing data is wiped out.

[Source]

     # File lib/bio/db/gff.rb, line 414
414:         def parse(string)
415:           if /^\s*\#/ =~ string then
416:             @comment = string[/\#(.*)/, 1].chomp
417:             columns = []
418:           else
419:             columns = string.chomp.split("\t", 10)
420:             @comment = columns[9][/\#(.*)/, 1].chomp if columns[9]
421:           end
422: 
423:           @seqname, @source, @feature,
424:           start, endp, score, @strand, frame =
425:             columns[0, 8].collect { |x|
426:             str = unescape(x)
427:             str == '.' ? nil : str
428:           }
429:           @start = start ? start.to_i : nil
430:           @end   = endp  ? endp.to_i : nil
431:           @score = score ? score.to_f : nil
432:           @frame = frame ? frame.to_i : nil
433: 
434:           @attributes = parse_attributes(columns[8])
435:         end

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:

Returns:self

[Source]

     # File lib/bio/db/gff.rb, line 555
555:         def replace_attributes(tag, *values)
556:           i = 0
557:           @attributes.reject! do |x|
558:             if x[0] == tag then
559:               if i >= values.size then
560:                 true
561:               else
562:                 x[1] = values[i]
563:                 i += 1
564:                 false
565:               end
566:             else
567:               false
568:             end
569:           end
570:           (i...(values.size)).each do |j|
571:             @attributes.push [ String.new(tag), values[j] ]
572:           end
573:           self
574:         end

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:

Returns:value

[Source]

     # File lib/bio/db/gff.rb, line 532
532:         def set_attribute(tag, value)
533:           ary = @attributes.find do |x|
534:             x[0] == tag
535:           end
536:           if ary then
537:             ary[1] = value
538:           else
539:             ary = [ String.new(tag), value ]
540:             @attributes.push ary
541:           end
542:           value
543:         end

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

[Source]

     # File lib/bio/db/gff.rb, line 625
625:         def sort_attributes_by_tag!(tags = nil)
626:           h = {}
627:           s = @attributes.size
628:           @attributes.each_with_index { |x, i|  h[x] = i }
629:           if block_given? then
630:             @attributes.sort! do |x, y|
631:               r = yield x[0], y[0]
632:               if r == 0 then
633:                 r = (h[x] || s) <=> (h[y] || s)
634:               end
635:               r
636:             end
637:           else
638:             unless tags then
639:               raise ArgumentError, 'wrong number of arguments (0 for 1) or wrong argument value'
640:             end
641:             @attributes.sort! do |x, y|
642:               r = (tags.index(x[0]) || tags.size) <=> 
643:                 (tags.index(y[0]) || tags.size)
644:               if r == 0 then
645:                 r = (h[x] || s) <=> (h[y] || s)
646:               end
647:               r
648:             end
649:           end
650:           self
651:         end

Return the record as a GFF2 compatible string

[Source]

     # File lib/bio/db/gff.rb, line 456
456:         def to_s
457:           cmnt = if @comment and !@comment.to_s.strip.empty? then
458:                    @comment.gsub(/[\r\n]+/, ' ')
459:                  else
460:                    false
461:                  end
462:           return "\##{cmnt}\n" if self.comment_only? and cmnt
463:           [
464:            gff2_column_to_s(@seqname),
465:            gff2_column_to_s(@source),
466:            gff2_column_to_s(@feature),
467:            gff2_column_to_s(@start),
468:            gff2_column_to_s(@end),
469:            gff2_column_to_s(@score),
470:            gff2_column_to_s(@strand),
471:            gff2_column_to_s(@frame),
472:            attributes_to_s(@attributes)
473:           ].join("\t") + 
474:             (cmnt ? "\t\##{cmnt}\n" : "\n")
475:         end

[Validate]