diff commons/pyRepetUnit/convCoord/PathChunkConnector.py @ 31:0ab839023fe4

Uploaded
author m-zytnicki
date Tue, 30 Apr 2013 14:33:21 -0400
parents 94ab73e8a190
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commons/pyRepetUnit/convCoord/PathChunkConnector.py	Tue Apr 30 14:33:21 2013 -0400
@@ -0,0 +1,134 @@
+from pyRepet.coord.Map import Map
+import commons.core.sql.TablePathAdaptator
+
+
+## Connect overlapping chunks in a single fragment  
+#
+class PathChunkConnector( object):
+    
+    def __init__(self, mapFileName, db, table, verbose):
+       
+        self._verbose = verbose
+        self._chunk = self._getChunkDictFromMapFileForConnectPathChunks( mapFileName )
+        self._tablePathAdaptator = commons.core.sql.TablePathAdaptator.TablePathAdaptator( db, table )
+    
+    def run (self):
+        for num_chunk in xrange(1,len(self._chunk.keys())):
+            chunkName = "chunk"+str(num_chunk)
+            if self._verbose > 1:
+                print chunkName
+            next_chunkName="chunk"+str(num_chunk+1)
+    
+            if next_chunkName not in self._chunk.keys():
+                break
+            
+            start=self._chunk[chunkName][2]
+            end=self._chunk[next_chunkName][1]
+            
+            if self._chunk[chunkName][0] == self._chunk[next_chunkName][0]:
+                lpath=self._tablePathAdaptator.getPathListIncludedInQueryCoord(self._chunk[chunkName][0],start,end)
+            
+                if self._verbose > 1:
+                    print "----------"
+                
+                lpath.sort()
+                chg_path_id={}
+                pathnum_to_ins=[]
+                pathnum_to_del=[]
+                
+                self._createDirectAndReversePaths(lpath)
+                        
+                self._mergeDirectPaths(chg_path_id, pathnum_to_ins, pathnum_to_del)
+                
+                if self._verbose > 1:
+                    print "..........."
+     
+                self._mergeReversePaths(chg_path_id, pathnum_to_ins, pathnum_to_del)
+                
+                if self._verbose > 1:
+                    print "..........."
+                    print pathnum_to_del
+                    
+                self._tablePathAdaptator.deleteFromIdList(pathnum_to_del)
+                
+                if self._verbose > 1:
+                    print pathnum_to_ins
+                
+                self._tablePathAdaptator.deleteFromIdList(pathnum_to_ins)
+                
+                self._insertDirectPaths(chg_path_id, pathnum_to_ins)
+               
+                self._insertReversePaths(chg_path_id, pathnum_to_ins)
+    
+
+    def _createDirectAndReversePaths(self, lpath):
+        self._dpath = []
+        self._rpath = []
+        for i in lpath:
+            if i.range_query.isOnDirectStrand() and i.range_subject.isOnDirectStrand():
+                self._dpath.append(i)
+            else:
+                self._rpath.append(i)
+                
+    def _insertDirectPaths (self, chg_path_id, pathnum_to_ins):
+        self._insertPaths(chg_path_id, pathnum_to_ins, self._dpath)
+
+    def _insertReversePaths (self, chg_path_id, pathnum_to_ins):
+        self._insertPaths(chg_path_id, pathnum_to_ins, self._rpath)
+
+    def _insertPaths(self, chg_path_id, pathnum_to_ins, paths2Insert):
+        for i in paths2Insert:
+            if chg_path_id.has_key(i.id):
+                i.id = chg_path_id[i.id]
+            
+            if self._verbose > 1:
+                i.show()
+            
+            if i.id in pathnum_to_ins:
+                self._tablePathAdaptator.insert(i)
+                if self._verbose > 1:
+                    print "--> inserted!"
+            
+            if self._verbose > 1:
+                print "=========="
+    
+    def _mergeDirectPaths(self, chg_path_id, pathnum_to_ins, pathnum_to_del):
+        self._mergePaths(chg_path_id, pathnum_to_ins, pathnum_to_del, self._dpath)
+    
+    def _mergeReversePaths(self, chg_path_id, pathnum_to_ins, pathnum_to_del):
+        self._mergePaths(chg_path_id, pathnum_to_ins, pathnum_to_del, self._rpath)
+            
+    def _mergePaths(self, chg_path_id, pathnum_to_ins, pathnum_to_del, dpath):
+        x = 0
+        while x < len(dpath) - 1:
+            x = x + 1
+            if self._verbose > 1:
+                print "++++"
+                dpath[x - 1].show()
+                dpath[x].show()
+            
+            if dpath[x - 1].canMerge(dpath[x]):
+                chg_path_id[dpath[x].id] = dpath[x - 1].id
+                if dpath[x - 1].id not in pathnum_to_ins:
+                    pathnum_to_ins.append(dpath[x - 1].id)
+                
+                if dpath[x].id not in pathnum_to_del:
+                    pathnum_to_del.append(dpath[x].id)
+                
+                dpath[x - 1].merge(dpath[x])
+                del dpath[x]
+                x = x - 1
+                if self._verbose > 1:
+                    print "--> merged"
+                
+    def _getChunkDictFromMapFileForConnectPathChunks(self, mapFileName):
+        mapDict = {}
+        mapFile = open(mapFileName)
+        mapInstance = Map()
+        while True:
+            if not mapInstance.read(mapFile):
+                break
+            mapDict[mapInstance.name] = (mapInstance.seqname, mapInstance.start, mapInstance.end)
+            
+        mapFile.close()
+        return mapDict