diff --git a/beamtime/xrd/io.py b/beamtime/xrd/io.py index 910811b..c2447d8 100644 --- a/beamtime/xrd/io.py +++ b/beamtime/xrd/io.py @@ -400,7 +400,7 @@ def revert_offset(diffractogram,which=None): return diffractogram -def load_reflection_table(data, options={}): +def load_reflection_table(data: dict, reflections_params: dict, options={}): required_options = ['ref_wavelength', 'to_wavelength'] @@ -413,12 +413,12 @@ def load_reflection_table(data, options={}): # VESTA outputs the file with a header that has a space between the parameter and units - so there is some extra code to rectify the issue # that ensues from this formatting - reflections = pd.read_csv(data['path'], delim_whitespace=True) + reflections = pd.read_csv(reflections_params['path'], delim_whitespace=True) # Remove the extra column that appears from the headers issue reflections.drop(reflections.columns[-1], axis=1, inplace=True) - with open(data['path'], 'r') as f: + with open(reflections_params['path'], 'r') as f: line = f.readline() headers = line.split() @@ -434,13 +434,28 @@ def load_reflection_table(data, options={}): reflections = translate_wavelengths(data=reflections, wavelength=options['ref_wavelength'], to_wavelength=options['to_wavelength']) - #print(reflections) + if 'heatmap' in data.keys(): + + start_2th, stop_2th = data['diffractogram'][0]['2th'].min(), data['diffractogram'][0]['2th'].max() + len_2th = stop_2th - start_2th + #print(start_2th, stop_2th, len_2th) + + start_heatmap, stop_heatmap = 0, data['heatmap'].shape[1] + len_heatmap = stop_heatmap - start_heatmap + #print(start_heatmap, stop_heatmap, len_heatmap) + + scale = len_heatmap/len_2th + + #print(scale) + #print(stop_2th * scale) + + reflections['heatmap'] = (reflections['2th']-start_2th) * scale return reflections -def translate_wavelengths(data, wavelength, to_wavelength=None): +def translate_wavelengths(data: pd.DataFrame, wavelength: float, to_wavelength=None) -> pd.DataFrame: # FIXME Somewhere here there is an invalid arcsin-argument. Not sure where. pd.options.mode.chained_assignment = None diff --git a/beamtime/xrd/plot.py b/beamtime/xrd/plot.py index db60b1a..cc6baa3 100644 --- a/beamtime/xrd/plot.py +++ b/beamtime/xrd/plot.py @@ -80,6 +80,8 @@ def plot_diffractogram(data, options={}): # Generate heatmap data data['heatmap'], data['heatmap_xticks'], data['heatmap_xticklabels'] = generate_heatmap(data=data, options=options) + options['heatmap_loaded'] = True + if options['heatmap']: options['xlim'] = options['heatmap_xlim'] @@ -163,16 +165,16 @@ def plot_diffractogram(data, options={}): options['xlim'] = ax.get_xlim() options['to_wavelength'] = data['wavelength'][0] - for reference, axis in zip(options['reflections_data'], ref_axes): - plot_reflection_table(data=reference, ax=axis, options=options) + for reflections_params, axis in zip(options['reflections_data'], ref_axes): + plot_reflection_table(data=data, reflections_params=reflections_params, ax=axis, options=options) # Print the reflection indices. By default, the wavelength of the first diffractogram will be used for this. if options['reflections_indices'] and options['reflections_data']: options['xlim'] = ax.get_xlim() options['to_wavelength'] = data['wavelength'][0] - for reference in options['reflections_data']: - plot_reflection_indices(data=reference, ax=indices_ax, options=options) + for reflections_params in options['reflections_data']: + plot_reflection_indices(data=data, reflections_params=reflections_params, ax=indices_ax, options=options) if options['interactive_session_active']: @@ -533,7 +535,7 @@ def update_widgets(data, options): -def plot_reflection_indices(data, ax, options={}): +def plot_reflection_indices(data, reflections_params, ax, options={}): ''' Print reflection indices from output generated by VESTA. Required contents of data: @@ -547,20 +549,21 @@ def plot_reflection_indices(data, ax, options={}): 'hide_indices': False } - data = aux.update_options(options=data, required_options=required_options, default_options=default_options) + reflections_params = aux.update_options(options=reflections_params, required_options=required_options, default_options=default_options) - if not data['hide_indices']: - reflection_table = xrd.io.load_reflection_table(data=data, options=options) + if not reflections_params['hide_indices']: + reflection_table = xrd.io.load_reflection_table(data=data, reflections_params=reflections_params, options=options) - if data['reflection_indices'] > 0: + if reflections_params['reflection_indices'] > 0: # Get the data['reflection_indices'] number of highest reflections within the subrange options['xlim'] - reflection_indices = reflection_table.loc[(reflection_table[options['x_vals']] > options['xlim'][0]) & (reflection_table[options['x_vals']] < options['xlim'][1])].nlargest(options['reflection_indices'], 'I') + x_vals = 'heatmap' if options['heatmap'] else options['x_vals'] + reflection_indices = reflection_table.loc[(reflection_table[x_vals] > options['xlim'][0]) & (reflection_table[x_vals] < options['xlim'][1])].nlargest(options['reflection_indices'], 'I') # Plot the indices - for i in range(data['reflection_indices']): + for i in range(reflections_params['reflection_indices']): if reflection_indices.shape[0] > i: - ax.text(s=f'({reflection_indices["h"].iloc[i]} {reflection_indices["k"].iloc[i]} {reflection_indices["l"].iloc[i]})', x=reflection_indices[options['x_vals']].iloc[i], y=0, fontsize=2.5, rotation=90, va='bottom', ha='center', c=data['text_colour']) + ax.text(s=f'({reflection_indices["h"].iloc[i]} {reflection_indices["k"].iloc[i]} {reflection_indices["l"].iloc[i]})', x=reflection_indices[x_vals].iloc[i], y=0, fontsize=2.5, rotation=90, va='bottom', ha='center', c=reflections_params['text_colour']) if options['xlim']: @@ -571,7 +574,7 @@ def plot_reflection_indices(data, ax, options={}): return -def plot_reflection_table(data, ax=None, options={}): +def plot_reflection_table(data, reflections_params, ax=None, options={}): ''' Plots a reflection table from output generated by VESTA. Required contents of data: @@ -590,15 +593,15 @@ def plot_reflection_table(data, ax=None, options={}): } if 'colour' in data.keys(): - options['reflections_colour'] = data['colour'] - if 'min_alpha' in data.keys(): - options['min_alpha'] = data['min_alpha'] - if 'reflection_indices' in data.keys(): - options['reflection_indices'] = data['reflection_indices'] - if 'label' in data.keys(): - options['label'] = data['label'] - if 'wavelength' in data.keys(): - options['wavelength'] = data['wavelength'] + options['reflections_colour'] = reflections_params['colour'] + if 'min_alpha' in reflections_params.keys(): + options['min_alpha'] = reflections_params['min_alpha'] + if 'reflection_indices' in reflections_params.keys(): + options['reflection_indices'] = reflections_params['reflection_indices'] + if 'label' in reflections_params.keys(): + options['label'] = reflections_params['label'] + if 'wavelength' in reflections_params.keys(): + options['wavelength'] = reflections_params['wavelength'] options = aux.update_options(options=options, required_options=required_options, default_options=default_options) @@ -606,9 +609,10 @@ def plot_reflection_table(data, ax=None, options={}): if not ax: _, ax = btp.prepare_plot(options) - reflection_table = xrd.io.load_reflection_table(data=data, options=options) + x_vals = 'heatmap' if options['heatmap'] else options['x_vals'] - reflections, intensities = reflection_table[options['x_vals']], reflection_table['I'] + reflection_table = xrd.io.load_reflection_table(data=data, reflections_params=reflections_params, options=options) + reflections, intensities = reflection_table[x_vals], reflection_table['I'] @@ -638,7 +642,7 @@ def plot_reflection_table(data, ax=None, options={}): xlim_range = ax.get_xlim()[1] - ax.get_xlim()[0] ylim_avg = (ax.get_ylim()[0]+ax.get_ylim()[1])/2 - ax.text(s=data['label'], x=(ax.get_xlim()[0]-0.01*xlim_range), y=ylim_avg, ha = 'right', va = 'center') + ax.text(s=reflections_params['label'], x=(ax.get_xlim()[0]-0.01*xlim_range), y=ylim_avg, ha = 'right', va = 'center')