diff --git a/README.md b/README.md index 8e8561f..24e3bda 100644 --- a/README.md +++ b/README.md @@ -21,8 +21,8 @@ License ======= The source code of PEARL Procedures is available under the [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0) at . -Users of PEARL Procedures are requested to coordinate and share the development of the code with the original author. Please read and respect the respective license agreements. +Please share your extensions of the code with the original author. Author ------ diff --git a/pearl/pearl-area-display.ipf b/pearl/pearl-area-display.ipf index b6d5780..7c2bb98 100644 --- a/pearl/pearl-area-display.ipf +++ b/pearl/pearl-area-display.ipf @@ -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 diff --git a/pearl/pearl-area-profiles.ipf b/pearl/pearl-area-profiles.ipf index ded8044..d070836 100644 --- a/pearl/pearl-area-profiles.ipf +++ b/pearl/pearl-area-profiles.ipf @@ -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 diff --git a/pearl/pearl-data-explorer.ipf b/pearl/pearl-data-explorer.ipf index e891c92..ae09efa 100644 --- a/pearl/pearl-data-explorer.ipf +++ b/pearl/pearl-data-explorer.ipf @@ -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 diff --git a/pearl/pearl-pshell-import.ipf b/pearl/pearl-pshell-import.ipf index f0d1042..32e796a 100644 --- a/pearl/pearl-pshell-import.ipf +++ b/pearl/pearl-pshell-import.ipf @@ -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 @@ -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.