35 template<>
bool Gapped(
const std::vector<std::string> &data)
40 for (std::vector<std::string>::size_type i = 0; i < data.size (); ++i)
43 if( data[i].find(
'-') != std::string::npos )
50 template <>
bool IsAlignment(
const std::vector<std::string> &data)
55 for (std::vector<std::string>::size_type i = 0; i < data.size (); ++i)
56 if (data[i].length () != data[0].length ())
63 bool validForPolyAnalysis( std::vector<std::string>::const_iterator beg,
64 std::vector<std::string>::const_iterator end )
71 if (std::find_if(beg->begin(),beg->end(),
83 bool validForPolyAnalysis( std::vector<std::string>::iterator beg,
84 std::vector<std::string>::iterator end )
88 if (std::find_if(beg->begin(),beg->end(),
100 unsigned UnGappedLength(
const std::vector <std::string>&data)
107 if (!IsAlignment(data))
110 for (std::string::size_type j = 0; j < data[0].length (); ++j)
112 bool site_gapped = 0;
113 for (std::vector<std::string>::size_type i = 0; i < data.size (); ++i)
115 if (data[i][j] ==
'-')
128 void RemoveGaps (std::vector <std::string> &data)
134 size_t length = data[0].length ();
135 std::vector < std::string > ungapped_sequences(data.size());
137 for (i = 0; i < length; ++i)
139 for ( j = 0, site_is_gapped = 0;
140 j < data.size(); ++j)
142 if (data[j][i] ==
'-')
148 if (!(site_is_gapped))
150 for ( j = 0 ; j != data.size(); ++j)
151 ungapped_sequences[j] += data[j][i];
155 data = std::move( ungapped_sequences );
159 void RemoveTerminalGaps (std::vector <std::string>&data)
164 size_t i, j, leftmost, rightmost, numUngapped,offset;
165 size_t length = data[0].length();
166 std::vector < std::string > trimmed_sequences;
167 size_t size = data.size();
170 rightmost = length + 1;
173 for (i = 0; i < length; ++i)
175 for (numUngapped = 0, j = 0; j != data.size (); ++j)
177 if (data[j][i] !=
'-')
180 if (numUngapped == size)
188 bool exit_condition =
false;
189 for (i = length - 1; i < data[0].length() && exit_condition ==
false; --i)
191 for (numUngapped = 0, j = 0; j != data.size (); ++j)
193 if (data[j][i] !=
'-')
196 if (numUngapped == size)
199 exit_condition =
true;
204 offset = rightmost - leftmost + 1;
205 for (j = 0; j != data.size (); ++j)
206 trimmed_sequences.push_back (data[j].substr (leftmost, offset));
209 data.assign(trimmed_sequences.begin(),trimmed_sequences.end());
213 void RemoveFixedOutgroupInsertions( std::vector<std::string> & data,
215 const unsigned & ref )
217 const size_t nsam = data.size()-1;
218 if ( site < data[0].length() )
221 for(
unsigned ind=0;ind<data.size();++ind)
225 ngap += (data[ind][site] ==
'-') ? 1u : 0u;
230 for(
unsigned ind=0;ind<data.size();++ind)
232 data[ind].erase(site,1);
234 RemoveFixedOutgroupInsertions(data,site,ref);
236 RemoveFixedOutgroupInsertions(data,site++,ref);
241 std::vector <std::string>Trim (
const std::vector <std::string >&data,
242 const std::vector <int> &sites)
249 size_t i, j, numseqs = data.size (), numIntervals = sites.size ();
250 std::string::size_type start, stop;
251 std::vector < std::string >trimmedData(numseqs);
252 std::vector < std::string > trimmedTemp(numseqs);
255 throw std::runtime_error (
"Sequence::Alignment::Trim(): empty vector of positions passed to function");
257 if (numIntervals % 2 != 0)
259 throw std::runtime_error (
"Sequence::Alignment::Trim(): odd number of positions passed");
262 for (i = 0; i < numIntervals; i += 2)
264 start = std::string::size_type(sites[i]);
265 stop = std::string::size_type(sites[i + 1]);
266 for (j = 0; j < numseqs; ++j)
268 trimmedTemp[j] += data[j].substr (start, stop - start + 1);
271 trimmedData.assign(trimmedTemp.begin(),trimmedTemp.end());
276 std::vector <std::string> TrimComplement (
const std::vector <std::string> & data,
277 const std::vector < int > &sites)
284 std::vector < int >newSites;
285 size_t i, j, numseqs = data.size (), numIntervals = sites.size (), lastval;
289 throw std::runtime_error (
"Sequence::Alignment::TrimComplement(): empty vector of positions passed to function");
291 if (sites.size() % 2 != 0)
293 throw std::runtime_error (
"Sequence::Alignment::TrimComplement(): odd number of positions passed to function");
296 std::vector < std::string > trimmedTemp(numseqs);
301 for (i = 1; i < numIntervals; ++i)
306 newSites.push_back (sites[i] + 1);
308 else if (odd_even%2!=0)
310 newSites.push_back (sites[i] - 1);
314 else if (sites[0] > 0)
316 newSites.push_back (0);
317 for (i = 0; i < numIntervals; ++i)
322 newSites.push_back (sites[i] + 1);
324 else if (odd_even%2!=0)
326 newSites.push_back (sites[i] - 1);
331 lastval = size_t(newSites[newSites.size () - 1]);
332 newSites.pop_back ();
333 numIntervals = newSites.size ();
334 for (i = 0; i < numIntervals; i += 2)
336 size_t start = size_t(newSites[i]);
337 size_t stop = size_t(newSites[i + 1]);
338 for (j = 0; j < numseqs; ++j)
342 substr (start, stop - start + 1);
346 for (j = 0; j < numseqs; ++j)
348 trimmedTemp[j] +=data[j].substr (lastval);
The namespace in which this library resides.
This functor can be used to determine if a range contains characters that the SNP analysis routines i...
Declaration of namespace Sequence::Alignment.
const unsigned SEQMAXUNSIGNED