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.1.0 00009 // Author: Aaron Darling 00010 // Last Edited: March 18, 2001, 10:34:50pm 00011 // Modified by: 00012 // Copyright: (c) Aaron Darling 00013 // Licenses: Proprietary 00015 00016 #include "gn/gnPosSpecificTranslator.h" 00017 00018 // static data access, avoids static initialization order fiasco 00019 const gnPosSpecificTranslator *gnPosSpecificTranslator::ProteinDNATranslator(){ 00020 const static gnPosSpecificTranslator* t_trans = new gnPosSpecificTranslator(ProteinDNATranslatorType); 00021 return t_trans; 00022 } 00023 const gnPosSpecificTranslator *gnPosSpecificTranslator::DNAProteinTranslator(){ 00024 const static gnPosSpecificTranslator* t_trans = new gnPosSpecificTranslator(DNAProteinTranslatorType); 00025 return t_trans; 00026 } 00027 00028 // public: 00029 gnPosSpecificTranslator::gnPosSpecificTranslator() 00030 { 00031 } 00032 00033 gnPosSpecificTranslator::gnPosSpecificTranslator( const gnPosSpecificTranslator &sf ) 00034 { 00035 m_name = sf.m_name; 00036 } 00037 gnPosSpecificTranslator::gnPosSpecificTranslator( gnTranslatorType t_type ) 00038 { 00039 m_type = t_type; 00040 switch(t_type){ 00041 case ProteinDNATranslatorType: 00042 // not special done for this case 00043 filter = gnFastTranslator::ProteinDNATranslator(); 00044 break; 00045 case DNAProteinTranslatorType: 00046 filter = gnFastTranslator::DNAProteinTranslator(); 00047 break; 00048 } 00049 } 00050 00051 // gnSeqC 00052 gnSeqC gnPosSpecificTranslator::Filter( const gnSeqC ch ) const{ 00053 return filter->Filter(ch); 00054 } 00055 00056 void gnPosSpecificTranslator::Filter( gnSeqC** seq, uint32& len ) const{ 00057 return filter->Filter(seq, len); 00058 } 00059 // string 00060 void gnPosSpecificTranslator::Filter( string &seq ) const{ 00061 switch(m_type){ 00062 case ProteinDNATranslatorType: 00063 filter->Filter( seq ); 00064 break; 00065 case DNAProteinTranslatorType: 00066 string first_codon = seq.substr(0,3); 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 break; 00073 } 00074 }