Пример #1
0
// Saves an alignment into a file in fasta format.
void save_alignment(Alignment &al, std::string const &fname) {
  std::ofstream ffile;
  ffile.open(fname.c_str(), std::ios::out);
  if (!ffile.is_open()) {
    std::cout << "Could not open file: " << fname << std::endl;
  }
  print_alignment(al, ffile);
  ffile.close();
}
void merge_both_alignments(vector<reference_index>& refindex, string sam_output_name, fragment_alignment& alignment_first, 
				fragment_alignment& alignment_second, ofstream& fp_sam, ofstream& fp_detail, 
				ofstream& fp_fastq, unordered_map<string, int>& umap)
{
	if(alignment_first.gaps != 0 || alignment_second.gaps != 0)
	{
		if(DEBUG == 99)
			fp_detail << "\n****************************************GAPS FOUND****************************************" << endl << endl;
		return;
	}

	fragment_alignment pointer_first;
	fragment_alignment pointer_second;

	int first_start_index, second_start_index;
	int first_last_index, second_last_index;

	if(alignment_first.ref_start < alignment_second.ref_start)
	{
		first_start_index = alignment_first.ref_start;
		first_last_index = alignment_second.ref_start;
		second_start_index = alignment_first.ref_end;
		second_last_index = alignment_second.ref_end;
		pointer_first = alignment_first;
		pointer_second = alignment_second;	
	}
	else
	{
		first_start_index = alignment_second.ref_start;
		first_last_index = alignment_first.ref_start;
		second_start_index = alignment_second.ref_end;
		second_last_index = alignment_first.ref_end;
		pointer_first = alignment_second;
		pointer_second = alignment_first;	
	}

	if(first_last_index > second_start_index)
		return;
	if(second_last_index < second_start_index)
		return;
	/*
	cout << "\nFind Problems in Merging" << endl;
	cout << "First start index = " << first_start_index << endl;
	cout << "First last index = " << first_last_index << endl;
	cout << "Second start index = " << second_start_index << endl;
	cout << "Second last index = " << second_last_index << endl;
	*/

	//linking reference base
	
	int ref_start = 0, read_start = 0;
	consensus *head_node = new consensus;

	head_node->ref_ind = 0;
	head_node->refch = refindex[0].ref.at(0);

	head_node->read_ind = -1;
	head_node->readch = '\0';

	head_node->quality = 0;

	head_node->next = NULL;
	head_node->up = NULL;
	head_node->down = NULL;

	consensus *current_node = head_node;

	for(int i = 1; i < refindex[0].ref.length(); i++)
	{
		consensus *next_node = new consensus;
		
		next_node->ref_ind = i;	
		next_node->refch = refindex[0].ref.at(i);
		
		next_node->read_ind = -1;
		next_node->readch = '\0';

		next_node->quality = 0;

		next_node->next = NULL;
		next_node->up = NULL;
		next_node->down = NULL;

		current_node->next = next_node;
		current_node->up = next_node;

		current_node = current_node->next;
	}

	fp_detail << endl << "Testing Reference Linked List" << endl;
	current_node = head_node;
	while(current_node != NULL)
	{
		fp_detail << "" << current_node->refch;
		current_node = current_node->next;
	}
	fp_detail << endl << "Reference Linked List Printed" << endl << endl;

	//first read alignment

	consensus *previous_node = NULL;
	int current_ref_ind = -1;
	int current_read_ind = -1;
	current_node = head_node;

	for(int i = 0; i < pointer_first.alignment.size(); i++)
	{
		if(pointer_first.alignment[i].first != '-')
			current_ref_ind += 1;
		if(pointer_first.alignment[i].second != '-')
			current_read_ind += 1;

		if(current_ref_ind == current_node->ref_ind)
		{
			current_node->read_ind = current_read_ind;
			current_node->readch = '-';

			if(pointer_first.alignment[i].second != '-')
			{
				current_node->readch = pointer_first.alignment[i].second;
				current_node->quality = pointer_first.quality.at(i);
			}

			previous_node = current_node;
			current_node = current_node->next;
		}
		else
		{
			consensus *next_node = new consensus;

			next_node->ref_ind = current_ref_ind;
			next_node->refch = '-';

			next_node->read_ind = current_read_ind;
			next_node->readch = pointer_first.alignment[i].second;
			current_node->quality = pointer_first.quality.at(i);

			next_node->next = NULL;
			next_node->up = NULL;
			next_node->down = NULL;

			next_node->next = current_node;
			if(previous_node != NULL)
				previous_node->next = next_node;

			previous_node = next_node;
		}
	}


	fp_detail << endl << "Testing Read_One Linked List" << endl;
	current_node = head_node;
	while(current_node != NULL)
	{
		fp_detail << "" << current_node->readch;
		current_node = current_node->next;
	}
	fp_detail << endl << "Read_One Linked List Printed" << endl << endl;



	//second read alignment

	current_node = head_node;
	while(current_node->ref_ind < first_last_index)
	{
		previous_node = current_node;
		current_node = current_node->next;
	}

	current_ref_ind = first_last_index - 1;
	current_read_ind = -1;

	for(int i = 0; i < pointer_second.alignment.size(); i++)
	{
		if(pointer_second.alignment[i].first != '-')
			current_ref_ind += 1;
		if(pointer_second.alignment[i].second != '-')
			current_read_ind += 1;

		if(current_ref_ind == current_node->ref_ind)
		{
			if(current_node->quality < pointer_second.quality.at(i))
			{
				current_node->read_ind = current_read_ind;
				current_node->readch = pointer_second.alignment[i].second;
				current_node->quality = pointer_second.quality.at(i);
			}	
			else
			{
				if(current_node->readch == '\0')
				{
					current_node->read_ind = current_read_ind;
					current_node->readch = '-';
				}
			}

			previous_node = current_node;
			current_node = current_node->next;
		}
		else
		{
			consensus *next_node = new consensus;

			next_node->ref_ind = current_ref_ind;
			next_node->refch = '-';

			next_node->read_ind = current_read_ind;
			next_node->readch = pointer_second.alignment[i].second;
			current_node->quality = pointer_second.quality.at(i);

			next_node->next = NULL;
			next_node->up = NULL;
			next_node->down = NULL;

			next_node->next = current_node;
			previous_node->up = next_node;

			previous_node = next_node;
		}
	}


	fp_detail << endl << "Testing Read_Two Linked List" << endl;
	current_node = head_node;
	while(current_node != NULL)
	{
		fp_detail << "" << current_node->readch;
		current_node = current_node->next;
	}
	fp_detail << endl << "Read_Two Linked List Printed" << endl << endl;


	/*
	consensus *head_node = new consensus;
	ref_start = head_node->ref_ind = pointer_first.ref_start;
	head_node->refch = pointer_first.alignment[0].first;

	read_start = head_node->read_ind = pointer_first.read_start;
	head_node->readch = pointer_first.alignment[0].second;

	head_node->next = NULL;
	head_node->up = NULL;
	head_node->down = NULL;

	consensus *current_node = head_node;
	
	for(int i = 1; i < pointer_first.alignment.size(); i++)
	{
		consensus *next_node = new consensus;
		if(pointer_first.alignment[i].first != '-')
			ref_start += 1;
		if(pointer_first.alignment[i].second != '-')
			read_start += 1;

		next_node->ref_ind = ref_start;
		next_node->refch = pointer_first.alignment[0].first;

		next_node->read_ind = read_start;
		next_node->readch = pointer_first.alignment[0].second;

		next_node->next = NULL;
		next_node->up = NULL;
		next_node->down = NULL;

		current_node->next = next_node;
		current_node = current_node->next;
	
	}
	*/
	
	vector<pair<char, char> > alignment;
	vector<char> quality;

	int read_index_first, read_index_second;
	int ref_index_first, ref_index_second;
	int i, k, l, x;

	int read_end, ref_end;
	int match = 0, gaps = 0, mismatch = 0;

	read_index_first = pointer_first.read_start;
	ref_index_first = pointer_first.ref_start;

	read_index_second = pointer_second.read_start;
	ref_index_second = pointer_second.ref_start;

	read_start = read_index_first;
	ref_start = ref_index_first;

	for(i = 0; ref_index_first < first_last_index && i < pointer_first.alignment.size(); i++)
	{
		alignment.push_back(pointer_first.alignment[i]);
		//if(pointer_first.alignment[i].second != '-')
		{
			quality.push_back(pointer_first.quality.at(read_index_first));
			read_index_first += 1;
		}	
		//if(pointer_first.alignment[i].first != '-')
		{
			ref_index_first += 1;
		}	

	}

	//print_vector_alignment(alignment);

	for(k = i, l = 0; ref_index_first < second_start_index && k < pointer_first.alignment.size(); k++, l++)
	{
		
		assert(ref_index_first == ref_index_second);
		assert(pointer_first.alignment[k].first == pointer_second.alignment[l].first);		

		{
			if(pointer_first.quality.at(read_index_first) > 
				pointer_second.quality.at(read_index_second))
			{
				alignment.push_back(pointer_first.alignment[k]);
				quality.push_back(pointer_first.quality.at(read_index_first));
			}
			else
			{
				alignment.push_back(pointer_second.alignment[l]);
				quality.push_back(pointer_second.quality.at(read_index_second));
			}
		}

		ref_index_first += 1;
		ref_index_second += 1;

		read_index_first += 1;
		read_index_second += 1;
	}

	//cout << endl << endl;
	//print_vector_alignment(alignment);

	for(x = l; ref_index_second < second_last_index && x < pointer_second.alignment.size(); x++)
	{
		alignment.push_back(pointer_second.alignment[x]);
		//if(pointer_first.alignment[i].second != '-')
		{
			quality.push_back(pointer_second.quality.at(read_index_second));
			read_index_second += 1;
		}	
		//if(pointer_first.alignment[i].first != '-')
		{
			ref_index_second += 1;
		}	
	}

	read_end = read_index_second;
	ref_end = ref_index_second;
	
	string alignment_quality(quality.begin(), quality.end());
	fragment_alignment final_alignment_info;
	vector<string> final_result;
	vector<char> read;

	for(int k = 0; k < alignment.size(); k++)
	{
		final_alignment_info.alignment.push_back(alignment[k]);
		if(alignment[k].first == alignment[k].second && alignment[k].first != '-')
			match += 1;
		if(alignment[k].first != alignment[k].second && alignment[k].first != '-')
			mismatch += 1;
		if(alignment[k].first == '-' || alignment[k].second == '-')
			gaps += 1;

		read.push_back(alignment[k].second);
	}

	//cout << endl << endl;
	string readseq(read.begin(), read.end());
	//print_vector_alignment(alignment);
				
	final_alignment_info.total_len = alignment.size();
        final_alignment_info.identity_match = match;
        final_alignment_info.ref_start = ref_start;
        final_alignment_info.read_start = read_start;
        final_alignment_info.ref_end = ref_end;//total_ref_ind
        final_alignment_info.read_end = read_end;//total_read_ind
        final_alignment_info.ref_ind = 0;
        final_alignment_info.read_dir = 1;
        final_alignment_info.gaps = gaps;
        final_alignment_info.mismatches = mismatch;
	final_alignment_info.quality = alignment_quality;

	sam_format(final_alignment_info, refindex, readseq, sam_output_name, final_result, fp_detail);
	fp_sam << final_result[0];
	for(int k = 1; k < final_result.size(); k++)
        {
		fp_sam << "\t" << final_result[k];
                //cout << i << ": " << output[k] << endl;
	}		
	fp_sam << endl;

	/*
	fp_fastq << "> " << final_result[0] << endl;
	fp_fastq << final_result[9] << endl;
	fp_fastq << "+" << endl;
	fp_fastq << final_result[10] << endl;
	*/
	
	if(umap.find(final_result[5]) == umap.end())
	{
		umap[final_result[5]] = 1;
	}
	else
	{
		umap[final_result[5]] += 1;
		return;
	}
	
	//fp_fastq << ">" << final_result[0] << "|CIGAR=" << final_result[5] << endl;
	//fp_fastq << final_result[9] << endl;
	fp_fastq << final_result[0] << endl;
	fp_fastq << final_result[5] << endl;
	fp_fastq << final_result[9] << endl;

	print_alignment(final_alignment_info.alignment, refindex[0].ref, readseq, final_alignment_info.ref_start,
              	        0, 1, final_alignment_info, true, fp_detail);
	if(DEBUG == 99)
	{
		fp_detail << "reference = " << refindex[0].ref.substr(final_alignment_info.ref_start, 80) << endl;
		fp_detail << "for_read  = " << readseq.substr(0, 80) << endl << endl;
	}	
	assert(alignment_quality.length() == readseq.length());

	return;
}
Пример #3
0
void debug_sequence(const std::string& name, uint32_t seq_id, uint32_t read_id, const HMMInputSequence& sequence, const HMMInputData& data)
{
    std::vector<HMMAlignmentState> alignment = profile_hmm_align(sequence, data);
    print_alignment(name, seq_id, read_id, sequence, data, alignment);
}
Пример #4
0
/* Creates the output file with the alignment */
unsigned int results ( const char * filename,    /* output filename */
                       struct TSeq * t,          /* text */          
                       unsigned int n,           /* length of t */
                       struct TSeq * p,          /* pattern */
                       unsigned int m,           /* length of p */
                       double max_score, 
                       unsigned int min_gap, 
                       unsigned int where, 
                       unsigned int gap_pos, 
                       unsigned int swap, 
                       unsigned int matrix,
                       double gap_penalty,
                       double ext_penalty )
 {

   FILE          * output;
   unsigned int    min_mis = 0;        //the number of mismatches in the alignment
   char          * seq_gap;            //the sequence with the inserted gap 
   char          * mark_mis;           //a string with the mismatches marked as '|' (and the matches as ' ')
   
   
   /* dynamic memory allocation for seq_gap */
   if ( ! ( seq_gap = ( char * ) calloc ( n + 1 + min_gap + 1, sizeof ( char ) ) ) )
    {
      fprintf ( stderr, "Error: seq_gap could not be allocated!!!\n" );
      return ( 0 );
    } 
   
   /* dynamic memory allocation for mark_mis */
   if ( ! ( mark_mis = ( char* ) calloc ( n + min_gap + 1, sizeof( char ) ) ) )
    {
      fprintf ( stderr, "Error: mark_mis could not be allocated!!!\n" );
      return ( 0 );
    } 
   
   if ( ! ( output = fopen ( filename, "w" ) ) )
    {
      fprintf ( stderr, "Error: cannot open file %s!!!\n", filename );
      return ( 0 );
    }
   
   print_header ( output, filename, matrix, gap_penalty, ext_penalty );
   
   if ( where == 1 )                //gap is in the text
    {
      print_alignment ( t -> data, n, p -> data, m, min_gap, gap_pos, seq_gap, mark_mis, &min_mis );
      free ( t -> data );
      t -> data = seq_gap;
      if ( ! swap )
       {       
         wrap ( t, p, mark_mis, LINE_LNG, output ); 
       }
      else
       {        
         wrap ( p, t, mark_mis, LINE_LNG, output ); 
       }
    }
   else                            //gap is in the pattern
    {
      print_alignment ( p -> data, m, t -> data, n, min_gap, gap_pos, seq_gap, mark_mis, &min_mis );
      free ( p -> data );
      p -> data = seq_gap;
      if ( ! swap )
       {        
         wrap ( t, p, mark_mis, LINE_LNG, output ); 
       }
      else        
       {        
         wrap ( p, t, mark_mis, LINE_LNG, output ); 
       }
    }
   
   fprintf ( output, "\n" );
   fprintf ( output, "Alignment score: %lf\n", max_score );
   fprintf ( output, "Number of mismatches: %d\n", min_mis );
   fprintf ( output, "Length of gap: %d\n", min_gap );
   
   if( min_gap > 0 )
    {
      fprintf ( output, "The gap was inserted in %.13s after position %d\n", ( where == 1 ) ? t -> header : p -> header, gap_pos );
    }
   
   if ( fclose ( output ) ) 
           fprintf ( stderr, "Error: cannot close file %s!!!\n", filename );
   
   free ( mark_mis );
   
   return ( 1 );	
 }
