diff --git a/Dans_Diffraction/classes_plotting.py b/Dans_Diffraction/classes_plotting.py index a211012..f62aaae 100644 --- a/Dans_Diffraction/classes_plotting.py +++ b/Dans_Diffraction/classes_plotting.py @@ -175,7 +175,7 @@ def plot_distance(self, min_d=0.65, max_d=3.20, labels=None, axs[i].hist(dist[site]['dist'], range=ranges, bins=int((ranges[1] - ranges[0]) / step)) axs[i].set(ylabel='n. Atoms') - axs[-1].set(xlabel='$\AA$') + axs[-1].set(xlabel=r'$\AA$') if len(dist) > 1: for ax in axs.flat: ax.label_outer() @@ -955,7 +955,86 @@ def plot_3Dlattice(self,q_max=4.0,x_axis=[1,0,0],y_axis=[0,1,0],centre=[0,0,0],c ax.set_zlim3d(-q_max, q_max) fp.labels(self.xtl.name,'Qx','Qy','Qz') - + + def plot_3Dintensity(self, q_max=4.0, central_hkl=(0, 0, 0), show_forbidden=False): + """ + Plot Reciprocal Space lattice points in 3D, with point size and colour based on the intensity + """ + from matplotlib.colors import Normalize + + # Generate lattice of reciprocal space points + hmax, kmax, lmax = fc.maxHKL(q_max, self.xtl.Cell.UVstar()) + HKL = fc.genHKL([hmax, -hmax], [kmax, -kmax], [lmax, -lmax]) + HKL = HKL + central_hkl # reflection about central reflection + Q = self.xtl.Cell.calculateQ(HKL) + intensity = self.xtl.Scatter.intensity(HKL) + reflections = intensity > 0.1 + extinctions = intensity < 0.1 + + # Create plot + fig = plt.figure(figsize=self._figure_size, dpi=self._figure_dpi) + ax = fig.add_subplot(111, projection='3d') + + # Create cell box + uvw = np.array([[0., 0, 0], [1, 0, 0], [1, 0, 1], [1, 1, 1], [1, 1, 0], [0, 1, 0], [0, 1, 1], + [0, 0, 1], [1, 0, 1], [1, 0, 0], [1, 1, 0], [1, 1, 1], [0, 1, 1], [0, 1, 0], [0, 0, 0], + [0, 0, 1]]) + bpos = self.xtl.Cell.calculateQ(uvw + central_hkl) + ax.plot(bpos[:, 0], bpos[:, 1], bpos[:, 2], '-', c='k') # cell box + fp.plot_arrow(bpos[[0, 1], 0], bpos[[0, 1], 1], bpos[[0, 1], 2], col='r', width=4, arrow_size=10) # a* + fp.plot_arrow(bpos[[0, 5], 0], bpos[[0, 5], 1], bpos[[0, 5], 2], col='g', width=4, arrow_size=10) # b* + fp.plot_arrow(bpos[[0, 7], 0], bpos[[0, 7], 1], bpos[[0, 7], 2], col='b', width=4, arrow_size=10) # c* + + cmap = plt.get_cmap('hot_r') + vmin, vmax = 0, np.median(intensity[intensity > 0.1]) + + norm_intensity = intensity / intensity.max() + # colours = cmap(norm_intensity) + norm = Normalize(vmin=vmin, vmax=vmax) + max_point_size = 500 + sizes = max_point_size * norm_intensity + + # Reflections + sct = ax.scatter(Q[reflections,0], Q[reflections,1], Q[reflections,2], + c=intensity[reflections], s=sizes[reflections], + marker='o', cmap=cmap, norm=norm) + # Extinctions + if show_forbidden: + ax.scatter(Q[extinctions,0], Q[extinctions,1], Q[extinctions,2], marker='x', c='k', s=20) + + cx, cy, cz = self.xtl.Cell.calculateQ(central_hkl).squeeze() + ax.set_xlim3d(cx - 2 * q_max, cx + 2 * q_max) + ax.set_ylim3d(cy - 2 * q_max, cy + 2 * q_max) + ax.set_zlim3d(cz - 2 * q_max, cz + 2 * q_max) + + fp.labels(self.xtl.name, 'Qx', 'Qy', 'Qz') + plt.colorbar(sct, label='intensity') + + def plot_intensity_histogram(self, q_max=4.0): + """ + Plot histogram of intensity of reflections + """ + # Generate lattice of reciprocal space points + hmax, kmax, lmax = fc.maxHKL(q_max, self.xtl.Cell.UVstar()) + HKL = fc.genHKL([hmax, -hmax], [kmax, -kmax], [lmax, -lmax]) + # HKL = HKL + centre # reflection about central reflection + Q = self.xtl.Cell.calculateQ(HKL) + qmag = fg.mag(Q) + intensity = self.xtl.Scatter.intensity(HKL) + + n_bins = 100 if len(qmag) > 100 else len(qmag) + log_bins = np.logspace(0, np.log10(intensity.max()), n_bins) + + fig = plt.figure(figsize=self._figure_size, dpi=self._figure_dpi) + ax = fig.add_subplot(111) + # ax.hist(np.log10(intensity[intensity > 0]), bins=log_bins) + ax.hist(np.log10(intensity + 1), bins=log_bins) + ax.set_xscale('log') + ax.set_xlabel('intensity') + ax.set_ylabel('Count') + ax.set_title(self.xtl.name) + + def quick_intensity_cut(self,x_axis=[1,0,0],y_axis=[0,1,0],centre=[0,0,0], q_max=4.0,cut_width=0.05): """ Plot a cut through reciprocal space, visualising the intensity as different sized markers diff --git a/Dans_Diffraction/functions_plotting.py b/Dans_Diffraction/functions_plotting.py index b1702a0..d44b7a1 100644 --- a/Dans_Diffraction/functions_plotting.py +++ b/Dans_Diffraction/functions_plotting.py @@ -135,11 +135,8 @@ def labels(ttl=None, xvar=None, yvar=None, zvar=None, legend=False, size='Normal plt.gca().set_ylabel(yvar, fontsize=lab, fontname=font) if zvar is not None: - # Don't think this works, use ax.set_zaxis plt.gca().set_zlabel(zvar, fontsize=lab, fontname=font) - for t in plt.gca().zaxis.get_major_ticks(): - t.label.set_fontsize(tik) - t.label.set_fontname(font) + plt.gca().zaxis.set_tick_params(labelsize=lab, labelfontfamily=font) if legend: plt.legend(loc=0, frameon=False, prop={'size': leg, 'family': 'serif'}) diff --git a/Dans_Diffraction/tkgui/scattering.py b/Dans_Diffraction/tkgui/scattering.py index 214f224..d8b14b7 100644 --- a/Dans_Diffraction/tkgui/scattering.py +++ b/Dans_Diffraction/tkgui/scattering.py @@ -18,548 +18,6 @@ btn_txt, ety_txt, opt_txt) -class ScatteringGuiOLD: - """ - Simulate scattering of various forms - """ - - def __init__(self, xtl): - """Initialise""" - self.xtl = xtl - # Create Tk inter instance - self.root = tk.Tk() - self.root.wm_title('Scattering %s' % xtl.name) - # self.root.minsize(width=640, height=480) - self.root.maxsize(width=self.root.winfo_screenwidth(), height=self.root.winfo_screenheight()) - self.root.tk_setPalette( - background=bkg, - foreground=txtcol, - activeBackground=opt_active, - activeForeground=txtcol - ) - - # ---Menu--- - menu = { - 'Info': { - 'Crystal': self.menu_info_crystal, - 'Scattering Settings': self.menu_info_scattering, - }, - 'Defaults': { - 'Supernova': self.fun_supernova, - 'Wish': self.fun_wish, - 'I16': self.fun_i16, - } - } - topmenu(self.root, menu) - - frame = tk.Frame(self.root) - frame.pack(side=tk.LEFT, anchor=tk.N) - - # Variatbles - self.energy_kev = tk.DoubleVar(frame, 8.0) - self.wavelenth_a = tk.DoubleVar(frame, 1.5498) - self.neutron_wl = tk.DoubleVar(frame, False) - self.electron_wl = tk.DoubleVar(frame, False) - self.edge = tk.StringVar(frame, 'Edge') - self.type = tk.StringVar(frame, 'X-Ray') - self.orientation = tk.StringVar(frame, 'None') - self.direction_h = tk.IntVar(frame, 0) - self.direction_k = tk.IntVar(frame, 0) - self.direction_l = tk.IntVar(frame, 1) - self.theta_offset = tk.DoubleVar(frame, 0.0) - self.theta_min = tk.DoubleVar(frame, -180.0) - self.theta_max = tk.DoubleVar(frame, 180.0) - self.twotheta_min = tk.DoubleVar(frame, -180.0) - self.twotheta_max = tk.DoubleVar(frame, 180.0) - self.powder_units = tk.StringVar(frame, 'Two-Theta') - self.powderaverage = tk.BooleanVar(frame, True) - self.powder_width = tk.DoubleVar(frame, 0.01) - self.hkl_check = tk.StringVar(frame, '0 0 1') - self.hkl_result = tk.StringVar(frame, 'I:%10.0f TTH:%8.2f' % (0, 0)) - self.close_twotheta = tk.DoubleVar(frame, 2) - self.close_angle = tk.DoubleVar(frame, 10) - self.val_i = tk.IntVar(frame, 0) - - # X-ray edges: - self.xr_edges, self.xr_energies = self.xtl.Properties.xray_edges() - self.xr_edges.insert(0, 'Cu Ka') - self.xr_edges.insert(1, 'Mo Ka') - self.xr_energies.insert(0, fg.Cu) - self.xr_energies.insert(1, fg.Mo) - - # --- Top Buttons --- - line = tk.Frame(frame) - line.pack(side=tk.TOP, fill=tk.X, pady=5) - - var = tk.Label(line, text='Scattering', font=LF) - var.pack(side=tk.LEFT) - - # ---Settings--- - frm = tk.Frame(frame) - frm.pack(side=tk.TOP, fill=tk.BOTH, padx=5, pady=5) - box = tk.LabelFrame(frm, text='Settings') - box.pack(side=tk.LEFT, fill=tk.BOTH, padx=5, pady=5) - - # Energy - line = tk.Frame(box) - line.pack(side=tk.TOP, fill=tk.X, pady=5) - var = tk.Label(line, text='Energy (keV):', font=SF) - var.pack(side=tk.LEFT) - var = tk.OptionMenu(line, self.edge, *self.xr_edges, command=self.fun_edge) - var.config(font=SF, width=5, bg=opt, activebackground=opt_active) - var["menu"].config(bg=opt, bd=0, activebackground=opt_active) - var.pack(side=tk.LEFT) - var = tk.Entry(line, textvariable=self.energy_kev, font=TF, width=8, bg=ety, fg=ety_txt) - var.pack(side=tk.LEFT) - var.bind('', self.fun_energy) - var.bind('', self.fun_energy) - - # Wavelength - line = tk.Frame(box) - line.pack(side=tk.TOP, fill=tk.X, pady=5) - var = tk.Label(line, text=u'Wavelength (\u212B):', font=SF) - var.pack(side=tk.LEFT) - var = tk.Entry(line, textvariable=self.wavelenth_a, font=TF, width=8, bg=ety, fg=ety_txt) - var.pack(side=tk.LEFT) - var.bind('', self.fun_wavelength) - var.bind('', self.fun_wavelength) - var = tk.Checkbutton(line, text='Neutron', variable=self.neutron_wl, font=SF, command=self.fun_wavelength) - var.pack(side=tk.LEFT, padx=5) - var = tk.Checkbutton(line, text='Electron', variable=self.electron_wl, font=SF, command=self.fun_wavelength) - var.pack(side=tk.LEFT, padx=5) - - # Scattering Type - line = tk.Frame(box) - line.pack(side=tk.TOP, fill=tk.X, pady=5) - types = ['X-Ray', 'Neutron', 'Electron', 'XRay Magnetic', 'Neutron Magnetic', 'XRay Resonant', 'XRay Dispersion'] - var = tk.Label(line, text='Type:', font=SF) - var.pack(side=tk.LEFT) - var = tk.OptionMenu(line, self.type, *types) - var.config(font=SF, width=10, bg=opt, activebackground=opt_active) - var["menu"].config(bg=opt, bd=0, activebackground=opt_active) - var.pack(side=tk.LEFT) - - # Units - xaxistypes = ['two-theta', 'd-spacing', 'Q'] - var = tk.Label(line, text='Units:', font=SF) - var.pack(side=tk.LEFT) - var = tk.OptionMenu(line, self.powder_units, *xaxistypes) - var.config(font=SF, width=10, bg=opt, activebackground=opt_active) - var["menu"].config(bg=opt, bd=0, activebackground=opt_active) - var.pack(side=tk.LEFT) - - # Orientation - line = tk.Frame(box) - line.pack(side=tk.TOP, fill=tk.X, pady=5) - var = tk.Label(line, text='Geometry:', font=SF) - var.pack(side=tk.LEFT) - orients = ['None', 'Reflection', 'Transmission'] - var = tk.OptionMenu(line, self.orientation, *orients) - var.config(font=SF, width=10, bg=opt, activebackground=opt_active) - var["menu"].config(bg=opt, bd=0, activebackground=opt_active) - var.pack(side=tk.LEFT) - - # Direction - var = tk.Label(line, text='Direction:', font=SF) - var.pack(side=tk.LEFT) - var = tk.Entry(line, textvariable=self.direction_h, font=TF, width=2, bg=ety, fg=ety_txt) - var.pack(side=tk.LEFT) - var = tk.Entry(line, textvariable=self.direction_k, font=TF, width=2, bg=ety, fg=ety_txt) - var.pack(side=tk.LEFT) - var = tk.Entry(line, textvariable=self.direction_l, font=TF, width=2, bg=ety, fg=ety_txt) - var.pack(side=tk.LEFT) - - # Theta offset - line = tk.Frame(box) - line.pack(side=tk.TOP, fill=tk.X, pady=5) - var = tk.Label(line, text='Offset:', font=SF) - var.pack(side=tk.LEFT) - var = tk.Entry(line, textvariable=self.theta_offset, font=TF, width=5, bg=ety, fg=ety_txt) - var.pack(side=tk.LEFT) - - # Theta min - var = tk.Label(line, text='Min Theta:', font=SF) - var.pack(side=tk.LEFT) - var = tk.Entry(line, textvariable=self.theta_min, font=TF, width=5, bg=ety, fg=ety_txt) - var.pack(side=tk.LEFT) - - # Theta max - var = tk.Label(line, text='Max Theta:', font=SF) - var.pack(side=tk.LEFT) - var = tk.Entry(line, textvariable=self.theta_max, font=TF, width=5, bg=ety, fg=ety_txt) - var.pack(side=tk.LEFT) - - # TwoTheta min - line = tk.Frame(box) - line.pack(side=tk.TOP, fill=tk.X, pady=5) - var = tk.Label(line, text='Min TwoTheta:', font=SF) - var.pack(side=tk.LEFT) - var = tk.Entry(line, textvariable=self.twotheta_min, font=TF, width=5, bg=ety, fg=ety_txt) - var.pack(side=tk.LEFT) - - # TwoTheta max - var = tk.Entry(line, textvariable=self.twotheta_max, font=TF, width=5, bg=ety, fg=ety_txt) - var.pack(side=tk.RIGHT) - var = tk.Label(line, text='Max TwoTheta:', font=SF) - var.pack(side=tk.RIGHT) - - # Powder width - line = tk.Frame(box) - line.pack(side=tk.TOP, fill=tk.X, pady=5) - var = tk.Label(line, text='Powder peak width:', font=SF) - var.pack(side=tk.LEFT, padx=3) - var = tk.Entry(line, textvariable=self.powder_width, font=TF, width=5, bg=ety, fg=ety_txt) - var.pack(side=tk.LEFT) - - # Powder average tickbox - var = tk.Checkbutton(line, text='Powder average', variable=self.powderaverage, font=SF) - var.pack(side=tk.LEFT, padx=6) - - # ---Intensities--- - right = tk.Frame(frm) - right.pack(side=tk.LEFT, fill=tk.BOTH) - box = tk.LabelFrame(right, text='Intensities') - box.pack(side=tk.TOP, fill=tk.BOTH, padx=5, pady=5) - - line = tk.Frame(box) - line.pack(side=tk.TOP, fill=tk.X, pady=5) - - var = tk.Button(line, text='Display Intensities', font=BF, command=self.fun_intensities, bg=btn2, - activebackground=btn_active) - var.pack(side=tk.LEFT) - - var = tk.Button(line, text='Plot Powder', font=BF, command=self.fun_powder, bg=btn, - activebackground=btn_active) - var.pack(side=tk.LEFT) - - # ---hkl check--- - hklbox = tk.LabelFrame(box, text='HKL Check') - hklbox.pack(side=tk.TOP, fill=tk.X, pady=5) - line = tk.Frame(hklbox) - line.pack(side=tk.TOP) - var = tk.Entry(line, textvariable=self.hkl_check, font=TF, width=6, bg=ety, fg=ety_txt) - var.pack(side=tk.LEFT) - var.bind('', self.fun_hklcheck) - var.bind('', self.fun_hklcheck) - var = tk.Button(line, text='sym', font=TF, command=self.fun_hklsym, bg=btn, - activebackground=btn_active) - var.pack(side=tk.LEFT, pady=2) - var = tk.Label(line, textvariable=self.hkl_result, font=TF, width=22) - var.pack(side=tk.LEFT) - var = tk.Button(line, text='Check HKL', font=BF, command=self.fun_hklcheck, bg=btn, - activebackground=btn_active) - var.pack(side=tk.LEFT, pady=2) - - line = tk.Frame(hklbox) - line.pack(side=tk.TOP) - var = tk.Button(line, text='Atomic Contributions', font=BF, command=self.fun_hklatom, bg=btn, - activebackground=btn_active) - var.pack(side=tk.LEFT, pady=2) - var = tk.Button(line, text='Symmetry Contributions', font=BF, command=self.fun_hklsymmetry, bg=btn, - activebackground=btn_active) - var.pack(side=tk.LEFT, pady=2) - - line = tk.Frame(hklbox) - line.pack(side=tk.TOP) - var = tk.Label(line, text=u'\u0394 Two Theta:', font=SF) - var.pack(side=tk.LEFT, padx=3) - var = tk.Entry(line, textvariable=self.close_twotheta, font=TF, width=6, bg=ety, fg=ety_txt) - var.pack(side=tk.LEFT) - var = tk.Label(line, text=u'\u0394 Angle:', font=SF) - var.pack(side=tk.LEFT, padx=3) - var = tk.Entry(line, textvariable=self.close_angle, font=TF, width=6, bg=ety, fg=ety_txt) - var.pack(side=tk.LEFT) - var = tk.Button(line, text='Close Refs', font=TF, command=self.fun_closerefs, bg=btn, - activebackground=btn_active) - var.pack(side=tk.LEFT, pady=2) - - # ---HKL Planes--- - box = tk.LabelFrame(right, text='Reciprocal Space Planes') - box.pack(side=tk.TOP, fill=tk.BOTH, padx=5, pady=5) - - side = tk.Frame(box) - side.pack(side=tk.LEFT, pady=5) - - # i value - var = tk.Label(side, text='i:', font=SF) - var.pack(side=tk.LEFT) - var = tk.Entry(side, textvariable=self.val_i, font=TF, width=3, bg=ety, fg=ety_txt) - var.pack(side=tk.LEFT) - - # directions - vframe = tk.Frame(side) - vframe.pack(side=tk.LEFT, padx=3) - var = tk.Button(vframe, text='HKi', font=BF, command=self.fun_hki, width=5, bg=btn, activebackground=btn_active) - var.pack() - var = tk.Button(vframe, text='HiL', font=BF, command=self.fun_hil, width=5, bg=btn, activebackground=btn_active) - var.pack() - - vframe = tk.Frame(side) - vframe.pack(side=tk.LEFT) - var = tk.Button(vframe, text='iKL', font=BF, command=self.fun_ikl, width=5, bg=btn, activebackground=btn_active) - var.pack() - var = tk.Button(vframe, text='HHi', font=BF, command=self.fun_hhi, width=5, bg=btn, activebackground=btn_active) - var.pack() - - side = tk.Frame(box) - side.pack(side=tk.LEFT, padx=5, pady=5) - var = tk.Button(side, text='Arbitary Cut', font=BF, command=self.fun_cut, bg=btn, - activebackground=btn_active) - var.pack() - - # ---X-ray Magnetic scattering--- - box = tk.Frame(right) - box.pack(side=tk.TOP, fill=tk.BOTH, padx=5, pady=5) - var = tk.Button(box, text='X-Ray Magnetic Scattering', font=BF, command=self.fun_rxs, bg=btn, - activebackground=btn_active) - var.pack(fill=tk.X) - - ################################################################################### - ################################# MENU ############################################ - ################################################################################### - def menu_info_crystal(self): - """Crystal info""" - string = '%s\n%s' % (self.xtl.filename, self.xtl.info()) - StringViewer(string, self.xtl.name, width=60) - - def menu_info_scattering(self): - """Scattering info""" - self.fun_get() - string = '%s\n%s' % (self.xtl.name, self.xtl.Scatter) - StringViewer(string, self.xtl.name, width=60) - - ################################################################################### - ############################## FUNCTIONS ########################################## - ################################################################################### - def fun_set(self): - """"Set gui parameters from crystal""" - - self.type.set(self.xtl._scattering_type) - # self.energy_kev.set(8) - self.theta_offset.set(self.xtl._scattering_theta_offset) - self.theta_min.set(self.xtl._scattering_min_theta) - self.theta_max.set(self.xtl._scattering_max_theta) - self.twotheta_min.set(self.xtl._scattering_min_two_theta) - self.twotheta_max.set(self.xtl._scattering_max_two_theta) - - if self.orientation.get() == 'Reflection': - self.direction_h.set(self.xtl._scattering_specular_direction[0]) - self.direction_k.set(self.xtl._scattering_specular_direction[1]) - self.direction_l.set(self.xtl._scattering_specular_direction[2]) - else: - self.direction_h.set(self.xtl._scattering_parallel_direction[0]) - self.direction_k.set(self.xtl._scattering_parallel_direction[1]) - self.direction_l.set(self.xtl._scattering_parallel_direction[2]) - - def fun_get(self): - """Set crytal parameters from gui""" - - scat = self.xtl.Scatter - scat._scattering_type = self.type.get() - scat._energy_kev = self.energy_kev.get() - scat._scattering_theta_offset = self.theta_offset.get() - scat._scattering_min_theta = self.theta_min.get() - scat._scattering_max_theta = self.theta_max.get() - scat._scattering_min_twotheta = self.twotheta_min.get() - scat._scattering_max_twotheta = self.twotheta_max.get() - scat._powder_units = self.powder_units.get() - - if self.orientation.get() == 'Reflection': - scat._scattering_specular_direction[0] = self.direction_h.get() - scat._scattering_specular_direction[1] = self.direction_k.get() - scat._scattering_specular_direction[2] = self.direction_l.get() - elif self.orientation.get() == 'Transmission': - scat._scattering_parallel_direction[0] = self.direction_h.get() - scat._scattering_parallel_direction[1] = self.direction_k.get() - scat._scattering_parallel_direction[2] = self.direction_l.get() - - def fun_get_hkl(self): - """Get quick check hkl""" - self.fun_get() - hkl = self.hkl_check.get() - return fg.str2array(hkl) - - def fun_i16(self): - """"Add I16 parameters""" - - self.type.set('X-Ray') - self.energy_kev.set(8.0) - self.edge.set('Edge') - self.powder_units.set('Two-Theta') - self.powderaverage.set(False) - self.orientation.set('Reflection') - self.theta_offset.set(0.0) - self.theta_min.set(-20.0) - self.theta_max.set(150.0) - self.twotheta_min.set(0.0) - self.twotheta_max.set(130.0) - - def fun_wish(self): - """"Add Wish parameters""" - - self.type.set('Neutron') - self.energy_kev.set(17.7) - self.edge.set('Edge') - self.powder_units.set('d-spacing') - self.orientation.set('None') - self.theta_offset.set(0.0) - self.theta_min.set(-180.0) - self.theta_max.set(180.0) - self.twotheta_min.set(10.0) - self.twotheta_max.set(170.0) - - def fun_supernova(self): - """Add SuperNova parameters""" - - self.type.set('X-Ray') - idx = self.xr_edges.index('Mo Ka') - self.edge.set('Mo Ka') - self.energy_kev.set(self.xr_energies[idx]) - self.powder_units.set('Two-Theta') - self.orientation.set('None') - self.theta_offset.set(0.0) - self.theta_min.set(-180.0) - self.theta_max.set(180.0) - self.twotheta_min.set(-170.0) - self.twotheta_max.set(170.0) - - def fun_energy(self, event=None): - """Set wavelength""" - energy_kev = self.energy_kev.get() - if self.neutron_wl.get(): - self.wavelenth_a.set(round(fc.neutron_wavelength(1e6 * energy_kev), 4)) - elif self.electron_wl.get(): - self.wavelenth_a.set(round(fc.electron_wavelength(1000 * energy_kev), 4)) - else: - self.wavelenth_a.set(round(fc.energy2wave(energy_kev), 4)) - - def fun_wavelength(self, event=None): - """Set energy""" - wavelength_a = self.wavelenth_a.get() - if self.neutron_wl.get(): - self.electron_wl.set(False) - self.energy_kev.set(round(fc.neutron_energy(wavelength_a) / 1e6, 4)) - elif self.electron_wl.get(): - self.neutron_wl.set(False) - self.energy_kev.set(round(fc.electron_energy(wavelength_a) / 1000, 4)) - else: - self.energy_kev.set(round(fc.wave2energy(wavelength_a), 4)) - - def fun_edge(self, event=None): - """X-ray edge option menu""" - edge = self.edge.get() - if self.edge.get() in self.xr_edges: - idx = self.xr_edges.index(edge) - self.energy_kev.set(self.xr_energies[idx]) - self.fun_energy() - - def fun_hklcheck(self, event=None): - """"Show single hkl intensity""" - - hkl = self.fun_get_hkl() - I = self.xtl.Scatter.intensity(hkl) - - unit = self.powder_units.get() - energy = self.energy_kev.get() - tth = self.xtl.Cell.tth(hkl, energy) - - if unit.lower() in ['tth', 'angle', 'twotheta', 'theta', 'two-theta']: - self.hkl_result.set('I:%10.0f TTH:%8.2f' % (I, tth)) - elif unit.lower() in ['d', 'dspace', 'd-spacing', 'dspacing']: - q = fc.calqmag(tth, energy) - d = fc.q2dspace(q) - self.hkl_result.set(u'I:%10.0f d:%8.2f \u212B' % (I, d)) - else: - q = fc.calqmag(tth, energy) - self.hkl_result.set(u'I:%8.0f Q:%8.2f \u212B\u207B\u00B9' % (I, q)) - - def fun_hklsym(self): - """Print symmetric reflections""" - hkl = self.fun_get_hkl() - out = self.xtl.Scatter.print_symmetric_reflections(hkl) - StringViewer(out, 'Symmetric Reflections %s' % hkl) - - def fun_hklatom(self): - """Print atomic contributions""" - hkl = self.fun_get_hkl() - out = self.xtl.Scatter.print_atomic_contributions(hkl) - StringViewer(out, 'Atomic Contributions %s' % hkl, width=80) - - def fun_hklsymmetry(self): - """Print symmetry contributions""" - hkl = self.fun_get_hkl() - out = self.xtl.Scatter.print_symmetry_contributions(hkl) - StringViewer(out, 'Symmetric Contributions %s' % hkl, width=120) - - def fun_closerefs(self): - hkl = self.fun_get_hkl() - close_tth = self.close_twotheta.get() - close_ang = self.close_angle.get() - out = self.xtl.Scatter.find_close_reflections(hkl, max_twotheta=close_tth, max_angle=close_ang) - StringViewer(out, 'Close Reflections %s' % hkl) - - def fun_intensities(self): - """Display intensities""" - - self.fun_get() - if self.orientation.get() == 'Reflection': - string = self.xtl.Scatter.print_ref_reflections(min_intensity=-1, max_intensity=None) - elif self.orientation.get() == 'Transmission': - string = self.xtl.Scatter.print_tran_reflections(min_intensity=-1, max_intensity=None) - else: - units = self.powder_units.get() - string = self.xtl.Scatter.print_all_reflections(min_intensity=-1, max_intensity=None, units=units) - StringViewer(string, 'Intensities %s' % self.xtl.name) - - def fun_powder(self): - """Plot Powder""" - self.fun_get() - energy = self.energy_kev.get() - min_q = fc.calqmag(self.twotheta_min.get(), energy) - max_q = fc.calqmag(self.twotheta_max.get(), energy) - pow_avg = self.powderaverage.get() - pow_wid = self.powder_width.get() - #if min_q < 0: min_q = 0.0 - - self.xtl.Plot.simulate_powder(energy_kev=energy, peak_width=pow_wid, powder_average=pow_avg) - plt.show() - - def fun_hki(self): - """Plot hki plane""" - self.fun_get() - i = self.val_i.get() - self.xtl.Plot.simulate_hk0(i, peak_width=0.2) - plt.show() - - def fun_hil(self): - """Plot hil plane""" - self.fun_get() - i = self.val_i.get() - self.xtl.Plot.simulate_h0l(i, peak_width=0.2) - plt.show() - - def fun_ikl(self): - """Plot ikl plane""" - self.fun_get() - i = self.val_i.get() - self.xtl.Plot.simulate_0kl(i, peak_width=0.2) - plt.show() - - def fun_hhi(self): - """Plot hhl plane""" - self.fun_get() - i = self.val_i.get() - self.xtl.Plot.simulate_hhl(i, peak_width=0.2) - plt.show() - - def fun_cut(self): - self.fun_get() - ArbitaryCutGui(self.xtl) - - def fun_rxs(self): - ResonantXrayGui(self) - - class ScatteringGui: """ Simulate scattering of various forms @@ -597,7 +55,7 @@ def __init__(self, xtl): frame = tk.Frame(self.root) frame.pack(side=tk.LEFT, anchor=tk.N) - # Variatbles + # Variables self.radiation = tk.StringVar(frame, 'X-Ray') self.check_magnetic = tk.BooleanVar(frame, False) self.energy = tk.DoubleVar(frame, 8.0) @@ -880,9 +338,14 @@ def __init__(self, xtl): side = tk.Frame(box) side.pack(side=tk.LEFT, padx=5, pady=5) - var = tk.Button(side, text='Arbitary Cut', font=BF, command=self.fun_cut, bg=btn, + frm = tk.Frame(side) + frm.pack(side=tk.TOP) + var = tk.Button(frm, text='3D', font=BF, command=self.fun_sf3d, bg=btn, activebackground=btn_active) - var.pack() + var.pack(side=tk.LEFT) + var = tk.Button(frm, text='Arbitary Cut', font=BF, command=self.fun_cut, bg=btn, + activebackground=btn_active) + var.pack(side=tk.LEFT) # clim frm = tk.Frame(side, relief=tk.RIDGE) frm.pack(side=tk.TOP, pady=10) @@ -1241,6 +704,11 @@ def fun_cut(self): self.fun_get() ArbitaryCutGui(self.xtl) + def fun_sf3d(self): + self.fun_get() + self.xtl.Plot.plot_3Dintensity() + plt.show() + def fun_clim(self, event=None): """Update clim""" try: diff --git a/Examples/example_3d_intensity.py b/Examples/example_3d_intensity.py new file mode 100644 index 0000000..d70c253 --- /dev/null +++ b/Examples/example_3d_intensity.py @@ -0,0 +1,24 @@ +""" +Dans_Diffraction Examples +Calculate crystal structure factors and display 3D plot of reciprocal space +""" + +import numpy as np +import matplotlib.pyplot as plt +import Dans_Diffraction as dif + +print(dif.version_info()) +dif.fp.set_plot_defaults() + +xtl = dif.structure_list.Diamond() + +xtl.Scatter.setup_scatter(scattering_type='xray') + +# xtl.Plot.plot_intensity_histogram() +xtl.Plot.plot_3Dintensity() + +xtl = dif.structure_list.LiCoO2() +xtl.Scatter.setup_scatter(scattering_type='xray') +xtl.Plot.plot_3Dintensity(q_max=1, show_forbidden=True, central_hkl=(0,0,6)) + +plt.show() \ No newline at end of file