1 #pragma rtGlobals=3// Use modern global access method and strict wave access. 2 #pragma IgorVersion = 6.36 3 #pragma ModuleName = PearlPShellImport 5 #include <HDF5 Browser> 6 #include "pearl-gui-tools" 7 #include "pearl-area-import" 70 const string kPreviewDatasets =
"ScientaImage;ScientaSpectrum;ImageAngleDistribution;ImageEnergyDistribution;Counts;SampleCurrent;";
73 const string kScientaScalingDatasets =
"LensMode;ScientaChannelBegin;ScientaChannelEnd;ScientaSliceBegin;ScientaSliceEnd;";
99 variable
psh5_open_file(
string ANickName,
string APathName,
string AFileName){
105 newdatafolder /s /o $(
"root:" + ANickName)
106 dfref fileDF = GetDataFolderDFR()
109 HDF5OpenFile /P=$APathName /R fileID as AFileName
112 string /g s_scanpaths
113 s_filepath = s_path + s_filename
159 string psh5_load_complete(
string ANickName,
string APathName,
string AFileName, variable load_data = defaultValue, variable load_attr = defaultValue){
166 if (ParamIsDefault(load_data))
169 if (ParamIsDefault(load_attr))
173 dfref saveDF = GetDataFolderDFR()
177 variable /g psh5_perf_secs
178 timerRefNum = startMSTimer
182 dfref fileDF = GetDataFolderDFR()
185 AFileName = s_filepath
186 print
"loading " + s_filepath +
"\r" 189 variable ng = ItemsInList(s_scanpaths,
";")
193 for (ig = 0; ig < ng; ig += 1)
194 sg = StringFromList(ig, s_scanpaths,
";")
195 folder = ReplaceString(
"/", sg,
"")
196 folder = ReplaceString(
" ", folder,
"")
197 folder = CleanupName(folder, 0)
199 newdatafolder /s /o $folder
208 psh5_perf_secs = stopMSTimer(timerRefNum) / 1e6
245 string psh5_load_preview(
string ANickName,
string APathName,
string AFileName, variable load_data = defaultValue, variable load_attr = defaultValue,
string pref_scans = defaultValue,
string pref_datasets = defaultValue){
254 if (ParamIsDefault(load_data))
257 if (ParamIsDefault(load_attr))
260 if (ParamIsDefault(pref_scans))
261 pref_scans =
"*scan1*;" 263 if (ParamIsDefault(pref_datasets))
267 dfref saveDF = GetDataFolderDFR()
269 newdatafolder /o/s pearl_area
270 newdatafolder /o/s preview
273 string scanpaths =
"" 278 variable /g adh5_perf_secs
279 timerRefNum = startMSTimer
281 HDF5OpenFile /P=$APathName /R /Z fileID as AFileName
283 AFileName = s_path + s_filename
284 dfref fileDF = GetDataFolderDFR()
287 variable ng = ItemsInList(scanpaths)
290 variable np = ItemsInList(pref_scans)
295 for (ip = 0; ip < np; ip += 1)
296 for (ig = 0; ig < ng; ig += 1)
297 sg = StringFromList(ig, scanpaths)
298 sp = StringFromList(ip, pref_scans)
299 if (StringMatch(sg, sp))
311 sg = StringFromList(ig, scanpaths)
315 newdatafolder /o/s attr
323 wave /z data = $dataname
324 string destpath = GetDataFolder(1, saveDF) + ANickName
325 if (waveexists(data))
326 duplicate /o data, $destpath
327 wave /z data = $destpath
329 print
"no data found in file " + AFileName
333 print
"no scans found in file " + AFileName
339 if (timerRefNum >= 0)
340 adh5_perf_secs = stopMSTimer(timerRefNum) / 1e6
369 string psh5_load_scan_complete(variable fileID,
string scanpath, variable load_data = defaultValue, variable load_attr = defaultValue){
375 if (ParamIsDefault(load_data))
378 if (ParamIsDefault(load_attr))
382 dfref saveDF = GetDataFolderDFR()
384 dfref dataDF = GetDataFolderDFR()
389 newdatafolder /s /o attr
396 if (load_data && load_attr)
416 HDF5ListGroup /F /TYPE=1 fileID,
"/" 419 variable ng = ItemsInList(S_HDF5ListGroup,
";")
423 for (ig = 0; ig < ng; ig += 1)
424 sg = StringFromList(ig, S_HDF5ListGroup,
";")
425 if (cmpstr(sg[1,4],
"scan") == 0)
426 scans = AddListItem(sg, scans,
";", inf)
451 variable include_regions
453 if (ParamIsDefault(include_regions))
458 HDF5ListGroup /TYPE=2 /Z fileID, scanpath
459 result = S_HDF5ListGroup
462 HDF5ListGroup /R /TYPE=2 /Z fileID, scanpath
463 variable n = ItemsInList(S_HDF5ListGroup)
466 string region_datasets
467 for (i = 0; i < n; i += 1)
468 ds = StringFromList(i, S_HDF5ListGroup)
469 if (StringMatch(ds,
"region*/*"))
471 result = AddListItem(ds, result,
";", inf)
493 HDF5ListGroup /TYPE=1 /Z fileID, scanpath
494 variable n = ItemsInList(S_HDF5ListGroup)
498 for (i = 0; i < n; i += 1)
499 s = StringFromList(i, S_HDF5ListGroup)
500 if (StringMatch(s,
"region*"))
501 result = AddListItem(s, result,
";", inf)
527 variable nds = ItemsInList(datasets)
531 string wavenames =
"" 532 for (ids = 0; ids < nds; ids += 1)
533 sds = StringFromList(ids, datasets)
535 wavenames = AddListItem(sw, wavenames,
";", inf)
567 if (ParamIsDefault(attr_sets))
571 string attr_path = ReplaceString(
"//", scanpath +
"/attrs",
"/")
572 string attr_list =
"" 574 HDF5ListGroup /TYPE=2 /Z fileID, attr_path
576 attr_list = S_HDF5ListGroup
586 for (ids = 0; ids < nds; ids += 1)
588 if (WhichListItem(sds, attr_list) < 0)
589 attr_list = AddListItem(sds, attr_list,
";", inf)
594 nds = ItemsInList(attr_list,
";")
595 string wavenames =
"" 596 for (ids = 0; ids < nds; ids += 1)
597 sds = StringFromList(ids, attr_list,
";")
598 HDF5LoadData /O /Q /Z fileID, attr_path +
"/" + sds
600 wavenames = AddListItem(s_wavenames, wavenames,
";", inf)
603 wavenames = ReplaceString(
";;", wavenames,
";")
633 string wavenames =
"" 635 HDF5LoadData /O /Q /Z /A=
"Dimensions" /N=ScanDimensions /TYPE=1 fileID, scanpath
637 wavenames = AddListItem(s_wavenames, wavenames,
";", inf)
639 make /n=1 /o ScanDimensions
641 wavenames = AddListItem(
"ScanDimensions", wavenames,
";", inf)
643 HDF5LoadData /O /Q /Z /A=
"Readables" /N=ScanReadables /TYPE=1 fileID, scanpath
645 wavenames = AddListItem(s_wavenames, wavenames,
";", inf)
647 make /n=1 /o /t ScanReadables
648 ScanReadables[0] =
"ScientaSpectrum" 649 wavenames = AddListItem(
"ScanReadables", wavenames,
";", inf)
651 HDF5LoadData /O /Q /Z /A=
"Writables" /N=ScanWritables /TYPE=1 fileID, scanpath
653 wavenames = AddListItem(s_wavenames, wavenames,
";", inf)
655 HDF5LoadData /O /Q /Z /A=
"Steps" /N=ScanSteps /TYPE=1 fileID, scanpath
657 wavenames = AddListItem(s_wavenames, wavenames,
";", inf)
659 wavenames = ReplaceString(
";;", wavenames,
";")
697 string psh5_load_dataset(variable fileID,
string scanpath,
string datasetname, variable set_scale = defaultValue){
703 if (ParamIsDefault(set_scale))
707 dfref base_df = GetDataFolderDFR()
710 datasetpath = scanpath +
"/" + datasetname
711 datasetpath = ReplaceString(
"//", datasetpath,
"/")
715 if (ItemsInList(datasetname,
"/") >= 2)
716 regionname = StringFromList(0, datasetname,
"/")
717 regionpath = ReplaceString(
"//", scanpath +
"/" + regionname,
"/")
718 datasetname = RemoveListItem(0, datasetname,
"/")
719 NewDataFolder /o/s $regionname
722 regionpath = scanpath
725 STRUCT HDF5DataInfo di
727 variable err = HDF5DatasetInfo(fileID, datasetpath, 0, di)
729 print
"error accessing detector/data" 735 HDF5LoadData /O /Q /Z fileID, datasetpath
736 dataname = StringFromList(0, S_waveNames)
741 wave /z data = $dataname
742 if (waveexists(data))
752 setdatafolder base_df
774 variable nds = ItemsInList(file_datasets)
778 variable np = ItemsInList(pref_datasets)
783 for (ip = 0; ip < np; ip += 1)
784 for (ids = 0; ids < nds; ids += 1)
785 sds = StringFromList(ids, file_datasets)
786 index = ItemsInList(sds,
"/") - 1
787 mds = StringFromList(index, sds,
"/")
788 sp = StringFromList(ip, pref_datasets)
789 if (StringMatch(mds, sp))
800 sds = StringFromList(ids, file_datasets)
831 string psh5_load_scan_preview(variable fileID,
string scanpath, variable set_scale = defaultValue,
string pref_datasets = defaultValue){
837 if (ParamIsDefault(set_scale))
840 if (ParamIsDefault(pref_datasets) || (strlen(pref_datasets) == 0))
844 dfref saveDF = GetDataFolderDFR()
845 dfref dataDF = saveDF
850 datasetpath = scanpath +
"/" + datasetname
851 datasetpath = ReplaceString(
"//", datasetpath,
"/")
853 STRUCT HDF5DataInfo di
855 variable err = HDF5DatasetInfo(fileID, datasetpath, 0, di)
857 print
"error accessing detector/data" 863 HDF5LoadData /O /Q /Z fileID, datasetpath
864 dataname = StringFromList(0, S_waveNames)
865 wave /z data = $dataname
866 if (waveexists(data))
870 variable dim2start = 0
871 variable dim2count = 1
872 variable dim3start = 0
873 variable dim3count = 1
875 dim2start = floor(di.dims[2] / 2)
879 dim3start = floor(di.dims[3] / 2)
883 dataname =
psh5_load_dataset_slab(fileID, scanpath, datasetname, dim2start, dim2count, dim3start, dim3count)
886 wave /z data = $dataname
887 if (waveexists(data))
892 string positionerpath
894 wave /t /z ScanWritables
895 if (waveexists(ScanWritables) && (numpnts(ScanWritables) >= 1))
896 positioner = ScanWritables[0]
897 if (strlen(positioner) > 0)
898 positionerpath = scanpath +
"/" + positioner
899 positionerpath = ReplaceString(
"//", positionerpath,
"/")
900 HDF5LoadData /O /Q /Z fileID, positionerpath
905 newdatafolder /o/s attr
945 string psh5_load_scan_section(variable fileID,
string scanpath, variable dim, variable set_scale = defaultValue,
string pref_datasets = defaultValue){
956 if (ParamIsDefault(set_scale))
959 if (ParamIsDefault(pref_datasets) || (strlen(pref_datasets) == 0))
963 dfref saveDF = GetDataFolderDFR()
964 dfref dataDF = saveDF
969 datasetpath = scanpath +
"/" + datasetname
970 datasetpath = ReplaceString(
"//", datasetpath,
"/")
971 string dataname = StringFromList(ItemsInList(datasetpath,
"/") - 1, datasetpath,
"/")
972 string destname = dataname[0,29] + num2str(dim)
974 STRUCT HDF5DataInfo di
976 variable err = HDF5DatasetInfo(fileID, datasetpath, 0, di)
978 print
"error accessing detector/data" 980 else if (di.ndims != 3)
981 print
"error: rank of dataset != 3" 985 variable idx, idy, idz, idt
1002 HDF5MakeHyperslabWave(GetDataFolder(1) +
"slab", max(di.ndims, 4))
1010 slab[idy][%Start] = floor(ny / 2)
1011 slab[idx][%Block] = nx
1012 make /n=(nx,nz) /o $destname
1014 slab[idx][%Start] = floor(nx / 2)
1015 slab[idy][%Block] = ny
1016 make /n=(ny,nz) /o $destname
1018 slab[idz][%Block] = nz
1019 wave data = $destname
1022 HDF5LoadData /O /Q /Z /SLAB=slab /N=slabdata fileID, datasetpath
1026 data += slabdata[0][p][q][0]
1028 data += slabdata[p][0][q][0]
1031 killwaves /z slab, slabdata
1034 make /n=(1,1,1) /free dummy
1036 setdimlabel 0, -1, $GetDimLabel(dummy, dim, -1), data
1037 setdimlabel 1, -1, $kScanDimLabel, data
1039 setdatafolder dataDF
1042 string positionerpath
1044 wave /t /z ScanWritables
1045 if (waveexists(ScanWritables) && (numpnts(ScanWritables) >= 1))
1046 positioner = ScanWritables[0]
1047 if (strlen(positioner) > 0)
1048 positionerpath = scanpath +
"/" + positioner
1049 positionerpath = ReplaceString(
"//", positionerpath,
"/")
1050 HDF5LoadData /O /Q /Z fileID, positionerpath
1054 setdatafolder dataDF
1055 newdatafolder /o/s attr
1058 setdatafolder dataDF
1089 dfref saveDF = GetDataFolderDFR()
1090 SetDataFolder NewFreeDataFolder()
1092 string datasetpath = datapath +
"/" + datasetname
1093 datasetpath = ReplaceString(
"//", datasetpath,
"/")
1096 HDF5LoadData /O /Q /Z /A=
"Writable Dimension" /N=WriteDim fileID, datasetpath
1100 sprintf wnote,
"ScanDimension=%u", WriteDim[0]
1101 Note datawave, wnote
1104 HDF5LoadData /O /Q /Z /A=
"Writable Index" /N=WriteIndex fileID, datasetpath
1107 sprintf wnote,
"WriteableIndex=%u", WriteIndex[0]
1108 Note datawave, wnote
1111 HDF5LoadData /O /Q /Z /A=
"Readable Index" /N=ReadIndex fileID, datasetpath
1114 sprintf wnote,
"ReadableIndex=%u", ReadIndex[0]
1115 Note datawave, wnote
1118 setdatafolder saveDF
1146 if (ParamIsDefault(progress))
1153 datasetpath = datapath +
"/" + datasetname
1154 datasetpath = ReplaceString(
"//", datasetpath,
"/")
1155 datawavename = StringFromList(ItemsInList(datasetpath,
"/") - 1, datasetpath,
"/")
1157 STRUCT HDF5DataInfo di
1158 InitHDF5DataInfo(di)
1159 variable err = HDF5DatasetInfo(fileID, datasetpath, 0, di)
1161 print
"error accessing detector/data" 1165 print
"error: rank of dataset < 2" 1167 else if (di.ndims < 3)
1171 variable idx, idy, idz, idt, izt
1183 variable nx, ny, nz, nt, nzt
1188 make /n=(nx,ny,nz,nt) /o $datawavename
1189 wave data = $datawavename
1200 HDF5MakeHyperslabWave(GetDataFolder(1) +
"slab", max(di.ndims, 4))
1206 slab[idx][%Block] = nx
1207 slab[idy][%Block] = ny
1210 for (iz = 0; iz < nz; iz += 1)
1211 for (it = 0; it < nt; it += 1)
1212 slab[idz][%Start] = iz
1213 slab[idt][%Start] = it
1214 HDF5LoadData /O /Q /Z /SLAB=slab /N=slabdata fileID, datasetpath
1217 data[][][iz][it] = slabdata[q][p][0][0]
1219 data[][][iz][it] = slabdata[p][q][0][0]
1240 killwaves /z slab, slabdata
1276 string psh5_load_dataset_slab(variable fileID,
string datapath,
string datasetname, variable dim2start, variable dim2count, variable dim3start, variable dim3count){
1287 datasetpath = datapath +
"/" + datasetname
1288 datasetpath = ReplaceString(
"//", datasetpath,
"/")
1289 datawavename = StringFromList(ItemsInList(datasetpath,
"/") - 1, datasetpath,
"/")
1291 STRUCT HDF5DataInfo di
1292 InitHDF5DataInfo(di)
1293 variable err = HDF5DatasetInfo(fileID, datasetpath, 0, di)
1295 print
"error accessing detector/data" 1299 print
"error: rank of dataset < 2" 1303 variable idx, idy, idz, idt
1318 make /n=(nx,ny) /o $datawavename
1319 wave data = $datawavename
1322 HDF5MakeHyperslabWave(GetDataFolder(1) +
"slab", max(di.ndims, 4))
1328 slab[idx][%Block] = nx
1329 slab[idy][%Block] = ny
1333 variable dim2end = dim2start + dim2count - 1
1334 variable dim3end = dim3start + dim3count - 1
1335 for (iz = dim2start; iz <= dim2end; iz += 1)
1336 for (it = dim3start; it <= dim3end; it += 1)
1337 slab[idz][%Start] = iz
1338 slab[idt][%Start] = it
1339 HDF5LoadData /O /Q /Z /SLAB=slab /N=slabdata fileID, datasetpath
1343 data += slabdata[q][p][0][0]
1345 data += slabdata[p][q][0][0]
1355 killwaves /z slab, slabdata
1402 case "ScientaImage":
1403 setdimlabel 0, -1, $kEnergyDimLabel, data
1404 setdimlabel 1, -1, $kAngleDimLabel, data
1405 if (WaveDims(data) >= 3)
1406 setdimlabel 2, -1, $kScanDimLabel, data
1410 case "ImageAngleDistribution":
1411 case "ScientaAngleDistribution":
1412 if (WaveDims(data) >= 2)
1413 setdimlabel 0, -1, $kScanDimLabel, data
1414 setdimlabel 1, -1, $kAngleDimLabel, data
1416 setdimlabel 0, -1, $kAngleDimLabel, data
1420 case "ScientaSpectrum":
1421 case "ImageEnergyDistribution":
1422 case "ScientaEnergyDistribution":
1423 if (WaveDims(data) >= 2)
1424 setdimlabel 0, -1, $kScanDimLabel, data
1425 setdimlabel 1, -1, $kEnergyDimLabel, data
1427 setdimlabel 0, -1, $kEnergyDimLabel, data
1432 if (WaveDims(data) == 1)
1433 setdimlabel 0, -1, $kScanDimLabel, data
1440 dummy = GetRTError(1)
1454 dfref attrDF = dataDF:attr
1455 if (!DataFolderRefStatus(attrDF))
1456 string df = GetDataFolder(1, dataDF) +
":" 1459 dfref scanDF = dataDF
1471 dfref attrDF = dataDF:attr
1472 if (!DataFolderRefStatus(attrDF))
1473 string df = GetDataFolder(1, dataDF) +
":" 1475 dfref attrDF = scanDF:attr
1497 dfref scanDF = GetDataFolderDFR()
1500 make /n=3 /free lo, hi
1501 make /n=3 /t /free ax, un
1502 wave /t /z /SDFR=scanDF ScanReadables
1503 if (WaveExists(ScanReadables))
1505 variable nsr = numpnts(ScanReadables)
1508 for (isr = 0; isr < nsr; isr += 1)
1509 setdatafolder scanDF
1510 ssr = ScanReadables[isr]
1511 if (ItemsInList(ssr,
"/") >= 2)
1512 sdf = StringFromList(0, ssr,
"/")
1513 ssr = RemoveListItem(0, ssr,
"/")
1517 if (WaveExists(wsr))
1523 setdatafolder scanDF
1545 dfref saveDF = GetDataFolderDFR()
1546 dfref dataDF = GetWavesDataFolderDFR(data)
1548 setdatafolder dataDF
1549 make /n=3 /free lo, hi
1550 make /n=3 /t /free ax, un
1553 setdatafolder saveDF
1562 wave /SDFR=dataDF /Z w = $name
1564 wave /SDFR=scanDF /Z w = $name
1566 wave /SDFR=attrDF /Z w = $name
1619 dfref dataDF = GetDataFolderDFR()
1623 redimension /n=4 lo, hi, un, ax
1624 setdimlabel 0, 0, $kEnergyDimLabel, lo, hi, un, ax
1625 setdimlabel 0, 1, $kAngleDimLabel, lo, hi, un, ax
1626 setdimlabel 0, 2, $kScanDimLabel, lo, hi, un, ax
1627 setdimlabel 0, 3, $kDataDimLabel, lo, hi, un, ax
1630 lo[%$kEnergyDimLabel] = 0
1631 hi[%$kEnergyDimLabel] = 1
1632 un[%$kEnergyDimLabel] =
"eV" 1633 ax[%$kEnergyDimLabel] =
"Ekin" 1635 lo[%$kAngleDimLabel] = -1
1636 hi[%$kAngleDimLabel] = 1
1637 un[%$kAngleDimLabel] =
"arb." 1638 un[%$kAngleDimLabel] =
"slice" 1640 lo[%$kScanDimLabel] = 0
1641 hi[%$kScanDimLabel] = 1
1642 un[%$kScanDimLabel] =
"arb." 1643 ax[%$kScanDimLabel] =
"scan" 1645 lo[%$kDataDimLabel] = 0
1646 hi[%$kDataDimLabel] = 0
1647 un[%$kDataDimLabel] =
"arb." 1648 ax[%$kDataDimLabel] =
"value" 1650 wave /SDFR=attrDF /T /Z LensMode
1651 wave /Z ChannelBegin =
find_scale_wave(
"ScientaChannelBegin", dataDF, scanDF, attrDF)
1652 wave /Z ChannelEnd =
find_scale_wave(
"ScientaChannelEnd", dataDF, scanDF, attrDF)
1653 wave /Z SliceBegin =
find_scale_wave(
"ScientaSliceBegin", dataDF, scanDF, attrDF)
1654 wave /Z SliceEnd =
find_scale_wave(
"ScientaSliceEnd", dataDF, scanDF, attrDF)
1657 if (waveexists(LensMode) && (numpnts(LensMode) >= 1))
1658 strswitch(LensMode[0])
1660 lo[%$kAngleDimLabel] = -45/2
1661 hi[%$kAngleDimLabel] = +45/2
1662 un[%$kAngleDimLabel] =
"" 1663 ax[%$kAngleDimLabel] =
"angle" 1666 lo[%$kAngleDimLabel] = -60/2
1667 hi[%$kAngleDimLabel] = +60/2
1668 un[%$kAngleDimLabel] =
"" 1669 ax[%$kAngleDimLabel] =
"angle" 1671 case "Transmission":
1672 un[%$kAngleDimLabel] =
"arb." 1673 ax[%$kAngleDimLabel] =
"offset" 1679 if (waveexists(ChannelBegin) && waveexists(ChannelEnd) && (numpnts(ChannelBegin) >= 1) && (numpnts(ChannelEnd) >= 1))
1680 lo[%$kEnergyDimLabel] = ChannelBegin[0]
1681 hi[%$kEnergyDimLabel] = ChannelEnd[0]
1683 if (waveexists(SliceBegin) && waveexists(SliceEnd) && (numpnts(SliceBegin) >= 1) && (numpnts(SliceEnd) >= 1))
1684 lo[%$kAngleDimLabel] = SliceBegin[0]
1685 hi[%$kAngleDimLabel] = SliceEnd[0]
1688 wave /z /t /SDFR=scanDF ScanWritables
1689 if (WaveExists(ScanWritables))
1690 wave /z /SDFR=scanDF scanner = $ScanWritables[0]
1691 if (!WaveExists(scanner))
1692 wave /z /SDFR=attrDF scanner = $ScanWritables[0]
1694 if (WaveExists(scanner) && (numpnts(scanner) >= 1))
1695 lo[%$kScanDimLabel] = scanner[0]
1696 hi[%$kScanDimLabel] = scanner[numpnts(scanner)-1]
1697 ax[%$kScanDimLabel] = NameOfWave(scanner)
1698 strswitch(NameOfWave(scanner))
1700 ax[%$kScanDimLabel] =
"photon energy" 1701 un[%$kScanDimLabel] =
"eV" 1703 case "ManipulatorX":
1704 case "ManipulatorY":
1705 case "ManipulatorZ":
1708 case "RefocusYTrans":
1709 case "RefocusZTrans":
1711 un[%$kScanDimLabel] =
"mm" 1714 un[%$kScanDimLabel] =
"m" 1716 case "ManipulatorTheta":
1717 case "ManipulatorTilt":
1718 case "ManipulatorPhi":
1719 un[%$kScanDimLabel] =
"" 1727 un[%$kScanDimLabel] =
"mrad" 1775 sdim = GetDimLabel(data, 0, -1)
1777 setscale /i x lo[%$sdim], hi[%$sdim], un[%$sdim], data
1778 Note data,
"AxisLabelX=" + ax[%$sdim]
1781 sdim = GetDimLabel(data, 1, -1)
1783 setscale /i y lo[%$sdim], hi[%$sdim], un[%$sdim], data
1784 Note data,
"AxisLabelY=" + ax[%$sdim]
1787 sdim = GetDimLabel(data, 2, -1)
1789 setscale /i z lo[%$sdim], hi[%$sdim], un[%$sdim], data
1790 Note data,
"AxisLabelZ=" + ax[%$sdim]
1793 string data_unit = un[%$kDataDimLabel]
1794 string data_label = ax[%$kDataDimLabel]
1795 if (cmpstr(data_unit,
"arb.") == 0)
1796 strswitch(NameOfWave(data))
1797 case "SampleCurrent":
1801 data_label =
"current" 1803 case "MachineCurrent":
1805 data_label =
"current" 1809 setscale d 0, 0, data_unit, data
1810 Note data,
"AxisLabelD=" + data_label
1811 Note data,
"Dataset=" + NameOfWave(data)
1853 string psh5_load_reduced(
string ANickName,
string APathName,
string AFileName, funcref reduction_func,
string reduction_param, variable progress = defaultValue){
1858 string reduction_param
1861 if (ParamIsDefault(progress))
1865 dfref saveDF = GetDataFolderDFR()
1868 variable timerRefNum
1869 variable /g psh5_perf_secs
1870 timerRefNum = startMSTimer
1872 variable fileID =
psh5_open_file(ANickName, APathName, AFileName)
1873 string wavenames =
"" 1875 dfref fileDF = GetDataFolderDFR()
1878 AFileName = s_filepath
1879 print
"loading " + s_filepath +
"\r" 1882 variable ng = ItemsInList(s_scanpaths)
1887 string positionerpath
1889 scanpath = StringFromList(ig, s_scanpaths)
1890 folder = ReplaceString(
"/", scanpath,
"")
1891 folder = ReplaceString(
" ", folder,
"")
1892 folder = CleanupName(folder, 0)
1893 setdatafolder fileDF
1894 newdatafolder /s /o $folder
1895 dfref dataDF = GetDataFolderDFR()
1897 newdatafolder /s /o attr
1900 setdatafolder dataDF
1901 wave /t /z ScanWritables
1902 if (waveexists(ScanWritables) && (numpnts(ScanWritables) >= 1))
1903 positioner = ScanWritables[0]
1904 if (strlen(positioner) > 0)
1905 positionerpath = scanpath +
"/" + positioner
1906 positionerpath = ReplaceString(
"//", positionerpath,
"/")
1907 HDF5LoadData /O /Q /Z fileID, positionerpath
1911 setdatafolder dataDF
1919 if (timerRefNum >= 0)
1920 psh5_perf_secs = stopMSTimer(timerRefNum) / 1e6
1923 setdatafolder saveDF
1976 string psh5_load_dataset_reduced(variable fileID,
string scanpath,
string datasetname, funcref reduction_func,
string reduction_param, variable progress = defaultValue, variable nthreads = defaultValue){
1981 string reduction_param
1985 if (ParamIsDefault(progress))
1988 if (ParamIsDefault(nthreads))
1992 dfref base_df = GetDataFolderDFR()
1996 string wavenames =
"" 1998 datasetpath = scanpath +
"/" + datasetname
1999 datasetpath = ReplaceString(
"//", datasetpath,
"/")
2000 datawavename = StringFromList(ItemsInList(datasetpath,
"/") - 1, datasetpath,
"/")
2004 if (ItemsInList(datasetname,
"/") >= 2)
2005 regionname = StringFromList(0, datasetname,
"/")
2006 regionpath = ReplaceString(
"//", scanpath +
"/" + regionname,
"/")
2007 datasetname = RemoveListItem(0, datasetname,
"/")
2008 NewDataFolder /o/s $regionname
2011 regionpath = scanpath
2014 STRUCT HDF5DataInfo di
2015 InitHDF5DataInfo(di)
2016 variable err = HDF5DatasetInfo(fileID, datasetpath, 0, di)
2018 print
"error accessing detector/data" 2023 print
"error: rank of dataset < 2" 2026 else if (di.ndims < 3)
2030 variable idx, idy, idz, idt
2042 variable nx, ny, nz, nt, nzt
2053 HDF5MakeHyperslabWave(GetDataFolder(1) +
"slab", max(di.ndims, 4))
2059 slab[idx][%Block] = nx
2060 slab[idy][%Block] = ny
2064 nthreads = ThreadProcessorCount
2067 variable threadGroupID = ThreadGroupCreate(nthreads)
2069 for (ithread = 0; ithread < nthreads; ithread += 1)
2073 make /n=(nzt) /df /free processing_folders
2080 make /n=(nx,ny) /d /o image_template
2081 setdimlabel 0, -1, $kEnergyDimLabel, image_template
2082 setdimlabel 1, -1, $kAngleDimLabel, image_template
2085 variable iz, it, izt
2088 for (iz = 0; iz < nz; iz += 1)
2089 for (it = 0; it < nt; it += 1)
2091 slab[idz][%Start] = iz
2092 slab[idt][%Start] = it
2093 dfname =
"processing_" + num2str(izt)
2094 newdatafolder /s $dfname
2095 HDF5LoadData /O /Q /Z /SLAB=slab /N=slabdata fileID, datasetpath
2098 duplicate image_template, image
2099 variable /g r_index = iz
2100 variable /g s_index = it
2101 string /g func_param = reduction_param
2105 ThreadGroupPutDF threadGroupID, :
2107 processing_folders[izt] = GetDataFolderDFR()
2108 make /n=1/d profile1, profile2
2110 variable /g func_result
2111 func_result =
reduce_slab_image(slabdata, image, profile1, profile2, reduction_func, func_param)
2112 WaveClear slabdata, image, profile1, profile2
2128 killwaves /z slab, slabdata, image_template
2134 for (izt = 0; (izt < nzt) && (result == 0); izt += 1)
2137 dfr = ThreadGroupGetDFR(threadGroupID, 1000)
2138 if (DatafolderRefStatus(dfr) != 0)
2150 dfr = processing_folders[izt]
2164 nvar rr = dfr:r_index
2165 nvar ss = dfr:s_index
2166 nvar func_result = dfr:func_result
2167 wave profile1 = dfr:profile1
2168 wave profile2 = dfr:profile2
2170 if (func_result == 0)
2172 make /n=(dimsize(profile1, 0), nz, nt) /d /o ReducedData1
2173 make /n=(dimsize(profile2, 0), nz, nt) /d /o ReducedData2
2174 setdimlabel 0, -1, $getdimlabel(profile1, 0, -1), ReducedData1
2175 setdimlabel 0, -1, $getdimlabel(profile2, 0, -1), ReducedData2
2176 setdimlabel 1, -1, $kScanDimLabel, ReducedData1
2177 setdimlabel 1, -1, $kScanDimLabel, ReducedData2
2178 setscale /p x dimoffset(profile1, 0), dimdelta(profile1, 0), waveunits(profile1, 0), ReducedData1
2179 setscale /p x dimoffset(profile2, 0), dimdelta(profile2, 0), waveunits(profile2, 0), ReducedData2
2180 setscale d 0, 0, waveunits(profile1, -1), ReducedData1
2181 setscale d 0, 0, waveunits(profile2, -1), ReducedData2
2183 ReducedData1[][rr][ss] = profile1[p]
2184 ReducedData2[][rr][ss] = profile2[p]
2186 print
"error during data reduction." 2193 variable tstatus = ThreadGroupRelease(threadGroupID)
2195 print
"error: thread did not terminate properly." 2199 for (izt = 0; izt < nzt; izt += 1)
2200 KillDataFolder /Z processing_folders[izt]
2206 redimension /n=(-1, 0, 0) ReducedData1
2207 redimension /n=(-1, 0, 0) ReducedData2
2209 redimension /n=(-1, nz, 0) ReducedData1
2210 redimension /n=(-1, nz, 0) ReducedData2
2212 wavenames =
"ReducedData1;ReducedData2;" 2220 setdatafolder base_df
2229 dfref dfr = ThreadGroupGetDFR(0, 1000)
2230 if (DataFolderRefStatus(dfr) == 0)
2240 wave slabdata = dfr:slabdata
2241 wave image = dfr:image
2242 svar func_param = dfr:func_param
2243 nvar rr = dfr:r_index
2244 nvar ss = dfr:s_index
2247 newdatafolder /s outDF
2248 make /n=1/d profile1, profile2
2249 variable /g r_index = rr
2250 variable /g s_index = ss
2251 variable /g func_result
2252 func_result =
reduce_slab_image(slabdata, image, profile1, profile2, reduction_func, func_param)
2255 WaveClear slabdata, image, profile1, profile2
2256 ThreadGroupPutDF 0, :
2263 threadsafe
static variable
reduce_slab_image(wave slabdata, wave image, wave profile1, wave profile2, funcref reduction_func,
string reduction_param){
2269 string reduction_param
2271 image = slabdata[q][p][0][0]
2273 return reduction_func(image, profile1, profile2, reduction_param)
2294 dfref saveDF = GetDataFolderDFR()
2295 dfref fileDF = NewFreeDataFolder()
2296 setdatafolder fileDF
2306 HDF5OpenFile /P=$APathName /R fileID as AFileName
2308 filepath = s_path + s_filename
2310 nscans = ItemsInList(scanpaths)
2311 for (iscan = 0; iscan < nscans; iscan += 1)
2312 scanpath = StringFromList(iscan, scanpaths)
2313 info = info + scanpath +
"\r" 2316 HDF5CloseFile fileID
2319 setdatafolder saveDF
2341 string positions =
"" 2342 string positioners =
"" 2343 string detectors =
"" 2346 wave /z ScanDimensions
2347 wave /t /z ScanWritables
2348 wave /t /z ScanReadables
2351 if (WaveExists(ScanSteps) && (numpnts(ScanSteps) >= 1))
2353 positions =
"positions = (" +
wave2list(ScanSteps,
"%u",
",") +
")" 2354 info = AddListItem(positions, info,
"\r", inf)
2356 if (WaveExists(ScanWritables) && (numpnts(ScanWritables) >= 1))
2357 positioners =
"positioners = " +
twave2list(ScanWritables,
",")
2358 info = AddListItem(positioners, info,
"\r", inf)
2360 if (WaveExists(ScanReadables) && (numpnts(ScanReadables) >= 1))
2361 detectors =
"detectors = " +
twave2list(ScanReadables,
",")
2362 info = AddListItem(detectors, info,
"\r", inf)
2376 variable n = numpnts(wt)
2378 for (i = 0; i < n; i += 1)
2379 list = AddListItem(wt[i], list, sep, inf)
2394 variable n = numpnts(w)
2397 for (i = 0; i < n; i += 1)
2398 sprintf s, format, w[i]
2399 list = AddListItem(s, list, sep, inf)
string psh5_list_scan_regions(variable fileID, string scanpath)
list regions of a PShell scan group.
const string kEnergyDimLabel
Dimension label for the energy dispersive dimension of multi-dimensional datasets.
string psh5_load_reduced(string ANickName, string APathName, string AFileName, funcref reduction_func, string reduction_param, variable progress=defaultValue)
load and reduce the ScientaImage dataset of the first scan of a PShell data file. ...
string psh5_load_dataset_reduced(variable fileID, string scanpath, string datasetname, funcref reduction_func, string reduction_param, variable progress=defaultValue, variable nthreads=defaultValue)
load a reduced dataset from the open PShell HDF5 file.
string psh5_load_scan_preview(variable fileID, string scanpath, variable set_scale=defaultValue, string pref_datasets=defaultValue)
load a preview dataset from an open PShell HDF5 file.
string psh5_load_scan_attrs(variable fileID, string scanpath, variable attr_sets=defaultValue)
load attributes of a PShell scan group.
const string kTransposedDatasets
List of datasets that should be transposed upon loading.
string psh5_load_scan_complete(variable fileID, string scanpath, variable load_data=defaultValue, variable load_attr=defaultValue)
load all data of a selected scan from a PShell data file.
static threadsafe variable reduce_slab_worker(funcref reduction_func)
variable ps_set_dimlabels2(wave data, string name)
set dimension labels according to the axis type
const string kScanDimLabel
Dimension label for the scan dimension of multi-dimensional datasets.
string psh5_load_dataset(variable fileID, string scanpath, string datasetname, variable set_scale=defaultValue)
load a dataset from an open PShell HDF5 file.
variable ps_set_dimlabels(wave data)
set dimension labels according to the axis type
string psh5_load_preview(string ANickName, string APathName, string AFileName, variable load_data=defaultValue, variable load_attr=defaultValue, string pref_scans=defaultValue, string pref_datasets=defaultValue)
load a preview image from a PShell data file.
static dfr find_scan_folder(dfref dataDF)
find the scan folder
const string kAngleDimLabel
Dimension label for the angle dispersive dimension of multi-dimensional datasets. ...
static string twave2list(wave wt, string sep)
convert text wave to list.
variable ps_scale_dataset_2(wave data, wave ax, wave lo, wave hi, wave un)
set the dimension scales of a dataset.
static string wave2list(wave w, string format, string sep)
convert numeric wave to list.
static threadsafe variable reduce_slab_image(wave slabdata, wave image, wave profile1, wave profile2, funcref reduction_func, string reduction_param)
static string select_dataset(string file_datasets, string pref_datasets)
select the preferred dataset from a list of available datasets.
const string kDataDimLabel
Dimension label for the data dimension.
variable psh5_open_file(string ANickName, string APathName, string AFileName)
open a HDF5 file created by the PShell data acquisition program and prepare the data folder...
string psh5_load_dataset_slabs(variable fileID, string datapath, string datasetname, variable progress=defaultValue)
load a dataset slab-wise from the open PShell HDF5 file.
variable ps_scale_datasets()
set the dimension scales of loaded PShell Scienta datasets according to attributes.
string psh5_load_scan_meta(variable fileID, string scanpath)
load metadata of a PShell scan group.
threadsafe variable adh5_default_reduction(wave source, wave dest1, wave dest2, string *param)
function prototype for adh5_load_reduced_detector
const string kScientaScalingDatasets
List of datasets that must be loaded to determine the axis scaling of a Scienta image.
string psh5_load_scan_section(variable fileID, string scanpath, variable dim, variable set_scale=defaultValue, string pref_datasets=defaultValue)
load a longitudinal section of a scan from an open PShell HDF5 file.
string psh5_list_scan_datasets(variable fileID, string scanpath, variable include_regions=defaultValue)
list datasets of a PShell scan group.
string psh5_load_info(string APathName, string AFileName)
load descriptive info from a PShell data file.
string psh5_load_dataset_slab(variable fileID, string datapath, string datasetname, variable dim2start, variable dim2count, variable dim3start, variable dim3count)
load a single image from the open PShell data file.
string psh5_load_scan_data(variable fileID, string scanpath)
load all datasets of a PShell scan group.
string psh5_load_complete(string ANickName, string APathName, string AFileName, variable load_data=defaultValue, variable load_attr=defaultValue)
load everything from a PShell data file.
static dfr find_attr_folder(dfref dataDF)
find the attributes data folder
static wave find_scale_wave(string name, dfref dataDF, dfref scanDF, dfref attrDF)
string psh5_list_scans(variable fileID)
list scan groups of a PShell data file.
variable psh5_close_file(variable fileID)
close a HDF5 file opened by psh5_open_file.
variable ps_detect_scale(wave ax, wave lo, wave hi, wave un)
detect the dimension scales from attributes.
variable psh5_load_dataset_meta(variable fileID, string datapath, string datasetname, wave datawave)
load metadata of a PShell dataset.
const string kPreviewDatasets
List of preferred datasets to load for preview.
variable ps_scale_dataset(wave data)
set the dimension scales of a loaded PShell Scienta dataset according to attributes.
string psh5_load_scan_info(variable fileID, string scanpath)
load descriptive info from a PShell scan.