def addInsertion(self, idx, length, useUndoStack=True): """ Adds an insertion or skip at idx. length should be >0 for an insertion -1 for a skip """ cmds = [] idxLow, idxHigh = self.idxs() if idxLow <= idx <= idxHigh: if not self.hasInsertionAt(idx): # make sure length is -1 if a skip if length < 0: length = -1 if useUndoStack: cmds.append(self.oligo().applySequenceCMD( None, useUndoStack=useUndoStack)) for strand in self.getComplementStrands(): cmds.append(strand.oligo().applySequenceCMD( None, useUndoStack=useUndoStack)) cmds.append(Strand.AddInsertionCommand(self, idx, length)) util.execCommandList(self, cmds, desc="Add Insertion", useUndoStack=useUndoStack)
def _addPart(self, part, useUndoStack=True): """Add part to the document via AddPartCommand.""" c = self.AddPartCommand(self, part) util.execCommandList(self, [c], desc="Add part", useUndoStack=useUndoStack) return c.part()
def applyColor(self, color, useUndoStack=True): if color == self._color: return # oligo already has color c = Oligo.ApplyColorCommand(self, color) util.execCommandList(self, [c], desc="Color Oligo", useUndoStack=useUndoStack)
def resize(self, newIdxs, useUndoStack=True): cmds = [] if self.strandSet().isScaffold(): cmds.append(self.oligo().applySequenceCMD(None)) cmds += self.getRemoveInsertionCommands(newIdxs) cmds.append(Strand.ResizeCommand(self, newIdxs)) util.execCommandList(self, cmds, desc="Resize strand", useUndoStack=useUndoStack)
def mergeStrands(self, priorityStrand, otherStrand, useUndoStack=True): """ Merge the priorityStrand and otherStrand into a single new strand. The oligo of priority should be propagated to the other and all of its connections. """ lowAndHighStrands = self.strandsCanBeMerged(priorityStrand, otherStrand) if lowAndHighStrands: strandLow, strandHigh = lowAndHighStrands isInSet, overlap, lowStrandSetIdx = self._findIndexOfRangeFor(strandLow) if isInSet: c = StrandSet.MergeCommand(strandLow, strandHigh, \ lowStrandSetIdx, priorityStrand) util.execCommandList(self, [c], desc="Merge", useUndoStack=useUndoStack)
def splitStrand(self, strand, baseIdx, updateSequence=True, useUndoStack=True): """ Break strand into two strands. Reapply sequence by default (disabled during autostaple). """ if self.strandCanBeSplit(strand, baseIdx): isInSet, overlap, strandSetIdx = self._findIndexOfRangeFor(strand) if isInSet: c = StrandSet.SplitCommand(strand, baseIdx, strandSetIdx, updateSequence) util.execCommandList(self, [c], desc="Split", useUndoStack=useUndoStack) return True else: return False else: return False
def removeInsertion(self, idx, useUndoStack=True): cmds = [] idxLow, idxHigh = self.idxs() if idxLow <= idx <= idxHigh: if self.hasInsertionAt(idx): cmds.append(self.oligo().applySequenceCMD( None, useUndoStack=useUndoStack)) for strand in self.getComplementStrands(): cmds.append(strand.oligo().applySequenceCMD( None, useUndoStack=useUndoStack)) cmds.append(Strand.RemoveInsertionCommand(self, idx)) util.execCommandList(self, cmds, desc="Remove Insertion", useUndoStack=useUndoStack)
def removeStrand(self, strand, strandSetIdx=None, useUndoStack=True, solo=True): """ solo is an argument to enable limiting signals emiting from the command in the case the command is instantiated part of a larger command """ cmds = [] if strandSetIdx == None: isInSet, overlap, strandSetIdx = self._findIndexOfRangeFor(strand) if not isInSet: raise IndexError if self.isScaffold() and strand.sequence() != None: cmds.append(strand.oligo().applySequenceCMD(None)) cmds += strand.clearDecoratorCommands() cmds.append(StrandSet.RemoveStrandCommand(self, strand, strandSetIdx, solo)) util.execCommandList(self, cmds, desc="Remove strand", useUndoStack=useUndoStack) return strandSetIdx
def createDeserializedStrand(self, baseIdxLow, baseIdxHigh, useUndoStack=False): """ Passes a strand to AddStrandCommand that was read in from file input. Omits the step of checking _couldStrandInsertAtLastIndex, since we assume that deserialized strands will not cause collisions. """ boundsLow, boundsHigh = self.getBoundsOfEmptyRegionContaining(baseIdxLow) assert(baseIdxLow < baseIdxHigh) assert(boundsLow <= baseIdxLow) assert(baseIdxHigh <= boundsHigh) canInsert, strandSetIdx = self.getIndexToInsert(baseIdxLow, baseIdxHigh) if canInsert: c = StrandSet.CreateStrandCommand(self, baseIdxLow, baseIdxHigh, strandSetIdx) util.execCommandList(self, [c], desc=None, useUndoStack=useUndoStack) return strandSetIdx else: return -1
def createStrand(self, baseIdxLow, baseIdxHigh, useUndoStack=True): """ Assumes a strand is being created at a valid set of indices. """ boundsLow, boundsHigh = \ self.getBoundsOfEmptyRegionContaining(baseIdxLow) canInsert, strandSetIdx = \ self.getIndexToInsert(baseIdxLow, baseIdxHigh) if canInsert: c = StrandSet.CreateStrandCommand(self, baseIdxLow, baseIdxHigh, strandSetIdx) row, col = self._virtualHelix.coord() # d = "(%d,%d).%d + [%d,%d]" % \ # (row, col, self._strandType, baseIdxLow, baseIdxHigh) d = "(%d,%d).%d^%d" % (row, col, self._strandType, strandSetIdx) util.execCommandList(self, [c], desc=d, useUndoStack=useUndoStack) return strandSetIdx else: return -1
def changeInsertion(self, idx, length, useUndoStack=True): cmds = [] idxLow, idxHigh = self.idxs() if idxLow <= idx <= idxHigh: if self.hasInsertionAt(idx): if length == 0: self.removeInsertion(idx) else: # make sure length is -1 if a skip if length < 0: length = -1 cmds.append(self.oligo().applySequenceCMD( None, useUndoStack=useUndoStack)) for strand in self.getComplementStrands(): cmds.append(strand.oligo().applySequenceCMD( None, useUndoStack=useUndoStack)) cmds.append( Strand.ChangeInsertionCommand(self, idx, length)) util.execCommandList(self, cmds, desc="Change Insertion", useUndoStack=useUndoStack)
def applySequence(self, sequence, useUndoStack=True): c = Oligo.ApplySequenceCommand(self, sequence) util.execCommandList(self, [c], desc="Apply Sequence", useUndoStack=useUndoStack)
def remove(self, useUndoStack=True): c = Oligo.RemoveOligoCommand(self) util.execCommandList(self, [c], desc="Color Oligo", useUndoStack=useUndoStack)