annotate consol_fit.py @ 5:deb5134655cb draft

Uploaded
author kaymccoy
date Thu, 11 Aug 2016 18:34:10 -0400
parents 7d2f2d1a23ee
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
1 # Consol_fit! It's a script & it'll consolidate your fitness values if you got them from a looping trimming pipeline instead of the standard split-by-transposon pipeline. That's it!
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
2
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
3 # Test: python ../script/consol_fit.py -calctxt results/py_2_L3_2394eVI_Gluc.txt -wig gview/consol_L3_2394eVI_Gluc.wig -i results/py_L3_2394eVI_Gluc.csv -out results/consol_L3_2394eVI_Gluc.csv -out2 results/py_2_L3_2394eVI_Gluc.csv -normalize tigr4_normal.txt
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
4
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
5 # Test: python ../script/consol_fit.py -calctxt results/py_2_L3_2394eVI_Gluc.txt -wig gview/consol_L3_2394eVI_Gluc.wig -i results/galaxy_test.csv -out results/consol_L3_2394eVI_Gluc.csv -out2 results/py_2_L3_2394eVI_Gluc.csv -normalize tigr4_normal.txt
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
6
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
7 import math
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
8 import csv
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
9
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
10
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
11
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
12
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
13
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
14
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
15
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
16
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
17
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
18
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
19 ##### ARGUMENTS #####
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
20
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
21 def print_usage():
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
22 print "\n" + "You are missing one or more required flags. A complete list of flags accepted by calc_fitness is as follows:" + "\n\n"
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
23 print "\033[1m" + "Required" + "\033[0m" + "\n"
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
24 print "-i" + "\t\t" + "The calc_fit file to be consolidated" + "\n"
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
25 print "-out" + "\t\t" + "Name of a file to enter the .csv output." + "\n"
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
26 print "-out2" + "\t\t" + "Name of a file to put the percent blank score in (used in aggregate)." + "\n"
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
27 print "-calctxt" + "\t\t" + "The txt file output from calc_fit" + "\n"
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
28 print "-normalize" + "\t" + "A file that contains a list of genes that should have a fitness of 1" + "\n"
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
29 print "\n"
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
30 print "\033[1m" + "Optional" + "\033[0m" + "\n"
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
31 print "-cutoff" + "\t\t" + "Discard any positions where the average of counted transcripts at time 0 and time 1 is below this number (default 0)" + "\n"
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
32 print "-cutoff2" + "\t\t" + "Discard any positions within the normalization genes where the average of counted transcripts at time 0 and time 1 is below this number (default 0)" + "\n"
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
33 print "-wig" + "\t\t" + "Create a wiggle file for viewing in a genome browser. Provide a filename." + "\n"
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
34 print "-maxweight" + "\t" + "The maximum weight a transposon gene can have in normalization calculations" + "\n"
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
35 print "-multiply" + "\t" + "Multiply all fitness scores by a certain value (e.g., the fitness of a knockout). You should normalize the data." + "\n"
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
36 print "\n"
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
37
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
38 import argparse
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
39 parser = argparse.ArgumentParser()
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
40 parser.add_argument("-calctxt", action="store", dest="calctxt")
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
41 parser.add_argument("-normalize", action="store", dest="normalize")
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
42 parser.add_argument("-i", action="store", dest="input")
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
43 parser.add_argument("-out", action="store", dest="outfile")
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
44 parser.add_argument("-out2", action="store", dest="outfile2")
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
45 parser.add_argument("-cutoff", action="store", dest="cutoff")
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
46 parser.add_argument("-cutoff2", action="store", dest="cutoff2")
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
47 parser.add_argument("-wig", action="store", dest="wig")
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
48 parser.add_argument("-maxweight", action="store", dest="max_weight")
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
49 parser.add_argument("-multiply", action="store", dest="multiply")
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
50 arguments = parser.parse_args()
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
51
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
52 # Checks that all the required arguments have actually been entered
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
53
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
54 if (not arguments.input or not arguments.outfile or not arguments.calctxt):
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
55 print_usage()
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
56 quit()
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
57
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
58 #
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
59
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
60 if (not arguments.max_weight):
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
61 arguments.max_weight = 75
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
62
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
63 #
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
64
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
65 if (not arguments.cutoff):
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
66 arguments.cutoff = 0
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
67
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
68 # Sets the default value of cutoff2 to 10; cutoff2 exists to discard positions within normalization genes with a low number of counted transcripts, because fitnesses calculated from them similarly may not be very accurate.
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
69 # This only has an effect if it's larger than cutoff, since the normalization step references a list of insertions already affected by cutoff.
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
70
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
71 if (not arguments.cutoff2):
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
72 arguments.cutoff2 = 10
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
73
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
74 #Gets total & refname from calc_fit outfile2
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
75
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
76 with open(arguments.calctxt) as file:
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
77 calctxt = file.readlines()
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
78 total = float(calctxt[1].split()[1])
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
79 refname = calctxt[2].split()[1]
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
80
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
81
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
82
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
83
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
84
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
85
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
86
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
87
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
88
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
89
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
90 ##### CONSOLIDATING THE CALC_FIT FILE #####
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
91
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
92 with open(arguments.input) as file:
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
93 input = file.readlines()
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
94 results = [["position", "strand", "count_1", "count_2", "ratio", "mt_freq_t1", "mt_freq_t2", "pop_freq_t1", "pop_freq_t2", "gene", "D", "W", "nW"]]
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
95 i = 1
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
96 d = float(input[i].split(",")[10])
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
97 while i < len(input):
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
98 position = float(input[i].split(",")[0])
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
99 strands = input[i].split(",")[1]
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
100 c1 = float(input[i].split(",")[2])
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
101 c2 = float(input[i].split(",")[3])
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
102 gene = input[i].split(",")[9]
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
103 while i + 1 < len(input) and float(input[i+1].split(",")[0]) - position <= 4:
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
104 if i + 1 < len(input):
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
105 i += 1
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
106 c1 += float(input[i].split(",")[2])
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
107 c2 += float(input[i].split(",")[3])
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
108 strands = input[i].split(",")[1]
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
109 if strands[0] == 'b':
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
110 new_strands = 'b/'
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
111 elif strands[0] == '+':
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
112 if input[i].split(",")[1][0] == 'b':
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
113 new_strands = 'b/'
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
114 elif input[i].split(",")[1][0] == '+':
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
115 new_strands = '+/'
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
116 elif input[i].split(",")[1][0] == '-':
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
117 new_strands = 'b/'
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
118 elif strands[0] == '-':
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
119 if input[i].split(",")[1][0] == 'b':
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
120 new_strands = 'b/'
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
121 elif input[i].split(",")[1][0] == '+':
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
122 new_strands = 'b/'
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
123 elif input[i].split(",")[1][0] == '-':
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
124 new_strands = '-/'
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
125 if len(strands) == 3:
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
126 if len(input[i].split(",")[1]) < 3:
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
127 new_strands += strands[2]
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
128 elif strands[0] == 'b':
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
129 new_strands += 'b'
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
130 elif strands[0] == '+':
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
131 if input[i].split(",")[1][2] == 'b':
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
132 new_strands += 'b'
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
133 elif input[i].split(",")[1][2] == '+':
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
134 new_strands += '+'
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
135 elif input[i].split(",")[1][2] == '-':
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
136 new_strands += 'b'
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
137 elif strands[0] == '-':
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
138 if input[i].split(",")[1][2] == 'b':
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
139 new_strands += 'b'
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
140 elif input[i].split(",")[1][2] == '+':
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
141 new_strands += 'b'
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
142 elif input[i].split(",")[1][2] == '-':
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
143 new_strands += '-'
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
144 else:
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
145 if len(input[i].split(",")[1]) == 3:
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
146 new_strands += input[i].split(",")[1][2]
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
147 strands = new_strands
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
148 i +=1
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
149 if c2 != 0:
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
150 ratio = c2/c1
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
151 else:
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
152 ratio = 0
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
153 mt_freq_t1 = c1/total
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
154 mt_freq_t2 = c2/total
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
155 pop_freq_t1 = 1 - mt_freq_t1
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
156 pop_freq_t2 = 1 - mt_freq_t2
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
157 w = 0
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
158 if mt_freq_t2 != 0:
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
159 top_w = math.log(mt_freq_t2*(d/mt_freq_t1))
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
160 bot_w = math.log(pop_freq_t2*(d/pop_freq_t1))
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
161 w = top_w/bot_w
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
162 row = [position, strands, c1, c2, ratio, mt_freq_t1, mt_freq_t2, pop_freq_t1, pop_freq_t2, gene, d, w, w]
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
163 results.append(row)
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
164 with open(arguments.outfile, "wb") as csvfile:
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
165 writer = csv.writer(csvfile)
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
166 writer.writerows(results)
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
167
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
168
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
169
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
170
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
171
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
172
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
173
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
174
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
175
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
176
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
177 ##### REDOING NORMALIZATION #####
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
178
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
179 # If making a WIG file is requested in the arguments, starts a string to be added to and then written to the WIG file with a typical WIG file header.
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
180 # The header is just in a typical WIG file format; if you'd like to look into this more UCSC has notes on formatting WIG files on their site.
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
181
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
182 if (arguments.wig):
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
183 wigstring = "track type=wiggle_0 name=" + arguments.wig + "\n" + "variableStep chrom=" + refname + "\n"
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
184
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
185 # If a file's given for normalization, starts normalization; this corrects for anything that would cause all the fitness values to be too high or too low.
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
186
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
187 if (arguments.normalize):
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
188
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
189 # Makes a list of the genes in the normalization file, which should all be transposon genes (these naturally ought to have a fitness value of exactly 1, because transposons are generally non-coding DNA)
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
190
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
191 with open(arguments.normalize) as file:
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
192 transposon_genes = file.read().splitlines()
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
193 print "Normalize genes loaded" + "\n"
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
194 blank_ws = 0
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
195 sum = 0
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
196 count = 0
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
197 weights = []
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
198 scores = []
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
199 for list in results:
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
200
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
201 # Finds all insertions within one of the normalization genes that also have a w value; gets their c1 and c2 values (the number of insertions at t1 and t2) and takes the average of that!
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
202 # The average is later used as the "weight" of an insertion location's fitness - if it's had more insertions, it should weigh proportionally more towards the average fitness of insertions within the normalization genes.
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
203
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
204 if list[9] != '' and list[9] in transposon_genes and list[11]:
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
205 c1 = list[2]
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
206 c2 = list[3]
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
207 score = list[11]
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
208 avg = (c1 + c2)/2
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
209
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
210 # Skips over those insertion locations with too few insertions - their fitness values are less accurate because they're based on such small insertion numbers.
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
211
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
212 if float(c1) >= float(arguments.cutoff2):
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
213
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
214 # Sets a max weight, to prevent insertion location scores with huge weights from unbalancing the normalization.
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
215
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
216 if (avg >= float(arguments.max_weight)):
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
217 avg = float(arguments.max_weight)
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
218
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
219 # Tallies how many w values are 0 within the blank_ws value; you might get many transposon genes with a w value of 0 if a bottleneck occurs, which is especially common with in vivo experiments.
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
220 # For example, when studying a nasal infection in a mouse model, what bacteria "sticks" and is able to survive and what bacteria is swallowed and killed or otherwise flushed out tends to be a matter
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
221 # of chance not fitness; all mutants with an insertion in a specific transposon gene could be flushed out by chance!
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
222
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
223 if score == 0:
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
224 blank_ws += 1
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
225
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
226 # Adds the fitness values of the insertions within normalization genes together and increments count so their average fitness (sum/count) can be calculated later on
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
227
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
228 sum += score
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
229 count += 1
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
230
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
231 # Records the weights of the fitness values of the insertion locations in corresponding lists - for example, weights[2] would be the weight of the fitness value at score[2]
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
232
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
233 weights.append(avg)
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
234 scores.append(score)
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
235
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
236 print str(list[9]) + " " + str(score) + " " + str(c1)
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
237
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
238 # Counts and removes all "blank" fitness values of normalization genes - those that = 0 - because they most likely don't really have a fitness value of 0, and you just happened to not get any reads from that location at t2.
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
239
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
240 blank_count = 0
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
241 original_count = len(scores)
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
242 i = 0
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
243 while i < original_count:
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
244 w_value = scores[i]
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
245 if w_value == 0:
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
246 blank_count += 1
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
247 weights.pop[i]
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
248 scores.pop[i]
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
249 i-=1
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
250 i += 1
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
251
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
252 # If no normalization genes can pass the cutoff, normalization cannot occur, so this ends the script advises the user to try again and lower cutoff and/or cutoff2.
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
253
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
254 if len(scores) == 0:
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
255 print 'ERROR: The normalization genes do not have enough reads to pass cutoff and/or cutoff2; please lower one or both of those arguments.' + "\n"
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
256 quit()
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
257
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
258 # Prints the number of of blank fitness values found and removed for reference. Writes the percentage to a file so it can be referenced for aggregate analysis.
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
259
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
260 pc_blank_normals = float(blank_count) / float(original_count)
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
261 print "# blank out of " + str(original_count) + ": " + str(pc_blank_normals) + "\n"
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
262 with open(arguments.outfile2, "w") as f:
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
263 f.write("blanks: " + str(pc_blank_normals) + "\n" + "total: " + str(total) + "\n" + "refname: " + refname)
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
264
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
265
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
266 # Finds "average" - the average fitness value for an insertion within the transposon genes - and "weighted_average" - the average fitness value for an insertion within the transposon genes weighted by how many insertions each had.
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
267
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
268 average = sum / count
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
269 i = 0
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
270 weighted_sum = 0
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
271 weight_sum = 0
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
272 while i < len(weights):
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
273 weighted_sum += weights[i]*scores[i]
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
274 weight_sum += weights[i]
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
275 i += 1
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
276 weighted_average = weighted_sum/weight_sum
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
277
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
278 # Prints the regular average, weighted average, and total insertions for reference
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
279
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
280 print "Normalization step:" + "\n"
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
281 print "Regular average: " + str(average) + "\n"
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
282 print "Weighted Average: " + str(weighted_average) + "\n"
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
283 print "Total Insertions: " + str(count) + "\n"
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
284
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
285 # The actual normalization happens here; every fitness score is divided by the average fitness found for genes that should have a value of 1.
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
286 # For example, if the average fitness for genes was too low overall - let's say 0.97 within the normalization geness - every fitness would be proportionally raised.
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
287
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
288 old_ws = 0
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
289 new_ws = 0
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
290 wcount = 0
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
291 for list in results:
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
292 if list[11] == 'W':
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
293 continue
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
294 new_w = float(list[11])/weighted_average
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
295
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
296 # Sometimes you want to multiply all the fitness values by a constant; this does that.
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
297 # For example you might multiply all the values by a constant for a genetic interaction screen - where Tn-Seq is performed as usual except there's one background knockout all the mutants share. This is
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
298 # because independent mutations should have a fitness value that's equal to their individual fitness values multipled, but related mutations will deviate from that; to find those deviations you'd multiply
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
299 # all the fitness values from mutants from a normal library by the fitness of the background knockout and compare that to the fitness values found from the knockout library!
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
300
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
301 if arguments.multiply:
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
302 new_w *= float(arguments.multiply)
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
303
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
304 # Records the old w score for reference, and adds it to a total sum of all w scores (so that the old w mean and new w mean can be printed later).
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
305
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
306 if float(list[11]) > 0:
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
307 old_ws += float(list[11])
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
308 new_ws += new_w
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
309 wcount += 1
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
310
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
311 # Writes the new w score into the results list of lists.
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
312
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
313 list[12] = new_w
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
314
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
315 # Adds a line to wiglist for each insertion position, with the insertion position and its new w value.
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
316
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
317 if (arguments.wig):
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
318 wigstring += str(list[0]) + " " + str(new_w) + "\n"
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
319
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
320 # Prints the old w mean and new w mean for reference.
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
321
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
322 old_w_mean = old_ws / wcount
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
323 new_w_mean = new_ws / wcount
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
324 print "Old W Average: " + str(old_w_mean) + "\n"
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
325 print "New W Average: " + str(new_w_mean) + "\n"
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
326
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
327 # Overwrites the old file with the normalized file.
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
328
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
329 with open(arguments.outfile, "wb") as csvfile:
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
330 writer = csv.writer(csvfile)
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
331 writer.writerows(results)
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
332
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
333 # If a WIG file was requested, actually creates the WIG file and writes wiglist to it
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
334 # So what's written here is the WIG header plus each insertion position and it's new w value if normalization were called for, and each insertion position and its unnormalized w value if normalization were not called for.
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
335
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
336 if (arguments.wig):
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
337 if (arguments.normalize):
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
338 with open(arguments.wig, "wb") as wigfile:
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
339 wigfile.write(wigstring)
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
340 else:
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
341 for list in results:
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
342 wigstring += str(list[0]) + " " + str(list[11]) + "\n"
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
343 with open(arguments.wig, "wb") as wigfile:
7d2f2d1a23ee Uploaded
kaymccoy
parents:
diff changeset
344 wigfile.write(wigstring)