Пример #5
0
int main(int argc, char* argv[])
{
    if(argc < 3)
    {
        std::cout
            << "Error: no se especificaron suficientes archivos de entrada." 
            << std::endl;
        return 1;
    }
    
    std::string filename1 = argv[1];
    std::string filename2 = argv[2];
    
    FASTAReader reader1(filename1);
    FASTAReader reader2(filename2);
    
    reader1.setDefault(0);
    reader2.setDefault(1);
    
    //matriz de sustitucion
    int smatrix[]{ 5, -4, -4, -4,
                -4,  5, -4, -4,
                -4, -4,  5, -4,
                -4, -4, -4,  5};
    int gap_open   = 10;
    int gap_extend =  1;
    int match = 5;
    int mismatch = -4;
    
    #pragma omp parallel
    {
        int seq_len = DEFAULT_SEQ_LEN;
        
        //container vectors for sequences
        Buffer<int16_t> seqs1(seq_len * VSIZE, ALNSIZE);
        Buffer<int16_t> seqs2(seq_len * VSIZE, ALNSIZE);
        
        //containers for ids
        std::vector<std::string> seqs1_ids(VSIZE);
        std::vector<std::string> seqs2_ids(VSIZE);
        
        
        
        //legths of sequences
        int seqs1_len[VSIZE];
        int seqs2_len[VSIZE];
        
        //containter for flags
        Buffer<int8_t> flags(seq_len * seq_len * VSIZE, ALNSIZE);
        int16_t __attribute((aligned(ALNSIZE))) scores[VSIZE];
        int16_t __attribute((aligned(ALNSIZE))) ipos[VSIZE];
        int16_t __attribute((aligned(ALNSIZE))) jpos[VSIZE];
        
        //containers for arrays
        int16_t inf = gap_open + gap_extend + 1;
        //int16_t aF[256 * VSIZE] __attribute((aligned(ALNSIZE))) = {(int16_t)(-inf)};
        //int16_t aH[256 * VSIZE] __attribute((aligned(ALNSIZE))) = {0};

        int bsize = 128 * VSIZE;
	
        //Buffer<int16_t> E(bsize, ALNSIZE);
        Buffer<int16_t> F(bsize, ALNSIZE);
        Buffer<int16_t> H(bsize, ALNSIZE);
        //int16_t __attribute((aligned(ALNSIZE))) H[128 * VSIZE];
        
        //alignments
        char aln1[256];
        char aln2[256];
        
        //max sizes
        int max_x, max_y;
        
        //alignment start position
        int x0, y0;
        
        while(read_seqs(reader1, reader2, &seqs1, &seqs2, seqs1_len, seqs2_len, 
              &seqs1_ids, &seqs2_ids))
        {
            max_x = *std::max_element(seqs1_len, seqs1_len + VSIZE) + 1;
            max_y = *std::max_element(seqs2_len, seqs2_len + VSIZE) + 1;
            //E.clear(-inf);
            F.clear(-inf);
            H.clear(0);
            //flags.clear(0);
	    
            smith_waterman(seqs1.data(), seqs2.data(), match, mismatch, gap_open, gap_extend, 
			   flags.data(), scores, ipos, jpos, max_x, max_y, F.data(), H.data());
            
            for(int i = 0; i < VSIZE; i++)
            {
                //std::cout << scores[i] << std::endl;
                //std::cout << ipos[i] << std::endl;
                //std::cout << jpos[i] << std::endl;
                sw_backtrack(i, flags.data(), seqs1.data(), seqs2.data(), max_x, max_y,
                    aln1, aln2, ipos[i], jpos[i], x0, y0);
                //puts(aln1);
                //puts(aln2);
                print_alignment (stdout, seqs1_ids, seqs2_ids, scores, 
                    aln1, aln2, strlen(aln1), i);
            }
        }
    }
    return 0;
}
void align_read_to_reference(string& readseq, string& read_name, fragment_alignment& final_alignment_info, string& quality,
				vector<string>& final_result, vector<reference_index>& refindex, meta_data& meta_details,  
				cell **matrix, ofstream& fp_sam, ofstream &fp_detail)
{
	int match_info, global_match = -1, indpos, find;
	int match = 0, gaps = 0, mismatch = 0, match_index;
	int ref_start, read_start, ref_end, read_end;
	int str1_end, str2_end, direction;
	int primer_length, except_primer;
	int ref_pointer, read_pointer;

	//vector<string> final_result;
	vector<pair<char, char> > alignment;
	//fragment_alignment final_alignment_info;
	
	bool flag;	
	string refgenome;
	char first, second;
	string final_read;
		
	for(int i = 0; i < refindex.size(); i++)
	{

		primer_length = meta_details.fprimer.length();
		except_primer = refindex[i].ref.length() - meta_details.rprimer.length();

		match = mismatch = gaps = str1_end = str2_end = 0;
		flag = find_alignment_direction(readseq, refindex[i], fp_detail);

		if(flag == false)
		{
			readseq = reverse_complement(readseq);
			reverse_str(quality);
		}
		
		if(refindex[i].ref.length() > readseq.length())
			refgenome = refindex[i].ref.substr(0, readseq.length());
		else
		{
			refgenome = refindex[i].ref;
			readseq = readseq.substr(0, refgenome.length());
			quality = quality.substr(0, refgenome.length());
		}

	
		fp_detail << "Reference length = " << refgenome.length() << endl;
		fp_detail << "Reference = " << refgenome << endl;//.substr(0, 80) << endl;
		fp_detail << "Readseq   length = " << readseq.length() << endl;
		fp_detail << "Readseq   = " << readseq << endl;//.substr(0, 80) << endl;
	
		find_kband_similarity(refgenome, readseq, alignment, str1_end, str2_end, matrix);

		fp_detail << "Reference alignment length = " << str1_end << endl;
		fp_detail << "Read      alignment length = " << str2_end << endl;
		fp_detail << "Quality      string length = " << quality.length() << endl;
	
		///////////////////////////////////////////////////////////////////////////////
		final_alignment_info.alignment.clear();
		final_alignment_info.quality = "";
		final_read = "";

		ref_pointer = read_pointer = 0;
		
		for(int k = alignment.size() - 1; k >= 0 && ref_pointer < except_primer; k--)
		{
			assert(ref_pointer <= str1_end);
			assert(read_pointer <= str2_end);

			if(ref_pointer < primer_length)
			{
				if(alignment[k].first != '-')
					ref_pointer += 1;
			
				if(alignment[k].second != '-')
					read_pointer += 1;

				continue;
			}
			
			final_alignment_info.alignment.push_back(alignment[k]);
			if(alignment[k].first == alignment[k].second && alignment[k].first != '-')
				match += 1;
			if(alignment[k].first != alignment[k].second && alignment[k].first != '-')
				mismatch += 1;
			if(alignment[k].first == '-' || alignment[k].second == '-')
				gaps += 1;

			if(alignment[k].first != '-')
				ref_pointer += 1;

			if(alignment[k].second != '-')
			{
				final_read += readseq.at(read_pointer);
				final_alignment_info.quality += quality.at(read_pointer);
				read_pointer += 1;
			}
			
		}

		read_start = 0;
		read_end = final_read.length();

		direction = 1;
		ref_start = primer_length;
		ref_end = ref_pointer;

		//////////////////////////////////////////////////////////////////////////////////		


		final_alignment_info.total_len = alignment.size();
                final_alignment_info.identity_match = match;
                final_alignment_info.ref_start = ref_start;
                final_alignment_info.read_start = read_start;
                final_alignment_info.ref_end = ref_end;//total_ref_ind
                final_alignment_info.read_end = read_end;//total_read_ind
                final_alignment_info.ref_ind = i;
                final_alignment_info.read_dir = direction;
                final_alignment_info.gaps = gaps;
                final_alignment_info.mismatches = mismatch;
		/*
		if(flag == true)
			final_alignment_info.quality = quality;
		else
		{
			//cout << "Quality = " << quality << endl;
			reverse(quality.begin(), quality.end());
			final_alignment_info.quality = quality;
			//cout << "Quality = " << quality << endl << endl;	
		}
		*/

		sam_format(final_alignment_info, refindex, final_read, read_name, final_result, fp_detail);

		fp_sam << final_result[0];
		for(int k = 1; k < final_result.size(); k++)
               	{
                       	fp_sam << "\t" << final_result[k];
                       	//cout << i << ": " << output[k] << endl;
               	}		
		fp_sam << endl;

		if(DEBUG == 99)
		{
			fp_detail << read_name << "," << refindex[i].name << "," << KMER << ",";
	       		fp_detail << final_alignment_info.read_start << "," << final_alignment_info.read_end << ",";
		       	fp_detail << final_alignment_info.ref_start << "," << final_alignment_info.ref_end << ",";
		       	fp_detail << final_alignment_info.gaps << "," << final_alignment_info.mismatches << ",";
		       	fp_detail << final_alignment_info.identity_match << "," << final_alignment_info.total_len << ",";
		       	fp_detail << (100.00 * final_alignment_info.identity_match / final_alignment_info.total_len) << ",";
		       	fp_detail << final_alignment_info.read_dir << "," << readseq.length() << ",";
		       	fp_detail << (100.00 * final_alignment_info.total_len / readseq.length()) << endl << endl << endl;
		}		
		/*
	  	for(int k = 0; k < 80; k++)
			cout << complement(alignment[k].first);
		cout << endl;
		for(int k = 0; k < 80; k++)
			cout << complement(alignment[k].second);
		cout << endl << endl;

		cout << "Reference = " << refindex[i].ref << endl;
		cout << "Input ===== " << readseq << endl << endl;
		
		for(int k = 0; k < 80; k++)
			cout << final_alignment_info.alignment[k].first;
		cout << endl;
		for(int k = 0; k < 80; k++)
			cout << final_alignment_info.alignment[k].second;
		cout << endl << endl;

		cout << "Reference = " << refindex[i].ref << endl;
		cout << "Input ===== " << readseq <<endl << endl;
		*/
		if(direction == 1)
		{
			print_alignment(final_alignment_info.alignment, refindex[i].ref, final_read, ref_start, 
				read_start, 1, final_alignment_info, true, fp_detail);
				
			if(DEBUG == 99)
			{
				fp_detail << "reference = " << refindex[i].ref.substr(final_alignment_info.ref_start, 80) << endl;
				fp_detail << "for_read  = " << readseq.substr(0, 80) << endl << endl;
			}		
		}
		else
			assert(false);

		/*else
		{
			readseq = reverse_complement(readseq);	
			print_alignment(final_alignment_info.alignment, refindex[i].ref, readseq, final_alignment_info.ref_start,
                	        0, 1, final_alignment_info, true, fp_detail);
			
			if(DEBUG == 99)
			{	
				fp_detail << "reference = " << refindex[i].ref.substr(final_alignment_info.ref_start, 80) << endl;
				fp_detail << "for_read  = " << readseq.substr(0, 80) << endl << endl;
			}		
		}
		*/
	
		alignment.clear();
		//final_result.clear();
		//final_alignment_info.alignment.clear();
		return;
	}
	
}
void align_read_to_reference(string& readseq, string& read_name, fragment_alignment& final_alignment_info, string& quality,
				vector<string>& final_result, vector<reference_index>& refindex, cell **matrix, ofstream& fp_sam, ofstream &fp_detail)
{
	int match_info, global_match = -1, indpos, find;
	int match = 0, gaps = 0, mismatch = 0, match_index;
	int ref_start, read_start, ref_end, read_end;
	int str1_end, str2_end, direction;

	//vector<string> final_result;
	vector<pair<char, char> > alignment;
	//fragment_alignment final_alignment_info;
	
	bool flag;	
	string refgenome;
	char first, second;
		
	for(int i = 0; i < refindex.size(); i++)
	{
		match = mismatch = gaps = str1_end = str2_end = 0;
		flag = find_alignment_direction(readseq, refindex[i], fp_detail);

		if(flag == true)
		{
			if(refindex[i].ref.length() > readseq.length())
				refgenome = refindex[i].ref.substr(0, readseq.length());
			else
			{
				refgenome = refindex[i].ref;
				readseq = readseq.substr(0, refgenome.length());
			}
		
			find_kband_similarity(refgenome, readseq, alignment, str1_end, str2_end, matrix);
	
			direction = 1;
			ref_start = 0;
			read_start = 0;
			ref_end = str1_end;
			read_end = str2_end;
		}
		else
		{
			if(refindex[i].rev.length() > readseq.length())
				refgenome = refindex[i].rev.substr(0, readseq.length());
			else
			{
				refgenome = refindex[i].rev;
				readseq = readseq.substr(0, refgenome.length());
			}
	
			find_kband_similarity(refgenome, readseq, alignment, str1_end, str2_end, matrix);
	
			direction = 2;
			ref_start = refindex[i].rev.length() - str1_end;
			read_start = 0;
			ref_end = refindex[i].rev.length();
			read_end = str2_end;

		}

		for(int k = alignment.size() - 1; k >= 0 && flag == true; k--)
		{
			final_alignment_info.alignment.push_back(alignment[k]);
			if(alignment[k].first == alignment[k].second && alignment[k].first != '-')
				match += 1;
			if(alignment[k].first != alignment[k].second && alignment[k].first != '-')
				mismatch += 1;
			if(alignment[k].first == '-' || alignment[k].second == '-')
				gaps += 1;
		}

		for(int k = 0; k < alignment.size() && flag == false; k++)
		{
			first = complement(alignment[k].first);
			second = complement(alignment[k].second);

			final_alignment_info.alignment.push_back(make_pair(first, second));
			if(alignment[k].first == alignment[k].second && alignment[k].first != '-')
				match += 1;
			if(alignment[k].first != alignment[k].second && alignment[k].first != '-')
				mismatch += 1;
			if(alignment[k].first == '-' || alignment[k].second == '-')
				gaps += 1;
		}

		final_alignment_info.total_len = alignment.size();
                final_alignment_info.identity_match = match;
                final_alignment_info.ref_start = ref_start;
                final_alignment_info.read_start = read_start;
                final_alignment_info.ref_end = ref_end;//total_ref_ind
                final_alignment_info.read_end = read_end;//total_read_ind
                final_alignment_info.ref_ind = i;
                final_alignment_info.read_dir = direction;
                final_alignment_info.gaps = gaps;
                final_alignment_info.mismatches = mismatch;
		if(flag == true)
			final_alignment_info.quality = quality;
		else
		{
			//cout << "Quality = " << quality << endl;
			reverse(quality.begin(), quality.end());
			final_alignment_info.quality = quality;
			//cout << "Quality = " << quality << endl << endl;	
		}

		sam_format(final_alignment_info, refindex, readseq, read_name, final_result, fp_detail);

		fp_sam << final_result[0];
		for(int k = 1; k < final_result.size(); k++)
               	{
                       	fp_sam << "\t" << final_result[k];
                       	//cout << i << ": " << output[k] << endl;
               	}		
		fp_sam << endl;

		if(DEBUG == 99)
		{
			fp_detail << read_name << "," << refindex[i].name << "," << KMER << ",";
	       		fp_detail << final_alignment_info.read_start << "," << final_alignment_info.read_end << ",";
		       	fp_detail << final_alignment_info.ref_start << "," << final_alignment_info.ref_end << ",";
		       	fp_detail << final_alignment_info.gaps << "," << final_alignment_info.mismatches << ",";
		       	fp_detail << final_alignment_info.identity_match << "," << final_alignment_info.total_len << ",";
		       	fp_detail << (100.00 * final_alignment_info.identity_match / final_alignment_info.total_len) << ",";
		       	fp_detail << final_alignment_info.read_dir << "," << readseq.length() << ",";
		       	fp_detail << (100.00 * final_alignment_info.total_len / readseq.length()) << endl << endl << endl;
		}		
		/*
	  	for(int k = 0; k < 80; k++)
			cout << complement(alignment[k].first);
		cout << endl;
		for(int k = 0; k < 80; k++)
			cout << complement(alignment[k].second);
		cout << endl << endl;

		cout << "Reference = " << refindex[i].ref << endl;
		cout << "Input ===== " << readseq << endl << endl;
		
		for(int k = 0; k < 80; k++)
			cout << final_alignment_info.alignment[k].first;
		cout << endl;
		for(int k = 0; k < 80; k++)
			cout << final_alignment_info.alignment[k].second;
		cout << endl << endl;

		cout << "Reference = " << refindex[i].ref << endl;
		cout << "Input ===== " << readseq <<endl << endl;
		*/
		if(direction == 1)
		{
			print_alignment(final_alignment_info.alignment, refindex[i].ref, readseq, 0, 
				0, 1, final_alignment_info, true, fp_detail);
				
			if(DEBUG == 99)
			{
				fp_detail << "reference = " << refindex[i].ref.substr(final_alignment_info.ref_start, 80) << endl;
				fp_detail << "for_read  = " << readseq.substr(0, 80) << endl << endl;
			}		
		}
		else
		{
			readseq = reverse_complement(readseq);	
			print_alignment(final_alignment_info.alignment, refindex[i].ref, readseq, final_alignment_info.ref_start,
                	        0, 1, final_alignment_info, true, fp_detail);
			
			if(DEBUG == 99)
			{	
				fp_detail << "reference = " << refindex[i].ref.substr(final_alignment_info.ref_start, 80) << endl;
				fp_detail << "for_read  = " << readseq.substr(0, 80) << endl << endl;
			}		
		}
			
		alignment.clear();
		//final_result.clear();
		//final_alignment_info.alignment.clear();
		return;
	}
	
}