bugfix release: pshell import and preview
changes: - catch runtime errors due to empty datasets - improve window titles and graph names - fix scaling of scienta image from XPSSpectrum script - remove unnecessary spaces and underscores from folder names
This commit is contained in:
@ -183,7 +183,9 @@ function /s psh5_load_complete(ANickName, APathName, AFileName, [load_data, load
|
||||
|
||||
for (ig = 0; ig < ng; ig += 1)
|
||||
sg = StringFromList(ig, s_scanpaths, ";")
|
||||
folder = CleanupName(ReplaceString("/", sg, ""), 0)
|
||||
folder = ReplaceString("/", sg, "")
|
||||
folder = ReplaceString(" ", folder, "")
|
||||
folder = CleanupName(folder, 0)
|
||||
setdatafolder fileDF
|
||||
newdatafolder /s /o $folder
|
||||
psh5_load_scan_complete(fileID, sg, load_data=load_data, load_attr=load_attr)
|
||||
@ -219,14 +221,26 @@ end
|
||||
/// @param load_attr 1 (default): load attributes; 0: do not load attributes
|
||||
/// note: for correct scaling of the image, the attributes need to be loaded
|
||||
///
|
||||
/// @param pref_scans semicolon-separated list of preferred scans.
|
||||
/// the items of the list are match strings for the Igor StringMatch function.
|
||||
/// the first matching scan (i.e. top-level HDF5 group with a matching name) is loaded from the file.
|
||||
/// if no match is found, the first scan is loaded.
|
||||
///
|
||||
/// @param pref_datasets semicolon-separated list of preferred datasets.
|
||||
/// the items of the list are match strings for the Igor StringMatch function.
|
||||
/// the first matching dataset is loaded from the file.
|
||||
/// if no match is found, the first dataset listed in the file is loaded.
|
||||
///
|
||||
/// @return name of loaded preview wave.
|
||||
///
|
||||
function /s psh5_load_preview(ANickName, APathName, AFileName, [load_data, load_attr])
|
||||
function /s psh5_load_preview(ANickName, APathName, AFileName, [load_data, load_attr, pref_scans, pref_datasets])
|
||||
string ANickName
|
||||
string APathName
|
||||
string AFileName
|
||||
variable load_data
|
||||
variable load_attr
|
||||
string pref_scans
|
||||
string pref_datasets
|
||||
|
||||
if (ParamIsDefault(load_data))
|
||||
load_data = 1
|
||||
@ -234,7 +248,13 @@ function /s psh5_load_preview(ANickName, APathName, AFileName, [load_data, load_
|
||||
if (ParamIsDefault(load_attr))
|
||||
load_attr = 1
|
||||
endif
|
||||
|
||||
if (ParamIsDefault(pref_scans))
|
||||
pref_scans = "*scan1*;"
|
||||
endif
|
||||
if (ParamIsDefault(pref_datasets))
|
||||
pref_datasets = ""
|
||||
endif
|
||||
|
||||
dfref saveDF = GetDataFolderDFR()
|
||||
setdatafolder root:
|
||||
newdatafolder /o/s pearl_area
|
||||
@ -253,12 +273,35 @@ function /s psh5_load_preview(ANickName, APathName, AFileName, [load_data, load_
|
||||
if (v_flag == 0)
|
||||
AFileName = s_path + s_filename
|
||||
dfref fileDF = GetDataFolderDFR()
|
||||
|
||||
scanpaths = psh5_list_scans(fileID)
|
||||
variable ng = ItemsInList(scanpaths)
|
||||
variable ig
|
||||
string sg
|
||||
ig = 0
|
||||
sg = StringFromList(ig, scanpaths, ";")
|
||||
dataname = psh5_load_scan_preview(fileID, sg, set_scale=load_attr)
|
||||
variable np = ItemsInList(pref_scans)
|
||||
variable ip
|
||||
string sp
|
||||
variable found = 0
|
||||
if (ng > 0)
|
||||
for (ip = 0; ip < np; ip += 1)
|
||||
for (ig = 0; ig < ng; ig += 1)
|
||||
sg = StringFromList(ig, scanpaths)
|
||||
sp = StringFromList(ip, pref_scans)
|
||||
if (StringMatch(sg, sp))
|
||||
found = 1
|
||||
break
|
||||
endif
|
||||
endfor
|
||||
if (found)
|
||||
break
|
||||
endif
|
||||
endfor
|
||||
if (!found)
|
||||
ig = 0
|
||||
endif
|
||||
sg = StringFromList(ig, scanpaths)
|
||||
dataname = psh5_load_scan_preview(fileID, sg, set_scale=load_attr, pref_datasets=pref_datasets)
|
||||
endif
|
||||
|
||||
wave /z data = $dataname
|
||||
string destpath = GetDataFolder(1, saveDF) + ANickName
|
||||
@ -396,6 +439,9 @@ end
|
||||
///
|
||||
/// data is loaded into the current data folder.
|
||||
///
|
||||
/// this function does not scale the datasets.
|
||||
/// call ps_scale_datasets() separately.
|
||||
///
|
||||
/// @param fileID ID of open HDF5 file from psh5_open_file().
|
||||
///
|
||||
/// @param scanpath path to the scan group in the HDF5 file, e.g. "/scan 1".
|
||||
@ -517,28 +563,29 @@ function /s psh5_load_scan_meta(fileID, scanpath)
|
||||
HDF5LoadData /O /Q /Z /A="Dimensions" /N=ScanDimensions /TYPE=1 fileID, scanpath
|
||||
if (!v_flag)
|
||||
wavenames = AddListItem(s_wavenames, wavenames, ";", inf)
|
||||
HDF5LoadData /O /Q /Z /A="Writables" /N=ScanWritables /TYPE=1 fileID, scanpath
|
||||
if (!v_flag)
|
||||
wavenames = AddListItem(s_wavenames, wavenames, ";", inf)
|
||||
endif
|
||||
HDF5LoadData /O /Q /Z /A="Readables" /N=ScanReadables /TYPE=1 fileID, scanpath
|
||||
if (!v_flag)
|
||||
wavenames = AddListItem(s_wavenames, wavenames, ";", inf)
|
||||
endif
|
||||
HDF5LoadData /O /Q /Z /A="Steps" /N=ScanSteps /TYPE=1 fileID, scanpath
|
||||
if (!v_flag)
|
||||
wavenames = AddListItem(s_wavenames, wavenames, ";", inf)
|
||||
endif
|
||||
else
|
||||
make /n=1 /o ScanDimensions
|
||||
ScanDimensions = 0
|
||||
wavenames = AddListItem("ScanDimensions", wavenames, ";", inf)
|
||||
endif
|
||||
HDF5LoadData /O /Q /Z /A="Readables" /N=ScanReadables /TYPE=1 fileID, scanpath
|
||||
if (!v_flag)
|
||||
wavenames = AddListItem(s_wavenames, wavenames, ";", inf)
|
||||
else
|
||||
make /n=1 /o /t ScanReadables
|
||||
ScanReadables[0] = "ScientaSpectrum"
|
||||
wavenames = AddListItem("ScanReadables", wavenames, ";", inf)
|
||||
endif
|
||||
HDF5LoadData /O /Q /Z /A="Writables" /N=ScanWritables /TYPE=1 fileID, scanpath
|
||||
if (!v_flag)
|
||||
wavenames = AddListItem(s_wavenames, wavenames, ";", inf)
|
||||
endif
|
||||
HDF5LoadData /O /Q /Z /A="Steps" /N=ScanSteps /TYPE=1 fileID, scanpath
|
||||
if (!v_flag)
|
||||
wavenames = AddListItem(s_wavenames, wavenames, ";", inf)
|
||||
endif
|
||||
wavenames = ReplaceString(";;", wavenames, ";")
|
||||
|
||||
|
||||
return wavenames
|
||||
end
|
||||
|
||||
@ -573,6 +620,10 @@ function /s psh5_load_dataset(fileID, scanpath, datasetname, [set_scale])
|
||||
string datasetname
|
||||
variable set_scale
|
||||
|
||||
if (ParamIsDefault(set_scale))
|
||||
set_scale = 1
|
||||
endif
|
||||
|
||||
string datasetpath
|
||||
datasetpath = scanpath + "/" + datasetname
|
||||
datasetpath = ReplaceString("//", datasetpath, "/")
|
||||
@ -586,7 +637,7 @@ function /s psh5_load_dataset(fileID, scanpath, datasetname, [set_scale])
|
||||
endif
|
||||
|
||||
string dataname
|
||||
if (di.ndims < 3)
|
||||
if (di.ndims < 2)
|
||||
HDF5LoadData /O /Q /Z fileID, datasetpath
|
||||
dataname = StringFromList(0, S_waveNames)
|
||||
else
|
||||
@ -626,42 +677,68 @@ end
|
||||
/// @arg 1 (default) set the wave scaling.
|
||||
/// @arg 0 do not set the wave scaling.
|
||||
///
|
||||
/// @param pref_datasets semicolon-separated list of preferred datasets.
|
||||
/// the items of the list are match strings for the Igor StringMatch function.
|
||||
/// the first matching dataset is loaded from the file.
|
||||
/// if no match is found, the first dataset listed in the file is loaded.
|
||||
/// if empty, a hard-coded default preference list is used.
|
||||
///
|
||||
/// @return name of loaded wave if successful. empty string otherwise.
|
||||
///
|
||||
function /s psh5_load_scan_preview(fileID, scanpath, [set_scale])
|
||||
function /s psh5_load_scan_preview(fileID, scanpath, [set_scale, pref_datasets])
|
||||
variable fileID
|
||||
string scanpath
|
||||
variable set_scale
|
||||
string pref_datasets
|
||||
|
||||
if (ParamIsDefault(set_scale))
|
||||
set_scale = 1
|
||||
endif
|
||||
if (ParamIsDefault(pref_datasets) || (strlen(pref_datasets) == 0))
|
||||
pref_datasets = "ScientaImage;ScientaSpectrum;ImageAngleDistribution;ImageEnergyDistribution;Counts;SampleCurrent"
|
||||
endif
|
||||
|
||||
dfref saveDF = GetDataFolderDFR()
|
||||
dfref dataDF = saveDF
|
||||
|
||||
string datasets = psh5_list_scan_datasets(fileID, scanpath)
|
||||
string datasetname = ""
|
||||
variable index
|
||||
// todo: this should be generalized
|
||||
if (strsearch(datasets, "ScientaImage", 0) >= 0)
|
||||
datasetname = "ScientaImage"
|
||||
elseif (strsearch(datasets, "ScientaSpectrum", 0) >= 0)
|
||||
datasetname = "ScientaSpectrum"
|
||||
elseif (strsearch(datasets, "ScientaEnergyDistribution", 0) >= 0)
|
||||
datasetname = "ScientaEnergyDistribution"
|
||||
elseif (strsearch(datasets, "ImageEnergyDistribution", 0) >= 0)
|
||||
datasetname = "ImageEnergyDistribution"
|
||||
elseif (strsearch(datasets, "Counts", 0) >= 0)
|
||||
datasetname = "Counts"
|
||||
elseif (strsearch(datasets, "SampleCurrent", 0) >= 0)
|
||||
datasetname = "SampleCurrent"
|
||||
|
||||
variable nds = ItemsInList(datasets)
|
||||
variable ids
|
||||
string sds
|
||||
variable np = ItemsInList(pref_datasets)
|
||||
variable ip
|
||||
string sp
|
||||
variable found = 0
|
||||
if (nds > 0)
|
||||
for (ip = 0; ip < np; ip += 1)
|
||||
for (ids = 0; ids < nds; ids += 1)
|
||||
sds = StringFromList(ids, datasets)
|
||||
index = ItemsInList(sds, "/") - 1
|
||||
sds = StringFromList(index, sds, "/")
|
||||
sp = StringFromList(ip, pref_datasets)
|
||||
if (StringMatch(sds, sp))
|
||||
found = 1
|
||||
break
|
||||
endif
|
||||
endfor
|
||||
if (found)
|
||||
break
|
||||
endif
|
||||
endfor
|
||||
if (!found)
|
||||
ids = 0
|
||||
sds = StringFromList(ids, datasets)
|
||||
index = ItemsInList(sds, "/") - 1
|
||||
sds = StringFromList(index, sds, "/")
|
||||
endif
|
||||
else
|
||||
datasetname = StringFromList(0, datasets)
|
||||
index = ItemsInList(datasetname, "/") - 1
|
||||
datasetname = StringFromList(index, datasetname, "/")
|
||||
endif
|
||||
if (strlen(datasetname) == 0)
|
||||
return ""
|
||||
endif
|
||||
|
||||
|
||||
string datasetpath
|
||||
string datasetname = sds
|
||||
datasetpath = scanpath + "/" + datasetname
|
||||
datasetpath = ReplaceString("//", datasetpath, "/")
|
||||
STRUCT HDF5DataInfo di // Defined in HDF5 Browser.ipf.
|
||||
@ -673,7 +750,7 @@ function /s psh5_load_scan_preview(fileID, scanpath, [set_scale])
|
||||
endif
|
||||
|
||||
string dataname
|
||||
if (di.ndims < 3)
|
||||
if (di.ndims < 2)
|
||||
HDF5LoadData /O /Q /Z fileID, datasetpath
|
||||
dataname = StringFromList(0, S_waveNames)
|
||||
wave /z data = $dataname
|
||||
@ -803,6 +880,9 @@ end
|
||||
///
|
||||
/// @return name of loaded wave if successful. empty string otherwise.
|
||||
///
|
||||
/// @todo images are transposed in the first two dimensions.
|
||||
/// this is useful for Scienta images but may not be appropriate for other sources.
|
||||
///
|
||||
function /s psh5_load_dataset_slabs(fileID, datapath, datasetname, [progress])
|
||||
variable fileID
|
||||
string datapath
|
||||
@ -927,6 +1007,9 @@ end
|
||||
///
|
||||
/// @return name of loaded wave if successful. empty string otherwise.
|
||||
///
|
||||
/// @todo images are transposed in the first two dimensions.
|
||||
/// this is useful for Scienta images but may not be appropriate for other data sources.
|
||||
///
|
||||
function /s psh5_load_dataset_slab(fileID, datapath, datasetname, dim2start, dim2count, dim3start, dim3count)
|
||||
variable fileID
|
||||
string datapath
|
||||
@ -1010,42 +1093,63 @@ end
|
||||
///
|
||||
/// dimension labels are required by scaling functions.
|
||||
///
|
||||
/// @param data data wave as loaded from PShell file
|
||||
///
|
||||
/// @return @arg 0 all labels set successfully.
|
||||
/// @arg 1 unidentified data source.
|
||||
/// @arg 2 wave does not contain data.
|
||||
///
|
||||
function ps_set_dimlabels(data)
|
||||
wave data
|
||||
|
||||
string name = NameOfWave(data)
|
||||
|
||||
// intrinsic dimensions
|
||||
strswitch(name)
|
||||
case "ScientaImage":
|
||||
setdimlabel 0, -1, $kEnergyDimLabel, data
|
||||
setdimlabel 1, -1, $kAngleDimLabel, data
|
||||
if (WaveDims(data) >= 3)
|
||||
setdimlabel 2, -1, $kScanDimLabel, data
|
||||
endif
|
||||
break
|
||||
case "ImageAngleDistribution":
|
||||
case "ScientaAngleDistribution":
|
||||
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":
|
||||
if (WaveDims(data) >= 2)
|
||||
setdimlabel 0, -1, $kScanDimLabel, data
|
||||
setdimlabel 1, -1, $kEnergyDimLabel, data
|
||||
else
|
||||
variable dummy
|
||||
|
||||
try
|
||||
// intrinsic dimensions
|
||||
strswitch(name)
|
||||
case "ScientaImage":
|
||||
setdimlabel 0, -1, $kEnergyDimLabel, data
|
||||
endif
|
||||
break
|
||||
default:
|
||||
setdimlabel 0, -1, $kScanDimLabel, data
|
||||
endswitch
|
||||
setdimlabel 1, -1, $kAngleDimLabel, data
|
||||
if (WaveDims(data) >= 3)
|
||||
setdimlabel 2, -1, $kScanDimLabel, data
|
||||
endif
|
||||
AbortOnRTE
|
||||
break
|
||||
case "ImageAngleDistribution":
|
||||
case "ScientaAngleDistribution":
|
||||
if (WaveDims(data) >= 2)
|
||||
setdimlabel 0, -1, $kScanDimLabel, data
|
||||
setdimlabel 1, -1, $kAngleDimLabel, data
|
||||
else
|
||||
setdimlabel 0, -1, $kAngleDimLabel, data
|
||||
endif
|
||||
AbortOnRTE
|
||||
break
|
||||
case "ScientaSpectrum":
|
||||
case "ImageEnergyDistribution":
|
||||
case "ScientaEnergyDistribution":
|
||||
if (WaveDims(data) >= 2)
|
||||
setdimlabel 0, -1, $kScanDimLabel, data
|
||||
setdimlabel 1, -1, $kEnergyDimLabel, data
|
||||
else
|
||||
setdimlabel 0, -1, $kEnergyDimLabel, data
|
||||
endif
|
||||
AbortOnRTE
|
||||
break
|
||||
default:
|
||||
if (WaveDims(data) == 1)
|
||||
setdimlabel 0, -1, $kScanDimLabel, data
|
||||
AbortOnRTE
|
||||
else
|
||||
return 1
|
||||
endif
|
||||
endswitch
|
||||
catch
|
||||
dummy = GetRTError(1)
|
||||
return 2
|
||||
endtry
|
||||
return 0
|
||||
end
|
||||
|
||||
/// set the dimension scales of loaded PShell Scienta datasets according to attributes.
|
||||
@ -1219,7 +1323,7 @@ function ps_detect_scale(ax, lo, hi, un)
|
||||
if (!WaveExists(scanner))
|
||||
wave /z /SDFR=attrDF scanner = $ScanWritables[0]
|
||||
endif
|
||||
if (WaveExists(scanner))
|
||||
if (WaveExists(scanner) && (numpnts(scanner) >= 1))
|
||||
lo[%$kScanDimLabel] = scanner[0]
|
||||
hi[%$kScanDimLabel] = scanner[numpnts(scanner)-1]
|
||||
ax[%$kScanDimLabel] = NameOfWave(scanner)
|
||||
@ -1362,7 +1466,9 @@ function /s psh5_load_reduced(ANickName, APathName, AFileName, reduction_func, r
|
||||
string folder
|
||||
|
||||
sg = StringFromList(ig, s_scanpaths)
|
||||
folder = CleanupName(ReplaceString("/", sg, ""), 0)
|
||||
folder = ReplaceString("/", sg, "")
|
||||
folder = ReplaceString(" ", folder, "")
|
||||
folder = CleanupName(folder, 0)
|
||||
setdatafolder fileDF
|
||||
newdatafolder /s /o $folder
|
||||
dfref dataDF = GetDataFolderDFR()
|
||||
|
Reference in New Issue
Block a user