1 #pragma TextEncoding = "UTF-8"
2 #pragma rtGlobals=3 // Use modern global access method and strict wave access.
3 #pragma IgorVersion = 8.00
4 #pragma ModuleName = PearlPShellImport
6 #if IgorVersion() < 9.00
7 #include <HDF5 Browser>
9 #include "pearl-compat"
10 #include "pearl-gui-tools"
11 #include "pearl-area-import"
63 strconstant
kPreviewDatasets =
"ImageEnergyDistribution;ScientaSpectrum;ScientaImage;Counts;SampleCurrent;"
66 strconstant
kScientaScalingDatasets =
"LensMode;ScientaChannelBegin;ScientaChannelEnd;ScientaSliceBegin;ScientaSliceEnd;Eph;"
69 strconstant
kEssentialDiagnostics =
"ManipulatorX;ManipulatorY;ManipulatorZ;ManipulatorTheta;ManipulatorTilt;ManipulatorPhi;MonoEnergy;"
158 function /df
psh5_load(path_name, file_name, scans, regions, datasets, [classes, max_rank, reduction_func, reduction_params, dest_df])
166 string reduction_func
167 string reduction_params
170 dfref save_df = GetDataFolderDFR()
171 variable timerRefNum = startMSTimer
173 if (ParamIsDefault(classes) || (classes == 0))
178 if (ParamIsDefault(dest_df) || !DataFolderRefStatus(dest_df))
183 if (ParamIsDefault(reduction_func))
186 if (ParamIsDefault(reduction_params))
187 reduction_params = ""
190 if (DataFolderRefStatus(dest_df))
191 setdatafolder dest_df
195 svar /sdfr=dest_df file_datasets = s_datasets
198 string ranked_datasets = ""
199 if (ParamIsDefault(max_rank))
200 ranked_datasets = file_datasets
202 svar /sdfr=dest_df file_ranks = s_datasets_ranks
206 string matching_datasets = ""
207 string matching_essentials = ""
208 string scan_datasets = ""
209 string region_datasets = ""
210 string free_datasets = ""
211 string selected_datasets = ""
212 string essential_datasets = ""
219 n_items = ItemsInList(scans, ";")
220 for (i_item = 0; i_item < n_items; i_item += 1)
221 item = StringFromList(i_item, scans, ";")
222 if (cmpstr(item[0,3], "scan") == 0)
225 item = ReplaceString("
226 matching_datasets = psh5_match_datasets(ranked_datasets, item)
227 scan_datasets = scan_datasets + matching_datasets
231 n_items = ItemsInList(regions, ";")
232 for (i_item = 0; i_item < n_items; i_item += 1)
233 item = StringFromList(i_item, regions, ";")
234 if (cmpstr(item[0,3], "scan") == 0)
237 item = ReplaceString("
238 matching_datasets = psh5_match_datasets(ranked_datasets, item)
239 region_datasets = region_datasets + matching_datasets
243 n_items = ItemsInList(datasets, ";")
244 for (i_item = 0; i_item < n_items; i_item += 1)
245 item = StringFromList(i_item, datasets, ";")
246 if (cmpstr(item[0,3], "scan") == 0)
249 matching_datasets = psh5_match_datasets(ranked_datasets, item)
250 free_datasets = free_datasets + matching_datasets
253 selected_datasets = scan_datasets + region_datasets + free_datasets
255 string filtered_datasets = ""
256 string diag_datasets = ""
259 variable n_scans = ItemsInList(selected_scans)
263 variable n_regions = ItemsInList(selected_regions)
270 for (i_region = 0; i_region < n_regions; i_region += 1)
271 region = StringFromList(i_region, selected_regions, ";")
272 region_datasets = region_datasets + GrepList(file_datasets, "(?i)^" + region + "[[:alpha:]]+$")
277 for (i_scan = 0; i_scan < n_scans; i_scan += 1)
278 scan = StringFromList(i_scan, selected_scans, ";")
281 diag_datasets = psh5_match_datasets(file_datasets, scan + "*")
283 diag_datasets = diag_datasets + GrepList(file_datasets, "(?i)^" + scan + "[[:alpha:]]+$")
284 diag_datasets = diag_datasets + psh5_match_datasets(region_datasets, scan + "*")
287 setdatafolder dest_df
289 setdatafolder scan_df
291 wave /t /z ScanWritables
292 wave /t /z ScanReadables
293 if (WaveExists(ScanWritables))
298 if (WaveExists(ScanReadables))
308 if (strlen(matching_datasets) > 1)
309 essential_datasets =
psh5_match_dataset_classes(diag_datasets, essential_classes, positioners=positioners, detectors=detectors)
313 filtered_datasets = essential_datasets + filtered_datasets + matching_datasets
317 setdatafolder dest_df
318 string /g s_loaded_datasets = ""
319 s_loaded_datasets =
psh5_load_datasets(dest_df, filtered_datasets, reduction_func=reduction_func, reduction_params=reduction_params)
322 for (i_scan = 0; i_scan < n_scans; i_scan += 1)
323 scan = StringFromList(i_scan, selected_scans, ";")
330 if (timerRefNum >= 0)
331 setdatafolder dest_df
332 variable /g psh5_perf_secs
333 psh5_perf_secs = stopMSTimer(timerRefNum) / 1e6
337 setdatafolder save_df
345 function /df
psh5_preview(path_name, file_name, [dest_df, preview_datasets])
349 string preview_datasets
351 dfref save_df = GetDataFolderDFR()
353 if (ParamIsDefault(dest_df))
358 if (ParamIsDefault(preview_datasets))
363 if (DataFolderRefStatus(dest_df))
364 setdatafolder dest_df
368 svar /sdfr=dest_df file_datasets = s_datasets
369 svar /sdfr=dest_df file_datasets_ranks = s_datasets_ranks
370 string selected_datasets = ""
371 string essential_datasets = ""
372 string scan_datasets = ""
373 string filtered_datasets = ""
375 variable nds = ItemsInList(preview_datasets, ";")
378 for (ids = 0; ids < nds; ids += 1)
379 ds = StringFromList(ids, preview_datasets, ";")
381 selected_datasets = psh5_match_datasets(selected_datasets, "/scan*" + ds)
382 if (strlen(selected_datasets) > 1)
383 selected_datasets = StringFromList(0, selected_datasets, ";")
389 if (strlen(selected_datasets) > 1)
394 scan = StringFromList(0, selected_scans, ";")
395 scan_datasets = psh5_match_datasets(file_datasets, scan + "*")
398 wave /t /z ScanWritables
399 if (WaveExists(ScanWritables))
406 filtered_datasets = essential_datasets + selected_datasets
411 string /g s_preview_dataset = StringFromList(0, selected_datasets, ";")
412 string /g s_preview_wave = StringFromList(ItemsInList(s_preview_dataset, "/") - 1, s_preview_dataset, "/")
418 setdatafolder save_df
455 dfref save_df = GetDataFolderDFR()
458 HDF5OpenFile /P=$path_name /R fid as file_name
460 if (!ParamIsDefault(dest_df))
461 setdatafolder dest_df
465 newdatafolder /s /o $("root:" + dest_name)
467 dfref file_df = GetDataFolderDFR()
469 variable /g file_id = fid
471 string /g s_scanpaths
476 s_filepath = s_path + s_filename
480 string /g s_datasets_datatypes = datatypes
481 string /g s_datasets_ranks = ranks
482 string /g s_datasets_dimensions = dimensions
487 setdatafolder save_df
512 if (DataFolderRefStatus(file_df))
513 nvar /sdfr=file_df /z file_id
514 if (nvar_Exists(file_id))
515 HDF5CloseFile /z file_id
517 KillVariables /z file_id
519 dfref parent_df = $(GetDataFolder(1, file_df) + ":")
520 if (DataFolderRefStatus(parent_df))
537 variable n = numpnts(wt)
539 for (i = 0; i < n; i += 1)
540 list = AddListItem(wt[i], list, sep, inf)
555 variable n = numpnts(w)
558 for (i = 0; i < n; i += 1)
559 sprintf s, format, w[i]
560 list = AddListItem(s, list, sep, inf)
577 HDF5ListGroup /F /TYPE=1 file_id, "/"
580 variable ng = ItemsInList(S_HDF5ListGroup, ";")
584 for (ig = 0; ig < ng; ig += 1)
585 sg = StringFromList(ig, S_HDF5ListGroup, ";")
586 if (cmpstr(sg[1,4], "scan") == 0)
587 scans = AddListItem(sg, scans, ";", inf)
608 HDF5ListGroup /F /R /TYPE=2 /Z file_id, "/"
610 return S_HDF5ListGroup
632 variable nds = ItemsInList(datasets, ";")
635 STRUCT HDF5DataInfo di
644 for (ids = 0; ids < nds; ids += 1)
645 sds = StringFromList(ids, datasets, ";")
646 err = HDF5DatasetInfo(file_id, sds, 0, di)
648 switch (di.datatype_class)
650 datatypes = AddListItem("i", datatypes, ";", ids)
653 datatypes = AddListItem("f", datatypes, ";", ids)
656 datatypes = AddListItem("s", datatypes, ";", ids)
659 datatypes = AddListItem("?", datatypes, ";", ids)
663 ranks = AddListItem(num2str(di.ndims), ranks, ";", ids)
666 for (idim = 0; idim < di.ndims; idim += 1)
667 sdims = AddListItem(num2str(di.dims[idim]), sdims, ",", idim)
669 if (strlen(sdims) > 1)
670 sdims = sdims[0, strlen(sdims)-2]
672 dimensions = AddListItem(sdims, dimensions, ";", ids)
692 function /s psh5_match_datasets(datasets, match)
698 string spaceless_datasets = ReplaceString(" ", datasets, "")
699 string spaceless_match = ReplaceString(" ", match, "")
702 variable seplen = strlen(sep)
703 variable nds = ItemsInList(spaceless_datasets, sep)
708 for (ids = 0; ids < nds; ids += 1)
709 ds = StringFromList(0, spaceless_datasets, sep, offset)
710 offset += strlen(ds) + seplen
711 if (StringMatch(ds, spaceless_match))
712 ds = StringFromList(ids, datasets, sep, 0)
713 result = AddListItem(ds, result, sep, inf)
736 variable seplen = strlen(sep)
737 variable nds = ItemsInList(datasets, sep)
743 for (ids = 0; ids < nds; ids += 1)
744 ds = StringFromList(0, datasets, sep, offset)
745 offset += strlen(ds) + seplen
746 rank = str2num(StringFromList(ids, ranks, sep))
747 if ((rank >= min_rank) && (rank <= max_rank))
748 result = AddListItem(ds, result, sep, inf)
770 variable seplen = strlen(sep)
771 variable nn = ItemsInList(list, sep)
776 make /n=(nn) /t /free wt_in
777 for (ii = 0; ii < nn; ii += 1)
778 item = StringFromList(0, list, sep, offset)
779 offset += strlen(item) + seplen
783 FindDuplicates /Z /FREE /RT=wt_out wt_in
808 variable seplen = strlen(sep)
809 variable nds = ItemsInList(datasets, sep)
816 for (ids = 0; ids < nds; ids += 1)
817 ds = StringFromList(0, datasets, sep, offset)
818 offset += strlen(ds) + seplen
819 if (cmpstr(ds[0], "/") != 0)
823 scan = StringFromList(1, ds, "/")
824 if (StringMatch(scan, "scan*"))
825 item = "/" + scan + "/"
830 if ((strlen(item) > 0) && (WhichListItem(item, result, ";", 0, 0) < 0))
831 result = AddListItem(item, result, ";", inf)
858 variable seplen = strlen(sep)
859 variable nds = ItemsInList(datasets, sep)
867 for (ids = 0; ids < nds; ids += 1)
868 ds = StringFromList(0, datasets, sep, offset)
869 offset += strlen(ds) + seplen
870 if (cmpstr(ds[0], "/") != 0)
874 scan = StringFromList(1, ds, "/")
875 region = StringFromList(2, ds, "/")
876 if (StringMatch(scan, "scan*") && StringMatch(region, "region*"))
877 item = "/" + scan + "/" + region + "/"
882 if ((strlen(item) > 0) && (WhichListItem(item, result, ";", 0, 0) < 0))
883 result = AddListItem(item, result, ";", inf)
905 if (ParamIsDefault(positioners))
908 if (ParamIsDefault(detectors) || (strlen(detectors) == 0))
914 variable seplen = strlen(sep)
915 variable nds = ItemsInList(datasets, sep)
925 for (ids = 0; ids < nds; ids += 1)
926 ds = StringFromList(0, datasets, sep, offset)
927 offset += strlen(ds) + seplen
928 nparts = ItemsInList(ds, "/")
929 ds_parent = StringFromList(nparts - 2, ds, "/")
930 ds_name = StringFromList(nparts - 1, ds, "/")
931 if (cmpstr(ds[0,4], "/scan") == 0)
932 ds_scan_rel = RemoveListItem(0, ds[1, strlen(ds) - 1], "/")
938 if (strlen(ds_parent) > 0)
939 ds_class = ds_class | (cmpstr(ds_parent, "attr") == 0 ?
kDSCAttrs : 0)
940 ds_class = ds_class | (cmpstr(ds_parent, "attrs") == 0 ?
kDSCAttrs : 0)
941 ds_class = ds_class | (cmpstr(ds_parent, "diags") == 0 ?
kDSCDiags : 0)
942 ds_class = ds_class | (cmpstr(ds_parent, "snaps") == 0 ?
kDSCSnaps : 0)
943 ds_class = ds_class | (cmpstr(ds_parent, "meta") == 0 ?
kDSCMeta : 0)
944 ds_class = ds_class | (cmpstr(ds_parent, "monitors") == 0 ?
kDSCMonitors : 0)
945 ds_class = ds_class | (cmpstr(ds_parent[0,5], "region") == 0 ?
kDSCRegions : 0)
948 if (strlen(ds_name) > 0)
949 ds_class = ds_class | (WhichListItem(ds_scan_rel, positioners, sep, 0, 0) >= 0 ?
kDSCPositioners : 0)
950 ds_class = ds_class | (WhichListItem(ds_scan_rel, detectors, sep, 0, 0) >= 0 ?
kDSCDetectors : 0)
960 if (ds_class & classes)
961 result = AddListItem(ds, result, sep, inf)
993 if (cmpstr(datasetpath[0], "/") == 0)
994 datasetpath = datasetpath[1, strlen(datasetpath)-1]
996 if (cmpstr(datasetpath[strlen(datasetpath)-1], "/") == 0)
997 datasetpath += "dummy"
1000 variable nfolders = ItemsInList(datasetpath, "/") - 1
1003 string inc_path = "/"
1005 for (ifolder = 0; ifolder < nfolders; ifolder += 1)
1006 folder = StringFromList(ifolder, datasetpath, "/")
1008 NewDataFolder /o/s $folder
1011 string /g s_hdf5_group = inc_path
1014 return GetDataFolderDFR()
1038 if (cmpstr(datasetpath[0], "/") == 0)
1039 datasetpath = datasetpath[1, strlen(datasetpath)-1]
1041 if (cmpstr(datasetpath[strlen(datasetpath)-1], "/") == 0)
1042 datasetpath += "dummy"
1045 variable nfolders = ItemsInList(datasetpath, "/") - 1
1048 string inc_path = ""
1050 for (ifolder = 0; ifolder < nfolders; ifolder += 1)
1051 folder = StringFromList(ifolder, datasetpath, "/")
1059 dfref out_df = parent_df:$inc_path
1069 folder_name = ReplaceString(" ", group_name, "")
1070 if (cmpstr(folder_name, "attrs") == 0)
1071 folder_name = "attr"
1101 variable create_folders
1102 string reduction_func
1103 string reduction_params
1105 if (!DataFolderRefStatus(file_df))
1106 dfref file_df = GetDataFolderDFR()
1108 if (ParamIsDefault(create_folders))
1111 if (ParamIsDefault(reduction_func))
1114 if (ParamIsDefault(reduction_params))
1115 reduction_params = ""
1118 dfref save_df = GetdataFolderDFR()
1121 variable nds = ItemsInList(datasets, ";")
1124 string loaded_datasets = ""
1125 string loaded_waves = ""
1127 for (ids = 0; ids < nds; ids += 1)
1128 SetDataFolder file_df
1129 ds = StringFromList(ids, datasets, ";")
1130 loaded_waves =
psh5_load_dataset(file_df, ds, create_folders=create_folders, reduction_func=reduction_func, reduction_params=reduction_params)
1131 if (strlen(loaded_waves) > 1)
1132 loaded_datasets = loaded_datasets + ds + ";"
1136 setdatafolder save_df
1137 return loaded_datasets
1176 function /s
psh5_load_dataset(file_df, datasetpath, [create_folders, reduction_func, reduction_params])
1179 variable create_folders
1180 string reduction_func
1181 string reduction_params
1183 dfref base_df = GetDataFolderDFR()
1184 if (!DataFolderRefStatus(file_df))
1185 dfref file_df = GetDataFolderDFR()
1187 nvar /sdfr=file_df file_id
1189 if (ParamIsDefault(create_folders))
1195 if (ParamIsDefault(reduction_func))
1198 if (ParamIsDefault(reduction_params))
1199 reduction_params = ""
1202 STRUCT HDF5DataInfo di
1203 InitHDF5DataInfo(di)
1204 variable err = HDF5DatasetInfo(file_id, datasetpath, 0, di)
1210 variable numeric = 0
1211 variable compound = 0
1213 switch (di.datatype_class)
1236 string wave_names = ""
1238 string datasetname = StringFromList(ItemsInList(datasetpath, "/") - 1, datasetpath, "/")
1240 HDF5LoadData /O /Q /Z /TRAN=(transpose) file_id, datasetpath
1241 wave_names = S_waveNames
1243 if (exists(reduction_func) == 6)
1250 variable nw = ItemsInList(wave_names, ";")
1253 string loaded_waves = ""
1254 for (iw = 0; iw < nw; iw += 1)
1255 sw = StringFromList(iw, wave_names)
1258 loaded_waves = loaded_waves + sw + ";"
1264 setdatafolder base_df
1292 variable create_folders
1295 if (ParamIsDefault(create_folders))
1298 if (ParamIsDefault(progress))
1302 if (!DataFolderRefStatus(file_df))
1303 dfref file_df = GetDataFolderDFR()
1305 nvar /sdfr=file_df file_id
1308 string datawavename = StringFromList(ItemsInList(datasetpath, "/") - 1, datasetpath, "/")
1314 STRUCT HDF5DataInfo di
1315 InitHDF5DataInfo(di)
1316 variable err = HDF5DatasetInfo(file_id, datasetpath, 0, di)
1318 print "error accessing dataset", datasetpath
1322 print "error: rank of dataset < 2", datasetpath
1324 elseif (di.ndims < 3)
1327 if ((di.datatype_class != H5T_INTEGER) && (di.datatype_class != H5T_FLOAT))
1328 print "error: unsupported datatype", datasetpath
1332 variable idx, idy, idz, idt, izt
1344 variable nx, ny, nz, nt, nzt
1349 make /n=(nx,ny,nz,nt) /o $datawavename
1350 wave data = $datawavename
1361 HDF5MakeHyperslabWave("slab", max(di.ndims, 4))
1367 slab[idx][%Block] = nx
1368 slab[idy][%Block] = ny
1371 for (iz = 0; iz < nz; iz += 1)
1372 for (it = 0; it < nt; it += 1)
1373 slab[idz][%Start] = iz
1374 slab[idt][%Start] = it
1375 HDF5LoadData /O /Q /Z /SLAB=slab /N=slabdata file_id, datasetpath
1378 data[][][iz][it] = slabdata[q][p][0][0]
1380 data[][][iz][it] = slabdata[p][q][0][0]
1401 killwaves /z slab, slabdata
1404 return NameOfWave(data) + ";"
1476 string reduction_params
1477 variable create_folders
1481 if (ParamIsDefault(create_folders))
1484 if (ParamIsDefault(progress))
1487 if (ParamIsDefault(nthreads))
1491 dfref base_df = GetDataFolderDFR()
1492 if (!DataFolderRefStatus(file_df))
1493 dfref file_df = GetDataFolderDFR()
1495 nvar /sdfr=file_df file_id
1498 string datawavename = StringFromList(ItemsInList(datasetpath, "/") - 1, datasetpath, "/")
1499 string wavenames = ""
1505 STRUCT HDF5DataInfo di
1506 InitHDF5DataInfo(di)
1507 variable err = HDF5DatasetInfo(file_id, datasetpath, 0, di)
1509 print "error accessing detector/data"
1514 print "error: rank of dataset < 2"
1517 elseif (di.ndims < 3)
1521 variable idx, idy, idz, idt
1533 variable nx, ny, nz, nt, nzt
1544 HDF5MakeHyperslabWave("slab", max(di.ndims, 4))
1550 slab[idx][%Block] = nx
1551 slab[idy][%Block] = ny
1555 nthreads = ThreadProcessorCount
1558 variable threadGroupID = ThreadGroupCreate(nthreads)
1560 for (ithread = 0; ithread < nthreads; ithread += 1)
1564 make /n=(nzt) /df /free processing_folders
1572 make /n=(nx,ny) /d /o $datawavename
1573 wave template = $datawavename
1577 variable iz, it, izt
1579 variable n_recvd = 0
1585 make /n=0 /free /wave result_waves
1592 if (n_sent < max(1, nthreads) * 10 + n_recvd)
1596 slab[idz][%Start] = iz
1597 slab[idt][%Start] = it
1598 dfname = "processing_" + num2str(n_sent)
1599 NewDataFolder /s $dfname
1600 HDF5LoadData /O /Q /Z /SLAB=slab /N=slabdata file_id, datasetpath
1602 duplicate template, image
1603 variable /g r_index = iz
1604 variable /g s_index = it
1605 string /g func_param = reduction_params
1610 ThreadGroupPutDF threadGroupID, :
1613 processing_folders[n_sent] = GetDataFolderDFR()
1614 make /n=1/d profile1, profile2
1616 wave /wave reduced_waves =
reduce_slab_image(slabdata, image, reduction_func, func_param)
1617 variable /g func_result = numpnts(reduced_waves)
1619 WaveClear slabdata, image, reduced_waves
1633 tmo = min(100, tmo + 10)
1639 dfr = ThreadGroupGetDFR(threadGroupID, tmo)
1641 dfr = processing_folders[n_recvd]
1642 processing_folders[n_recvd] = $""
1645 if (DatafolderRefStatus(dfr) != 0)
1647 nvar rr = dfr:r_index
1648 nvar ss = dfr:s_index
1649 nvar func_result = dfr:func_result
1651 if (func_result < 1)
1652 print "error during data reduction."
1658 if (numpnts(result_waves) == 0)
1659 redimension /n=(func_result) result_waves
1660 for (iw = 0; iw < func_result; iw += 1)
1661 sw = "redw_" + num2str(iw)
1662 wave profile = dfr:$sw
1663 sw = "ReducedData" + num2str(iw+1)
1664 make /n=(dimsize(profile, 0), nz, nt) /d /o $sw
1666 setdimlabel 0, -1, $getdimlabel(profile, 0, -1), data
1667 setdimlabel 1, -1, $kScanDimLabel, data
1668 note data, note(profile)
1670 setscale /p x dimoffset(profile, 0), dimdelta(profile, 0), waveunits(profile, 0), data
1671 setscale d 0, 0, waveunits(profile, -1), data
1672 result_waves[iw] = data
1677 for (iw = 0; iw < func_result; iw += 1)
1678 sw = "redw_" + num2str(iw)
1679 wave profile = dfr:$sw
1680 wave data = result_waves[iw]
1681 data[][rr][ss] = profile[p]
1685 KillDataFolder /Z dfr
1700 while ((n_recvd < nzt) && (result == 0))
1703 killwaves /z slab, slabdata, template
1706 variable tstatus = ThreadGroupRelease(threadGroupID)
1708 print "error: thread did not terminate properly."
1714 nw = numpnts(result_waves)
1716 for (iw = 0; iw < nw; iw += 1)
1717 wave /z data = result_waves[iw]
1718 if (WaveExists(data))
1720 redimension /n=(-1, 0, 0) data
1722 redimension /n=(-1, nz, 0) data
1724 wavenames += nameofwave(data) + ";"
1732 setdatafolder base_df
1742 dfref dfr = ThreadGroupGetDFR(0, 1000)
1743 if (DataFolderRefStatus(dfr) == 0)
1753 wave slabdata = dfr:slabdata
1754 wave image = dfr:image
1755 svar func_param = dfr:func_param
1756 nvar rr = dfr:r_index
1757 nvar ss = dfr:s_index
1760 newdatafolder /s out_df
1761 variable /g r_index = rr
1762 variable /g s_index = ss
1763 wave /wave reduced_waves =
reduce_slab_image(slabdata, image, reduction_func, func_param)
1764 variable /g func_result = numpnts(reduced_waves)
1768 WaveClear slabdata, image, reduced_waves
1769 ThreadGroupPutDF 0, :
1776 threadsafe static function /wave
reduce_slab_image(slabdata, image, reduction_func, reduction_params)
1780 string reduction_params
1782 image = slabdata[q][p][0][0]
1784 return reduction_func(image, reduction_params)
1806 if (!DataFolderRefStatus(file_df))
1807 dfref file_df = GetDataFolderDFR()
1809 nvar /sdfr=file_df file_id
1811 string obj_names = "authors;pgroup;proposal;proposer;sample;"
1812 variable nn = ItemsInList(obj_names, ";")
1816 for (ii = 0; ii < nn; ii += 1)
1817 name = StringFromList(ii, obj_names, ";")
1842 if (!DataFolderRefStatus(file_df))
1843 dfref file_df = GetDataFolderDFR()
1845 nvar /sdfr=file_df file_id
1847 string path = "/general/" + name
1848 HDF5LoadData /O /Q /Z /N=wt_load_general /TYPE=1 file_id, path
1851 wave /t wt_load_general
1852 variable nn = numpnts(wt_load_general)
1854 for (ii = 0; ii < nn; ii += 1)
1855 values = AddListItem(wt_load_general[ii], values, ",", inf)
1857 killwaves /z wt_load_general
1858 if (strlen(values) >= 1)
1859 values = values[0,strlen(values)-2]
1862 string /g $name = values
1892 if (!DataFolderRefStatus(file_df))
1893 dfref file_df = GetDataFolderDFR()
1895 nvar /sdfr=file_df file_id
1897 dfref save_df = GetDataFolderDFR()
1898 SetDataFolder NewFreeDataFolder()
1902 HDF5LoadData /O /Q /Z /A="Writable Dimension" /N=WriteDim file_id, datasetpath
1906 sprintf wnote, "ScanDimension=%u", WriteDim[0]
1907 Note datawave, wnote
1910 HDF5LoadData /O /Q /Z /A="Writable Index" /N=WriteIndex file_id, datasetpath
1913 sprintf wnote, "WriteableIndex=%u", WriteIndex[0]
1914 Note datawave, wnote
1917 HDF5LoadData /O /Q /Z /A="Readable Index" /N=ReadIndex file_id, datasetpath
1920 sprintf wnote, "ReadableIndex=%u", ReadIndex[0]
1921 Note datawave, wnote
1924 setdatafolder save_df
1958 string wavenames = ""
1960 if (!DataFolderRefStatus(file_df))
1961 dfref file_df = GetDataFolderDFR()
1963 nvar /sdfr=file_df file_id
1965 HDF5LoadData /O /Q /Z /A="Dimensions" /N=ScanDimensions /TYPE=1 file_id, scanpath
1967 wavenames = AddListItem(s_wavenames, wavenames, ";", inf)
1969 make /n=1 /o ScanDimensions
1971 wavenames = AddListItem("ScanDimensions", wavenames, ";", inf)
1973 HDF5LoadData /O /Q /Z /A="Readables" /N=ScanReadables /TYPE=1 file_id, scanpath
1975 wavenames = AddListItem(s_wavenames, wavenames, ";", inf)
1977 make /n=1 /o /t ScanReadables
1978 ScanReadables[0] = "ScientaSpectrum"
1979 wavenames = AddListItem("ScanReadables", wavenames, ";", inf)
1981 HDF5LoadData /O /Q /Z /A="Writables" /N=ScanWritables /TYPE=1 file_id, scanpath
1983 wavenames = AddListItem(s_wavenames, wavenames, ";", inf)
1986 HDF5LoadData /O /Q /Z /A="PlotDomain" /N=ScanWritables /TYPE=1 file_id, scanpath
1988 wavenames = AddListItem(s_wavenames, wavenames, ";", inf)
1991 HDF5LoadData /O /Q /Z /A="Steps" /N=ScanSteps /TYPE=1 file_id, scanpath
1993 wavenames = AddListItem(s_wavenames, wavenames, ";", inf)
1995 wavenames = ReplaceString(";;", wavenames, ";")
1998 HDF5LoadData /O /Q /Z /A="Iterations" /N=ScanIterations /TYPE=1 file_id, scanpath
2000 wavenames = AddListItem(s_wavenames, wavenames, ";", inf)
2002 HDF5LoadData /O /Q /Z /A="Step Size" /N=ScanStepSize /TYPE=1 file_id, scanpath
2004 wavenames = AddListItem(s_wavenames, wavenames, ";", inf)
2006 HDF5LoadData /O /Q /Z /A="Step Time" /N=ScanStepTime /TYPE=1 file_id, scanpath
2008 wavenames = AddListItem(s_wavenames, wavenames, ";", inf)
2058 case "ScientaImage":
2059 setdimlabel 0, -1, $kEnergyDimLabel, data
2060 setdimlabel 1, -1, $kAngleDimLabel, data
2061 if (WaveDims(data) >= 3)
2062 setdimlabel 2, -1, $kScanDimLabel, data
2066 case "ImageAngleDistribution":
2067 case "ScientaAngleDistribution":
2068 if (WaveDims(data) >= 2)
2069 setdimlabel 0, -1, $kScanDimLabel, data
2070 setdimlabel 1, -1, $kAngleDimLabel, data
2072 setdimlabel 0, -1, $kAngleDimLabel, data
2076 case "ScientaSpectrum":
2077 case "ImageEnergyDistribution":
2078 case "ScientaEnergyDistribution":
2079 if (WaveDims(data) >= 2)
2080 setdimlabel 0, -1, $kScanDimLabel, data
2081 setdimlabel 1, -1, $kEnergyDimLabel, data
2083 setdimlabel 0, -1, $kEnergyDimLabel, data
2088 if (WaveDims(data) == 1)
2089 setdimlabel 0, -1, $kScanDimLabel, data
2096 dummy = GetRTError(1)
2114 wave /z /t /sdfr=data_df ScanWritables=::ScanWritables
2115 if (WaveExists(ScanWritables))
2116 string sdf = GetDataFolder(1, data_df)
2117 dfref parent_df = $(sdf + ":")
2137 dfref diags_df = data_df:diags
2138 dfref attrs_df = scan_df:attrs
2139 dfref attr_df = scan_df:attr
2140 if (DataFolderRefStatus(diags_df))
2142 elseif (DataFolderRefStatus(attrs_df))
2144 elseif (DataFolderRefStatus(attr_df))
2169 make /n=(ndf) /df /free dfs
2170 dfs[0] = {df1, df2, df3}
2171 for (idf = 0; idf < ndf; idf += 1)
2172 if (DataFolderRefStatus(dfs[idf]))
2173 wave /SDFR=dfs[idf] /Z w = $name
2235 redimension /n=4 lo, hi, un, ax
2236 setdimlabel 0, 0, $kEnergyDimLabel, lo, hi, un, ax
2237 setdimlabel 0, 1, $kAngleDimLabel, lo, hi, un, ax
2238 setdimlabel 0, 2, $kScanDimLabel, lo, hi, un, ax
2239 setdimlabel 0, 3, $kDataDimLabel, lo, hi, un, ax
2242 lo[%$kEnergyDimLabel] = 0
2243 hi[%$kEnergyDimLabel] = 1
2244 un[%$kEnergyDimLabel] =
"eV"
2245 ax[%$kEnergyDimLabel] =
"Ekin"
2247 lo[%$kAngleDimLabel] = -1
2248 hi[%$kAngleDimLabel] = 1
2249 un[%$kAngleDimLabel] =
"arb."
2250 un[%$kAngleDimLabel] =
"slice"
2252 lo[%$kScanDimLabel] = 0
2253 hi[%$kScanDimLabel] = 1
2254 un[%$kScanDimLabel] =
"arb."
2255 ax[%$kScanDimLabel] =
"scan"
2257 lo[%$kDataDimLabel] = 0
2258 hi[%$kDataDimLabel] = 0
2259 un[%$kDataDimLabel] =
"arb."
2260 ax[%$kDataDimLabel] =
"value"
2263 wave /Z ChannelBegin =
ps_find_scale_wave(
"ScientaChannelBegin", data_df, scan_df, attr_df)
2264 wave /Z ChannelEnd =
ps_find_scale_wave(
"ScientaChannelEnd", data_df, scan_df, attr_df)
2265 wave /Z SliceBegin =
ps_find_scale_wave(
"ScientaSliceBegin", data_df, scan_df, attr_df)
2267 wave /Z ScientaChannels =
ps_find_scale_wave(
"ScientaChannels", data_df, scan_df, attr_df)
2270 if (waveexists(LensMode) && (numpnts(LensMode) >= 1))
2271 strswitch(LensMode[0])
2273 lo[%$kAngleDimLabel] = -45/2
2274 hi[%$kAngleDimLabel] = +45/2
2275 un[%$kAngleDimLabel] =
"°"
2276 ax[%$kAngleDimLabel] =
"angle"
2279 lo[%$kAngleDimLabel] = -60/2
2280 hi[%$kAngleDimLabel] = +60/2
2281 un[%$kAngleDimLabel] =
"°"
2282 ax[%$kAngleDimLabel] =
"angle"
2284 case "Transmission":
2285 un[%$kAngleDimLabel] =
"arb."
2286 ax[%$kAngleDimLabel] =
"offset"
2292 if (waveexists(ChannelBegin) && waveexists(ChannelEnd) && (numpnts(ChannelBegin) >= 1) && (numpnts(ChannelEnd) >= 1))
2293 lo[%$kEnergyDimLabel] = ChannelBegin[0]
2294 hi[%$kEnergyDimLabel] = ChannelEnd[0]
2295 elseif (waveexists(ScientaChannels) && (numpnts(ScientaChannels) >= 1))
2296 lo[%$kEnergyDimLabel] = ScientaChannels[0]
2297 hi[%$kEnergyDimLabel] = ScientaChannels[numpnts(ScientaChannels)-1]
2299 if (waveexists(SliceBegin) && waveexists(SliceEnd) && (numpnts(SliceBegin) >= 1) && (numpnts(SliceEnd) >= 1))
2300 lo[%$kAngleDimLabel] = SliceBegin[0]
2301 hi[%$kAngleDimLabel] = SliceEnd[0]
2304 wave /z /t /SDFR=scan_df ScanWritables
2305 if (WaveExists(ScanWritables))
2306 wave /z /SDFR=scan_df scanner = $ScanWritables[0]
2307 if (!WaveExists(scanner))
2308 wave /z /SDFR=attr_df scanner = $ScanWritables[0]
2310 if (WaveExists(scanner) && (numpnts(scanner) >= 1))
2311 lo[%$kScanDimLabel] = scanner[0]
2312 hi[%$kScanDimLabel] = scanner[numpnts(scanner)-1]
2313 ax[%$kScanDimLabel] = NameOfWave(scanner)
2314 strswitch(NameOfWave(scanner))
2316 ax[%$kScanDimLabel] = "photon energy"
2317 un[%$kScanDimLabel] = "eV"
2319 case "ManipulatorX":
2320 case "ManipulatorY":
2321 case "ManipulatorZ":
2324 case "RefocusYTrans":
2325 case "RefocusZTrans":
2327 un[%$kScanDimLabel] = "mm"
2330 un[%$kScanDimLabel] = "µm"
2332 case "ManipulatorTheta":
2333 case "ManipulatorTilt":
2334 case "ManipulatorPhi":
2335 un[%$kScanDimLabel] = "°"
2343 un[%$kScanDimLabel] = "mrad"
2396 string snote = note(data)
2398 sdim = GetDimLabel(data, 0, -1)
2400 setscale /i x lo[%$sdim], hi[%$sdim], un[%$sdim], data
2401 snote = ReplaceStringByKey("AxisLabelX", snote, ax[%$sdim], "=", "\r")
2404 sdim = GetDimLabel(data, 1, -1)
2406 setscale /i y lo[%$sdim], hi[%$sdim], un[%$sdim], data
2407 snote = ReplaceStringByKey("AxisLabelY", snote, ax[%$sdim], "=", "\r")
2410 sdim = GetDimLabel(data, 2, -1)
2412 setscale /i z lo[%$sdim], hi[%$sdim], un[%$sdim], data
2413 snote = ReplaceStringByKey("AxisLabelZ", snote, ax[%$sdim], "=", "\r")
2416 string data_unit = un[%$kDataDimLabel]
2417 string data_label = ax[%$kDataDimLabel]
2419 variable def = (cmpstr(data_unit, "arb.") == 0) && (cmpstr(data_label, "value") == 0)
2422 s = StringByKey("AxisLabelD", snote, "=", "\r")
2427 s = StringByKey("AxisUnitD", snote, "=", "\r")
2435 strswitch(NameOfWave(data))
2436 case "ScientaImage":
2437 case "ImageAngleDistribution":
2438 case "ScientaAngleDistribution":
2439 case "ScientaSpectrum":
2440 case "ImageEnergyDistribution":
2441 case "ScientaEnergyDistribution":
2443 data_label = "intensity"
2446 case "SampleCurrent":
2450 data_label = "current"
2453 case "MachineCurrent":
2455 data_label = "current"
2461 setscale d 0, 0, data_unit, data
2462 snote = ReplaceStringByKey("AxisLabelD", snote, data_label, "=", "\r")
2463 snote = ReplaceStringByKey("AxisUnitD", snote, data_unit, "=", "\r")
2464 snote = ReplaceStringByKey("Dataset", snote, NameOfWave(data), "=", "\r")
2486 make /n=3 /free lo, hi
2487 make /n=3 /t /free ax, un
2488 wave /t /z /SDFR=scan_df ScanReadables
2489 if (WaveExists(ScanReadables))
2491 variable nsr = numpnts(ScanReadables)
2495 for (isr = 0; isr < nsr; isr += 1)
2496 ssr = ScanReadables[isr]
2498 if (!DataFolderRefStatus(data_df))
2499 dfref data_df = scan_df
2501 nel = ItemsInList(ssr, "/")
2502 sds = StringFromList(nel - 1, ssr, "/")
2503 wave /z /sdfr=data_df wsr=$sds
2504 if (WaveExists(wsr))
2531 dfref save_df = GetDataFolderDFR()
2532 dfref data_df = GetWavesDataFolderDFR(data)
2534 setdatafolder data_df
2535 make /n=3 /free lo, hi
2536 make /n=3 /t /free ax, un
2539 setdatafolder save_df
2560 if (ParamIsDefault(killed))
2568 Wave/Z w = WaveRefIndexedDFR(dfr, index)
2574 if (stringmatch(s, pattern))
2576 killed = AddListItem(s, killed, ";", Inf)
2583 Variable numChildDataFolders = CountObjectsDFR(dfr, 4)
2585 for(i=0; i<numChildDataFolders; i+=1)
2586 String childDFName = GetIndexedObjNameDFR(dfr, 4, i)
2587 DFREF childDFR = dfr:$childDFName