minor updates and bug fixes in angle scan processing and data explorer

This commit is contained in:
2019-02-10 14:31:06 +01:00
parent b2f4816629
commit 3235d52212
6 changed files with 594 additions and 36 deletions

View File

@@ -537,7 +537,7 @@ end
/// calculate the output using all enabled processing filters.
///
/// the diffractogram is calculated, to display the graph, call @ref asp_display_graph.
/// the diffractogram is calculated, to display the graph, call @ref asp_display_output.
///
function asp_calculate_output()
dfref saveDF = GetDataFolderDFR()
@@ -552,6 +552,7 @@ function asp_calculate_output()
nvar folding=output_folding
nvar horizon=output_horizon
nvar graph_mode
do_init_process(0)
do_crop_alpha(0)
@@ -569,25 +570,57 @@ function asp_calculate_output()
values = pol <= horizon ? values : nan
endif
interpolate_hemi_scan("")
SetDataFolder saveDF
end
/// display the output diffractogram in a new graph
/// display the output diffractogram
///
function asp_display_output()
dfref df = $(package_path)
/// this function either displays the current working data from the angle scan panel data folder,
/// or hologram data from a specified other data folder.
/// in either case, the graph is displayed using the current projection, mode, color table and contrast settings of the angle scan panel.
///
/// @param data_df data folder where the diffractogram data is located.
/// default: the folder of the angle scan panel package.
///
/// @param data_name name of the diffractogram data.
/// this is normally the name of a sub-folder that contains the data.
/// default: the name specified in the output_name variable in the package data folder.
///
function /s asp_display_output([data_df, data_name])
dfref data_df
string data_name
dfref pkg_df = $(package_path)
svar /sdfr=pkg_df output_name
svar /sdfr=pkg_df output_graphname
nvar /sdfr=pkg_df graph_projection
nvar /sdfr=pkg_df graph_mode
svar /sdfr=pkg_df graph_colortable
nvar /sdfr=pkg_df graph_contrast
svar /sdfr=df output_name
svar /sdfr=df output_graphname
nvar /sdfr=df graph_projection
nvar /sdfr=df graph_mode
if (ParamIsDefault(data_df))
dfref data_df = pkg_df
endif
if (ParamIsDefault(data_name))
data_name = output_name
endif
dfref saveDF = GetDataFolderDFR()
setdatafolder $(package_path)
output_graphname = output_name
output_graphname = display_hemi_scan(output_name, projection=graph_projection, graphtype=graph_mode, graphname=output_graphname)
setdatafolder data_df
string graphname = data_name
graphname = display_hemi_scan(data_name, projection=graph_projection, graphtype=graph_mode, graphname=graphname)
if (ParamIsDefault(data_df))
output_graphname = graphname
endif
SetDataFolder saveDF
asp_update_graph()
if (strlen(graphname) && (wintype(graphname) == 1))
set_contrast(graph_contrast, graph_contrast, graphname=graphname, colortable=graph_colortable)
endif
return graphname
end
/// update graphs with new color table or contrast
@@ -647,9 +680,19 @@ end
/// the destination folder does not need to exist.
/// existing data in the destination folder is overwritten.
///
function asp_duplicate_output(dest_name)
/// @param do_graph switch to duplicate the graph window as well (1).
/// default: 0 (do not create a graph)
///
/// @return name of the graph window
///
function /s asp_duplicate_output(dest_name, [do_graph])
string dest_name
variable do_graph
if (ParamIsDefault(do_graph))
do_graph = 0
endif
dfref df = $(package_path)
svar /sdfr=df source_path
svar /sdfr=df output_name
@@ -657,14 +700,20 @@ function asp_duplicate_output(dest_name)
wave raw_data = $source_path
dfref saveDF = GetDataFolderDFR()
dfref dest_df = GetWavesDataFolderDFR(raw_data)
setdatafolder dest_df
dfref raw_df = GetWavesDataFolderDFR(raw_data)
setdatafolder raw_df
newdatafolder /o /s $dest_name
dfref dest_df = GetDataFolderDFR()
setdatafolder df
duplicate_hemi_scan(output_name, dest_df, "")
string graphname = ""
if (do_graph)
graphname = asp_display_output(data_df=raw_df, data_name=dest_name)
endif
SetDataFolder saveDF
return graphname
end
/// save the output diffractogram to an igor text file
@@ -777,12 +826,14 @@ function asp_show_panel()
return 0
endif
NewPanel /K=1 /N=anglescan_panel /W=(200,100,479,1027) as "angle scan processing"
NewPanel /K=1 /N=anglescan_panel /W=(200,100,479,854) as "angle scan processing"
panel_name = s_name
GroupBox gb_source, title="data source"
Button b_source_select, size={50,20},proc=PearlAnglescanPanel#bp_source_select,title="select..."
Button b_source_select, help={"select the source wave, e.g. ReducedData1. it must be in the original scan data folder along with the attr folder and the manipulator positions."}
Button b_source_select, help={"select the source wave, e.g. ReducedData1. it must be in the scan or region data folder. the attr folder with the manipulator waves must be in the same folder or one level up."}
Button b_source_update, size={50,20},proc=PearlAnglescanPanel#bp_source_update,title="update"
Button b_source_update, help={"reload the process data from the previous source (link displayed below)"}
TitleBox tb_source_path, size={240,21}
TitleBox tb_source_path,variable= root:packages:pearl_anglescan_panel:source_path
@@ -799,6 +850,10 @@ function asp_show_panel()
SetVariable sv_alpha_offset, size={90,16},bodyWidth=60,title="alpha"
SetVariable sv_alpha_offset,value= root:packages:pearl_anglescan_panel:alpha_offset
SetVariable sv_alpha_offset, help={"alpha value that corresponds to normal emission (if the sample normal is properly aligned)."}
Button b_save_prefs, size={80,20},proc=PearlAnglescanPanel#bp_save_prefs,title="save prefs"
Button b_save_prefs, help={"save settings as preferences."}
Button b_load_prefs, size={80,20},proc=PearlAnglescanPanel#bp_load_prefs,title="load prefs"
Button b_load_prefs, help={"load settings from preferences."}
GroupBox gb_crop_alpha, title="crop alpha"
CheckBox cb_crop_alpha_enable, size={50,14}, title="enable"
@@ -878,8 +933,8 @@ function asp_show_panel()
PopupMenu pm_graph_projection, mode=2, popvalue="stereographic", value= #"\"equidistant;stereographic;equal area;gnomonic;orthographic;\""
PopupMenu pm_graph_projection, help={"projection (theta mapping) mode"}
PopupMenu pm_graph_mode, size={129,21}, bodyWidth=100, proc=PearlAnglescanPanel#pmp_graph_mode,title="mode"
PopupMenu pm_graph_mode, mode=2, popvalue="polar plot", value= #"\"none;polar plot;none;image;\""
PopupMenu pm_graph_mode, help={"graph mode"}
PopupMenu pm_graph_mode, mode=2, popvalue="dots", value= #"\"none;dots;none;image;\""
PopupMenu pm_graph_mode, help={"graph type: dots = coloured dots on circles; image = interpolated matrix"}
Button b_output_calc, size={80,20}, proc=PearlAnglescanPanel#bp_output_calc, title="calc + display"
Button b_output_calc, help={"execute data processing with the enabled filters and display the diffractogram."}
Button b_output_duplicate, size={80,20}, proc=PearlAnglescanPanel#bp_output_duplicate, title="duplicate ..."
@@ -910,9 +965,9 @@ static function arrange_controls()
svar /sdfr=df panel_name
variable gb_space = 2
variable gb_internal_top = 20
variable gb_internal_bot = 8
variable line_space = 26
variable gb_internal_top = 16
variable gb_internal_bot = 4
variable line_space = 22
variable cb_adj = 2
variable sv_adj = 2
@@ -933,6 +988,7 @@ static function arrange_controls()
GroupBox gb_source,pos={4,gb_top}
gb_ht = gb_internal_top
Button b_source_select,pos={17, gb_top + gb_ht + b_adj},size={50,20}
Button b_source_update, pos={67, gb_top + gb_ht + b_adj},size={50,20}
gb_ht += line_space
TitleBox tb_source_path,pos={18, gb_top + gb_ht + tb_adj},size={240,21}
gb_ht += line_space
@@ -943,8 +999,10 @@ static function arrange_controls()
GroupBox gb_offsets,pos={4,gb_top}
gb_ht = gb_internal_top
SetVariable sv_theta_offset,pos={46, gb_top + gb_ht + sv_adj},size={88,16}
Button b_save_prefs,pos={186, gb_top + gb_ht + b_adj},size={80,20}
gb_ht += line_space
SetVariable sv_tilt_offset,pos={60, gb_top + gb_ht + sv_adj},size={74,16}
Button b_load_prefs,pos={186, gb_top + gb_ht + b_adj},size={80,20}
gb_ht += line_space
SetVariable sv_phi_offset,pos={56, gb_top + gb_ht + sv_adj},size={78,16}
gb_ht += line_space
@@ -1047,6 +1105,9 @@ static function arrange_controls()
gb_ht += line_space
gb_ht += gb_internal_bot
GroupBox gb_graph, size={272,gb_ht}
gb_top += gb_ht + gb_space
//MoveWindow 200, 100, 479, 100 + gb_top
end
/// update the popup menus to reflect the values of the global variables
@@ -1077,6 +1138,34 @@ static function update_menus()
endif
end
static function bp_load_prefs(ba) : ButtonControl
STRUCT WMButtonAction &ba
switch( ba.eventCode )
case 2: // mouse up
load_prefs()
break
case -1: // control being killed
break
endswitch
return 0
End
static function bp_save_prefs(ba) : ButtonControl
STRUCT WMButtonAction &ba
switch( ba.eventCode )
case 2: // mouse up
save_prefs()
break
case -1: // control being killed
break
endswitch
return 0
End
static function bp_source_select(ba) : ButtonControl
STRUCT WMButtonAction &ba
@@ -1103,6 +1192,27 @@ static function bp_source_select(ba) : ButtonControl
return 0
End
static function bp_source_update(ba) : ButtonControl
STRUCT WMButtonAction &ba
switch( ba.eventCode )
case 2: // mouse up
dfref packdf = $package_path
svar /sdfr=packdf source_path
wave /z w = $source_path
if (waveexists(w))
asp_import_raw(w)
else
DoAlert 0, "can't find source data."
endif
break
case -1: // control being killed
break
endswitch
return 0
End
static function bp_norm_alpha_check(ba) : ButtonControl
STRUCT WMButtonAction &ba
@@ -1250,10 +1360,12 @@ static function bp_output_duplicate(ba) : ButtonControl
switch( ba.eventCode )
case 2: // mouse up
string dest_folder
variable do_graph = 1
prompt dest_folder, "destination folder name (relative to data source)"
doprompt "duplicate", dest_folder
prompt do_graph, "duplicate graph (yes = 1, no = 0)"
doprompt "duplicate", dest_folder, do_graph
if (!v_flag)
asp_duplicate_output(dest_folder)
asp_duplicate_output(dest_folder, do_graph=do_graph)
endif
break
case -1: // control being killed

