void PairAlign::Do_Batch(RefSeq &ref) { bool detect_pairs; bool detect_a; bool detect_b; strAlign.clear(); strAlign_unpair.clear(); int tt=0; int filter1, filter2; if (0==param.trim_lowQ) { for (singleAlignSa.readBuffer=singleAlignSa.mreads.begin(), singleAlignSb.readBuffer=singleAlignSb.mreads.begin(); tt<num_reads; singleAlignSa.readBuffer++, singleAlignSb.readBuffer++, tt++) { filter1=singleAlignSa.FilterReads(); filter2=singleAlignSb.FilterReads(); if (!(filter1 || filter2)) { if (RunAlign(ref)) { StringAlign(ref, strAlign); n_aligned_pairs++; } else { if (singleAlignSa.RunAlign(ref)) { singleAlignSa.StringAlign(ref, strAlign_unpair); n_aligned_a++; } else { as.collect_unalign_reads(singleAlignSa.readBuffer->name,singleAlignSa.readBuffer->seq); } if (singleAlignSb.RunAlign(ref)) { singleAlignSb.StringAlign(ref, strAlign_unpair); n_aligned_b++; } else { as.collect_unalign_reads(singleAlignSb.readBuffer->name,singleAlignSb.readBuffer->seq); } } } else { if (!filter1) { if (singleAlignSa.RunAlign(ref)) { singleAlignSa.StringAlign(ref, strAlign_unpair); n_aligned_a++; } else { as.collect_unalign_reads(singleAlignSa.readBuffer->name,singleAlignSa.readBuffer->seq); } } if (!filter2) { if (singleAlignSb.RunAlign(ref)) { singleAlignSb.StringAlign(ref, strAlign_unpair); n_aligned_b++; } else { as.collect_unalign_reads(singleAlignSb.readBuffer->name,singleAlignSb.readBuffer->seq); } } } } } else if (10>=param.trim_lowQ) { for (singleAlignSa.readBuffer=singleAlignSa.mreads.begin(), singleAlignSb.readBuffer=singleAlignSb.mreads.begin(); tt<num_reads; singleAlignSa.readBuffer++, singleAlignSb.readBuffer++, tt++) { singleAlignSa.readBuffer->seq.erase(singleAlignSa.readBuffer->seq.size()-param.trim_lowQ, param.trim_lowQ); singleAlignSa.readBuffer->qual.erase(singleAlignSa.readBuffer->qual.size()-param.trim_lowQ, param.trim_lowQ); singleAlignSb.readBuffer->seq.erase(singleAlignSb.readBuffer->seq.size()-param.trim_lowQ, param.trim_lowQ); singleAlignSb.readBuffer->qual.erase(singleAlignSb.readBuffer->qual.size()-param.trim_lowQ, param.trim_lowQ); filter1=singleAlignSa.FilterReads(); filter2=singleAlignSb.FilterReads(); if (!(filter1 || filter2)) { if (RunAlign(ref)) { StringAlign(ref, strAlign); n_aligned_pairs++; } else { if (singleAlignSa.RunAlign(ref)) { singleAlignSa.StringAlign(ref, strAlign_unpair); n_aligned_a++; } else { as.collect_unalign_reads(singleAlignSa.readBuffer->name,singleAlignSa.readBuffer->seq); } if (singleAlignSb.RunAlign(ref)) { singleAlignSb.StringAlign(ref, strAlign_unpair); n_aligned_b++; } else { as.collect_unalign_reads(singleAlignSb.readBuffer->name,singleAlignSb.readBuffer->seq); } } } else { if (!filter1) { if (singleAlignSa.RunAlign(ref)) { singleAlignSa.StringAlign(ref, strAlign_unpair); n_aligned_a++; } else { as.collect_unalign_reads(singleAlignSa.readBuffer->name,singleAlignSa.readBuffer->seq); } } if (!filter2) { if (singleAlignSb.RunAlign(ref)) { singleAlignSb.StringAlign(ref, strAlign_unpair); n_aligned_b++; } else { as.collect_unalign_reads(singleAlignSb.readBuffer->name,singleAlignSb.readBuffer->seq); } } } } } else if (20>=param.trim_lowQ) { for (singleAlignSa.readBuffer=singleAlignSa.mreads.begin(), singleAlignSb.readBuffer=singleAlignSb.mreads.begin(); tt<num_reads; singleAlignSa.readBuffer++, singleAlignSb.readBuffer++, tt++) { singleAlignSa.readBuffer->seq.erase(singleAlignSa.readBuffer->seq.size()-(param.trim_lowQ-10), param.trim_lowQ-10); singleAlignSa.readBuffer->qual.erase(singleAlignSa.readBuffer->qual.size()-(param.trim_lowQ-10), param.trim_lowQ-10); singleAlignSa.readBuffer->seq.erase(0,1); singleAlignSa.readBuffer->qual.erase(0,1); singleAlignSb.readBuffer->seq.erase(singleAlignSb.readBuffer->seq.size()-(param.trim_lowQ-10), param.trim_lowQ-10); singleAlignSb.readBuffer->qual.erase(singleAlignSb.readBuffer->qual.size()-(param.trim_lowQ-10), param.trim_lowQ-10); singleAlignSb.readBuffer->seq.erase(0,1); singleAlignSb.readBuffer->qual.erase(0,1); filter1=singleAlignSa.FilterReads(); filter2=singleAlignSb.FilterReads(); if (!(filter1 || filter2)) { if (RunAlign(ref)) { StringAlign(ref, strAlign); n_aligned_pairs++; } else { if (singleAlignSa.RunAlign(ref)) { singleAlignSa.StringAlign(ref, strAlign_unpair); n_aligned_a++; } else { as.collect_unalign_reads(singleAlignSa.readBuffer->name,singleAlignSa.readBuffer->seq); } if (singleAlignSb.RunAlign(ref)) { singleAlignSb.StringAlign(ref, strAlign_unpair); n_aligned_b++; } else { as.collect_unalign_reads(singleAlignSb.readBuffer->name,singleAlignSb.readBuffer->seq); } } } else { if (!filter1) { if (singleAlignSa.RunAlign(ref)) { singleAlignSa.StringAlign(ref, strAlign_unpair); n_aligned_a++; } else { as.collect_unalign_reads(singleAlignSa.readBuffer->name,singleAlignSa.readBuffer->seq); } } if (!filter2) { if (singleAlignSb.RunAlign(ref)) { singleAlignSb.StringAlign(ref, strAlign_unpair); n_aligned_b++; } else { as.collect_unalign_reads(singleAlignSb.readBuffer->name,singleAlignSb.readBuffer->seq); } } } } } else if (30>=param.trim_lowQ) { for (singleAlignSa.readBuffer=singleAlignSa.mreads.begin(), singleAlignSb.readBuffer=singleAlignSb.mreads.begin(); tt<num_reads; singleAlignSa.readBuffer++, singleAlignSb.readBuffer++, tt++) { //store the original seq and qual singleAlignSa.oriReadSeq = singleAlignSa.readBuffer->seq; singleAlignSa.oriReadQual = singleAlignSa.readBuffer->qual; singleAlignSb.oriReadSeq = singleAlignSb.readBuffer->seq; singleAlignSb.oriReadQual = singleAlignSb.readBuffer->qual; //try pair-end align first, if no hits, try single-read align later if (!(singleAlignSa.FilterReads() || singleAlignSb.FilterReads()) && RunAlign(ref)) { StringAlign(ref, strAlign); n_aligned_pairs++; continue; } singleAlignSa.readBuffer->seq.erase(singleAlignSa.readBuffer->seq.size()-(param.trim_lowQ-20), param.trim_lowQ-20); singleAlignSa.readBuffer->qual.erase(singleAlignSa.readBuffer->qual.size()-(param.trim_lowQ-20), param.trim_lowQ-20); singleAlignSb.readBuffer->seq.erase(singleAlignSb.readBuffer->seq.size()-(param.trim_lowQ-20), param.trim_lowQ-20); singleAlignSb.readBuffer->qual.erase(singleAlignSb.readBuffer->qual.size()-(param.trim_lowQ-20), param.trim_lowQ-20); if (!(singleAlignSa.FilterReads() || singleAlignSb.FilterReads()) && RunAlign(ref)) { StringAlign(ref, strAlign); n_aligned_pairs++; continue; } // if no hits, try single-read align later singleAlignSa.readBuffer->seq = singleAlignSa.oriReadSeq; singleAlignSa.readBuffer->qual = singleAlignSa.oriReadQual; singleAlignSb.readBuffer->seq = singleAlignSb.oriReadSeq; singleAlignSb.readBuffer->qual = singleAlignSb.oriReadQual; if (!singleAlignSa.FilterReads() && singleAlignSa.RunAlign(ref)) { singleAlignSa.StringAlign(ref, strAlign_unpair); n_aligned_a++; } else { singleAlignSa.readBuffer->seq.erase(singleAlignSa.readBuffer->seq.size()-(param.trim_lowQ-20), param.trim_lowQ-20); singleAlignSa.readBuffer->qual.erase(singleAlignSa.readBuffer->qual.size()-(param.trim_lowQ-20), param.trim_lowQ-20); if (!singleAlignSa.FilterReads()) { if (singleAlignSa.RunAlign(ref)) { singleAlignSa.StringAlign(ref, strAlign_unpair); n_aligned_a++; } else { as.collect_unalign_reads(singleAlignSa.readBuffer->name,singleAlignSa.readBuffer->seq); } } } if (!singleAlignSb.FilterReads() && singleAlignSb.RunAlign(ref)) { singleAlignSb.StringAlign(ref, strAlign_unpair); n_aligned_b++; } else { singleAlignSb.readBuffer->seq.erase(singleAlignSb.readBuffer->seq.size()-(param.trim_lowQ-20), param.trim_lowQ-20); singleAlignSb.readBuffer->qual.erase(singleAlignSb.readBuffer->qual.size()-(param.trim_lowQ-20), param.trim_lowQ-20); if (!singleAlignSb.FilterReads()) { if (singleAlignSb.RunAlign(ref)) { singleAlignSb.StringAlign(ref, strAlign_unpair); n_aligned_b++; } else { as.collect_unalign_reads(singleAlignSb.readBuffer->name,singleAlignSb.readBuffer->seq); } } } } } else if (40>=param.trim_lowQ) { for (singleAlignSa.readBuffer=singleAlignSa.mreads.begin(), singleAlignSb.readBuffer=singleAlignSb.mreads.begin(); tt<num_reads; singleAlignSa.readBuffer++, singleAlignSb.readBuffer++, tt++) { //store the original seq and qual singleAlignSa.oriReadSeq = singleAlignSa.readBuffer->seq; singleAlignSa.oriReadQual = singleAlignSa.readBuffer->qual; singleAlignSb.oriReadSeq = singleAlignSb.readBuffer->seq; singleAlignSb.oriReadQual = singleAlignSb.readBuffer->qual; //try pair-end align first, if no hits, try single-read align later if (!(singleAlignSa.FilterReads() || singleAlignSb.FilterReads()) && RunAlign(ref)) { StringAlign(ref, strAlign); n_aligned_pairs++; continue; } singleAlignSa.readBuffer->seq.erase(singleAlignSa.readBuffer->seq.size()-(param.trim_lowQ-30), param.trim_lowQ-30); singleAlignSa.readBuffer->qual.erase(singleAlignSa.readBuffer->qual.size()-(param.trim_lowQ-30), param.trim_lowQ-30); singleAlignSa.readBuffer->seq.erase(0,1); singleAlignSa.readBuffer->qual.erase(0,1); singleAlignSb.readBuffer->seq.erase(singleAlignSb.readBuffer->seq.size()-(param.trim_lowQ-30), param.trim_lowQ-30); singleAlignSb.readBuffer->qual.erase(singleAlignSb.readBuffer->qual.size()-(param.trim_lowQ-30), param.trim_lowQ-30); singleAlignSb.readBuffer->seq.erase(0,1); singleAlignSb.readBuffer->qual.erase(0,1); if (!(singleAlignSa.FilterReads() || singleAlignSb.FilterReads()) && RunAlign(ref)) { StringAlign(ref, strAlign); n_aligned_pairs++; continue; } // if no hits, try single-read align later singleAlignSa.readBuffer->seq = singleAlignSa.oriReadSeq; singleAlignSa.readBuffer->qual = singleAlignSa.oriReadQual; singleAlignSb.readBuffer->seq = singleAlignSb.oriReadSeq; singleAlignSb.readBuffer->qual = singleAlignSb.oriReadQual; if (!singleAlignSa.FilterReads() && singleAlignSa.RunAlign(ref)) { singleAlignSa.StringAlign(ref, strAlign_unpair); n_aligned_a++; } else { singleAlignSa.readBuffer->seq.erase(singleAlignSa.readBuffer->seq.size()-(param.trim_lowQ-30), param.trim_lowQ-30); singleAlignSa.readBuffer->qual.erase(singleAlignSa.readBuffer->qual.size()-(param.trim_lowQ-30), param.trim_lowQ-30); singleAlignSa.readBuffer->seq.erase(0,1); singleAlignSa.readBuffer->qual.erase(0,1); if (!singleAlignSa.FilterReads()) { if (singleAlignSa.RunAlign(ref)) { singleAlignSa.StringAlign(ref, strAlign_unpair); n_aligned_a++; } else { as.collect_unalign_reads(singleAlignSa.readBuffer->name,singleAlignSa.readBuffer->seq); } } } if (!singleAlignSb.FilterReads() && singleAlignSb.RunAlign(ref)) { singleAlignSb.StringAlign(ref, strAlign_unpair); n_aligned_b++; } else { singleAlignSb.readBuffer->seq.erase(singleAlignSb.readBuffer->seq.size()-(param.trim_lowQ-30), param.trim_lowQ-30); singleAlignSb.readBuffer->qual.erase(singleAlignSb.readBuffer->qual.size()-(param.trim_lowQ-30), param.trim_lowQ-30); singleAlignSb.readBuffer->seq.erase(0,1); singleAlignSb.readBuffer->qual.erase(0,1); if (!singleAlignSb.FilterReads()) { if (singleAlignSb.RunAlign(ref)) { singleAlignSb.StringAlign(ref, strAlign_unpair); n_aligned_b++; }else{ as.collect_unalign_reads(singleAlignSb.readBuffer->name,singleAlignSb.readBuffer->seq); } } } } } else if (50>=param.trim_lowQ) { for (singleAlignSa.readBuffer=singleAlignSa.mreads.begin(), singleAlignSb.readBuffer=singleAlignSb.mreads.begin(); tt<num_reads; singleAlignSa.readBuffer++, singleAlignSb.readBuffer++, tt++) { //store the original seq and qual singleAlignSa.oriReadSeq = singleAlignSa.readBuffer->seq; singleAlignSa.oriReadQual = singleAlignSa.readBuffer->qual; singleAlignSb.oriReadSeq = singleAlignSb.readBuffer->seq; singleAlignSb.oriReadQual = singleAlignSb.readBuffer->qual; //try pair-end align first, if no hits, try single-read align later if (!(singleAlignSa.FilterReads() || singleAlignSb.FilterReads()) && RunAlign(ref)) { StringAlign(ref, strAlign); n_aligned_pairs++; continue; } detect_pairs=0; while (1) { singleAlignSa.readBuffer->seq.erase(singleAlignSa.readBuffer->seq.size()-(param.trim_lowQ-40), param.trim_lowQ-40); singleAlignSa.readBuffer->qual.erase(singleAlignSa.readBuffer->qual.size()-(param.trim_lowQ-40), param.trim_lowQ-40); singleAlignSb.readBuffer->seq.erase(singleAlignSb.readBuffer->seq.size()-(param.trim_lowQ-40), param.trim_lowQ-40); singleAlignSb.readBuffer->qual.erase(singleAlignSb.readBuffer->qual.size()-(param.trim_lowQ-40), param.trim_lowQ-40); if (singleAlignSa.readBuffer->seq.size()<param.min_read_size) break; if (!(singleAlignSa.FilterReads() || singleAlignSb.FilterReads()) && RunAlign(ref)) { StringAlign(ref, strAlign); n_aligned_pairs++; detect_pairs=1; break; } } if (detect_pairs) continue; // if no hits, try single-read align later singleAlignSa.readBuffer->seq = singleAlignSa.oriReadSeq; singleAlignSa.readBuffer->qual = singleAlignSa.oriReadQual; singleAlignSb.readBuffer->seq = singleAlignSb.oriReadSeq; singleAlignSb.readBuffer->qual = singleAlignSb.oriReadQual; if (!singleAlignSa.FilterReads() && singleAlignSa.RunAlign(ref)) { singleAlignSa.StringAlign(ref, strAlign_unpair); n_aligned_a++; } else { while(1) { singleAlignSa.readBuffer->seq.erase(singleAlignSa.readBuffer->seq.size()-(param.trim_lowQ-40), param.trim_lowQ-40); singleAlignSa.readBuffer->qual.erase(singleAlignSa.readBuffer->qual.size()-(param.trim_lowQ-40), param.trim_lowQ-40); if (singleAlignSa.readBuffer->seq.size()<param.min_read_size) break; if (!singleAlignSa.FilterReads() && singleAlignSa.RunAlign(ref)) { singleAlignSa.StringAlign(ref, strAlign_unpair); n_aligned_a++; detect_a=1; break; } else { as.collect_unalign_reads(singleAlignSa.readBuffer->name,singleAlignSa.readBuffer->seq); } } } if (!singleAlignSb.FilterReads() && singleAlignSb.RunAlign(ref)) { singleAlignSb.StringAlign(ref, strAlign_unpair); n_aligned_b++; } else { while(1) { singleAlignSb.readBuffer->seq.erase(singleAlignSb.readBuffer->seq.size()-(param.trim_lowQ-40), param.trim_lowQ-40); singleAlignSb.readBuffer->qual.erase(singleAlignSb.readBuffer->qual.size()-(param.trim_lowQ-40), param.trim_lowQ-40); if (singleAlignSb.readBuffer->seq.size()<param.min_read_size) break; if (!singleAlignSb.FilterReads() && singleAlignSb.RunAlign(ref)) { singleAlignSb.StringAlign(ref, strAlign_unpair); n_aligned_b++; detect_b=1; break; }else{ as.collect_unalign_reads(singleAlignSb.readBuffer->name,singleAlignSb.readBuffer->seq); } } } } } else if (60>=param.trim_lowQ) { for (singleAlignSa.readBuffer=singleAlignSa.mreads.begin(), singleAlignSb.readBuffer=singleAlignSb.mreads.begin(); tt<num_reads; singleAlignSa.readBuffer++, singleAlignSb.readBuffer++, tt++) { //store the original seq and qual singleAlignSa.oriReadSeq = singleAlignSa.readBuffer->seq; singleAlignSa.oriReadQual = singleAlignSa.readBuffer->qual; singleAlignSb.oriReadSeq = singleAlignSb.readBuffer->seq; singleAlignSb.oriReadQual = singleAlignSb.readBuffer->qual; //try pair-end align first, if no hits, try single-read align later if (!(singleAlignSa.FilterReads() || singleAlignSb.FilterReads()) && RunAlign(ref)) { StringAlign(ref, strAlign); n_aligned_pairs++; continue; } detect_pairs=0; singleAlignSa.readBuffer->seq.erase(0,1); singleAlignSa.readBuffer->qual.erase(0,1); singleAlignSb.readBuffer->seq.erase(0,1); singleAlignSb.readBuffer->qual.erase(0,1); while(1) { singleAlignSa.readBuffer->seq.erase(singleAlignSa.readBuffer->seq.size()-(param.trim_lowQ-50), param.trim_lowQ-50); singleAlignSa.readBuffer->qual.erase(singleAlignSa.readBuffer->qual.size()-(param.trim_lowQ-50), param.trim_lowQ-50); singleAlignSb.readBuffer->seq.erase(singleAlignSb.readBuffer->seq.size()-(param.trim_lowQ-50), param.trim_lowQ-50); singleAlignSb.readBuffer->qual.erase(singleAlignSb.readBuffer->qual.size()-(param.trim_lowQ-50), param.trim_lowQ-50); if (singleAlignSa.readBuffer->seq.size()<param.min_read_size) break; if (!(singleAlignSa.FilterReads() || singleAlignSb.FilterReads()) && RunAlign(ref)) { StringAlign(ref, strAlign); n_aligned_pairs++; detect_pairs=1; break; } } if (detect_pairs) continue; // if no hits, try single-read align later singleAlignSa.readBuffer->seq = singleAlignSa.oriReadSeq; singleAlignSa.readBuffer->qual = singleAlignSa.oriReadQual; singleAlignSb.readBuffer->seq = singleAlignSb.oriReadSeq; singleAlignSb.readBuffer->qual = singleAlignSb.oriReadQual; if (!singleAlignSa.FilterReads() && singleAlignSa.RunAlign(ref)) { singleAlignSa.StringAlign(ref, strAlign_unpair); n_aligned_a++; } else { singleAlignSa.readBuffer->seq.erase(0,1); singleAlignSa.readBuffer->qual.erase(0,1); while(1) { singleAlignSa.readBuffer->seq.erase(singleAlignSa.readBuffer->seq.size()-(param.trim_lowQ-50), param.trim_lowQ-50); singleAlignSa.readBuffer->qual.erase(singleAlignSa.readBuffer->qual.size()-(param.trim_lowQ-50), param.trim_lowQ-50); if (singleAlignSa.readBuffer->seq.size()<param.min_read_size) break; if (!singleAlignSa.FilterReads() && singleAlignSa.RunAlign(ref)) { singleAlignSa.StringAlign(ref, strAlign_unpair); n_aligned_a++; detect_a=1; break; }else{ as.collect_unalign_reads(singleAlignSa.readBuffer->name,singleAlignSa.readBuffer->seq); } } } if (!singleAlignSb.FilterReads() && singleAlignSb.RunAlign(ref)) { singleAlignSb.StringAlign(ref, strAlign_unpair); n_aligned_b++; } else { singleAlignSb.readBuffer->seq.erase(0,1); singleAlignSb.readBuffer->qual.erase(0,1); while(1) { singleAlignSb.readBuffer->seq.erase(singleAlignSb.readBuffer->seq.size()-(param.trim_lowQ-50), param.trim_lowQ-50); singleAlignSb.readBuffer->qual.erase(singleAlignSb.readBuffer->qual.size()-(param.trim_lowQ-50), param.trim_lowQ-50); if (singleAlignSb.readBuffer->seq.size()<param.min_read_size) break; if (!singleAlignSb.FilterReads() && singleAlignSb.RunAlign(ref)) { singleAlignSb.StringAlign(ref, strAlign_unpair); n_aligned_b++; detect_b=1; break; } else { as.collect_unalign_reads(singleAlignSb.readBuffer->name,singleAlignSb.readBuffer->seq); } } } } } // cout<<strAlign<<endl; }