comparison tools/mytools/shuffleBed.py @ 0:9071e359b9a3

Uploaded
author xuebing
date Fri, 09 Mar 2012 19:37:19 -0500
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:9071e359b9a3
1 '''
2 simulate a random interval set that mimics the size and strand of a reference set
3 '''
4
5 def inferSizeFromRefBed(filename,header):
6 '''
7 read reference interval set, get chrom size information
8 '''
9 chrSize = {}
10 f = open(filename)
11 if header:
12 header = f.readline()
13 for line in f:
14 flds = line.strip().split('\t')
15 if not chrSize.has_key(flds[0]):
16 chrSize[flds[0]] = int(flds[2])
17 elif chrSize[flds[0]] < int(flds[2]):
18 chrSize[flds[0]] = int(flds[2])
19 f.close()
20 return chrSize
21
22 def getChrSize(filename):
23 chrSize = {}
24 f = open(filename)
25 for line in f:
26 flds = line.strip().split('\t')
27 if len(flds) >1:
28 chrSize[flds[0]] = int(flds[1])
29 f.close()
30 return chrSize
31
32 def makeWeightedChrom(chrSize):
33 '''
34 make a list of chr_id, the freq is proportional to its length
35 '''
36
37 genome_len = 0
38
39 for chrom in chrSize:
40 chrom_len = chrSize[chrom]
41 genome_len += chrom_len
42
43 weighted_chrom = []
44 for chrom in chrSize:
45 weight = int(round(1000*float(chrSize[chrom])/genome_len))
46 weighted_chrom += [chrom]*weight
47
48 return weighted_chrom
49
50 def randomIntervalWithinChrom(infile,outfile,chrSize,header):
51 '''
52 '''
53 fin = open(infile)
54 if header:
55 header = fin.readline()
56 fout = open(outfile,'w')
57 n = 0
58 for line in fin:
59 n = n + 1
60 flds = line.strip().split('\t')
61 interval_size = int(flds[2]) - int(flds[1])
62 rstart = random.randint(0,chrSize[flds[0]]-interval_size)
63 fout.write(flds[0]+'\t'+str(rstart)+'\t'+str(rstart+interval_size)+'\t'+str(n)+'\t0\t+\n')
64 fin.close()
65 fout.close()
66
67 def randomIntervalAcrossChrom(infile,outfile,chrSize,weighted_chrom,header):
68 '''
69 '''
70 fin = open(infile)
71 if header:
72 header = fin.readline()
73 fout = open(outfile,'w')
74 n = 0
75 for line in fin:
76 n = n + 1
77 flds = line.strip().split('\t')
78 interval_size = int(flds[2]) - int(flds[1])
79 # find a random chrom
80 flds[0] = weighted_chrom[random.randint(0, len(weighted_chrom) - 1)]
81 # random start in the chrom
82 rstart = random.randint(0,chrSize[flds[0]]-interval_size)
83 fout.write(flds[0]+'\t'+str(rstart)+'\t'+str(rstart+interval_size)+'\t'+str(n)+'\t0\t+\n')
84 fin.close()
85 fout.close()
86
87 import sys,random
88 def main():
89 # python random_interval.py test100.bed testout.bed across header human.hg18.genome
90
91 reference_interval_file = sys.argv[1]
92 output_file = sys.argv[2]
93 across_or_within_chrom = sys.argv[3] # within or across
94 if sys.argv[4] == 'header':
95 header = True
96 else:
97 header = False
98 if len(sys.argv) == 6:
99 chrom_size_file = sys.argv[5]
100 chrSize = getChrSize(chrom_size_file)
101 else:
102 chrSize = inferSizeFromRefBed(reference_interval_file,header)
103 if across_or_within_chrom == 'within':
104 randomIntervalWithinChrom(reference_interval_file,output_file,chrSize,header)
105 else:
106 randomIntervalAcrossChrom(reference_interval_file,output_file,chrSize,makeWeightedChrom(chrSize),header)
107 main()