static int fetch_disc_read_callback(const bam1_t* alignment, void* data) { // MEI_data* mei_data = static_cast<MEI_data*>(data); std::pair<MEI_data*, UserDefinedSettings*>* env = static_cast<std::pair<MEI_data*, UserDefinedSettings*>*>(data); MEI_data* mei_data = env->first; UserDefinedSettings* userSettings = env->second; if (!(alignment->core.flag & BAM_FUNMAP || alignment->core.flag & BAM_FMUNMAP) && // Both ends are mapped. !is_concordant(alignment, mei_data->current_insert_size) && // Ends map discordantly. // Extra check for (very) large mapping distance. This is done beside the check for read // discordance to speed up computation by ignoring signals from small structural variants. (alignment->core.tid != alignment->core.mtid || abs(alignment->core.pos - alignment->core.mpos) > userSettings->MIN_DD_MAP_DISTANCE)) { // Save alignment as simple_read object. std::string read_name = enrich_read_name(bam1_qname(alignment), alignment->core.flag & BAM_FREAD1); char strand = bam1_strand(alignment)? Minus : Plus; char mate_strand = bam1_mstrand(alignment)? Minus : Plus; std::string read_group; get_read_group(alignment, read_group); std::string sample_name; get_sample_name(read_group, mei_data->sample_names, sample_name); simple_read* read = new simple_read(read_name, alignment->core.tid, alignment->core.pos, strand, sample_name, get_sequence(bam1_seq(alignment), alignment->core.l_qseq), alignment->core.mtid, alignment->core.mpos, mate_strand); mei_data->discordant_reads.push_back(read); } return 0; }
// Returns true for a given read whether it is concordantly mapped together with its mate. bool is_concordant(const bam1_t* read, unsigned int insert_size) { if (read->core.flag & BAM_FUNMAP || read->core.flag & BAM_FMUNMAP) { // At least one of the pair is unmapped. return false; } if (read->core.tid != read->core.mtid) { // Reads mapping to different chromosomes. return false; } if (bam1_strand(read) == bam1_mstrand(read)) { // Reads mapping to the same strand. return false; } // Return true if insert size is as expected. This definition of concordance is // equivalent to read-pair construction elsewhere in Pindel. return (unsigned int) abs(read->core.isize) < read->core.l_qseq + 2 * insert_size; }
int bam1_mstrand_(bam1_t *b) { return bam1_mstrand(b); }