def __init__(self, ycube, parent=None): QtGui.QWidget.__init__(self, parent) self.setWindowTitle('3D Data Visualization') layout = QtGui.QVBoxLayout(self) self.visualization = Visualization(ycube) self.group_checkbox = QtGui.QGroupBox() self.group_checkbox.setTitle("Display Objects") self.checkbox_plane1 = QtGui.QCheckBox("Show Plane 1") self.checkbox_plane1.setChecked(True) self.checkbox_plane1.stateChanged.connect(self.show_plane1) self.checkbox_plane2 = QtGui.QCheckBox("Show Plane 2") self.checkbox_plane2.setChecked(True) self.checkbox_plane2.stateChanged.connect(self.show_plane2) self.checkbox_iso = QtGui.QCheckBox("Show Isometric Surface") self.checkbox_iso.setChecked(True) self.checkbox_iso.stateChanged.connect(self.show_iso) hbox = QtGui.QHBoxLayout() hbox.addWidget(self.checkbox_plane1) hbox.addWidget(self.checkbox_plane2) hbox.addWidget(self.checkbox_iso) self.group_checkbox.setLayout(hbox) self.ui = self.visualization.edit_traits(parent=self, kind='subpanel').control layout.addWidget(self.ui) layout.addWidget(self.group_checkbox) self.ui.setParent(self) self.show()
def init(self, parent): """ Finishes initializing the editor by creating the underlying toolkit widget. """ self.control = QtGui.QCheckBox() self.control.stateChanged.connect(self.update_object) self.set_tooltip()
def rebuild_editor(self): """ Rebuilds the editor after its definition is modified. """ while self._connections_to_rebuild: signal, handler = self._connections_to_rebuild.pop() signal.disconnect(handler) # Clear any existing content: self.clear_layout() cur_value = parse_value(self.value) # Create a sizer to manage the radio buttons: labels = self.names values = self.values n = len(labels) cols = self.factory.cols rows = (n + cols - 1) // cols # incr will keep track of how to increment index so that as we traverse # the grid in row major order, the elements are added to appear in # column major order incr = [n // cols] * cols rem = n % cols for i in range(cols): incr[i] += rem > i incr[-1] = -sum(incr[:-1]) + 1 # e.g for a gird: # 0 2 4 # 1 3 5 # incr should be [2, 2, -3] # Add the set of all possible choices: layout = self.control.layout() index = 0 # populate the layout in row_major order for i in range(rows): for j in range(cols): if n > 0: cb = QtGui.QCheckBox(labels[index]) cb.value = values[index] if cb.value in cur_value: cb.setCheckState(QtCore.Qt.Checked) else: cb.setCheckState(QtCore.Qt.Unchecked) cb.clicked.connect(self._mapper.map) self._connections_to_rebuild.append( (cb.clicked, self._mapper.map) ) self._mapper.setMapping(cb, labels[index]) layout.addWidget(cb, i, j) index += incr[j] n -= 1
def rebuild_editor(self): """ Rebuilds the editor after its definition is modified. """ while self._connections_to_rebuild: signal, handler = self._connections_to_rebuild.pop() signal.disconnect(handler) # Clear any existing content: self.clear_layout() cur_value = parse_value(self.value) # Create a sizer to manage the radio buttons: labels = self.names values = self.values n = len(labels) cols = self.factory.cols rows = (n + cols - 1) // cols incr = [n // cols] * cols rem = n % cols for i in range(cols): incr[i] += rem > i incr[-1] = -sum(incr[:-1]) + 1 # Add the set of all possible choices: layout = self.control.layout() index = 0 for i in range(rows): for j in range(cols): if n > 0: cb = QtGui.QCheckBox(labels[index]) cb.value = values[index] if cb.value in cur_value: cb.setCheckState(QtCore.Qt.Checked) else: cb.setCheckState(QtCore.Qt.Unchecked) cb.clicked.connect(self._mapper.map) self._connections_to_rebuild.append( (cb.clicked, self._mapper.map)) self._mapper.setMapping(cb, labels[index]) layout.addWidget(cb, i, j) index += incr[j] n -= 1
def rebuild_editor ( self ): """ Rebuilds the editor after its definition is modified. """ # Clear any existing content: self.clear_layout() cur_value = parse_value( self.value ) # Create a sizer to manage the radio buttons: labels = self.names values = self.values n = len( labels ) cols = self.factory.cols rows = (n + cols - 1) / cols incr = [ n / cols ] * cols rem = n % cols for i in range( cols ): incr[i] += (rem > i) incr[-1] = -(reduce( lambda x, y: x + y, incr[:-1], 0 ) - 1) # Add the set of all possible choices: layout = self.control.layout() index = 0 for i in range( rows ): for j in range( cols ): if n > 0: cb = QtGui.QCheckBox(labels[index]) cb.value = values[index] if cb.value in cur_value: cb.setCheckState(QtCore.Qt.Checked) else: cb.setCheckState(QtCore.Qt.Unchecked) QtCore.QObject.connect(cb, QtCore.SIGNAL('clicked()'), self._mapper, QtCore.SLOT('map()')) self._mapper.setMapping(cb, labels[index]) layout.addWidget(cb, i, j) index += incr[j] n -= 1
def __init__(self, parent=None): super(TaskBarLayout, self).__init__(parent) self.load_scan_button = QtGui.QPushButton("Load Scan") self.define_leads_button = QtGui.QPushButton("Define Leads") self.define_leads_button.setEnabled(False) self.load_coord_button = QtGui.QPushButton("Load Coordinates") self.load_coord_button.setEnabled(False) self.clean_button = QtGui.QPushButton("Clean scan") self.save_button=QtGui.QPushButton("Save as...") self.save_button.setEnabled(False) self.bipolar_box = QtGui.QCheckBox("Include Bipolar Pairs") save_layout = QtGui.QVBoxLayout() save_layout.addWidget(self.save_button) save_layout.addWidget(self.bipolar_box) self.addWidget(self.load_scan_button) self.addWidget(self.define_leads_button) self.addWidget(self.load_coord_button) self.addLayout(save_layout) self.addWidget(self.clean_button)
def __init__(self, controller, config, parent=None): """ Panel that displays and interacts with localized contacts :param controller: The PylocControl for the app :param config: The loaded config dict for the app :param parent: A parent widget """ super(ContactPanelWidget, self).__init__(parent) self.config = config self.controller = controller layout = QtGui.QVBoxLayout(self) lead_layout = QtGui.QHBoxLayout() layout.addLayout(lead_layout) self.labels = OrderedDict() self.label_dropdown = NoScrollComboBox() self.label_dropdown.setMaximumWidth(75) add_labeled_widget(lead_layout, "Label :", self.label_dropdown) self.contact_name = QtGui.QLineEdit() lead_layout.addWidget(self.contact_name) loc_layout = QtGui.QHBoxLayout() layout.addLayout(loc_layout) self.x_lead_loc = QtGui.QLineEdit() self.x_loc_max = QtGui.QLabel('') add_labeled_widget(loc_layout, "Lead x:", self.x_lead_loc,self.x_loc_max) self.y_lead_loc = QtGui.QLineEdit() self.y_loc_max = QtGui.QLabel('') add_labeled_widget(loc_layout, " y:", self.y_lead_loc,self.y_loc_max) self.lead_group = QtGui.QLineEdit("0") add_labeled_widget(loc_layout, " group:", self.lead_group) vox_layout = QtGui.QHBoxLayout() layout.addLayout(vox_layout) self.r_voxel = QtGui.QLineEdit() add_labeled_widget(vox_layout, "R:", self.r_voxel) self.a_voxel = QtGui.QLineEdit() add_labeled_widget(vox_layout, "A:", self.a_voxel) self.s_voxel = QtGui.QLineEdit() add_labeled_widget(vox_layout, "S:", self.s_voxel) self.axes_checkbox = QtGui.QCheckBox("Show RAS Tags") self.axes_checkbox.setChecked(True) vox_layout.addWidget(self.axes_checkbox) self.submit_button = QtGui.QPushButton("Submit") layout.addWidget(self.submit_button) contact_label = QtGui.QLabel("Contacts:") layout.addWidget(contact_label) self.contacts = [] self.contact_list = QtGui.QListWidget() self.contact_list.setSelectionMode(QtGui.QAbstractItemView.ContiguousSelection) layout.addWidget(self.contact_list) self.interpolate_button = QtGui.QPushButton("Interpolate") layout.addWidget(self.interpolate_button) self.seed_button = QtGui.QPushButton("Seeding") self.seed_button.setCheckable(True) layout.addWidget(self.seed_button) self.micro_button = QtGui.QPushButton("Add Micro-Contacts") layout.addWidget(self.micro_button) self.assign_callbacks()
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)