def _create_find_control(self): control = QtGui.QWidget(self) self.line_edit = QtGui.QLineEdit() self.next_button = QtGui.QPushButton('&Next') self.next_button.setFixedWidth(self.button_size) self.prev_button = QtGui.QPushButton('&Prev') self.prev_button.setFixedWidth(self.button_size) self.options_button = QtGui.QPushButton('&Options') self.options_button.setFixedWidth(self.button_size) options_menu = QtGui.QMenu(self) self.case_action = QtGui.QAction('Match &case', options_menu) self.case_action.setCheckable(True) self.word_action = QtGui.QAction('Match words', options_menu) self.word_action.setCheckable(True) self.wrap_action = QtGui.QAction('Wrap search', options_menu) self.wrap_action.setCheckable(True) self.wrap_action.setChecked(True) options_menu.addAction(self.case_action) options_menu.addAction(self.word_action) options_menu.addAction(self.wrap_action) self.options_button.setMenu(options_menu) layout = QtGui.QHBoxLayout() layout.addWidget(self.line_edit) layout.addWidget(self.next_button) layout.addWidget(self.prev_button) layout.addWidget(self.options_button) layout.addStretch(2) layout.setContentsMargins(0, 0, 0, 0) control.setLayout(layout) return control
def _BuildMenu(self): bar = self.menuBar() # File menu file_menu = bar.addMenu('File') open_action = QtGui.QAction('Open', self, triggered=self._OpenMatFile) open_action.setShortcut('Ctrl+O') file_menu.addAction(open_action) # Visualization menuBar visualization_menu = bar.addMenu('Visualization') self.head_visual_action = QtGui.QAction( 'Head', self, triggered=self._ToggleHeadVisibility) self.head_visual_action.setCheckable(True) self.head_visual_action.setChecked(True) self.head_visual_action.setEnabled(False) visualization_menu.addAction(self.head_visual_action) self.cortex_visual_action = QtGui.QAction( 'Cortex', self, triggered=self._ToggleCortexVisibility) self.cortex_visual_action.setCheckable(True) self.cortex_visual_action.setChecked(True) self.cortex_visual_action.setEnabled(False) visualization_menu.addAction(self.cortex_visual_action) self.dipole_visual_action = QtGui.QAction( 'Dipole', self, triggered=self._ToggleDipoleVisibility) self.dipole_visual_action.setCheckable(True) self.dipole_visual_action.setChecked(True) self.dipole_visual_action.setEnabled(False) visualization_menu.addAction(self.dipole_visual_action)
def __init__(self, vtk_table, on_change_color_table=None, colors=None): """Initialize the gradient editor window. Parameters ---------- vtk_table: Instance of vtkLookupTable, designating the table which is to be edited. on_change_color_table: Callback function taking no arguments. Called when the color table was changed and rendering is requested. """ super(QGradientEditor, self).__init__() self.setWindowTitle("Color Gradient Editor") self.widget = QGradientEditorWidget( master=self, vtk_table=vtk_table, on_change_color_table=on_change_color_table, colors=colors ) self.setCentralWidget(self.widget) self.resize(300, 500) self.statusBar() ## Set up the MenuBar menu = self.menuBar() file_menu = menu.addMenu("&File") file_action = QtGui.QAction("&Save", self) file_action.setStatusTip("Save CTF") file_action.triggered.connect(self.widget.on_save) file_menu.addAction(file_action) load_action = QtGui.QAction("&Load", self) load_action.setStatusTip("Load CTF") load_action.triggered.connect(self.widget.on_load) file_menu.addAction(load_action) quit_action = QtGui.QAction("&Quit", self) quit_action.setStatusTip("Quit application") quit_action.triggered.connect(QtGui.QApplication.instance().quit) file_menu.addAction(quit_action) help_menu = menu.addMenu("&Help") action = QtGui.QAction("&Help", self) action.setStatusTip("Help") action.triggered.connect(self.on_help) help_menu.addAction(action) action = QtGui.QAction("&About", self) action.setStatusTip("About application") action.triggered.connect(self.on_about) help_menu.addAction(action)
def _BuildMenu(self): bar = self.menuBar() # File menu file = bar.addMenu("File") open = QtGui.QAction("Open", self, triggered=self._OpenMatFile) open.setShortcut("Ctrl+O") file.addAction(open)
def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) layout = QtGui.QVBoxLayout(self) layout.setContentsMargins(0,0,0,0) layout.setSpacing(0) self.visualization = Visualization() # The edit_traits call will generate the widget to embed. self.ui = self.visualization.edit_traits(parent=self, kind='subpanel').control layout.addWidget(self.ui) self.ui.setParent(self) # field for setting iso value isoFrame = QtGui.QFrame() layout.addWidget(isoFrame) isoLayout = QtGui.QHBoxLayout(isoFrame) self.isoLabel = QtGui.QLabel("Iso Value:") isoLayout.addWidget(self.isoLabel) self.isovalue = QtGui.QLineEdit() self.isovalue.setText(str(self.visualization.isoValue)) self.isovalue.returnPressed.connect(self.redraw) isoLayout.addWidget(self.isovalue) self.showButton = QtGui.QPushButton("Show...") self.menu = QtGui.QMenu() self.options = {} # general options self.options["atoms"] = QtGui.QAction("atoms", self.menu, checkable=True, checked=True) self.options["labels"] = QtGui.QAction("labels", self.menu, checkable=True) self.options["Lewis structure"] = QtGui.QAction("Lewis structure", self.menu, checkable=True) self.options["enclosing box"] = QtGui.QAction("enclosing box", self.menu, checkable=True, checked=False) self.menu.addAction(self.options["atoms"]) self.menu.addAction(self.options["labels"]) self.menu.addAction(self.options["Lewis structure"]) self.menu.addAction(self.options["enclosing box"]) self.menu.addSeparator() # options for volumetric data self.options["isosurface"] = QtGui.QAction("isosurface", self.menu, checkable=True, checked=True) self.options["X cut plane"] = QtGui.QAction("X cut plane", self.menu, checkable=True) self.options["Y cut plane"] = QtGui.QAction("Y cut plane", self.menu, checkable=True) self.options["Z cut plane"] = QtGui.QAction("Z cut plane", self.menu, checkable=True) self.menu.addAction(self.options["isosurface"]) self.menu.addAction(self.options["X cut plane"]) self.menu.addAction(self.options["Y cut plane"]) self.menu.addAction(self.options["Z cut plane"]) # options for charges self.options["charges"] = QtGui.QAction("charges", self.menu, checkable=True, checked=True) self.options["frag. charges"] = QtGui.QAction("frag. charges", self.menu, checkable=True, checked=False) self.options["charge clouds"] = QtGui.QAction("charge clouds", self.menu, checkable=True, checked=False) self.options["dipole moment"] = QtGui.QAction("dipole moment", self.menu, checkable=True, checked=False) self.options["screening charges (COSMO)"] = QtGui.QAction("screening charges (COSMO)", self.menu, checkable=True) self.options["non-adiab. coupling vectors"] = QtGui.QAction("non-adiab. coupling vectors", self.menu, checkable=True) self.menu.addSeparator() self.menu.addAction(self.options["charges"]) self.menu.addAction(self.options["frag. charges"]) self.menu.addAction(self.options["charge clouds"]) self.menu.addAction(self.options["dipole moment"]) self.menu.addAction(self.options["screening charges (COSMO)"]) self.menu.addAction(self.options["non-adiab. coupling vectors"]) for action in self.options.values(): action.triggered.connect(self.redraw) self.showButton.setMenu(self.menu) # by default only the options for surfaces are shown self.selectShowOptions(options=["surfaces"]) isoLayout.addWidget(self.showButton) # fullscreen icon = QtGui.QIcon.fromTheme("view-fullscreen") #print "icon = %s" % icon self.fullscreenButton = QtGui.QPushButton(icon, 'fullscreen on/off') isoLayout.addWidget(self.fullscreenButton) self.fullscreen = False self.fullscreenButton.clicked.connect(self.toggle_fullscreen)
def __init__(self, xyz_file, dyson_file=None): super(Main, self).__init__() self.settings = Settings({ "Continuum Orbital": { "Ionization transitions": [0, ["only intra-atomic", "inter-atomic"]] }, "Averaging": { "Euler angle grid points": 5, "polar angle grid points": 1000, "sphere radius Rmax": 300.0, }, "Scan": { "nr. points": 20 }, "Cube": { "extra space / bohr": 15.0, "points per bohr": 3.0 } }) # perform DFTB calculation # BOUND ORBITAL = H**O self.atomlist = XYZ.read_xyz(xyz_file)[0] # shift molecule to center of mass print "shift molecule to center of mass" pos = XYZ.atomlist2vector(self.atomlist) masses = AtomicData.atomlist2masses(self.atomlist) pos_com = MolCo.shift_to_com(pos, masses) self.atomlist = XYZ.vector2atomlist(pos_com, self.atomlist) self.tddftb = LR_TDDFTB(self.atomlist) self.tddftb.setGeometry(self.atomlist, charge=0) options = {"nstates": 1} try: self.tddftb.getEnergies(**options) except DFTB.Solver.ExcitedStatesNotConverged: pass self.valorbs, radial_val = load_pseudo_atoms(self.atomlist) if dyson_file == None: # Kohn-Sham orbitals are taken as Dyson orbitals self.H**O, self.LUMO = self.tddftb.dftb2.getFrontierOrbitals() self.bound_orbs = self.tddftb.dftb2.getKSCoefficients() self.orbe = self.tddftb.dftb2.getKSEnergies() orbital_names = [] norb = len(self.orbe) for o in range(0, norb): if o < self.H**O: name = "occup." elif o == self.H**O: name = "H**O" elif o == self.LUMO: name = "LUMO " else: name = "virtual" name = name + " " + str(o).rjust(4) + ( " %+10.3f eV" % (self.orbe[o] * 27.211)) orbital_names.append(name) initially_selected = self.H**O else: # load coefficients of Dyson orbitals from file names, ionization_energies, self.bound_orbs = load_dyson_orbitals( dyson_file) self.orbe = np.array(ionization_energies) / 27.211 orbital_names = [] norb = len(self.orbe) for o in range(0, norb): name = names[o] + " " + str(o).rjust(4) + ( " %4.2f eV" % (self.orbe[o] * 27.211)) orbital_names.append(name) initially_selected = 0 self.photo_kinetic_energy = slako_tables_scattering.energies[0] self.epol = np.array([15.0, 0.0, 0.0]) # Build Graphical User Interface main = QtGui.QWidget() mainLayout = QtGui.QHBoxLayout(main) # selectionFrame = QtGui.QFrame() selectionFrame.setSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Preferred) mainLayout.addWidget(selectionFrame) selectionLayout = QtGui.QVBoxLayout(selectionFrame) # label = QtGui.QLabel(selectionFrame) label.setText("Select bound MO:") selectionLayout.addWidget(label) # bound orbitals self.orbitalSelection = QtGui.QListWidget(selectionFrame) self.orbitalSelection.itemSelectionChanged.connect( self.selectBoundOrbital) norb = len(self.orbe) self.orbital_dict = {} for o in range(0, norb): name = orbital_names[o] self.orbital_dict[name] = o item = QtGui.QListWidgetItem(name, self.orbitalSelection) if o == initially_selected: selected_orbital_item = item selectionLayout.addWidget(self.orbitalSelection) ### VIEWS center = QtGui.QWidget() mainLayout.addWidget(center) centerLayout = QtGui.QGridLayout(center) # boundFrame = QtGui.QFrame() centerLayout.addWidget(boundFrame, 1, 1) boundLayout = QtGui.QVBoxLayout(boundFrame) # "Bound Orbital" label = QtGui.QLabel(boundFrame) label.setText("Bound Orbital") boundLayout.addWidget(label) # self.boundOrbitalViewer = QCubeViewerWidget(boundFrame) boundLayout.addWidget(self.boundOrbitalViewer) # continuum orbital continuumFrame = QtGui.QFrame() centerLayout.addWidget(continuumFrame, 1, 2) continuumLayout = QtGui.QVBoxLayout(continuumFrame) # "Dipole-Prepared Continuum Orbital" label = QtGui.QLabel(continuumFrame) label.setText("Dipole-Prepared Continuum Orbital") continuumLayout.addWidget(label) self.continuumOrbitalViewer = QCubeViewerWidget(continuumFrame) continuumLayout.addWidget(self.continuumOrbitalViewer) self.efield_objects = [] self.efield_actors = [] self.selected = None # picker self.picker = self.continuumOrbitalViewer.visualization.scene.mayavi_scene.on_mouse_pick( self.picker_callback) self.picker.tolerance = 0.01 # PHOTO KINETIC ENERGY sliderFrame = QtGui.QFrame(continuumFrame) continuumLayout.addWidget(sliderFrame) sliderLayout = QtGui.QHBoxLayout(sliderFrame) # label self.pke_label = QtGui.QLabel() self.pke_label.setText("PKE: %6.4f eV" % (self.photo_kinetic_energy * 27.211)) sliderLayout.addWidget(self.pke_label) # Slider for changing the PKE self.pke_slider = QtGui.QSlider(QtCore.Qt.Horizontal) self.pke_slider.setMinimum(0) self.pke_slider.setMaximum(len(slako_tables_scattering.energies) - 1) self.pke_slider.setValue(0) self.pke_slider.sliderReleased.connect(self.changePKE) self.pke_slider.valueChanged.connect(self.searchPKE) sliderLayout.addWidget(self.pke_slider) # # molecular frame photoangular distribution mfpadFrame = QtGui.QFrame() centerLayout.addWidget(mfpadFrame, 2, 1) mfpadLayout = QtGui.QVBoxLayout(mfpadFrame) mfpadLayout.addWidget(QtGui.QLabel("Molecular Frame PAD")) mfpadTabs = QtGui.QTabWidget() mfpadLayout.addWidget(mfpadTabs) # 2D map mfpadFrame2D = QtGui.QFrame() mfpadTabs.addTab(mfpadFrame2D, "2D") mfpadLayout2D = QtGui.QVBoxLayout(mfpadFrame2D) self.MFPADfig2D = Figure() self.MFPADCanvas2D = FigureCanvas(self.MFPADfig2D) mfpadLayout2D.addWidget(self.MFPADCanvas2D) self.MFPADCanvas2D.draw() NavigationToolbar(self.MFPADCanvas2D, mfpadFrame2D, coordinates=True) # 3D mfpadFrame3D = QtGui.QFrame() mfpadTabs.addTab(mfpadFrame3D, "3D") mfpadLayout3D = QtGui.QVBoxLayout(mfpadFrame3D) self.MFPADfig3D = Figure() self.MFPADCanvas3D = FigureCanvas(self.MFPADfig3D) mfpadLayout3D.addWidget(self.MFPADCanvas3D) self.MFPADCanvas3D.draw() NavigationToolbar(self.MFPADCanvas3D, mfpadFrame3D, coordinates=True) # orientation averaged photoangular distribution avgpadFrame = QtGui.QFrame() centerLayout.addWidget(avgpadFrame, 2, 2) avgpadLayout = QtGui.QVBoxLayout(avgpadFrame) self.activate_average = QtGui.QCheckBox("Orientation Averaged PAD") self.activate_average.setToolTip( "Check this box to start averaging of the molecular frame PADs over all orientations. This can take a while." ) self.activate_average.setCheckState(QtCore.Qt.Unchecked) self.activate_average.stateChanged.connect(self.activateAveragedPAD) avgpadLayout.addWidget(self.activate_average) avgpadTabs = QtGui.QTabWidget() avgpadLayout.addWidget(avgpadTabs) # 1D map avgpadFrame1D = QtGui.QFrame() avgpadTabs.addTab(avgpadFrame1D, "1D") avgpadLayout1D = QtGui.QVBoxLayout(avgpadFrame1D) self.AvgPADfig1D = Figure() self.AvgPADCanvas1D = FigureCanvas(self.AvgPADfig1D) avgpadLayout1D.addWidget(self.AvgPADCanvas1D) self.AvgPADCanvas1D.draw() NavigationToolbar(self.AvgPADCanvas1D, avgpadFrame1D, coordinates=True) # 2D map avgpadFrame2D = QtGui.QFrame() avgpadFrame2D.setToolTip( "The averaged PAD should have no phi-dependence anymore. A phi-dependence is a sign of incomplete averaging." ) avgpadTabs.addTab(avgpadFrame2D, "2D") avgpadLayout2D = QtGui.QVBoxLayout(avgpadFrame2D) self.AvgPADfig2D = Figure() self.AvgPADCanvas2D = FigureCanvas(self.AvgPADfig2D) avgpadLayout2D.addWidget(self.AvgPADCanvas2D) self.AvgPADCanvas2D.draw() NavigationToolbar(self.AvgPADCanvas2D, avgpadFrame2D, coordinates=True) # Table avgpadFrameTable = QtGui.QFrame() avgpadTabs.addTab(avgpadFrameTable, "Table") avgpadLayoutTable = QtGui.QVBoxLayout(avgpadFrameTable) self.avgpadTable = QtGui.QTableWidget(0, 6) self.avgpadTable.setToolTip( "Activate averaging and move the PKE slider above to add a new row with beta values. After collecting betas for different energies you can save the table or plot a curve beta(PKE) for the selected orbital." ) self.avgpadTable.setHorizontalHeaderLabels( ["PKE / eV", "sigma", "beta1", "beta2", "beta3", "beta4"]) avgpadLayoutTable.addWidget(self.avgpadTable) # Buttons buttonFrame = QtGui.QFrame() avgpadLayoutTable.addWidget(buttonFrame) buttonLayout = QtGui.QHBoxLayout(buttonFrame) deleteButton = QtGui.QPushButton("Delete") deleteButton.setToolTip("clear table") deleteButton.clicked.connect(self.deletePADTable) buttonLayout.addWidget(deleteButton) buttonLayout.addSpacing(3) scanButton = QtGui.QPushButton("Scan") scanButton.setToolTip( "fill table by scanning automatically through all PKE values") scanButton.clicked.connect(self.scanPADTable) buttonLayout.addWidget(scanButton) saveButton = QtGui.QPushButton("Save") saveButton.setToolTip("save table as a text file") saveButton.clicked.connect(self.savePADTable) buttonLayout.addWidget(saveButton) plotButton = QtGui.QPushButton("Plot") plotButton.setToolTip("plot beta2 column as a function of PKE") plotButton.clicked.connect(self.plotPADTable) buttonLayout.addWidget(plotButton) """ # DOCKS self.setDockOptions(QtGui.QMainWindow.AnimatedDocks | QtGui.QMainWindow.AllowNestedDocks) # selectionDock = QtGui.QDockWidget(self) selectionDock.setWidget(selectionFrame) selectionDock.setFeatures(QtGui.QDockWidget.DockWidgetFloatable | QtGui.QDockWidget.DockWidgetMovable) self.addDockWidget(QtCore.Qt.DockWidgetArea(1), selectionDock) # boundDock = QtGui.QDockWidget(self) boundDock.setWidget(boundFrame) boundDock.setFeatures(QtGui.QDockWidget.DockWidgetFloatable | QtGui.QDockWidget.DockWidgetMovable) boundDock.setSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred) self.addDockWidget(QtCore.Qt.DockWidgetArea(2), boundDock) # continuumDock = QtGui.QDockWidget(self) continuumDock.setWidget(continuumFrame) continuumDock.setFeatures(QtGui.QDockWidget.DockWidgetFloatable | QtGui.QDockWidget.DockWidgetMovable) continuumDock.setSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred) self.addDockWidget(QtCore.Qt.DockWidgetArea(2), continuumDock) """ self.setCentralWidget(main) self.status_bar = QtGui.QStatusBar(main) self.setStatusBar(self.status_bar) self.default_message = "Click on the tip of the green arrow in the top right figure to change the orientation of the E-field" self.statusBar().showMessage(self.default_message) # Menu bar menubar = self.menuBar() exitAction = QtGui.QAction('&Exit', self) exitAction.setShortcut('Ctrl+Q') exitAction.setStatusTip('Exit program') exitAction.triggered.connect(exit) fileMenu = menubar.addMenu('&File') fileMenu.addAction(exitAction) settingsMenu = menubar.addMenu('&Edit') settingsAction = QtGui.QAction('&Settings...', self) settingsAction.setStatusTip('Edit settings') settingsAction.triggered.connect(self.editSettings) settingsMenu.addAction(settingsAction) self.loadContinuum() # select H**O selected_orbital_item.setSelected(True)