/** * Returns true if chrom:start1-end1 overlaps with a region in the file. */ bool OrderedBCFOverlapMatcher::overlaps_with(std::string& chrom, int32_t start1, int32_t end1) { bool overlaps = false; //moves to new chromosome if (current_interval.seq!=chrom) { buffer.clear(); current_interval.set(chrom); odr->jump_to_interval(current_interval); std::cerr << "Jumped to chromosome " << chrom << "\n"; while (odr->read(v)) { if (bcf_get_end_pos1(v)<start1) continue; overlaps = overlaps || (bcf_get_pos1(v)<=end1); buffer.push_back(v); if (bcf_get_pos1(v)>end1) break; v = bcf_init(); } } else { //scythe preceding bed records std::list<bcf1_t*>::iterator i = buffer.begin(); while (i!=buffer.end()) { if (bcf_get_end_pos1(*i)<start1) { bcf_destroy(*i); i = buffer.erase(i); continue; } overlaps = (bcf_get_pos1(*i)<=end1); break; } if (!overlaps) { if (buffer.empty()) { while (odr->read(v)) { if (bcf_get_end_pos1(*i)<start1) continue; overlaps = overlaps || (bcf_get_pos1(*i)<=end1); buffer.push_back(v); if (bcf_get_pos1(v)>end1) break; v = bcf_init(); } } } } return overlaps; };
/** * Constructor. * @v - VCF record. */ GenotypingRecord::GenotypingRecord(bcf_hdr_t *h, bcf1_t *v, int32_t vtype) { clear(); this->h = h; this->v = v; rid = bcf_get_rid(v); pos1 = bcf_get_pos1(v); this->vtype = vtype; int32_t n_allele = bcf_get_n_allele(v); if (vtype==VT_SNP && n_allele==2) { rid = bcf_get_rid(v); beg1 = bcf_get_pos1(v); end1 = beg1; } else if (vtype==VT_INDEL && bcf_get_n_allele(v)==2) { rid = bcf_get_rid(v); char** alleles = bcf_get_allele(v); dlen = strlen(alleles[1])-strlen(alleles[0]); len = abs(dlen); int32_t *flanks = NULL; int32_t n = 0; if (bcf_get_info_int32(h, v, "FLANKS", &flanks, &n)>0) { lend1 = flanks[0]; rbeg1 = flanks[1]; free(flanks); } else { lend1 = bcf_get_pos1(v) - 1; rbeg1 = bcf_get_end_pos1(v) + 1; } int32_t *fuzzy_flanks = NULL; n = 0; if (bcf_get_info_int32(h, v, "FZ_FLANKS", &fuzzy_flanks, &n)>0) { fuzzy_lend1 = fuzzy_flanks[0]; fuzzy_rbeg1 = fuzzy_flanks[1]; free(fuzzy_flanks); } else { fuzzy_lend1 = bcf_get_pos1(v) - 1; fuzzy_rbeg1 = bcf_get_end_pos1(v) + 1; } beg1 = std::min(lend1-2, fuzzy_lend1-2); end1 = std::max(rbeg1+2, fuzzy_rbeg1+2); //construct alleles //get reference sequence // char* ref_seq = NULL; // int32_t ref_len = 0; //// ref_seq = faidx_fetch_seq(fai, bcf_get_chrom(h,v), lend1+1-1, rbeg1-1-1, &ref_len); // // for (uint32_t i=0; i<n_allele; ++i) // { // // } // for () // { // } // if (dlen>0) { indel.append(&alleles[1][1]); } else { indel.append(&alleles[0][1]); } } else if (vtype==VT_VNTR) { rid = bcf_get_rid(v); beg1 = bcf_get_pos1(v) - 1; end1 = bcf_get_end_pos1(v) + 1; char *motif = NULL; int32_t n = 0; if (bcf_get_info_string(h, v, "MOTIF", &motif, &n)>0) { this->motif.assign(motif); free(motif); } } }