def adddihedral(root, amber_prmtop, messages): """ Adds a dihedral (improper, multiterm, or normal) to the prmtop """ # We need 4 masks, phi_k, periodicity, phase, scee/scnb, dihedral type widget_list = [ ('MaskEntry', 'First (end) atom in dihedral'), ('MaskEntry', 'Second (middle) atom in dihedral'), ('MaskEntry', 'Third (middle) atom in dihedral'), ('MaskEntry', 'Fourth (end) atom in dihedral'), ('Entry', 'Phi Force constant (kcal/mol)'), ('Entry', 'Periodicity'), ('Entry', 'Phase (Degrees)'), ('Entry', 'EEL scaling factor'), ('Entry', 'VDW scaling factor'), ('Spinbox', 'Dihedral type', 'normal', 'multiterm', 'improper') ] # We need 10 variables var_list = [StringVar() for i in range(10)] description = ('Adds a dihedral in the topology file with the given Phi ' 'Force constant in kcal/mol the\ngiven phase in Degrees ' 'and the given periodicity. All masks must specify only \n' 'a single atom. The default Amber values for SCEE/SCNB are ' '1.2 and 2.0, respectively.\nSee the Amber manual for ' 'details about normal, multiterm, and improper dihedrals') # Create the window, open it, then wait for it to close cmd_window = _guiwidgets.ActionWindow('setDihedral', amber_prmtop, widget_list, var_list, description) cmd_window.wait_window() # See if we got any variables back vars_found = True in [bool(v.get()) for v in var_list] if not vars_found: return # If we did, pass them through var_list = [v.get() for v in var_list] # Fill scee/scnb in with default values if var_list[7] is None: var_list[7] = '1.2' if var_list[8] is None: var_list[8] = '2.0' # The last argument is a keyword, so append that, then swap the last 2 args var_list.insert(9, 'type') try: action = ParmedActions.adddihedral(amber_prmtop, ArgumentList(var_list)) messages.write('%s\n' % action) action.execute() except Exception, err: showerror('Unexpected Error!', '%s: %s' % (type(err).__name__, err)) return