-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathread_fasta.cpp
More file actions
executable file
·135 lines (106 loc) · 3.61 KB
/
Copy pathread_fasta.cpp
File metadata and controls
executable file
·135 lines (106 loc) · 3.61 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
//-------------------------------------------------------------------------------------
// Copyright 2014 Michael Peeri
//
// This file is part of hmmdsl.
// hmmdsl is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// hmmdsl is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with hmmdsl. If not, see <http://www.gnu.org/licenses/>.
//-------------------------------------------------------------------------------------
#include "read_fasta.hpp"
namespace fasta
{
const std::string& get_acc(seq_cont_t::const_reference elem)
{
return elem.get<0>();
}
const std::string& get_desc(seq_cont_t::const_reference elem)
{
return elem.get<1>();
}
const seq_t& get_seq(seq_cont_t::const_reference elem)
{
return elem.get<2>();
}
size_t get_len(seq_cont_t::const_reference elem)
{
return elem.get<2>().size();
}
size_t get_len(const seq_t& free_sequence)
{
return free_sequence.length();
}
void read_fasta(const std::string& path, seq_cont_t& seqs)
{
using namespace spirit;
seqs.clear();
fasta_grammar_dispatchers::ParsingAdaptor<seq_cont_t> trans(seqs);
fasta_grammar<seq_cont_t> g(trans);
iterator_t first(path);
iterator_t last = first.make_end();
parse_info<iterator_t> info = parse(first, last, g);
if( (!info.full) || (info.length == 0) )
{
std::cerr<< "Error: Input file "<< path<< " does not appear to be a valid fasta file!"<< std::endl;
assert(info.full);
}
std::cout<< "#Read "<< seqs.cummulative_seq_size()<< " letters in "<< seqs.size()<< " sequences"<< std::endl;
}
size_t count_fasta(const std::string& path)
{
// TODO - Optimize this!
using namespace spirit;
seq_cont_t seqs;
fasta_grammar_dispatchers::ParsingAdaptor<seq_cont_t> trans(seqs);
fasta_grammar<seq_cont_t> g(trans);
iterator_t first(path);
iterator_t last = first.make_end();
parse_info<iterator_t> info = parse(first, last, g);
if( (!info.full) || (info.length == 0) )
{
std::cerr<< "Error: Input file "<< path<< " does not appear to be a valid fasta file!"<< std::endl;
assert(info.full);
}
return seqs.size();
}
template<class Iterator>
void read_fasta(const std::string& path, seq_cont_t& seqs, Iterator begin, Iterator end)
{
using namespace spirit;
seq_cont_t seqs_orig;
seqs.clear();
fasta_grammar_dispatchers::ParsingAdaptor<seq_cont_t> trans(seqs_orig);
fasta_grammar<seq_cont_t> g(trans);
iterator_t first(path);
iterator_t last = first.make_end();
parse_info<iterator_t> info = parse(first, last, g);
if( (!info.full) || (info.length == 0) )
{
std::cerr<< "Error: Input file "<< path<< " does not appear to be a valid fasta file!"<< std::endl;
assert(info.full);
}
//std::cout<< "#Read "<< seqs.cummulative_seq_size()<< " letters in "<< seqs.size()<< " sequences"<< std::endl;
for( Iterator it=begin; it != end; ++it )
{
seqs.push_back( seqs_orig[*it] );
}
// If the index-list is empty, use all sequences
if( seqs.size() == 0)
seqs = seqs_orig;
}
size_t num_sequences(const seq_cont_t& seqs)
{
return seqs.size();
}
// Explicit instantiation
template
void read_fasta<std::vector<size_t>::iterator>(const std::string& path, seq_cont_t& seqs, std::vector<size_t>::iterator begin, std::vector<size_t>::iterator end);
} // namespace fasta