Ejemplo n.º 1
0
    def _setup(self):

        self.slider = DataSlider(self.model.data)
        self.crosshair = CrosshairAnnulus(self.plot_item)
        self.colormap = Colormap(self.plot_item)
        self.interpolation = Interpolation()

        layout = self.scroll_area.widget().layout()
        layout.insertWidget(0, self.slider)
        layout.insertWidget(1, self.colormap)
        layout.insertWidget(2, self.crosshair)
        layout.insertWidget(3, self.interpolation)

        # Set Title
        data = self.model.data

        if data:
            id_ = data.ID

            if 'alias' in data.meta_data:
                text = data.meta_data['alias']
            else:
                text = data.name

            self.title = '%s (%i)' % (text, id_)

        else:
            self.title = 'NO DATA'
    def _setup(self):
        self.crosshair = CrosshairAnnulus(self.plot_item)
        self.colormap = Colormap(self.plot_item)
        self.interpolation = Interpolation()
        self.interpolation.set_force_interpolation(True)
        self.model = SplitViewTabModel(self.sliced_tab, self.orbital_tab,
                                       self.interpolation)
        self.split_options = SplitViewOptions()

        self.slider = DataSliderNoTranspose(self.model.get_sliced_data())

        layout = self.scroll_area.widget().layout()
        layout.insertWidget(0, self.slider)
        layout.insertWidget(1, self.split_options)
        layout.insertWidget(2, self.interpolation)
        layout.insertWidget(3, self.colormap)
        layout.insertWidget(4, self.crosshair)
Ejemplo n.º 3
0
    def _setup(self):
        self.crosshair = CrosshairAnnulus(self.plot_item)
        self.colormap = Colormap([self.plot_item])
        self.interpolation = Interpolation()

        layout = self.scroll_area.widget().layout()
        layout.insertWidget(4, self.interpolation)
        layout.insertWidget(3, self.colormap)
        layout.insertWidget(5, self.crosshair)

        self.mini_real_plot.set_options(self.real_space_options)
        self.mini_3Dkspace_plot.set_options(self.real_space_options)

        # Rough axis values for all orbitals to set labels for interpolation
        x = Axis('kx', '1/Å', [-3, 3], 200)
        y = Axis('ky', '1/Å', [-3, 3], 200)
        self.interpolation.set_label(x, y)
        self.plot_item.set_labels(x, y)

        self.title = 'Orbitals'
class SplitViewTab(Tab, SplitViewTab_UI):
    def __init__(self, sliced_tab, orbital_tab):
        self.sliced_tab = sliced_tab
        self.orbital_tab = orbital_tab

        # Setup GUI
        super(SplitViewTab, self).__init__()
        self.setupUi(self)

        self._setup()
        self._connect()

        self.change_axis(0)
        self.change_slice(0)

    @classmethod
    def init_from_save(cls, save, sliced_tab, orbital_tab):
        tab = SplitViewTab(sliced_tab, orbital_tab)

        tab.slider.restore_state(save['slider']),
        tab.crosshair.restore_state(save['crosshair']),
        tab.interpolation.restore_state(save['interpolation']),
        tab.split_options.restore_state(save['split_options'])

        return tab

    def save_state(self):
        save = {
            'title': self.title,
            'slider': self.slider.save_state(),
            'crosshair': self.crosshair.save_state(),
            'interpolation': self.interpolation.save_state(),
            'split_options': self.split_options.save_state()
        }

        return save, [self.sliced_tab, self.orbital_tab]

    def get_title(self):
        return 'Split View'

    def get_axis(self):
        return self.slider.get_axis()

    def get_slice(self):
        return self.slider.get_index()

    def change_slice(self, index=-1):
        axis = self.slider.get_axis()
        slice_index = index if index != -1 else self.get_slice()
        data = self.model.update_displayed_plot_data(slice_index, axis)

        self.plot_item.plot(data)
        self.crosshair.update_label()

    def change_axis(self, axis):
        # 'axes' is a copy of all axes except the one with index 'axis'
        axes = [
            a for i, a in enumerate(self.model.get_sliced_data().axes)
            if i != axis
        ]
        index = self.get_slice()
        data = self.model.update_displayed_plot_data(index, axis)

        self.plot_item.set_labels(axes[1], axes[0])
        self.interpolation.set_label(axes[1], axes[0])
        self.plot_item.plot(data)

    def crosshair_changed(self):
        self.crosshair.update_label()

    def display_in_matplotlib(self):
        data = self.model.displayed_plot_data
        LUT = self.plot_item.get_LUT()

        window = MatplotlibImageWindow(data, LUT=LUT)

        return window

    def change_split_options(self, scale, type_):
        self.model.set_scale(scale)
        self.model.set_type(type_)
        self.change_slice()

    def closeEvent(self, event):
        del self.model

        Tab.closeEvent(self, event)

    def _setup(self):
        self.crosshair = CrosshairAnnulus(self.plot_item)
        self.colormap = Colormap(self.plot_item)
        self.interpolation = Interpolation()
        self.interpolation.set_force_interpolation(True)
        self.model = SplitViewTabModel(self.sliced_tab, self.orbital_tab,
                                       self.interpolation)
        self.split_options = SplitViewOptions()

        self.slider = DataSliderNoTranspose(self.model.get_sliced_data())

        layout = self.scroll_area.widget().layout()
        layout.insertWidget(0, self.slider)
        layout.insertWidget(1, self.split_options)
        layout.insertWidget(2, self.interpolation)
        layout.insertWidget(3, self.colormap)
        layout.insertWidget(4, self.crosshair)

    def _connect(self):
        self.crosshair.crosshair_changed.connect(self.crosshair_changed)
        self.slider.slice_changed.connect(self.change_slice)
        self.slider.axis_changed.connect(self.change_axis)
        self.interpolation.smoothing_changed.connect(self.change_slice)
        self.interpolation.interpolation_changed.connect(self.change_slice)
        self.split_options.values_changed.connect(self.change_split_options)
