diff --git a/nafuma/xrd/io.py b/nafuma/xrd/io.py index 6b5a762..56154ea 100644 --- a/nafuma/xrd/io.py +++ b/nafuma/xrd/io.py @@ -80,7 +80,8 @@ def integrate_1d(data, options={}, index=0): res = ai.integrate1d(data['image'], options['nbins'], unit=options['unit'], filename=filename) data['path'][index] = filename - diffractogram, wavelength = read_xy(data=data, options=options, index=index) + diffractogram, _ = read_xy(data=data, options=options, index=index) + wavelength = find_wavelength_from_poni(path=data['calibrant']) if not options['save']: os.remove(filename) @@ -282,8 +283,12 @@ def read_brml(data, options={}, index=0): #if 'wavelength' not in data.keys(): # Find wavelength - for chain in root.findall('./FixedInformation/Instrument/PrimaryTracks/TrackInfoData/MountedOptics/InfoData/Tube/WaveLengthAlpha1'): - wavelength = float(chain.attrib['Value']) + + if not data['wavelength'][index]: + for chain in root.findall('./FixedInformation/Instrument/PrimaryTracks/TrackInfoData/MountedOptics/InfoData/Tube/WaveLengthAlpha1'): + wavelength = float(chain.attrib['Value']) + else: + wavelength = data['wavelength'][index] diffractogram = pd.DataFrame(diffractogram) @@ -306,7 +311,11 @@ def read_xy(data, options={}, index=0): #if 'wavelength' not in data.keys(): # Get wavelength from scan - wavelength = find_wavelength_from_xy(path=data['path'][index]) + + if not data['wavelength'][index]: + wavelength = find_wavelength_from_xy(path=data['path'][index]) + else: + wavelength = data['wavelength'][index] with open(data['path'][index], 'r') as f: position = 0 @@ -378,7 +387,7 @@ def read_data(data, options={}, index=0): - + if options['offset'] or options['normalise']: # Make copy of the original intensities before any changes are made through normalisation or offset, to easily revert back if need to update. diffractogram['I_org'] = diffractogram['I'] @@ -387,6 +396,7 @@ def read_data(data, options={}, index=0): diffractogram = apply_offset(diffractogram, wavelength, index, options) + diffractogram = translate_wavelengths(data=diffractogram, wavelength=wavelength) return diffractogram, wavelength @@ -506,7 +516,7 @@ def translate_wavelengths(data: pd.DataFrame, wavelength: float, to_wavelength=N data['2th_cuka'] = np.NAN - data['2th_cuka'].loc[data['2th'] <= max_2th_cuka] = 2*np.arcsin(cuka/wavelength * np.sin((data['2th']/2) * np.pi/180)) * 180/np.pi + data['2th_cuka'].loc[data['2th'] <= max_2th_cuka] = 2*np.arcsin(cuka/wavelength * np.sin((data['2th'].loc[data['2th'] <= max_2th_cuka]/2) * np.pi/180)) * 180/np.pi # Translate to MoKalpha moka = 0.71073 # Å @@ -518,7 +528,7 @@ def translate_wavelengths(data: pd.DataFrame, wavelength: float, to_wavelength=N data['2th_moka'] = np.NAN - data['2th_moka'].loc[data['2th'] <= max_2th_moka] = 2*np.arcsin(moka/wavelength * np.sin((data['2th']/2) * np.pi/180)) * 180/np.pi + data['2th_moka'].loc[data['2th'] <= max_2th_moka] = 2*np.arcsin(moka/wavelength * np.sin((data['2th'].loc[data['2th'] <= max_2th_moka]/2) * np.pi/180)) * 180/np.pi # Convert to other parameters @@ -537,7 +547,7 @@ def translate_wavelengths(data: pd.DataFrame, wavelength: float, to_wavelength=N data['2th'] = np.NAN - data['2th'].loc[data['2th_cuka'] <= max_2th] = 2*np.arcsin(to_wavelength/cuka * np.sin((data['2th_cuka']/2) * np.pi/180)) * 180/np.pi + data['2th'].loc[data['2th_cuka'] <= max_2th] = 2*np.arcsin(to_wavelength/cuka * np.sin((data['2th_cuka'].loc[data['2th_cuka'] <= max_2th]/2) * np.pi/180)) * 180/np.pi @@ -564,6 +574,22 @@ def find_wavelength_from_xy(path): elif 'Wavelength' in line: wavelength = float(line.split()[2])*10**10 + else: + wavelength = None + + + + return wavelength + + +def find_wavelength_from_poni(path): + + with open(path, 'r') as f: + lines = f.readlines() + + for line in lines: + if 'Wavelength' in line: + wavelength = float(line.split()[-1])*10**10 return wavelength diff --git a/nafuma/xrd/plot.py b/nafuma/xrd/plot.py index c45582b..b562eeb 100644 --- a/nafuma/xrd/plot.py +++ b/nafuma/xrd/plot.py @@ -13,7 +13,6 @@ import nafuma.xrd as xrd import nafuma.auxillary as aux import nafuma.plotting as btp - def plot_diffractogram(data, options={}): ''' Plots a diffractogram. @@ -67,7 +66,14 @@ def plot_diffractogram(data, options={}): if not 'diffractogram' in data.keys(): # Initialise empty list for diffractograms and wavelengths data['diffractogram'] = [None for _ in range(len(data['path']))] - data['wavelength'] = [None for _ in range(len(data['path']))] + + # If wavelength is not manually passed it should be automatically gathered from the .xy-file + if 'wavelength' not in data.keys(): + data['wavelength'] = [None for _ in range(len(data['path']))] + else: + # If only a single value is passed it should be set to be the same for all diffractograms passed + if not isinstance(data['wavelength'], list): + data['wavelength'] = [data['wavelength'] for _ in range(len(data['path']))] for index in range(len(data['path'])): diffractogram, wavelength = xrd.io.read_data(data=data, options=options, index=index) @@ -117,7 +123,7 @@ def plot_diffractogram(data, options={}): options['reflections_data'] = [options['reflections_data']] # Determine number of subplots and height ratios between them - if len(options['reflections_data']) >= 1: + if options['reflections_data'] and len(options['reflections_data']) >= 1: options = determine_grid_layout(options=options) @@ -334,10 +340,10 @@ def plot_diffractogram_interactive(data, options): 'heatmap_default': {'min': xminmax['heatmap'][0], 'max': xminmax['heatmap'][1], 'value': [xminmax['heatmap'][0], xminmax['heatmap'][1]], 'step': 10} }, 'ylim': { - 'w': widgets.FloatRangeSlider(value=[yminmax['start'][2], yminmax['start'][3]], min=yminmax['start'][0], max=yminmax['start'][1], step=0.5, layout=widgets.Layout(width='95%')), + 'w': widgets.FloatRangeSlider(value=[yminmax['start'][2], yminmax['start'][3]], min=yminmax['start'][0], max=yminmax['start'][1], step=0.01, layout=widgets.Layout(width='95%')), 'state': 'heatmap' if options['heatmap'] else 'diff', - 'diff_default': {'min': yminmax['diff'][0], 'max': yminmax['diff'][1], 'value': [yminmax['diff'][2], yminmax['diff'][3]], 'step': 0.1}, - 'heatmap_default': {'min': yminmax['heatmap'][0], 'max': yminmax['heatmap'][1], 'value': [yminmax['heatmap'][0], yminmax['heatmap'][1]], 'step': 0.1} + 'diff_default': {'min': yminmax['diff'][0], 'max': yminmax['diff'][1], 'value': [yminmax['diff'][2], yminmax['diff'][3]], 'step': 0.01}, + 'heatmap_default': {'min': yminmax['heatmap'][0], 'max': yminmax['heatmap'][1], 'value': [yminmax['heatmap'][0], yminmax['heatmap'][1]], 'step': 0.01} } } @@ -359,7 +365,12 @@ def plot_diffractogram_interactive(data, options): w = widgets.interactive(btp.ipywidgets_update, func=widgets.fixed(plot_diffractogram), data=widgets.fixed(data), options=widgets.fixed(options), scatter=widgets.ToggleButton(value=False), line=widgets.ToggleButton(value=True), - xlim=options['widgets']['xlim']['w']) + heatmap=widgets.ToggleButton(value=options['heatmap']), + x_vals=widgets.Dropdown(options=['2th', 'd', '1/d', 'q', 'q2', 'q4', '2th_cuka', '2th_moka'], value='2th', description='X-values'), + xlim=options['widgets']['xlim']['w'], + ylim=options['widgets']['ylim']['w'], + offset_y=widgets.BoundedFloatText(value=options['offset_y'], min=-5, max=5, step=0.01, description='offset_y'), + offset_x=widgets.BoundedFloatText(value=options['offset_x'], min=-1, max=1, step=0.01, description='offset_x')) options['widget'] = w