class InsertNanotube_PropertyManager(DnaOrCnt_PropertyManager): """ The InsertNanotube_PropertyManager class provides a Property Manager for the B{Build > Nanotube > CNT} command. @ivar title: The title that appears in the property manager header. @type title: str @ivar pmName: The name of this property manager. This is used to set the name of the PM_Dialog object via setObjectName(). @type name: str @ivar iconPath: The relative path to the PNG file that contains a 22 x 22 icon image that appears in the PM header. @type iconPath: str """ title = "Insert Nanotube" pmName = title iconPath = "ui/actions/Tools/Build Structures/InsertNanotube.png" def __init__(self, win, editCommand): """ Constructor for the Nanotube property manager. """ self.endPoint1 = None self.endPoint2 = None self.nanotube = Nanotube() # A 5x5 CNT. _superclass.__init__(self, win, editCommand) self.showTopRowButtons( PM_DONE_BUTTON | \ PM_CANCEL_BUTTON | \ PM_WHATS_THIS_BUTTON) def connect_or_disconnect_signals(self, isConnect): """ Connect or disconnect widget signals sent to their slot methods. This can be overridden in subclasses. By default it does nothing. @param isConnect: If True the widget will send the signals to the slot method. @type isConnect: boolean """ if isConnect: change_connect = self.win.connect else: change_connect = self.win.disconnect change_connect(self.ntTypeComboBox, SIGNAL("currentIndexChanged(const QString&)"), self._ntTypeComboBoxChanged) change_connect(self.chiralityNSpinBox, SIGNAL("valueChanged(int)"), self._chiralityFixup) change_connect(self.chiralityMSpinBox, SIGNAL("valueChanged(int)"), self._chiralityFixup) change_connect(self.endingsComboBox, SIGNAL("currentIndexChanged(const QString&)"), self._endingsComboBoxChanged) # This spin box is currently hidden. change_connect(self.bondLengthDoubleSpinBox, SIGNAL("valueChanged(double)"), self._bondLengthChanged) change_connect(self.showCursorTextCheckBox, SIGNAL('stateChanged(int)'), self._update_state_of_cursorTextGroupBox) def ok_btn_clicked(self): """ Slot for the OK button """ if self.editCommand: self.editCommand.preview_or_finalize_structure(previewing=False) ##env.history.message(self.editCommand.logMessage) self.win.toolsDone() def cancel_btn_clicked(self): """ Slot for the Cancel button. """ if self.editCommand: self.editCommand.cancelStructure() self.win.toolsCancel() def _update_widgets_in_PM_before_show(self): """ Update various widgets in this Property manager. Overrides MotorPropertyManager._update_widgets_in_PM_before_show. The various widgets , (e.g. spinboxes) will get values from the structure for which this propMgr is constructed for (self.editcCntroller.struct) @see: MotorPropertyManager._update_widgets_in_PM_before_show @see: self.show where it is called. """ pass def getFlyoutActionList(self): """ Returns custom actionlist that will be used in a specific mode or editing a feature etc Example: while in movie mode, the _createFlyoutToolBar method calls this. """ #'allActionsList' returns all actions in the flyout toolbar #including the subcontrolArea actions allActionsList = [] #Action List for subcontrol Area buttons. #In this mode there is really no subcontrol area. #We will treat subcontrol area same as 'command area' #(subcontrol area buttons will have an empty list as their command area #list). We will set the Comamnd Area palette background color to the #subcontrol area. subControlAreaActionList = [] self.exitEditCommandAction.setChecked(True) subControlAreaActionList.append(self.exitEditCommandAction) separator = QAction(self.w) separator.setSeparator(True) subControlAreaActionList.append(separator) allActionsList.extend(subControlAreaActionList) #Empty actionlist for the 'Command Area' commandActionLists = [] #Append empty 'lists' in 'commandActionLists equal to the #number of actions in subControlArea for i in range(len(subControlAreaActionList)): lst = [] commandActionLists.append(lst) params = (subControlAreaActionList, commandActionLists, allActionsList) return params def _addGroupBoxes(self): """ Add the Insert Nanotube Property Manager group boxes. """ self._pmGroupBox1 = PM_GroupBox(self, title="Endpoints") self._loadGroupBox1(self._pmGroupBox1) self._pmGroupBox1.hide() self._pmGroupBox2 = PM_GroupBox(self, title="Parameters") self._loadGroupBox2(self._pmGroupBox2) self._displayOptionsGroupBox = PM_GroupBox(self, title="Display Options") self._loadDisplayOptionsGroupBox(self._displayOptionsGroupBox) self._pmGroupBox3 = PM_GroupBox(self, title="Nanotube Distortion") self._loadGroupBox3(self._pmGroupBox3) self._pmGroupBox3.hide() #@ Temporary. self._pmGroupBox4 = PM_GroupBox(self, title="Multi-Walled CNTs") self._loadGroupBox4(self._pmGroupBox4) self._pmGroupBox4.hide() #@ Temporary. self._pmGroupBox5 = PM_GroupBox(self, title="Advanced Options") self._loadGroupBox5(self._pmGroupBox5) self._pmGroupBox5.hide() #@ Temporary. def _loadGroupBox1(self, pmGroupBox): """ Load widgets in group box 1. """ #Following toolbutton facilitates entering a temporary NanotubeLineMode #to create a CNT using endpoints of the specified line. self.specifyCntLineButton = PM_ToolButton( pmGroupBox, text="Specify Endpoints", iconPath="ui/actions/Properties Manager/Pencil.png", spanWidth=True) self.specifyCntLineButton.setCheckable(True) self.specifyCntLineButton.setAutoRaise(True) self.specifyCntLineButton.setToolButtonStyle( Qt.ToolButtonTextBesideIcon) #EndPoint1 and endPoint2 coordinates. These widgets are hidden # as of 2007- 12 - 05 self._endPoint1SpinBoxes = PM_CoordinateSpinBoxes(pmGroupBox, label="End Point 1") self.x1SpinBox = self._endPoint1SpinBoxes.xSpinBox self.y1SpinBox = self._endPoint1SpinBoxes.ySpinBox self.z1SpinBox = self._endPoint1SpinBoxes.zSpinBox self._endPoint2SpinBoxes = PM_CoordinateSpinBoxes(pmGroupBox, label="End Point 2") self.x2SpinBox = self._endPoint2SpinBoxes.xSpinBox self.y2SpinBox = self._endPoint2SpinBoxes.ySpinBox self.z2SpinBox = self._endPoint2SpinBoxes.zSpinBox self._endPoint1SpinBoxes.hide() self._endPoint2SpinBoxes.hide() def _loadGroupBox2(self, pmGroupBox): """ Load widgets in group box 2. """ _ntTypeChoices = ['Carbon', 'Boron Nitride'] self.ntTypeComboBox = \ PM_ComboBox( pmGroupBox, label = "Type:", choices = _ntTypeChoices, setAsDefault = True) self.ntRiseDoubleSpinBox = \ PM_DoubleSpinBox( pmGroupBox, label = "Rise:", value = self.nanotube.getRise(), setAsDefault = True, minimum = 2.0, maximum = 4.0, decimals = 3, singleStep = 0.01 ) self.ntRiseDoubleSpinBox.hide() # Nanotube Length self.ntLengthLineEdit = \ PM_LineEdit( pmGroupBox, label = "Nanotube Length: ", text = "0.0 Angstroms", setAsDefault = False) self.ntLengthLineEdit.setDisabled(True) self.ntLengthLineEdit.hide() # Nanotube diameter self.ntDiameterLineEdit = \ PM_LineEdit( pmGroupBox, label = "Diameter: ", setAsDefault = False) self.ntDiameterLineEdit.setDisabled(True) self.updateNanotubeDiameter() self.chiralityNSpinBox = \ PM_SpinBox( pmGroupBox, label = "Chirality (n):", value = self.nanotube.getChiralityN(), minimum = 2, maximum = 100, setAsDefault = True ) self.chiralityMSpinBox = \ PM_SpinBox( pmGroupBox, label = "Chirality (m):", value = self.nanotube.getChiralityM(), minimum = 0, maximum = 100, setAsDefault = True ) # How about having user prefs for CNT and BNNT bond lengths? # I'm guessing that if the user wants to set these values, they will # do it once and would like those bond length values persist forever. # Need to discuss with others to determine if this spinbox comes out. # --Mark 2008-03-29 self.bondLengthDoubleSpinBox = \ PM_DoubleSpinBox( pmGroupBox, label = "Bond length:", value = self.nanotube.getBondLength(), setAsDefault = True, minimum = 1.0, maximum = 3.0, singleStep = 0.1, decimals = 3, suffix = " Angstroms" ) #self.bondLengthDoubleSpinBox.hide() endingChoices = ["Hydrogen", "None"] # Removed:, "Nitrogen"] self.endingsComboBox= \ PM_ComboBox( pmGroupBox, label = "Endings:", choices = endingChoices, index = 0, setAsDefault = True, spanWidth = False ) def _loadGroupBox3(self, inPmGroupBox): """ Load widgets in group box 3. """ self.zDistortionDoubleSpinBox = \ PM_DoubleSpinBox( inPmGroupBox, label = "Z-distortion:", value = 0.0, setAsDefault = True, minimum = 0.0, maximum = 10.0, singleStep = 0.1, decimals = 3, suffix = " Angstroms" ) self.xyDistortionDoubleSpinBox = \ PM_DoubleSpinBox( inPmGroupBox, label = "XY-distortion:", value = 0.0, setAsDefault = True, minimum = 0.0, maximum = 2.0, singleStep = 0.1, decimals = 3, suffix = " Angstroms" ) self.twistSpinBox = \ PM_SpinBox( inPmGroupBox, label = "Twist:", value = 0, setAsDefault = True, minimum = 0, maximum = 100, # What should maximum be? suffix = " deg/A" ) self.bendSpinBox = \ PM_SpinBox( inPmGroupBox, label = "Bend:", value = 0, setAsDefault = True, minimum = 0, maximum = 360, suffix = " deg" ) def _loadGroupBox4(self, inPmGroupBox): """ Load widgets in group box 4. """ # "Number of Nanotubes" SpinBox self.mwntCountSpinBox = \ PM_SpinBox( inPmGroupBox, label = "Number:", value = 1, setAsDefault = True, minimum = 1, maximum = 10, suffix = " nanotubes" ) self.mwntCountSpinBox.setSpecialValueText("SWNT") # "Spacing" lineedit. self.mwntSpacingDoubleSpinBox = \ PM_DoubleSpinBox( inPmGroupBox, label = "Spacing:", value = 2.46, setAsDefault = True, minimum = 1.0, maximum = 10.0, singleStep = 0.1, decimals = 3, suffix = " Angstroms" ) def _loadGroupBox5(self, pmGroupBox): """ Load widgets in group box 5. """ self._rubberbandLineGroupBox = PM_GroupBox(pmGroupBox, title='Rubber band Line:') ntLineChoices = ['Ladder'] self.ntRubberBandLineDisplayComboBox = \ PM_ComboBox( self._rubberbandLineGroupBox , label = " Display as:", choices = ntLineChoices, setAsDefault = True) self.lineSnapCheckBox = \ PM_CheckBox(self._rubberbandLineGroupBox , text = 'Enable line snap' , widgetColumn = 1, state = Qt.Checked ) def _connect_showCursorTextCheckBox(self): """ Connect the show cursor text checkbox with user prefs_key. Overrides DnaOrCnt_PropertyManager._connect_showCursorTextCheckBox """ connect_checkbox_with_boolean_pref( self.showCursorTextCheckBox, insertNanotubeEditCommand_showCursorTextCheckBox_prefs_key) def _params_for_creating_cursorTextCheckBoxes(self): """ Returns params needed to create various cursor text checkboxes connected to prefs_keys that allow custom cursor texts. @return: A list containing tuples in the following format: ('checkBoxTextString' , preference_key). PM_PrefsCheckBoxes uses this data to create checkboxes with the the given names and connects them to the provided preference keys. (Note that PM_PrefsCheckBoxes puts thes within a GroupBox) @rtype: list @see: PM_PrefsCheckBoxes @see: self._loadDisplayOptionsGroupBox where this list is used. @see: Superclass method which is overridden here -- DnaOrCnt_PropertyManager._params_for_creating_cursorTextCheckBoxes() """ params = \ [ #Format: (" checkbox text", prefs_key) ("Nanotube length", insertNanotubeEditCommand_cursorTextCheckBox_length_prefs_key ), ("Angle", insertNanotubeEditCommand_cursorTextCheckBox_angle_prefs_key ) ] return params def _addToolTipText(self): """ Tool Tip text for widgets in the Insert Nanotube Property Manager. """ pass def _setEndPoints(self): """ Set the two endpoints of the nanotube using the values from the X, Y, Z coordinate spinboxes in the property manager. @note: The group box containing the 2 sets of XYZ spin boxes are currently hidden. """ # First endpoint (origin) of nanotube x1 = self.x1SpinBox.value() y1 = self.y1SpinBox.value() z1 = self.z1SpinBox.value() # Second endpoint (direction vector/axis) of nanotube. x2 = self.x2SpinBox.value() y2 = self.y2SpinBox.value() z2 = self.z2SpinBox.value() if not self.endPoint1: self.endPoint1 = V(x1, y1, z1) if not self.endPoint2: self.endPoint2 = V(x2, y2, z2) self.nanotube.setEndPoints(self.endPoint1, self.endPoint2) # Need arg "recompute=True", which will recompute the second # endpoint (endPoint2) using the nanotube rise. def getParameters(self): """ Return the parameters from this property manager to be used to create the nanotube. @return: A nanotube instance with its attrs set to the current parameters in the property manager. @rtype: L{Nanotube} @see: L{InsertNanotube_EditCommand._gatherParameters} where this is used """ self._setEndPoints() return (self.nanotube) def _ntTypeComboBoxChanged(self, type): """ Slot for the Type combobox. It is called whenever the Type choice is changed. @param inIndex: The new index. @type inIndex: int """ self.nanotube.setType(str(type)) print "Bond Length =", self.nanotube.getBondLength() self.bondLengthDoubleSpinBox.setValue(self.nanotube.getBondLength()) #self.bondLengthDoubleSpinBox.setValue(ntBondLengths[inIndex]) def _bondLengthChanged(self, bondLength): """ Slot for the B{Bond Length} spinbox. """ self.nanotube.setBondLength(bondLength) self.updateNanotubeDiameter() return def _chiralityFixup(self, spinBoxValueJunk=None): """ Slot for several validators for different parameters. This gets called whenever the user changes the n, m chirality values. @param spinBoxValueJunk: This is the Spinbox value from the valueChanged signal. It is not used. We just want to know that the spinbox value has changed. @type spinBoxValueJunk: double or None """ _n, _m = self.nanotube.setChirality(self.chiralityNSpinBox.value(), self.chiralityMSpinBox.value()) #self.n, self.m = self.nanotube.getChirality() self.connect_or_disconnect_signals(isConnect=False) self.chiralityNSpinBox.setValue(_n) self.chiralityMSpinBox.setValue(_m) self.connect_or_disconnect_signals(isConnect=True) self.updateNanotubeDiameter() def updateNanotubeDiameter(self): """ Update the nanotube Diameter lineEdit widget. """ diameterText = "%-7.4f Angstroms" % (self.nanotube.getDiameter()) self.ntDiameterLineEdit.setText(diameterText) # ntRiseDoubleSpinBox is currently hidden. self.ntRiseDoubleSpinBox.setValue(self.nanotube.getRise()) def _endingsComboBoxChanged(self, endings): """ Slot for the B{Ending} combobox. @param endings: The option's text. @type endings: string """ self.nanotube.setEndings(str(endings)) return def _addWhatsThisText(self): """ What's This text for widgets in this Property Manager. """ whatsThis_InsertNanotube_PropertyManager(self) return
class BackrubProteinSim_PropertyManager(Command_PropertyManager): """ The BackrubProteinSim_PropertyManager class provides a Property Manager for the B{Fixed backbone Protein Sequence Design} command on the flyout toolbar in the Build > Protein > Simulate mode. @ivar title: The title that appears in the property manager header. @type title: str @ivar pmName: The name of this property manager. This is used to set the name of the PM_Dialog object via setObjectName(). @type name: str @ivar iconPath: The relative path to the PNG file that contains a 22 x 22 icon image that appears in the PM header. @type iconPath: str """ title = "Backrub Motion" pmName = title iconPath = "ui/actions/Command Toolbar/BuildProtein/Backrub.png" def __init__(self, command): """ Constructor for the property manager. """ _superclass.__init__(self, command) self.showTopRowButtons( PM_DONE_BUTTON | \ PM_WHATS_THIS_BUTTON) msg = "Choose various parameters from below to design an optimized" \ " protein sequence with Rosetta with backrub motion allowed." self.updateMessage(msg) def connect_or_disconnect_signals(self, isConnect=True): """ Connect or disconnect widget signals sent to their slot methods. This can be overridden in subclasses. By default it does nothing. @param isConnect: If True the widget will send the signals to the slot method. @type isConnect: boolean """ if isConnect: change_connect = self.win.connect else: change_connect = self.win.disconnect change_connect(self.ex1Checkbox, SIGNAL("stateChanged(int)"), self.update_ex1) change_connect(self.ex1aroCheckbox, SIGNAL("stateChanged(int)"), self.update_ex1aro) change_connect(self.ex2Checkbox, SIGNAL("stateChanged(int)"), self.update_ex2) change_connect(self.ex2aroOnlyCheckbox, SIGNAL("stateChanged(int)"), self.update_ex2aro_only) change_connect(self.ex3Checkbox, SIGNAL("stateChanged(int)"), self.update_ex3) change_connect(self.ex4Checkbox, SIGNAL("stateChanged(int)"), self.update_ex4) change_connect(self.rotOptCheckbox, SIGNAL("stateChanged(int)"), self.update_rot_opt) change_connect(self.tryBothHisTautomersCheckbox, SIGNAL("stateChanged(int)"), self.update_try_both_his_tautomers) change_connect(self.softRepDesignCheckbox, SIGNAL("stateChanged(int)"), self.update_soft_rep_design) change_connect(self.useElecRepCheckbox, SIGNAL("stateChanged(int)"), self.update_use_elec_rep) change_connect(self.norepackDisulfCheckbox, SIGNAL("stateChanged(int)"), self.update_norepack_disulf) #signal slot connections for the push buttons change_connect(self.okButton, SIGNAL("clicked()"), self.runRosettaBackrubSim) return #Protein Display methods def show(self): """ Shows the Property Manager. Exends superclass method. """ self.sequenceEditor = self.win.createProteinSequenceEditorIfNeeded() self.sequenceEditor.hide() #update the min and max residues spinbox max values based on the length #of the current protein numResidues = self._getNumResiduesForCurrentProtein() if numResidues == 0: self.minresSpinBox.setMaximum(numResidues + 2) self.maxresSpinBox.setMaximum(numResidues + 2) else: self.minresSpinBox.setMaximum(numResidues) self.maxresSpinBox.setMaximum(numResidues) _superclass.show(self) return def _addGroupBoxes(self): """ Add the Property Manager group boxes. """ self._pmGroupBox2 = PM_GroupBox(self, title="Backrub Specific Parameters") self._loadGroupBox2(self._pmGroupBox2) self._pmGroupBox1 = PM_GroupBox( self, title="Rosetta Sequence Design Parameters") self._loadGroupBox1(self._pmGroupBox1) return def _loadGroupBox2(self, pmGroupBox): """ Load widgets in group box. """ self.bondAngleWeightSimSpinBox = PM_DoubleSpinBox( pmGroupBox, labelColumn=0, label="Bond angle weight:", minimum=0.01, decimals=2, maximum=1.0, singleStep=0.01, value=1.0, setAsDefault=False, spanWidth=False) bond_angle_param_list = ['Amber', 'Charmm'] self.bondAngleParamComboBox = PM_ComboBox( pmGroupBox, label="Bond angle parameters:", choices=bond_angle_param_list, setAsDefault=False) self.onlybbSpinBox = PM_DoubleSpinBox(pmGroupBox, labelColumn=0, label="Only backbone rotation:", minimum=0.01, maximum=1.0, value=0.75, decimals=2, singleStep=0.01, setAsDefault=False, spanWidth=False) self.onlyrotSpinBox = PM_DoubleSpinBox(pmGroupBox, labelColumn=0, label="Only rotamer rotation:", minimum=0.01, maximum=1.0, decimals=2, value=0.25, singleStep=0.01, setAsDefault=False, spanWidth=False) self.mctempSpinBox = PM_DoubleSpinBox( pmGroupBox, labelColumn=0, label="MC simulation temperature:", minimum=0.1, value=0.6, maximum=1.0, decimals=2, singleStep=0.1, setAsDefault=False, spanWidth=False) numResidues = self._getNumResiduesForCurrentProtein() self.minresSpinBox = PM_SpinBox(pmGroupBox, labelColumn=0, label="Minimum number of residues:", minimum=2, maximum=numResidues, singleStep=1, setAsDefault=False, spanWidth=False) self.maxresSpinBox = PM_SpinBox(pmGroupBox, labelColumn=0, label="Maximum number of residues:", minimum=2, maximum=numResidues, singleStep=1, setAsDefault=False, spanWidth=False) if numResidues == 0: self.minresSpinBox.setMaximum(numResidues + 2) self.maxresSpinBox.setMaximum(numResidues + 2) return def _addWhatsThisText(self): """ What's This text for widgets in this Property Manager. """ pass def _addToolTipText(self): """ Tool Tip text for widgets in this Property Manager. """ pass def _getNumResiduesForCurrentProtein(self): """ Get number of residues for the current protein """ _current_protein = self.win.assy.getSelectedProteinChunk() if _current_protein: return len(_current_protein.protein.get_sequence_string()) return 0 def _loadGroupBox1(self, pmGroupBox): """ Load widgets in group box. """ self.numSimSpinBox = PM_SpinBox(pmGroupBox, labelColumn=0, label="Number of trials:", minimum=1000, maximum=1000000, singleStep=1000, setAsDefault=False, spanWidth=False) self.ex1Checkbox = PM_CheckBox( pmGroupBox, text="Expand rotamer library for chi1 angle", state=Qt.Unchecked, setAsDefault=False, widgetColumn=0, spanWidth=True) self.ex1aroCheckbox = PM_CheckBox( pmGroupBox, text="Use large chi1 library for aromatic residues", state=Qt.Unchecked, setAsDefault=False, widgetColumn=0, spanWidth=True) self.ex2Checkbox = PM_CheckBox( pmGroupBox, text="Expand rotamer library for chi2 angle", state=Qt.Unchecked, setAsDefault=False, widgetColumn=0, spanWidth=True) self.ex2aroOnlyCheckbox = PM_CheckBox( pmGroupBox, text="Use large chi2 library only for aromatic residues", state=Qt.Unchecked, setAsDefault=False, widgetColumn=0, spanWidth=True) self.ex3Checkbox = PM_CheckBox( pmGroupBox, text="Expand rotamer library for chi3 angle", state=Qt.Unchecked, setAsDefault=False, widgetColumn=0, spanWidth=True) self.ex4Checkbox = PM_CheckBox( pmGroupBox, text="Expand rotamer library for chi4 angle", state=Qt.Unchecked, setAsDefault=False, widgetColumn=0, spanWidth=True) self.rotOptCheckbox = PM_CheckBox(pmGroupBox, text="Optimize one-body energy", state=Qt.Unchecked, setAsDefault=False, widgetColumn=0, spanWidth=True) self.tryBothHisTautomersCheckbox = PM_CheckBox( pmGroupBox, text="Try both histidine tautomers", state=Qt.Unchecked, setAsDefault=False, widgetColumn=0, spanWidth=True) self.softRepDesignCheckbox = PM_CheckBox( pmGroupBox, text="Use softer Lennard-Jones repulsive term", state=Qt.Unchecked, setAsDefault=False, widgetColumn=0, spanWidth=True) self.useElecRepCheckbox = PM_CheckBox( pmGroupBox, text="Use electrostatic repulsion", state=Qt.Unchecked, setAsDefault=False, widgetColumn=0, spanWidth=True) self.norepackDisulfCheckbox = PM_CheckBox( pmGroupBox, text="Don't re-pack disulphide bonds", state=Qt.Unchecked, setAsDefault=False, widgetColumn=0, spanWidth=True) self.otherCommandLineOptions = PM_TextEdit( pmGroupBox, label="Command line options:", spanWidth=True) self.otherCommandLineOptions.setFixedHeight(80) self.okButton = PM_PushButton(pmGroupBox, text="Run Rosetta", setAsDefault=True, spanWidth=True) return def update_ex1(self, state): """ Update the command text edit depending on the state of the update_ex1 checkbox @param state:state of the update_ex1 checkbox @type state: int """ otherOptionsText = str(self.otherCommandLineOptions.toPlainText()) if self.ex1Checkbox.isChecked() == True: otherOptionsText = otherOptionsText + ' -ex1 ' else: otherOptionsText = otherOptionsText.replace(' -ex1 ', '') self.otherCommandLineOptions.setText(otherOptionsText) return def update_ex1aro(self, state): """ Update the command text edit depending on the state of the update_ex1aro checkbox @param state:state of the update_ex1aro checkbox @type state: int """ otherOptionsText = str(self.otherCommandLineOptions.toPlainText()) if self.ex1aroCheckbox.isChecked() == True: otherOptionsText = otherOptionsText + ' -ex1aro ' else: otherOptionsText = otherOptionsText.replace(' -ex1aro ', '') self.otherCommandLineOptions.setText(otherOptionsText) return def update_ex2(self, state): """ Update the command text edit depending on the state of the update_ex2 checkbox @param state:state of the update_ex2 checkbox @type state: int """ otherOptionsText = str(self.otherCommandLineOptions.toPlainText()) if self.ex2Checkbox.isChecked() == True: otherOptionsText = otherOptionsText + ' -ex2 ' else: otherOptionsText = otherOptionsText.replace(' -ex2 ', '') self.otherCommandLineOptions.setText(otherOptionsText) return def update_ex2aro_only(self, state): """ Update the command text edit depending on the state of the update_ex2aro_only checkbox @param state:state of the update_ex2aro_only checkbox @type state: int """ otherOptionsText = str(self.otherCommandLineOptions.toPlainText()) if self.ex2aroOnlyCheckbox.isChecked() == True: otherOptionsText = otherOptionsText + ' -ex2aro_only ' else: otherOptionsText = otherOptionsText.replace(' -ex2aro_only ', '') self.otherCommandLineOptions.setText(otherOptionsText) return def update_ex3(self, state): """ Update the command text edit depending on the state of the update_ex3 checkbox @param state:state of the update_ex3 checkbox @type state: int """ otherOptionsText = str(self.otherCommandLineOptions.toPlainText()) if self.ex3Checkbox.isChecked() == True: otherOptionsText = otherOptionsText + ' -ex3 ' else: otherOptionsText = otherOptionsText.replace(' -ex3 ', '') self.otherCommandLineOptions.setText(otherOptionsText) return def update_ex4(self, state): """ Update the command text edit depending on the state of the update_ex4 checkbox @param state:state of the update_ex4 checkbox @type state: int """ otherOptionsText = str(self.otherCommandLineOptions.toPlainText()) if self.ex4Checkbox.isChecked() == True: otherOptionsText = otherOptionsText + ' -ex4 ' else: otherOptionsText = otherOptionsText.replace(' -ex4 ', '') self.otherCommandLineOptions.setText(otherOptionsText) return def update_rot_opt(self, state): """ Update the command text edit depending on the state of the update_rot_opt checkbox @param state:state of the update_rot_opt checkbox @type state: int """ otherOptionsText = str(self.otherCommandLineOptions.toPlainText()) if self.rotOptCheckbox.isChecked() == True: otherOptionsText = otherOptionsText + ' -rot_opt ' else: otherOptionsText = otherOptionsText.replace(' -rot_opt ', '') self.otherCommandLineOptions.setText(otherOptionsText) return def update_try_both_his_tautomers(self, state): """ Update the command text edit depending on the state of the update_try_both_his_tautomers checkbox @param state:state of the update_try_both_his_tautomers checkbox @type state: int """ otherOptionsText = str(self.otherCommandLineOptions.toPlainText()) if self.tryBothHisTautomersCheckbox.isChecked() == True: otherOptionsText = otherOptionsText + ' -try_both_his_tautomers ' else: otherOptionsText = otherOptionsText.replace( ' -try_both_his_tautomers ', '') self.otherCommandLineOptions.setText(otherOptionsText) return def update_soft_rep_design(self, state): """ Update the command text edit depending on the state of the update_soft_rep_design checkbox @param state:state of the update_soft_rep_design checkbox @type state: int """ otherOptionsText = str(self.otherCommandLineOptions.toPlainText()) if self.softRepDesignCheckbox.isChecked() == True: otherOptionsText = otherOptionsText + ' -soft_rep_design ' else: otherOptionsText = otherOptionsText.replace( ' -soft_rep_design ', '') self.otherCommandLineOptions.setText(otherOptionsText) return def update_use_elec_rep(self, state): """ Update the command text edit depending on the state of the update_use_elec_rep checkbox @param state:state of the update_use_elec_rep checkbox @type state: int """ otherOptionsText = str(self.otherCommandLineOptions.toPlainText()) if self.useElecRepCheckbox.isChecked() == True: otherOptionsText = otherOptionsText + ' -use_electrostatic_repulsion ' else: otherOptionsText = otherOptionsText.replace( ' -use_electrostatic_repulsion ', '') self.otherCommandLineOptions.setText(otherOptionsText) return def update_norepack_disulf(self, state): """ Update the command text edit depending on the state of the update_no_repack checkbox @param state:state of the update_no_repack checkbox @type state: int """ otherOptionsText = str(self.otherCommandLineOptions.toPlainText()) if self.norepackDisulfCheckbox.isChecked() == True: otherOptionsText = otherOptionsText + ' -norepack_disulf ' else: otherOptionsText = otherOptionsText.replace( ' -norepack_disulf ', '') self.otherCommandLineOptions.setText(otherOptionsText) return def runRosettaBackrubSim(self): """ Get all the parameters from the PM and run a rosetta simulation """ proteinChunk = self.win.assy.getSelectedProteinChunk() if not proteinChunk: msg = "You must select a single protein to run a Rosetta <i>Backrub</i> simulation." self.updateMessage(msg) return otherOptionsText = str(self.otherCommandLineOptions.toPlainText()) numSim = self.numSimSpinBox.value() argList = [numSim, otherOptionsText, proteinChunk.name] backrubSpecificArgList = self.getBackrubSpecificArgumentList() from simulation.ROSETTA.rosetta_commandruns import rosettaSetup_CommandRun if argList[0] > 0: env.prefs[rosetta_backrub_enabled_prefs_key] = True cmdrun = rosettaSetup_CommandRun( self.win, argList, "BACKRUB_PROTEIN_SEQUENCE_DESIGN", backrubSpecificArgList) cmdrun.run() return def getBackrubSpecificArgumentList(self): """ get list of backrub specific parameters from PM """ listOfArgs = [] bond_angle_weight = str(self.bondAngleWeightSimSpinBox.value()) listOfArgs.append('-bond_angle_weight') listOfArgs.append(bond_angle_weight) if self.bondAngleParamComboBox.currentIndex() == 0: bond_angle_params = 'bond_angle_amber_rosetta' else: bond_angle_params = 'bond_angle_charmm_rosetta' listOfArgs.append('-bond_angle_params') listOfArgs.append(bond_angle_params) only_bb = str(self.onlybbSpinBox.value()) listOfArgs.append('-only_bb') listOfArgs.append(only_bb) only_rot = str(self.onlyrotSpinBox.value()) listOfArgs.append('-only_rot') listOfArgs.append(only_rot) mc_temp = str(self.mctempSpinBox.value()) listOfArgs.append('-mc_temp') listOfArgs.append(mc_temp) min_res = self.minresSpinBox.value() max_res = self.maxresSpinBox.value() if max_res < min_res: msg = redmsg("Maximum number of residues for rosetta simulation with backrub" \ " motion cannot be less than minimum number of residues."\ " Neglecting this parameter for this simulation.") env.history.message("BACKRUB SIMULATION: " + msg) else: listOfArgs.append('-min_res') listOfArgs.append(str(min_res)) listOfArgs.append('-max_res') listOfArgs.append(str(max_res)) return listOfArgs
class FixedBBProteinSim_PropertyManager(Command_PropertyManager): """ The FixedBBProteinSim_PropertyManager class provides a Property Manager for the B{Fixed backbone Protein Sequence Design} command on the flyout toolbar in the Build > Protein > Simulate mode. @ivar title: The title that appears in the property manager header. @type title: str @ivar pmName: The name of this property manager. This is used to set the name of the PM_Dialog object via setObjectName(). @type name: str @ivar iconPath: The relative path to the PNG file that contains a 22 x 22 icon image that appears in the PM header. @type iconPath: str """ title = "Fixed Backbone Design" pmName = title iconPath = "ui/actions/Command Toolbar/BuildProtein/FixedBackbone.png" def __init__( self, command ): """ Constructor for the property manager. """ _superclass.__init__(self, command) self.showTopRowButtons( PM_DONE_BUTTON | \ PM_WHATS_THIS_BUTTON) msg = "Choose from the various options below to design "\ "an optimized <b>fixed backbone protein sequence</b> with Rosetta." self.updateMessage(msg) return def connect_or_disconnect_signals(self, isConnect = True): """ Connect or disconnect widget signals sent to their slot methods. This can be overridden in subclasses. By default it does nothing. @param isConnect: If True the widget will send the signals to the slot method. @type isConnect: boolean """ if isConnect: change_connect = self.win.connect else: change_connect = self.win.disconnect change_connect(self.ex1Checkbox, SIGNAL("stateChanged(int)"), self.update_ex1) change_connect(self.ex1aroCheckbox, SIGNAL("stateChanged(int)"), self.update_ex1aro) change_connect(self.ex2Checkbox, SIGNAL("stateChanged(int)"), self.update_ex2) change_connect(self.ex2aroOnlyCheckbox, SIGNAL("stateChanged(int)"), self.update_ex2aro_only) change_connect(self.ex3Checkbox, SIGNAL("stateChanged(int)"), self.update_ex3) change_connect(self.ex4Checkbox, SIGNAL("stateChanged(int)"), self.update_ex4) change_connect(self.rotOptCheckbox, SIGNAL("stateChanged(int)"), self.update_rot_opt) change_connect(self.tryBothHisTautomersCheckbox, SIGNAL("stateChanged(int)"), self.update_try_both_his_tautomers) change_connect(self.softRepDesignCheckbox, SIGNAL("stateChanged(int)"), self.update_soft_rep_design) change_connect(self.useElecRepCheckbox, SIGNAL("stateChanged(int)"), self.update_use_elec_rep) change_connect(self.norepackDisulfCheckbox, SIGNAL("stateChanged(int)"), self.update_norepack_disulf) #signal slot connections for the push buttons change_connect(self.okButton, SIGNAL("clicked()"), self.runRosettaFixedBBSim) return #Protein Display methods def show(self): """ Shows the Property Manager. """ #@REVIEW: Why does it create sequence editor here? Also, is it #required to be done before the superclass.show call? Similar code #found in CompareProteins_PM and some other files --Ninad 2008-10-02 self.sequenceEditor = self.win.createProteinSequenceEditorIfNeeded() self.sequenceEditor.hide() _superclass.show(self) return def _addGroupBoxes( self ): """ Add the Property Manager group boxes. """ self._pmGroupBox1 = PM_GroupBox( self, title = "Rosetta Fixed backbone sequence design") self._loadGroupBox1( self._pmGroupBox1 ) return def _loadGroupBox1(self, pmGroupBox): """ Load widgets in group box. """ self.numSimSpinBox = PM_SpinBox( pmGroupBox, labelColumn = 0, label = "Number of simulations:", minimum = 1, maximum = 999, setAsDefault = False, spanWidth = False) self.ex1Checkbox = PM_CheckBox(pmGroupBox, text = "Expand rotamer library for chi1 angle", state = Qt.Unchecked, setAsDefault = False, widgetColumn = 0, spanWidth = True) self.ex1aroCheckbox = PM_CheckBox(pmGroupBox, text = "Use large chi1 library for aromatic residues", state = Qt.Unchecked, setAsDefault = False, widgetColumn = 0, spanWidth = True) self.ex2Checkbox = PM_CheckBox(pmGroupBox, text = "Expand rotamer library for chi2 angle", state = Qt.Unchecked, setAsDefault = False, widgetColumn = 0, spanWidth = True) self.ex2aroOnlyCheckbox = PM_CheckBox(pmGroupBox, text = "Use large chi2 library only for aromatic residues", state = Qt.Unchecked, setAsDefault = False, widgetColumn = 0, spanWidth = True) self.ex3Checkbox = PM_CheckBox(pmGroupBox, text = "Expand rotamer library for chi3 angle", state = Qt.Unchecked, setAsDefault = False, widgetColumn = 0, spanWidth = True) self.ex4Checkbox = PM_CheckBox(pmGroupBox, text ="Expand rotamer library for chi4 angle", state = Qt.Unchecked, setAsDefault = False, widgetColumn = 0, spanWidth = True) self.rotOptCheckbox = PM_CheckBox(pmGroupBox, text ="Optimize one-body energy", state = Qt.Unchecked, setAsDefault = False, widgetColumn = 0, spanWidth = True) self.tryBothHisTautomersCheckbox = PM_CheckBox(pmGroupBox, text ="Try both histidine tautomers", state = Qt.Unchecked, setAsDefault = False, widgetColumn = 0, spanWidth = True) self.softRepDesignCheckbox = PM_CheckBox(pmGroupBox, text ="Use softer Lennard-Jones repulsive term", state = Qt.Unchecked, setAsDefault = False, widgetColumn = 0, spanWidth = True) self.useElecRepCheckbox = PM_CheckBox(pmGroupBox, text ="Use electrostatic repulsion", state = Qt.Unchecked, setAsDefault = False, widgetColumn = 0, spanWidth = True) self.norepackDisulfCheckbox = PM_CheckBox(pmGroupBox, text ="Don't re-pack disulphide bonds", state = Qt.Unchecked, setAsDefault = False, widgetColumn = 0, spanWidth = True) self.otherCommandLineOptions = PM_TextEdit(pmGroupBox, label = "Command line options:", spanWidth = True) self.otherCommandLineOptions.setFixedHeight(80) self.okButton = PM_PushButton( pmGroupBox, text = "Launch Rosetta", setAsDefault = True, spanWidth = True) return def _addWhatsThisText( self ): """ What's This text for widgets in this Property Manager. """ pass def _addToolTipText(self): """ Tool Tip text for widgets in this Property Manager. """ pass def update_ex1(self, state): """ Update the command text edit depending on the state of the update_ex1 checkbox @param state:state of the update_ex1 checkbox @type state: int """ otherOptionsText = str(self.otherCommandLineOptions.toPlainText()) if self.ex1Checkbox.isChecked() == True: otherOptionsText = otherOptionsText + ' -ex1 ' else: otherOptionsText = otherOptionsText.replace(' -ex1 ', '') self.otherCommandLineOptions.setText(otherOptionsText) return def update_ex1aro(self, state): """ Update the command text edit depending on the state of the update_ex1aro checkbox @param state:state of the update_ex1aro checkbox @type state: int """ otherOptionsText = str(self.otherCommandLineOptions.toPlainText()) if self.ex1aroCheckbox.isChecked() == True: otherOptionsText = otherOptionsText + ' -ex1aro ' else: otherOptionsText = otherOptionsText.replace(' -ex1aro ', '') self.otherCommandLineOptions.setText(otherOptionsText) return def update_ex2(self, state): """ Update the command text edit depending on the state of the update_ex2 checkbox @param state:state of the update_ex2 checkbox @type state: int """ otherOptionsText = str(self.otherCommandLineOptions.toPlainText()) if self.ex2Checkbox.isChecked() == True: otherOptionsText = otherOptionsText + ' -ex2 ' else: otherOptionsText = otherOptionsText.replace(' -ex2 ', '') self.otherCommandLineOptions.setText(otherOptionsText) return def update_ex2aro_only(self, state): """ Update the command text edit depending on the state of the update_ex2aro_only checkbox @param state:state of the update_ex2aro_only checkbox @type state: int """ otherOptionsText = str(self.otherCommandLineOptions.toPlainText()) if self.ex2aroOnlyCheckbox.isChecked() == True: otherOptionsText = otherOptionsText + ' -ex2aro_only ' else: otherOptionsText = otherOptionsText.replace(' -ex2aro_only ', '') self.otherCommandLineOptions.setText(otherOptionsText) return def update_ex3(self, state): """ Update the command text edit depending on the state of the update_ex3 checkbox @param state:state of the update_ex3 checkbox @type state: int """ otherOptionsText = str(self.otherCommandLineOptions.toPlainText()) if self.ex3Checkbox.isChecked() == True: otherOptionsText = otherOptionsText + ' -ex3 ' else: otherOptionsText = otherOptionsText.replace(' -ex3 ', '') self.otherCommandLineOptions.setText(otherOptionsText) return def update_ex4(self, state): """ Update the command text edit depending on the state of the update_ex4 checkbox @param state:state of the update_ex4 checkbox @type state: int """ otherOptionsText = str(self.otherCommandLineOptions.toPlainText()) if self.ex4Checkbox.isChecked() == True: otherOptionsText = otherOptionsText + ' -ex4 ' else: otherOptionsText = otherOptionsText.replace(' -ex4 ', '') self.otherCommandLineOptions.setText(otherOptionsText) return def update_rot_opt(self, state): """ Update the command text edit depending on the state of the update_rot_opt checkbox @param state:state of the update_rot_opt checkbox @type state: int """ otherOptionsText = str(self.otherCommandLineOptions.toPlainText()) if self.rotOptCheckbox.isChecked() == True: otherOptionsText = otherOptionsText + ' -rot_opt ' else: otherOptionsText = otherOptionsText.replace(' -rot_opt ', '') self.otherCommandLineOptions.setText(otherOptionsText) return def update_try_both_his_tautomers(self, state): """ Update the command text edit depending on the state of the update_try_both_his_tautomers checkbox @param state:state of the update_try_both_his_tautomers checkbox @type state: int """ otherOptionsText = str(self.otherCommandLineOptions.toPlainText()) if self.tryBothHisTautomersCheckbox.isChecked() == True: otherOptionsText = otherOptionsText + ' -try_both_his_tautomers ' else: otherOptionsText = otherOptionsText.replace(' -try_both_his_tautomers ', '') self.otherCommandLineOptions.setText(otherOptionsText) return def update_soft_rep_design(self, state): """ Update the command text edit depending on the state of the update_soft_rep_design checkbox @param state:state of the update_soft_rep_design checkbox @type state: int """ otherOptionsText = str(self.otherCommandLineOptions.toPlainText()) if self.softRepDesignCheckbox.isChecked() == True: otherOptionsText = otherOptionsText + ' -soft_rep_design ' else: otherOptionsText = otherOptionsText.replace(' -soft_rep_design ', '') self.otherCommandLineOptions.setText(otherOptionsText) return def update_use_elec_rep(self, state): """ Update the command text edit depending on the state of the update_use_elec_rep checkbox @param state:state of the update_use_elec_rep checkbox @type state: int """ otherOptionsText = str(self.otherCommandLineOptions.toPlainText()) if self.useElecRepCheckbox.isChecked() == True: otherOptionsText = otherOptionsText + ' -use_electrostatic_repulsion ' else: otherOptionsText = otherOptionsText.replace(' -use_electrostatic_repulsion ', '') self.otherCommandLineOptions.setText(otherOptionsText) return def update_norepack_disulf(self, state): """ Update the command text edit depending on the state of the update_no_repack checkbox @param state:state of the update_no_repack checkbox @type state: int """ otherOptionsText = str(self.otherCommandLineOptions.toPlainText()) if self.norepackDisulfCheckbox.isChecked() == True: otherOptionsText = otherOptionsText + ' -norepack_disulf ' else: otherOptionsText = otherOptionsText.replace(' -norepack_disulf ', '') self.otherCommandLineOptions.setText(otherOptionsText) return def runRosettaFixedBBSim(self): """ Get all the parameters from the PM and run a rosetta simulation. """ proteinChunk = self.win.assy.getSelectedProteinChunk() if not proteinChunk: msg = "You must select a single protein to run a Rosetta <i>Fixed Backbone</i> simulation." self.updateMessage(msg) return otherOptionsText = str(self.otherCommandLineOptions.toPlainText()) numSim = self.numSimSpinBox.value() argList = [numSim, otherOptionsText, proteinChunk.name] from simulation.ROSETTA.rosetta_commandruns import rosettaSetup_CommandRun if argList[0] > 0: cmdrun = rosettaSetup_CommandRun(self.win, argList, "ROSETTA_FIXED_BACKBONE_SEQUENCE_DESIGN") cmdrun.run() return
class DnaStrand_PropertyManager( DnaOrCnt_PropertyManager): """ The DnaStrand_PropertyManager class provides a Property Manager for the DnaStrand_EditCommand. @ivar title: The title that appears in the property manager header. @type title: str @ivar pmName: The name of this property manager. This is used to set the name of the PM_Dialog object via setObjectName(). @type name: str @ivar iconPath: The relative path to the PNG file that contains a 22 x 22 icon image that appears in the PM header. @type iconPath: str """ title = "DnaStrand Properties" pmName = title iconPath = "ui/actions/Properties Manager/Strand.png" def __init__( self, win, editCommand ): """ Constructor for the Build DNA property manager. """ #For model changed signal self.previousSelectionParams = None #see self.connect_or_disconnect_signals for comment about this flag self.isAlreadyConnected = False self.isAlreadyDisconnected = False self.sequenceEditor = None self._numberOfBases = 0 self._conformation = 'B-DNA' self.duplexRise = 3.18 self.basesPerTurn = 10 self.dnaModel = 'PAM3' _superclass.__init__( self, win, editCommand) self.showTopRowButtons( PM_DONE_BUTTON | \ PM_WHATS_THIS_BUTTON) self._loadSequenceEditor() msg = "Use resize handles to resize the strand. Use sequence editor"\ "to assign a new sequence or the current one to a file." self.updateMessage(msg) def _addGroupBoxes( self ): """ Add the DNA Property Manager group boxes. """ self._pmGroupBox1 = PM_GroupBox( self, title = "Parameters" ) self._loadGroupBox1( self._pmGroupBox1 ) self._displayOptionsGroupBox = PM_GroupBox( self, title = "Display Options" ) self._loadDisplayOptionsGroupBox( self._displayOptionsGroupBox ) def _loadGroupBox1(self, pmGroupBox): """ Load widgets in group box 4. """ self.nameLineEdit = PM_LineEdit( pmGroupBox, label = "Strand name:", text = "", setAsDefault = False) self.numberOfBasesSpinBox = \ PM_SpinBox( pmGroupBox, label = "Number of bases:", value = self._numberOfBases, setAsDefault = False, minimum = 2, maximum = 10000 ) self.basesPerTurnDoubleSpinBox = \ PM_DoubleSpinBox( pmGroupBox, label = "Bases per turn:", value = self.basesPerTurn, setAsDefault = True, minimum = 8.0, maximum = 20.0, decimals = 2, singleStep = 0.1 ) self.duplexRiseDoubleSpinBox = \ PM_DoubleSpinBox( pmGroupBox, label = "Rise:", value = self.duplexRise, setAsDefault = True, minimum = 2.0, maximum = 4.0, decimals = 3, singleStep = 0.01 ) self.disableStructHighlightingCheckbox = \ PM_CheckBox( pmGroupBox, text = "Don't highlight while editing DNA", widgetColumn = 0, state = Qt.Unchecked, setAsDefault = True, spanWidth = True ) #As of 2008-03-31, the properties such as number of bases will be #editable only by using the resize handles. post FNANO we will support #the self.numberOfBasesSpinBox.setEnabled(False) self.basesPerTurnDoubleSpinBox.setEnabled(False) self.duplexRiseDoubleSpinBox.setEnabled(False) def _loadSequenceEditor(self): """ Temporary code that shows the Sequence editor ..a doc widget docked at the bottom of the mainwindow. The implementation is going to change before 'rattleSnake' product release. As of 2007-11-20: This feature (sequence editor) is waiting for the ongoing dna model work to complete. """ self.sequenceEditor = self.win.createDnaSequenceEditorIfNeeded() self.sequenceEditor.hide() def _loadDisplayOptionsGroupBox(self, pmGroupBox): """ Overrides superclass method. Also loads the color chooser widget. """ self._loadColorChooser(pmGroupBox) _superclass._loadDisplayOptionsGroupBox(self, pmGroupBox) def _connect_showCursorTextCheckBox(self): """ Connect the show cursor text checkbox with user prefs_key. Overrides DnaOrCnt_PropertyManager._connect_showCursorTextCheckBox """ connect_checkbox_with_boolean_pref( self.showCursorTextCheckBox , dnaStrandEditCommand_showCursorTextCheckBox_prefs_key) def _params_for_creating_cursorTextCheckBoxes(self): """ Returns params needed to create various cursor text checkboxes connected to prefs_keys that allow custom cursor texts. @return: A list containing tuples in the following format: ('checkBoxTextString' , preference_key). PM_PrefsCheckBoxes uses this data to create checkboxes with the the given names and connects them to the provided preference keys. (Note that PM_PrefsCheckBoxes puts thes within a GroupBox) @rtype: list @see: PM_PrefsCheckBoxes @see: self._loadDisplayOptionsGroupBox where this list is used. @see: Superclass method which is overridden here -- DnaOrCnt_PropertyManager._params_for_creating_cursorTextCheckBoxes() """ params = \ [ #Format: (" checkbox text", prefs_key) ("Number of bases", dnaStrandEditCommand_cursorTextCheckBox_numberOfBases_prefs_key), ("Number of bases to be changed", dnaStrandEditCommand_cursorTextCheckBox_changedBases_prefs_key) ] return params def getParameters(self): numberOfBases = self.numberOfBasesSpinBox.value() dnaForm = self._conformation dnaModel = self.dnaModel basesPerTurn = self.basesPerTurn duplexRise = self.duplexRise color = self._colorChooser.getColor() return (numberOfBases, dnaForm, dnaModel, basesPerTurn, duplexRise, color ) def setParameters(self, params): """ This is usually called when you are editing an existing structure. Some property manager ui elements then display the information obtained from the object being edited. TODO: - Make this a EditCommand_PM API method? - See also the routines GraphicsMode.setParams or object.setProps ..better to name them all in one style? """ #Set the duplex rise and bases per turn spinbox values. numberOfBases, \ dnaForm, \ dnaModel, \ basesPerTurn, \ duplexRise, \ color = params if numberOfBases is not None: self.numberOfBasesSpinBox.setValue(numberOfBases) if dnaForm is not None: self._conformation = dnaForm if dnaModel is not None: self.dnaModel = dnaModel if duplexRise is not None: self.duplexRiseDoubleSpinBox.setValue(duplexRise) if basesPerTurn is not None: self.basesPerTurnDoubleSpinBox.setValue(basesPerTurn) if color is not None: self._colorChooser.setColor(color) def connect_or_disconnect_signals(self, isConnect): """ Connect or disconnect widget signals sent to their slot methods. This can be overridden in subclasses. By default it does nothing. @param isConnect: If True the widget will send the signals to the slot method. @type isConnect: boolean """ #TODO: This is a temporary fix for a bug. When you invoke a temporary # mode Entering such a temporary mode keeps the signals of #PM from the previous mode connected ( #but while exiting that temporary mode and reentering the #previous mode, it atucally reconnects the signal! This gives rise to #lots of bugs. This needs more general fix in Temporary mode API. # -- Ninad 2008-01-09 (similar comment exists in MovePropertyManager.py if isConnect and self.isAlreadyConnected: if debug_flags.atom_debug: print_compact_stack("warning: attempt to connect widgets"\ "in this PM that are already connected." ) return if not isConnect and self.isAlreadyDisconnected: if debug_flags.atom_debug: print_compact_stack("warning: attempt to disconnect widgets"\ "in this PM that are already disconnected.") return self.isAlreadyConnected = isConnect self.isAlreadyDisconnected = not isConnect if isConnect: change_connect = self.win.connect else: change_connect = self.win.disconnect if self.sequenceEditor: self.sequenceEditor.connect_or_disconnect_signals(isConnect) _superclass.connect_or_disconnect_signals(self, isConnect) change_connect(self.disableStructHighlightingCheckbox, SIGNAL('stateChanged(int)'), self.change_struct_highlightPolicy) change_connect(self.showCursorTextCheckBox, SIGNAL('stateChanged(int)'), self._update_state_of_cursorTextGroupBox) def model_changed(self): """ @see: DnaStrand_EditCommand.model_changed() @see: DnaStrand_EditCommand.hasResizableStructure() """ isStructResizable, why_not = self.editCommand.hasResizableStructure() if not isStructResizable: #disable all widgets if self._pmGroupBox1.isEnabled(): self._pmGroupBox1.setEnabled(False) msg1 = ("Viewing properties of %s <br>") %(self.editCommand.struct.name) msg2 = redmsg("DnaStrand is not resizable. Reason: %s"%(why_not)) self.updateMessage(msg1 + msg2) else: if not self._pmGroupBox1.isEnabled(): self._pmGroupBox1.setEnabled(True) msg1 = ("Viewing properties of %s <br>") %(self.editCommand.struct.name) msg2 = "Use resize handles to resize the strand. Use sequence editor"\ "to assign a new sequence or the current one to a file." self.updateMessage(msg1 + msg2) def show(self): """ Show this PM As of 2007-11-20, it also shows the Sequence Editor widget and hides the history widget. This implementation may change in the near future This method also retrives the name information from the editCommand's structure for its name line edit field. @see: DnaStrand_EditCommand.getStructureName() @see: self.close() """ _superclass.show(self) self._showSequenceEditor() if self.editCommand is not None: name = self.editCommand.getStructureName() if name is not None: self.nameLineEdit.setText(name) def close(self): """ Close this property manager. Also sets the name of the self.editCommand's structure to the one displayed in the line edit field. @see self.show() @see: DnaSegment_EditCommand.setStructureName """ if self.editCommand is not None: name = str(self.nameLineEdit.text()) self.editCommand.setStructureName(name) if self.sequenceEditor: self.sequenceEditor.close() _superclass.close(self) def _showSequenceEditor(self): if self.sequenceEditor: if not self.sequenceEditor.isVisible(): #Show the sequence editor #ATTENTION: the sequence editor also closes (temporarily) the #reports dockwidget (if visible) Its state is later restored when #the sequuence Editor is closed. self.sequenceEditor.show() self.updateSequence() def updateSequence(self): """ Update the sequence string in the sequence editor @see: DnaSequenceEditor.setSequence() @see DnaSequenceEditor._determine_complementSequence() @see: DnaSequenceEditor.setComplementSequence() @see: DnaStrand.getStrandSequenceAndItsComplement() """ #Read in the strand sequence of the selected strand and #show it in the text edit in the sequence editor. ##strand = self.strandListWidget.getPickedItem() if not self.editCommand.hasValidStructure(): return strand = self.editCommand.struct titleString = 'Sequence Editor for ' + strand.name self.sequenceEditor.setWindowTitle(titleString) sequenceString, complementSequenceString = strand.getStrandSequenceAndItsComplement() if sequenceString: sequenceString = QString(sequenceString) sequenceString = sequenceString.toUpper() #Set the initial sequence (read in from the file) self.sequenceEditor.setSequence(sequenceString) #Set the initial complement sequence for DnaSequence editor. #do this independently because 'complementSequenceString' may have #some characters (such as * ) that denote a missing base on the #complementary strand. this information is used by the sequence #editor. See DnaSequenceEditor._determine_complementSequence() #for more details. See also bug 2787 self.sequenceEditor.setComplementSequence(complementSequenceString) def change_struct_highlightPolicy(self,checkedState = False): """ Change the 'highlight policy' of the structure being edited (i.e. self.editCommand.struct) . @param checkedState: The checked state of the checkbox that says 'Don't highlight while editing DNA'. So, it its True, the structure being edited won't get highlighted. @see: DnaStrand.setHighlightPolicy for more comments """ if self.editCommand and self.editCommand.hasValidStructure(): highlight = not checkedState self.editCommand.struct.setHighlightPolicy(highlight = highlight) def _addWhatsThisText(self): """ Add what's this text. Abstract method. """ pass
class InsertDna_PropertyManager(DnaOrCnt_PropertyManager): """ The InsertDna_PropertyManager class provides a Property Manager for the B{Insert Dna} command. @ivar title: The title that appears in the property manager header. @type title: str @ivar pmName: The name of this property manager. This is used to set the name of the PM_Dialog object via setObjectName(). @type name: str @ivar iconPath: The relative path to the PNG file that contains a 22 x 22 icon image that appears in the PM header. @type iconPath: str """ title = "Insert DNA" pmName = title iconPath = "ui/actions/Command Toolbar/BuildDna/InsertDna.png" def __init__(self, command): """ Constructor for the DNA Duplex property manager. """ self.endPoint1 = None self.endPoint2 = None self._conformation = "B-DNA" self._numberOfBases = 0 self._basesPerTurn = getDuplexBasesPerTurn(self._conformation) self._duplexRise = getDuplexRise(self._conformation) self._duplexLength = getDuplexLength(self._conformation, self._numberOfBases) _superclass.__init__(self, command) self.showTopRowButtons( PM_DONE_BUTTON | \ PM_CANCEL_BUTTON | \ PM_WHATS_THIS_BUTTON) def connect_or_disconnect_signals(self, isConnect): """ Connect or disconnect widget signals sent to their slot methods. This can be overridden in subclasses. By default it does nothing. @param isConnect: If True the widget will send the signals to the slot method. @type isConnect: boolean """ if isConnect: change_connect = self.win.connect else: change_connect = self.win.disconnect change_connect(self._placementOptions.buttonGroup, SIGNAL("buttonClicked(int)"), self.activateSpecifyReferencePlaneTool) change_connect(self.conformationComboBox, SIGNAL("currentIndexChanged(int)"), self.conformationComboBoxChanged) change_connect(self.numberOfBasePairsSpinBox, SIGNAL("valueChanged(int)"), self.numberOfBasesChanged) change_connect(self.basesPerTurnDoubleSpinBox, SIGNAL("valueChanged(double)"), self.basesPerTurnChanged) change_connect(self.duplexRiseDoubleSpinBox, SIGNAL("valueChanged(double)"), self.duplexRiseChanged) change_connect(self.showCursorTextCheckBox, SIGNAL('stateChanged(int)'), self._update_state_of_cursorTextGroupBox) self.duplexRiseDoubleSpinBox.connectWithState( Preferences_StateRef_double(bdnaRise_prefs_key, env.prefs[bdnaRise_prefs_key])) self.basesPerTurnDoubleSpinBox.connectWithState( Preferences_StateRef_double(bdnaBasesPerTurn_prefs_key, env.prefs[bdnaBasesPerTurn_prefs_key])) def show(self): _superclass.show(self) self.updateMessage("Specify the DNA parameters below, then click "\ "two endpoints in the graphics area to insert a DNA duplex.") def _addGroupBoxes(self): """ Add the DNA Property Manager group boxes. """ self._pmReferencePlaneGroupBox = PM_GroupBox(self, title="Placement Options") self._loadReferencePlaneGroupBox(self._pmReferencePlaneGroupBox) self._pmGroupBox1 = PM_GroupBox(self, title="Endpoints") self._loadGroupBox1(self._pmGroupBox1) self._pmGroupBox1.hide() self._pmGroupBox2 = PM_GroupBox(self, title="Parameters") self._loadGroupBox2(self._pmGroupBox2) self._displayOptionsGroupBox = PM_GroupBox(self, title="Display Options") self._loadDisplayOptionsGroupBox(self._displayOptionsGroupBox) def _loadGroupBox1(self, pmGroupBox): """ Load widgets in group box 3. """ #Folllowing toolbutton facilitates entering a temporary DnaLineMode #to create a DNA using endpoints of the specified line. self.specifyDnaLineButton = PM_ToolButton( pmGroupBox, text="Specify Endpoints", iconPath="ui/actions/Properties Manager/Pencil.png", spanWidth=True) self.specifyDnaLineButton.setCheckable(True) self.specifyDnaLineButton.setAutoRaise(True) self.specifyDnaLineButton.setToolButtonStyle( Qt.ToolButtonTextBesideIcon) #EndPoint1 and endPoint2 coordinates. These widgets are hidden # as of 2007- 12 - 05 self._endPoint1SpinBoxes = PM_CoordinateSpinBoxes(pmGroupBox, label="End Point 1") self.x1SpinBox = self._endPoint1SpinBoxes.xSpinBox self.y1SpinBox = self._endPoint1SpinBoxes.ySpinBox self.z1SpinBox = self._endPoint1SpinBoxes.zSpinBox self._endPoint2SpinBoxes = PM_CoordinateSpinBoxes(pmGroupBox, label="End Point 2") self.x2SpinBox = self._endPoint2SpinBoxes.xSpinBox self.y2SpinBox = self._endPoint2SpinBoxes.ySpinBox self.z2SpinBox = self._endPoint2SpinBoxes.zSpinBox self._endPoint1SpinBoxes.hide() self._endPoint2SpinBoxes.hide() def _loadGroupBox2(self, pmGroupBox): """ Load widgets in group box 4. """ self.conformationComboBox = \ PM_ComboBox( pmGroupBox, label = "Conformation:", choices = ["B-DNA"], setAsDefault = True) dnaModelChoices = ['PAM3', 'PAM5'] self.dnaModelComboBox = \ PM_ComboBox( pmGroupBox, label = "Model:", choices = dnaModelChoices, setAsDefault = True) self.basesPerTurnDoubleSpinBox = \ PM_DoubleSpinBox( pmGroupBox, label = "Bases per turn:", value = env.prefs[bdnaBasesPerTurn_prefs_key], setAsDefault = True, minimum = 8.0, maximum = 20.0, decimals = 2, singleStep = 0.1 ) self.duplexRiseDoubleSpinBox = \ PM_DoubleSpinBox( pmGroupBox, label = "Rise:", value = env.prefs[bdnaRise_prefs_key], setAsDefault = True, minimum = 2.0, maximum = 4.0, decimals = 3, singleStep = 0.01 ) # Strand Length (i.e. the number of bases) self.numberOfBasePairsSpinBox = \ PM_SpinBox( pmGroupBox, label = "Base pairs:", value = self._numberOfBases, setAsDefault = False, minimum = 0, maximum = 10000 ) self.numberOfBasePairsSpinBox.setDisabled(True) # Duplex Length self.duplexLengthLineEdit = \ PM_LineEdit( pmGroupBox, label = "Duplex length: ", text = "0.0 Angstroms", setAsDefault = False) self.duplexLengthLineEdit.setDisabled(True) def _loadDisplayOptionsGroupBox(self, pmGroupBox): """ Load widgets in the Display Options GroupBox @see: DnaOrCnt_PropertyManager. _loadDisplayOptionsGroupBox """ #Call the superclass method that loads the cursor text checkboxes. #Note, as of 2008-05-19, the superclass, DnaOrCnt_PropertyManager #only loads the cursor text groupboxes. Subclasses like this can #call custom methods like self._loadCursorTextCheckBoxes etc if they #don't need all groupboxes that the superclass loads. _superclass._loadDisplayOptionsGroupBox(self, pmGroupBox) self._rubberbandLineGroupBox = PM_GroupBox(pmGroupBox, title='Rubber band line:') dnaLineChoices = ['Ribbons', 'Ladder'] self.dnaRubberBandLineDisplayComboBox = \ PM_ComboBox( self._rubberbandLineGroupBox , label = " Display as:", choices = dnaLineChoices, setAsDefault = True) self.lineSnapCheckBox = \ PM_CheckBox(self._rubberbandLineGroupBox , text = 'Enable line snap' , widgetColumn = 1, state = Qt.Checked ) def _connect_showCursorTextCheckBox(self): """ Connect the show cursor text checkbox with user prefs_key. Overrides DnaOrCnt_PropertyManager._connect_showCursorTextCheckBox """ connect_checkbox_with_boolean_pref( self.showCursorTextCheckBox, dnaDuplexEditCommand_showCursorTextCheckBox_prefs_key) def _params_for_creating_cursorTextCheckBoxes(self): """ Returns params needed to create various cursor text checkboxes connected to prefs_keys that allow custom cursor texts. @return: A list containing tuples in the following format: ('checkBoxTextString' , preference_key). PM_PrefsCheckBoxes uses this data to create checkboxes with the the given names and connects them to the provided preference keys. (Note that PM_PrefsCheckBoxes puts thes within a GroupBox) @rtype: list @see: PM_PrefsCheckBoxes @see: self._loadDisplayOptionsGroupBox where this list is used. @see: Superclass method which is overridden here -- DnaOrCnt_PropertyManager._params_for_creating_cursorTextCheckBoxes() """ params = \ [ #Format: (" checkbox text", prefs_key) ("Number of base pairs", dnaDuplexEditCommand_cursorTextCheckBox_numberOfBasePairs_prefs_key), ("Number of turns", dnaDuplexEditCommand_cursorTextCheckBox_numberOfTurns_prefs_key), ("Duplex length", dnaDuplexEditCommand_cursorTextCheckBox_length_prefs_key), ("Angle", dnaDuplexEditCommand_cursorTextCheckBox_angle_prefs_key) ] return params def _addToolTipText(self): """ Tool Tip text for widgets in the DNA Property Manager. """ pass def conformationComboBoxChanged(self, inIndex): """ Slot for the Conformation combobox. It is called whenever the Conformation choice is changed. @param inIndex: The new index. @type inIndex: int """ conformation = self.conformationComboBox.currentText() if conformation == "B-DNA": self.basesPerTurnDoubleSpinBox.setValue("10.0") elif conformation == "Z-DNA": self.basesPerTurnDoubleSpinBox.setValue("12.0") else: msg = redmsg("conformationComboBoxChanged(): \ Error - unknown DNA conformation. Index = " + inIndex) env.history.message(msg) self.duplexLengthSpinBox.setSingleStep(getDuplexRise(conformation)) def numberOfBasesChanged(self, numberOfBases): """ Slot for the B{Number of Bases} spinbox. """ # Update the Duplex Length lineEdit widget. text = str(getDuplexLength(self._conformation, numberOfBases, self._duplexRise)) \ + " Angstroms" self.duplexLengthLineEdit.setText(text) return def basesPerTurnChanged(self, basesPerTurn): """ Slot for the B{Bases per turn} spinbox. """ self.command.basesPerTurn = basesPerTurn self._basesPerTurn = basesPerTurn return def duplexRiseChanged(self, rise): """ Slot for the B{Rise} spinbox. """ self.command.duplexRise = rise self._duplexRise = rise return def getParameters(self): """ Return the parameters from this property manager to be used to create the DNA duplex. @return: A tuple containing the parameters @rtype: tuple @see: L{InsertDna_EditCommand._gatherParameters} where this is used """ numberOfBases = self.numberOfBasePairsSpinBox.value() dnaForm = str(self.conformationComboBox.currentText()) basesPerTurn = self.basesPerTurnDoubleSpinBox.value() duplexRise = self.duplexRiseDoubleSpinBox.value() dnaModel = str(self.dnaModelComboBox.currentText()) # First endpoint (origin) of DNA duplex x1 = self.x1SpinBox.value() y1 = self.y1SpinBox.value() z1 = self.z1SpinBox.value() # Second endpoint (direction vector/axis) of DNA duplex. x2 = self.x2SpinBox.value() y2 = self.y2SpinBox.value() z2 = self.z2SpinBox.value() if not self.endPoint1: self.endPoint1 = V(x1, y1, z1) if not self.endPoint2: self.endPoint2 = V(x2, y2, z2) return (numberOfBases, dnaForm, dnaModel, basesPerTurn, duplexRise, self.endPoint1, self.endPoint2) def _addWhatsThisText(self): """ What's This text for widgets in this Property Manager. """ whatsThis_InsertDna_PropertyManager(self)
class DnaStrand_PropertyManager( DnaOrCnt_PropertyManager): """ The DnaStrand_PropertyManager class provides a Property Manager for the DnaStrand_EditCommand. @ivar title: The title that appears in the property manager header. @type title: str @ivar pmName: The name of this property manager. This is used to set the name of the PM_Dialog object via setObjectName(). @type name: str @ivar iconPath: The relative path to the PNG file that contains a 22 x 22 icon image that appears in the PM header. @type iconPath: str """ title = "DnaStrand Properties" iconPath = "ui/actions/Properties Manager/Strand.png" def __init__( self, command ): """ Constructor for the Build DNA property manager. """ self.sequenceEditor = None self._numberOfBases = 0 self._conformation = 'B-DNA' self.dnaModel = 'PAM3' _superclass.__init__( self, command) self.showTopRowButtons( PM_DONE_BUTTON | \ PM_WHATS_THIS_BUTTON) return def _addGroupBoxes( self ): """ Add group boxes to this PM. """ self._pmGroupBox1 = PM_GroupBox( self, title = "Parameters" ) self._loadGroupBox1( self._pmGroupBox1 ) self._displayOptionsGroupBox = PM_GroupBox( self, title = "Display Options" ) self._loadDisplayOptionsGroupBox( self._displayOptionsGroupBox ) #Sequence Editor. This is NOT a groupbox, needs cleanup. Doing it here #so that the sequence editor gets connected! Perhaps #superclass should define _loadAdditionalWidgets. -- Ninad2008-10-03 self._loadSequenceEditor() return def _loadGroupBox1(self, pmGroupBox): """ Load widgets in group box 1. """ self.nameLineEdit = PM_LineEdit( pmGroupBox, label = "Name:", text = "", setAsDefault = False) self.numberOfBasesSpinBox = \ PM_SpinBox( pmGroupBox, label = "Number of bases:", value = self._numberOfBases, setAsDefault = False, minimum = 2, maximum = 10000 ) self.disableStructHighlightingCheckbox = \ PM_CheckBox( pmGroupBox, text = "Don't highlight while editing DNA", widgetColumn = 0, state = Qt.Unchecked, setAsDefault = True, spanWidth = True ) #As of 2008-03-31, the properties such as number of bases will be #editable only by using the resize handles. self.numberOfBasesSpinBox.setEnabled(False) return def _loadSequenceEditor(self): """ Temporary code that shows the Sequence editor ..a doc widget docked at the bottom of the mainwindow. The implementation is going to change before 'rattleSnake' product release. As of 2007-11-20: This feature (sequence editor) is waiting for the ongoing dna model work to complete. """ self.sequenceEditor = self.win.createDnaSequenceEditorIfNeeded() self.sequenceEditor.hide() return def _loadDisplayOptionsGroupBox(self, pmGroupBox): """ Overrides superclass method. Also loads the color chooser widget. """ self._loadColorChooser(pmGroupBox) _superclass._loadDisplayOptionsGroupBox(self, pmGroupBox) return def _connect_showCursorTextCheckBox(self): """ Connect the show cursor text checkbox with user prefs_key. Overrides DnaOrCnt_PropertyManager._connect_showCursorTextCheckBox """ connect_checkbox_with_boolean_pref( self.showCursorTextCheckBox , dnaStrandEditCommand_showCursorTextCheckBox_prefs_key) return def _params_for_creating_cursorTextCheckBoxes(self): """ Returns params needed to create various cursor text checkboxes connected to prefs_keys that allow custom cursor texts. @return: A list containing tuples in the following format: ('checkBoxTextString' , preference_key). PM_PrefsCheckBoxes uses this data to create checkboxes with the the given names and connects them to the provided preference keys. (Note that PM_PrefsCheckBoxes puts thes within a GroupBox) @rtype: list @see: PM_PrefsCheckBoxes @see: self._loadDisplayOptionsGroupBox where this list is used. @see: Superclass method which is overridden here -- DnaOrCnt_PropertyManager._params_for_creating_cursorTextCheckBoxes() """ params = \ [ #Format: (" checkbox text", prefs_key) ("Number of bases", dnaStrandEditCommand_cursorTextCheckBox_numberOfBases_prefs_key), ("Number of bases to be changed", dnaStrandEditCommand_cursorTextCheckBox_changedBases_prefs_key) ] return params def getParameters(self): name = self.nameLineEdit.text() numberOfBases = self.numberOfBasesSpinBox.value() dnaForm = self._conformation dnaModel = self.dnaModel color = self._colorChooser.getColor() return (numberOfBases, dnaForm, dnaModel, color, name ) def setParameters(self, params): """ This is usually called when you are editing an existing structure. It also gets called when selecting a new strand (within this command). Some property manager ui elements then display the information obtained from the object being edited. TODO: - Make this a EditCommand_PM API method? - See also the routines GraphicsMode.setParams or object.setProps ..better to name them all in one style? """ numberOfBases, \ dnaForm, \ dnaModel, \ color, \ name = params if numberOfBases is not None: self.numberOfBasesSpinBox.setValue(numberOfBases) if dnaForm is not None: self._conformation = dnaForm if dnaModel is not None: self.dnaModel = dnaModel if color is not None: self._colorChooser.setColor(color) if name: # Minimal test. Should add a validator. --Mark 2008-12-16 self.nameLineEdit.setText(name) # This gets called when we enter the command *and* when selecting a new # strand. In either case, we must update the sequence in the sequenece # editor. Fixes bug 2951. --Mark 2008-12-16 if self.command and self.command.hasValidStructure(): #print "setParameters(): loading sequence in sequence editor for ", name self.updateSequence(strand = self.command.struct) return def connect_or_disconnect_signals(self, isConnect): """ Connect or disconnect widget signals sent to their slot methods. This can be overridden in subclasses. By default it does nothing. @param isConnect: If True the widget will send the signals to the slot method. @type isConnect: boolean """ #TODO: This is a temporary fix for a bug. When you invoke a temporary # mode Entering such a temporary mode keeps the signals of #PM from the previous mode connected ( #but while exiting that temporary mode and reentering the #previous mode, it atucally reconnects the signal! This gives rise to #lots of bugs. This needs more general fix in Temporary mode API. # -- Ninad 2008-01-09 (similar comment exists in MovePropertyManager.py if isConnect and self.isAlreadyConnected: if debug_flags.atom_debug: print_compact_stack("warning: attempt to connect widgets"\ "in this PM that are already connected." ) return if not isConnect and self.isAlreadyDisconnected: if debug_flags.atom_debug: print_compact_stack("warning: attempt to disconnect widgets"\ "in this PM that are already disconnected.") return self.isAlreadyConnected = isConnect self.isAlreadyDisconnected = not isConnect if isConnect: change_connect = self.win.connect else: change_connect = self.win.disconnect if self.sequenceEditor: self.sequenceEditor.connect_or_disconnect_signals(isConnect) _superclass.connect_or_disconnect_signals(self, isConnect) change_connect(self.disableStructHighlightingCheckbox, SIGNAL('stateChanged(int)'), self.change_struct_highlightPolicy) change_connect(self.showCursorTextCheckBox, SIGNAL('stateChanged(int)'), self._update_state_of_cursorTextGroupBox) change_connect(self.nameLineEdit, SIGNAL("editingFinished()"), self._nameChanged) return def _update_UI_do_updates(self): """ @see: Command_PropertyManager. _update_UI_do_updates() @see: DnaStrand_EditCommand.command_update_UI() @see: DnaStrand_EditCommand.hasResizableStructure() """ if not self.command.hasValidStructure(): print "DnaStrand not a valid structure." self._pmGroupBox1.setEnabled(False) self._displayOptionsGroupBox.setEnabled(False) self.sequenceEditor.updateSequence(strand = " ") self.sequenceEditor.setEnabled(False) self.nameLineEdit.setText("") self.numberOfBasesSpinBox.setValue(0) return else: self._pmGroupBox1.setEnabled(True) self._displayOptionsGroupBox.setEnabled(True) self.sequenceEditor.setEnabled(True) isStructResizable, why_not = self.command.hasResizableStructure() if not isStructResizable: #disable all widgets if self._pmGroupBox1.isEnabled(): self._pmGroupBox1.setEnabled(False) msg1 = ("Attention: ") % (self.command.struct.name) msg2 = redmsg("DnaStrand <b>%s</b> is not resizable. Reason: %s" % \ (self.command.struct.name, why_not)) self.updateMessage(msg1 + msg2) else: if not self._pmGroupBox1.isEnabled(): self._pmGroupBox1.setEnabled(True) msg1 = ("Editing <b>%s</b>. ") % (self.command.struct.name) msg2 = "Use resize handles to resize the strand. "\ "Use the <i>Sequence Editor</i> to edit the sequence." self.updateMessage(msg1 + msg2) return def close(self): """ Close this property manager. Also sets the name of the self.command's structure to the one displayed in the line edit field. @see self.show() @see: DnaSegment_EditCommand.setStructureName """ if self.command is not None: name = str(self.nameLineEdit.text()) self.command.setStructureName(name) if self.sequenceEditor: self.sequenceEditor.close() _superclass.close(self) return def updateSequence(self, strand = None): """ Public method provided for convenience. If any callers outside of this command need to update the sequence in the sequence editor, they can simply do DnaStrand_ProprtyManager.updateSequence() rather than DnaStrand_ProprtyManager.sequenceEditor.updateSequence() @see: Ui_DnaSequenceEditor.updateSequence() """ if self.sequenceEditor: self.sequenceEditor.updateSequence(strand = strand) return def change_struct_highlightPolicy(self,checkedState = False): """ Change the 'highlight policy' of the structure being edited (i.e. self.command.struct) . @param checkedState: The checked state of the checkbox that says 'Don't highlight while editing DNA'. So, it its True, the structure being edited won't get highlighted. @see: DnaStrand.setHighlightPolicy for more comments """ if self.command and self.command.hasValidStructure(): highlight = not checkedState self.command.struct.setHighlightPolicy(highlight = highlight) return def _addWhatsThisText(self): """ Add what's this text. Abstract method. """ pass def _nameChanged(self): # Added by Mark. 2008-12-16 """ Slot for "Name" field. Changes the name of the strand if the user types in a new name. @warning: this lacks a validator. User can type in a name with invalid characters. """ if not self.command.hasValidStructure(): return name = str(self.nameLineEdit.text()) if not name: # Minimal test. Should add a validator. Ask Bruce for example validator code somewhere. --Mark 2008-12-16 if self.command.hasValidStructure(): self.nameLineEdit.setText(self.command.getStructureName()) return self.command.setStructureName(name) self._update_UI_do_updates() # Updates the message box. return
class NanotubeGeneratorPropertyManager(PM_Dialog): """ The NanotubeGeneratorPropertyManager class provides a Property Manager for the "Build > Nanotube" command. """ # The title that appears in the property manager header. title = "Nanotube" # The name of this property manager. This will be set to # the name of the PropMgr (this) object via setObjectName(). pmName = title # The relative path to PNG file that appears in the header. iconPath = "ui/actions/Tools/Build Structures/Nanotube.png" def __init__(self): """Construct the Graphene Property Manager. """ PM_Dialog.__init__(self, self.pmName, self.iconPath, self.title) #@self.addGroupBoxes() #@self.add_whats_this_text() self.updateMessageGroupBox() def updateMessageGroupBox(self): msg = "" # A (4, 4) tube is stable, but a (3, 3) has not been seen in # isolation. Circumference of a (4, 4) tube is about 6.93. xOffset = self.n + self.m * math.cos(math.pi/3.0) yOffset = self.m * math.sin(math.pi/3.0) circumference = math.sqrt(xOffset * xOffset + yOffset * yOffset) if (circumference < 6.5): msg = "Warning: Small diameter nanotubes may be unstable, \ and may give unexpected results when minimized.<p>" msg = msg + "Edit the Nanotube parameters and select <b>Preview</b> to \ preview the structure. Click <b>Done</b> to insert it into the model." # This causes the "Message" box to be displayed as well. # setAsDefault=True causes this message to be reset whenever # this PropMgr is (re)displayed via show(). Mark 2007-06-01. self.MessageGroupBox.insertHtmlMessage(msg, setAsDefault=True) def _addGroupBoxes(self): """ Add the 3 group boxes to the Nanotube Property Manager dialog. """ self.pmGroupBox1 = \ PM_GroupBox( self, title = "Nanotube Parameters" ) self.pmGroupBox2 = \ PM_GroupBox( self, title = "Nanotube Distortion" ) self.pmGroupBox3 = \ PM_GroupBox( self, title = "Multi-Walled Nanotubes" ) # Add group box widgets. self._loadGroupBox1(self.pmGroupBox1) self._loadGroupBox2(self.pmGroupBox2) self._loadGroupBox3(self.pmGroupBox3) def _loadGroupBox1(self, inPmGroupBox): """ Load widgets in group box 1. """ memberChoices = ["Carbon", "Boron Nitride"] self.typeComboBox= \ PM_ComboBox( inPmGroupBox, label = "Type :", choices = memberChoices, index = 0, setAsDefault = True, spanWidth = False ) self.connect( self.typeComboBox, SIGNAL("currentIndexChanged(int)"), self.nt_type_changed) self.lengthField = \ PM_DoubleSpinBox( inPmGroupBox, label = "Length :", value = 20.0, setAsDefault = True, minimum = 1.0, maximum = 1000.0, singleStep = 1.0, decimals = 3, suffix = " Angstroms" ) self.n = 5 self.chiralityNSpinBox = \ PM_SpinBox( inPmGroupBox, label = "Chirality (n) :", value = self.n, setAsDefault = True ) self.connect(self.chiralityNSpinBox, SIGNAL("valueChanged(int)"), self.chirality_fixup) self.m = 5 self.chiralityMSpinBox = \ PM_SpinBox( inPmGroupBox, label = "Chirality (m) :", value = self.m, setAsDefault = True ) self.connect(self.chiralityMSpinBox, SIGNAL("valueChanged(int)"), self.chirality_fixup) self.bondLengthField = \ PM_DoubleSpinBox( inPmGroupBox, label = "Bond Length :", value = CC_GRAPHITIC_BONDLENGTH, setAsDefault = True, minimum = 1.0, maximum = 3.0, singleStep = 0.1, decimals = 3, suffix = " Angstroms" ) endingChoices = ["None", "Hydrogen", "Nitrogen"] self.endingsComboBox= \ PM_ComboBox( inPmGroupBox, label = "Endings :", choices = endingChoices, index = 0, setAsDefault = True, spanWidth = False ) def _loadGroupBox2(self, inPmGroupBox): """ Load widgets in group box 2. """ self.zDistortionField = \ PM_DoubleSpinBox( inPmGroupBox, label = "Z-distortion :", value = 0.0, setAsDefault = True, minimum = 0.0, maximum = 10.0, singleStep = 0.1, decimals = 3, suffix = " Angstroms" ) self.xyDistortionField = \ PM_DoubleSpinBox( inPmGroupBox, label = "XY-distortion :", value = 0.0, setAsDefault = True, minimum = 0.0, maximum = 2.0, singleStep = 0.1, decimals = 3, suffix = " Angstroms" ) self.twistSpinBox = \ PM_SpinBox( inPmGroupBox, label = "Twist :", value = 0, setAsDefault = True, minimum = 0, maximum = 100, # What should maximum be? suffix = " deg/A" ) self.bendSpinBox = \ PM_SpinBox( inPmGroupBox, label = "Bend :", value = 0, setAsDefault = True, minimum = 0, maximum = 360, suffix = " deg" ) def _loadGroupBox3(self, inPmGroupBox): """ Load widgets in group box 3. """ # "Number of Nanotubes" SpinBox self.mwntCountSpinBox = \ PM_SpinBox( inPmGroupBox, label = "Number :", value = 1, setAsDefault = True, minimum = 1, maximum = 10, suffix = " nanotubes" ) self.mwntCountSpinBox.setSpecialValueText("SWNT") # "Spacing" lineedit. self.mwntSpacingField = \ PM_DoubleSpinBox( inPmGroupBox, label = "Spacing :", value = 2.46, setAsDefault = True, minimum = 1.0, maximum = 10.0, singleStep = 0.1, decimals = 3, suffix = " Angstroms" ) def _addWhatsThisText(self): """ What's This text for widgets in this Property Manager. """ from ne1_ui.WhatsThisText_for_PropertyManagers import whatsThis_NanotubeGeneratorPropertyManager whatsThis_NanotubeGeneratorPropertyManager(self) def _addToolTipText(self): """ Tool Tip text for widgets in this Property Manager. """ from ne1_ui.ToolTipText_for_PropertyManagers import ToolTip_NanotubeGeneratorPropertyManager ToolTip_NanotubeGeneratorPropertyManager(self) def chirality_fixup(self, spinBoxValueJunk = None): """ Slot for several validators for different parameters. This gets called each time a user types anything into a widget or changes a spinbox. @param spinBoxValueJunk: This is the Spinbox value from the valueChanged signal. It is not used. We just want to know that the spinbox value has changed. @type spinBoxValueJunk: double or None """ if not hasattr(self, 'n'): print_compact_traceback("Bug: no attr 'n' ") # mark 2007-05-24 return n_previous = int(self.n) m_previous = int(self.m) n = self.chiralityNSpinBox.value() m = self.chiralityMSpinBox.value() # Two restrictions to maintain # n >= 2 # 0 <= m <= n if n < 2: n = 2 if m != self.m: # The user changed m. If m became larger than n, make n bigger. if m > n: n = m elif n != self.n: # The user changed n. If n became smaller than m, make m smaller. if m > n: m = n self.chiralityNSpinBox.setValue(n) self.chiralityMSpinBox.setValue(m) self.m, self.n = m, n self.updateMessageGroupBox() def nt_type_changed(self, idx): """ Slot for Nanotube Type combobox. Update the bond length field when the type changes. """ self.bondLengthField.setValue(ntBondLengths[idx])
class BackrubProteinSim_PropertyManager(Command_PropertyManager): """ The BackrubProteinSim_PropertyManager class provides a Property Manager for the B{Fixed backbone Protein Sequence Design} command on the flyout toolbar in the Build > Protein > Simulate mode. @ivar title: The title that appears in the property manager header. @type title: str @ivar pmName: The name of this property manager. This is used to set the name of the PM_Dialog object via setObjectName(). @type name: str @ivar iconPath: The relative path to the PNG file that contains a 22 x 22 icon image that appears in the PM header. @type iconPath: str """ title = "Backrub Motion" pmName = title iconPath = "ui/actions/Command Toolbar/BuildProtein/Backrub.png" def __init__( self, command ): """ Constructor for the property manager. """ _superclass.__init__(self, command) self.showTopRowButtons( PM_DONE_BUTTON | \ PM_WHATS_THIS_BUTTON) msg = "Choose various parameters from below to design an optimized" \ " protein sequence with Rosetta with backrub motion allowed." self.updateMessage(msg) def connect_or_disconnect_signals(self, isConnect = True): """ Connect or disconnect widget signals sent to their slot methods. This can be overridden in subclasses. By default it does nothing. @param isConnect: If True the widget will send the signals to the slot method. @type isConnect: boolean """ if isConnect: change_connect = self.win.connect else: change_connect = self.win.disconnect change_connect(self.ex1Checkbox, SIGNAL("stateChanged(int)"), self.update_ex1) change_connect(self.ex1aroCheckbox, SIGNAL("stateChanged(int)"), self.update_ex1aro) change_connect(self.ex2Checkbox, SIGNAL("stateChanged(int)"), self.update_ex2) change_connect(self.ex2aroOnlyCheckbox, SIGNAL("stateChanged(int)"), self.update_ex2aro_only) change_connect(self.ex3Checkbox, SIGNAL("stateChanged(int)"), self.update_ex3) change_connect(self.ex4Checkbox, SIGNAL("stateChanged(int)"), self.update_ex4) change_connect(self.rotOptCheckbox, SIGNAL("stateChanged(int)"), self.update_rot_opt) change_connect(self.tryBothHisTautomersCheckbox, SIGNAL("stateChanged(int)"), self.update_try_both_his_tautomers) change_connect(self.softRepDesignCheckbox, SIGNAL("stateChanged(int)"), self.update_soft_rep_design) change_connect(self.useElecRepCheckbox, SIGNAL("stateChanged(int)"), self.update_use_elec_rep) change_connect(self.norepackDisulfCheckbox, SIGNAL("stateChanged(int)"), self.update_norepack_disulf) #signal slot connections for the push buttons change_connect(self.okButton, SIGNAL("clicked()"), self.runRosettaBackrubSim) return #Protein Display methods def show(self): """ Shows the Property Manager. Exends superclass method. """ self.sequenceEditor = self.win.createProteinSequenceEditorIfNeeded() self.sequenceEditor.hide() #update the min and max residues spinbox max values based on the length #of the current protein numResidues = self._getNumResiduesForCurrentProtein() if numResidues == 0: self.minresSpinBox.setMaximum(numResidues + 2) self.maxresSpinBox.setMaximum(numResidues + 2) else: self.minresSpinBox.setMaximum(numResidues) self.maxresSpinBox.setMaximum(numResidues) _superclass.show(self) return def _addGroupBoxes( self ): """ Add the Property Manager group boxes. """ self._pmGroupBox2 = PM_GroupBox( self, title = "Backrub Specific Parameters") self._loadGroupBox2( self._pmGroupBox2 ) self._pmGroupBox1 = PM_GroupBox( self, title = "Rosetta Sequence Design Parameters") self._loadGroupBox1( self._pmGroupBox1 ) return def _loadGroupBox2(self, pmGroupBox): """ Load widgets in group box. """ self.bondAngleWeightSimSpinBox = PM_DoubleSpinBox( pmGroupBox, labelColumn = 0, label = "Bond angle weight:", minimum = 0.01, decimals = 2, maximum = 1.0, singleStep = 0.01, value = 1.0, setAsDefault = False, spanWidth = False) bond_angle_param_list = ['Amber', 'Charmm'] self.bondAngleParamComboBox = PM_ComboBox( pmGroupBox, label = "Bond angle parameters:", choices = bond_angle_param_list, setAsDefault = False) self.onlybbSpinBox = PM_DoubleSpinBox( pmGroupBox, labelColumn = 0, label = "Only backbone rotation:", minimum = 0.01, maximum = 1.0, value = 0.75, decimals = 2, singleStep = 0.01, setAsDefault = False, spanWidth = False) self.onlyrotSpinBox = PM_DoubleSpinBox( pmGroupBox, labelColumn = 0, label = "Only rotamer rotation:", minimum = 0.01, maximum = 1.0, decimals = 2, value = 0.25, singleStep = 0.01, setAsDefault = False, spanWidth = False) self.mctempSpinBox = PM_DoubleSpinBox( pmGroupBox, labelColumn = 0, label = "MC simulation temperature:", minimum = 0.1, value = 0.6, maximum = 1.0, decimals = 2, singleStep = 0.1, setAsDefault = False, spanWidth = False) numResidues = self._getNumResiduesForCurrentProtein() self.minresSpinBox = PM_SpinBox( pmGroupBox, labelColumn = 0, label = "Minimum number of residues:", minimum = 2, maximum = numResidues, singleStep = 1, setAsDefault = False, spanWidth = False) self.maxresSpinBox = PM_SpinBox( pmGroupBox, labelColumn = 0, label = "Maximum number of residues:", minimum = 2, maximum = numResidues, singleStep = 1, setAsDefault = False, spanWidth = False) if numResidues == 0: self.minresSpinBox.setMaximum(numResidues + 2) self.maxresSpinBox.setMaximum(numResidues + 2) return def _addWhatsThisText( self ): """ What's This text for widgets in this Property Manager. """ pass def _addToolTipText(self): """ Tool Tip text for widgets in this Property Manager. """ pass def _getNumResiduesForCurrentProtein(self): """ Get number of residues for the current protein """ _current_protein = self.win.assy.getSelectedProteinChunk() if _current_protein: return len(_current_protein.protein.get_sequence_string()) return 0 def _loadGroupBox1(self, pmGroupBox): """ Load widgets in group box. """ self.numSimSpinBox = PM_SpinBox( pmGroupBox, labelColumn = 0, label = "Number of trials:", minimum = 1000, maximum = 1000000, singleStep = 1000, setAsDefault = False, spanWidth = False) self.ex1Checkbox = PM_CheckBox(pmGroupBox, text = "Expand rotamer library for chi1 angle", state = Qt.Unchecked, setAsDefault = False, widgetColumn = 0, spanWidth = True) self.ex1aroCheckbox = PM_CheckBox(pmGroupBox, text = "Use large chi1 library for aromatic residues", state = Qt.Unchecked, setAsDefault = False, widgetColumn = 0, spanWidth = True) self.ex2Checkbox = PM_CheckBox(pmGroupBox, text = "Expand rotamer library for chi2 angle", state = Qt.Unchecked, setAsDefault = False, widgetColumn = 0, spanWidth = True) self.ex2aroOnlyCheckbox = PM_CheckBox(pmGroupBox, text = "Use large chi2 library only for aromatic residues", state = Qt.Unchecked, setAsDefault = False, widgetColumn = 0, spanWidth = True) self.ex3Checkbox = PM_CheckBox(pmGroupBox, text = "Expand rotamer library for chi3 angle", state = Qt.Unchecked, setAsDefault = False, widgetColumn = 0, spanWidth = True) self.ex4Checkbox = PM_CheckBox(pmGroupBox, text ="Expand rotamer library for chi4 angle", state = Qt.Unchecked, setAsDefault = False, widgetColumn = 0, spanWidth = True) self.rotOptCheckbox = PM_CheckBox(pmGroupBox, text ="Optimize one-body energy", state = Qt.Unchecked, setAsDefault = False, widgetColumn = 0, spanWidth = True) self.tryBothHisTautomersCheckbox = PM_CheckBox(pmGroupBox, text ="Try both histidine tautomers", state = Qt.Unchecked, setAsDefault = False, widgetColumn = 0, spanWidth = True) self.softRepDesignCheckbox = PM_CheckBox(pmGroupBox, text ="Use softer Lennard-Jones repulsive term", state = Qt.Unchecked, setAsDefault = False, widgetColumn = 0, spanWidth = True) self.useElecRepCheckbox = PM_CheckBox(pmGroupBox, text ="Use electrostatic repulsion", state = Qt.Unchecked, setAsDefault = False, widgetColumn = 0, spanWidth = True) self.norepackDisulfCheckbox = PM_CheckBox(pmGroupBox, text ="Don't re-pack disulphide bonds", state = Qt.Unchecked, setAsDefault = False, widgetColumn = 0, spanWidth = True) self.otherCommandLineOptions = PM_TextEdit(pmGroupBox, label = "Command line options:", spanWidth = True) self.otherCommandLineOptions.setFixedHeight(80) self.okButton = PM_PushButton( pmGroupBox, text = "Run Rosetta", setAsDefault = True, spanWidth = True) return def update_ex1(self, state): """ Update the command text edit depending on the state of the update_ex1 checkbox @param state:state of the update_ex1 checkbox @type state: int """ otherOptionsText = str(self.otherCommandLineOptions.toPlainText()) if self.ex1Checkbox.isChecked() == True: otherOptionsText = otherOptionsText + ' -ex1 ' else: otherOptionsText = otherOptionsText.replace(' -ex1 ', '') self.otherCommandLineOptions.setText(otherOptionsText) return def update_ex1aro(self, state): """ Update the command text edit depending on the state of the update_ex1aro checkbox @param state:state of the update_ex1aro checkbox @type state: int """ otherOptionsText = str(self.otherCommandLineOptions.toPlainText()) if self.ex1aroCheckbox.isChecked() == True: otherOptionsText = otherOptionsText + ' -ex1aro ' else: otherOptionsText = otherOptionsText.replace(' -ex1aro ', '') self.otherCommandLineOptions.setText(otherOptionsText) return def update_ex2(self, state): """ Update the command text edit depending on the state of the update_ex2 checkbox @param state:state of the update_ex2 checkbox @type state: int """ otherOptionsText = str(self.otherCommandLineOptions.toPlainText()) if self.ex2Checkbox.isChecked() == True: otherOptionsText = otherOptionsText + ' -ex2 ' else: otherOptionsText = otherOptionsText.replace(' -ex2 ', '') self.otherCommandLineOptions.setText(otherOptionsText) return def update_ex2aro_only(self, state): """ Update the command text edit depending on the state of the update_ex2aro_only checkbox @param state:state of the update_ex2aro_only checkbox @type state: int """ otherOptionsText = str(self.otherCommandLineOptions.toPlainText()) if self.ex2aroOnlyCheckbox.isChecked() == True: otherOptionsText = otherOptionsText + ' -ex2aro_only ' else: otherOptionsText = otherOptionsText.replace(' -ex2aro_only ', '') self.otherCommandLineOptions.setText(otherOptionsText) return def update_ex3(self, state): """ Update the command text edit depending on the state of the update_ex3 checkbox @param state:state of the update_ex3 checkbox @type state: int """ otherOptionsText = str(self.otherCommandLineOptions.toPlainText()) if self.ex3Checkbox.isChecked() == True: otherOptionsText = otherOptionsText + ' -ex3 ' else: otherOptionsText = otherOptionsText.replace(' -ex3 ', '') self.otherCommandLineOptions.setText(otherOptionsText) return def update_ex4(self, state): """ Update the command text edit depending on the state of the update_ex4 checkbox @param state:state of the update_ex4 checkbox @type state: int """ otherOptionsText = str(self.otherCommandLineOptions.toPlainText()) if self.ex4Checkbox.isChecked() == True: otherOptionsText = otherOptionsText + ' -ex4 ' else: otherOptionsText = otherOptionsText.replace(' -ex4 ', '') self.otherCommandLineOptions.setText(otherOptionsText) return def update_rot_opt(self, state): """ Update the command text edit depending on the state of the update_rot_opt checkbox @param state:state of the update_rot_opt checkbox @type state: int """ otherOptionsText = str(self.otherCommandLineOptions.toPlainText()) if self.rotOptCheckbox.isChecked() == True: otherOptionsText = otherOptionsText + ' -rot_opt ' else: otherOptionsText = otherOptionsText.replace(' -rot_opt ', '') self.otherCommandLineOptions.setText(otherOptionsText) return def update_try_both_his_tautomers(self, state): """ Update the command text edit depending on the state of the update_try_both_his_tautomers checkbox @param state:state of the update_try_both_his_tautomers checkbox @type state: int """ otherOptionsText = str(self.otherCommandLineOptions.toPlainText()) if self.tryBothHisTautomersCheckbox.isChecked() == True: otherOptionsText = otherOptionsText + ' -try_both_his_tautomers ' else: otherOptionsText = otherOptionsText.replace(' -try_both_his_tautomers ', '') self.otherCommandLineOptions.setText(otherOptionsText) return def update_soft_rep_design(self, state): """ Update the command text edit depending on the state of the update_soft_rep_design checkbox @param state:state of the update_soft_rep_design checkbox @type state: int """ otherOptionsText = str(self.otherCommandLineOptions.toPlainText()) if self.softRepDesignCheckbox.isChecked() == True: otherOptionsText = otherOptionsText + ' -soft_rep_design ' else: otherOptionsText = otherOptionsText.replace(' -soft_rep_design ', '') self.otherCommandLineOptions.setText(otherOptionsText) return def update_use_elec_rep(self, state): """ Update the command text edit depending on the state of the update_use_elec_rep checkbox @param state:state of the update_use_elec_rep checkbox @type state: int """ otherOptionsText = str(self.otherCommandLineOptions.toPlainText()) if self.useElecRepCheckbox.isChecked() == True: otherOptionsText = otherOptionsText + ' -use_electrostatic_repulsion ' else: otherOptionsText = otherOptionsText.replace(' -use_electrostatic_repulsion ', '') self.otherCommandLineOptions.setText(otherOptionsText) return def update_norepack_disulf(self, state): """ Update the command text edit depending on the state of the update_no_repack checkbox @param state:state of the update_no_repack checkbox @type state: int """ otherOptionsText = str(self.otherCommandLineOptions.toPlainText()) if self.norepackDisulfCheckbox.isChecked() == True: otherOptionsText = otherOptionsText + ' -norepack_disulf ' else: otherOptionsText = otherOptionsText.replace(' -norepack_disulf ', '') self.otherCommandLineOptions.setText(otherOptionsText) return def runRosettaBackrubSim(self): """ Get all the parameters from the PM and run a rosetta simulation """ proteinChunk = self.win.assy.getSelectedProteinChunk() if not proteinChunk: msg = "You must select a single protein to run a Rosetta <i>Backrub</i> simulation." self.updateMessage(msg) return otherOptionsText = str(self.otherCommandLineOptions.toPlainText()) numSim = self.numSimSpinBox.value() argList = [numSim, otherOptionsText, proteinChunk.name] backrubSpecificArgList = self.getBackrubSpecificArgumentList() from simulation.ROSETTA.rosetta_commandruns import rosettaSetup_CommandRun if argList[0] > 0: env.prefs[rosetta_backrub_enabled_prefs_key] = True cmdrun = rosettaSetup_CommandRun(self.win, argList, "BACKRUB_PROTEIN_SEQUENCE_DESIGN", backrubSpecificArgList) cmdrun.run() return def getBackrubSpecificArgumentList(self): """ get list of backrub specific parameters from PM """ listOfArgs = [] bond_angle_weight = str(self.bondAngleWeightSimSpinBox.value()) listOfArgs.append('-bond_angle_weight') listOfArgs.append( bond_angle_weight) if self.bondAngleParamComboBox.currentIndex() == 0: bond_angle_params = 'bond_angle_amber_rosetta' else: bond_angle_params = 'bond_angle_charmm_rosetta' listOfArgs.append('-bond_angle_params') listOfArgs.append(bond_angle_params) only_bb = str(self.onlybbSpinBox.value()) listOfArgs.append('-only_bb') listOfArgs.append( only_bb) only_rot = str(self.onlyrotSpinBox.value()) listOfArgs.append('-only_rot') listOfArgs.append( only_rot) mc_temp = str(self.mctempSpinBox.value()) listOfArgs.append('-mc_temp') listOfArgs.append( mc_temp) min_res = self.minresSpinBox.value() max_res = self.maxresSpinBox.value() if max_res < min_res: msg = redmsg("Maximum number of residues for rosetta simulation with backrub" \ " motion cannot be less than minimum number of residues."\ " Neglecting this parameter for this simulation.") env.history.message("BACKRUB SIMULATION: " + msg) else: listOfArgs.append('-min_res') listOfArgs.append( str(min_res)) listOfArgs.append('-max_res') listOfArgs.append( str(max_res)) return listOfArgs
class DnaStrand_PropertyManager(DnaOrCnt_PropertyManager): """ The DnaStrand_PropertyManager class provides a Property Manager for the DnaStrand_EditCommand. @ivar title: The title that appears in the property manager header. @type title: str @ivar pmName: The name of this property manager. This is used to set the name of the PM_Dialog object via setObjectName(). @type name: str @ivar iconPath: The relative path to the PNG file that contains a 22 x 22 icon image that appears in the PM header. @type iconPath: str """ title = "DnaStrand Properties" iconPath = "ui/actions/Properties Manager/Strand.png" def __init__(self, command): """ Constructor for the Build DNA property manager. """ self.sequenceEditor = None self._numberOfBases = 0 self._conformation = 'B-DNA' self.dnaModel = 'PAM3' _superclass.__init__(self, command) self.showTopRowButtons( PM_DONE_BUTTON | \ PM_WHATS_THIS_BUTTON) return def _addGroupBoxes(self): """ Add group boxes to this PM. """ self._pmGroupBox1 = PM_GroupBox(self, title="Parameters") self._loadGroupBox1(self._pmGroupBox1) self._displayOptionsGroupBox = PM_GroupBox(self, title="Display Options") self._loadDisplayOptionsGroupBox(self._displayOptionsGroupBox) #Sequence Editor. This is NOT a groupbox, needs cleanup. Doing it here #so that the sequence editor gets connected! Perhaps #superclass should define _loadAdditionalWidgets. -- Ninad2008-10-03 self._loadSequenceEditor() return def _loadGroupBox1(self, pmGroupBox): """ Load widgets in group box 1. """ self.nameLineEdit = PM_LineEdit(pmGroupBox, label="Name:", text="", setAsDefault=False) self.numberOfBasesSpinBox = \ PM_SpinBox( pmGroupBox, label = "Number of bases:", value = self._numberOfBases, setAsDefault = False, minimum = 2, maximum = 10000 ) self.disableStructHighlightingCheckbox = \ PM_CheckBox( pmGroupBox, text = "Don't highlight while editing DNA", widgetColumn = 0, state = Qt.Unchecked, setAsDefault = True, spanWidth = True ) #As of 2008-03-31, the properties such as number of bases will be #editable only by using the resize handles. self.numberOfBasesSpinBox.setEnabled(False) return def _loadSequenceEditor(self): """ Temporary code that shows the Sequence editor ..a doc widget docked at the bottom of the mainwindow. The implementation is going to change before 'rattleSnake' product release. As of 2007-11-20: This feature (sequence editor) is waiting for the ongoing dna model work to complete. """ self.sequenceEditor = self.win.createDnaSequenceEditorIfNeeded() self.sequenceEditor.hide() return def _loadDisplayOptionsGroupBox(self, pmGroupBox): """ Overrides superclass method. Also loads the color chooser widget. """ self._loadColorChooser(pmGroupBox) _superclass._loadDisplayOptionsGroupBox(self, pmGroupBox) return def _connect_showCursorTextCheckBox(self): """ Connect the show cursor text checkbox with user prefs_key. Overrides DnaOrCnt_PropertyManager._connect_showCursorTextCheckBox """ connect_checkbox_with_boolean_pref( self.showCursorTextCheckBox, dnaStrandEditCommand_showCursorTextCheckBox_prefs_key) return def _params_for_creating_cursorTextCheckBoxes(self): """ Returns params needed to create various cursor text checkboxes connected to prefs_keys that allow custom cursor texts. @return: A list containing tuples in the following format: ('checkBoxTextString' , preference_key). PM_PrefsCheckBoxes uses this data to create checkboxes with the the given names and connects them to the provided preference keys. (Note that PM_PrefsCheckBoxes puts thes within a GroupBox) @rtype: list @see: PM_PrefsCheckBoxes @see: self._loadDisplayOptionsGroupBox where this list is used. @see: Superclass method which is overridden here -- DnaOrCnt_PropertyManager._params_for_creating_cursorTextCheckBoxes() """ params = \ [ #Format: (" checkbox text", prefs_key) ("Number of bases", dnaStrandEditCommand_cursorTextCheckBox_numberOfBases_prefs_key), ("Number of bases to be changed", dnaStrandEditCommand_cursorTextCheckBox_changedBases_prefs_key) ] return params def getParameters(self): name = self.nameLineEdit.text() numberOfBases = self.numberOfBasesSpinBox.value() dnaForm = self._conformation dnaModel = self.dnaModel color = self._colorChooser.getColor() return (numberOfBases, dnaForm, dnaModel, color, name) def setParameters(self, params): """ This is usually called when you are editing an existing structure. It also gets called when selecting a new strand (within this command). Some property manager ui elements then display the information obtained from the object being edited. TODO: - Make this a EditCommand_PM API method? - See also the routines GraphicsMode.setParams or object.setProps ..better to name them all in one style? """ numberOfBases, \ dnaForm, \ dnaModel, \ color, \ name = params if numberOfBases is not None: self.numberOfBasesSpinBox.setValue(numberOfBases) if dnaForm is not None: self._conformation = dnaForm if dnaModel is not None: self.dnaModel = dnaModel if color is not None: self._colorChooser.setColor(color) if name: # Minimal test. Should add a validator. --Mark 2008-12-16 self.nameLineEdit.setText(name) # This gets called when we enter the command *and* when selecting a new # strand. In either case, we must update the sequence in the sequenece # editor. Fixes bug 2951. --Mark 2008-12-16 if self.command and self.command.hasValidStructure(): #print "setParameters(): loading sequence in sequence editor for ", name self.updateSequence(strand=self.command.struct) return def connect_or_disconnect_signals(self, isConnect): """ Connect or disconnect widget signals sent to their slot methods. This can be overridden in subclasses. By default it does nothing. @param isConnect: If True the widget will send the signals to the slot method. @type isConnect: boolean """ #TODO: This is a temporary fix for a bug. When you invoke a temporary # mode Entering such a temporary mode keeps the signals of #PM from the previous mode connected ( #but while exiting that temporary mode and reentering the #previous mode, it atucally reconnects the signal! This gives rise to #lots of bugs. This needs more general fix in Temporary mode API. # -- Ninad 2008-01-09 (similar comment exists in MovePropertyManager.py if isConnect and self.isAlreadyConnected: if debug_flags.atom_debug: print_compact_stack("warning: attempt to connect widgets"\ "in this PM that are already connected." ) return if not isConnect and self.isAlreadyDisconnected: if debug_flags.atom_debug: print_compact_stack("warning: attempt to disconnect widgets"\ "in this PM that are already disconnected.") return self.isAlreadyConnected = isConnect self.isAlreadyDisconnected = not isConnect if isConnect: change_connect = self.win.connect else: change_connect = self.win.disconnect if self.sequenceEditor: self.sequenceEditor.connect_or_disconnect_signals(isConnect) _superclass.connect_or_disconnect_signals(self, isConnect) change_connect(self.disableStructHighlightingCheckbox, SIGNAL('stateChanged(int)'), self.change_struct_highlightPolicy) change_connect(self.showCursorTextCheckBox, SIGNAL('stateChanged(int)'), self._update_state_of_cursorTextGroupBox) change_connect(self.nameLineEdit, SIGNAL("editingFinished()"), self._nameChanged) return def _update_UI_do_updates(self): """ @see: Command_PropertyManager. _update_UI_do_updates() @see: DnaStrand_EditCommand.command_update_UI() @see: DnaStrand_EditCommand.hasResizableStructure() """ if not self.command.hasValidStructure(): print "DnaStrand not a valid structure." self._pmGroupBox1.setEnabled(False) self._displayOptionsGroupBox.setEnabled(False) self.sequenceEditor.updateSequence(strand=" ") self.sequenceEditor.setEnabled(False) self.nameLineEdit.setText("") self.numberOfBasesSpinBox.setValue(0) return else: self._pmGroupBox1.setEnabled(True) self._displayOptionsGroupBox.setEnabled(True) self.sequenceEditor.setEnabled(True) isStructResizable, why_not = self.command.hasResizableStructure() if not isStructResizable: #disable all widgets if self._pmGroupBox1.isEnabled(): self._pmGroupBox1.setEnabled(False) msg1 = ("Attention: ") % (self.command.struct.name) msg2 = redmsg("DnaStrand <b>%s</b> is not resizable. Reason: %s" % \ (self.command.struct.name, why_not)) self.updateMessage(msg1 + msg2) else: if not self._pmGroupBox1.isEnabled(): self._pmGroupBox1.setEnabled(True) msg1 = ("Editing <b>%s</b>. ") % (self.command.struct.name) msg2 = "Use resize handles to resize the strand. "\ "Use the <i>Sequence Editor</i> to edit the sequence." self.updateMessage(msg1 + msg2) return def close(self): """ Close this property manager. Also sets the name of the self.command's structure to the one displayed in the line edit field. @see self.show() @see: DnaSegment_EditCommand.setStructureName """ if self.command is not None: name = str(self.nameLineEdit.text()) self.command.setStructureName(name) if self.sequenceEditor: self.sequenceEditor.close() _superclass.close(self) return def updateSequence(self, strand=None): """ Public method provided for convenience. If any callers outside of this command need to update the sequence in the sequence editor, they can simply do DnaStrand_ProprtyManager.updateSequence() rather than DnaStrand_ProprtyManager.sequenceEditor.updateSequence() @see: Ui_DnaSequenceEditor.updateSequence() """ if self.sequenceEditor: self.sequenceEditor.updateSequence(strand=strand) return def change_struct_highlightPolicy(self, checkedState=False): """ Change the 'highlight policy' of the structure being edited (i.e. self.command.struct) . @param checkedState: The checked state of the checkbox that says 'Don't highlight while editing DNA'. So, it its True, the structure being edited won't get highlighted. @see: DnaStrand.setHighlightPolicy for more comments """ if self.command and self.command.hasValidStructure(): highlight = not checkedState self.command.struct.setHighlightPolicy(highlight=highlight) return def _addWhatsThisText(self): """ Add what's this text. Abstract method. """ pass def _nameChanged(self): # Added by Mark. 2008-12-16 """ Slot for "Name" field. Changes the name of the strand if the user types in a new name. @warning: this lacks a validator. User can type in a name with invalid characters. """ if not self.command.hasValidStructure(): return name = str(self.nameLineEdit.text()) if not name: # Minimal test. Should add a validator. Ask Bruce for example validator code somewhere. --Mark 2008-12-16 if self.command.hasValidStructure(): self.nameLineEdit.setText(self.command.getStructureName()) return self.command.setStructureName(name) self._update_UI_do_updates() # Updates the message box. return
class InsertNanotube_PropertyManager( DnaOrCnt_PropertyManager): """ The InsertNanotube_PropertyManager class provides a Property Manager for the B{Build > Nanotube > CNT} command. @ivar title: The title that appears in the property manager header. @type title: str @ivar pmName: The name of this property manager. This is used to set the name of the PM_Dialog object via setObjectName(). @type name: str @ivar iconPath: The relative path to the PNG file that contains a 22 x 22 icon image that appears in the PM header. @type iconPath: str """ title = "Insert Nanotube" pmName = title iconPath = "ui/actions/Tools/Build Structures/InsertNanotube.png" def __init__( self, win, editCommand ): """ Constructor for the Nanotube property manager. """ self.endPoint1 = None self.endPoint2 = None self.nanotube = Nanotube() # A 5x5 CNT. _superclass.__init__( self, win, editCommand) self.showTopRowButtons( PM_DONE_BUTTON | \ PM_CANCEL_BUTTON | \ PM_WHATS_THIS_BUTTON) def connect_or_disconnect_signals(self, isConnect): """ Connect or disconnect widget signals sent to their slot methods. This can be overridden in subclasses. By default it does nothing. @param isConnect: If True the widget will send the signals to the slot method. @type isConnect: boolean """ if isConnect: change_connect = self.win.connect else: change_connect = self.win.disconnect change_connect( self.ntTypeComboBox, SIGNAL("currentIndexChanged(const QString&)"), self._ntTypeComboBoxChanged ) change_connect(self.chiralityNSpinBox, SIGNAL("valueChanged(int)"), self._chiralityFixup) change_connect(self.chiralityMSpinBox, SIGNAL("valueChanged(int)"), self._chiralityFixup) change_connect(self.endingsComboBox, SIGNAL("currentIndexChanged(const QString&)"), self._endingsComboBoxChanged ) # This spin box is currently hidden. change_connect(self.bondLengthDoubleSpinBox, SIGNAL("valueChanged(double)"), self._bondLengthChanged) change_connect(self.showCursorTextCheckBox, SIGNAL('stateChanged(int)'), self._update_state_of_cursorTextGroupBox) def ok_btn_clicked(self): """ Slot for the OK button """ if self.editCommand: self.editCommand.preview_or_finalize_structure(previewing = False) ##env.history.message(self.editCommand.logMessage) self.win.toolsDone() def cancel_btn_clicked(self): """ Slot for the Cancel button. """ if self.editCommand: self.editCommand.cancelStructure() self.win.toolsCancel() def _update_widgets_in_PM_before_show(self): """ Update various widgets in this Property manager. Overrides MotorPropertyManager._update_widgets_in_PM_before_show. The various widgets , (e.g. spinboxes) will get values from the structure for which this propMgr is constructed for (self.editcCntroller.struct) @see: MotorPropertyManager._update_widgets_in_PM_before_show @see: self.show where it is called. """ pass def getFlyoutActionList(self): """ Returns custom actionlist that will be used in a specific mode or editing a feature etc Example: while in movie mode, the _createFlyoutToolBar method calls this. """ #'allActionsList' returns all actions in the flyout toolbar #including the subcontrolArea actions allActionsList = [] #Action List for subcontrol Area buttons. #In this mode there is really no subcontrol area. #We will treat subcontrol area same as 'command area' #(subcontrol area buttons will have an empty list as their command area #list). We will set the Comamnd Area palette background color to the #subcontrol area. subControlAreaActionList =[] self.exitEditCommandAction.setChecked(True) subControlAreaActionList.append(self.exitEditCommandAction) separator = QAction(self.w) separator.setSeparator(True) subControlAreaActionList.append(separator) allActionsList.extend(subControlAreaActionList) #Empty actionlist for the 'Command Area' commandActionLists = [] #Append empty 'lists' in 'commandActionLists equal to the #number of actions in subControlArea for i in range(len(subControlAreaActionList)): lst = [] commandActionLists.append(lst) params = (subControlAreaActionList, commandActionLists, allActionsList) return params def _addGroupBoxes( self ): """ Add the Insert Nanotube Property Manager group boxes. """ self._pmGroupBox1 = PM_GroupBox( self, title = "Endpoints" ) self._loadGroupBox1( self._pmGroupBox1 ) self._pmGroupBox1.hide() self._pmGroupBox2 = PM_GroupBox( self, title = "Parameters" ) self._loadGroupBox2( self._pmGroupBox2 ) self._displayOptionsGroupBox = PM_GroupBox( self, title = "Display Options" ) self._loadDisplayOptionsGroupBox( self._displayOptionsGroupBox ) self._pmGroupBox3 = PM_GroupBox( self, title = "Nanotube Distortion" ) self._loadGroupBox3( self._pmGroupBox3 ) self._pmGroupBox3.hide() #@ Temporary. self._pmGroupBox4 = PM_GroupBox( self, title = "Multi-Walled CNTs" ) self._loadGroupBox4( self._pmGroupBox4 ) self._pmGroupBox4.hide() #@ Temporary. self._pmGroupBox5 = PM_GroupBox( self, title = "Advanced Options" ) self._loadGroupBox5( self._pmGroupBox5 ) self._pmGroupBox5.hide() #@ Temporary. def _loadGroupBox1(self, pmGroupBox): """ Load widgets in group box 1. """ #Following toolbutton facilitates entering a temporary NanotubeLineMode #to create a CNT using endpoints of the specified line. self.specifyCntLineButton = PM_ToolButton( pmGroupBox, text = "Specify Endpoints", iconPath = "ui/actions/Properties Manager/Pencil.png", spanWidth = True ) self.specifyCntLineButton.setCheckable(True) self.specifyCntLineButton.setAutoRaise(True) self.specifyCntLineButton.setToolButtonStyle( Qt.ToolButtonTextBesideIcon) #EndPoint1 and endPoint2 coordinates. These widgets are hidden # as of 2007- 12 - 05 self._endPoint1SpinBoxes = PM_CoordinateSpinBoxes(pmGroupBox, label = "End Point 1") self.x1SpinBox = self._endPoint1SpinBoxes.xSpinBox self.y1SpinBox = self._endPoint1SpinBoxes.ySpinBox self.z1SpinBox = self._endPoint1SpinBoxes.zSpinBox self._endPoint2SpinBoxes = PM_CoordinateSpinBoxes(pmGroupBox, label = "End Point 2") self.x2SpinBox = self._endPoint2SpinBoxes.xSpinBox self.y2SpinBox = self._endPoint2SpinBoxes.ySpinBox self.z2SpinBox = self._endPoint2SpinBoxes.zSpinBox self._endPoint1SpinBoxes.hide() self._endPoint2SpinBoxes.hide() def _loadGroupBox2(self, pmGroupBox): """ Load widgets in group box 2. """ _ntTypeChoices = ['Carbon', 'Boron Nitride'] self.ntTypeComboBox = \ PM_ComboBox( pmGroupBox, label = "Type:", choices = _ntTypeChoices, setAsDefault = True) self.ntRiseDoubleSpinBox = \ PM_DoubleSpinBox( pmGroupBox, label = "Rise:", value = self.nanotube.getRise(), setAsDefault = True, minimum = 2.0, maximum = 4.0, decimals = 3, singleStep = 0.01 ) self.ntRiseDoubleSpinBox.hide() # Nanotube Length self.ntLengthLineEdit = \ PM_LineEdit( pmGroupBox, label = "Nanotube Length: ", text = "0.0 Angstroms", setAsDefault = False) self.ntLengthLineEdit.setDisabled(True) self.ntLengthLineEdit.hide() # Nanotube diameter self.ntDiameterLineEdit = \ PM_LineEdit( pmGroupBox, label = "Diameter: ", setAsDefault = False) self.ntDiameterLineEdit.setDisabled(True) self.updateNanotubeDiameter() self.chiralityNSpinBox = \ PM_SpinBox( pmGroupBox, label = "Chirality (n):", value = self.nanotube.getChiralityN(), minimum = 2, maximum = 100, setAsDefault = True ) self.chiralityMSpinBox = \ PM_SpinBox( pmGroupBox, label = "Chirality (m):", value = self.nanotube.getChiralityM(), minimum = 0, maximum = 100, setAsDefault = True ) # How about having user prefs for CNT and BNNT bond lengths? # I'm guessing that if the user wants to set these values, they will # do it once and would like those bond length values persist forever. # Need to discuss with others to determine if this spinbox comes out. # --Mark 2008-03-29 self.bondLengthDoubleSpinBox = \ PM_DoubleSpinBox( pmGroupBox, label = "Bond length:", value = self.nanotube.getBondLength(), setAsDefault = True, minimum = 1.0, maximum = 3.0, singleStep = 0.1, decimals = 3, suffix = " Angstroms" ) #self.bondLengthDoubleSpinBox.hide() endingChoices = ["Hydrogen", "None"] # Removed:, "Nitrogen"] self.endingsComboBox= \ PM_ComboBox( pmGroupBox, label = "Endings:", choices = endingChoices, index = 0, setAsDefault = True, spanWidth = False ) def _loadGroupBox3(self, inPmGroupBox): """ Load widgets in group box 3. """ self.zDistortionDoubleSpinBox = \ PM_DoubleSpinBox( inPmGroupBox, label = "Z-distortion:", value = 0.0, setAsDefault = True, minimum = 0.0, maximum = 10.0, singleStep = 0.1, decimals = 3, suffix = " Angstroms" ) self.xyDistortionDoubleSpinBox = \ PM_DoubleSpinBox( inPmGroupBox, label = "XY-distortion:", value = 0.0, setAsDefault = True, minimum = 0.0, maximum = 2.0, singleStep = 0.1, decimals = 3, suffix = " Angstroms" ) self.twistSpinBox = \ PM_SpinBox( inPmGroupBox, label = "Twist:", value = 0, setAsDefault = True, minimum = 0, maximum = 100, # What should maximum be? suffix = " deg/A" ) self.bendSpinBox = \ PM_SpinBox( inPmGroupBox, label = "Bend:", value = 0, setAsDefault = True, minimum = 0, maximum = 360, suffix = " deg" ) def _loadGroupBox4(self, inPmGroupBox): """ Load widgets in group box 4. """ # "Number of Nanotubes" SpinBox self.mwntCountSpinBox = \ PM_SpinBox( inPmGroupBox, label = "Number:", value = 1, setAsDefault = True, minimum = 1, maximum = 10, suffix = " nanotubes" ) self.mwntCountSpinBox.setSpecialValueText("SWNT") # "Spacing" lineedit. self.mwntSpacingDoubleSpinBox = \ PM_DoubleSpinBox( inPmGroupBox, label = "Spacing:", value = 2.46, setAsDefault = True, minimum = 1.0, maximum = 10.0, singleStep = 0.1, decimals = 3, suffix = " Angstroms" ) def _loadGroupBox5(self, pmGroupBox): """ Load widgets in group box 5. """ self._rubberbandLineGroupBox = PM_GroupBox( pmGroupBox, title = 'Rubber band Line:') ntLineChoices = ['Ladder'] self.ntRubberBandLineDisplayComboBox = \ PM_ComboBox( self._rubberbandLineGroupBox , label = " Display as:", choices = ntLineChoices, setAsDefault = True) self.lineSnapCheckBox = \ PM_CheckBox(self._rubberbandLineGroupBox , text = 'Enable line snap' , widgetColumn = 1, state = Qt.Checked ) def _connect_showCursorTextCheckBox(self): """ Connect the show cursor text checkbox with user prefs_key. Overrides DnaOrCnt_PropertyManager._connect_showCursorTextCheckBox """ connect_checkbox_with_boolean_pref( self.showCursorTextCheckBox , insertNanotubeEditCommand_showCursorTextCheckBox_prefs_key ) def _params_for_creating_cursorTextCheckBoxes(self): """ Returns params needed to create various cursor text checkboxes connected to prefs_keys that allow custom cursor texts. @return: A list containing tuples in the following format: ('checkBoxTextString' , preference_key). PM_PrefsCheckBoxes uses this data to create checkboxes with the the given names and connects them to the provided preference keys. (Note that PM_PrefsCheckBoxes puts thes within a GroupBox) @rtype: list @see: PM_PrefsCheckBoxes @see: self._loadDisplayOptionsGroupBox where this list is used. @see: Superclass method which is overridden here -- DnaOrCnt_PropertyManager._params_for_creating_cursorTextCheckBoxes() """ params = \ [ #Format: (" checkbox text", prefs_key) ("Nanotube length", insertNanotubeEditCommand_cursorTextCheckBox_length_prefs_key ), ("Angle", insertNanotubeEditCommand_cursorTextCheckBox_angle_prefs_key ) ] return params def _addToolTipText(self): """ Tool Tip text for widgets in the Insert Nanotube Property Manager. """ pass def _setEndPoints(self): """ Set the two endpoints of the nanotube using the values from the X, Y, Z coordinate spinboxes in the property manager. @note: The group box containing the 2 sets of XYZ spin boxes are currently hidden. """ # First endpoint (origin) of nanotube x1 = self.x1SpinBox.value() y1 = self.y1SpinBox.value() z1 = self.z1SpinBox.value() # Second endpoint (direction vector/axis) of nanotube. x2 = self.x2SpinBox.value() y2 = self.y2SpinBox.value() z2 = self.z2SpinBox.value() if not self.endPoint1: self.endPoint1 = V(x1, y1, z1) if not self.endPoint2: self.endPoint2 = V(x2, y2, z2) self.nanotube.setEndPoints(self.endPoint1, self.endPoint2) # Need arg "recompute=True", which will recompute the second # endpoint (endPoint2) using the nanotube rise. def getParameters(self): """ Return the parameters from this property manager to be used to create the nanotube. @return: A nanotube instance with its attrs set to the current parameters in the property manager. @rtype: L{Nanotube} @see: L{InsertNanotube_EditCommand._gatherParameters} where this is used """ self._setEndPoints() return (self.nanotube) def _ntTypeComboBoxChanged( self, type ): """ Slot for the Type combobox. It is called whenever the Type choice is changed. @param inIndex: The new index. @type inIndex: int """ self.nanotube.setType(str(type)) print "Bond Length =", self.nanotube.getBondLength() self.bondLengthDoubleSpinBox.setValue(self.nanotube.getBondLength()) #self.bondLengthDoubleSpinBox.setValue(ntBondLengths[inIndex]) def _bondLengthChanged(self, bondLength): """ Slot for the B{Bond Length} spinbox. """ self.nanotube.setBondLength(bondLength) self.updateNanotubeDiameter() return def _chiralityFixup(self, spinBoxValueJunk = None): """ Slot for several validators for different parameters. This gets called whenever the user changes the n, m chirality values. @param spinBoxValueJunk: This is the Spinbox value from the valueChanged signal. It is not used. We just want to know that the spinbox value has changed. @type spinBoxValueJunk: double or None """ _n, _m = self.nanotube.setChirality(self.chiralityNSpinBox.value(), self.chiralityMSpinBox.value()) #self.n, self.m = self.nanotube.getChirality() self.connect_or_disconnect_signals(isConnect = False) self.chiralityNSpinBox.setValue(_n) self.chiralityMSpinBox.setValue(_m) self.connect_or_disconnect_signals(isConnect = True) self.updateNanotubeDiameter() def updateNanotubeDiameter(self): """ Update the nanotube Diameter lineEdit widget. """ diameterText = "%-7.4f Angstroms" % (self.nanotube.getDiameter()) self.ntDiameterLineEdit.setText(diameterText) # ntRiseDoubleSpinBox is currently hidden. self.ntRiseDoubleSpinBox.setValue(self.nanotube.getRise()) def _endingsComboBoxChanged(self, endings): """ Slot for the B{Ending} combobox. @param endings: The option's text. @type endings: string """ self.nanotube.setEndings(str(endings)) return def _addWhatsThisText(self): """ What's This text for widgets in this Property Manager. """ whatsThis_InsertNanotube_PropertyManager(self) return
class DnaStrand_PropertyManager(DnaOrCnt_PropertyManager): """ The DnaStrand_PropertyManager class provides a Property Manager for the DnaStrand_EditCommand. @ivar title: The title that appears in the property manager header. @type title: str @ivar pmName: The name of this property manager. This is used to set the name of the PM_Dialog object via setObjectName(). @type name: str @ivar iconPath: The relative path to the PNG file that contains a 22 x 22 icon image that appears in the PM header. @type iconPath: str """ title = "DnaStrand Properties" pmName = title iconPath = "ui/actions/Properties Manager/Strand.png" def __init__(self, win, editCommand): """ Constructor for the Build DNA property manager. """ #For model changed signal self.previousSelectionParams = None #see self.connect_or_disconnect_signals for comment about this flag self.isAlreadyConnected = False self.isAlreadyDisconnected = False self.sequenceEditor = None self._numberOfBases = 0 self._conformation = 'B-DNA' self.duplexRise = 3.18 self.basesPerTurn = 10 self.dnaModel = 'PAM3' _superclass.__init__(self, win, editCommand) self.showTopRowButtons( PM_DONE_BUTTON | \ PM_WHATS_THIS_BUTTON) self._loadSequenceEditor() msg = "Use resize handles to resize the strand. Use sequence editor"\ "to assign a new sequence or the current one to a file." self.updateMessage(msg) def _addGroupBoxes(self): """ Add the DNA Property Manager group boxes. """ self._pmGroupBox1 = PM_GroupBox(self, title="Parameters") self._loadGroupBox1(self._pmGroupBox1) self._displayOptionsGroupBox = PM_GroupBox(self, title="Display Options") self._loadDisplayOptionsGroupBox(self._displayOptionsGroupBox) def _loadGroupBox1(self, pmGroupBox): """ Load widgets in group box 4. """ self.nameLineEdit = PM_LineEdit(pmGroupBox, label="Strand name:", text="", setAsDefault=False) self.numberOfBasesSpinBox = \ PM_SpinBox( pmGroupBox, label = "Number of bases:", value = self._numberOfBases, setAsDefault = False, minimum = 2, maximum = 10000 ) self.basesPerTurnDoubleSpinBox = \ PM_DoubleSpinBox( pmGroupBox, label = "Bases per turn:", value = self.basesPerTurn, setAsDefault = True, minimum = 8.0, maximum = 20.0, decimals = 2, singleStep = 0.1 ) self.duplexRiseDoubleSpinBox = \ PM_DoubleSpinBox( pmGroupBox, label = "Rise:", value = self.duplexRise, setAsDefault = True, minimum = 2.0, maximum = 4.0, decimals = 3, singleStep = 0.01 ) self.disableStructHighlightingCheckbox = \ PM_CheckBox( pmGroupBox, text = "Don't highlight while editing DNA", widgetColumn = 0, state = Qt.Unchecked, setAsDefault = True, spanWidth = True ) #As of 2008-03-31, the properties such as number of bases will be #editable only by using the resize handles. post FNANO we will support #the self.numberOfBasesSpinBox.setEnabled(False) self.basesPerTurnDoubleSpinBox.setEnabled(False) self.duplexRiseDoubleSpinBox.setEnabled(False) def _loadSequenceEditor(self): """ Temporary code that shows the Sequence editor ..a doc widget docked at the bottom of the mainwindow. The implementation is going to change before 'rattleSnake' product release. As of 2007-11-20: This feature (sequence editor) is waiting for the ongoing dna model work to complete. """ self.sequenceEditor = self.win.createDnaSequenceEditorIfNeeded() self.sequenceEditor.hide() def _loadDisplayOptionsGroupBox(self, pmGroupBox): """ Overrides superclass method. Also loads the color chooser widget. """ self._loadColorChooser(pmGroupBox) _superclass._loadDisplayOptionsGroupBox(self, pmGroupBox) def _connect_showCursorTextCheckBox(self): """ Connect the show cursor text checkbox with user prefs_key. Overrides DnaOrCnt_PropertyManager._connect_showCursorTextCheckBox """ connect_checkbox_with_boolean_pref( self.showCursorTextCheckBox, dnaStrandEditCommand_showCursorTextCheckBox_prefs_key) def _params_for_creating_cursorTextCheckBoxes(self): """ Returns params needed to create various cursor text checkboxes connected to prefs_keys that allow custom cursor texts. @return: A list containing tuples in the following format: ('checkBoxTextString' , preference_key). PM_PrefsCheckBoxes uses this data to create checkboxes with the the given names and connects them to the provided preference keys. (Note that PM_PrefsCheckBoxes puts thes within a GroupBox) @rtype: list @see: PM_PrefsCheckBoxes @see: self._loadDisplayOptionsGroupBox where this list is used. @see: Superclass method which is overridden here -- DnaOrCnt_PropertyManager._params_for_creating_cursorTextCheckBoxes() """ params = \ [ #Format: (" checkbox text", prefs_key) ("Number of bases", dnaStrandEditCommand_cursorTextCheckBox_numberOfBases_prefs_key), ("Number of bases to be changed", dnaStrandEditCommand_cursorTextCheckBox_changedBases_prefs_key) ] return params def getParameters(self): numberOfBases = self.numberOfBasesSpinBox.value() dnaForm = self._conformation dnaModel = self.dnaModel basesPerTurn = self.basesPerTurn duplexRise = self.duplexRise color = self._colorChooser.getColor() return (numberOfBases, dnaForm, dnaModel, basesPerTurn, duplexRise, color) def setParameters(self, params): """ This is usually called when you are editing an existing structure. Some property manager ui elements then display the information obtained from the object being edited. TODO: - Make this a EditCommand_PM API method? - See also the routines GraphicsMode.setParams or object.setProps ..better to name them all in one style? """ #Set the duplex rise and bases per turn spinbox values. numberOfBases, \ dnaForm, \ dnaModel, \ basesPerTurn, \ duplexRise, \ color = params if numberOfBases is not None: self.numberOfBasesSpinBox.setValue(numberOfBases) if dnaForm is not None: self._conformation = dnaForm if dnaModel is not None: self.dnaModel = dnaModel if duplexRise is not None: self.duplexRiseDoubleSpinBox.setValue(duplexRise) if basesPerTurn is not None: self.basesPerTurnDoubleSpinBox.setValue(basesPerTurn) if color is not None: self._colorChooser.setColor(color) def connect_or_disconnect_signals(self, isConnect): """ Connect or disconnect widget signals sent to their slot methods. This can be overridden in subclasses. By default it does nothing. @param isConnect: If True the widget will send the signals to the slot method. @type isConnect: boolean """ #TODO: This is a temporary fix for a bug. When you invoke a temporary # mode Entering such a temporary mode keeps the signals of #PM from the previous mode connected ( #but while exiting that temporary mode and reentering the #previous mode, it atucally reconnects the signal! This gives rise to #lots of bugs. This needs more general fix in Temporary mode API. # -- Ninad 2008-01-09 (similar comment exists in MovePropertyManager.py if isConnect and self.isAlreadyConnected: if debug_flags.atom_debug: print_compact_stack("warning: attempt to connect widgets"\ "in this PM that are already connected." ) return if not isConnect and self.isAlreadyDisconnected: if debug_flags.atom_debug: print_compact_stack("warning: attempt to disconnect widgets"\ "in this PM that are already disconnected.") return self.isAlreadyConnected = isConnect self.isAlreadyDisconnected = not isConnect if isConnect: change_connect = self.win.connect else: change_connect = self.win.disconnect if self.sequenceEditor: self.sequenceEditor.connect_or_disconnect_signals(isConnect) _superclass.connect_or_disconnect_signals(self, isConnect) change_connect(self.disableStructHighlightingCheckbox, SIGNAL('stateChanged(int)'), self.change_struct_highlightPolicy) change_connect(self.showCursorTextCheckBox, SIGNAL('stateChanged(int)'), self._update_state_of_cursorTextGroupBox) def model_changed(self): """ @see: DnaStrand_EditCommand.model_changed() @see: DnaStrand_EditCommand.hasResizableStructure() """ isStructResizable, why_not = self.editCommand.hasResizableStructure() if not isStructResizable: #disable all widgets if self._pmGroupBox1.isEnabled(): self._pmGroupBox1.setEnabled(False) msg1 = ("Viewing properties of %s <br>") % ( self.editCommand.struct.name) msg2 = redmsg("DnaStrand is not resizable. Reason: %s" % (why_not)) self.updateMessage(msg1 + msg2) else: if not self._pmGroupBox1.isEnabled(): self._pmGroupBox1.setEnabled(True) msg1 = ("Viewing properties of %s <br>") % ( self.editCommand.struct.name) msg2 = "Use resize handles to resize the strand. Use sequence editor"\ "to assign a new sequence or the current one to a file." self.updateMessage(msg1 + msg2) def show(self): """ Show this PM As of 2007-11-20, it also shows the Sequence Editor widget and hides the history widget. This implementation may change in the near future This method also retrives the name information from the editCommand's structure for its name line edit field. @see: DnaStrand_EditCommand.getStructureName() @see: self.close() """ _superclass.show(self) self._showSequenceEditor() if self.editCommand is not None: name = self.editCommand.getStructureName() if name is not None: self.nameLineEdit.setText(name) def close(self): """ Close this property manager. Also sets the name of the self.editCommand's structure to the one displayed in the line edit field. @see self.show() @see: DnaSegment_EditCommand.setStructureName """ if self.editCommand is not None: name = str(self.nameLineEdit.text()) self.editCommand.setStructureName(name) if self.sequenceEditor: self.sequenceEditor.close() _superclass.close(self) def _showSequenceEditor(self): if self.sequenceEditor: if not self.sequenceEditor.isVisible(): #Show the sequence editor #ATTENTION: the sequence editor also closes (temporarily) the #reports dockwidget (if visible) Its state is later restored when #the sequuence Editor is closed. self.sequenceEditor.show() self.updateSequence() def updateSequence(self): """ Update the sequence string in the sequence editor @see: DnaSequenceEditor.setSequence() @see DnaSequenceEditor._determine_complementSequence() @see: DnaSequenceEditor.setComplementSequence() @see: DnaStrand.getStrandSequenceAndItsComplement() """ #Read in the strand sequence of the selected strand and #show it in the text edit in the sequence editor. ##strand = self.strandListWidget.getPickedItem() if not self.editCommand.hasValidStructure(): return strand = self.editCommand.struct titleString = 'Sequence Editor for ' + strand.name self.sequenceEditor.setWindowTitle(titleString) sequenceString, complementSequenceString = strand.getStrandSequenceAndItsComplement( ) if sequenceString: sequenceString = QString(sequenceString) sequenceString = sequenceString.toUpper() #Set the initial sequence (read in from the file) self.sequenceEditor.setSequence(sequenceString) #Set the initial complement sequence for DnaSequence editor. #do this independently because 'complementSequenceString' may have #some characters (such as * ) that denote a missing base on the #complementary strand. this information is used by the sequence #editor. See DnaSequenceEditor._determine_complementSequence() #for more details. See also bug 2787 self.sequenceEditor.setComplementSequence(complementSequenceString) def change_struct_highlightPolicy(self, checkedState=False): """ Change the 'highlight policy' of the structure being edited (i.e. self.editCommand.struct) . @param checkedState: The checked state of the checkbox that says 'Don't highlight while editing DNA'. So, it its True, the structure being edited won't get highlighted. @see: DnaStrand.setHighlightPolicy for more comments """ if self.editCommand and self.editCommand.hasValidStructure(): highlight = not checkedState self.editCommand.struct.setHighlightPolicy(highlight=highlight) def _addWhatsThisText(self): """ Add what's this text. Abstract method. """ pass
class DnaDuplexPropertyManager( DnaOrCnt_PropertyManager ): """ The DnaDuplexPropertyManager class provides a Property Manager for the B{Build > DNA > Duplex} command. @ivar title: The title that appears in the property manager header. @type title: str @ivar pmName: The name of this property manager. This is used to set the name of the PM_Dialog object via setObjectName(). @type name: str @ivar iconPath: The relative path to the PNG file that contains a 22 x 22 icon image that appears in the PM header. @type iconPath: str """ title = "Insert DNA" pmName = title iconPath = "ui/actions/Tools/Build Structures/InsertDsDna.png" def __init__( self, win, editCommand ): """ Constructor for the DNA Duplex property manager. """ self.endPoint1 = None self.endPoint2 = None self._conformation = "B-DNA" self._numberOfBases = 0 self._basesPerTurn = getDuplexBasesPerTurn(self._conformation) self._duplexRise = getDuplexRise(self._conformation) self._duplexLength = getDuplexLength(self._conformation, self._numberOfBases) _superclass.__init__( self, win, editCommand) self.showTopRowButtons( PM_DONE_BUTTON | \ PM_CANCEL_BUTTON | \ PM_WHATS_THIS_BUTTON) def connect_or_disconnect_signals(self, isConnect): """ Connect or disconnect widget signals sent to their slot methods. This can be overridden in subclasses. By default it does nothing. @param isConnect: If True the widget will send the signals to the slot method. @type isConnect: boolean """ if isConnect: change_connect = self.win.connect else: change_connect = self.win.disconnect change_connect(self._placementOptions.buttonGroup, SIGNAL("buttonClicked(int)"), self.activateSpecifyReferencePlaneTool) change_connect( self.conformationComboBox, SIGNAL("currentIndexChanged(int)"), self.conformationComboBoxChanged ) change_connect( self.numberOfBasePairsSpinBox, SIGNAL("valueChanged(int)"), self.numberOfBasesChanged ) change_connect( self.basesPerTurnDoubleSpinBox, SIGNAL("valueChanged(double)"), self.basesPerTurnChanged ) change_connect( self.duplexRiseDoubleSpinBox, SIGNAL("valueChanged(double)"), self.duplexRiseChanged ) change_connect(self.showCursorTextCheckBox, SIGNAL('stateChanged(int)'), self._update_state_of_cursorTextGroupBox) self.duplexRiseDoubleSpinBox.connectWithState( Preferences_StateRef_double( bdnaRise_prefs_key, env.prefs[bdnaRise_prefs_key] ) ) self.basesPerTurnDoubleSpinBox.connectWithState( Preferences_StateRef_double( bdnaBasesPerTurn_prefs_key, env.prefs[bdnaBasesPerTurn_prefs_key] ) ) def ok_btn_clicked(self): """ Slot for the OK button """ if self.editCommand: self.editCommand.preview_or_finalize_structure(previewing = False) ##env.history.message(self.editCommand.logMessage) self.win.toolsDone() def cancel_btn_clicked(self): """ Slot for the Cancel button. """ if self.editCommand: self.editCommand.cancelStructure() self.win.toolsCancel() def _update_widgets_in_PM_before_show(self): """ Update various widgets in this Property manager. Overrides superclass method @see: MotorPropertyManager._update_widgets_in_PM_before_show @see: self.show where it is called. """ pass def getFlyoutActionList(self): """ returns custom actionlist that will be used in a specific mode or editing a feature etc Example: while in movie mode, the _createFlyoutToolBar method calls this """ #'allActionsList' returns all actions in the flyout toolbar #including the subcontrolArea actions allActionsList = [] #Action List for subcontrol Area buttons. #In this mode there is really no subcontrol area. #We will treat subcontrol area same as 'command area' #(subcontrol area buttons will have an empty list as their command area #list). We will set the Comamnd Area palette background color to the #subcontrol area. subControlAreaActionList =[] self.exitEditCommandAction.setChecked(True) subControlAreaActionList.append(self.exitEditCommandAction) separator = QAction(self.w) separator.setSeparator(True) subControlAreaActionList.append(separator) allActionsList.extend(subControlAreaActionList) #Empty actionlist for the 'Command Area' commandActionLists = [] #Append empty 'lists' in 'commandActionLists equal to the #number of actions in subControlArea for i in range(len(subControlAreaActionList)): lst = [] commandActionLists.append(lst) params = (subControlAreaActionList, commandActionLists, allActionsList) return params def _addGroupBoxes( self ): """ Add the DNA Property Manager group boxes. """ self._pmReferencePlaneGroupBox = PM_GroupBox( self, title = "Placement Options" ) self._loadReferencePlaneGroupBox( self._pmReferencePlaneGroupBox ) self._pmGroupBox1 = PM_GroupBox( self, title = "Endpoints" ) self._loadGroupBox1( self._pmGroupBox1 ) self._pmGroupBox1.hide() self._pmGroupBox2 = PM_GroupBox( self, title = "Parameters" ) self._loadGroupBox2( self._pmGroupBox2 ) self._displayOptionsGroupBox = PM_GroupBox( self, title = "Display Options" ) self._loadDisplayOptionsGroupBox( self._displayOptionsGroupBox ) def _loadGroupBox1(self, pmGroupBox): """ Load widgets in group box 3. """ #Folllowing toolbutton facilitates entering a temporary DnaLineMode #to create a DNA using endpoints of the specified line. self.specifyDnaLineButton = PM_ToolButton( pmGroupBox, text = "Specify Endpoints", iconPath = "ui/actions/Properties Manager/Pencil.png", spanWidth = True ) self.specifyDnaLineButton.setCheckable(True) self.specifyDnaLineButton.setAutoRaise(True) self.specifyDnaLineButton.setToolButtonStyle( Qt.ToolButtonTextBesideIcon) #EndPoint1 and endPoint2 coordinates. These widgets are hidden # as of 2007- 12 - 05 self._endPoint1SpinBoxes = PM_CoordinateSpinBoxes(pmGroupBox, label = "End Point 1") self.x1SpinBox = self._endPoint1SpinBoxes.xSpinBox self.y1SpinBox = self._endPoint1SpinBoxes.ySpinBox self.z1SpinBox = self._endPoint1SpinBoxes.zSpinBox self._endPoint2SpinBoxes = PM_CoordinateSpinBoxes(pmGroupBox, label = "End Point 2") self.x2SpinBox = self._endPoint2SpinBoxes.xSpinBox self.y2SpinBox = self._endPoint2SpinBoxes.ySpinBox self.z2SpinBox = self._endPoint2SpinBoxes.zSpinBox self._endPoint1SpinBoxes.hide() self._endPoint2SpinBoxes.hide() def _loadGroupBox2(self, pmGroupBox): """ Load widgets in group box 4. """ self.conformationComboBox = \ PM_ComboBox( pmGroupBox, label = "Conformation:", choices = ["B-DNA"], setAsDefault = True) dnaModelChoices = ['PAM3', 'PAM5'] self.dnaModelComboBox = \ PM_ComboBox( pmGroupBox, label = "Model:", choices = dnaModelChoices, setAsDefault = True) self.basesPerTurnDoubleSpinBox = \ PM_DoubleSpinBox( pmGroupBox, label = "Bases per turn:", value = env.prefs[bdnaBasesPerTurn_prefs_key], setAsDefault = True, minimum = 8.0, maximum = 20.0, decimals = 2, singleStep = 0.1 ) self.duplexRiseDoubleSpinBox = \ PM_DoubleSpinBox( pmGroupBox, label = "Rise:", value = env.prefs[bdnaRise_prefs_key], setAsDefault = True, minimum = 2.0, maximum = 4.0, decimals = 3, singleStep = 0.01 ) # Strand Length (i.e. the number of bases) self.numberOfBasePairsSpinBox = \ PM_SpinBox( pmGroupBox, label = "Base pairs:", value = self._numberOfBases, setAsDefault = False, minimum = 0, maximum = 10000 ) self.numberOfBasePairsSpinBox.setDisabled(True) # Duplex Length self.duplexLengthLineEdit = \ PM_LineEdit( pmGroupBox, label = "Duplex length: ", text = "0.0 Angstroms", setAsDefault = False) self.duplexLengthLineEdit.setDisabled(True) def _loadDisplayOptionsGroupBox(self, pmGroupBox): """ Load widgets in the Display Options GroupBox @see: DnaOrCnt_PropertyManager. _loadDisplayOptionsGroupBox """ #Call the superclass method that loads the cursor text checkboxes. #Note, as of 2008-05-19, the superclass, DnaOrCnt_PropertyManager #only loads the cursor text groupboxes. Subclasses like this can #call custom methods like self._loadCursorTextCheckBoxes etc if they #don't need all groupboxes that the superclass loads. _superclass._loadDisplayOptionsGroupBox(self, pmGroupBox) self._rubberbandLineGroupBox = PM_GroupBox( pmGroupBox, title = 'Rubber band line:') dnaLineChoices = ['Ribbons', 'Ladder'] self.dnaRubberBandLineDisplayComboBox = \ PM_ComboBox( self._rubberbandLineGroupBox , label = " Display as:", choices = dnaLineChoices, setAsDefault = True) self.lineSnapCheckBox = \ PM_CheckBox(self._rubberbandLineGroupBox , text = 'Enable line snap' , widgetColumn = 1, state = Qt.Checked ) def _connect_showCursorTextCheckBox(self): """ Connect the show cursor text checkbox with user prefs_key. Overrides DnaOrCnt_PropertyManager._connect_showCursorTextCheckBox """ connect_checkbox_with_boolean_pref( self.showCursorTextCheckBox , dnaDuplexEditCommand_showCursorTextCheckBox_prefs_key) def _params_for_creating_cursorTextCheckBoxes(self): """ Returns params needed to create various cursor text checkboxes connected to prefs_keys that allow custom cursor texts. @return: A list containing tuples in the following format: ('checkBoxTextString' , preference_key). PM_PrefsCheckBoxes uses this data to create checkboxes with the the given names and connects them to the provided preference keys. (Note that PM_PrefsCheckBoxes puts thes within a GroupBox) @rtype: list @see: PM_PrefsCheckBoxes @see: self._loadDisplayOptionsGroupBox where this list is used. @see: Superclass method which is overridden here -- DnaOrCnt_PropertyManager._params_for_creating_cursorTextCheckBoxes() """ params = \ [ #Format: (" checkbox text", prefs_key) ("Number of base pairs", dnaDuplexEditCommand_cursorTextCheckBox_numberOfBasePairs_prefs_key), ("Number of turns", dnaDuplexEditCommand_cursorTextCheckBox_numberOfTurns_prefs_key), ("Duplex length", dnaDuplexEditCommand_cursorTextCheckBox_length_prefs_key), ("Angle", dnaDuplexEditCommand_cursorTextCheckBox_angle_prefs_key) ] return params def _addToolTipText(self): """ Tool Tip text for widgets in the DNA Property Manager. """ pass def conformationComboBoxChanged( self, inIndex ): """ Slot for the Conformation combobox. It is called whenever the Conformation choice is changed. @param inIndex: The new index. @type inIndex: int """ conformation = self.conformationComboBox.currentText() if conformation == "B-DNA": self.basesPerTurnDoubleSpinBox.setValue("10.0") elif conformation == "Z-DNA": self.basesPerTurnDoubleSpinBox.setValue("12.0") else: msg = redmsg("conformationComboBoxChanged(): \ Error - unknown DNA conformation. Index = "+ inIndex) env.history.message(msg) self.duplexLengthSpinBox.setSingleStep(getDuplexRise(conformation)) def numberOfBasesChanged( self, numberOfBases ): """ Slot for the B{Number of Bases} spinbox. """ # Update the Duplex Length lineEdit widget. text = str(getDuplexLength(self._conformation, numberOfBases, self._duplexRise)) \ + " Angstroms" self.duplexLengthLineEdit.setText(text) return def basesPerTurnChanged( self, basesPerTurn ): """ Slot for the B{Bases per turn} spinbox. """ self.editCommand.basesPerTurn = basesPerTurn self._basesPerTurn = basesPerTurn return def duplexRiseChanged( self, rise ): """ Slot for the B{Rise} spinbox. """ self.editCommand.duplexRise = rise self._duplexRise = rise return def getParameters(self): """ Return the parameters from this property manager to be used to create the DNA duplex. @return: A tuple containing the parameters @rtype: tuple @see: L{DnaDuplex_EditCommand._gatherParameters} where this is used """ numberOfBases = self.numberOfBasePairsSpinBox.value() dnaForm = str(self.conformationComboBox.currentText()) basesPerTurn = self.basesPerTurnDoubleSpinBox.value() duplexRise = self.duplexRiseDoubleSpinBox.value() dnaModel = str(self.dnaModelComboBox.currentText()) # First endpoint (origin) of DNA duplex x1 = self.x1SpinBox.value() y1 = self.y1SpinBox.value() z1 = self.z1SpinBox.value() # Second endpoint (direction vector/axis) of DNA duplex. x2 = self.x2SpinBox.value() y2 = self.y2SpinBox.value() z2 = self.z2SpinBox.value() if not self.endPoint1: self.endPoint1 = V(x1, y1, z1) if not self.endPoint2: self.endPoint2 = V(x2, y2, z2) return (numberOfBases, dnaForm, dnaModel, basesPerTurn, duplexRise, self.endPoint1, self.endPoint2) def _addWhatsThisText(self): """ What's This text for widgets in this Property Manager. """ whatsThis_DnaDuplexPropertyManager(self)
class FixedBBProteinSim_PropertyManager(Command_PropertyManager): """ The FixedBBProteinSim_PropertyManager class provides a Property Manager for the B{Fixed backbone Protein Sequence Design} command on the flyout toolbar in the Build > Protein > Simulate mode. @ivar title: The title that appears in the property manager header. @type title: str @ivar pmName: The name of this property manager. This is used to set the name of the PM_Dialog object via setObjectName(). @type name: str @ivar iconPath: The relative path to the PNG file that contains a 22 x 22 icon image that appears in the PM header. @type iconPath: str """ title = "Fixed Backbone Design" pmName = title iconPath = "ui/actions/Command Toolbar/BuildProtein/FixedBackbone.png" def __init__(self, command): """ Constructor for the property manager. """ _superclass.__init__(self, command) self.showTopRowButtons( PM_DONE_BUTTON | \ PM_WHATS_THIS_BUTTON) msg = "Choose from the various options below to design "\ "an optimized <b>fixed backbone protein sequence</b> with Rosetta." self.updateMessage(msg) return def connect_or_disconnect_signals(self, isConnect=True): """ Connect or disconnect widget signals sent to their slot methods. This can be overridden in subclasses. By default it does nothing. @param isConnect: If True the widget will send the signals to the slot method. @type isConnect: boolean """ if isConnect: change_connect = self.win.connect else: change_connect = self.win.disconnect change_connect(self.ex1Checkbox, SIGNAL("stateChanged(int)"), self.update_ex1) change_connect(self.ex1aroCheckbox, SIGNAL("stateChanged(int)"), self.update_ex1aro) change_connect(self.ex2Checkbox, SIGNAL("stateChanged(int)"), self.update_ex2) change_connect(self.ex2aroOnlyCheckbox, SIGNAL("stateChanged(int)"), self.update_ex2aro_only) change_connect(self.ex3Checkbox, SIGNAL("stateChanged(int)"), self.update_ex3) change_connect(self.ex4Checkbox, SIGNAL("stateChanged(int)"), self.update_ex4) change_connect(self.rotOptCheckbox, SIGNAL("stateChanged(int)"), self.update_rot_opt) change_connect(self.tryBothHisTautomersCheckbox, SIGNAL("stateChanged(int)"), self.update_try_both_his_tautomers) change_connect(self.softRepDesignCheckbox, SIGNAL("stateChanged(int)"), self.update_soft_rep_design) change_connect(self.useElecRepCheckbox, SIGNAL("stateChanged(int)"), self.update_use_elec_rep) change_connect(self.norepackDisulfCheckbox, SIGNAL("stateChanged(int)"), self.update_norepack_disulf) #signal slot connections for the push buttons change_connect(self.okButton, SIGNAL("clicked()"), self.runRosettaFixedBBSim) return #Protein Display methods def show(self): """ Shows the Property Manager. """ #@REVIEW: Why does it create sequence editor here? Also, is it #required to be done before the superclass.show call? Similar code #found in CompareProteins_PM and some other files --Ninad 2008-10-02 self.sequenceEditor = self.win.createProteinSequenceEditorIfNeeded() self.sequenceEditor.hide() _superclass.show(self) return def _addGroupBoxes(self): """ Add the Property Manager group boxes. """ self._pmGroupBox1 = PM_GroupBox( self, title="Rosetta Fixed backbone sequence design") self._loadGroupBox1(self._pmGroupBox1) return def _loadGroupBox1(self, pmGroupBox): """ Load widgets in group box. """ self.numSimSpinBox = PM_SpinBox(pmGroupBox, labelColumn=0, label="Number of simulations:", minimum=1, maximum=999, setAsDefault=False, spanWidth=False) self.ex1Checkbox = PM_CheckBox( pmGroupBox, text="Expand rotamer library for chi1 angle", state=Qt.Unchecked, setAsDefault=False, widgetColumn=0, spanWidth=True) self.ex1aroCheckbox = PM_CheckBox( pmGroupBox, text="Use large chi1 library for aromatic residues", state=Qt.Unchecked, setAsDefault=False, widgetColumn=0, spanWidth=True) self.ex2Checkbox = PM_CheckBox( pmGroupBox, text="Expand rotamer library for chi2 angle", state=Qt.Unchecked, setAsDefault=False, widgetColumn=0, spanWidth=True) self.ex2aroOnlyCheckbox = PM_CheckBox( pmGroupBox, text="Use large chi2 library only for aromatic residues", state=Qt.Unchecked, setAsDefault=False, widgetColumn=0, spanWidth=True) self.ex3Checkbox = PM_CheckBox( pmGroupBox, text="Expand rotamer library for chi3 angle", state=Qt.Unchecked, setAsDefault=False, widgetColumn=0, spanWidth=True) self.ex4Checkbox = PM_CheckBox( pmGroupBox, text="Expand rotamer library for chi4 angle", state=Qt.Unchecked, setAsDefault=False, widgetColumn=0, spanWidth=True) self.rotOptCheckbox = PM_CheckBox(pmGroupBox, text="Optimize one-body energy", state=Qt.Unchecked, setAsDefault=False, widgetColumn=0, spanWidth=True) self.tryBothHisTautomersCheckbox = PM_CheckBox( pmGroupBox, text="Try both histidine tautomers", state=Qt.Unchecked, setAsDefault=False, widgetColumn=0, spanWidth=True) self.softRepDesignCheckbox = PM_CheckBox( pmGroupBox, text="Use softer Lennard-Jones repulsive term", state=Qt.Unchecked, setAsDefault=False, widgetColumn=0, spanWidth=True) self.useElecRepCheckbox = PM_CheckBox( pmGroupBox, text="Use electrostatic repulsion", state=Qt.Unchecked, setAsDefault=False, widgetColumn=0, spanWidth=True) self.norepackDisulfCheckbox = PM_CheckBox( pmGroupBox, text="Don't re-pack disulphide bonds", state=Qt.Unchecked, setAsDefault=False, widgetColumn=0, spanWidth=True) self.otherCommandLineOptions = PM_TextEdit( pmGroupBox, label="Command line options:", spanWidth=True) self.otherCommandLineOptions.setFixedHeight(80) self.okButton = PM_PushButton(pmGroupBox, text="Launch Rosetta", setAsDefault=True, spanWidth=True) return def _addWhatsThisText(self): """ What's This text for widgets in this Property Manager. """ pass def _addToolTipText(self): """ Tool Tip text for widgets in this Property Manager. """ pass def update_ex1(self, state): """ Update the command text edit depending on the state of the update_ex1 checkbox @param state:state of the update_ex1 checkbox @type state: int """ otherOptionsText = str(self.otherCommandLineOptions.toPlainText()) if self.ex1Checkbox.isChecked() == True: otherOptionsText = otherOptionsText + ' -ex1 ' else: otherOptionsText = otherOptionsText.replace(' -ex1 ', '') self.otherCommandLineOptions.setText(otherOptionsText) return def update_ex1aro(self, state): """ Update the command text edit depending on the state of the update_ex1aro checkbox @param state:state of the update_ex1aro checkbox @type state: int """ otherOptionsText = str(self.otherCommandLineOptions.toPlainText()) if self.ex1aroCheckbox.isChecked() == True: otherOptionsText = otherOptionsText + ' -ex1aro ' else: otherOptionsText = otherOptionsText.replace(' -ex1aro ', '') self.otherCommandLineOptions.setText(otherOptionsText) return def update_ex2(self, state): """ Update the command text edit depending on the state of the update_ex2 checkbox @param state:state of the update_ex2 checkbox @type state: int """ otherOptionsText = str(self.otherCommandLineOptions.toPlainText()) if self.ex2Checkbox.isChecked() == True: otherOptionsText = otherOptionsText + ' -ex2 ' else: otherOptionsText = otherOptionsText.replace(' -ex2 ', '') self.otherCommandLineOptions.setText(otherOptionsText) return def update_ex2aro_only(self, state): """ Update the command text edit depending on the state of the update_ex2aro_only checkbox @param state:state of the update_ex2aro_only checkbox @type state: int """ otherOptionsText = str(self.otherCommandLineOptions.toPlainText()) if self.ex2aroOnlyCheckbox.isChecked() == True: otherOptionsText = otherOptionsText + ' -ex2aro_only ' else: otherOptionsText = otherOptionsText.replace(' -ex2aro_only ', '') self.otherCommandLineOptions.setText(otherOptionsText) return def update_ex3(self, state): """ Update the command text edit depending on the state of the update_ex3 checkbox @param state:state of the update_ex3 checkbox @type state: int """ otherOptionsText = str(self.otherCommandLineOptions.toPlainText()) if self.ex3Checkbox.isChecked() == True: otherOptionsText = otherOptionsText + ' -ex3 ' else: otherOptionsText = otherOptionsText.replace(' -ex3 ', '') self.otherCommandLineOptions.setText(otherOptionsText) return def update_ex4(self, state): """ Update the command text edit depending on the state of the update_ex4 checkbox @param state:state of the update_ex4 checkbox @type state: int """ otherOptionsText = str(self.otherCommandLineOptions.toPlainText()) if self.ex4Checkbox.isChecked() == True: otherOptionsText = otherOptionsText + ' -ex4 ' else: otherOptionsText = otherOptionsText.replace(' -ex4 ', '') self.otherCommandLineOptions.setText(otherOptionsText) return def update_rot_opt(self, state): """ Update the command text edit depending on the state of the update_rot_opt checkbox @param state:state of the update_rot_opt checkbox @type state: int """ otherOptionsText = str(self.otherCommandLineOptions.toPlainText()) if self.rotOptCheckbox.isChecked() == True: otherOptionsText = otherOptionsText + ' -rot_opt ' else: otherOptionsText = otherOptionsText.replace(' -rot_opt ', '') self.otherCommandLineOptions.setText(otherOptionsText) return def update_try_both_his_tautomers(self, state): """ Update the command text edit depending on the state of the update_try_both_his_tautomers checkbox @param state:state of the update_try_both_his_tautomers checkbox @type state: int """ otherOptionsText = str(self.otherCommandLineOptions.toPlainText()) if self.tryBothHisTautomersCheckbox.isChecked() == True: otherOptionsText = otherOptionsText + ' -try_both_his_tautomers ' else: otherOptionsText = otherOptionsText.replace( ' -try_both_his_tautomers ', '') self.otherCommandLineOptions.setText(otherOptionsText) return def update_soft_rep_design(self, state): """ Update the command text edit depending on the state of the update_soft_rep_design checkbox @param state:state of the update_soft_rep_design checkbox @type state: int """ otherOptionsText = str(self.otherCommandLineOptions.toPlainText()) if self.softRepDesignCheckbox.isChecked() == True: otherOptionsText = otherOptionsText + ' -soft_rep_design ' else: otherOptionsText = otherOptionsText.replace( ' -soft_rep_design ', '') self.otherCommandLineOptions.setText(otherOptionsText) return def update_use_elec_rep(self, state): """ Update the command text edit depending on the state of the update_use_elec_rep checkbox @param state:state of the update_use_elec_rep checkbox @type state: int """ otherOptionsText = str(self.otherCommandLineOptions.toPlainText()) if self.useElecRepCheckbox.isChecked() == True: otherOptionsText = otherOptionsText + ' -use_electrostatic_repulsion ' else: otherOptionsText = otherOptionsText.replace( ' -use_electrostatic_repulsion ', '') self.otherCommandLineOptions.setText(otherOptionsText) return def update_norepack_disulf(self, state): """ Update the command text edit depending on the state of the update_no_repack checkbox @param state:state of the update_no_repack checkbox @type state: int """ otherOptionsText = str(self.otherCommandLineOptions.toPlainText()) if self.norepackDisulfCheckbox.isChecked() == True: otherOptionsText = otherOptionsText + ' -norepack_disulf ' else: otherOptionsText = otherOptionsText.replace( ' -norepack_disulf ', '') self.otherCommandLineOptions.setText(otherOptionsText) return def runRosettaFixedBBSim(self): """ Get all the parameters from the PM and run a rosetta simulation. """ proteinChunk = self.win.assy.getSelectedProteinChunk() if not proteinChunk: msg = "You must select a single protein to run a Rosetta <i>Fixed Backbone</i> simulation." self.updateMessage(msg) return otherOptionsText = str(self.otherCommandLineOptions.toPlainText()) numSim = self.numSimSpinBox.value() argList = [numSim, otherOptionsText, proteinChunk.name] from simulation.ROSETTA.rosetta_commandruns import rosettaSetup_CommandRun if argList[0] > 0: cmdrun = rosettaSetup_CommandRun( self.win, argList, "ROSETTA_FIXED_BACKBONE_SEQUENCE_DESIGN") cmdrun.run() return