0
|
1 """
|
|
2 @summary: MAP and PARSE
|
|
3 @version 7
|
|
4
|
|
5 """
|
|
6 # MAPPER --> save only QTL output
|
|
7
|
|
8 # Input: qtlcart.inp
|
|
9 # qtlcart.map
|
|
10 # parameters.txt
|
|
11
|
|
12 # Output: QTLs_total.txt
|
|
13
|
|
14 import optparse, sys
|
|
15 import tempfile
|
|
16 import re
|
|
17
|
|
18 def stop_err( msg ):
|
|
19 sys.stderr.write( "%s\n" % msg )
|
|
20 sys.exit()
|
|
21
|
|
22 def __main__():
|
|
23 parser = optparse.OptionParser()
|
|
24 parser.add_option("-i", "--input1", default=None, dest="input1",
|
|
25 help="qtlcart.inp file")
|
|
26 parser.add_option("-j", "--input2", default=None, dest="input2",
|
|
27 help="qtlcart.map file")
|
|
28 parser.add_option("-k", "--input3", default=None, dest="input3",
|
|
29 help="parameters.txt file")
|
|
30
|
|
31 parser.add_option("-o", "--output1", default=None, dest="output1",
|
|
32 help="QTLs_total.txt file")
|
|
33 (options, args) = parser.parse_args()
|
|
34
|
|
35 try:
|
|
36 open(options.input1, "r").close()
|
|
37 except TypeError, e:
|
|
38 stop_err("You need to supply the qtlcart.inp file:\n" + str(e))
|
|
39 except IOError, e:
|
|
40 stop_err("Can not open the qtlcart.inp file:\n" + str(e))
|
|
41
|
|
42 try:
|
|
43 open(options.input2, "r").close()
|
|
44 except TypeError, e:
|
|
45 stop_err("You need to supply the qtlcart.map file:\n" + str(e))
|
|
46 except IOError, e:
|
|
47 stop_err("Can not open the qtlcart.map file:\n" + str(e))
|
|
48
|
|
49 try:
|
|
50 open(options.input3, "r").close()
|
|
51 except TypeError, e:
|
|
52 stop_err("You need to supply the parameters.txt file:\n" + str(e))
|
|
53 except IOError, e:
|
|
54 stop_err("Can not open the parameters.txt file:\n" + str(e))
|
|
55
|
|
56 ######################################################################
|
|
57 # submit.py
|
|
58 ######################################################################
|
|
59
|
|
60 import subprocess
|
|
61 import os
|
|
62
|
|
63 # Create temp direcotry
|
|
64 tempdir = tempfile.mkdtemp()
|
|
65 #print tempdir
|
|
66
|
|
67 s = "cp %s %s/parameters.txt" %(options.input3, tempdir)
|
|
68 subprocess.call(s, shell=True)
|
|
69 paramters_file = open(tempdir+"/parameters.txt", "r")
|
|
70 parvalues = []
|
|
71 for line in paramters_file:
|
|
72 l = line.strip().split("\t")
|
|
73 if l[0] == "SRmodel":
|
|
74 SRmodel = l[1]
|
|
75 if l[0] == "Zmodel":
|
|
76 Zmodel = l[1]
|
|
77 if l[0] == "threshold":
|
|
78 threshold = l[1]
|
|
79 if l[0] == "walking_speed":
|
|
80 walking_speed = l[1]
|
|
81 if l[0] == "window_size":
|
|
82 window_size = l[1]
|
|
83 if l[0] == "minimum_cM_between_QTL":
|
|
84 minimum_cM_between_QTL = l[1]
|
|
85 paramters_file.close()
|
|
86
|
|
87 # copy INPUT file to the temp directory
|
|
88 s = "cp %s %s/qtlcart.inp" %(options.input1, tempdir)
|
|
89 subprocess.call(s, shell=True)
|
|
90 s = "cp %s %s/qtlcart.map" %(options.input2, tempdir)
|
|
91 subprocess.call(s, shell=True)
|
|
92
|
|
93 f=open(tempdir+"/qtlcart.inp", "r")
|
|
94 ln=f.readlines()
|
|
95 f.close()
|
|
96
|
|
97 if ln[0] == "NA":
|
|
98 f1=open(tempdir+"/QTLs_total_parsed_LOD.txt", "w")
|
|
99 f1.write("")
|
|
100 f1.close()
|
|
101 os.system("mv %s/QTLs_total_parsed_LOD.txt %s" %(tempdir,options.output1))
|
|
102 #os.system("mv %s/qtlcart.rc %s" %(tempdir,options.output2))
|
|
103 else:
|
|
104 instruction = "/cluster1/bin/Rcross -i %s/qtlcart.inp -o %s/qtlcart.cro -A -V" %(tempdir, tempdir)
|
|
105 os.system(instruction)
|
|
106
|
|
107 instruction = "/cluster1/bin/SRmapqtl -i %s/qtlcart.cro -e %s/SRqtlcart.log -o %s/qtlcart.sr -m %s/qtlcart.map -M %s -t 9999999999 -A -V" %(tempdir, tempdir, tempdir, tempdir, str(SRmodel))
|
|
108 os.system(instruction)
|
|
109
|
|
110 instruction = "/cluster1/bin/Zmapqtl -i %s/qtlcart.cro -o %s/qtlcart.z -m %s/qtlcart.map -S %s/qtlcart.sr -M %s -d %s -w %s -t 9999999999 -A -V" %(tempdir, tempdir, tempdir, tempdir, str(Zmodel), str(walking_speed), str(window_size))
|
|
111 os.system(instruction)
|
|
112
|
|
113 #instruction = "/cluster1/bin/Eqtl -m %s/qtlcart.map -z %s/qtlcart.z -e %s/Eqtlcart.log -o %s/qtlcart.eqt -S %s -A -V" %(tempdir, tempdir, tempdir, tempdir, str(threshold))
|
|
114 #os.system(instruction)
|
|
115
|
|
116 #####################
|
|
117 # parse_eqt_file.py
|
|
118 #####################
|
|
119
|
|
120 infile = open(tempdir+"/qtlcart.z","r")
|
|
121 outfile = open(tempdir+"/QTLs_total_parsed.txt","w")
|
|
122
|
|
123 outfile.write("trait_name\ttrait_number\teQTL_number\tchr\tpeak_marker\tpeak_position\tpeak_LR\tpeak_LOD\tR2\tTR2\tS\tadditive\tdominance\n")
|
|
124
|
|
125 for line in infile:
|
|
126 l = line.strip().split()
|
|
127 if line.startswith("-trait"):
|
|
128 trait_num = l[1]
|
|
129 trait_name = l[-1][1:-1]
|
|
130 prev_lr_max = float(threshold)
|
|
131 decrease = 0
|
|
132 #print trait_num
|
|
133 #print trait_name
|
|
134 #print "---"
|
|
135 eqtl_keep = ""
|
|
136 eqtl_list = []
|
|
137 prev_chromosome = 0
|
|
138 try:
|
|
139 ans = l[0]
|
|
140 except:
|
|
141 ans = ""
|
|
142 if ans != "":
|
|
143 if l[0].startswith(('0', '1', '2', '3', '4', '5', '6', '7', '8', '9')):
|
|
144 chromosome = l[0]
|
|
145 chr_change = 0
|
|
146 if chromosome != prev_chromosome:
|
|
147 #print "NEW CHROMOSOME !!!!"
|
|
148 chr_change = 1
|
|
149 prev_chromosome = l[0]
|
|
150 if chr_change == 1 and eqtl_keep != "":
|
|
151 eqtl_list.append(eqtl_keep)
|
|
152 #print "APPEND PREV"
|
|
153 eqtl_keep = ""
|
|
154 decrease = 0
|
|
155 prev_lr_max = float(threshold)
|
|
156
|
|
157 if float(l[3]) > float(threshold):
|
|
158 #print line
|
|
159 if float(l[3]) > prev_lr_max:
|
|
160 eqtl_keep = line.strip()
|
|
161 prev_lr_max = float(l[3])
|
|
162 decrease = 0
|
|
163 #print "KEEP"
|
|
164 else:
|
|
165 decrease += 1
|
|
166 if decrease == 1:
|
|
167 eqtl_list.append(eqtl_keep)
|
|
168 #print "APPEND PREV"
|
|
169 eqtl_keep = ""
|
|
170 prev_lr_max = float(l[3])
|
|
171 else:
|
|
172 prev_lr_max = float(l[3])
|
|
173 else:
|
|
174 decrease += 1
|
|
175 if decrease == 1 and eqtl_keep != "":
|
|
176 eqtl_list.append(eqtl_keep)
|
|
177 #print "APPEND PREV"
|
|
178 eqtl_keep = ""
|
|
179 decrease = 0
|
|
180 prev_lr_max = float(threshold)
|
|
181 #print decrease
|
|
182
|
|
183 if line.startswith("-e"):
|
|
184 if eqtl_keep != "":
|
|
185 eqtl_list.append(eqtl_keep)
|
|
186 #print "APPEND PREV"
|
|
187 eqtl_keep = ""
|
|
188 decrease = 0
|
|
189 prev_lr_max = float(threshold)
|
|
190 #print "########"
|
|
191 count = 0
|
|
192 for eqtl in eqtl_list:
|
|
193 e = eqtl.split()
|
|
194 #print e
|
|
195 count += 1
|
|
196 index = str(count)
|
|
197 chrom = str(e[0])
|
|
198 marker = str(e[1])
|
|
199 pos = str(e[2])
|
|
200 lr = str(e[3])
|
|
201 lod = str(0.217*float(e[3]))
|
|
202 additive = str(e[6])
|
|
203 dominance = str(e[8])
|
|
204 r2 = str(e[4])
|
|
205 tr2 = str(e[5])
|
|
206 s = str(e[7])
|
|
207 outfile.write(trait_name+"\t"+trait_num+"\t"+index+"\t"+chrom+"\t"+marker+"\t"+pos+"\t"+lr+"\t"+lod+"\t"+r2+"\t"+tr2+"\t"+s+"\t"+additive+"\t"+dominance+"\n")
|
|
208 #print len(eqtl_list)
|
|
209 infile.close()
|
|
210 outfile.close()
|
|
211
|
|
212 #########################
|
|
213 # calc_LOD_intervals.py
|
|
214 #########################
|
|
215 outfile = open(tempdir+"/QTLs_total_parsed_LOD.txt","w")
|
|
216 eqtfile = open(tempdir+"/QTLs_total_parsed.txt","r")
|
|
217
|
|
218 eQTL_dict = {}
|
|
219 eQTL_id = 0
|
|
220 for line in eqtfile:
|
|
221 l = line.strip().split("\t")
|
|
222 if (l[0] != "trait_name"):
|
|
223 eQTL_id += 1
|
|
224 eQTL_dict[eQTL_id] = [l[0],l[3],l[4],l[5],l[7]]
|
|
225 eqtfile.close()
|
|
226 #print eQTL_dict
|
|
227
|
|
228 for i in range(1,len(eQTL_dict)+1):
|
|
229 ans = []
|
|
230
|
|
231 eqt_eQTL = eQTL_dict[i][0]
|
|
232 eqt_c = eQTL_dict[i][1]
|
|
233 eqt_m = eQTL_dict[i][2]
|
|
234 eqt_pos = eQTL_dict[i][3]
|
|
235 eqt_lod = eQTL_dict[i][4]
|
|
236
|
|
237 z_eQTL = ""
|
|
238 z_id = 0
|
|
239 z_dict = {}
|
|
240 peak_id = 0
|
|
241
|
|
242 zfile = open(tempdir+"/qtlcart.z","r")
|
|
243 for line in zfile:
|
|
244 if line.startswith("-trait"):
|
|
245 l = line.strip().split("[")
|
|
246 z_eQTL = l[1][:-1]
|
|
247 #print "z_eQTL = "+z_eQTL
|
|
248 #print "eqt_eQTL = "+eqt_eQTL
|
|
249 if (eqt_eQTL == z_eQTL) and (line.strip().startswith(eqt_c)):
|
|
250 if str(line.strip().split()[0]) == str(eqt_c):
|
|
251 l = line.strip().split()
|
|
252 z_id += 1
|
|
253 z_c = l[0]
|
|
254 z_m = l[1]
|
|
255 z_pos = l[2]
|
|
256 z_lod = float(l[3])*0.217
|
|
257 z_dict[z_id] = [z_c, z_m, z_pos, z_lod]
|
|
258 if float(eqt_pos) == float(z_pos):
|
|
259 peak_id = z_id
|
|
260 zfile.close()
|
|
261
|
|
262 lod1 = float(eqt_lod)-1
|
|
263 lod2 = float(eqt_lod)-2
|
|
264
|
|
265 # lod1_L calculation
|
|
266 #print "==== lod1_L"
|
|
267 subtract = 1
|
|
268 left_id = peak_id-1
|
|
269 if left_id != 0:
|
|
270 #print "peak_id-subtract "+ str(peak_id-subtract)
|
|
271 #print "left_id "+str(left_id)
|
|
272 while (z_dict[peak_id-subtract][3] > lod1) and (left_id > 1):
|
|
273 subtract += 1
|
|
274 left_id = peak_id-subtract
|
|
275
|
|
276 s1 = float(z_dict[left_id][2]) # small position
|
|
277 s2 = float(z_dict[left_id][3]) # small lod
|
|
278 l1 = float(z_dict[left_id+1][2]) # large position
|
|
279 l2 = float(z_dict[left_id+1][3]) # large lod
|
|
280
|
|
281 if (l2-s2) != 0:
|
|
282 lod1_L_pos = round(((lod1-s2)*(l1-s1)/(l2-s2))+s1,4)
|
|
283 else:
|
|
284 lod1_L_pos = round(((lod1-s2)*(l1-s1)/(0.00001))+s1,4)
|
|
285 lod1_L_m = z_dict[left_id][1]
|
|
286 if lod1_L_pos < 0:
|
|
287 lod1_L_pos = z_dict[1][2]
|
|
288 lod1_L_m = z_dict[1][1]
|
|
289 if ((lod1_L_pos >= s1) and (lod1_L_pos <= l1)):
|
|
290 pass
|
|
291 else:
|
|
292 lod1_L_pos = z_dict[1][2]
|
|
293 lod1_L_m = z_dict[1][1]
|
|
294 else:
|
|
295 lod1_L_pos = z_dict[1][2]
|
|
296 lod1_L_m = z_dict[1][1]
|
|
297 ans.append(lod1_L_m)
|
|
298 ans.append(lod1_L_pos)
|
|
299
|
|
300 # lod1_R calculation
|
|
301 #print "==== lod1_R"
|
|
302 add = 1
|
|
303 right_id = peak_id+1
|
|
304 if right_id <= max(z_dict.keys()):
|
|
305 while (z_dict[peak_id+add][3] > lod1) and (right_id < max(z_dict.keys())):
|
|
306 add += 1
|
|
307 right_id = peak_id+add
|
|
308
|
|
309 s1 = float(z_dict[right_id-1][2]) # small position
|
|
310 s2 = float(z_dict[right_id-1][3]) # small lod
|
|
311 l1 = float(z_dict[right_id][2]) # large position
|
|
312 l2 = float(z_dict[right_id][3]) # large lod
|
|
313
|
|
314 if (l2-s2) != 0:
|
|
315 lod1_R_pos = round(((lod1-s2)*(l1-s1)/(l2-s2))+s1,4)
|
|
316 else:
|
|
317 lod1_R_pos = round(((lod1-s2)*(l1-s1)/(0.00001))+s1,4)
|
|
318 lod1_R_m = z_dict[right_id-1][1]
|
|
319
|
|
320 if lod1_R_pos > float(z_dict[max(z_dict.keys())][2]):
|
|
321 lod1_pos = z_dict[1][2]
|
|
322 #lod1_m = z_dict[2][1]
|
|
323 #lod1_R_pos = z_dict[max(z_dict.keys())][2]
|
|
324 lod1_R_m = z_dict[max(z_dict.keys())][1]
|
|
325 if ((lod1_R_pos >= s1) and (lod1_R_pos <= l1)):
|
|
326 pass
|
|
327 else:
|
|
328 lod1_R_pos = z_dict[max(z_dict.keys())][2]
|
|
329 lod1_R_m = z_dict[max(z_dict.keys())][1]
|
|
330 else:
|
|
331 lod1_R_pos = z_dict[max(z_dict.keys())][2]
|
|
332 lod1_R_m = z_dict[max(z_dict.keys())][1]
|
|
333
|
|
334 ans.append(lod1_R_m)
|
|
335 ans.append(lod1_R_pos)
|
|
336
|
|
337 # lod2_L calculation
|
|
338 #print "==== lod2_L"
|
|
339 subtract = 1
|
|
340 left_id = peak_id-1
|
|
341 if left_id != 0 :
|
|
342 while (z_dict[peak_id-subtract][3] > lod2) and (left_id > 1):
|
|
343 subtract += 1
|
|
344 left_id = peak_id-subtract
|
|
345
|
|
346 s1 = float(z_dict[left_id][2]) # small position
|
|
347 s2 = float(z_dict[left_id][3]) # small lod
|
|
348 l1 = float(z_dict[left_id+1][2]) # large position
|
|
349 l2 = float(z_dict[left_id+1][3]) # large lod
|
|
350
|
|
351 if (l2-s2) != 0:
|
|
352 lod2_L_pos = round(((lod2-s2)*(l1-s1)/(l2-s2))+s1,4)
|
|
353 else:
|
|
354 lod2_L_pos = round(((lod2-s2)*(l1-s1)/(0.00001))+s1,4)
|
|
355
|
|
356 lod2_L_m = z_dict[left_id][1]
|
|
357 if lod2_L_pos < 0:
|
|
358 lod2_L_pos = z_dict[1][2]
|
|
359 lod2_L_m = z_dict[2][1]
|
|
360 if ((lod2_L_pos >= s1) and (lod2_L_pos <= l1)):
|
|
361 pass
|
|
362 else:
|
|
363 lod2_L_pos = z_dict[1][2]
|
|
364 lod2_L_m = z_dict[1][1]
|
|
365 else:
|
|
366 lod2_L_pos = z_dict[1][2]
|
|
367 lod2_L_m = z_dict[1][1]
|
|
368 ans.append(lod2_L_m)
|
|
369 ans.append(lod2_L_pos)
|
|
370
|
|
371
|
|
372 # lod2_R calculation
|
|
373 #print "==== lod2_R"
|
|
374 add = 1
|
|
375 right_id = peak_id+1
|
|
376 if right_id <= max(z_dict.keys()):
|
|
377 while (z_dict[peak_id+add][3] > lod2) and (right_id < max(z_dict.keys())):
|
|
378 add += 1
|
|
379 right_id = peak_id+add
|
|
380
|
|
381 s1 = float(z_dict[right_id-1][2]) # small position
|
|
382 s2 = float(z_dict[right_id-1][3]) # small lod
|
|
383 l1 = float(z_dict[right_id][2]) # large position
|
|
384 l2 = float(z_dict[right_id][3]) # large lod
|
|
385
|
|
386 if (l2-s2) != 0:
|
|
387 lod2_R_pos = round(((lod2-s2)*(l1-s1)/(l2-s2))+s1,4)
|
|
388 else:
|
|
389 lod2_R_pos = round(((lod2-s2)*(l1-s1)/(0.00001))+s1,4)
|
|
390 lod2_R_m = z_dict[right_id-1][1]
|
|
391
|
|
392 if lod2_R_pos > float(z_dict[max(z_dict.keys())][2]):
|
|
393 lod2_R_pos = z_dict[max(z_dict.keys())][2]
|
|
394 lod2_R_m = z_dict[max(z_dict.keys())][1]
|
|
395 if ((lod2_R_pos >= s1) and (lod2_R_pos <= l1)):
|
|
396 pass
|
|
397 else:
|
|
398 lod2_R_pos = z_dict[max(z_dict.keys())][2]
|
|
399 lod2_R_m = z_dict[max(z_dict.keys())][1]
|
|
400 else:
|
|
401 lod2_R_pos = z_dict[max(z_dict.keys())][2]
|
|
402 lod2_R_m = z_dict[max(z_dict.keys())][1]
|
|
403 ans.append(lod2_R_m)
|
|
404 ans.append(lod2_R_pos)
|
|
405
|
|
406 eQTL_dict[i].append(ans)
|
|
407
|
|
408 head = ["LOD1_L_m","LOD1_L_pos","LOD1_R_m","LOD1_R_pos","LOD2_L_m","LOD2_L_pos","LOD2_R_m","LOD2_R_pos"]
|
|
409
|
|
410 i = -1
|
|
411 eqtfile = open(tempdir+"/QTLs_total_parsed.txt","r")
|
|
412 for line in eqtfile:
|
|
413 i += 1
|
|
414 if i == 0:
|
|
415 outfile.write(line.strip()+"\t"+"\t".join(head)+"\n")
|
|
416 else:
|
|
417 outfile.write(line.strip()+"\t"+"\t".join(str(x) for x in eQTL_dict[i][5])+"\n")
|
|
418
|
|
419 eqtfile.close()
|
|
420 outfile.close()
|
|
421
|
|
422 #####################
|
|
423 # merge_QTLs.py
|
|
424 #####################
|
|
425
|
|
426 infile = open(tempdir+"/QTLs_total_parsed_LOD.txt","r")
|
|
427 outfile = open(tempdir+"/QTLs_total_parsed_LOD_merged.txt","w")
|
|
428
|
|
429 test = ""
|
|
430 for line in infile:
|
|
431 l = line.strip().split("\t")
|
|
432 if l[0] == "trait_name":
|
|
433 keep = l
|
|
434 else:
|
|
435 test = l
|
|
436 if keep[0] != test[0]: # if trait names are not the same ---> write keep
|
|
437 if keep[0] != "trait_name": # no not include header, only when integrate
|
|
438 outfile.write("\t".join(keep)+"\n")
|
|
439 keep = test
|
|
440 else:
|
|
441 if keep[3] != test[3]: # if chrs are not the same --> write keep
|
|
442 outfile.write("\t".join(keep)+"\n")
|
|
443 keep = test
|
|
444 else:
|
|
445 if not (((float(keep[11])<0) and (float(test[11])<0)) or ((float(keep[11])>0) and (float(test[11])>0))): # if additive signs are not the same --> write keep
|
|
446 outfile.write("\t".join(keep)+"\n")
|
|
447 keep = test
|
|
448 else:
|
|
449 #print str((abs(float(test[5])*100-float(keep[5])*100)))
|
|
450 if not (abs(float(test[5])*100-float(keep[5])*100)<float(minimum_cM_between_QTL)): #if minimum cM between QTLs > 20 --> write keep
|
|
451 outfile.write("\t".join(keep)+"\n")
|
|
452 keep = test
|
|
453 else:
|
|
454 if (float(keep[7])<float(test[7])): #if LOD(keep) > LOD(test) --> new keep
|
|
455 keep = test
|
|
456
|
|
457 if l[0] != "trait_name":
|
|
458 outfile.write("\t".join(keep)+"\n")
|
|
459
|
|
460 infile.close()
|
|
461 outfile.close()
|
|
462
|
|
463
|
|
464 os.system("mv %s/QTLs_total_parsed_LOD_merged.txt %s" %(tempdir,options.output1))
|
|
465
|
|
466 if __name__=="__main__":
|
|
467 __main__()
|
|
468
|
|
469
|