Ejemplo n.º 5
0
class OrbitalDataTab(Tab, OrbitalDataTab_UI):
    orbital_removed = pyqtSignal(int)
    orbital_added = pyqtSignal(int)
    get_energy = pyqtSignal()

    def __init__(self):
        # Setup GUI
        super(OrbitalDataTab, self).__init__()
        self.setupUi(self)
        self._setup()
        self._connect()

        self.model = OrbitalDataTabModel(self)

    def add_orbital_from_filepath(self, path):
        orbital = self.model.load_data_from_path(path)
        self.add_orbital(orbital)

        return orbital.ID

    def add_orbital_from_online(self, URL, meta_data={}):
        orbital = self.model.load_data_from_online(URL, meta_data)
        self.add_orbital(orbital)

        return orbital.ID

    def get_orbitals(self):
        orbitals = [orbital[0] for orbital in self.model.orbitals]

        return orbitals

    def add_orbital(self, orbital):
        if 'orientation' in orbital.meta_data:
            orientation = orbital.meta_data['orientation']

        else:
            orientation = 'xy'

        self.table.add_orbital(orbital, orientation)

        self.refresh_plot()

        self.orbital_added.emit(orbital.ID)

    def refresh_plot(self):
        data = self.model.update_displayed_plot_data()

        data = self.interpolation.interpolate(data)
        data = self.interpolation.smooth(data)

        self.plot_item.plot(data)

    def refresh_mini_plots(self, ID, orbital_changed=True):
        parameters = self.get_parameters(ID)
        phi, theta, psi = parameters[3:6]
        E_kin = parameters[1]

        if orbital_changed:
            orbital = self.model.ID_to_orbital(ID)
            self.mini_3Dkspace_plot.set_orbital(orbital, ID)
            self.mini_real_plot.set_orbital(orbital)

        self.mini_3Dkspace_plot.change_energy(E_kin)
        self.mini_3Dkspace_plot.rotate_orbital(phi, theta, psi)
        self.mini_real_plot.rotate_orbital(phi, theta, psi)

    def refresh_mini_plot_polarization(self):
        polarization, alpha, beta = self.polarization.get_parameters()[1:4]

        self.mini_real_plot.rotate_photon(polarization, alpha, beta)

    def get_crosshair(self):
        return self.crosshair

    def get_parameters(self, ID):
        kinetic_energy, dk, symmetry = self.cube_options.get_parameters()
        parameters = self.table.get_parameters_by_ID(ID)
        weight, *orientation = parameters
        polarization = self.polarization.get_parameters()

        return (weight, kinetic_energy, dk, *orientation, *polarization,
                symmetry)

    def get_use(self, ID):
        return self.table.get_use_by_ID(ID)

    def get_displayed_plot_data(self):
        return self.model.displayed_plot_data

    def crosshair_changed(self):
        self.crosshair.update_label()

    def change_parameter(self):
        self.refresh_plot()

        ID = self.mini_3Dkspace_plot.ID
        if ID is not None:
            self.refresh_mini_plots(ID, orbital_changed=False)

    def orbitals_changed(self, ID):
        self.refresh_plot()

        current_ID = self.mini_3Dkspace_plot.ID
        if current_ID is None or current_ID == ID:
            self.refresh_mini_plots(ID, orbital_changed=False)

    def remove_orbital_by_ID(self, ID):
        self.model.remove_orbital_by_ID(ID)

        self.refresh_plot()
        self.mini_3Dkspace_plot.set_orbital(None, ID)
        self.mini_real_plot.set_orbital(None)

        self.orbital_removed.emit(ID)

    def export_to_hdf5(self):
        if not self.interpolation.interpolation_checkbox.isChecked():
            print('Only interpolated OrbitalData can be exported.')
            return

        path = config.get_key('paths', 'hdf5_export_start')
        if path == 'None':
            file_name, _ = QFileDialog.getSaveFileName(
                None, 'Save .hdf5 File (*.hdf5)')
        else:
            start_path = str(__directory__ / path)
            file_name, _ = QFileDialog.getSaveFileName(
                None, 'Save .hdf5 File (*.hdf5)', str(start_path))

        if not file_name:
            return
        else:
            h5file = h5py.File(file_name, 'w')

        export_energies = eval(config.get_key('orbital', 'export_energies'))
        if isinstance(export_energies, dict):
            export_energies = np.linspace(export_energies['min'],
                                          export_energies['max'],
                                          export_energies['num'],
                                          endpoint=True)

        kmaps = []
        old_energy = self.cube_options.energy_spinbox.value()
        for energy in export_energies:
            self.cube_options.energy_spinbox.setValue(energy)
            kmaps.append(self.get_displayed_plot_data().data)
        self.cube_options.energy_spinbox.setValue(old_energy)
        kmaps = np.array(kmaps)
        xrange, yrange = self.get_displayed_plot_data().range

        h5file.create_dataset('name', data='Orbitals')
        h5file.create_dataset('axis_1_label', data='E_kin')
        h5file.create_dataset('axis_2_label', data='kx')
        h5file.create_dataset('axis_3_label', data='ky')
        h5file.create_dataset('axis_1_units', data='eV')
        h5file.create_dataset('axis_2_units', data='1/Å')
        h5file.create_dataset('axis_3_units', data='1/Å')
        h5file.create_dataset('axis_1_range',
                              data=[export_energies[0], export_energies[-1]])
        h5file.create_dataset('axis_2_range', data=xrange)
        h5file.create_dataset('axis_3_range', data=yrange)
        h5file.create_dataset('data',
                              data=kmaps,
                              dtype='f8',
                              compression='gzip',
                              compression_opts=9)
        h5file.close()

    def display_in_matplotlib(self):
        data = self.model.displayed_plot_data
        LUT = self.plot_item.get_LUT()

        window = MatplotlibImageWindow(data, LUT=LUT)

        return window

    def change_kinetic_energy(self, energy):
        self.cube_options.set_kinetic_energy(energy)

    def closeEvent(self, event):
        del self.model

        Tab.closeEvent(self, event)

    def get_plot_labels(self):
        bottom = self.plot_item.get_label('bottom')
        left = self.plot_item.get_label('left')
        return bottom, left

    def save_state(self):
        crosshair_save = self.crosshair.save_state()
        interpolation_save = self.interpolation.save_state()
        polarization_save = self.polarization.save_state()
        cube_options_save = self.cube_options.save_state()
        real_space_options_save = self.real_space_options.save_state()
        colormap_save = self.colormap.save_state()

        orbital_save = []
        for orbital in self.model.orbitals:
            parameters = self.get_parameters(orbital[0].ID)
            use = self.get_use(orbital[0].ID)
            orbital_save.append([*orbital[1:], parameters, use])

        save = {
            'crosshair': crosshair_save,
            'interpolation': interpolation_save,
            'polarization': polarization_save,
            'cube_options': cube_options_save,
            'real_space_options': real_space_options_save,
            'orbital': orbital_save,
            'colormap': colormap_save,
            'title': self.title
        }

        return save, []

    def restore_state(self, save):
        ID_maps = []
        for orbital in save['orbital']:
            if orbital[0] == 'path':
                ID = self.add_orbital_from_filepath(orbital[1])

            elif orbital[0] == 'url':
                ID = self.add_orbital_from_online(orbital[1], orbital[2])

            else:
                raise ValueError

            ID_maps.append([orbital[3], ID])
            parameter = [orbital[4][0], *orbital[4][3:6]]
            use = orbital[5]
            self.table.update_orbital_parameters(ID, parameter)
            self.table.update_orbital_use(ID, use)

        crosshair_save = save['crosshair']
        interpolation_save = save['interpolation']
        polarization_save = save['polarization']
        cube_options_save = save['cube_options']
        real_space_options_save = save['real_space_options']
        colormap_save = save['colormap']

        self.crosshair.restore_state(crosshair_save)
        self.interpolation.restore_state(interpolation_save)
        self.polarization.restore_state(polarization_save)
        self.cube_options.restore_state(cube_options_save)
        self.real_space_options.restore_state(real_space_options_save)
        self.colormap.restore_state(colormap_save)

        return ID_maps

    def _setup(self):
        self.crosshair = CrosshairAnnulus(self.plot_item)
        self.colormap = Colormap([self.plot_item])
        self.interpolation = Interpolation()

        layout = self.scroll_area.widget().layout()
        layout.insertWidget(4, self.interpolation)
        layout.insertWidget(3, self.colormap)
        layout.insertWidget(5, self.crosshair)

        self.mini_real_plot.set_options(self.real_space_options)
        self.mini_3Dkspace_plot.set_options(self.real_space_options)

        # Rough axis values for all orbitals to set labels for interpolation
        x = Axis('kx', '1/Å', [-3, 3], 200)
        y = Axis('ky', '1/Å', [-3, 3], 200)
        self.interpolation.set_label(x, y)
        self.plot_item.set_labels(x, y)

        self.title = 'Orbitals'

    def _connect(self):
        self.crosshair.crosshair_changed.connect(self.crosshair_changed)
        self.table.orbital_changed.connect(self.orbitals_changed)
        self.table.orbital_removed.connect(self.remove_orbital_by_ID)
        self.table.orbital_selected.connect(self.refresh_mini_plots)
        self.polarization.polarization_changed.connect(self.change_parameter)
        self.polarization.polarization_changed.connect(
            self.refresh_mini_plot_polarization)
        self.cube_options.symmetrization_changed.connect(self.change_parameter)
        self.cube_options.energy_changed.connect(self.change_parameter)
        self.cube_options.resolution_changed.connect(self.change_parameter)
        self.cube_options.get_match_energy.connect(self.get_energy.emit)

        self.interpolation.smoothing_changed.connect(self.refresh_plot)
        self.interpolation.interpolation_changed.connect(self.refresh_plot)
