update data explorer: axis scale and labels in preview

This commit is contained in:
2016-08-17 12:12:52 +02:00
parent 86cf328961
commit a87975d1e6
5 changed files with 208 additions and 69 deletions

View File

@ -171,7 +171,6 @@ function /s ad_display_profiles(image, [filter])
duplicate /o image, $viewname /wave=view
make /n=(3,3)/o xprofiles // NX x 3 wave with 3 one-dimensional profiles along Y dimension
make /n=(3,3)/o yprofiles // NY x 3 wave with 3 one-dimensional profiles along X dimension
make /n=(1)/o hist // histogram
string /g view_filter
string /g view_filter_options
view_filter = filter
@ -193,16 +192,13 @@ function /s ad_display_profiles(image, [filter])
graphname = s_name
AppendToGraph /w=$graphname /L=xprofiles xprofiles[*][0],xprofiles[*][1],xprofiles[*][2]
AppendToGraph /w=$graphname /VERT/B=yprofiles yprofiles[*][0],yprofiles[*][1],yprofiles[*][2]
AppendToGraph /w=$graphname /R=hist/B=yprofiles hist
AppendImage /w=$graphname view
string imgname = StringFromList(0, ImageNameList(graphname, ";"))
ModifyImage /w=$graphname $imgname ctab= {*,*,BlueGreenOrange,0}
ModifyGraph /w=$graphname rgb(xprofiles)=(39168,0,0),rgb(yprofiles)=(39168,0,0)
ModifyGraph /w=$graphname rgb(xprofiles#1)=(0,26112,0),rgb(yprofiles#1)=(0,26112,0)
ModifyGraph /w=$graphname rgb(xprofiles#2)=(0,9472,39168),rgb(yprofiles#2)=(0,9472,39168)
ModifyGraph /w=$graphname rgb(hist)=(43520,43520,43520)
ModifyGraph /w=$graphname mode(hist)=5,hbFill(hist)=2
ModifyGraph /w=$graphname mirror(xprofiles)=0,mirror(bottom)=3,mirror(yprofiles)=3,mirror(left)=3
ModifyGraph /w=$graphname mirror(xprofiles)=2,mirror(bottom)=3,mirror(yprofiles)=2,mirror(left)=3
ModifyGraph /w=$graphname nticks=3
ModifyGraph /w=$graphname minor=1
ModifyGraph /w=$graphname axThick=0.5
@ -210,21 +206,33 @@ function /s ad_display_profiles(image, [filter])
ModifyGraph /w=$graphname btLen=4
ModifyGraph /w=$graphname freePos(xprofiles)=0
ModifyGraph /w=$graphname freePos(yprofiles)=0
ModifyGraph /w=$graphname freePos(hist)=0
ModifyGraph /w=$graphname axisEnab(xprofiles)={0.64,1}
ModifyGraph /w=$graphname axisEnab(hist)={0.64,1}
ModifyGraph /w=$graphname axisEnab(bottom)={0,0.6}
ModifyGraph /w=$graphname axisEnab(yprofiles)={0.64,1}
ModifyGraph /w=$graphname axisEnab(left)={0,0.6}
ModifyGraph /w=$graphname zero(left)=8
ModifyGraph /w=$graphname margin(left)=40,margin(bottom)=30,margin(top)=20,margin(right)=40
ModifyGraph /w=$graphname gfSize=10
Label /w=$graphname xprofiles "value (\\U)"
Label /w=$graphname bottom "X (\\U)"
Label /w=$graphname yprofiles "value (\\U)"
Label /w=$graphname left "Y (\\U)"
Label /w=$graphname hist "\\Epixels"
SetAxis /w=$graphname /A /E=1 hist
// axis labels
string labels = note(image)
string lab
lab = StringByKey("AxisLabelX", labels, "=", "\r")
if (!strlen(lab))
lab = "X"
endif
Label /w=$graphname bottom lab + " (\\U)"
lab = StringByKey("AxisLabelY", labels, "=", "\r")
if (!strlen(lab))
lab = "Y"
endif
Label /w=$graphname left lab + " (\\U)"
lab = StringByKey("AxisLabelD", labels, "=", "\r")
if (!strlen(lab))
lab = "value"
endif
Label /w=$graphname xprofiles lab + " (\\U)"
Label /w=$graphname yprofiles lab + " (\\U)"
// legend
if (show_legend)
@ -233,13 +241,18 @@ function /s ad_display_profiles(image, [filter])
AppendText /w=$graphname "\\s(xprofiles#2)\tROI average"
AppendText /w=$graphname "min\t\\{" + s_viewdf + "graph_min}"
AppendText /w=$graphname "max\t\\{" + s_viewdf + "graph_max}"
AppendText /w=$graphname "avg\t\\{" + s_viewdf + "graph_avg}"
AppendText /w=$graphname "sum\t\\{" + s_viewdf + "graph_sum}"
AppendText /w=$graphname "avg\t\\{" + s_viewdf + "graph_avg}"
AppendText /w=$graphname "sdev\t\\{" + s_viewdf + "graph_sdev}"
else
TextBox /w=$graphname /C/N=text_sum/F=0/B=1/X=1.00/Y=1.00 "sum \\{" + s_viewdf + "graph_sum}"
TextBox /w=$graphname /C/N=text_avg/F=0/B=1/X=1.00/Y=6.00 "avg \\{" + s_viewdf + "graph_avg}"
TextBox /w=$graphname /C/N=text_sdev/F=0/B=1/X=1.00/Y=11.00 "sdev \\{" + s_viewdf + "graph_sdev}"
TextBox /w=$graphname /C/N=text0 /F=0 /B=1 /X=1.00 /Y=1.00
lab = StringByKey("Dataset", labels, "=", "\r")
if (strlen(lab))
AppendText /w=$graphname lab
endif
AppendText /w=$graphname "sum\t\\{" + s_viewdf + "graph_sum}"
AppendText /w=$graphname "avg\t\\{" + s_viewdf + "graph_avg}"
AppendText /w=$graphname "sdev\t\\{" + s_viewdf + "graph_sdev}"
endif
// interactive elements
@ -1115,13 +1128,32 @@ function ad_brick_slicer(data)
variable /g x_autoinc = 0
variable /g y_autoinc = 0
variable /g z_autoinc = 0
// axis labels
string labels = note(data)
string xlabel = StringByKey("AxisLabelX", labels, "=", "\r")
if (!strlen(xlabel))
xlabel = "X"
endif
string ylabel = StringByKey("AxisLabelY", labels, "=", "\r")
if (!strlen(ylabel))
ylabel = "Y"
endif
string zlabel = StringByKey("AxisLabelZ", labels, "=", "\r")
if (!strlen(zlabel))
zlabel = "Z"
endif
string dlabel = StringByKey("Dataset", labels, "=", "\r")
if (!strlen(dlabel))
dlabel = NameOfWave(data)
endif
// this section copied from slicer panel
NewPanel /k=1 /W=(500,600,890,940) /N=SlicerPanel as "Brick Slicer"
string /g slicer_panelname = S_name
string panel = s_name
GroupBox g_xslice win=$panel,pos={8,8},size={376,96},title="X Slice"
GroupBox g_xslice win=$panel,pos={8,8},size={376,96},title=xlabel
Slider sl_xslice_position win=$panel,pos={16,32},size={240,56},proc=PearlAreaDisplay#slp_slice_position
Slider sl_xslice_position win=$panel,limits={0,100,1},variable=x_slice_pos,vert= 0
SetVariable sv_xslice_position win=$panel,pos={20,80},size={92,16},proc=PearlAreaDisplay#svp_slice_position,title="X"
@ -1141,7 +1173,7 @@ function ad_brick_slicer(data)
Button b_xslice_stop win=$panel,pos={336,48},size={20,20},proc=PearlAreaDisplay#bp_move_slice,title="\\W616"
Button b_xslice_stop win=$panel,help={"stop animation"}
GroupBox g_yslice win=$panel,pos={8,108},size={376,96},title="Y Slice"
GroupBox g_yslice win=$panel,pos={8,108},size={376,96},title=ylabel
Slider sl_yslice_position win=$panel,pos={16,132},size={240,56},proc=PearlAreaDisplay#slp_slice_position
Slider sl_yslice_position win=$panel,limits={0,100,1},variable=y_slice_pos,vert= 0
SetVariable sv_yslice_position win=$panel,pos={20,180},size={92,16},proc=PearlAreaDisplay#svp_slice_position,title="Y"
@ -1161,7 +1193,7 @@ function ad_brick_slicer(data)
Button b_yslice_stop win=$panel,pos={336,148},size={20,20},proc=PearlAreaDisplay#bp_move_slice,title="\\W616"
Button b_yslice_stop win=$panel,help={"stop animation"}
GroupBox g_zslice win=$panel,pos={8,208},size={376,96},title="Z Slice"
GroupBox g_zslice win=$panel,pos={8,208},size={376,96},title=zlabel
Slider sl_zslice_position win=$panel,pos={16,232},size={240,56},proc=PearlAreaDisplay#slp_slice_position
Slider sl_zslice_position win=$panel,limits={0,100,1},variable=z_slice_pos,vert= 0
SetVariable sv_zslice_position win=$panel,pos={20,280},size={92,16},proc=PearlAreaDisplay#svp_slice_position,title="Z"
@ -1181,7 +1213,7 @@ function ad_brick_slicer(data)
Button b_zslice_stop win=$panel,pos={336,248},size={20,20},proc=PearlAreaDisplay#bp_move_slice,title="\\W616"
Button b_zslice_stop win=$panel,help={"stop animation"}
TitleBox t_slicerpath win=$panel,pos={8,316},size={128,20},disable=2,title=GetDataFolder(1,viewdf)
TitleBox t_slicerpath win=$panel,pos={8,316},size={128,20},disable=2,title=dlabel
//SetVariable setvar0 win=$panel,pos={240,316},size={120,16},title="slab thickness"
//SetVariable setvar0 win=$panel,limits={1,inf,1},value=slab_thickness

View File

@ -613,3 +613,36 @@ threadsafe function calc_y_profile_mins(image)
yminlocs[ix] = v_minloc
endfor
end
/// collect profiles from a multi-scan.
///
/// @warning experimental: name and interface of this function may change.
///
function ad_collect_multiscan_y(dataset, positions, destwave, [noavg])
wave dataset
wave positions
wave destwave
variable noavg
variable tol = (wavemax(positions) - wavemin(positions)) / numpnts(positions) / 100
duplicate /free positions, positions_sorted
sort positions_sorted, positions_sorted
duplicate /free positions_sorted, positions_diff
differentiate /p /meth=2 positions_sorted /d=positions_diff
positions_diff[0] = 1
extract /free positions_sorted, positions_unique, positions_diff > tol
variable n_unique = numpnts(positions_unique)
redimension /n=(dimsize(dataset, 0), n_unique) destwave
variable i
variable nx, ny
for (i = 0; i < n_unique; i += 1)
extract /free dataset, data_extract, abs(positions[q] - positions_unique[i]) < tol
nx = dimsize(dataset, 0)
ny = dimsize(data_extract, 0) / nx
redimension /n=(nx, ny) data_extract
wave profile = ad_profile_x(data_extract, -inf, inf, "", noavg=noavg)
destwave[][i] = profile[p]
endfor
end

View File

@ -759,18 +759,21 @@ static function /s show_preview_graph(data, [xdata])
svar s_profiles_graph
svar s_preview_file
svar s_preview_source
svar s_preview_trace_graph
if ((strlen(s_profiles_graph) > 0) && (WinType(s_profiles_graph) == 1))
KillWindow $s_profiles_graph
endif
if ((strlen(s_preview_trace_graph) > 0) && (WinType(s_preview_trace_graph) == 1))
KillWindow $s_preview_trace_graph
endif
string graphname
if (wavedims(data) == 2)
if ((strlen(s_profiles_graph) > 0) && (WinType(s_profiles_graph) == 1))
ad_update_profiles(data)
else
s_profiles_graph = ad_display_profiles(data)
ModifyGraph /w=$s_profiles_graph /z wbRGB=(48640,56832,60160)
endif
s_profiles_graph = ad_display_profiles(data)
ModifyGraph /w=$s_profiles_graph /z wbRGB=(48640,56832,60160)
graphname = s_profiles_graph
elseif (wavedims(data) == 1)
svar s_preview_trace_graph
duplicate /o data, preview_trace
if (!ParamIsDefault(xdata))
duplicate /o xdata, preview_trace_x
@ -779,20 +782,8 @@ static function /s show_preview_graph(data, [xdata])
preview_trace_x = x
setscale d 0, 0, WaveUnits(data, 0), preview_trace_x
endif
if ((strlen(s_preview_trace_graph) == 0) || (WinType(s_preview_trace_graph) != 1))
display /n=pearl_explorer_1d /k=1 preview_trace vs preview_trace_x as "Preview"
s_preview_trace_graph = s_name
ModifyGraph /w=$s_preview_trace_graph wbRGB=(48640,56832,60160)
ModifyGraph /w=$s_preview_trace_graph rgb[0]=(0,0,0)
ModifyGraph /w=$s_preview_trace_graph grid=2
ModifyGraph /w=$s_preview_trace_graph mirror=1
ModifyGraph /w=$s_preview_trace_graph minor=1
ModifyGraph /w=$s_preview_trace_graph axThick=0.5
ModifyGraph /w=$s_preview_trace_graph gridRGB=(52224,52224,52224)
ModifyGraph /w=$s_preview_trace_graph gridHair=0
ModifyGraph /w=$s_preview_trace_graph tick=0
ModifyGraph /w=$s_preview_trace_graph btLen=4
endif
s_preview_trace_graph = display_preview_trace(preview_trace_x, preview_trace)
ModifyGraph /w=$s_preview_trace_graph wbRGB=(48640,56832,60160)
graphname = s_preview_trace_graph
else
return ""
@ -808,6 +799,39 @@ static function /s show_preview_graph(data, [xdata])
return graphname
end
static function /s display_preview_trace(xtrace, ytrace)
wave xtrace
wave ytrace
display /n=pearl_explorer_1d /k=1 ytrace vs xtrace as "Preview"
string graphname = s_name
ModifyGraph /w=$graphname rgb[0]=(0,0,0)
ModifyGraph /w=$graphname grid=2
ModifyGraph /w=$graphname mirror=1
ModifyGraph /w=$graphname minor=1
ModifyGraph /w=$graphname axThick=0.5
ModifyGraph /w=$graphname gridRGB=(52224,52224,52224)
ModifyGraph /w=$graphname gridHair=0
ModifyGraph /w=$graphname tick=0
ModifyGraph /w=$graphname btLen=4
// axis labels
string labels = note(ytrace)
string lab
lab = StringByKey("AxisLabelX", labels, "=", "\r")
if (!strlen(lab))
lab = "X"
endif
Label /w=$graphname bottom lab + " (\\U)"
lab = StringByKey("AxisLabelD", labels, "=", "\r")
if (!strlen(lab))
lab = "value"
endif
Label /w=$graphname left lab + " (\\U)"
return s_name
end
static function load_selected_files([options])
string options
@ -1426,6 +1450,9 @@ static function bp_dataset_folder(ba) : ButtonControl
string cmd
sprintf cmd, "setdatafolder root:%s", PossiblyQuoteName(dataset)
execute /q /z cmd
cmd = "setdatafolder :scan_1"
execute /q /z cmd
sprintf cmd, "setdatafolder %s", GetDataFolder(1)
print cmd
endif
break

View File

@ -1,5 +1,5 @@
#pragma rtGlobals=3 // Use modern global access method and strict wave access.
#pragma IgorVersion = 6.2
#pragma IgorVersion = 6.36
#pragma ModuleName = PearlPShellImport
#pragma version = 1.02
#include <HDF5 Browser>
@ -537,6 +537,7 @@ function /s psh5_load_scan_meta(fileID, scanpath)
ScanReadables[0] = "ScientaSpectrum"
wavenames = AddListItem("ScanReadables", wavenames, ";", inf)
endif
wavenames = ReplaceString(";;", wavenames, ";")
return wavenames
end
@ -699,6 +700,21 @@ function /s psh5_load_scan_preview(fileID, scanpath, [set_scale])
wave /z data = $dataname
if (waveexists(data))
if (set_scale)
setdatafolder dataDF
string positioners
string positioner
string positionerpath
positioners = psh5_load_scan_meta(fileID, scanpath)
wave /t /z ScanWritables
if (waveexists(ScanWritables) && (numpnts(ScanWritables) >= 1))
positioner = ScanWritables[0]
if (strlen(positioner) > 0)
positionerpath = scanpath + "/" + positioner
positionerpath = ReplaceString("//", positionerpath, "/")
HDF5LoadData /O /Q /Z fileID, positionerpath
endif
endif
setdatafolder dataDF
newdatafolder /o/s attr
killwaves /a/z
@ -1008,18 +1024,24 @@ function ps_set_dimlabels(data)
setdimlabel 2, -1, $kScanDimLabel, data
endif
break
case "ScientaSpectrum":
setdimlabel 0, -1, $kEnergyDimLabel, data
break
case "ImageAngleDistribution":
case "ScientaAngleDistribution":
setdimlabel 0, -1, $kScanDimLabel, data
setdimlabel 1, -1, $kAngleDimLabel, data
if (WaveDims(data) >= 2)
setdimlabel 0, -1, $kScanDimLabel, data
setdimlabel 1, -1, $kAngleDimLabel, data
else
setdimlabel 0, -1, $kAngleDimLabel, data
endif
break
case "ScientaSpectrum":
case "ImageEnergyDistribution":
case "ScientaEnergyDistribution":
setdimlabel 0, -1, $kScanDimLabel, data
setdimlabel 1, -1, $kEnergyDimLabel, data
if (WaveDims(data) >= 2)
setdimlabel 0, -1, $kScanDimLabel, data
setdimlabel 1, -1, $kEnergyDimLabel, data
else
setdimlabel 0, -1, $kEnergyDimLabel, data
endif
break
default:
setdimlabel 0, -1, $kScanDimLabel, data
@ -1040,8 +1062,8 @@ function ps_scale_datasets()
dfref attrDF = :attr
make /n=3 /free lo, hi
make /n=3 /t /free un
ps_detect_scale(lo, hi, un)
make /n=3 /t /free ax, un
ps_detect_scale(ax, lo, hi, un)
wave /t /z /SDFR=dataDF ScanReadables
if (WaveExists(ScanReadables))
@ -1051,7 +1073,7 @@ function ps_scale_datasets()
for (isr = 0; isr < nsr; isr += 1)
wave /z /SDFR=dataDF wsr = $ScanReadables[isr]
if (WaveExists(wsr))
ps_scale_dataset_2(wsr, lo, hi, un)
ps_scale_dataset_2(wsr, ax, lo, hi, un)
endif
endfor
endif
@ -1078,9 +1100,9 @@ function ps_scale_dataset(data)
setdatafolder dataDF
make /n=3 /free lo, hi
make /n=3 /t /free un
ps_detect_scale(lo, hi, un)
ps_scale_dataset_2(data, lo, hi, un)
make /n=3 /t /free ax, un
ps_detect_scale(ax, lo, hi, un)
ps_scale_dataset_2(data, ax, lo, hi, un)
setdatafolder saveDF
end
@ -1096,7 +1118,7 @@ end
/// @arg `lo[%%energy]` analyser energy dimension.
/// @arg `lo[%%angle]` analyser angle dimension.
/// @arg `lo[%%scan]` scan dimension.
/// @arg `lo[%%data]` data dimension (units).
/// @arg `lo[%%data]` data dimension.
///
/// the function tries to read the following waves,
/// and may fall back to more or less reasonable default values if they are not found.
@ -1108,15 +1130,18 @@ end
/// @arg `ScanWritables`
/// @arg wave referenced by `ScanWritables[0]`
///
/// @param ax text wave to receive the axis labels.
///
/// @param lo wave to receive the lower limits.
///
/// @param hi wave to receive the upper limits.
///
/// @param un text wave to receive the unit labels.
///
/// @return the function results are written to the lo, hi, un waves.
/// @return the function results are written to the lo, hi, un, and ax waves.
///
function ps_detect_scale(lo, hi, un)
function ps_detect_scale(ax, lo, hi, un)
wave /t ax
wave lo
wave hi
wave /t un
@ -1124,28 +1149,32 @@ function ps_detect_scale(lo, hi, un)
dfref dataDF = GetDataFolderDFR()
dfref attrDF = :attr
redimension /n=4 lo, hi, un
setdimlabel 0, 0, $kEnergyDimLabel, lo, hi, un
setdimlabel 0, 1, $kAngleDimLabel, lo, hi, un
setdimlabel 0, 2, $kScanDimLabel, lo, hi, un
setdimlabel 0, 3, $kDataDimLabel, lo, hi, un
redimension /n=4 lo, hi, un, ax
setdimlabel 0, 0, $kEnergyDimLabel, lo, hi, un, ax
setdimlabel 0, 1, $kAngleDimLabel, lo, hi, un, ax
setdimlabel 0, 2, $kScanDimLabel, lo, hi, un, ax
setdimlabel 0, 3, $kDataDimLabel, lo, hi, un, ax
// default values
lo[%$kEnergyDimLabel] = 0
hi[%$kEnergyDimLabel] = 1
un[%$kEnergyDimLabel] = "eV"
ax[%$kEnergyDimLabel] = "Ekin"
lo[%$kAngleDimLabel] = -1
hi[%$kAngleDimLabel] = 1
un[%$kAngleDimLabel] = ""
un[%$kAngleDimLabel] = "arb."
un[%$kAngleDimLabel] = "slice"
lo[%$kScanDimLabel] = 0
hi[%$kScanDimLabel] = 1
un[%$kScanDimLabel] = ""
un[%$kScanDimLabel] = "arb."
ax[%$kScanDimLabel] = "scan"
lo[%$kDataDimLabel] = 0
hi[%$kDataDimLabel] = 0
un[%$kDataDimLabel] = "arb."
ax[%$kDataDimLabel] = "value"
wave /SDFR=attrDF /T /Z LensMode
wave /SDFR=attrDF /Z ChannelBegin = ScientaChannelBegin
@ -1160,14 +1189,17 @@ function ps_detect_scale(lo, hi, un)
lo[%$kAngleDimLabel] = -45/2
hi[%$kAngleDimLabel] = +45/2
un[%$kAngleDimLabel] = "deg"
ax[%$kAngleDimLabel] = "angle"
break
case "Angular60":
lo[%$kAngleDimLabel] = -60/2
hi[%$kAngleDimLabel] = +60/2
un[%$kAngleDimLabel] = "deg"
ax[%$kAngleDimLabel] = "angle"
break
case "Transmission":
un[%$kAngleDimLabel] = "arb."
ax[%$kAngleDimLabel] = "offset"
break
endswitch
endif
@ -1190,6 +1222,7 @@ function ps_detect_scale(lo, hi, un)
if (WaveExists(scanner))
lo[%$kScanDimLabel] = scanner[0]
hi[%$kScanDimLabel] = scanner[numpnts(scanner)-1]
ax[%$kScanDimLabel] = NameOfWave(scanner)
endif
endif
end
@ -1211,14 +1244,23 @@ end
/// @param data data wave to be scaled.
/// dimension labels (index -1) must be set to match the limit waves.
///
/// @param ax axis labels.
/// the axis labels are written to the wave note in the format `AxisLabel%%s=%%s`
/// where `X`, `Y`, `Z`, `D` is substituted for the first place holder
/// and the label for the second one.
///
/// @param lo lower limits.
/// the lower limits are applied using the SetScale operation.
///
/// @param hi upper limits.
/// the upper limits are applied using the SetScale operation.
///
/// @param un unit labels.
/// the unit labels are applied using the SetScale operation.
///
function ps_scale_dataset_2(data, lo, hi, un)
function ps_scale_dataset_2(data, ax, lo, hi, un)
wave data
wave /t ax
wave lo
wave hi
wave /t un
@ -1227,19 +1269,24 @@ function ps_scale_dataset_2(data, lo, hi, un)
sdim = GetDimLabel(data, 0, -1)
if (strlen(sdim))
setscale /i x lo[%$sdim], hi[%$sdim], un[%$sdim], data
Note data, "AxisLabelX=" + ax[%$sdim]
endif
sdim = GetDimLabel(data, 1, -1)
if (strlen(sdim))
setscale /i y lo[%$sdim], hi[%$sdim], un[%$sdim], data
Note data, "AxisLabelY=" + ax[%$sdim]
endif
sdim = GetDimLabel(data, 2, -1)
if (strlen(sdim))
setscale /i z lo[%$sdim], hi[%$sdim], un[%$sdim], data
Note data, "AxisLabelZ=" + ax[%$sdim]
endif
setscale d 0, 0, un[%$kDataDimLabel], data
Note data, "AxisLabelD=" + ax[%$kDataDimLabel]
Note data, "Dataset=" + NameOfWave(data)
end
/// load and reduce the ScientaImage dataset of the first scan of a PShell data file.