void export_md_to_apath(const char* md, const bool is_fwd_strand, path_t& apath, const bool is_edge_deletion_error) { // to make best use of previous code, we parse the MD in the // alignment direction and then orient apath to the forward strand // as a second step if required // assert(NULL != md); apath.clear(); export_md_to_apath_impl(md,apath); unsigned as(apath.size()); if ( ((as>0) and (apath.front().type == DELETE)) or ((as>1) and (apath.back().type == DELETE)) ) { std::ostringstream oss; if (is_edge_deletion_error) { oss << "ERROR: "; } else { oss << "WARNING: "; } oss << "alignment path: " << apath_to_cigar(apath) << " contains meaningless edge deletion.\n"; if (is_edge_deletion_error) { throw blt_exception(oss.str().c_str()); } else { log_os << oss.str(); path_t apath2; for (unsigned i(0); i<as; ++i) { if (((i==0) or ((i+1)==as)) and apath[i].type == DELETE) continue; apath2.push_back(apath[i]); } apath=apath2; as=apath.size(); } } if ( (not is_fwd_strand) and (as>1) ) { std::reverse(apath.begin(),apath.end()); } }
void cigar_to_apath(const char* cigar, path_t& apath) { using illumina::blt_util::parse_unsigned; assert(NULL != cigar); apath.clear(); path_segment lps; const char* cptr(cigar); while (*cptr) { path_segment ps; // expect sequences of digits and cigar codes: if (! isdigit(*cptr)) unknown_cigar_error(cigar,cptr); ps.length = parse_unsigned(cptr); ps.type = cigar_code_to_segment_type(*cptr); if (ps.type == NONE) unknown_cigar_error(cigar,cptr); cptr++; if ((ps.type == PAD) || (ps.length == 0)) continue; if (ps.type != lps.type) { if (lps.type != NONE) apath.push_back(lps); lps = ps; } else { lps.length += ps.length; } } if (lps.type != NONE) apath.push_back(lps); }