src/gnPosSpecificTranslator.cpp

Go to the documentation of this file.
00001 00002 // File: gnPosSpecificTranslator.cpp 00003 // Purpose: Special case ORF translation 00004 // Description: Used to translate sequences differently based on the position of 00005 // input characters. Useful for tranlating genes because the first 00006 // codon is translated differently 00007 // Changes: 00008 // Version: libGenome 0.5.1 00009 // Author: Aaron Darling 00010 // Modified by: 00011 // Copyright: (c) Aaron Darling 00012 // Licenses: See COPYING file for details 00014 00015 #include "gn/gnPosSpecificTranslator.h" 00016 00017 // static data access, avoids static initialization order fiasco 00018 const gnPosSpecificTranslator *gnPosSpecificTranslator::ProteinDNATranslator(){ 00019 const static gnPosSpecificTranslator* t_trans = new gnPosSpecificTranslator(ProteinDNATranslatorType); 00020 return t_trans; 00021 } 00022 const gnPosSpecificTranslator *gnPosSpecificTranslator::DNAProteinTranslator(){ 00023 const static gnPosSpecificTranslator* t_trans = new gnPosSpecificTranslator(DNAProteinTranslatorType); 00024 return t_trans; 00025 } 00026 00027 // public: 00028 gnPosSpecificTranslator::gnPosSpecificTranslator() 00029 { 00030 } 00031 00032 gnPosSpecificTranslator::gnPosSpecificTranslator( const gnPosSpecificTranslator &sf ) 00033 { 00034 m_name = sf.m_name; 00035 } 00036 gnPosSpecificTranslator::gnPosSpecificTranslator( gnTranslatorType t_type ) 00037 { 00038 m_type = t_type; 00039 switch(t_type){ 00040 case ProteinDNATranslatorType: 00041 // not special done for this case 00042 filter = gnFastTranslator::ProteinDNATranslator(); 00043 break; 00044 case DNAProteinTranslatorType: 00045 filter = gnFastTranslator::DNAProteinTranslator(); 00046 break; 00047 } 00048 } 00049 00050 // gnSeqC 00051 gnSeqC gnPosSpecificTranslator::Filter( const gnSeqC ch ) const{ 00052 return filter->Filter(ch); 00053 } 00054 00055 void gnPosSpecificTranslator::Filter( gnSeqC** seq, gnSeqI& len ) const{ 00056 return filter->Filter(seq, len); 00057 } 00058 // string 00059 void gnPosSpecificTranslator::Filter( string &seq ) const{ 00060 switch(m_type){ 00061 case ProteinDNATranslatorType: 00062 filter->Filter( seq ); 00063 break; 00064 case DNAProteinTranslatorType: 00065 string first_codon = seq.substr(0,3); 00066 string original_sequence = seq; 00067 filter->Filter( seq ); 00068 for(int charI = 0; charI < first_codon.length(); charI++ ) 00069 first_codon[charI] = tolower(first_codon[charI]); 00070 if( first_codon == "ttg" || first_codon == "gtg" ) 00071 seq[0] = 'M'; 00072 // replace . with selenocysteine U where appropriate 00073 string::size_type dot_pos = seq.find( "." ); 00074 while( dot_pos != string::npos ){ 00075 if( dot_pos == seq.size() - 1 ) 00076 break; // dont convert the final residue! 00077 string dot_codon = original_sequence.substr( dot_pos * 3, 3 ); 00078 dot_codon[0] = tolower( dot_codon[0] ); 00079 dot_codon[1] = tolower( dot_codon[1] ); 00080 dot_codon[2] = tolower( dot_codon[2] ); 00081 if( dot_codon == "tga" ) 00082 seq[ dot_pos ] = 'U'; 00083 dot_pos = seq.find( ".", dot_pos + 1 ); 00084 } 00085 break; 00086 } 00087 }

Generated on Mon Feb 14 19:28:20 2005 for libGenome by doxygen 1.3.8