2-ExportQRES Template for multiple q bins all together¶
The following template is meant to create the output that can be loaded by Mumott.
Import packages & libraries
[1]:
%matplotlib ipympl
from tqdm import tqdm
import numpy as np
import os
import matplotlib.pyplot as plt
import h5py
import pickle
import json
from ipywidgets import interact
from matplotlib import cm, colors
from matplotlib.patches import Rectangle
from data_processing.dataset import Dataset
Step 1 - Load args from previous step.¶
Note: This includes already the q_rois chosen in the first template
[2]:
#--- User Input to load the exported args file --------------------#
filepath_args = '/data/visitors/formax/20220566/2023031408/process/work_dir_Christian/big_brain/args_big_brain.pickle'
#--- End Input to load the exported args file ---------------------#
## ---------- Don't change this if not needed ----------------- ##
with open(filepath_args,'rb') as fid:
args = pickle.load(fid)
frame_id_range = args['frame_id_range']
for key in args.keys():
print(key)
base_path
work_directory
integration_folder
frameID
sample_name
air_id
proposal
visit
bkg_scan
detector_name
normkey
valid_pixels
fast_scan_direction
slow_scan_direction
projection_direction
detector_angle_origin
detector_angle_pos_dir
norm_transmission
flat_field_level
correct_background
tomodata
beamline
inner_rotation_axis
inner_rotation_key
first_rotation_indexes
tilt_axis
tilt_key
data_sorting
data_index_origin
principal_rotation_right_handed
secondary_rotation_right_handed
detector_angle_0
detector_angle_right_handed
offset_positive
air_transmission
snake
phi_det
q
norm_sum
air_scattering
multiprocessing
frame_id_range
q_rois
Load beamline specific loader functions based on args input
[3]:
#do not modify
print(f"Loading beamline specific functions from {args['beamline']}_utils")
# Import the cSAXS loader functions
if args['beamline'] == 'csaxs':
from data_processing.cSAXS_utils import metadata_reader_complete as metadata_reader
from data_processing.cSAXS_utils import transmission_loader_mcs as transmission_loader
from data_processing.cSAXS_utils import scattering_loader as scattering_loader_eiger
from data_processing.cSAXS_utils import create_args
# Import the PX loader functions
elif args['beamline'] == 'px':
from data_processing.PX_utils import metadata_reader_json as metadata_reader
from data_processing.PX_utils import transmission_loader_eiger as transmission_loader
from data_processing.PX_utils import scattering_loader_eiger
from data_processing.PX_utils import create_args
# Import the PX loader functions
elif args['beamline'] == 'formax':
from data_processing.ForMAX_utils import metadata_reader
from data_processing.ForMAX_utils import transmission_loader
from data_processing.ForMAX_utils import scattering_loader_eiger
from data_processing.ForMAX_utils import create_args
Loading beamline specific functions from formax_utils
Load the dataset
[4]:
%%time
## ---------- Don't change this if not needed ----------------- ##
ds = Dataset(frame_id_range, metadata_reader, transmission_loader, scattering_loader_eiger, **args)
CPU times: user 347 ms, sys: 395 ms, total: 742 ms
Wall time: 2.9 s
Step 2 - Choose number of q bins¶
Choose the lowest q bin, the highest q bin and how many should be created in total
The following cell is meant to help you with your selection
Avoid detector gaps in the symmetric cake plot of the data
Step 2.1 Check data with projections and full q range
[8]:
#--- User Input which projection to show --------------------#
proj_nr = 0
qmin = 0.015 # Choose range for q resolved
qmax = 0.42 # Choose range for q resolved
qbins = 160
#Pick a roi from the args list
which_q_roi = 0
#--- End Input which projection to show --------------------#
roi = args['q_rois'][which_q_roi]
print(f"Chosen q range for plot {roi[:2]}")
q_mask = np.logical_and(args['q'] > qmin, args['q'] < qmax)
#np.searchsorted would also work to get indizes
q_ranges = np.geomspace(args['q'][q_mask][0], args['q'][q_mask][-1], qbins+1)
fig, axs = plt.subplots(2,3, figsize=(10,8))
# load data
f1amp, f2amp, f2phase, colorfulplot = ds.stack[proj_nr].colorful_image_plot(q_range=roi[:2], symmetric = True)
# Draw plots
axs[0,0].imshow(colorfulplot, picker=True)
axs[0,0].set_title('Click me')
axs[0,1].imshow(f1amp)
axs[0,1].set_title('symmetric intensity')
axs[0,2].imshow(f2amp)
axs[0,2].set_title('assymmetric intensity')
# Load cake image
cake_img = ds.stack[proj_nr].scaled_scattering_data_symmetric
# draw average curves first
axs[1,0].loglog(ds.stack[proj_nr].metadata['q'], np.nansum(cake_img, axis=(0,1)).T)
axs[1,0].set_title('Average 1D curves for projection')
axs[1,0].set_xlabel('q / Ang-1')
axs[1,0].set_ylabel('I / a.u.')
# Add plot of q bins
axs[1,0].axvspan(args['q'][q_mask][0], args['q'][q_mask][-1], alpha=0.3, color='red')
rect = Rectangle((args['q'][q_mask][0], 0), args['q'][q_mask][-1]-args['q'][q_mask][0], cake_img.shape[0], fill = False, color = "red", linewidth = 2)
#Cake plot from scan
vmin, vmax = np.nanpercentile(np.nansum(cake_img, axis=(0,1)), [20,87])
axs[1,1].imshow(np.nansum(cake_img, axis=(0,1)), norm=colors.LogNorm(vmin = vmin, vmax= vmax), aspect = 'auto', extent=[np.min(args['q']), np.max(args['q']), 0, cake_img.shape[0]])
axs[1,1].set_title('cake plot')
axs[1,1].add_patch(rect)
axs[1,2].axis('off')
def onpick(event):
mouseevent = event.mouseevent
xcord = int(mouseevent.xdata)
ycord = int(mouseevent.ydata)
#Redraw colorful plot
axs[0,0].clear()
axs[0,0].imshow(colorfulplot, picker=True)
axs[0,0].set_title('Click me')
axs[0,0].plot(xcord, ycord, '+', ms=12, color ='r')
# Redraw Scattering plot
axs[1,0].clear()
axs[1,0].loglog(ds.stack[proj_nr].metadata['q'], cake_img[ycord, xcord,...].T)
axs[1,0].set_title('Average 1D curves for projection')
axs[1,0].set_xlabel('q / A$^{-1}$')
axs[1,0].set_ylabel('I / a.u.')
axs[1,0].loglog(q_ranges, np.repeat(np.max(cake_img[ycord, xcord,...]), len(q_ranges)), 'k.')
axs[1,0].axvspan(args['q'][q_mask][0], args['q'][q_mask][-1], alpha=0.3, color='red')
# update cake plot
axs[1,1].clear()
vmin = None
vmax = None
# This line might create problems in case of negative and nan data, change [x,x] to adjust colorscale
vmin, vmax = np.nanpercentile(cake_img[ycord, xcord,...], [20,87])
axs[1,1].imshow(cake_img[ycord, xcord,...], norm=colors.LogNorm(vmin = vmin, vmax= vmax), aspect = 'auto', extent=[np.min(args['q']), np.max(args['q']), 0, cake_img.shape[0]])
axs[1,1].add_patch(rect)
axs[1,1].set_title('cake plot')
axs[1,1].set_xlabel('q / A$^{-1}$')
axs[1,1].set_ylabel('azimuthal bin')
axs[1,2].axis('off')
fig.canvas.mpl_connect('pick_event', onpick)
Chosen q range for plot (0.01594954951718868, 0.018899687067514187)
[8]:
9
Step 3 - Load scattering data¶
[9]:
#------------------------------------------------- User Input for number of azimuthal bins -----------------------------------------------#
# Chose how many azimuthal bins should be used for the reconstruction
# 8 is typically our minimum, more will be more time consuming but might be needed for higher anisotropic data
n_directions = 8
#------------------------------------------------- User Input for number of azimuthal bins -----------------------------------------------#
# Check if n_direction is possible
if not args['norm_sum'].shape[0]/2%n_directions == 0:
print("This number of segments doesn't work out.")
else:
print(f"The current selection of n_directions {n_directions:d} works perfectly fine with shape of norm_sum {args['norm_sum'].shape}")
The current selection of n_directions 8 works perfectly fine with shape of norm_sum (32, 1000)
Loading of data
[10]:
# ----------- do not modify this ---------------- #
import multiprocessing
def load_data(projection, n_directions=8, q_range=None):
"""Simple loading function for colorful_image_plot
Returns
f1amp
f2amp
f2phase
colorfulplot"""
# directly return the projection
data_q, data_norm = projection.bin_qranges(q_range, normalized = True, symmetric = True)
phi_range = list(range(0,data_norm.shape[0]+1,data_norm.shape[0]//n_directions))
data, _ = projection.bin_det_phi(phi_range = phi_range, data=data_q, norm=data_norm, normalized = False, symmetric=False)
data = data.squeeze()
# This is a bit ackward
projection.clear_data()
return data
def load_data_parallel(dataset, n_directions=8, array=None, q_range=None):
"""
Parallel loading:
Output needs to be precreated
"""
# Create args for output
if array is None:
shp = (*ds.stack[0].metadata['padded_shape'], n_directions, qbins)
array = np.zeros((shp[0], shp[1], len(ds.stack), shp[2], shp[3]))
#data = []
args_pool = [(projection, n_directions, q_range) for projection in ds.stack]
num_cores = multiprocessing.cpu_count()
if num_cores > 16:
num_cores = 16
pool = multiprocessing.Pool(processes=num_cores)
results = []
for i, arg in enumerate(args_pool):
result = pool.apply_async(load_data, args = arg)
results.append(result)
with tqdm(total=len(results)) as pbar:
for i,result in enumerate(results):
pbar.update()
array[...,i,:,:] = result.get()
pool.close()
pool.join()
return array
print(f'Bin into {n_directions} directions')
print(f'Using the q_range from {q_ranges[0]} to {q_ranges[-1]} with {qbins} qbins')
shp = (*ds.stack[0].metadata['padded_shape'], n_directions, qbins)
data_array = np.zeros((shp[0], shp[1], len(ds.stack), shp[2], shp[3]))
if not args['norm_sum'].shape[0]/2%n_directions == 0:
print("The current selection of n_directions does not work out, nothing no data loading is performed!! - please correct n_direction in the cell above")
else:
if 'multiprocessing' in args:
if args['multiprocessing']:
data_array = load_data_parallel(ds, n_directions=n_directions, array = data_array, q_range=q_ranges)#f1amp, f2amp, colorfulplot
else:
for ii, projection in tqdm(enumerate(ds.stack)):
data_array[:,:,ii,:,:] = load_data(projection, n_directions=n_directions, q_range=q_ranges)
else:
for ii, projection in tqdm(enumerate(ds.stack)):
data_array[:,:,ii,:,:] = load_data(projection, n_directions=n_directions, q_range=q_ranges)
#Create detector angle vector from first projection
_, data_norm = ds.stack[0].bin_qranges(q_ranges, normalized = True, symmetric = True)
max_angle = data_norm.shape[0]
stepping = data_norm.shape[0]//n_directions
angles = (args['phi_det'][:max_angle:stepping] +
args['phi_det'][stepping//2:max_angle:stepping])/2
Bin into 8 directions
Using the q_range from 0.015212015129607303 to 0.4193808595242018 with 160 qbins
100%|██████████| 419/419 [05:30<00:00, 1.27it/s]
Step 4 Import alignment and export data¶
Step 4.1 Import mask and absorption tomogram
[11]:
# ----------- do not modify this ---------------- #
# Load mask
with open(args['work_directory'] + '/' + args['sample_name'] + '/mask_arrays.npy','rb') as fid:
masks = pickle.load(fid)
# Load absorption tomo
with open(args['work_directory'] + '/' + args['sample_name'] + '/tomogram.npy','rb') as fid:
tomogram = pickle.load(fid)
# plt.figure()
# plt.imshow(masks[:,:,proj_nr])
# plt.show()
Step 4.2 Import shifts
[12]:
# ----------- do not modify this ---------------- #
# Load aligment values
with open(args['work_directory'] + '/' + args['sample_name'] + '/shift_values.json','r') as fid:
shifts = json.load(fid)
plt.figure()
plt.plot(frame_id_range, shifts['offsets_j'], '.-')
plt.plot(frame_id_range, shifts['offsets_k'], '.-')
plt.legend(['offsets_j', 'offsets_k'])
plt.ylabel('pixels')
plt.xlabel('frameid')
plt.show()
Step 4.3 last check before data is written to file for mumott
Important, also check that there are no Nans in the data. Mumott can not deal with them, they should be set to 0 the section below has some example. However, check that the data has not an unreasonable large amount of Nans included
There will be a red printout in case your data or mask has Nan values
It also plots you once again the raw data, mask and masked data one last time before the export
[15]:
# Choose option to show histograms
show_histograms = True #True
# ----------- do not modify this ---------------- #
fig, axs = plt.subplots(2,3, figsize=(10,8))
qbin = len(q_ranges)//2
if np.isnan(data_array).any():
#print(f"The data has {len(np.isnan(data_array)==True)} NaN values")
print(f"\x1b[31mThe data array has Nan values, this needs to be accounted for in the next template --> Mumott!!! Please run the step that mentions NaN values to avoid crashing reconstructions\x1b[0m")
elif np.isnan(masks).any():
#print(f"The mask has {len(np.isnan(masks)==True)} NaN values")
print(f"\x1b[31mThe mask has Nan values, this needs to be accounted for in the next template --> Mumott!!! Please run the step that mentions NaN values to avoid crashing reconstructions\x1b[0m")
@interact(proj_nr=(0,data_array.shape[2]-1))
def plot(proj_nr):
for array in axs:
for axis in array:
axis.clear()
axs[0, 0].imshow(np.nansum(data_array[:,:,proj_nr,:,qbin], axis=-1))
axs[0, 0].set_title(f"Sum over all azimuthals, proj {proj_nr:03d}, qbin {qbin}")
axs[0, 1].imshow(np.nansum(data_array[:,:,proj_nr,:,qbin], axis=-1)*masks[:,:,proj_nr])
axs[0, 1].set_title('Sum times mask')
axs[0, 2].imshow(masks[:,:,proj_nr],vmin = 0, vmax = 1)
axs[0, 2].set_title('Mask')
axs[1, 0].imshow(ds.stack[proj_nr].transmission_factor, cmap = 'Greys_r')
axs[1, 0].set_title('normalized transmission')
if show_histograms:
axs[1, 1].hist(ds.stack[proj_nr].transmission_factor.flatten(), 500)
axs[1, 1].set_title('histogram transmission')
axs[1, 2].hist(np.nansum(data_array[:,:,proj_nr,:,qbin], axis=-2).flatten(), 500)
axs[1, 2].set_yscale('log')
axs[1, 2].set_title('histogram scattering')
The data array has Nan values, this needs to be accounted for in the next template --> Mumott!!! Please run the step that mentions NaN values to avoid crashing reconstructions
Step 4.4 Output data for Mumott
[16]:
# ----------- do not modify this ---------------- #
image_shape = ds.stack[0].metadata['padded_shape']
volume_shape = tomogram.shape
# Hard coded path to subfolder, can be adapted for the future
dir_path = os.path.join(args['work_directory'], args['sample_name'], 'dataset_qresolved')
try:
os.makedirs(dir_path)
except:
print('Folder already exists')
pass
print(data_array.shape)
for jj in range(data_array.shape[-1]):
q_range = (q_ranges[jj], q_ranges[jj+1])
print(f'Exporting {jj+1}/{(data_array.shape[-1])} for the q_range from {q_range[0]} to {q_range[1]}')
fname = f"{dir_path}/dataset_q_{q_range[0]:.3f}_{q_range[1]:.3f}.h5"
with h5py.File(fname,'w') as file:
#Assign global parameters
file.create_dataset('detector_angles', data = np.array(angles)*np.pi/180)
file.create_dataset('volume_shape', data = volume_shape)
# Make data group
grp = file.create_group('projections')
# Loop through projections
for ii, projection in enumerate(ds.stack):
# Make a group for each projection
subgrp = grp.create_group(str(ii))
#Choose here between using reconstructed transmission or raw data
diode = projection.transmission_factor
# Mask of values where data is nan!
mask = ~masks[:,:,ii]
data = data_array[:,:,ii,:, jj]
#weights = projection.needle_mask()[args['valid_pixels']]
weights = masks[...,ii].astype(float)
# Make sure to mask the parts where data was nan
weights[mask] = 0
offset_j = shifts['offsets_j'][ii]
offset_k = shifts['offsets_k'][ii]
rotations = projection.metadata[args['inner_rotation_key']]
tilts = projection.metadata[args['tilt_key']]
# Assign data
#
subgrp.create_dataset('data', data = np.ascontiguousarray(data))
subgrp.create_dataset('diode', data = diode)
subgrp.create_dataset('weights', data = weights)
subgrp.create_dataset('offset_j', data = np.array([offset_j]))
subgrp.create_dataset('offset_k', data = np.array([offset_k]))
subgrp.create_dataset('rotations', data = np.array([rotations*np.pi/180]))
subgrp.create_dataset('tilts', data = np.array([tilts*np.pi/180]))
(131, 85, 419, 8, 160)
Exporting 1/160 for the q_range from 0.015212015129607303 to 0.015530641158918466
Exporting 2/160 for the q_range from 0.015530641158918466 to 0.015855941027671
Exporting 3/160 for the q_range from 0.015855941027671 to 0.016188054523982594
Exporting 4/160 for the q_range from 0.016188054523982594 to 0.016527124363928412
Exporting 5/160 for the q_range from 0.016527124363928412 to 0.016873296252869083
Exporting 6/160 for the q_range from 0.016873296252869083 to 0.01722671894806341
Exporting 7/160 for the q_range from 0.01722671894806341 to 0.017587544322592373
Exporting 8/160 for the q_range from 0.017587544322592373 to 0.01795592743062221
Exporting 9/160 for the q_range from 0.01795592743062221 to 0.018332026574034408
Exporting 10/160 for the q_range from 0.018332026574034408 to 0.01871600337045126
Exporting 11/160 for the q_range from 0.01871600337045126 to 0.0191080228226864
Exporting 12/160 for the q_range from 0.0191080228226864 to 0.01950825338964987
Exporting 13/160 for the q_range from 0.01950825338964987 to 0.01991686705873847
Exporting 14/160 for the q_range from 0.01991686705873847 to 0.0203340394197423
Exporting 15/160 for the q_range from 0.0203340394197423 to 0.02075994974029931
Exporting 16/160 for the q_range from 0.02075994974029931 to 0.0211947810429304
Exporting 17/160 for the q_range from 0.0211947810429304 to 0.02163872018368793
Exporting 18/160 for the q_range from 0.02163872018368793 to 0.022091957932451722
Exporting 19/160 for the q_range from 0.022091957932451722 to 0.022554689054906766
Exporting 20/160 for the q_range from 0.022554689054906766 to 0.023027112396238163
Exporting 21/160 for the q_range from 0.023027112396238163 to 0.023509430966579
Exporting 22/160 for the q_range from 0.023509430966579 to 0.024001852028247988
Exporting 23/160 for the q_range from 0.024001852028247988 to 0.024504587184814474
Exporting 24/160 for the q_range from 0.024504587184814474 to 0.0250178524720288
Exporting 25/160 for the q_range from 0.0250178524720288 to 0.02554186845065746
Exporting 26/160 for the q_range from 0.02554186845065746 to 0.026076860301262536
Exporting 27/160 for the q_range from 0.026076860301262536 to 0.026623057920966562
Exporting 28/160 for the q_range from 0.026623057920966562 to 0.027180696022244065
Exporting 29/160 for the q_range from 0.027180696022244065 to 0.027750014233782348
Exporting 30/160 for the q_range from 0.027750014233782348 to 0.028331257203455015
Exporting 31/160 for the q_range from 0.028331257203455015 to 0.028924674703452145
Exporting 32/160 for the q_range from 0.028924674703452145 to 0.029530521737612708
Exporting 33/160 for the q_range from 0.029530521737612708 to 0.030149058651004892
Exporting 34/160 for the q_range from 0.030149058651004892 to 0.030780551241801898
Exporting 35/160 for the q_range from 0.030780551241801898 to 0.03142527087550091
Exporting 36/160 for the q_range from 0.03142527087550091 to 0.032083494601534444
Exporting 37/160 for the q_range from 0.032083494601534444 to 0.03275550527232431
Exporting 38/160 for the q_range from 0.03275550527232431 to 0.03344159166482918
Exporting 39/160 for the q_range from 0.03344159166482918 to 0.03414204860463799
Exporting 40/160 for the q_range from 0.03414204860463799 to 0.03485717709266266
Exporting 41/160 for the q_range from 0.03485717709266266 to 0.03558728443448449
Exporting 42/160 for the q_range from 0.03558728443448449 to 0.036332684372409725
Exporting 43/160 for the q_range from 0.036332684372409725 to 0.03709369722029107
Exporting 44/160 for the q_range from 0.03709369722029107 to 0.03787065000117336
Exporting 45/160 for the q_range from 0.03787065000117336 to 0.03866387658782206
Exporting 46/160 for the q_range from 0.03866387658782206 to 0.03947371784619536
Exporting 47/160 for the q_range from 0.03947371784619536 to 0.04030052178192133
Exporting 48/160 for the q_range from 0.04030052178192133 to 0.041144643689843274
Exporting 49/160 for the q_range from 0.041144643689843274 to 0.04200644630669723
Exporting 50/160 for the q_range from 0.04200644630669723 to 0.04288629996698747
Exporting 51/160 for the q_range from 0.04288629996698747 to 0.04378458276212701
Exporting 52/160 for the q_range from 0.04378458276212701 to 0.044701680702911334
Exporting 53/160 for the q_range from 0.044701680702911334 to 0.045637987885395165
Exporting 54/160 for the q_range from 0.045637987885395165 to 0.046593906660243906
Exporting 55/160 for the q_range from 0.046593906660243906 to 0.04756984780563189
Exporting 56/160 for the q_range from 0.04756984780563189 to 0.04856623070376252
Exporting 57/160 for the q_range from 0.04856623070376252 to 0.0495834835210853
Exporting 58/160 for the q_range from 0.0495834835210853 to 0.05062204339228802
Exporting 59/160 for the q_range from 0.05062204339228802 to 0.0516823566081426
Exporting 60/160 for the q_range from 0.0516823566081426 to 0.05276487880728542
Exporting 61/160 for the q_range from 0.05276487880728542 to 0.053870075172014746
Exporting 62/160 for the q_range from 0.053870075172014746 to 0.05499842062818945
Exporting 63/160 for the q_range from 0.05499842062818945 to 0.056150400049314174
Exporting 64/160 for the q_range from 0.056150400049314174 to 0.05732650846489975
Exporting 65/160 for the q_range from 0.05732650846489975 to 0.05852725127318771
Exporting 66/160 for the q_range from 0.05852725127318771 to 0.05975314445833039
Exporting 67/160 for the q_range from 0.05975314445833039 to 0.061004714812119935
Exporting 68/160 for the q_range from 0.061004714812119935 to 0.06228250016036175
Exporting 69/160 for the q_range from 0.06228250016036175 to 0.06358704959398966
Exporting 70/160 for the q_range from 0.06358704959398966 to 0.06491892370502128
Exporting 71/160 for the q_range from 0.06491892370502128 to 0.06627869482745634
Exporting 72/160 for the q_range from 0.06627869482745634 to 0.06766694728322048
Exporting 73/160 for the q_range from 0.06766694728322048 to 0.06908427763326051
Exporting 74/160 for the q_range from 0.06908427763326051 to 0.07053129493389897
Exporting 75/160 for the q_range from 0.07053129493389897 to 0.07200862099855841
Exporting 76/160 for the q_range from 0.07200862099855841 to 0.07351689066496755
Exporting 77/160 for the q_range from 0.07351689066496755 to 0.07505675206796411
Exporting 78/160 for the q_range from 0.07505675206796411 to 0.07662886691801193
Exporting 79/160 for the q_range from 0.07662886691801193 to 0.07823391078555178
Exporting 80/160 for the q_range from 0.07823391078555178 to 0.07987257339130795
Exporting 81/160 for the q_range from 0.07987257339130795 to 0.08154555890267548
Exporting 82/160 for the q_range from 0.08154555890267548 to 0.08325358623631578
Exporting 83/160 for the q_range from 0.08325358623631578 to 0.08499738936708988
Exporting 84/160 for the q_range from 0.08499738936708988 to 0.08677771764346272
Exporting 85/160 for the q_range from 0.08677771764346272 to 0.08859533610951373
Exporting 86/160 for the q_range from 0.08859533610951373 to 0.09045102583369236
Exporting 87/160 for the q_range from 0.09045102583369236 to 0.0923455842444593
Exporting 88/160 for the q_range from 0.0923455842444593 to 0.09427982547295792
Exporting 89/160 for the q_range from 0.09427982547295792 to 0.0962545807028637
Exporting 90/160 for the q_range from 0.0962545807028637 to 0.09827069852756092
Exporting 91/160 for the q_range from 0.09827069852756092 to 0.10032904531480077
Exporting 92/160 for the q_range from 0.10032904531480077 to 0.10243050557899788
Exporting 93/160 for the q_range from 0.10243050557899788 to 0.10457598236132432
Exporting 94/160 for the q_range from 0.10457598236132432 to 0.10676639761776532
Exporting 95/160 for the q_range from 0.10676639761776532 to 0.10900269261530282
Exporting 96/160 for the q_range from 0.10900269261530282 to 0.11128582833639752
Exporting 97/160 for the q_range from 0.11128582833639752 to 0.113616785891943
Exporting 98/160 for the q_range from 0.113616785891943 to 0.1159965669428695
Exporting 99/160 for the q_range from 0.1159965669428695 to 0.11842619413057841
Exporting 100/160 for the q_range from 0.11842619413057841 to 0.12090671151639257
Exporting 101/160 for the q_range from 0.12090671151639257 to 0.1234391850302112
Exporting 102/160 for the q_range from 0.1234391850302112 to 0.12602470292856197
Exporting 103/160 for the q_range from 0.12602470292856197 to 0.1286643762622476
Exporting 104/160 for the q_range from 0.1286643762622476 to 0.13135933935378746
Exporting 105/160 for the q_range from 0.13135933935378746 to 0.13411075028485955
Exporting 106/160 for the q_range from 0.13411075028485955 to 0.13691979139395213
Exporting 107/160 for the q_range from 0.13691979139395213 to 0.13978766978443954
Exporting 108/160 for the q_range from 0.13978766978443954 to 0.14271561784329911
Exporting 109/160 for the q_range from 0.14271561784329911 to 0.14570489377069387
Exporting 110/160 for the q_range from 0.14570489377069387 to 0.14875678212064716
Exporting 111/160 for the q_range from 0.14875678212064716 to 0.15187259435304212
Exporting 112/160 for the q_range from 0.15187259435304212 to 0.15505366939718349
Exporting 113/160 for the q_range from 0.15505366939718349 to 0.15830137422716328
Exporting 114/160 for the q_range from 0.15830137422716328 to 0.16161710444927774
Exporting 115/160 for the q_range from 0.16161710444927774 to 0.16500228490174887
Exporting 116/160 for the q_range from 0.16500228490174887 to 0.1684583702670065
Exporting 117/160 for the q_range from 0.1684583702670065 to 0.171986845696796
Exporting 118/160 for the q_range from 0.171986845696796 to 0.1755892274503788
Exporting 119/160 for the q_range from 0.1755892274503788 to 0.1792670635461001
Exporting 120/160 for the q_range from 0.1792670635461001 to 0.18302193442660533
Exporting 121/160 for the q_range from 0.18302193442660533 to 0.18685545363798822
Exporting 122/160 for the q_range from 0.18685545363798822 to 0.19076926852316609
Exporting 123/160 for the q_range from 0.19076926852316609 to 0.19476506092977683
Exporting 124/160 for the q_range from 0.19476506092977683 to 0.19884454793290363
Exporting 125/160 for the q_range from 0.19884454793290363 to 0.20300948257293847
Exporting 126/160 for the q_range from 0.20300948257293847 to 0.20726165460889928
Exporting 127/160 for the q_range from 0.20726165460889928 to 0.21160289128752735
Exporting 128/160 for the q_range from 0.21160289128752735 to 0.21603505812849255
Exporting 129/160 for the q_range from 0.21603505812849255 to 0.22056005972604648
Exporting 130/160 for the q_range from 0.22056005972604648 to 0.22517984056746604
Exporting 131/160 for the q_range from 0.22517984056746604 to 0.22989638586863972
Exporting 132/160 for the q_range from 0.22989638586863972 to 0.2347117224271568
Exporting 133/160 for the q_range from 0.2347117224271568 to 0.23962791949326365
Exporting 134/160 for the q_range from 0.23962791949326365 to 0.24464708965906443
Exporting 135/160 for the q_range from 0.24464708965906443 to 0.24977138976634494
Exporting 136/160 for the q_range from 0.24977138976634494 to 0.25500302183341317
Exporting 137/160 for the q_range from 0.25500302183341317 to 0.26034423400135215
Exporting 138/160 for the q_range from 0.26034423400135215 to 0.2657973215000922
Exporting 139/160 for the q_range from 0.2657973215000922 to 0.27136462763472036
Exporting 140/160 for the q_range from 0.27136462763472036 to 0.27704854479244573
Exporting 141/160 for the q_range from 0.27704854479244573 to 0.2828515154706593
Exporting 142/160 for the q_range from 0.2828515154706593 to 0.28877603332652535
Exporting 143/160 for the q_range from 0.28877603332652535 to 0.2948246442485573
Exporting 144/160 for the q_range from 0.2948246442485573 to 0.3009999474506401
Exporting 145/160 for the q_range from 0.3009999474506401 to 0.30730459658896514
Exporting 146/160 for the q_range from 0.30730459658896514 to 0.3137413009023627
Exporting 147/160 for the q_range from 0.3137413009023627 to 0.3203128263765172
Exporting 148/160 for the q_range from 0.3203128263765172 to 0.3270219969325696
Exporting 149/160 for the q_range from 0.3270219969325696 to 0.33387169564061475
Exporting 150/160 for the q_range from 0.33387169564061475 to 0.34086486595861587
Exporting 151/160 for the q_range from 0.34086486595861587 to 0.348004512997271
Exporting 152/160 for the q_range from 0.348004512997271 to 0.35529370481137007
Exporting 153/160 for the q_range from 0.35529370481137007 to 0.3627355737182033
Exporting 154/160 for the q_range from 0.3627355737182033 to 0.3703333176435816
Exporting 155/160 for the q_range from 0.3703333176435816 to 0.37809020149605316
Exporting 156/160 for the q_range from 0.37809020149605316 to 0.38600955856990177
Exporting 157/160 for the q_range from 0.38600955856990177 to 0.3940947919775323
Exporting 158/160 for the q_range from 0.3940947919775323 to 0.40234937611186017
Exporting 159/160 for the q_range from 0.40234937611186017 to 0.41077685813932874
Exporting 160/160 for the q_range from 0.41077685813932874 to 0.4193808595242018
[ ]: