File: gnPosSpecificTranslator.cpp

package info (click to toggle)
libgenome 1.3.1-7
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 2,156 kB
  • ctags: 1,212
  • sloc: cpp: 10,910; sh: 8,264; makefile: 79
file content (98 lines) | stat: -rw-r--r-- 3,056 bytes parent folder | download | duplicates (8)
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