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

@ -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.