示例#1
0
文件: pairs.cpp 项目: Beifang/srma
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;
}