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