annotate hetbox.py @ 0:8d2c4c11fd8f draft default tip

Uploaded repo.tar.gz
author boris
date Mon, 03 Feb 2014 13:15:10 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
1 #!/usr/bin/env python
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
2
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
3 # Code by Boris Rebolledo-Jaramillo
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
4 # (boris-at-bx.psu.edu)
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
5 # Edited by Nick Stoler
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
6 # (nick-at-bx.psu.edu)
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
7 # New in this version:
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
8 # - Add in proper header line if not present
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
9
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
10
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
11 import os
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
12 import sys
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
13 import array
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
14 import numpy
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
15 from rpy2.robjects import Formula
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
16 from rpy2.robjects.packages import importr
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
17 from rpy2 import robjects
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
18
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
19 def fail(message):
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
20 sys.stderr.write(message+'\n')
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
21 sys.exit(1)
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
22
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
23 COLUMN_LABELS = ['SAMPLE', 'CHR', 'POS', 'A', 'C', 'G', 'T', 'CVRG',
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
24 'ALLELES', 'MAJOR', 'MINOR', 'MINOR.FREQ.PERC.'] #, 'STRAND.BIAS']
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
25
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
26 COLUMN_LABELS_STRANDED= ['SAMPLE', 'CHR', 'POS', '+A', '+C', '+G', '+T', '-A', '-C', '-G', '-T',
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
27 'CVRG','ALLELES', 'MAJOR', 'MINOR', 'MINOR.FREQ.PERC.']
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
28
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
29 args = sys.argv[1:]
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
30 if len(args) >= 1:
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
31 infile = args[0]
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
32 else:
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
33 fail('Error: No input filename provided (as argument 1).')
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
34 if len(args) >= 2:
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
35 outfile = args[1]
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
36 else:
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
37 fail('Error: No output filename provided (as argument 2).')
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
38 if len(args) >= 3:
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
39 report = args[2]
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
40 else:
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
41 report = ''
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
42
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
43 # Check input file
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
44 add_header = False
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
45 if not os.path.exists(infile):
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
46 fail('Error: Input file '+infile+' could not be found.')
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
47 with open(infile, 'r') as lines:
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
48 line = lines.readline()
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
49 if not line:
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
50 fail('Error: Input file seems to be empty')
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
51 line = line.strip().lstrip('#') # rm whitespace, comment chars
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
52 labels = line.split("\t")
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
53 if 'SAMPLE' not in labels:
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
54 sys.stderr.write("Error: Input file does not seem to have a proper header "
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
55 +"line.\nAdding an artificial header..")
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
56 add_header = True
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
57
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
58 r = robjects.r
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
59 base = importr('base')
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
60 utils = importr('utils')
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
61 stats = importr('stats')
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
62 rprint = robjects.globalenv.get("print")
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
63 graphics = importr('graphics')
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
64 grdevices = importr('grDevices')
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
65 grdevices.png(file=outfile, width=1024, height=768, type="cairo")
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
66
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
67 # Read file into a data frame
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
68 if add_header:
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
69 # add header line manually if not present
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
70 DATA = utils.read_delim(infile, header=False)
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
71 labels = robjects.r.names(DATA)
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
72 for i in range(len(labels)):
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
73 try:
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
74 labels[i] = COLUMN_LABELS[i]
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
75 except IndexError, e:
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
76 try:
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
77 labels[i] = COLUMN_LABELS_EXTENDED[i]
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
78 except:
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
79 fail("Error in input file: Too many columns (does not match hardcoded "
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
80 +"column labels).")
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
81 else:
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
82 DATA = utils.read_delim(infile)
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
83 # Remove comment from header, if present
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
84 labels = robjects.r.names(DATA)
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
85 if labels[0][0:2] == 'X.':
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
86 labels[0] = labels[0][2:]
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
87
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
88 # Multiply minor allele frequencies by 100 to get percentage
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
89 # .rx2() looks up a column by its label and returns it as a vector
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
90 # .ro turns the returned object into one that can be operated on per-element
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
91 minor_freq = DATA.rx2('MINOR.FREQ.PERC.').ro * 100
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
92 samples = DATA.rx2('SAMPLE')
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
93
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
94 # Formula() creates a Python object representing the R object returned by x ~ y
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
95 formula = Formula('minor_freq ~ samples')
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
96 # The "environment" in .getenvironment() is the entire R workspace in which the
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
97 # Formula object exists. The R workspace meaning all the defined variables.
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
98 # Here, the .getenvironment() method is being used to set some variables in the
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
99 # R workspace
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
100
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
101 formula.getenvironment()['minor_freq'] = minor_freq
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
102 formula.getenvironment()['samples'] = samples
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
103
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
104
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
105 r.par(oma=array.array('i', [0,0,0,0]))
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
106 r.par(mar=array.array('i', [10,4,4,2]))
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
107 ylimit = array.array('i',[-5,50])
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
108
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
109 # create boxplot - fill kwargs1 with the options for the boxplot function
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
110 kwargs1 = {'ylab':"Minor allele frequency (%)", 'col':"gray", 'xaxt':"n",
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
111 'outpch':"*",'main':"Distribution of minor allele frequencies",
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
112 'cex.lab':"1.5"}
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
113 p = graphics.boxplot(formula, axes=0,ylim=ylimit, lty=1,**kwargs1)
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
114
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
115 table = base.table(DATA.rx2('SAMPLE'))
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
116 graphics.text(0, -1, 'N:', font=2)
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
117 for i in range(1, base.length(table)[0]+1, 1):
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
118 graphics.text(i, -1, table[i-1], font=2)
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
119
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
120 graphlabels = base.names(table)
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
121 kwargs3 = {'pos':"-2", 'las':"2", 'cex.axis':"1"}
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
122 graphics.axis(1, at=range(1, len(graphlabels)+1, 1),labels=graphlabels, **kwargs3)
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
123 graphics.axis(2,at=(range(0,60,10)),pos=0,font=2)
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
124 grdevices.dev_off()
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
125
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
126 if not report:
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
127 sys.exit(0)
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
128
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
129
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
130 SAMPLES=[]
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
131 for i in range(len(table)):
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
132 SAMPLES.append(base.names(table)[i])
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
133
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
134 def boxstats(data,sample):
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
135 VALUES = [100*float(x.strip().split('\t')[11]) for x in list(open(data)) if x.strip().split('\t')[0]==sample]
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
136 NoHET = len(VALUES)
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
137 MEDIAN = numpy.median(VALUES)
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
138 MAD = numpy.median([abs(i - MEDIAN) for i in VALUES]) # Median absolute distance (robust spread statistic)
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
139 return [NoHET,MEDIAN, MAD]
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
140
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
141 boxreport = open(report, "w+")
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
142 boxreport.write("#sample\tNo.sites\tmedian.freq\tMAD.freq\n")
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
143
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
144 for sample in SAMPLES:
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
145 ENTRY = [sample] + boxstats(infile,sample)
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
146 boxreport.write ('%s\t%d\t%.1f\t%.1f\n' % tuple([ENTRY[i] for i in [0,1,2,3]]))
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
147 boxreport.close()
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
148
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
149
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
150
8d2c4c11fd8f Uploaded repo.tar.gz
boris
parents:
diff changeset
151