Mercurial > repos > chrisd > testing
diff gene_fraction/src/alignment_util.h @ 0:f95150c37d38 draft default tip
planemo upload for repository https://github.com/ChrisD11/Tools commit ddc95e5d6b5f2c0a5340c0bc384aa822db8856d5
author | chrisd |
---|---|
date | Sun, 21 Feb 2016 23:31:55 -0500 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gene_fraction/src/alignment_util.h Sun Feb 21 23:31:55 2016 -0500 @@ -0,0 +1,96 @@ +#ifndef ALIGNMENT_UTIL_H +#define ALIGNMENT_UTIL_H + +#include <string> +#include <vector> + +#include <boost/algorithm/string.hpp> + +#include "int_util.h" + +// macro to check if read mapped +#define READ_UNMAPPED 4 + +/** + * Splits alignment into separate parts + */ +std::vector<std::string> split_alignment(std::string &alignment) { + std::vector<std::string> parts; + + boost::trim_if(alignment, boost::is_any_of("\t ")); + // split on tab delimeter + boost::split(parts, alignment, boost::is_any_of("\t "), boost::token_compress_on); + + return parts; +} + +/** + * Validates bit flag + */ +bool is_good_flag(const int &bit_flag) { + if( (bit_flag & READ_UNMAPPED) > 0) return false; + return true; +} + +/** + * Validates rname + */ +bool is_good_rname(const std::string &rname) { + return rname.compare("*") != 0; +} + +/** + * Validates pos + */ +bool is_good_pos(const int &pos) { + return pos > 0; +} + +/** + * Validates cigar + */ +bool is_good_cigar(const std::string &cigar) { + return cigar.compare("*") != 0; +} + +/** + * Validates seq + */ +bool is_good_seq(const std::string &seq) { + return seq.compare("*") != 0; +} + +/** + * Validates alignment fields + */ +bool fields_are_good(std::vector<std::string> &parts) { + int bit_flag = s_to_i(parts[1]); + int pos = s_to_i(parts[3]); + + std::string rname = parts[2]; + std::string cigar = parts[5]; + std::string seq = parts[9]; + + if(!(is_good_flag(bit_flag))) return false; + if(!(is_good_pos(pos))) return false; + if(!(is_good_rname(rname))) return false; + if(!(is_good_cigar(cigar))) return false; + if(!(is_good_seq(seq))) return false; + + return true; +} + +/** + * Stores alignments that pass validity checks + */ +bool is_good_alignment(std::string &alignment) { + std::vector<std::string> alignment_parts; + + alignment_parts = split_alignment(alignment); + + if(!(fields_are_good(alignment_parts))) + return false; + return true; +} + +#endif /* ALIGNMENT_UTIL_H */