SCompartmentData(const CSeq_align_set &compartment) : num_alignments(compartment.Get().size()) { CSeq_align align; align.SetSegs().SetDisc(const_cast<CSeq_align_set &>(compartment)); query_range = align.GetSeqRange(0); subject_range = align.GetSeqRange(1); }
static void s_MergeAlignSet(CSeq_align_set & final_set, const CSeq_align_set & input_set) { CSeq_align_set::Tdata & final_list = final_set.Set(); const CSeq_align_set::Tdata & input_list = input_set.Get(); CSeq_align_set::Tdata::const_iterator input_it = input_list.begin(); CSeq_align_set::Tdata::iterator final_it = final_list.begin(); while(input_it != input_list.end()) { double final_evalue; double input_evalue; (*final_it)->GetNamedScore(CSeq_align::eScore_EValue, final_evalue); (*input_it)->GetNamedScore(CSeq_align::eScore_EValue, input_evalue); if(input_evalue == final_evalue) { //Pulling a trick here to keep the program flow simple //Replace the final evalue with input bitscore and vice versa (*final_it)->GetNamedScore(CSeq_align::eScore_BitScore, input_evalue); (*input_it)->GetNamedScore(CSeq_align::eScore_BitScore, final_evalue); } if(input_evalue < final_evalue) { CSeq_align_set::Tdata::const_iterator start_input_it = input_it; while(1) { const CSeq_id & id_prev = (*input_it)->GetSeq_id(1); input_it++; if(input_it == input_list.end()) { break; } if(! id_prev.Match((*input_it)->GetSeq_id(1))) { break; } } final_list.insert(final_it, start_input_it, input_it); } else { while(1) { const CSeq_id & id_prev = (*final_it)->GetSeq_id(1); final_it++; if(final_it == final_list.end()) { break; } if(! id_prev.Match((*final_it)->GetSeq_id(1))) { break; } } if(final_it == final_list.end()) { final_list.insert(final_it, input_it, input_list.end()); break; } } } }