View File

@@ -160,6 +160,8 @@ end
/// this is a simple way to remove the effect of the angle-dependence of the analyser transmission function.
/// the strip is normalized in place, previous data is overwritten.
///
/// the function can handle sparse NaNs.
///
/// @param[in,out] strip 2D data, X-axis = analyser angle, Y-axis = arbitrary manipulator scan
///
/// @param[in] smooth_method smoothing method
@@ -205,12 +207,20 @@ function normalize_strip_x(strip, [smooth_method, smooth_factor, check])
endif
// average over all scan positions
wave dist = ad_profile_x(strip, -inf, inf, "")
wave raw_dist = ad_profile_x(strip, -inf, inf, "")
// remove nans
extract /free /indx raw_dist, clean_index, numtype(raw_dist) == 0
duplicate /free raw_dist, dist, dist_x
redimension /n=(numpnts(clean_index)) dist, dist_x
dist = raw_dist[clean_index[p]]
dist_x = pnt2x(raw_dist, clean_index[p])
variable div = mean(dist)
dist /= div
if (check)
duplicate /o dist, check_dist
duplicate /o raw_dist, check_dist
check_dist = numtype(raw_dist) == 0 ? interp(x, dist_x, dist) : nan
endif
// smooth distribution function
@@ -223,21 +233,24 @@ function normalize_strip_x(strip, [smooth_method, smooth_factor, check])
break
case 3:
make /n=1 /d /free fit_params
fit_scienta_ang_transm(dist, fit_params)
fit_scienta_ang_transm(raw_dist, fit_params)
duplicate /free raw_dist, dist, dist_x
dist_x = x
dist = scienta_ang_transm(fit_params, x)
break
case 4:
loess /smth=(smooth_factor) srcWave=dist
loess /smth=(smooth_factor) srcWave=dist, factors={dist_x}
break
endswitch
if (check)
duplicate /o dist, check_smoo
duplicate /o raw_dist, check_smoo
check_smoo = interp(x, dist_x, dist)
endif
// divide
if (check != 2)
strip /= dist[p]
strip /= interp(x, dist_x, dist)
endif
end
@@ -1660,6 +1673,17 @@ function /s display_hemi_scan(nickname, [projection, graphtype, do_ticks, do_gri
endif
string s_trace
DoWindow $graphname
if (v_flag)
if (str2num(GetUserData(graphname, "", "graphtype")) == graphtype)
// graph exists and will update automatically - do not recreate
graphtype = 0
else
// graph exists - but needs recreating
killwindow $graphname
endif
endif
switch(graphtype)
case 1:
graphname = display_polar_graph(graphname, angle_offset=azim_offset, do_ticks=do_ticks)
@@ -1673,6 +1697,7 @@ function /s display_hemi_scan(nickname, [projection, graphtype, do_ticks, do_gri
ColorScale /W=$graphname /C /N=text0 nticks=2, minor=1, tickLen=4.00, tickThick=0.50
SetWindow $graphname, userdata(projection)=num2str(projection)
SetWindow $graphname, userdata(graphtype)=num2str(graphtype)
draw_hemi_axes(graphname, do_grids=do_grids)
break
case 3:
@@ -1687,6 +1712,7 @@ function /s display_hemi_scan(nickname, [projection, graphtype, do_ticks, do_gri
ColorScale /W=$graphname /C /N=text0 nticks=2, minor=1, tickLen=4.00, tickThick=0.50
SetWindow $graphname, userdata(projection)=num2str(projection)
SetWindow $graphname, userdata(graphtype)=num2str(graphtype)
draw_hemi_axes(graphname, do_grids=do_grids)
break
endswitch

View File

@@ -79,7 +79,7 @@ static function init_package()
string /g s_reduction_params = "" // recently used reduction parameters
string /g s_preview_pvs = "" // semicolon-separated list of EPICS PVs to display in preview.
// the list items can contain wildcards for StringMatch
s_preview_pvs = "*OP:CURRENT*;*Stats*Total*;*CADC*"
s_preview_pvs = "*OP:CURRENT*;*Stats*Total*;*KEITHLEY*READOUT;*CADC*"
// non-persistent strings and variables
string /g s_preview_file = "" // file or folder name of the current preview
@@ -392,6 +392,25 @@ static function /wave preview_hdf_file(filename)
return preview_image
end
/// load the preview of a general ITX file.
///
/// the function is designed for PEARL OTF and EPICS scan data converted from MDA files.
/// the function picks the first wave whose PV note matches one from the global string s_preview_pvs
/// (see @ref preview_datafolder and @ref init_package).
///
/// the preview is loaded to the preview_image wave in the pearl_explorer data folder.
/// the s_file_info string is updated with information about the scan dimensions.
///
/// @note: the ITX files should load their waves into the current data folder (a "free" data folder).
/// some early versions of PEARL ITX data files created a data folder of their own.
/// both ways are allowed, while the first one is preferred.
/// on return, the current data folder must point to either the original free folder or the newly created one.
///
/// @param filename name of a file in the directory specified by the pearl_explorer_filepath path object.
///
/// @return wave reference of the preview trace.
/// empty wave reference if the function failed.
///
static function /wave preview_itx_file(filename)
string filename
@@ -401,10 +420,6 @@ static function /wave preview_itx_file(filename)
svar s_preview_source
wave preview_image
// note: some versions of PEARL data files save data to a new data folder,
// and leave the newly created folder as the current folder.
// the free data folder is used by those files which don't create their own data folder.
// this is the new recommended behaviour
dfref dataDF = newfreedatafolder()
setdatafolder dataDF
LoadWave /t/p=pearl_explorer_filepath/q filename

View File

@@ -90,6 +90,40 @@ threadsafe function MultiGaussLinBG_AO(pw, yw, xw) : FitFunc
endfor
end
/// doublet gaussian peaks on a linear background fit function (all at once).
///
/// this fits two gaussian peaks.
/// peak positions are specified by center and distance rather than individually.
/// amplitude and width are specified as absolute values for the upper peak (in x),
/// and relative values for the lower peak.
///
/// @note FWHM = width * 2 * sqrt(ln(2)) = width * 1.665
///
/// @param pw shape parameters.
/// the length of the wave defines the number of peaks.
/// @arg pw[0] = constant coefficient of background
/// @arg pw[1] = linear coefficient of background
/// @arg pw[2] = amplitude of peak 1 (higher x)
/// @arg pw[3] = amplitude of peak 2 relative to peak 1
/// @arg pw[4] = center position
/// @arg pw[5] = distance between peaks (splitting)
/// @arg pw[6] = width of peak 1 (see note)
/// @arg pw[7] = width of peak 2 relative to peak 1
///
/// @param yw y (dependent) values.
///
/// @param xw x (independent) independent values.
///
threadsafe function DoubletGaussLinBG_AO(pw, yw, xw) : FitFunc
wave pw
wave yw
wave xw
yw = pw[0] + xw[p] * pw[1]
yw += pw[2] * exp( -( (xw[p] - pw[4] - pw[5] /2) / pw[6] )^2 )
yw += pw[2] * pw[3] * exp( -( (xw[p] - pw[4] + pw[5] /2) / pw[6] / pw[7] )^2 )
end
//------------------------------------------------------------------------------
// Voigt shapes
//------------------------------------------------------------------------------
@@ -581,7 +615,7 @@ function Au4f(w, x): fitfunc
// otherwise only the constant background.
variable x
variable np = 15
variable np = numpnts(w)
variable ip, ip0
variable bg = w[0]