1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
|
/////////////////////////////////////////////////////////////////////////////
// File: gnPosSpecificTranslator.cpp
// Purpose: Special case ORF translation
// Description: Used to translate sequences differently based on the position of
// input characters. Useful for tranlating genes because the first
// codon is translated differently
// Changes:
// Version: libGenome 0.5.1
// Author: Aaron Darling
// Modified by:
// Copyright: (c) Aaron Darling
// Licenses: See COPYING file for details
/////////////////////////////////////////////////////////////////////////////
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "libGenome/gnPosSpecificTranslator.h"
using namespace std;
namespace genome {
// static data access, avoids static initialization order fiasco
const gnPosSpecificTranslator *gnPosSpecificTranslator::ProteinDNATranslator(){
const static gnPosSpecificTranslator* t_trans = new gnPosSpecificTranslator(ProteinDNATranslatorType);
return t_trans;
}
const gnPosSpecificTranslator *gnPosSpecificTranslator::DNAProteinTranslator(){
const static gnPosSpecificTranslator* t_trans = new gnPosSpecificTranslator(DNAProteinTranslatorType);
return t_trans;
}
// public:
gnPosSpecificTranslator::gnPosSpecificTranslator()
{
}
gnPosSpecificTranslator::gnPosSpecificTranslator( const gnPosSpecificTranslator &sf )
{
m_name = sf.m_name;
}
gnPosSpecificTranslator::gnPosSpecificTranslator( gnTranslatorType t_type )
{
m_type = t_type;
switch(t_type){
case ProteinDNATranslatorType:
// not special done for this case
filter = gnFastTranslator::ProteinDNATranslator();
break;
case DNAProteinTranslatorType:
filter = gnFastTranslator::DNAProteinTranslator();
break;
}
}
// gnSeqC
gnSeqC gnPosSpecificTranslator::Filter( const gnSeqC ch ) const{
return filter->Filter(ch);
}
void gnPosSpecificTranslator::Filter( gnSeqC** seq, gnSeqI& len ) const{
return filter->Filter(seq, len);
}
// string
void gnPosSpecificTranslator::Filter( string &seq ) const{
switch(m_type){
case ProteinDNATranslatorType:
filter->Filter( seq );
break;
case DNAProteinTranslatorType:
string first_codon = seq.substr(0,3);
string original_sequence = seq;
filter->Filter( seq );
for(int charI = 0; charI < first_codon.length(); charI++ )
first_codon[charI] = tolower(first_codon[charI]);
if( first_codon == "ttg" || first_codon == "gtg" )
seq[0] = 'M';
// replace . with selenocysteine U where appropriate
string::size_type dot_pos = seq.find( "." );
while( dot_pos != string::npos ){
if( dot_pos == seq.size() - 1 )
break; // dont convert the final residue!
string dot_codon = original_sequence.substr( dot_pos * 3, 3 );
dot_codon[0] = tolower( dot_codon[0] );
dot_codon[1] = tolower( dot_codon[1] );
dot_codon[2] = tolower( dot_codon[2] );
if( dot_codon == "tga" )
seq[ dot_pos ] = 'U';
dot_pos = seq.find( ".", dot_pos + 1 );
}
break;
}
}
} // end namespace genome
|