1 #ifndef theplu_yat_omic_vcf 2 #define theplu_yat_omic_vcf 27 #include "yat/utility/Exception.h" 28 #include "yat/utility/split.h" 30 #include "yat/utility/yat_assert.h" 32 #include <boost/cstdint.hpp> 59 explicit VCF(
const std::string&);
69 explicit VCF(std::istream&
is);
89 const int32_t&
pos(
void)
const;
96 void id(
const std::string&
id);
101 const std::string&
id(
void)
const;
106 void ref(
const std::string& r);
116 const std::string&
ref(
void)
const;
123 void alt(
const std::string& a);
135 const std::string&
alt(
void)
const;
140 const std::vector<std::string>&
alts(
void)
const;
145 void alts(
const std::vector<std::string>& a);
147 #ifdef YAT_HAVE_RVALUE 151 void alts(std::vector<std::string>&& a);
162 const std::string&
qual(
void)
const;
167 void qual(
const std::string& q);
172 void qual(
unsigned int q);
177 const std::string&
filter(
void)
const;
182 const std::vector<std::string>&
filters(
void)
const;
192 void filter(
const std::string&);
203 void add(
const std::string& key);
210 void add(
const std::string& key,
const T& value);
220 size_t count(
const std::string& key)
const;
228 void get(T& result,
const std::string& key)
const;
233 void remove(
const std::string& key);
238 void set(
const std::string& s);
240 #ifdef YAT_HAVE_RVALUE 244 void set(std::string&& s);
250 const std::string&
str(
void)
const;
253 friend std::ostream& operator<<(std::ostream&,
const VCF::Info&);
260 std::string::iterator find(
const std::string& key);
262 std::string::const_iterator cfind(
const std::string& key)
const;
264 void init(std::string& str);
265 #ifdef YAT_HAVE_RVALUE 266 void init(std::string&& str);
279 void validate(
void)
const;
304 void add(
const std::string& key,
const std::vector<T>&
data);
315 size_t count(
const std::string& key)
const;
322 const std::vector<std::string>& format(
void)
const;
326 void get(
const std::string& key, std::vector<T>&
data)
const;
329 friend std::ostream& operator<<(std::ostream&,
const VCF::Data&);
333 bool initialised(
void)
const;
334 void init(std::vector<std::string>::const_iterator,
335 std::vector<std::string>::const_iterator);
336 size_t index(
const std::string& key)
const;
338 std::vector<std::string> format_;
339 std::vector<std::vector<std::string> > data_;
342 void validate(
void)
const;
366 friend std::ostream& operator<<(std::ostream&,
const VCF&);
367 std::vector<std::string> vec_;
373 void init(std::vector<std::string>& vec);
375 void update_alt(
void);
376 void print(std::ostream& os)
const;
380 void validate(
void)
const;
383 mutable std::vector<std::string> alts_;
384 mutable std::vector<std::string> filters_;
400 std::ostream& operator<<(std::ostream& os,
const VCF& vcf);
420 std::ostream& operator<<(std::ostream& os,
const VCF::Info&
info);
428 std::ostream& operator<<(std::ostream& os,
const VCF::Data&
data);
466 template <
typename T>
469 Appender(
char delim) : delim_(delim) {}
470 void operator()(std::string& val,
const T& x)
const 480 struct Appender<std::string>
482 Appender(
char delim) : delim_(delim) {}
483 void operator()(std::string& val,
const std::string& x)
const 493 struct Appender<std::vector<std::string> >
495 Appender(
char delim) : delim_(delim) {}
496 void operator()(std::string& val,
const std::vector<std::string>& x)
const 498 for (
size_t i=0; i<x.size(); ++i) {
509 template <
typename T>
510 struct Appender<std::vector<T> >
512 Appender(
char delim) : delim_(delim) {}
513 void operator()(std::string& val,
const std::vector<T>& x)
const 515 for (
size_t i=0; i<x.size(); ++i) {
530 void operator()(
const std::string& x, T& result)
const 532 result = utility::convert<T>(x);
538 struct Converter<std::string>
540 void operator()(
const std::string& x, std::string& result)
const 548 struct Converter<std::vector<T> >
550 void operator()(
const std::string& x, std::vector<T>& result)
const 552 std::vector<std::string> vec;
555 result.reserve(vec.size());
556 for (
size_t i=0; i<vec.size(); ++i)
557 result.push_back(utility::convert<T>(vec[i]));
563 struct Converter<std::vector<std::string> >
566 operator()(
const std::string& x, std::vector<std::string>& result)
const 587 detail::Appender<T> append(
',');
595 detail::Converter<T> converter;
597 std::string k = key +
"=";
598 size_t begin = str_.find(k);
600 if (begin == std::string::npos) {
601 converter(value, result);
605 if (begin && str_[begin-1]!=
';') {
607 begin = str_.find(k, begin+key.size());
608 if (begin == std::string::npos) {
609 converter(value, result);
615 int end = str_.find(
";", begin);
616 value = str_.substr(begin, end-begin);
617 converter(value, result);
626 YAT_ASSERT(key !=
"");
627 format_.push_back(key);
628 detail::Appender<T> append(
',');
629 for (
size_t i=0; i<input.size(); ++i) {
630 data_[i].push_back(
"");
631 append(data_[i].back(), input[i]);
639 size_t idx = index(key);
640 detail::Converter<T> converter;
641 data.resize(data_.size());
642 for (
size_t i=0; i<data.size(); ++i)
643 converter(data_[i][idx], data[i]);
const std::string & ref(void) const
const Data & data(void) const
access data
bool is(const std::string &s)
check if string is convertible to (numerical) type T
Definition: utility.h:541
const std::vector< std::string > & alts(void) const
const std::string & chromosome(void) const
void get(const std::string &key, std::vector< T > &data) const
T is string, numeric or vector string or numeric.
Definition: VCF.h:637
The Department of Theoretical Physics namespace as we define it.
Some useful functions are placed here.
void add(const std::string &key)
void get(T &result, const std::string &key) const
Definition: VCF.h:593
VCF(void)
default constructor
size_t count(const std::string &key) const
const std::string & alt(void) const
unsigned int n_alleles(void) const
const int32_t & pos(void) const
std::istream & operator>>(std::istream &is, VCF &vcf)
input operator for VCF
VCF::Info & info(void)
set info
class holiding data stored in FORMAT and data fields
Definition: VCF.h:296
const std::string & str(void) const
const std::vector< std::string > & filters(void) const
void split(std::vector< std::string > &result, const std::string &str, char delim)
split a string into several substrings
const std::string & qual(void) const
phred-scaled probability that all samples are wildtype
class handling the INFO field in an VCF entry
Definition: VCF.h:197
const std::string & filter(void) const
bool is_indel(const VCF &)
std::string convert(T input)
convert T to a string
Definition: utility.h:521
const std::string & id(void) const
void add_filter(const std::string &)
append list of filters
unsigned int n_samples(void) const
void add(const std::string &key, const std::vector< T > &data)
T is string, numeric or vector string or numeric.
Definition: VCF.h:624