comparison SMART/Java/Python/plotTranscriptList.py @ 6:769e306b7933

Change the repository level.
author yufei-luo
date Fri, 18 Jan 2013 04:54:14 -0500
parents
children
comparison
equal deleted inserted replaced
5:ea3082881bf8 6:769e306b7933
1 #! /usr/bin/env python
2 #
3 # Copyright INRA-URGI 2009-2010
4 #
5 # This software is governed by the CeCILL license under French law and
6 # abiding by the rules of distribution of free software. You can use,
7 # modify and/ or redistribute the software under the terms of the CeCILL
8 # license as circulated by CEA, CNRS and INRIA at the following URL
9 # "http://www.cecill.info".
10 #
11 # As a counterpart to the access to the source code and rights to copy,
12 # modify and redistribute granted by the license, users are provided only
13 # with a limited warranty and the software's author, the holder of the
14 # economic rights, and the successive licensors have only limited
15 # liability.
16 #
17 # In this respect, the user's attention is drawn to the risks associated
18 # with loading, using, modifying and/or developing or reproducing the
19 # software by the user in light of its specific status of free software,
20 # that may mean that it is complicated to manipulate, and that also
21 # therefore means that it is reserved for developers and experienced
22 # professionals having in-depth computer knowledge. Users are therefore
23 # encouraged to load and test the software's suitability as regards their
24 # requirements in conditions enabling the security of their systems and/or
25 # data to be ensured and, more generally, to use and operate it in the
26 # same conditions as regards security.
27 #
28 # The fact that you are presently reading this means that you have had
29 # knowledge of the CeCILL license and that you accept its terms.
30 #
31 """
32 Plot the data from the data files
33 """
34 import sys
35 import math
36 from optparse import OptionParser
37 from SMART.Java.Python.structure.TranscriptContainer import TranscriptContainer
38 from SMART.Java.Python.misc.RPlotter import RPlotter
39
40
41 class PlotTranscriptList(object):
42
43 def __init__(self, verbosity = 0):
44 self.inputFileName = None
45 self.format = None
46 self.x = None
47 self.y = None
48 self.z = None
49 self.xDefault = None
50 self.yDefault = None
51 self.zDefault = None
52 self.xLabel = None
53 self.yLabel = None
54 self.shape = None
55 self.bucket = None
56 self.keep = None
57 self.log = None
58 self.verbosity = None
59
60
61 def setPlotter(self, outputFileName, keep, log, xLabel, yLabel):
62 self.plotter = RPlotter(outputFileName, self.verbosity, keep)
63 if self.shape != "barplot":
64 self.plotter.setLog(log)
65 self.plotter.setXLabel(xLabel)
66 self.plotter.setYLabel(yLabel)
67
68
69 def setShape(self, shape):
70 if self.shape == "line":
71 pass
72 elif shape == "barplot":
73 self.plotter.setBarplot(True)
74 elif shape == "points":
75 self.plotter.setPoints(True)
76 elif shape == "heatPoints":
77 self.plotter.setHeatPoints(True)
78 else:
79 sys.exit("Do not understand shape '%s'" % (shape))
80
81
82 def setInput(self, inputFileName, format):
83 self.parser = TranscriptContainer(inputFileName, format, self.verbosity)
84
85
86 def getValues(self, transcript):
87 x, y, z = None, None, None
88 x = transcript.getTagValue(self.x)
89 if self.y != None:
90 y = transcript.getTagValue(self.y)
91 if self.z != None:
92 z = transcript.getTagValue(self.z)
93 if x == None:
94 if self.xDefault != None:
95 x = self.xDefault
96 else:
97 sys.exit("Error! Transcript %s do not have the x-tag %s" % (transcript, self.x))
98 if y == None and self.shape != "line" and self.shape != "barplot":
99 if self.yDefault != None:
100 y = self.yDefault
101 else:
102 sys.exit("Error! Transcript %s do not have the y-tag %s" % (transcript, self.y))
103 if self.z != None:
104 if z == None:
105 if self.zDefault != None:
106 z = self.zDefault
107 else:
108 sys.exit("Error! Transcript %s do not have the z-tag %s" % (transcript, self.z))
109 x = float(x)
110 if self.y != None:
111 y = float(y)
112 if self.z != None:
113 z = float(z)
114 return (x, y, z)
115
116
117 def readFile(self):
118 cpt = 1
119 line = {}
120 heatLine = {}
121 for transcript in self.parser.getIterator():
122 x, y, z = self.getValues(transcript)
123
124 name = transcript.name
125 if name == "unnamed transcript":
126 name = "transcript %d" % (cpt)
127 cpt += 1
128 if self.shape == "points":
129 line[name] = (x, y)
130 elif self.shape == "heatPoints":
131 line[name] = (x, y)
132 heatLine[name] = z
133 elif self.shape == "line" or self.shape == "barplot":
134 if x not in line:
135 line[x] = 1
136 else:
137 line[x] += 1
138 else:
139 sys.exit("Do not understand shape '%s'" % (self.shape))
140 return line, heatLine
141
142
143 def putLineInBuckets(self, line):
144 tmpLine = line
145 line = {}
146 for key, value in tmpLine.iteritems():
147 line[int(key / float(self.bucket)) * self.bucket] = value
148 return line
149
150
151 def clusterInBarplot(self, line):
152 nbZeros = 0
153 minValue = min(line.keys())
154 maxValue = max(line.keys())
155 if self.log != "":
156 if minValue == 0:
157 minValue = 1000000000
158 for value in line:
159 if value < minValue:
160 if value == 0:
161 nbZeros += 1
162 else:
163 minValue = value
164 minValue = math.log(minValue)
165 maxValue = math.log(maxValue)
166 bucketSize = (maxValue - minValue) / self.bucket
167 tmpLine = line
168 line = {}
169 for i in range(int(self.bucket) + 1):
170 line[i * bucketSize + minValue] = 0
171 for key, value in tmpLine.iteritems():
172 if self.log != "" and key != 0:
173 key = math.log(key)
174 bucketKey = int((key - minValue) / bucketSize) * bucketSize + minValue
175 if self.log == "" or key != 0:
176 line[bucketKey] += value
177 # if self.log != "":
178 # tmpLine = line
179 # line = {}
180 # for key, value in tmpLine.iteritems():
181 # line[math.exp(key)] = value
182 print "%d zeros have been removed" % (nbZeros)
183 return line
184
185
186 def getSpearmanRho(self):
187 rho = self.plotter.getSpearmanRho()
188 if rho == None:
189 print "Cannot compute Spearman rho."
190 else:
191 print "Spearman rho: %f" % (rho)
192
193
194 def run(self):
195 line, heatLine = self.readFile()
196
197 if self.shape == "line" and self.bucket != None:
198 line = self.putLineInBuckets(line)
199 if self.shape == "barplot":
200 line = self.clusterInBarplot(line)
201
202 if self.shape == "points" or self.shape == "barplot" or self.shape == "line":
203 self.plotter.addLine(line)
204 elif self.shape == "heatPoints":
205 self.plotter.addLine(line)
206 self.plotter.addHeatLine(heatLine)
207 else:
208 sys.exit("Do not understand shape '%s'" % (self.shape))
209
210 self.plotter.plot()
211
212 if self.shape == "points" or self.shape == "heatPoints":
213 self.getSpearmanRho()
214
215
216
217 if __name__ == "__main__":
218
219 # parse command line
220 description = "Plot v1.0.2: Plot some information from a list of transcripts. [Category: Visualization]"
221
222 parser = OptionParser(description = description)
223 parser.add_option("-i", "--input",dest="inputFileName", action="store", type="string", help="input file [compulsory] [format: file in transcript format given by -f]")
224 parser.add_option("-f", "--format",dest="format", action="store",type="string", help="format of the input [compulsory] [format: transcript file format]")
225 parser.add_option("-x", "--x",dest="x",action="store", type="string", help="tag for the x value [format: string]")
226 parser.add_option("-y", "--y",dest="y",action="store", type="string", help="tag for the y value [format: string]")
227 parser.add_option("-z", "--z",dest="z", action="store", default=None,type="string", help="tag for the z value [format: string]")
228 parser.add_option("-X", "--xDefault",dest="xDefault",action="store", default=None,type="float",help="value for x when tag is not present [format: float]")
229 parser.add_option("-Y", "--yDefault",dest="yDefault",action="store",default=None,type="float",help="value for y when tag is not present [format: float]")
230 parser.add_option("-Z", "--zDefault",dest="zDefault", action="store",default=None,type="float",help="value for z when tag is not present [format: float]")
231 parser.add_option("-n", "--xLabel",dest="xLabel",action="store",default="",type="string", help="label on the x-axis [format: string] [default: ]")
232 parser.add_option("-m", "--yLabel",dest="yLabel",action="store",default="", type="string", help="label on the y-axis [format: string] [default: ]")
233 parser.add_option("-o", "--output",dest="outputFileName",action="store",type="string", help="output file names [format: output file in PNG format]")
234 parser.add_option("-s", "--shape",dest="shape",action="store", type="string", help="shape of the plot [format: choice (barplot, line, points, heatPoints)]")
235 parser.add_option("-b", "--bucket",dest="bucket",action="store",default=None,type="float",help="bucket size (for the line plot) [format: int] [default: 1]")
236 parser.add_option("-k", "--keep",dest="keep",action="store_true", default=False, help="keep temporary files [format: bool]")
237 parser.add_option("-l", "--log",dest="log",action="store",default="",type="string", help="use log on x- or y-axis (write 'x', 'y' or 'xy') [format: string] [default: ]")
238 parser.add_option("-v", "--verbosity",dest="verbosity",action="store",default=1, type="int",help="trace level [format: int]")
239 (options, args) = parser.parse_args()
240
241 plotTranscriptList = PlotTranscriptList(options.verbosity)
242 plotTranscriptList.x = options.x
243 plotTranscriptList.y = options.y
244 plotTranscriptList.z = options.z
245 plotTranscriptList.xDefault = options.xDefault
246 plotTranscriptList.yDefault = options.yDefault
247 plotTranscriptList.zDefault = options.zDefault
248 plotTranscriptList.shape = options.shape
249 plotTranscriptList.bucket = options.bucket
250 plotTranscriptList.log = options.log
251 plotTranscriptList.setPlotter(options.outputFileName, options.keep, options.log, options.xLabel, options.yLabel)
252 plotTranscriptList.setShape(options.shape)
253 plotTranscriptList.setInput(options.inputFileName, options.format)
254 plotTranscriptList.run()
255