1 #pragma TextEncoding = "UTF-8"
2 #pragma rtGlobals=3 // Use modern global access method and strict wave access.
3 #pragma IgorVersion = 6.36
4 #pragma ModuleName = PearlAreaImport
6 #if IgorVersion() < 9.00
7 #include <HDF5 Browser>
9 #include "pearl-compat"
10 #include "pearl-gui-tools"
48 string fileName, path, type, creator
50 variable handledOpen = 0
55 string FileExt = LowerStr(ParseFilePath(4, FileName, ":", 0, 0))
59 svar /z cnn = gsCustomNickName
61 if (exists("gvNickNameIndex") != 2)
62 variable/g gvNickNameIndex = 1
64 nvar nni = gvNickNameIndex
65 NickName = cnn + num2str(nni)
69 if (stringmatch(FileExt, "h5") == 1)
73 string/g s_latest_datafile = result
74 string/g s_latest_nickname = nickname
76 handledOpen = strlen(result) > 0
116 if (ParamIsDefault(ignoredate))
119 if (ParamIsDefault(unique))
123 string basename = ParseFilePath(3, filename, ":", 0, 0)
124 string extension = ParseFilePath(4, filename, ":", 0, 0)
128 if (strsearch(basename, "scienta", 0, 2) >= 0)
130 elseif (strsearch(basename, "pshell", 0, 2) >= 0)
132 elseif (strsearch(basename, "OP-SL", 0, 2) >= 0)
134 elseif (strsearch(basename, "ES-PS", 0, 2) >= 0)
139 if (ParamIsDefault(sourcename))
140 sourcename = autosource
143 variable nparts = ItemsInList(basename, "-")
145 string datepart = StringFromList(1, basename, "-")
146 variable l_datepart = strlen(datepart)
148 datepart = datepart[l_datepart-6, l_datepart-1]
150 string indexpart = StringFromList(2, basename, "-")
152 sprintf nickname, "%s_%s", sourcename, indexpart
154 sprintf nickname, "%s_%s_%s", sourcename, datepart, indexpart
160 if (unique && CheckName(nickname, 11))
161 nickname = UniqueName(nickname + "_", 11, 0)
175 string message = "Select data files"
177 string filefilters = "Area Detector HDF5 Files (*.h5):.h5;"
178 filefilters += "All Files:.*;"
180 PathInfo /S $APathName
181 Open /D /R /F=filefilters /M=message /MULT=1 refNum
182 filepaths = S_fileName
184 dfref saveDF = GetDataFolderDFR()
187 if (strlen(filepaths) > 0)
188 variable nfiles = ItemsInList(filepaths, "\r")
190 for(ifile = 0; ifile < nfiles; ifile += 1)
191 String path = StringFromList(ifile, filepaths, "\r")
218 if (ParamIsDefault(load_data))
221 if (ParamIsDefault(load_attr))
225 dfref saveDF = GetDataFolderDFR()
227 newdatafolder /s/o $("root:" + ANickName)
231 string instrumentpath = "/entry/instrument/"
232 string detectorpath = instrumentpath + "detector/"
233 string attributespath = instrumentpath + "NDAttributes/"
239 variable /g adh5_perf_secs
240 timerRefNum = startMSTimer
243 #if Exists("HDF5OpenFile")
244 HDF5OpenFile /P=$APathName/R fileID as AFileName
246 AFileName = s_path + s_filename
247 print
"loading " + s_filename +
"\r"
253 newdatafolder /o/s attr
259 if (waveexists(data))
269 Abort
"HDF5 XOP not loaded."
272 if (timerRefNum >= 0)
273 adh5_perf_secs = stopMSTimer(timerRefNum) / 1e6
306 function /s
adh5_load_reduced(ANickName, APathName, AFileName, reduction_func, reduction_param, [load_data, load_attr, progress])
312 string reduction_param
318 if (ParamIsDefault(load_data))
321 if (ParamIsDefault(load_attr))
324 if (ParamIsDefault(progress))
328 dfref saveDF = GetDataFolderDFR()
330 newdatafolder /s/o $("root:" + ANickName)
334 string instrumentpath = "/entry/instrument/"
335 string detectorpath = instrumentpath + "detector/"
336 string attributespath = instrumentpath + "NDAttributes/"
342 variable /g adh5_perf_secs
343 timerRefNum = startMSTimer
346 #if Exists("HDF5OpenFile")
347 HDF5OpenFile /P=$APathName/R fileID as AFileName
349 AFileName = s_path + s_filename
350 print
"loading " + s_filename +
"\r"
353 newdatafolder /o/s attr
366 Abort
"HDF5 XOP not loaded."
369 if (timerRefNum >= 0)
370 adh5_perf_secs = stopMSTimer(timerRefNum) / 1e6
398 if (ParamIsDefault(load_data))
401 if (ParamIsDefault(load_attr))
405 dfref saveDF = GetDataFolderDFR()
407 newdatafolder /o/s pearl_area
408 newdatafolder /o/s preview
412 string instrumentpath = "/entry/instrument/"
413 string detectorpath = instrumentpath + "detector/"
414 string attributespath = instrumentpath + "NDAttributes/"
420 variable /g adh5_perf_secs
421 timerRefNum = startMSTimer
424 #if Exists("HDF5OpenFile")
425 HDF5OpenFile /P=$APathName/R/Z fileID as AFileName
427 AFileName = s_path + s_filename
430 datasetname = detectorpath +
"data"
431 STRUCT HDF5DataInfo di
433 variable err = HDF5DatasetInfo(fileID, datasetname, 0, di)
435 print
"error accessing detector/data"
439 print
"error: rank of dataset < 2"
443 variable dim2start = 0, dim2count = 1, dim3start = 0, dim3count = 1
445 dim2start = floor(di.dims[di.ndims - 3] / 2)
449 dim3start = floor(di.dims[di.ndims - 4] / 2)
456 string destpath = GetDataFolder(1, saveDF) + ANickName
457 if (waveexists(data))
458 duplicate /o data, $destpath
459 wave /z data = $destpath
465 newdatafolder /o/s attr
469 if (waveexists(data))
476 print "error opening file " + AFileName
480 Abort
"HDF5 XOP not loaded."
483 if (timerRefNum >= 0)
484 adh5_perf_secs = stopMSTimer(timerRefNum) / 1e6
505 dfref saveDF = GetDataFolderDFR()
509 string instrumentpath = "/entry/instrument/"
510 string detectorpath = instrumentpath + "detector/"
511 string attributespath = instrumentpath + "NDAttributes/"
521 #if Exists("HDF5OpenFile")
522 HDF5OpenFile /P=$APathName/R/Z fileID as AFileName
524 AFileName = s_path + s_filename
527 datasetname = detectorpath +
"data"
528 STRUCT HDF5DataInfo di
530 variable err = HDF5DatasetInfo(fileID, datasetname, 0, di)
532 print
"error accessing detector/data"
536 for (idim = 0; idim < di.ndims; idim += 1)
537 sprintf s,
"dim %u: %u points", idim, di.dims[idim]
538 if (strlen(s_info) > 0)
539 s_info = s_info +
"\r" + s
545 dfref df = NewFreeDataFolder()
549 for (idim = 1; idim < 5; idim += 1)
550 sprintf s, "Scan%uActive", idim
552 if (waveexists(w) && (numpnts(w) > 0) && (w[0] > 0))
553 sprintf s, "Scan%uPositioner1", idim
555 sprintf s, "scan %u: %s", idim, wt[0]
556 if (strlen(s_info) > 0)
557 s_info = s_info + "\r" + s
566 print "error opening file " + AFileName
570 Abort
"HDF5 XOP not loaded."
590 #if Exists("HDF5LoadData")
595 datasetname = detectorpath +
"data"
596 STRUCT HDF5DataInfo di
598 variable err = HDF5DatasetInfo(fileID, datasetname, 0, di)
600 print
"error accessing detector/data"
604 print
"error: rank of dataset < 2"
608 HDF5LoadData /O /Q /Z fileID, datasetname
612 Abort
"HDF5 XOP not loaded."
633 duplicate /free data, tempdata
634 variable nd = wavedims(tempdata)
635 variable nx = dimsize(tempdata, nd - 1)
636 variable ny = dimsize(tempdata, nd - 2)
637 variable nz = dimsize(tempdata, nd - 3)
638 variable nt = dimsize(tempdata, nd - 4)
643 redimension /n=(ny) data
644 setdimlabel 0, -1, AD_Dim1, data
645 data = tempdata[p][0]
647 redimension /n=(nx) data
648 setdimlabel 0, -1, AD_Dim0, data
649 data = tempdata[0][p]
651 redimension /n=(nx,ny) data
652 setdimlabel 0, -1, AD_Dim0, data
653 setdimlabel 1, -1, AD_Dim1, data
654 data = tempdata[q][p]
659 redimension /n=(ny,nz) data
660 setdimlabel 0, -1, AD_Dim1, data
661 setdimlabel 1, -1, AD_DimN, data
662 multithread data = tempdata[q][p][0]
664 redimension /n=(nx,nz) data
665 setdimlabel 0, -1, AD_Dim0, data
666 setdimlabel 1, -1, AD_DimN, data
667 multithread data = tempdata[q][0][p]
669 redimension /n=(nx,ny) data
670 setdimlabel 0, -1, AD_Dim0, data
671 setdimlabel 1, -1, AD_Dim1, data
672 multithread data = tempdata[0][q][p]
674 redimension /n=(nx,ny,nz) data
675 setdimlabel 0, -1, AD_Dim0, data
676 setdimlabel 1, -1, AD_Dim1, data
677 setdimlabel 2, -1, AD_DimN, data
678 multithread data = tempdata[r][q][p]
684 redimension /n=(nx,ny,nt) data
685 setdimlabel 0, -1, AD_Dim0, data
686 setdimlabel 1, -1, AD_Dim1, data
687 setdimlabel 2, -1, AD_DimX, data
688 multithread data = tempdata[r][0][q][p]
690 redimension /n=(nx,ny,nz,nt) data
691 setdimlabel 0, -1, AD_Dim0, data
692 setdimlabel 1, -1, AD_Dim1, data
693 setdimlabel 2, -1, AD_DimN, data
694 setdimlabel 3, -1, AD_DimX, data
695 multithread data = tempdata[s][r][q][p]
714 dfref dataDF = GetWavesDataFolderDFR(data)
715 dfref attrDF = dataDF:attr
716 if (DataFolderRefStatus(attrDF) == 0)
734 dfref saveDF = GetDataFolderDFR()
735 dfref dataDF = GetWavesDataFolderDFR(data)
738 if (ParamIsDefault(source))
740 wave /SDFR=attrDF /Z AcquisitionMode
741 wave /SDFR=attrDF /T /Z Manufacturer
743 if (waveexists(Manufacturer) && (numpnts(Manufacturer) >= 1))
744 strswitch(Manufacturer[0])
752 elseif (waveexists(AcquisitionMode) && (numpnts(AcquisitionMode) >= 1))
753 if (stringmatch(note(AcquisitionMode), "*SCIENTA*"))
789 if (ParamIsDefault(progress))
795 #if Exists("HDF5LoadData")
800 datasetname = detectorpath +
"data"
801 STRUCT HDF5DataInfo di
803 variable err = HDF5DatasetInfo(fileID, datasetname, 0, di)
805 print
"error accessing detector/data"
809 print
"error: rank of dataset < 2"
814 variable idx, idy, idz, idt, izt
820 variable nx, ny, nz, nt, nzt
826 make /n=(nx,ny,nz,nt) /o data
827 string dim_labels =
"AD_Dim0;AD_Dim1;AD_DimN;AD_DimX;AD_DimY"
829 dim_label = StringFromList(0, dim_labels,
";")
830 setdimlabel 0, -1, $dim_label, data
831 dim_labels = RemoveFromList(dim_label, dim_labels,
";")
832 dim_label = StringFromList(0, dim_labels, ";")
833 setdimlabel 1, -1, $dim_label, data
834 dim_labels = RemoveFromList(dim_label, dim_labels, ";")
838 for (
id = idy - 1; (
id >= 0) && (nz == 1);
id -= 1)
842 dim_label = StringFromList(0, dim_labels, ";")
843 setdimlabel 2, -1, $dim_label, data
845 dim_labels = RemoveListItem(0, dim_labels, ";")
847 for (
id = idz - 1; (
id >= 0) && (nt == 1);
id -= 1)
851 dim_label = StringFromList(0, dim_labels, ";")
852 setdimlabel 3, -1, $dim_label, data
854 dim_labels = RemoveListItem(0, dim_labels, ";")
856 redimension /n=(nx,ny,nz,nt) data
873 HDF5MakeHyperslabWave(GetDataFolder(1) + "slab", max(di.ndims, 4))
879 slab[idx][%Block] = nx
880 slab[idy][%Block] = ny
883 for (iz = 0; iz < nz; iz += 1)
884 for (it = 0; it < nt; it += 1)
885 slab[idz][%Start] = iz
886 slab[idt][%Start] = it
887 HDF5LoadData /O /Q /Z /SLAB=slab /N=slabdata fileID, datasetname
889 switch (WaveDims(slabdata))
891 data[][][iz][it] = slabdata[q][p]
894 data[][][iz][it] = slabdata[0][q][p]
897 data[][][iz][it] = slabdata[0][0][q][p]
915 redimension /n=(nx,ny) data
917 redimension /n=(nx,ny,nz) data
924 Abort
"HDF5 XOP not loaded."
958 #if Exists("HDF5LoadData")
963 datasetname = detectorpath +
"data"
964 STRUCT HDF5DataInfo di
966 variable err = HDF5DatasetInfo(fileID, datasetname, 0, di)
968 print
"error accessing detector/data"
972 print
"error: rank of dataset < 1"
977 variable idx, idy, idz, idt
979 idy = di.ndims >= 2 ? di.ndims - 2 : 1
980 idz = di.ndims >= 3 ? di.ndims - 3 : 2
981 idt = di.ndims >= 4 ? di.ndims - 4 : 3
985 ny = di.ndims >= 2 ? di.dims[idy] : 1
987 variable dim2end = dim2start + dim2count - 1
988 variable dim3end = dim3start + dim3count - 1
992 HDF5MakeHyperslabWave(GetDataFolder(1) +
"slab", max(di.ndims, 4))
998 slab[idx][%Block] = nx
999 slab[idy][%Block] = ny
1001 make /n=(nx,ny)/o/d data
1005 for (iz = dim2start; iz <= dim2end; iz += 1)
1006 for (it = dim3start; it <= dim3end; it += 1)
1007 slab[idz][%Start] = iz
1008 slab[idt][%Start] = it
1009 HDF5LoadData /O /Q /Z /SLAB=slab /N=slabdata fileID, datasetname
1011 switch (WaveDims(slabdata))
1017 data += slabdata[q][p]
1021 data += slabdata[0][q][p]
1025 data += slabdata[0][0][q][p]
1032 setdimlabel 0, -1, AD_Dim0, data
1033 setdimlabel 1, -1, AD_Dim1, data
1036 Abort
"HDF5 XOP not loaded."
1046 string all_funcs = FunctionList("*", ";", "KIND:6,NPARAMS:2,VALTYPE:8")
1050 variable nn = ItemsInList(all_funcs, ";")
1057 for (ii = 0; ii < nn; ii += 1)
1058 funcname = StringFromList(ii, all_funcs, ";")
1059 info = FunctionInfo(funcname)
1060 accept = (NumberByKey("RETURNTYPE", info, ":", ";") == 0x4000)
1061 accept = accept && (cmpstr(StringByKey("THREADSAFE", info, ":", ";"), "yes") == 0)
1062 accept = accept && (NumberByKey("N_PARAMS", info, ":", ";") == 2)
1063 accept = accept && (NumberByKey("N_OPT_PARAMS", info, ":", ";") == 0)
1066 accept = accept && (NumberByKey("PARAM_0_TYPE", info, ":", ";") == 0x4002)
1067 accept = accept && (NumberByKey("PARAM_1_TYPE", info, ":", ";") == 0x3000)
1070 result = AddListItem(funcname, result, ";")
1074 result = SortList(result, ";", 4)
1121 make /n=0 /free dest1, dest2
1127 make /n=2 /free /wave results
1143 redimension /n=(dimsize(image, dim)) profile
1144 setscale /p x dimoffset(image, dim), dimdelta(image, dim), waveunits(image, dim), profile
1145 setscale d 0, 0, waveunits(image, -1), profile
1146 setdimlabel 0, -1, $getdimlabel(image, dim, -1), profile
1174 string reduction_param
1175 string result_prefix
1177 wave /wave results = reduction_func(source, reduction_param)
1180 return reduction_param
1203 function
adh5_reduce_brick(source, reduction_func, reduction_param, result_prefix, [progress, nthreads])
1206 string reduction_param
1207 string result_prefix
1212 if (ParamIsDefault(progress))
1215 if (ParamIsDefault(nthreads))
1219 dfref base_df = GetDataFolderDFR()
1221 string wavenames = ""
1224 variable nx, ny, nz, nt
1225 nx = dimsize(source, 0)
1226 ny = dimsize(source, 1)
1227 nz = dimsize(source, 2)
1231 variable nzt = max(nz, 1) * max(nt, 1)
1235 nthreads = ThreadProcessorCount
1238 variable threadGroupID = ThreadGroupCreate(nthreads)
1240 for (ithread = 0; ithread < nthreads; ithread += 1)
1244 make /n=(nzt) /df /free processing_folders
1253 variable n_recvd = 0
1259 make /n=0 /free /wave result_waves
1266 if (n_sent < max(1, nthreads) * 10 + n_recvd)
1270 dfname = "processing_" + num2str(n_sent)
1271 NewDataFolder /s $dfname
1272 ad_extract_slab(source, nan, nan, nan, nan, iz, iz, "image", pscale=1)
1274 variable /g r_index = iz
1275 variable /g s_index = it
1276 string /g func_param = reduction_param
1281 ThreadGroupPutDF threadGroupID, :
1284 processing_folders[n_sent] = GetDataFolderDFR()
1285 string param = func_param
1286 wave /wave reduced_waves = reduction_func(image, param)
1287 variable /g func_result = numpnts(reduced_waves)
1289 WaveClear image, reduced_waves
1303 tmo = min(100, tmo + 10)
1309 dfr = ThreadGroupGetDFR(threadGroupID, tmo)
1311 dfr = processing_folders[n_recvd]
1312 processing_folders[n_recvd] = $""
1315 if (DatafolderRefStatus(dfr) != 0)
1317 nvar rr = dfr:r_index
1318 nvar ss = dfr:s_index
1319 nvar func_result = dfr:func_result
1321 if (func_result < 1)
1322 print "error during data reduction."
1328 if (numpnts(result_waves) == 0)
1329 redimension /n=(func_result) result_waves
1330 for (iw = 0; iw < func_result; iw += 1)
1331 sw = "redw_" + num2str(iw)
1332 wave profile = dfr:$sw
1333 sw = "ReducedData" + num2str(iw+1)
1334 make /n=(dimsize(profile, 0), nz, nt) /d /o $sw
1336 setdimlabel 0, -1, $getdimlabel(profile, 0, -1), data
1337 setscale /p x dimoffset(profile, 0), dimdelta(profile, 0), waveunits(profile, 0), data
1338 setscale /p y dimoffset(source, 2), dimdelta(source, 2), waveunits(source, 2), data
1339 setscale /p z dimoffset(source, 3), dimdelta(source, 3), waveunits(source, 3), data
1340 setscale d 0, 0, waveunits(profile, -1), data
1341 note data, note(profile)
1342 result_waves[iw] = data
1347 for (iw = 0; iw < func_result; iw += 1)
1348 sw = "redw_" + num2str(iw)
1349 wave profile = dfr:$sw
1350 wave data = result_waves[iw]
1351 data[][rr][ss] = profile[p]
1355 KillDataFolder /Z dfr
1370 while ((n_recvd < nzt) && (result == 0))
1374 variable tstatus = ThreadGroupRelease(threadGroupID)
1376 print "error: thread did not terminate properly."
1382 nw = numpnts(result_waves)
1384 for (iw = 0; iw < nw; iw += 1)
1385 wave /z data = result_waves[iw]
1386 if (WaveExists(data))
1388 redimension /n=(-1, 0, 0) data
1390 redimension /n=(-1, nz, 0) data
1392 wavenames += nameofwave(data) + ";"
1400 setdatafolder base_df
1415 dfref dfr = ThreadGroupGetDFR(0, 1000)
1416 if (DataFolderRefStatus(dfr) == 0)
1426 wave image = dfr:image
1427 svar func_param = dfr:func_param
1428 nvar rr = dfr:r_index
1429 nvar ss = dfr:s_index
1432 newdatafolder /s outDF
1433 variable /g r_index = rr
1434 variable /g s_index = ss
1435 string param = func_param
1436 wave /wave reduced_waves = reduction_func(image, param)
1437 variable /g func_result = numpnts(reduced_waves)
1441 WaveClear image, reduced_waves
1442 ThreadGroupPutDF 0, :
1465 string result_prefix
1466 variable start_index
1468 variable nw = numpnts(results)
1471 for (iw = 0; iw < nw; iw += 1)
1472 sw = result_prefix + num2str(iw + start_index)
1473 duplicate /o results[iw], $sw
1503 string reduction_param
1507 if (ParamIsDefault(progress))
1510 if (ParamIsDefault(nthreads))
1516 #if Exists("HDF5LoadData")
1521 datasetname = detectorpath +
"data"
1522 STRUCT HDF5DataInfo di
1523 InitHDF5DataInfo(di)
1524 variable err = HDF5DatasetInfo(fileID, datasetname, 0, di)
1526 print
"error accessing detector/data"
1530 print
"error: rank of dataset < 2"
1535 variable idx, idy, idz, idt
1541 variable nx, ny, nz, nt
1549 for (
id = idy - 1; (
id >= 0) && (nz == 1);
id -= 1)
1550 if (di.dims[
id] > 1)
1555 for (
id = idz - 1; (
id >= 0) && (nt == 1);
id -= 1)
1556 if (di.dims[
id] > 1)
1568 variable nzt = nz * nt
1572 HDF5MakeHyperslabWave(GetDataFolder(1) + "slab", max(di.ndims, 4))
1578 slab[idx][%Block] = nx
1579 slab[idy][%Block] = ny
1583 nthreads = ThreadProcessorCount
1586 variable threadGroupID = ThreadGroupCreate(nthreads)
1588 for (ithread = 0; ithread < nthreads; ithread += 1)
1592 make /n=(nzt) /df /free processing_folders
1599 make /n=(nx,ny)/d image_template
1600 setdimlabel 0, -1, AD_Dim0, image_template
1601 setdimlabel 1, -1, AD_Dim1, image_template
1608 make /n=0 /free /wave result_waves
1611 for (iz = 0; iz < nz; iz += 1)
1612 for (it = 0; it < nt; it += 1)
1614 slab[idz][%Start] = iz
1615 slab[idt][%Start] = it
1616 dfname = "processing_" + num2str(izt)
1617 newdatafolder /s $dfname
1618 HDF5LoadData /O /Q /Z /SLAB=slab /N=slabdata fileID, datasetname
1621 duplicate image_template, image
1622 variable /g r_index = iz
1623 variable /g s_index = it
1624 string /g func_param = reduction_param
1628 ThreadGroupPutDF threadGroupID, :
1630 processing_folders[izt] = GetDataFolderDFR()
1632 wave /wave reduced_waves =
reduce_slab_image(slabdata, image, reduction_func, func_param)
1633 variable /g func_result = numpnts(reduced_waves)
1635 WaveClear slabdata, image, reduced_waves
1650 killwaves /z slab, image_template
1656 for (izt = 0; (izt < nzt) && (result == 0); izt += 1)
1659 dfr = ThreadGroupGetDFR(threadGroupID, 1000)
1660 if (DatafolderRefStatus(dfr) != 0)
1671 dfr = processing_folders[izt]
1684 nvar rr = dfr:r_index
1685 nvar ss = dfr:s_index
1686 nvar func_result = dfr:func_result
1688 if (func_result < 1)
1693 if (numpnts(result_waves) == 0)
1694 redimension /n=(func_result) result_waves
1695 for (iw = 0; iw < func_result; iw += 1)
1696 sw = "redw_" + num2str(iw)
1697 wave profile = dfr:$sw
1698 sw = "ReducedData" + num2str(iw+1)
1699 make /n=(dimsize(profile, 0), nz, nt) /d /o $sw
1701 setdimlabel 0, -1, $getdimlabel(profile, 0, -1), data
1702 setscale /p x dimoffset(profile, 0), dimdelta(profile, 0), waveunits(profile, 0), data
1703 setscale d 0, 0, waveunits(profile, -1), data
1704 result_waves[iw] = data
1707 for (iw = 0; iw < func_result; iw += 1)
1708 sw = "redw_" + num2str(iw)
1709 wave profile = dfr:$sw
1710 wave data = result_waves[iw]
1711 data[][rr][ss] = profile[p]
1716 variable tstatus = ThreadGroupRelease(threadGroupID)
1721 for (izt = 0; izt < nzt; izt += 1)
1722 KillDataFolder /Z processing_folders[izt]
1727 nw = numpnts(result_waves)
1728 for (iw = 0; iw < nw; iw += 1)
1729 wave data = result_waves[iw]
1731 redimension /n=(dimsize(data, 0)) data
1733 redimension /n=(dimsize(data, 0),nz) data
1734 setdimlabel 1, -1, AD_DimN, data
1736 setdimlabel 1, -1, AD_DimN, data
1737 setdimlabel 2, -1, AD_DimX, data
1746 Abort
"HDF5 XOP not loaded."
1756 dfref dfr = ThreadGroupGetDFR(0, 1000)
1757 if (DataFolderRefStatus(dfr) == 0)
1767 wave slabdata = dfr:slabdata
1768 wave image = dfr:image
1769 svar func_param = dfr:func_param
1770 nvar rr = dfr:r_index
1771 nvar ss = dfr:s_index
1774 newdatafolder /s outDF
1775 variable /g r_index = rr
1776 variable /g s_index = ss
1777 wave /wave reduced_waves =
reduce_slab_image(slabdata, image, reduction_func, func_param)
1778 variable /g func_result = numpnts(reduced_waves)
1782 WaveClear slabdata, image, reduced_waves
1783 ThreadGroupPutDF 0, :
1790 threadsafe static function /wave
reduce_slab_image(slabdata, image, reduction_func, reduction_param)
1794 string reduction_param
1796 switch (WaveDims(slabdata))
1798 image = slabdata[q][p]
1801 image = slabdata[0][q][p]
1804 image = slabdata[0][0][q][p]
1808 return reduction_func(image, reduction_param)
1825 string attributespath
1831 #if Exists("HDF5LoadData")
1834 HDF5ListGroup /F /TYPE=2 fileID, attributespath
1835 string h5datasets = S_HDF5ListGroup
1836 HDF5ListAttributes /TYPE=1 /Z fileID, attributespath
1837 string h5attributes = S_HDF5ListAttributes
1839 variable nds = ItemsInList(h5datasets,
";")
1840 variable na = ItemsInList(h5attributes, ";")
1847 make /n=(nds+na) /t /o IN, ID, IV, IU
1849 for (ids = 0; ids < nds; ids += 1)
1850 datasetname = StringFromList(ids, h5datasets, ";")
1851 HDF5LoadData /O/Q fileID, datasetname
1853 datawavename = StringFromList(0, s_wavenames)
1857 HDF5LoadData /A="source"/O/Q/TYPE=2 fileID, datasetname
1860 s_source = source[0]
1869 nds = ItemsInList(h5attributes, ";")
1873 for (ids = 0; ids < nds; ids += 1)
1874 datasetname = StringFromList(ids, h5attributes, ";")
1875 HDF5LoadData /A=datasetname/O/Q/TYPE=1 fileID, attributespath
1877 datawavename = StringFromList(0, s_wavenames)
1882 redimension /n=(idest) IN, ID, IV, IU
1883 sort {IN, ID}, IN, ID, IV, IU
1887 Abort
"HDF5 XOP not loaded."
1923 if (exists(datawavename) == 1)
1924 if (strlen(source) > 0)
1925 Note $datawavename,
"PV=" + source
1927 switch(WaveType($datawavename, 1))
1929 wave w_attr = $datawavename
1930 n_attr = numpnts(w_attr)
1931 sprintf s_attr,
"%.12g", w_attr[0]
1934 wave /t wt_attr = $datawavename
1935 n_attr = numpnts(wt_attr)
1943 ID[idest] = datawavename
1961 dfref saveDF = GetDataFolderDFR()
1963 dfref dataDF = GetWavesDataFolderDFR(data)
1966 wave /SDFR=attrDF LensMode
1967 wave /SDFR=attrDF /Z ChannelBegin, ChannelEnd
1968 wave /SDFR=attrDF /Z SliceBegin, SliceEnd
1971 variable ELow, EHigh, ALow, AHigh
1975 strswitch(GetDimLabel(data, 0, -1))
1985 strswitch(GetDimLabel(data, 1, -1))
1998 ELow = dimoffset(data, EDim)
1999 EHigh = dimoffset(data, EDim) + dimdelta(data, EDim) * (dimsize(data, EDim) - 1)
2003 ALow = dimoffset(data, ADim)
2004 AHigh = dimoffset(data, ADim) + dimdelta(data, ADim) * (dimsize(data, ADim) - 1)
2009 if (waveexists(LensMode) && (numpnts(LensMode) >= 1))
2025 if (waveexists(ChannelBegin) && waveexists(ChannelEnd) && (numpnts(ChannelBegin) >= 1) && (numpnts(ChannelEnd) >= 1))
2026 ELow = ChannelBegin[0]
2027 EHigh = ChannelEnd[0]
2029 if (waveexists(SliceBegin) && waveexists(SliceEnd) && (numpnts(SliceBegin) >= 1) && (numpnts(SliceEnd) >= 1))
2030 ALow = SliceBegin[0]
2037 setscale /i x ELow, EHigh, EUnit, data
2040 setscale /i y ELow, EHigh, EUnit, data
2045 setscale /i x ALow, AHigh, AUnit, data
2048 setscale /i y ALow, AHigh, AUnit, data
2052 setscale d 0, 0, "arb.", data
2054 setdatafolder saveDF
2066 dfref saveDF = GetDataFolderDFR()
2068 dfref dataDF = GetWavesDataFolderDFR(data)
2069 wave /SDFR=dataDF AcquisitionMode, DetectorMode, EnergyMode
2071 wave /SDFR=dataDF /z Scan1Active, Scan2Active
2072 wave /SDFR=dataDF /t /z Scan1Positioner1, Scan1Readback1
2073 wave /SDFR=dataDF /t /z Scan1Positioner2, Scan1Readback2
2074 wave /SDFR=dataDF /t /z Scan2Positioner1, Scan2Readback1
2075 wave /SDFR=dataDF /t /z Scan2Positioner2, Scan2Readback2
2081 strswitch(GetDimLabel(data, 0, -1))
2083 setscale /i x zscale[0], zscale[numpnts(zscale)-1], "", data
2086 strswitch(GetDimLabel(data, 1, -1))
2088 setscale /i y zscale[0], zscale[numpnts(zscale)-1], "", data
2091 strswitch(GetDimLabel(data, 2, -1))
2093 setscale /i z zscale[0], zscale[numpnts(zscale)-1], "", data
2097 setdatafolder saveDF