Ejemplo n.º 6
0
class OrbitalDataTab(Tab, OrbitalDataTab_UI):
    orbital_removed = pyqtSignal(int)
    orbital_added = pyqtSignal(int)
    get_energy = pyqtSignal()

    def __init__(self):
        # Setup GUI
        super(OrbitalDataTab, self).__init__()
        self.setupUi(self)
        self._setup()
        self._connect()

        self.model = OrbitalDataTabModel(self)

    @classmethod
    def init_from_save(cls, save, dependencies, tab_widget=None):
        self = cls()

        for orbital in save['orbitals']:
            if orbital['load_type'] == 'path':
                self.add_orbital_from_filepath(orbital['load_args'],
                                               orbital['ID'])

            elif orbital['load_type'] == 'url':
                self.add_orbital_from_online(orbital['load_args'],
                                             meta_data=orbital['meta_data'],
                                             ID=orbital['ID'])

        self.interpolation.restore_state(save['interpolation'])
        self.table.restore_state(save['table'])
        self.polarization.restore_state(save['polarization'])
        self.cube_options.restore_state(save['cube_options'])
        self.real_space_options.restore_state(save['real_space_options'])
        self.crosshair.restore_state(save['crosshair'])
        self.colormap.restore_state(save['colormap'])
        self.plot_item.set_levels(save['levels'])
        self.plot_item.set_colormap(save['colorscale'])

        return self

    def add_orbital_from_filepath(self, path, ID=None):
        orbital = self.model.load_data_from_path(path, ID=ID)
        self.add_orbital(orbital)

        return orbital.ID

    def add_orbital_from_online(self, URL, meta_data={}, ID=None):
        orbital = self.model.load_data_from_online(URL, meta_data, ID=ID)
        self.add_orbital(orbital)

        return orbital.ID

    def get_orbitals(self):
        orbitals = [orbital[0] for orbital in self.model.orbitals]

        return orbitals

    def add_orbital(self, orbital):
        if 'orientation' in orbital.meta_data:
            orientation = orbital.meta_data['orientation']

        else:
            orientation = 'xy'

        self.table.add_orbital(orbital, orientation)

        self.refresh_plot()

        self.orbital_added.emit(orbital.ID)

    def refresh_plot(self):
        data = self.model.update_displayed_plot_data()

        data = self.interpolation.interpolate(data)
        data = self.interpolation.smooth(data)

        self.plot_item.plot(data)
        self.crosshair.update_label()

    def refresh_mini_plots(self, ID, orbital_changed=True):
        parameters = self.get_parameters(ID)
        phi, theta, psi = parameters[3:6]
        E_kin = parameters[1]
        V0 = parameters[-1]

        if orbital_changed:
            orbital = self.model.ID_to_orbital(ID)
            self.mini_3Dkspace_plot.set_orbital(orbital, ID)
            self.mini_real_plot.set_orbital(orbital)

        self.mini_3Dkspace_plot.change_energy(E_kin)
        self.mini_3Dkspace_plot.change_inner_potential(V0)
        self.mini_3Dkspace_plot.rotate_orbital(phi, theta, psi)
        self.mini_real_plot.rotate_orbital(phi, theta, psi)

    def refresh_mini_plot_polarization(self):
        polarization, alpha, beta, _, s_share = self.polarization.get_parameters(
        )[1:]

        self.mini_real_plot.rotate_photon(polarization, alpha, beta, s_share)

    def get_crosshair(self):
        return self.crosshair

    def get_parameters(self, ID):
        kinetic_energy, dk, symmetry, V0 = self.cube_options.get_parameters()
        parameters = self.table.get_parameters_by_ID(ID)
        weight, *orientation = parameters
        *polarization, s_share = self.polarization.get_parameters()

        return (weight, kinetic_energy, dk, *orientation, *polarization,
                symmetry, s_share, V0)

    def get_use(self, ID):
        return self.table.get_use_by_ID(ID)

    def get_displayed_plot_data(self):
        return self.model.displayed_plot_data

    def crosshair_changed(self):
        self.crosshair.update_label()

    def change_parameter(self):
        self.refresh_plot()

        ID = self.mini_3Dkspace_plot.ID
        if ID is not None:
            self.refresh_mini_plots(ID, orbital_changed=False)

    def orbitals_changed(self, ID):
        self.refresh_plot()

        current_ID = self.mini_3Dkspace_plot.ID
        if current_ID is None or current_ID == ID:
            self.refresh_mini_plots(ID, orbital_changed=False)

    def remove_orbital_by_ID(self, ID):
        self.model.remove_orbital_by_ID(ID)

        self.refresh_plot()
        self.mini_3Dkspace_plot.set_orbital(None, ID)
        self.mini_real_plot.set_orbital(None)

        self.orbital_removed.emit(ID)

    def export_to_numpy(self):
        path = config.get_key('paths', 'numpy_export_start')
        if path == 'None':
            file_name, _ = QFileDialog.getSaveFileName(
                None, 'Save .npy File (*.npy)')
        else:
            start_path = str(__directory__ / path)
            file_name, _ = QFileDialog.getSaveFileName(
                None, 'Save .npy File (*.npy)', str(start_path))

        if not file_name:
            return

        axis_1 = self.get_displayed_plot_data().x_axis
        axis_2 = self.get_displayed_plot_data().y_axis
        data = self.get_displayed_plot_data().data
        np.savez(file_name, axis_1=axis_1, axis_2=axis_2, data=data)

    def export_to_hdf5(self):
        if not self.interpolation.interpolation_checkbox.isChecked():
            print('Only interpolated OrbitalData can be exported.')
            return

        path = config.get_key('paths', 'hdf5_export_start')
        if path == 'None':
            file_name, _ = QFileDialog.getSaveFileName(
                None, 'Save .hdf5 File (*.hdf5)')
        else:
            start_path = str(__directory__ / path)
            file_name, _ = QFileDialog.getSaveFileName(
                None, 'Save .hdf5 File (*.hdf5)', str(start_path))

        if not file_name:
            return
        else:
            h5file = h5py.File(file_name, 'w')

        export_energies = eval(config.get_key('orbital', 'export_energies'))
        if isinstance(export_energies, dict):
            export_energies = np.linspace(export_energies['min'],
                                          export_energies['max'],
                                          export_energies['num'],
                                          endpoint=True)

        kmaps = []
        old_energy = self.cube_options.energy_spinbox.value()
        for energy in export_energies:
            self.cube_options.energy_spinbox.setValue(energy)
            kmaps.append(self.get_displayed_plot_data().data)
        self.cube_options.energy_spinbox.setValue(old_energy)
        kmaps = np.array(kmaps)
        xrange, yrange = self.get_displayed_plot_data().range

        h5file.create_dataset('name', data='Orbitals')
        h5file.create_dataset('axis_1_label', data='E_kin')
        h5file.create_dataset('axis_2_label', data='kx')
        h5file.create_dataset('axis_3_label', data='ky')
        h5file.create_dataset('axis_1_units', data='eV')
        h5file.create_dataset('axis_2_units', data='1/Å')
        h5file.create_dataset('axis_3_units', data='1/Å')
        h5file.create_dataset('axis_1_range',
                              data=[export_energies[0], export_energies[-1]])
        h5file.create_dataset('axis_2_range', data=xrange)
        h5file.create_dataset('axis_3_range', data=yrange)
        h5file.create_dataset('data',
                              data=kmaps,
                              dtype='f8',
                              compression='gzip',
                              compression_opts=9)
        h5file.close()

    def export_to_txt(self):
        if not self.interpolation.interpolation_checkbox.isChecked():
            # Otherwise maps at different energies would be of different size
            print('Only interpolated OrbitalData can be exported.')
            return

        path = config.get_key('paths', 'txt_export_start')
        if path == 'None':
            file_name, _ = QFileDialog.getSaveFileName(
                None, 'Save .itx File (*.itx)')
        else:
            start_path = str(__directory__ / path)
            file_name, _ = QFileDialog.getSaveFileName(
                None, 'Save .itx File (*.itx)', str(start_path))

        if not file_name:
            return

        export_energies = eval(config.get_key('orbital', 'export_energies'))
        if isinstance(export_energies, dict):
            export_energies = np.linspace(export_energies['min'],
                                          export_energies['max'],
                                          export_energies['num'],
                                          endpoint=True)

        kmaps = []
        old_energy = self.cube_options.energy_spinbox.value()
        for energy in export_energies:
            self.cube_options.energy_spinbox.setValue(energy)
            kmaps.append(self.get_displayed_plot_data().data)
        self.cube_options.energy_spinbox.setValue(old_energy)
        kmaps = np.array(kmaps)
        xrange, yrange = self.get_displayed_plot_data().range
        shape = kmaps[0].shape
        xscale = (xrange[1] - xrange[0]) / shape[1]
        yscale = (yrange[1] - yrange[0]) / shape[0]
        name = Path(file_name).stem

        with open(file_name, 'w') as f:
            f.write('IGOR\n')
            f.write(
                f'WAVES/N=({shape[1]},{shape[0]},{len(export_energies)})\t{name}\n'
            )
            f.write('BEGIN\n')
            for data in kmaps:
                f.write('\t')
                np.savetxt(f, data.T, newline='\t')
            f.write('\nEND\n')
            f.write(f'X SetScale/P x {xrange[0]},{xscale}, "A^-1", {name}; ')
            f.write(f'SetScale/P y {yrange[0]},{yscale}, "A^-1", {name}; ')
            f.write(
                f'SetScale/P z {export_energies[0]},{export_energies[1]-export_energies[0]}, "eV", {name}; '
            )
            f.write(f'SetScale d 0,0, "", {name}\n')

    def display_in_matplotlib(self):
        data = self.model.displayed_plot_data
        LUT = self.plot_item.get_LUT()

        window = MatplotlibImageWindow(data, LUT=LUT)

        return window

    def change_kinetic_energy(self, energy):
        self.cube_options.set_kinetic_energy(energy)

    def closeEvent(self, event):
        del self.model

        Tab.closeEvent(self, event)

    def get_plot_labels(self):
        bottom = self.plot_item.get_label('bottom')
        left = self.plot_item.get_label('left')
        return bottom, left

    def save_state(self):

        orbital_save = []
        for orbital in self.model.orbitals:
            orbital_save.append({
                'ID': orbital[4],
                'load_type': orbital[1],
                'load_args': orbital[2],
                'meta_data': orbital[3]
            })

        save = {
            'orbitals': orbital_save,
            'title': self.title,
            'table': self.table.save_state(),
            'interpolation': self.interpolation.save_state(),
            'colormap': self.colormap.save_state(),
            'crosshair': self.crosshair.save_state(),
            'polarization': self.polarization.save_state(),
            'cube_options': self.cube_options.save_state(),
            'real_space_options': self.real_space_options.save_state(),
            'colorscale': self.plot_item.get_colormap(),
            'levels': self.plot_item.get_levels()
        }

        return save, []

    def _setup(self):
        self.crosshair = CrosshairAnnulus(self.plot_item)
        self.colormap = Colormap([self.plot_item])
        self.interpolation = Interpolation()

        layout = self.scroll_area.widget().layout()
        layout.insertWidget(4, self.interpolation)
        layout.insertWidget(3, self.colormap)
        layout.insertWidget(5, self.crosshair)

        self.mini_real_plot.set_options(self.real_space_options)
        self.mini_3Dkspace_plot.set_options(self.real_space_options)

        # Rough axis values for all orbitals to set labels for interpolation
        x = Axis('kx', '1/Å', [-3, 3], 200)
        y = Axis('ky', '1/Å', [-3, 3], 200)
        self.interpolation.set_label(x, y)
        self.plot_item.set_labels(x, y)

        self.title = 'Orbitals'

    def _connect(self):
        self.crosshair.crosshair_changed.connect(self.crosshair_changed)
        self.table.orbital_changed.connect(self.orbitals_changed)
        self.table.orbital_removed.connect(self.remove_orbital_by_ID)
        self.table.orbital_selected.connect(self.refresh_mini_plots)
        self.polarization.polarization_changed.connect(self.change_parameter)
        self.polarization.polarization_changed.connect(
            self.refresh_mini_plot_polarization)
        self.cube_options.symmetrization_changed.connect(self.change_parameter)
        self.cube_options.energy_changed.connect(self.change_parameter)
        self.cube_options.V0_changed.connect(self.change_parameter)
        self.cube_options.resolution_changed.connect(self.change_parameter)
        self.cube_options.get_match_energy.connect(self.get_energy.emit)

        self.interpolation.smoothing_changed.connect(self.refresh_plot)
        self.interpolation.interpolation_changed.connect(self.refresh_plot)
