annotate commons/core/coord/ConvCoord.py @ 36:44d5973c188c

Uploaded
author m-zytnicki
date Tue, 30 Apr 2013 15:02:29 -0400
parents 769e306b7933
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
1 #!/usr/bin/env python
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
2
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
3 ##@file
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
4 # Convert coordinates from chunks to chromosomes or the opposite.
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
5 #
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
6 # usage: ConvCoord.py [ options ]
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
7 # options:
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
8 # -h: this help
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
9 # -i: input data with coordinates to convert (file or table)
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
10 # -f: input data format (default='align'/'path')
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
11 # -c: coordinates to convert (query, subject or both; default='q'/'s'/'qs')
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
12 # -m: mapping of chunks on chromosomes (format='map')
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
13 # -x: convert from chromosomes to chunks (opposite by default)
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
14 # -o: output data (file or table, same as input)
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
15 # -C: configuration file (for database connection)
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
16 # -v: verbosity level (default=0/1/2)
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
17
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
18
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
19 import os
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
20 import sys
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
21 import getopt
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
22 import time
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
23 from commons.core.sql.DbFactory import DbFactory
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
24 from commons.core.coord.MapUtils import MapUtils
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
25 from commons.core.sql.TableMapAdaptator import TableMapAdaptator
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
26 from commons.core.sql.TablePathAdaptator import TablePathAdaptator
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
27 from commons.core.coord.PathUtils import PathUtils
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
28 from commons.core.coord.Align import Align
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
29 from commons.core.coord.Path import Path
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
30 from commons.core.coord.Range import Range
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
31
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
32
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
33 ## Class to handle coordinate conversion
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
34 #
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
35 class ConvCoord( object ):
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
36
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
37 ## Constructor
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
38 #
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
39 def __init__( self, inData="", mapData="", outData="", configFile="", verbosity=0):
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
40 self._inData = inData
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
41 self._formatInData = "align"
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
42 self._coordToConvert = "q"
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
43 self._mapData = mapData
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
44 self._mergeChunkOverlaps = True
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
45 self._convertChunks = True
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
46 self._outData = outData
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
47 self._configFile = configFile
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
48 self._verbose = verbosity
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
49 self._typeInData = "file"
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
50 self._typeMapData = "file"
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
51 self._tpa = None
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
52 if self._configFile != "" and os.path.exists(self._configFile):
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
53 self._iDb = DbFactory.createInstance(self._configFile)
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
54 else:
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
55 self._iDb = DbFactory.createInstance()
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
56
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
57
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
58 ## Display the help on stdout
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
59 #
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
60 def help( self ):
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
61 print
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
62 print "usage: ConvCoord.py [ options ]"
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
63 print "options:"
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
64 print " -h: this help"
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
65 print " -i: input data with coordinates to convert (file or table)"
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
66 print " -f: input data format (default='align'/'path')"
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
67 print " -c: coordinates to convert (query, subject or both; default='q'/'s'/'qs')"
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
68 print " -m: mapping of chunks on chromosomes (format='map')"
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
69 print " -M: merge chunk overlaps (default=yes/no)"
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
70 print " -x: convert from chromosomes to chunks (opposite by default)"
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
71 print " -o: output data (file or table, same as input)"
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
72 print " -C: configuration file (for database connection)"
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
73 print " -v: verbosity level (default=0/1/2)"
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
74 print
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
75
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
76
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
77 ## Set the attributes from the command-line
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
78 #
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
79 def setAttributesFromCmdLine( self ):
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
80 try:
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
81 opts, args = getopt.getopt(sys.argv[1:],"hi:f:c:m:M:xo:C:v:")
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
82 except getopt.GetoptError, err:
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
83 sys.stderr.write( "%s\n" % ( str(err) ) )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
84 self.help(); sys.exit(1)
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
85 for o,a in opts:
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
86 if o == "-h":
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
87 self.help(); sys.exit(0)
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
88 elif o == "-i":
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
89 self.setInputData( a )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
90 elif o == "-f":
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
91 self.setInputFormat( a )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
92 elif o == "-c":
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
93 self.setCoordinatesToConvert( a )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
94 elif o == "-m":
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
95 self.setMapData( a )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
96 elif o == "-M":
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
97 self.setMergeChunkOverlaps( a )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
98 elif o == "-o":
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
99 self.setOutputData( a )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
100 elif o == "-C":
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
101 self.setConfigFile( a )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
102 elif o == "-v":
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
103 self.setVerbosityLevel( a )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
104
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
105
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
106 def setInputData( self, inData ):
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
107 self._inData = inData
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
108
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
109 def setInputFormat( self, formatInData ):
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
110 self._formatInData = formatInData
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
111
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
112 def setCoordinatesToConvert( self, coordToConvert ):
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
113 self._coordToConvert = coordToConvert
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
114
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
115 def setMapData( self, mapData ):
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
116 self._mapData = mapData
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
117
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
118 def setMergeChunkOverlaps( self, mergeChunkOverlaps ):
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
119 if mergeChunkOverlaps == "yes":
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
120 self._mergeChunkOverlaps = True
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
121 else:
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
122 self._mergeChunkOverlaps = False
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
123
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
124 def setOutputData( self, outData ):
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
125 self._outData = outData
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
126
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
127 def setConfigFile( self, configFile ):
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
128 self._configFile = configFile
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
129
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
130 def setVerbosityLevel( self, verbose ):
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
131 self._verbose = int(verbose)
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
132
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
133
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
134 ## Check the attributes are valid before running the algorithm
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
135 #
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
136 def checkAttributes( self ):
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
137 if self._inData == "":
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
138 msg = "ERROR: missing input data (-i)"
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
139 sys.stderr.write( "%s\n" % ( msg ) )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
140 self.help(); sys.exit(1)
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
141 if self._formatInData not in ["align","path"]:
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
142 msg = "ERROR: unrecognized format '%s' (-f)" % ( self._formatInData )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
143 sys.stderr.write( "%s\n" % ( msg ) )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
144 self.help(); sys.exit(1)
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
145 if self._configFile == "":
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
146 self._iDb = DbFactory.createInstance()
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
147 elif not os.path.exists( self._configFile ):
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
148 msg = "ERROR: configuration file '%s' doesn't exist" % ( self._configFile )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
149 sys.stderr.write( "%s\n" % ( msg ) )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
150 self.help(); sys.exit(1)
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
151 else:
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
152 self._iDb = DbFactory.createInstance(self._configFile)
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
153 if not os.path.exists( self._inData ) and not self._iDb.doesTableExist( self._inData ):
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
154 msg = "ERROR: input data '%s' doesn't exist" % ( self._inData )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
155 sys.stderr.write( "%s\n" % ( msg ) )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
156 self.help(); sys.exit(1)
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
157 if os.path.exists( self._inData ):
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
158 self._typeInData = "file"
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
159 elif self._iDb.doesTableExist( self._inData ):
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
160 self._typeInData = "table"
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
161 if self._coordToConvert == "":
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
162 msg = "ERROR: missing coordinates to convert (-c)"
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
163 sys.stderr.write( "%s\n" % ( msg ) )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
164 self.help(); sys.exit(1)
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
165 if self._coordToConvert not in [ "q", "s", "qs" ]:
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
166 msg = "ERROR: unrecognized coordinates to convert '%s' (-c)" % ( self._coordToConvert )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
167 sys.stderr.write( "%s\n" % ( msg ) )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
168 self.help(); sys.exit(1)
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
169 if self._mapData == "":
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
170 msg = "ERROR: missing mapping coordinates of chunks on chromosomes (-m)"
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
171 sys.stderr.write( "%s\n" % ( msg ) )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
172 self.help(); sys.exit(1)
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
173 if not os.path.exists( self._mapData ) and not self._iDb.doesTableExist( self._mapData ):
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
174 msg = "ERROR: mapping data '%s' doesn't exist" % ( self._mapData )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
175 sys.stderr.write( "%s\n" % ( msg ) )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
176 self.help(); sys.exit(1)
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
177 if os.path.exists( self._mapData ):
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
178 self._typeMapData = "file"
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
179 elif self._iDb.doesTableExist( self._mapData ):
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
180 self._typeMapData = "table"
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
181 if self._outData == "":
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
182 if self._convertChunks:
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
183 self._outData = "%s.onChr" % ( self._inData )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
184 else:
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
185 self._outData = "%s.onChk" % ( self._inData )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
186 if self._typeInData == "table":
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
187 self._outData = self._outData.replace(".","_")
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
188
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
189
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
190 ## Return a dictionary with the mapping of the chunks on the chromosomes
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
191 #
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
192 def getChunkCoordsOnChromosomes( self ):
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
193 if self._typeMapData == "file":
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
194 dChunks2CoordMaps = MapUtils.getDictPerNameFromMapFile( self._mapData )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
195 elif self._typeMapData == "table":
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
196 tma = TableMapAdaptator( self._iDb, self._mapData )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
197 dChunks2CoordMaps = tma.getDictPerName()
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
198 if self._verbose > 0:
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
199 msg = "nb of chunks: %i" % ( len(dChunks2CoordMaps.keys()) )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
200 sys.stdout.write( "%s\n" % ( msg ) )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
201 return dChunks2CoordMaps
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
202
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
203
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
204 def getRangeOnChromosome( self, chkRange, dChunks2CoordMaps ):
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
205 chrRange = Range()
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
206 chunkName = chkRange.seqname
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
207 chrRange.seqname = dChunks2CoordMaps[ chunkName ].seqname
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
208 if dChunks2CoordMaps[ chunkName ].start == 1:
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
209 chrRange.start = chkRange.start
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
210 chrRange.end = chkRange.end
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
211 else:
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
212 startOfChkOnChr = dChunks2CoordMaps[ chunkName ].start
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
213 chrRange.start = startOfChkOnChr + chkRange.start - 1
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
214 chrRange.end = startOfChkOnChr + chkRange.end - 1
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
215 return chrRange
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
216
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
217
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
218 def convCoordsChkToChrFromAlignFile( self, inFile, dChunks2CoordMaps ):
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
219 return self.convCoordsChkToChrFromAlignOrPathFile( inFile, dChunks2CoordMaps, "align" )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
220
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
221
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
222 def convCoordsChkToChrFromPathFile( self, inFile, dChunks2CoordMaps ):
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
223 return self.convCoordsChkToChrFromAlignOrPathFile( inFile, dChunks2CoordMaps, "path" )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
224
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
225
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
226
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
227 ## Convert coordinates of a Path or Align file from chunks to chromosomes
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
228 #
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
229 def convCoordsChkToChrFromAlignOrPathFile( self, inFile, dChunks2CoordMaps, format ):
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
230 if self._verbose > 0:
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
231 msg = "start method 'convCoordsChkToChrFromAlignOrPathFile'"
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
232 sys.stdout.write( "%s\n" % ( msg ) )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
233 outFile = "%s.tmp" % ( inFile )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
234 inFileHandler = open( inFile, "r" )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
235 outFileHandler = open( outFile, "w" )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
236 if format == "align":
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
237 iObject = Align()
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
238 else:
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
239 iObject = Path()
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
240 countLine = 0
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
241
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
242 while True:
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
243 line = inFileHandler.readline()
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
244 if line == "":
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
245 break
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
246 countLine += 1
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
247 iObject.setFromString( line )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
248 if self._coordToConvert in [ "q", "qs" ]:
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
249 queryOnChr = self.getRangeOnChromosome( iObject.range_query, dChunks2CoordMaps )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
250 iObject.range_query = queryOnChr
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
251 if self._coordToConvert in [ "s", "qs" ]:
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
252 subjectOnChr = self.getRangeOnChromosome( iObject.range_subject, dChunks2CoordMaps )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
253 iObject.range_subject = subjectOnChr
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
254 iObject.write( outFileHandler )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
255 iObject.reset()
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
256
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
257 inFileHandler.close()
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
258 outFileHandler.close()
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
259 if self._verbose > 0:
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
260 msg = "end method 'convCoordsChkToChrFromAlignOrPathFile'"
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
261 sys.stdout.write( "%s\n" % ( msg ) )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
262 return outFile
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
263
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
264 ## Convert coordinates of a file from chunks to chromosomes
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
265 #
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
266 def convCoordsChkToChrFromFile( self, inFile, format, dChunks2CoordMaps ):
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
267 if self._verbose > 0:
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
268 msg = "start convCoordsChkToChrFromFile"
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
269 sys.stdout.write( "%s\n" % ( msg ) )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
270 if format == "align":
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
271 tmpAlignFile = self.convCoordsChkToChrFromAlignFile( inFile, dChunks2CoordMaps )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
272 tmpAlignTable = tmpAlignFile.replace(".","_").replace("-","_")
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
273 self._iDb.createTable( tmpAlignTable, "align", tmpAlignFile, True)
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
274 os.remove( tmpAlignFile )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
275 self._iDb.removeDoublons( tmpAlignTable )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
276 outTable = "%s_path" % ( tmpAlignTable )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
277 self._iDb.convertAlignTableIntoPathTable( tmpAlignTable, outTable )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
278 self._iDb.dropTable( tmpAlignTable )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
279 elif format == "path":
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
280 tmpPathFile = self.convCoordsChkToChrFromPathFile( inFile, dChunks2CoordMaps )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
281 outTable = tmpPathFile.replace(".","_").replace("-","_")
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
282 self._iDb.createTable( outTable, "path", tmpPathFile, True)
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
283 os.remove( tmpPathFile )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
284 if self._verbose > 0:
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
285 msg = "end convCoordsChkToChrFromFile"
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
286 sys.stdout.write( "%s\n" % ( msg ) )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
287 return outTable
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
288
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
289
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
290 ## Convert coordinates of a table from chunks to chromosomes
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
291 #
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
292 def convCoordsChkToChrFromTable( self, inTable, format, dChunks2CoordMaps ):
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
293 tmpFile = inTable
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
294 self._iDb.exportDataToFile( inTable, tmpFile, False )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
295 outTable = self.convCoordsChkToChrFromFile( tmpFile, format, dChunks2CoordMaps )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
296 os.remove( tmpFile )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
297 return outTable
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
298
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
299
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
300 def getListsDirectAndReversePaths( self, lPaths ):
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
301 lDirectPaths = []
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
302 lReversePaths = []
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
303 for iPath in lPaths:
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
304 if iPath.isQueryOnDirectStrand() and iPath.isSubjectOnDirectStrand():
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
305 lDirectPaths.append( iPath )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
306 else:
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
307 lReversePaths.append( iPath )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
308 return lDirectPaths, lReversePaths
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
309
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
310
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
311 def mergePaths( self, lPaths, lIdsToInsert, lIdsToDelete, dOldIdToNewId ):
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
312 if len(lPaths) < 2:
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
313 lIdsToInsert.append( lPaths[0].id )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
314 return
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
315 i = 0
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
316 while i < len(lPaths) - 1:
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
317 i += 1
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
318 if self._verbose > 1 and i==1 :
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
319 print lPaths[i-1]
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
320 if self._verbose > 1:
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
321 print lPaths[i]
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
322 sys.stdout.flush()
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
323 idPrev = lPaths[i-1].id
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
324 idNext = lPaths[i].id
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
325 if lPaths[i-1].canMerge( lPaths[i] ):
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
326 dOldIdToNewId[ idNext ] = idPrev
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
327 if idPrev not in lIdsToInsert:
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
328 lIdsToInsert.append( idPrev )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
329 if idNext not in lIdsToDelete:
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
330 lIdsToDelete.append( idNext )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
331 lPaths[i-1].merge( lPaths[i] )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
332 del lPaths[i]
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
333 i -= 1
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
334
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
335
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
336 def insertPaths( self, lPaths, lIdsToInsert, dOldIdToNewId ):
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
337 for iPath in lPaths:
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
338 if dOldIdToNewId.has_key( iPath.id ):
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
339 iPath.id = dOldIdToNewId[ iPath.id ]
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
340 if iPath.id in lIdsToInsert:
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
341 self._tpa.insert( iPath )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
342
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
343
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
344 ## Merge Path instances in a Path table when they correspond to chunk overlaps
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
345 #
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
346 def mergeCoordsOnChunkOverlaps( self, dChunks2CoordMaps, tmpPathTable ):
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
347 if self._verbose > 0:
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
348 msg = "start method 'mergeCoordsOnChunkOverlaps'"
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
349 sys.stdout.write( "%s\n" % ( msg ) )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
350 self._tpa = TablePathAdaptator( self._iDb, tmpPathTable )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
351 nbChunks = len(dChunks2CoordMaps.keys())
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
352 for numChunk in range(1,nbChunks):
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
353 chunkName1 = "chunk%s" % ( str(numChunk).zfill( len(str(nbChunks)) ) )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
354 chunkName2 = "chunk%s" % ( str(numChunk+1).zfill( len(str(nbChunks)) ) )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
355 if not dChunks2CoordMaps.has_key( chunkName2 ):
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
356 break
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
357 if self._verbose > 1:
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
358 msg = "try merge on '%s' and '%s'" % ( chunkName1, chunkName2 )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
359 sys.stdout.write( "%s\n" % ( msg ) )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
360 sys.stdout.flush()
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
361 chrName = dChunks2CoordMaps[ chunkName1 ].seqname
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
362 if dChunks2CoordMaps[ chunkName2 ].seqname != chrName:
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
363 if self._verbose > 1:
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
364 msg = "not on same chromosome (%s != %s)" % ( dChunks2CoordMaps[ chunkName2 ].seqname, chrName )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
365 sys.stdout.write( "%s\n" % ( msg ) )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
366 sys.stdout.flush()
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
367 continue
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
368 minCoord = min( dChunks2CoordMaps[ chunkName1 ].end, dChunks2CoordMaps[ chunkName2 ].start )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
369 maxCoord = max( dChunks2CoordMaps[ chunkName1 ].end, dChunks2CoordMaps[ chunkName2 ].start )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
370 lPaths = self._tpa.getChainListOverlappingQueryCoord( chrName, minCoord, maxCoord )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
371 if len(lPaths) == 0:
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
372 if self._verbose > 1:
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
373 msg = "no overlapping matches on %s (%i->%i)" % ( chrName, minCoord, maxCoord )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
374 sys.stdout.write( "%s\n" % ( msg ) )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
375 sys.stdout.flush()
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
376 continue
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
377 if self._verbose > 1:
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
378 msg = "%i overlapping matche(s) on %s (%i->%i)" % ( len(lPaths), chrName, minCoord, maxCoord )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
379 sys.stdout.write( "%s\n" % ( msg ) )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
380 sys.stdout.flush()
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
381 lSortedPaths = PathUtils.getPathListSortedByIncreasingMinQueryThenMaxQueryThenIdentifier( lPaths )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
382 lDirectPaths, lReversePaths = self.getListsDirectAndReversePaths( lSortedPaths )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
383 lIdsToInsert = []
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
384 lIdsToDelete = []
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
385 dOldIdToNewId = {}
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
386 if len(lDirectPaths) > 0:
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
387 self.mergePaths( lDirectPaths, lIdsToInsert, lIdsToDelete, dOldIdToNewId )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
388 if len(lReversePaths) > 0:
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
389 self.mergePaths( lReversePaths, lIdsToInsert, lIdsToDelete, dOldIdToNewId )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
390 self._tpa.deleteFromIdList( lIdsToDelete )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
391 self._tpa.deleteFromIdList( lIdsToInsert )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
392 self.insertPaths( lDirectPaths, lIdsToInsert, dOldIdToNewId )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
393 self.insertPaths( lReversePaths, lIdsToInsert, dOldIdToNewId )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
394 if self._verbose > 0:
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
395 msg = "end method 'mergeCoordsOnChunkOverlaps'"
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
396 sys.stdout.write( "%s\n" % ( msg ) )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
397 sys.stdout.flush()
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
398
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
399
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
400 def saveChrCoordsAsFile( self, tmpPathTable, outFile ):
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
401 self._iDb.exportDataToFile( tmpPathTable, tmpPathTable, False )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
402 self._iDb.dropTable( tmpPathTable )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
403 if self._formatInData == "align":
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
404 PathUtils.convertPathFileIntoAlignFile( tmpPathTable, outFile )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
405 os.remove( tmpPathTable )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
406 elif self._formatInData == "path":
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
407 os.rename( tmpPathTable, outFile )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
408
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
409
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
410 def saveChrCoordsAsTable( self, tmpPathTable, outTable ):
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
411 if self._formatInData == "align":
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
412 self._iDb.convertPathTableIntoAlignTable( tmpPathTable, outTable )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
413 self._iDb.dropTable( tmpPathTable )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
414 elif self._formatInData == "path":
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
415 self._iDb.renameTable( tmpPathTable, outTable )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
416
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
417
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
418 ## Convert coordinates from chunks to chromosomes
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
419 #
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
420 def convertCoordinatesFromChunksToChromosomes( self ):
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
421 dChunks2CoordMaps = self.getChunkCoordsOnChromosomes()
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
422
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
423 if self._typeInData == "file":
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
424 tmpPathTable = self.convCoordsChkToChrFromFile( self._inData, self._formatInData, dChunks2CoordMaps )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
425 elif self._typeInData == "table":
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
426 tmpPathTable = self.convCoordsChkToChrFromTable( self._inData, self._formatInData, dChunks2CoordMaps )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
427
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
428 if self._mergeChunkOverlaps:
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
429 self.mergeCoordsOnChunkOverlaps( dChunks2CoordMaps, tmpPathTable );
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
430
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
431 if self._typeInData == "file":
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
432 self.saveChrCoordsAsFile( tmpPathTable, self._outData )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
433 elif self._typeInData == "table":
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
434 self.saveChrCoordsAsTable( tmpPathTable, self._outData )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
435
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
436
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
437 ## Convert coordinates from chromosomes to chunks
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
438 #
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
439 def convertCoordinatesFromChromosomesToChunks( self ):
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
440 msg = "ERROR: convert coordinates from chromosomes to chunks not yet available"
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
441 sys.stderr.write( "%s\n" % ( msg ) )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
442 sys.exit(1)
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
443
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
444
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
445 ## Useful commands before running the program
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
446 #
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
447 def start( self ):
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
448 self.checkAttributes()
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
449 if self._verbose > 0:
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
450 msg = "START ConvCoord.py (%s)" % ( time.strftime("%m/%d/%Y %H:%M:%S") )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
451 msg += "\ninput data: %s" % ( self._inData )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
452 if self._typeInData == "file":
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
453 msg += " (file)\n"
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
454 else:
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
455 msg += " (table)\n"
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
456 msg += "format: %s\n" % ( self._formatInData )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
457 msg += "coordinates to convert: %s\n" % ( self._coordToConvert )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
458 msg += "mapping data: %s" % ( self._mapData )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
459 if self._typeMapData == "file":
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
460 msg += " (file)\n"
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
461 else:
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
462 msg += " (table)\n"
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
463 if self._mergeChunkOverlaps:
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
464 msg += "merge chunk overlaps\n"
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
465 else:
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
466 msg += "don't merge chunk overlaps\n"
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
467 if self._convertChunks:
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
468 msg += "convert chunks to chromosomes\n"
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
469 else:
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
470 msg += "convert chromosomes to chunks\n"
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
471 msg += "output data: %s" % ( self._outData )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
472 if self._typeInData == "file":
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
473 msg += " (file)\n"
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
474 else:
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
475 msg += " (table)\n"
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
476 sys.stdout.write( msg )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
477
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
478
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
479 ## Useful commands before ending the program
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
480 #
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
481 def end( self ):
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
482 self._iDb.close()
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
483 if self._verbose > 0:
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
484 msg = "END ConvCoord.py (%s)" % ( time.strftime("%m/%d/%Y %H:%M:%S") )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
485 sys.stdout.write( "%s\n" % ( msg ) )
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
486
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
487
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
488 ## Run the program
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
489 #
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
490 def run( self ):
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
491 self.start()
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
492
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
493 if self._convertChunks:
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
494 self.convertCoordinatesFromChunksToChromosomes()
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
495 else:
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
496 self.convertCoordinatesFromChromosomesToChunks()
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
497
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
498 self.end()
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
499
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
500
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
501 if __name__ == "__main__":
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
502 i = ConvCoord()
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
503 i.setAttributesFromCmdLine()
769e306b7933 Change the repository level.
yufei-luo
parents:
diff changeset
504 i.run()