annotate commons/pyRepetUnit/convCoord/PathChunkConnector.py @ 18:94ab73e8a190

Uploaded
author m-zytnicki
date Mon, 29 Apr 2013 03:20:15 -0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
18
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
1 from pyRepet.coord.Map import Map
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
2 import commons.core.sql.TablePathAdaptator
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
3
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
4
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
5 ## Connect overlapping chunks in a single fragment
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
6 #
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
7 class PathChunkConnector( object):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
8
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
9 def __init__(self, mapFileName, db, table, verbose):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
10
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
11 self._verbose = verbose
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
12 self._chunk = self._getChunkDictFromMapFileForConnectPathChunks( mapFileName )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
13 self._tablePathAdaptator = commons.core.sql.TablePathAdaptator.TablePathAdaptator( db, table )
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
14
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
15 def run (self):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
16 for num_chunk in xrange(1,len(self._chunk.keys())):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
17 chunkName = "chunk"+str(num_chunk)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
18 if self._verbose > 1:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
19 print chunkName
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
20 next_chunkName="chunk"+str(num_chunk+1)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
21
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
22 if next_chunkName not in self._chunk.keys():
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
23 break
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
24
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
25 start=self._chunk[chunkName][2]
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
26 end=self._chunk[next_chunkName][1]
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
27
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
28 if self._chunk[chunkName][0] == self._chunk[next_chunkName][0]:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
29 lpath=self._tablePathAdaptator.getPathListIncludedInQueryCoord(self._chunk[chunkName][0],start,end)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
30
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
31 if self._verbose > 1:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
32 print "----------"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
33
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
34 lpath.sort()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
35 chg_path_id={}
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
36 pathnum_to_ins=[]
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
37 pathnum_to_del=[]
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
38
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
39 self._createDirectAndReversePaths(lpath)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
40
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
41 self._mergeDirectPaths(chg_path_id, pathnum_to_ins, pathnum_to_del)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
42
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
43 if self._verbose > 1:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
44 print "..........."
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
45
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
46 self._mergeReversePaths(chg_path_id, pathnum_to_ins, pathnum_to_del)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
47
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
48 if self._verbose > 1:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
49 print "..........."
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
50 print pathnum_to_del
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
51
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
52 self._tablePathAdaptator.deleteFromIdList(pathnum_to_del)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
53
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
54 if self._verbose > 1:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
55 print pathnum_to_ins
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
56
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
57 self._tablePathAdaptator.deleteFromIdList(pathnum_to_ins)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
58
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
59 self._insertDirectPaths(chg_path_id, pathnum_to_ins)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
60
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
61 self._insertReversePaths(chg_path_id, pathnum_to_ins)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
62
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
63
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
64 def _createDirectAndReversePaths(self, lpath):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
65 self._dpath = []
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
66 self._rpath = []
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
67 for i in lpath:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
68 if i.range_query.isOnDirectStrand() and i.range_subject.isOnDirectStrand():
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
69 self._dpath.append(i)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
70 else:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
71 self._rpath.append(i)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
72
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
73 def _insertDirectPaths (self, chg_path_id, pathnum_to_ins):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
74 self._insertPaths(chg_path_id, pathnum_to_ins, self._dpath)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
75
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
76 def _insertReversePaths (self, chg_path_id, pathnum_to_ins):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
77 self._insertPaths(chg_path_id, pathnum_to_ins, self._rpath)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
78
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
79 def _insertPaths(self, chg_path_id, pathnum_to_ins, paths2Insert):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
80 for i in paths2Insert:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
81 if chg_path_id.has_key(i.id):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
82 i.id = chg_path_id[i.id]
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
83
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
84 if self._verbose > 1:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
85 i.show()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
86
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
87 if i.id in pathnum_to_ins:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
88 self._tablePathAdaptator.insert(i)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
89 if self._verbose > 1:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
90 print "--> inserted!"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
91
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
92 if self._verbose > 1:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
93 print "=========="
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
94
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
95 def _mergeDirectPaths(self, chg_path_id, pathnum_to_ins, pathnum_to_del):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
96 self._mergePaths(chg_path_id, pathnum_to_ins, pathnum_to_del, self._dpath)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
97
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
98 def _mergeReversePaths(self, chg_path_id, pathnum_to_ins, pathnum_to_del):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
99 self._mergePaths(chg_path_id, pathnum_to_ins, pathnum_to_del, self._rpath)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
100
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
101 def _mergePaths(self, chg_path_id, pathnum_to_ins, pathnum_to_del, dpath):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
102 x = 0
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
103 while x < len(dpath) - 1:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
104 x = x + 1
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
105 if self._verbose > 1:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
106 print "++++"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
107 dpath[x - 1].show()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
108 dpath[x].show()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
109
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
110 if dpath[x - 1].canMerge(dpath[x]):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
111 chg_path_id[dpath[x].id] = dpath[x - 1].id
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
112 if dpath[x - 1].id not in pathnum_to_ins:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
113 pathnum_to_ins.append(dpath[x - 1].id)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
114
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
115 if dpath[x].id not in pathnum_to_del:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
116 pathnum_to_del.append(dpath[x].id)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
117
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
118 dpath[x - 1].merge(dpath[x])
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
119 del dpath[x]
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
120 x = x - 1
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
121 if self._verbose > 1:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
122 print "--> merged"
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
123
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
124 def _getChunkDictFromMapFileForConnectPathChunks(self, mapFileName):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
125 mapDict = {}
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
126 mapFile = open(mapFileName)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
127 mapInstance = Map()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
128 while True:
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
129 if not mapInstance.read(mapFile):
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
130 break
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
131 mapDict[mapInstance.name] = (mapInstance.seqname, mapInstance.start, mapInstance.end)
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
132
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
133 mapFile.close()
94ab73e8a190 Uploaded
m-zytnicki
parents:
diff changeset
134 return mapDict