Ejemplo n.º 7
0
class OrbitalDataTab(Tab, OrbitalDataTab_UI):

    orbital_removed = pyqtSignal(int)
    orbital_added = pyqtSignal(int)

    def __init__(self):

        # Setup GUI
        super(OrbitalDataTab, self).__init__()
        self.setupUi(self)
        self._setup()
        self._connect()

        self.model = OrbitalDataTabModel(self)

    def add_orbital_from_filepath(self, path):

        orbital = self.model.load_data_from_path(path)
        self.add_orbital(orbital)

    def add_orbital_from_online(self, URL, meta_data={}):

        orbital = self.model.load_data_from_online(URL, meta_data)
        self.add_orbital(orbital)

    def get_orbitals(self):

        return self.model.orbitals

    def add_orbital(self, orbital):

        if 'orientation' in orbital.meta_data:
            orientation = orbital.meta_data['orientation']

        else:
            orientation = 'xy'

        self.table.add_orbital(orbital, orientation)

        self.refresh_plot()

        self.orbital_added.emit(orbital.ID)

    def refresh_plot(self):

        data = self.model.update_displayed_plot_data()

        data = self.interpolation.interpolate(data)
        data = self.interpolation.smooth(data)

        self.plot_item.plot(data)

    def refresh_mini_plots(self, ID, orbital_changed=True):

        parameters = self.get_parameters(ID)
        phi, theta, psi = parameters[3:6]
        E_kin = parameters[1]

        if orbital_changed:
            orbital = self.model.ID_to_orbital(ID)
            self.mini_3Dkspace_plot.set_orbital(orbital, ID)
            self.mini_real_plot.set_orbital(orbital)

        self.mini_3Dkspace_plot.change_energy(E_kin)
        self.mini_3Dkspace_plot.rotate_orbital(phi, theta, psi)
        self.mini_real_plot.rotate_orbital(phi, theta, psi)

    def refresh_mini_plot_polarization(self):

        polarization, alpha, beta = self.polarization.get_parameters()[1:4]

        self.mini_real_plot.rotate_photon(polarization, alpha, beta)

    def get_crosshair(self):

        return self.crosshair

    def get_parameters(self, ID):

        kinetic_energy, dk, symmetry = self.cube_options.get_parameters()
        parameters = self.table.get_parameters_by_ID(ID)
        weight, *orientation = parameters
        polarization = self.polarization.get_parameters()

        return (weight, kinetic_energy, dk, *orientation, *polarization,
                symmetry)

    def get_use(self, ID):

        return self.table.get_use_by_ID(ID)

    def get_displayed_plot_data(self):

        return self.model.displayed_plot_data

    def crosshair_changed(self):

        self.crosshair.update_label()

    def change_parameter(self):

        self.refresh_plot()

        ID = self.mini_3Dkspace_plot.ID
        if ID is not None:
            self.refresh_mini_plots(ID, orbital_changed=False)

    def orbitals_changed(self, ID):

        self.refresh_plot()

        current_ID = self.mini_3Dkspace_plot.ID
        if current_ID is None or current_ID == ID:
            self.refresh_mini_plots(ID, orbital_changed=False)

    def remove_orbital_by_ID(self, ID):

        orbital = self.model.remove_orbital_by_ID(ID)

        self.refresh_plot()
        self.mini_3Dkspace_plot.set_orbital(None, ID)
        self.mini_real_plot.set_orbital(None)

        self.orbital_removed.emit(ID)

    def display_in_matplotlib(self):

        data = self.model.displayed_plot_data
        LUT = self.plot_item.get_LUT()

        window = MatplotlibWindow(data, LUT=LUT)

        return window

    def closeEvent(self, event):

        del self.model

        Tab.closeEvent(self, event)

    def get_plot_labels(self):

        bottom = self.plot_item.get_label('bottom')
        left = self.plot_item.get_label('left')
        return bottom, left

    def _setup(self):

        self.crosshair = CrosshairAnnulus(self.plot_item)
        self.colormap = Colormap([self.plot_item])
        self.interpolation = Interpolation()

        layout = self.scroll_area.widget().layout()
        layout.insertWidget(4, self.interpolation)
        layout.insertWidget(3, self.colormap)
        layout.insertWidget(5, self.crosshair)

        self.mini_real_plot.set_options(self.real_space_options)
        self.mini_3Dkspace_plot.set_options(self.real_space_options)

        # Rough axis values for all orbitals to set labels for interpolation
        x = Axis('kx', '1/Å', [-3, 3], 200)
        y = Axis('ky', '1/Å', [-3, 3], 200)
        self.interpolation.set_label(x, y)
        self.plot_item.set_labels(x, y)

        self.title = 'Orbitals'

    def _connect(self):

        self.crosshair.crosshair_changed.connect(self.crosshair_changed)
        self.table.orbital_changed.connect(self.orbitals_changed)
        self.table.orbital_removed.connect(self.remove_orbital_by_ID)
        self.table.orbital_selected.connect(self.refresh_mini_plots)
        self.polarization.polarization_changed.connect(self.change_parameter)
        self.polarization.polarization_changed.connect(
            self.refresh_mini_plot_polarization)
        self.cube_options.symmetrization_changed.connect(self.change_parameter)
        self.cube_options.energy_changed.connect(self.change_parameter)
        self.cube_options.resolution_changed.connect(self.change_parameter)

        self.interpolation.smoothing_changed.connect(self.refresh_plot)
        self.interpolation.interpolation_changed.connect(self.refresh_plot)