-
Notifications
You must be signed in to change notification settings - Fork 0
/
qPCR_ref_gene_finder.py
63 lines (48 loc) · 1.76 KB
/
qPCR_ref_gene_finder.py
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
### Boas Pucker ###
### bpucker@cebitec.uni-bielefeld.de ###
### v0.1 ###
__usage__ = """
python qPCR_ref_gene_finder.py
--exp <FULL_PATH_TO_EXPRESSION_FILE>
--out <FULL_PATH_TO_OUTPUT_FILE>
bug reports and feature requests: bpucker@cebitec.uni-bielefeld.de
"""
import numpy as np
from operator import itemgetter
import sys
# --- end of imports --- #
def load_expression_values( data_file ):
"""! @brief load expression values """
exp_data = {}
with open( data_file, "r" ) as f:
headers = f.readline().strip().split('\t')[1:]
line = f.readline()
while line:
parts = line.strip().split('\t')
exp_data.update( { parts[0]: map( float, parts[1:] ) } )
line = f.readline()
return exp_data
def main( arguments ):
"""! @brief runs everything """
data_file = arguments[ arguments.index( '--exp' ) +1 ]
report_file = arguments[ arguments.index( '--out' ) +1 ]
expression = load_expression_values( data_file )
exp_cutoff = 10
gene_characteristics = []
for gene in expression.keys():
avg = np.median( expression[ gene ] )
if avg > 0:
dev = np.std( expression[ gene ] ) / avg
if avg > exp_cutoff and min( expression[ gene ] ) > exp_cutoff:
gene_characteristics.append( { 'id': gene, 'avg': avg, 'dev': dev } )
gene_characteristics.sort( key=itemgetter( 'avg' ), reverse=True )
gene_characteristics.sort( key=itemgetter( 'dev' ) )
with open( report_file, "w" ) as out:
out.write( "GeneID\tNormalizedStandardDeviation\tAverageExpression\n" )
for candidate in gene_characteristics:
out.write( "\t".join( map( str, [ candidate['id'], candidate['dev'], candidate['avg'] ] ) ) + '\n' )
if __name__ == '__main__':
if '--exp' in sys.argv and '--out' in sys.argv:
main( sys.argv )
else:
sys.exit( __usage__ )