Mercurial > repos > thondeboer > neat_genreads
view py/cigar.py @ 10:7d10b55965c9 draft default tip
planemo upload commit e96b43f96afce6a7b7dfd4499933aad7d05c955e-dirty
author | thondeboer |
---|---|
date | Wed, 16 May 2018 17:02:51 -0400 |
parents | 6e75a84e9338 |
children |
line wrap: on
line source
import re class CigarString: def __init__(self, stringIn=None, listIn=None): if stringIn == None and listIn == None: print '\nError: CigarString object not initialized.\n' exit(1) self.cigarData = [] if stringIn != None: self.joinCigar(j_stringIn=stringIn) if listIn != None: self.joinCigar(j_listIn=listIn) def stringToList(self, s): cigarDat = [] letters = re.split(r"\d+",s)[1:] numbers = [int(n) for n in re.findall(r"\d+",s)] dReserve = 0 for i in xrange(len(letters)): if letters[i] == 'D': dReserve = numbers[i] if letters[i] == 'M' or letters[i] == 'I': if dReserve: cigarDat += ['D'*dReserve+letters[i]] + [letters[i]]*(int(numbers[i])-1) else: cigarDat += [letters[i]]*int(numbers[i]) dReserve = 0 return cigarDat def listToString(self, l): symbols = '' currentSym = l[0] currentCount = 1 if 'D' in currentSym: currentSym = currentSym[-1] for k in xrange(1,len(l)): nextSym = l[k] if len(nextSym) == 1 and nextSym == currentSym: currentCount += 1 else: symbols += str(currentCount) + currentSym if 'D' in nextSym: symbols += str(nextSym.count('D')) + 'D' currentSym = nextSym[-1] else: currentSym = nextSym currentCount = 1 symbols += str(currentCount) + currentSym return symbols def getList(self): return self.cigarData def getString(self): return self.listToString(self.cigarData) def joinCigar(self, j_stringIn=None, j_listIn=None): if j_stringIn == None and j_listIn == None: print '\nError: Invalid join operation in CigarString\n' exit(1) if j_stringIn != None: self.cigarData += self.stringToList(j_stringIn) if j_listIn != None: self.cigarData += j_listIn def insertCigarElement(self, pos, i_stringIn=None, i_listIn=None): if i_stringIn == None and i_listIn == None: print '\nError: Invalid insertion operation in CigarString\n' exit(1) if pos < 0 or pos >= len(self.cigarData): print '\nError: Invalid insertion position in CigarString\n' exit(1) if i_stringIn != None: self.cigarData = self.cigarData[:pos] + self.stringToList(i_stringIn) + self.cigarData[pos:] if i_listIn != None: self.cigarData = self.cigarData[:pos] + i_listIn + self.cigarData[pos:] if __name__ == '__main__': print 'testing CigarString class...' str1 = '50M10D7I23M' str2 = '10I25M' iPos = 20 myCigar = CigarString(stringIn=str1) myCigar.insertCigarElement(iPos,i_stringIn=str2) print str1,'+',str2,'[inserted at position',str(iPos)+']','=',myCigar.getString()