1 # Copyright (C) 2007-2011 Martin A. Hansen.
3 # This program is free software; you can redistribute it and/or
4 # modify it under the terms of the GNU General Public License
5 # as published by the Free Software Foundation; either version 2
6 # of the License, or (at your option) any later version.
8 # This program is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # GNU General Public License for more details.
13 # You should have received a copy of the GNU General Public License
14 # along with this program; if not, write to the Free Software
15 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 # http://www.gnu.org/copyleft/gpl.html
19 # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
21 # This software is part of the Biopieces framework (www.biopieces.org).
23 # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
26 require 'maasha/filesys'
28 # Error class for all exceptions to do with FASTA.
29 class FastaError < StandardError; end
32 # Method to get the next FASTA entry form an ios and return this
33 # as a Seq object. If no entry is found or eof then nil is returned.
35 block = @io.gets($/ + '>')
36 return nil if block.nil?
38 block.chomp!($/ + '>')
40 (seq_name, seq) = block.split($/, 2)
42 raise FastaError, "Bad FASTA format" if seq_name.nil? or seq.nil?
45 entry.seq = seq.gsub(/\s/, '')
46 entry.seq_name = seq_name.sub(/^>/, '').rstrip
49 raise FastaError, "Bad FASTA format" if entry.seq_name.empty?
50 raise FastaError, "Bad FASTA format" if entry.seq.empty?
55 # Method to get the next pseudo FASTA entry consisting of a sequence name and
56 # space seperated quality scores in decimals instead of sequence. This is
57 # the quality format used by Sanger and 454.
59 block = @io.gets($/ + '>')
60 return nil if block.nil?
62 block.chomp!($/ + '>')
64 (seq_name, qual) = block.split($/, 2)
66 raise FastaError, "Bad FASTA qual format" if seq_name.nil? or qual.nil?
69 entry.seq_name = seq_name.sub(/^>/, '').rstrip
72 entry.qual = qual.tr("\n", " ").strip.split(" ").collect { |q| (q.to_i + SCORE_BASE).chr }.join("")
74 raise FastaError, "Bad FASTA format" if entry.seq_name.empty?
75 raise FastaError, "Bad FASTA format" if entry.qual.empty?