20
|
1 '''
|
|
2 change start and end of interval files
|
|
3 '''
|
|
4
|
|
5 import sys
|
|
6
|
|
7 def resize(infile,outfile,expr_start,expr_end,strand):
|
|
8 fin = open(infile)
|
|
9 fout = open(outfile,'w')
|
|
10 if expr_start[0:3] == 'end':
|
|
11 c1 = 2
|
|
12 n1 = int(expr_start[3:])
|
|
13 else:
|
|
14 c1 = 1
|
|
15 n1 = int(expr_start[5:])
|
|
16 if expr_end[0:3] == 'end':
|
|
17 c2 = 2
|
|
18 n2 = int(expr_end[3:])
|
|
19 else:
|
|
20 c2 = 1
|
|
21 n2 = int(expr_end[5:])
|
|
22 if strand == 'ignore':
|
|
23 for line in fin:
|
|
24 flds = line.strip().split('\t')
|
|
25 start = int(flds[c1]) + n1
|
|
26 if start >= 0:
|
|
27 end = int(flds[c2]) + n2
|
|
28 if end >= start:
|
|
29 flds[1] = str(start)
|
|
30 flds[2] = str(end)
|
|
31 fout.write('\t'.join(flds)+'\n')
|
|
32 else:# upstream downstream
|
|
33 for line in fin:
|
|
34 flds = line.strip().split('\t')
|
|
35 if flds[5] == '+':
|
|
36 start = int(flds[c1]) + n1
|
|
37 if start >= 0:
|
|
38 end = int(flds[c2]) + n2
|
|
39 if end >= start:
|
|
40 flds[1] = str(start)
|
|
41 flds[2] = str(end)
|
|
42 fout.write('\t'.join(flds)+'\n')
|
|
43 else: # on the - strand
|
|
44 start = int(flds[3-c2]) - n2 # end=end+n2
|
|
45 if start >= 0:
|
|
46 end = int(flds[3-c1]) - n1
|
|
47 if end >= start:
|
|
48 flds[1] = str(start)
|
|
49 flds[2] = str(end)
|
|
50 fout.write('\t'.join(flds)+'\n')
|
|
51 fin.close()
|
|
52 fout.close()
|
|
53
|
|
54 if __name__ == "__main__":
|
|
55 resize(sys.argv[1],sys.argv[2],sys.argv[3],sys.argv[4],sys.argv[5])
|
|
56 # python resize.py in.bed out.bed start-3 end+5 both
|
|
57 # python resize.py <input.bed> <output.bed> expr_start expr_end strand(both/+/-)
|