1 #pragma rtGlobals=3// Use modern global access method and strict wave access. 2 #pragma IgorVersion = 6.2 3 #pragma ModuleName = PearlAreaImport 5 #include <HDF5 Browser> 6 #include "pearl-gui-tools" 34 static variable
BeforeFileOpenHook(variable refNum,
string fileName,
string path,
string type,
string creator, variable kind){
36 string fileName, path, type, creator
38 variable handledOpen = 0
42 string NickName = CleanupName(ParseFilePath(3, FileName,
":", 0, 0), 0)
43 string FileExt = LowerStr(ParseFilePath(4, FileName,
":", 0, 0))
47 svar /z cnn = gsCustomNickName
49 if (exists(
"gvNickNameIndex") != 2)
50 variable/g gvNickNameIndex = 1
52 nvar nni = gvNickNameIndex
53 NickName = cnn + num2str(nni)
57 if (stringmatch(FileExt,
"h5") == 1)
61 string/g s_latest_datafile = result
62 string/g s_latest_nickname = nickname
64 handledOpen = strlen(result) > 0
98 string ad_suggest_foldername(
string filename, variable ignoredate = defaultValue,
string sourcename = defaultValue, variable unique = defaultValue){
104 if (ParamIsDefault(ignoredate))
107 if (ParamIsDefault(unique))
111 string basename = ParseFilePath(3, filename,
":", 0, 0)
112 string extension = ParseFilePath(4, filename,
":", 0, 0)
116 if (strsearch(basename,
"scienta", 0, 2) >= 0)
118 else if (strsearch(basename,
"pshell", 0, 2) >= 0)
120 else if (strsearch(basename,
"OP-SL", 0, 2) >= 0)
122 else if (strsearch(basename,
"ES-PS", 0, 2) >= 0)
127 if (ParamIsDefault(sourcename))
128 sourcename = autosource
131 variable nparts = ItemsInList(basename,
"-")
133 string datepart = StringFromList(1, basename,
"-")
134 variable l_datepart = strlen(datepart)
136 datepart = datepart[l_datepart-6, l_datepart-1]
138 string indexpart = StringFromList(2, basename,
"-")
140 sprintf nickname,
"%s_%s", sourcename, indexpart
142 sprintf nickname,
"%s_%s_%s", sourcename, datepart, indexpart
145 nickname = CleanupName(basename, 0)
148 if (unique && CheckName(nickname, 11))
149 nickname = UniqueName(nickname +
"_", 11, 0)
163 string message =
"Select data files" 165 string filefilters =
"Area Detector HDF5 Files (*.h5):.h5;" 166 filefilters +=
"All Files:.*;" 168 PathInfo /S $APathName
169 Open /D /R /F=filefilters /M=message /MULT=1 refNum
170 filepaths = S_fileName
172 dfref saveDF = GetDataFolderDFR()
175 if (strlen(filepaths) > 0)
176 variable nfiles = ItemsInList(filepaths,
"\r")
178 for(ifile = 0; ifile < nfiles; ifile += 1)
179 String path = StringFromList(ifile, filepaths,
"\r")
199 string adh5_load_complete(
string ANickName,
string APathName,
string AFileName, variable load_data = defaultValue, variable load_attr = defaultValue){
206 if (ParamIsDefault(load_data))
209 if (ParamIsDefault(load_attr))
213 dfref saveDF = GetDataFolderDFR()
215 newdatafolder /s/o $(
"root:" + ANickName)
219 string instrumentpath =
"/entry/instrument/" 220 string detectorpath = instrumentpath +
"detector/" 221 string attributespath = instrumentpath +
"NDAttributes/" 227 variable /g adh5_perf_secs
228 timerRefNum = startMSTimer
231 #
if Exists(
"HDF5OpenFile")
232 HDF5OpenFile /P=$APathName/R fileID as AFileName
234 AFileName = s_path + s_filename
235 print
"loading " + s_filename +
"\r" 241 newdatafolder /o/s attr
247 if (waveexists(data))
257 Abort
"HDF5 XOP not loaded." 260 if (timerRefNum >= 0)
261 adh5_perf_secs = stopMSTimer(timerRefNum) / 1e6
294 string adh5_load_reduced(
string ANickName,
string APathName,
string AFileName, funcref reduction_func,
string reduction_param, variable load_data = defaultValue, variable load_attr = defaultValue, variable progress = defaultValue){
300 string reduction_param
306 if (ParamIsDefault(load_data))
309 if (ParamIsDefault(load_attr))
312 if (ParamIsDefault(progress))
316 dfref saveDF = GetDataFolderDFR()
318 newdatafolder /s/o $(
"root:" + ANickName)
322 string instrumentpath =
"/entry/instrument/" 323 string detectorpath = instrumentpath +
"detector/" 324 string attributespath = instrumentpath +
"NDAttributes/" 330 variable /g adh5_perf_secs
331 timerRefNum = startMSTimer
334 #
if Exists(
"HDF5OpenFile")
335 HDF5OpenFile /P=$APathName/R fileID as AFileName
337 AFileName = s_path + s_filename
338 print
"loading " + s_filename +
"\r" 341 newdatafolder /o/s attr
354 Abort
"HDF5 XOP not loaded." 357 if (timerRefNum >= 0)
358 adh5_perf_secs = stopMSTimer(timerRefNum) / 1e6
379 string adh5_load_preview(
string ANickName,
string APathName,
string AFileName, variable load_data = defaultValue, variable load_attr = defaultValue){
386 if (ParamIsDefault(load_data))
389 if (ParamIsDefault(load_attr))
393 dfref saveDF = GetDataFolderDFR()
395 newdatafolder /o/s pearl_area
396 newdatafolder /o/s preview
400 string instrumentpath =
"/entry/instrument/" 401 string detectorpath = instrumentpath +
"detector/" 402 string attributespath = instrumentpath +
"NDAttributes/" 408 variable /g adh5_perf_secs
409 timerRefNum = startMSTimer
412 #if Exists("HDF5OpenFile") 413 HDF5OpenFile /P=$APathName/R/Z fileID as AFileName
415 AFileName = s_path + s_filename
418 datasetname = detectorpath +
"data" 419 STRUCT HDF5DataInfo di
421 variable err = HDF5DatasetInfo(fileID, datasetname, 0, di)
423 print
"error accessing detector/data" 427 print
"error: rank of dataset < 2" 431 variable dim2start = 0, dim2count = 1, dim3start = 0, dim3count = 1
433 dim2start = floor(di.dims[di.ndims - 3] / 2)
437 dim3start = floor(di.dims[di.ndims - 4] / 2)
444 string destpath = GetDataFolder(1, saveDF) + ANickName
445 if (waveexists(data))
446 duplicate /o data, $destpath
447 wave /z data = $destpath
453 newdatafolder /o/s attr
457 if (waveexists(data))
464 print
"error opening file " + AFileName
468 Abort
"HDF5 XOP not loaded." 471 if (timerRefNum >= 0)
472 adh5_perf_secs = stopMSTimer(timerRefNum) / 1e6
493 dfref saveDF = GetDataFolderDFR()
497 string instrumentpath =
"/entry/instrument/" 498 string detectorpath = instrumentpath +
"detector/" 499 string attributespath = instrumentpath +
"NDAttributes/" 509 #if Exists("HDF5OpenFile") 510 HDF5OpenFile /P=$APathName/R/Z fileID as AFileName
512 AFileName = s_path + s_filename
515 datasetname = detectorpath +
"data" 516 STRUCT HDF5DataInfo di
518 variable err = HDF5DatasetInfo(fileID, datasetname, 0, di)
520 print
"error accessing detector/data" 524 for (idim = 0; idim < di.ndims; idim += 1)
525 sprintf s,
"dim %u: %u points", idim, di.dims[idim]
526 if (strlen(s_info) > 0)
527 s_info = s_info +
"\r" + s
533 dfref df = NewFreeDataFolder()
537 for (idim = 1; idim < 5; idim += 1)
538 sprintf s,
"Scan%uActive", idim
540 if (waveexists(w) && (numpnts(w) > 0) && (w[0] > 0))
541 sprintf s,
"Scan%uPositioner1", idim
543 sprintf s,
"scan %u: %s", idim, wt[0]
544 if (strlen(s_info) > 0)
545 s_info = s_info +
"\r" + s
554 print
"error opening file " + AFileName
558 Abort
"HDF5 XOP not loaded." 578 #if Exists("HDF5LoadData") 583 datasetname = detectorpath +
"data" 584 STRUCT HDF5DataInfo di
586 variable err = HDF5DatasetInfo(fileID, datasetname, 0, di)
588 print
"error accessing detector/data" 592 print
"error: rank of dataset < 2" 596 HDF5LoadData /O /Q /Z fileID, datasetname
600 Abort
"HDF5 XOP not loaded." 621 duplicate /free data, tempdata
622 variable nd = wavedims(tempdata)
623 variable nx = dimsize(tempdata, nd - 1)
624 variable ny = dimsize(tempdata, nd - 2)
625 variable nz = dimsize(tempdata, nd - 3)
626 variable nt = dimsize(tempdata, nd - 4)
631 redimension /n=(ny) data
632 setdimlabel 0, -1, AD_Dim1, data
633 data = tempdata[p][0]
635 redimension /n=(nx) data
636 setdimlabel 0, -1, AD_Dim0, data
637 data = tempdata[0][p]
639 redimension /n=(nx,ny) data
640 setdimlabel 0, -1, AD_Dim0, data
641 setdimlabel 1, -1, AD_Dim1, data
642 data = tempdata[q][p]
647 redimension /n=(ny,nz) data
648 setdimlabel 0, -1, AD_Dim1, data
649 setdimlabel 1, -1, AD_DimN, data
650 multithread data = tempdata[q][p][0]
652 redimension /n=(nx,nz) data
653 setdimlabel 0, -1, AD_Dim0, data
654 setdimlabel 1, -1, AD_DimN, data
655 multithread data = tempdata[q][0][p]
657 redimension /n=(nx,ny) data
658 setdimlabel 0, -1, AD_Dim0, data
659 setdimlabel 1, -1, AD_Dim1, data
660 multithread data = tempdata[0][q][p]
662 redimension /n=(nx,ny,nz) data
663 setdimlabel 0, -1, AD_Dim0, data
664 setdimlabel 1, -1, AD_Dim1, data
665 setdimlabel 2, -1, AD_DimN, data
666 multithread data = tempdata[r][q][p]
672 redimension /n=(nx,ny,nt) data
673 setdimlabel 0, -1, AD_Dim0, data
674 setdimlabel 1, -1, AD_Dim1, data
675 setdimlabel 2, -1, AD_DimX, data
676 multithread data = tempdata[r][0][q][p]
678 redimension /n=(nx,ny,nz,nt) data
679 setdimlabel 0, -1, AD_Dim0, data
680 setdimlabel 1, -1, AD_Dim1, data
681 setdimlabel 2, -1, AD_DimN, data
682 setdimlabel 3, -1, AD_DimX, data
683 multithread data = tempdata[s][r][q][p]
702 dfref dataDF = GetWavesDataFolderDFR(data)
703 dfref attrDF = dataDF:attr
704 if (DataFolderRefStatus(attrDF) == 0)
718 variable
adh5_scale(wave data,
string source = defaultValue){
722 dfref saveDF = GetDataFolderDFR()
723 dfref dataDF = GetWavesDataFolderDFR(data)
726 if (ParamIsDefault(source))
728 wave /SDFR=attrDF /Z AcquisitionMode
729 wave /SDFR=attrDF /T /Z Manufacturer
731 if (waveexists(Manufacturer) && (numpnts(Manufacturer) >= 1))
732 strswitch(Manufacturer[0])
740 else if (waveexists(AcquisitionMode) && (numpnts(AcquisitionMode) >= 1))
741 if (stringmatch(note(AcquisitionMode),
"*SCIENTA*"))
777 if (ParamIsDefault(progress))
783 #if Exists("HDF5LoadData") 788 datasetname = detectorpath +
"data" 789 STRUCT HDF5DataInfo di
791 variable err = HDF5DatasetInfo(fileID, datasetname, 0, di)
793 print
"error accessing detector/data" 797 print
"error: rank of dataset < 2" 802 variable idx, idy, idz, idt, izt
808 variable nx, ny, nz, nt, nzt
814 make /n=(nx,ny,nz,nt) /o data
815 string dim_labels =
"AD_Dim0;AD_Dim1;AD_DimN;AD_DimX;AD_DimY" 817 dim_label = StringFromList(0, dim_labels,
";")
818 setdimlabel 0, -1, $dim_label, data
819 dim_labels = RemoveFromList(dim_label, dim_labels,
";")
820 dim_label = StringFromList(0, dim_labels,
";")
821 setdimlabel 1, -1, $dim_label, data
822 dim_labels = RemoveFromList(dim_label, dim_labels,
";")
826 for (
id = idy - 1; (
id >= 0) && (nz == 1);
id -= 1)
830 dim_label = StringFromList(0, dim_labels,
";")
831 setdimlabel 2, -1, $dim_label, data
833 dim_labels = RemoveListItem(0, dim_labels,
";")
835 for (
id = idz - 1; (
id >= 0) && (nt == 1);
id -= 1)
839 dim_label = StringFromList(0, dim_labels,
";")
840 setdimlabel 3, -1, $dim_label, data
842 dim_labels = RemoveListItem(0, dim_labels,
";")
844 redimension /n=(nx,ny,nz,nt) data
861 HDF5MakeHyperslabWave(GetDataFolder(1) +
"slab", max(di.ndims, 4))
867 slab[idx][%Block] = nx
868 slab[idy][%Block] = ny
871 for (iz = 0; iz < nz; iz += 1)
872 for (it = 0; it < nt; it += 1)
873 slab[idz][%Start] = iz
874 slab[idt][%Start] = it
875 HDF5LoadData /O /Q /Z /SLAB=slab /N=slabdata fileID, datasetname
877 switch (WaveDims(slabdata))
879 data[][][iz][it] = slabdata[q][p]
882 data[][][iz][it] = slabdata[0][q][p]
885 data[][][iz][it] = slabdata[0][0][q][p]
903 redimension /n=(nx,ny) data
905 redimension /n=(nx,ny,nz) data
912 Abort
"HDF5 XOP not loaded." 937 variable
adh5_load_detector_image(variable fileID,
string detectorpath, variable dim2start, variable dim2count, variable dim3start, variable dim3count){
946 #if Exists("HDF5LoadData") 951 datasetname = detectorpath +
"data" 952 STRUCT HDF5DataInfo di
954 variable err = HDF5DatasetInfo(fileID, datasetname, 0, di)
956 print
"error accessing detector/data" 960 print
"error: rank of dataset < 1" 965 variable idx, idy, idz, idt
967 idy = di.ndims >= 2 ? di.ndims - 2 : 1
968 idz = di.ndims >= 3 ? di.ndims - 3 : 2
969 idt = di.ndims >= 4 ? di.ndims - 4 : 3
973 ny = di.ndims >= 2 ? di.dims[idy] : 1
975 variable dim2end = dim2start + dim2count - 1
976 variable dim3end = dim3start + dim3count - 1
980 HDF5MakeHyperslabWave(GetDataFolder(1) +
"slab", max(di.ndims, 4))
986 slab[idx][%Block] = nx
987 slab[idy][%Block] = ny
989 make /n=(nx,ny)/o/d data
993 for (iz = dim2start; iz <= dim2end; iz += 1)
994 for (it = dim3start; it <= dim3end; it += 1)
995 slab[idz][%Start] = iz
996 slab[idt][%Start] = it
997 HDF5LoadData /O /Q /Z /SLAB=slab /N=slabdata fileID, datasetname
999 switch (WaveDims(slabdata))
1005 data += slabdata[q][p]
1009 data += slabdata[0][q][p]
1013 data += slabdata[0][0][q][p]
1020 setdimlabel 0, -1, AD_Dim0, data
1021 setdimlabel 1, -1, AD_Dim1, data
1024 Abort
"HDF5 XOP not loaded." 1034 string all_funcs = FunctionList(
"*",
";",
"KIND:6,NPARAMS:4,VALTYPE:1")
1038 variable nn = ItemsInList(all_funcs,
";")
1045 for (ii = 0; ii < nn; ii += 1)
1046 funcname = StringFromList(ii, all_funcs,
";")
1047 info = FunctionInfo(funcname)
1048 accept = (NumberByKey(
"RETURNTYPE", info,
":",
";") == 0x0004)
1049 accept = accept && (cmpstr(StringByKey(
"THREADSAFE", info,
":",
";"),
"yes") == 0)
1050 accept = accept && (NumberByKey(
"N_PARAMS", info,
":",
";") == 4)
1051 accept = accept && (NumberByKey(
"N_OPT_PARAMS", info,
":",
";") == 0)
1054 accept = accept && (NumberByKey(
"PARAM_0_TYPE", info,
":",
";") == 0x4002)
1055 accept = accept && (NumberByKey(
"PARAM_1_TYPE", info,
":",
";") == 0x4002)
1056 accept = accept && (NumberByKey(
"PARAM_2_TYPE", info,
":",
";") == 0x4002)
1057 accept = accept && (NumberByKey(
"PARAM_3_TYPE", info,
":",
";") == 0x3000)
1060 result = AddListItem(funcname, result,
";")
1064 result = SortList(result,
";", 4)
1118 redimension /n=(dimsize(image, dim)) profile
1119 setscale /p x dimoffset(image, dim), dimdelta(image, dim), waveunits(image, dim), profile
1120 setscale d 0, 0, waveunits(image, -1), profile
1121 setdimlabel 0, -1, $getdimlabel(image, dim, -1), profile
1133 string reduction_param
1135 reduction_func(source, dest1, dest2, reduction_param)
1137 return reduction_param
1162 variable
adh5_load_reduced_detector(variable fileID,
string detectorpath, funcref reduction_func,
string reduction_param, variable progress = defaultValue, variable nthreads = defaultValue){
1166 string reduction_param
1170 if (ParamIsDefault(progress))
1173 if (ParamIsDefault(nthreads))
1179 #if Exists("HDF5LoadData") 1184 datasetname = detectorpath +
"data" 1185 STRUCT HDF5DataInfo di
1186 InitHDF5DataInfo(di)
1187 variable err = HDF5DatasetInfo(fileID, datasetname, 0, di)
1189 print
"error accessing detector/data" 1193 print
"error: rank of dataset < 2" 1198 variable idx, idy, idz, idt
1204 variable nx, ny, nz, nt
1212 for (
id = idy - 1; (
id >= 0) && (nz == 1);
id -= 1)
1213 if (di.dims[
id] > 1)
1218 for (
id = idz - 1; (
id >= 0) && (nt == 1);
id -= 1)
1219 if (di.dims[
id] > 1)
1231 variable nzt = nz * nt
1235 HDF5MakeHyperslabWave(GetDataFolder(1) +
"slab", max(di.ndims, 4))
1241 slab[idx][%Block] = nx
1242 slab[idy][%Block] = ny
1246 nthreads = ThreadProcessorCount
1249 variable threadGroupID = ThreadGroupCreate(nthreads)
1251 for (ithread = 0; ithread < nthreads; ithread += 1)
1255 make /n=(nzt) /df /free processing_folders
1262 make /n=(nx,ny)/d image_template
1263 setdimlabel 0, -1, AD_Dim0, image_template
1264 setdimlabel 1, -1, AD_Dim1, image_template
1270 for (iz = 0; iz < nz; iz += 1)
1271 for (it = 0; it < nt; it += 1)
1273 slab[idz][%Start] = iz
1274 slab[idt][%Start] = it
1275 dfname =
"processing_" + num2str(izt)
1276 newdatafolder /s $dfname
1277 HDF5LoadData /O /Q /Z /SLAB=slab /N=slabdata fileID, datasetname
1280 duplicate image_template, image
1281 variable /g r_index = iz
1282 variable /g s_index = it
1283 string /g func_param = reduction_param
1287 ThreadGroupPutDF threadGroupID, :
1289 processing_folders[izt] = GetDataFolderDFR()
1290 make /n=1/d profile1, profile2
1292 variable /g func_result
1293 func_result =
reduce_slab_image(slabdata, image, profile1, profile2, reduction_func, func_param)
1294 WaveClear slabdata, image, profile1, profile2
1309 killwaves /z slab, image_template
1315 for (izt = 0; (izt < nzt) && (result == 0); izt += 1)
1318 dfr = ThreadGroupGetDFR(threadGroupID, 1000)
1319 if (DatafolderRefStatus(dfr) != 0)
1330 dfr = processing_folders[izt]
1343 nvar rr = dfr:r_index
1344 nvar ss = dfr:s_index
1345 nvar func_result = dfr:func_result
1346 wave profile1 = dfr:profile1
1347 wave profile2 = dfr:profile2
1349 if (func_result == 0)
1351 make /n=(dimsize(profile1, 0), nz, nt)/d/o data1
1352 make /n=(dimsize(profile2, 0), nz, nt)/d/o data2
1353 setdimlabel 0, -1, $getdimlabel(profile1, 0, -1), data1
1354 setdimlabel 0, -1, $getdimlabel(profile2, 0, -1), data2
1355 setscale /p x dimoffset(profile1, 0), dimdelta(profile1, 0), waveunits(profile1, 0), data1
1356 setscale /p x dimoffset(profile2, 0), dimdelta(profile2, 0), waveunits(profile2, 0), data2
1357 setscale d 0, 0, waveunits(profile1, -1), data1
1358 setscale d 0, 0, waveunits(profile2, -1), data2
1360 data1[][rr][ss] = profile1[p]
1361 data2[][rr][ss] = profile2[p]
1369 variable tstatus = ThreadGroupRelease(threadGroupID)
1374 for (izt = 0; izt < nzt; izt += 1)
1375 KillDataFolder /Z processing_folders[izt]
1381 redimension /n=(dimsize(data1,0)) data1
1382 redimension /n=(dimsize(data2,0)) data2
1384 redimension /n=(dimsize(data1,0),nz) data1
1385 redimension /n=(dimsize(data2,0),nz) data2
1386 setdimlabel 1, -1, AD_DimN, data1
1387 setdimlabel 1, -1, AD_DimN, data2
1389 setdimlabel 1, -1, AD_DimN, data1
1390 setdimlabel 1, -1, AD_DimN, data2
1391 setdimlabel 2, -1, AD_DimX, data1
1392 setdimlabel 2, -1, AD_DimX, data2
1400 Abort
"HDF5 XOP not loaded." 1410 dfref dfr = ThreadGroupGetDFR(0, 1000)
1411 if (DataFolderRefStatus(dfr) == 0)
1421 wave slabdata = dfr:slabdata
1422 wave image = dfr:image
1423 svar func_param = dfr:func_param
1424 nvar rr = dfr:r_index
1425 nvar ss = dfr:s_index
1428 newdatafolder /s outDF
1429 make /n=1/d profile1, profile2
1430 variable /g r_index = rr
1431 variable /g s_index = ss
1432 variable /g func_result
1433 func_result =
reduce_slab_image(slabdata, image, profile1, profile2, reduction_func, func_param)
1436 WaveClear slabdata, image, profile1, profile2
1437 ThreadGroupPutDF 0, :
1444 threadsafe
static variable
reduce_slab_image(wave slabdata, wave image, wave profile1, wave profile2, funcref reduction_func,
string reduction_param){
1450 string reduction_param
1452 switch (WaveDims(slabdata))
1454 image = slabdata[q][p]
1457 image = slabdata[0][q][p]
1460 image = slabdata[0][0][q][p]
1464 return reduction_func(image, profile1, profile2, reduction_param)
1481 string attributespath
1487 #if Exists("HDF5LoadData") 1490 HDF5ListGroup /F /TYPE=2 fileID, attributespath
1491 string h5datasets = S_HDF5ListGroup
1492 HDF5ListAttributes /TYPE=1 /Z fileID, attributespath
1493 string h5attributes = S_HDF5ListAttributes
1495 variable nds = ItemsInList(h5datasets,
";")
1496 variable na = ItemsInList(h5attributes,
";")
1503 make /n=(nds+na) /t /o IN, ID, IV, IU
1505 for (ids = 0; ids < nds; ids += 1)
1506 datasetname = StringFromList(ids, h5datasets,
";")
1507 HDF5LoadData /O/Q fileID, datasetname
1509 datawavename = StringFromList(0, s_wavenames)
1513 HDF5LoadData /A=
"source"/O/Q/TYPE=2 fileID, datasetname
1516 s_source = source[0]
1525 nds = ItemsInList(h5attributes,
";")
1529 for (ids = 0; ids < nds; ids += 1)
1530 datasetname = StringFromList(ids, h5attributes,
";")
1531 HDF5LoadData /A=datasetname/O/Q/TYPE=1 fileID, attributespath
1533 datawavename = StringFromList(0, s_wavenames)
1538 redimension /n=(idest) IN, ID, IV, IU
1539 sort {IN, ID}, IN, ID, IV, IU
1543 Abort
"HDF5 XOP not loaded." 1579 if (exists(datawavename) == 1)
1580 if (strlen(source) > 0)
1581 Note $datawavename,
"PV=" + source
1583 switch(WaveType($datawavename, 1))
1585 wave w_attr = $datawavename
1586 n_attr = numpnts(w_attr)
1587 sprintf s_attr,
"%.12g", w_attr[0]
1590 wave /t wt_attr = $datawavename
1591 n_attr = numpnts(wt_attr)
1599 ID[idest] = datawavename
1617 dfref saveDF = GetDataFolderDFR()
1619 dfref dataDF = GetWavesDataFolderDFR(data)
1622 wave /SDFR=attrDF LensMode
1623 wave /SDFR=attrDF /Z ChannelBegin, ChannelEnd
1624 wave /SDFR=attrDF /Z SliceBegin, SliceEnd
1627 variable ELow, EHigh, ALow, AHigh
1631 strswitch(GetDimLabel(data, 0, -1))
1641 strswitch(GetDimLabel(data, 1, -1))
1654 ELow = dimoffset(data, EDim)
1655 EHigh = dimoffset(data, EDim) + dimdelta(data, EDim) * (dimsize(data, EDim) - 1)
1659 ALow = dimoffset(data, ADim)
1660 AHigh = dimoffset(data, ADim) + dimdelta(data, ADim) * (dimsize(data, ADim) - 1)
1665 if (waveexists(LensMode) && (numpnts(LensMode) >= 1))
1681 if (waveexists(ChannelBegin) && waveexists(ChannelEnd) && (numpnts(ChannelBegin) >= 1) && (numpnts(ChannelEnd) >= 1))
1682 ELow = ChannelBegin[0]
1683 EHigh = ChannelEnd[0]
1685 if (waveexists(SliceBegin) && waveexists(SliceEnd) && (numpnts(SliceBegin) >= 1) && (numpnts(SliceEnd) >= 1))
1686 ALow = SliceBegin[0]
1693 setscale /i x ELow, EHigh, EUnit, data
1696 setscale /i y ELow, EHigh, EUnit, data
1701 setscale /i x ALow, AHigh, AUnit, data
1704 setscale /i y ALow, AHigh, AUnit, data
1708 setscale d 0, 0,
"arb.", data
1710 setdatafolder saveDF
1722 dfref saveDF = GetDataFolderDFR()
1724 dfref dataDF = GetWavesDataFolderDFR(data)
1725 wave /SDFR=dataDF AcquisitionMode, DetectorMode, EnergyMode
1727 wave /SDFR=dataDF /z Scan1Active, Scan2Active
1728 wave /SDFR=dataDF /t /z Scan1Positioner1, Scan1Readback1
1729 wave /SDFR=dataDF /t /z Scan1Positioner2, Scan1Readback2
1730 wave /SDFR=dataDF /t /z Scan2Positioner1, Scan2Readback1
1731 wave /SDFR=dataDF /t /z Scan2Positioner2, Scan2Readback2
1737 strswitch(GetDimLabel(data, 0, -1))
1739 setscale /i x zscale[0], zscale[numpnts(zscale)-1],
"", data
1742 strswitch(GetDimLabel(data, 1, -1))
1744 setscale /i y zscale[0], zscale[numpnts(zscale)-1],
"", data
1747 strswitch(GetDimLabel(data, 2, -1))
1749 setscale /i z zscale[0], zscale[numpnts(zscale)-1],
"", data
1753 setdatafolder saveDF
string adh5_load_preview(string ANickName, string APathName, string AFileName, variable load_data=defaultValue, variable load_attr=defaultValue)
load a single image from a HDF5 file created by the Area Detector software.
string adh5_load_info(string APathName, string AFileName)
load descriptive info from a HDF5 file created by the Area Detector software.
variable ad_load_dialog(string APathName)
load area detector data files selected in a file dialog window
threadsafe wave ad_profile_x_w(wave dataset, variable q1, variable q2, wave destwave, variable noavg=defaultValue)
1D cut through 2D dataset along X dimension, existing destination wave.
static variable read_attribute_info(string datawavename, string source, variable *idest)
sub-function of adh5_loadattr_all.
static dfr GetAttrDataFolderDFR(wave data)
find the attributes data folder of an area detector dataset.
threadsafe variable adh5_setup_profile(wave image, wave profile, variable dim)
set up a one-dimensional wave for a line profile based on a 2D original wave.
static threadsafe variable reduce_slab_image(wave slabdata, wave image, wave profile1, wave profile2, funcref reduction_func, string reduction_param)
variable adh5_scale_scienta(wave data)
set the energy and angle scales of an area detector dataset from the Scienta analyser.
string adh5_test_reduction_func(wave source, wave dest1, wave dest2, funcref reduction_func, string reduction_param)
wrapper function for testing reduction functions from the command line.
variable adh5_loadattr_all(variable fileID, string attributespath)
load an NDAttributes group from an open HDF5 file into the current data folder.
variable adh5_scale_scan(wave data)
scales the extra dimensions of an area detector dataset according to the EPICS scan ...
threadsafe variable adh5_default_reduction(wave source, wave dest1, wave dest2, string *param)
function prototype for adh5_load_reduced_detector
string ad_suggest_foldername(string filename, variable ignoredate=defaultValue, string sourcename=defaultValue, variable unique=defaultValue)
generate the name of a data folder based on a file name.
threadsafe wave ad_profile_y_w(wave dataset, variable p1, variable p2, wave destwave, variable noavg=defaultValue)
1D cut through 2D dataset along X dimension, existing destination wave.
string adh5_load_complete(string ANickName, string APathName, string AFileName, variable load_data=defaultValue, variable load_attr=defaultValue)
import everything from a HDF5 file created by the Area Detector software.
variable adh5_load_reduced_detector(variable fileID, string detectorpath, funcref reduction_func, string reduction_param, variable progress=defaultValue, variable nthreads=defaultValue)
load a reduced detector dataset from the open HDF5 file.
string adh5_load_reduced(string ANickName, string APathName, string AFileName, funcref reduction_func, string reduction_param, variable load_data=defaultValue, variable load_attr=defaultValue, variable progress=defaultValue)
load and reduce a dataset from a HDF5 file created by the Area Detector software. ...
variable adh5_redim(wave data)
redimension a multi-dimensional area detector array loaded from HDF5.
variable adh5_load_detector_slabs(variable fileID, string detectorpath, variable progress=defaultValue)
load the detector dataset from the open HDF5 file.
variable adh5_scale(wave data, string source=defaultValue)
set the dimension scales of an area detector dataset.
variable adh5_load_detector(variable fileID, string detectorpath)
load the detector dataset from the open HDF5 file.
static variable BeforeFileOpenHook(variable refNum, string fileName, string path, string type, string creator, variable kind)
callback function for drag&drop of HDF5 files into Igor.
string adh5_list_reduction_funcs()
get a list of functions which can be used as reduction functions.
variable adh5_load_detector_image(variable fileID, string detectorpath, variable dim2start, variable dim2count, variable dim3start, variable dim3count)
load a single image from the detector dataset of the open HDF5 file
static threadsafe variable reduce_slab_worker(funcref reduction_func)