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;";
108 newdatafolder /s /o $(
"root:" + ANickName)
109 dfref fileDF = GetDataFolderDFR()
112 HDF5OpenFile /P=$APathName /R fileID as AFileName
115 string /g s_scanpaths
116 s_filepath = s_path + s_filename
162 string psh5_load_complete(
string ANickName,
string APathName,
string AFileName, variable load_data = defaultValue, variable load_attr = defaultValue){
169 if (ParamIsDefault(load_data))
172 if (ParamIsDefault(load_attr))
176 dfref saveDF = GetDataFolderDFR()
180 variable /g psh5_perf_secs
181 timerRefNum = startMSTimer
185 dfref fileDF = GetDataFolderDFR()
188 AFileName = s_filepath
189 print
"loading " + s_filepath +
"\r" 192 variable ng = ItemsInList(s_scanpaths,
";")
196 for (ig = 0; ig < ng; ig += 1)
197 sg = StringFromList(ig, s_scanpaths,
";")
198 folder = ReplaceString(
"/", sg,
"")
199 folder = ReplaceString(
" ", folder,
"")
200 folder = CleanupName(folder, 0)
202 newdatafolder /s /o $folder
211 psh5_perf_secs = stopMSTimer(timerRefNum) / 1e6
243 string psh5_load_preview(
string APathName,
string AFileName, variable load_data = defaultValue, variable load_attr = defaultValue,
string pref_scans = defaultValue,
string pref_datasets = defaultValue){
251 if (ParamIsDefault(load_data))
254 if (ParamIsDefault(load_attr))
257 if (ParamIsDefault(pref_scans))
258 pref_scans =
"*scan1*;" 260 if (ParamIsDefault(pref_datasets))
264 dfref saveDF = GetDataFolderDFR()
267 string scanpaths =
"" 272 variable /g adh5_perf_secs
273 timerRefNum = startMSTimer
275 HDF5OpenFile /P=$APathName /R /Z fileID as AFileName
277 AFileName = s_path + s_filename
278 dfref fileDF = GetDataFolderDFR()
281 variable ng = ItemsInList(scanpaths)
284 variable np = ItemsInList(pref_scans)
289 for (ip = 0; ip < np; ip += 1)
290 for (ig = 0; ig < ng; ig += 1)
291 sg = StringFromList(ig, scanpaths)
292 sp = StringFromList(ip, pref_scans)
293 if (StringMatch(sg, sp))
305 sg = StringFromList(ig, scanpaths)
309 newdatafolder /o/s attr
317 print
"no scans found in file " + AFileName
323 if (timerRefNum >= 0)
324 adh5_perf_secs = stopMSTimer(timerRefNum) / 1e6
353 string psh5_load_scan_complete(variable fileID,
string scanpath, variable load_data = defaultValue, variable load_attr = defaultValue){
359 if (ParamIsDefault(load_data))
362 if (ParamIsDefault(load_attr))
366 dfref saveDF = GetDataFolderDFR()
368 dfref dataDF = GetDataFolderDFR()
373 newdatafolder /s /o attr
380 if (load_data && load_attr)
400 HDF5ListGroup /F /TYPE=1 fileID,
"/" 403 variable ng = ItemsInList(S_HDF5ListGroup,
";")
407 for (ig = 0; ig < ng; ig += 1)
408 sg = StringFromList(ig, S_HDF5ListGroup,
";")
409 if (cmpstr(sg[1,4],
"scan") == 0)
410 scans = AddListItem(sg, scans,
";", inf)
435 variable include_regions
437 if (ParamIsDefault(include_regions))
442 HDF5ListGroup /TYPE=2 /Z fileID, scanpath
443 result = S_HDF5ListGroup
446 HDF5ListGroup /R /TYPE=2 /Z fileID, scanpath
447 variable n = ItemsInList(S_HDF5ListGroup)
450 string region_datasets
451 for (i = 0; i < n; i += 1)
452 ds = StringFromList(i, S_HDF5ListGroup)
453 if (StringMatch(ds,
"region*/*"))
455 result = AddListItem(ds, result,
";", inf)
477 HDF5ListGroup /TYPE=1 /Z fileID, scanpath
478 variable n = ItemsInList(S_HDF5ListGroup)
482 for (i = 0; i < n; i += 1)
483 s = StringFromList(i, S_HDF5ListGroup)
484 if (StringMatch(s,
"region*"))
485 result = AddListItem(s, result,
";", inf)
511 variable nds = ItemsInList(datasets)
515 string wavenames =
"" 516 for (ids = 0; ids < nds; ids += 1)
517 sds = StringFromList(ids, datasets)
519 wavenames = AddListItem(sw, wavenames,
";", inf)
551 if (ParamIsDefault(attr_sets))
555 string attr_path = ReplaceString(
"//", scanpath +
"/attrs",
"/")
556 string attr_list =
"" 558 HDF5ListGroup /TYPE=2 /Z fileID, attr_path
560 attr_list = S_HDF5ListGroup
570 for (ids = 0; ids < nds; ids += 1)
572 if (WhichListItem(sds, attr_list) < 0)
573 attr_list = AddListItem(sds, attr_list,
";", inf)
578 nds = ItemsInList(attr_list,
";")
579 string wavenames =
"" 580 for (ids = 0; ids < nds; ids += 1)
581 sds = StringFromList(ids, attr_list,
";")
582 HDF5LoadData /O /Q /Z fileID, attr_path +
"/" + sds
584 wavenames = AddListItem(s_wavenames, wavenames,
";", inf)
587 wavenames = ReplaceString(
";;", wavenames,
";")
617 string wavenames =
"" 619 HDF5LoadData /O /Q /Z /A=
"Dimensions" /N=ScanDimensions /TYPE=1 fileID, scanpath
621 wavenames = AddListItem(s_wavenames, wavenames,
";", inf)
623 make /n=1 /o ScanDimensions
625 wavenames = AddListItem(
"ScanDimensions", wavenames,
";", inf)
627 HDF5LoadData /O /Q /Z /A=
"Readables" /N=ScanReadables /TYPE=1 fileID, scanpath
629 wavenames = AddListItem(s_wavenames, wavenames,
";", inf)
631 make /n=1 /o /t ScanReadables
632 ScanReadables[0] =
"ScientaSpectrum" 633 wavenames = AddListItem(
"ScanReadables", wavenames,
";", inf)
635 HDF5LoadData /O /Q /Z /A=
"Writables" /N=ScanWritables /TYPE=1 fileID, scanpath
637 wavenames = AddListItem(s_wavenames, wavenames,
";", inf)
639 HDF5LoadData /O /Q /Z /A=
"Steps" /N=ScanSteps /TYPE=1 fileID, scanpath
641 wavenames = AddListItem(s_wavenames, wavenames,
";", inf)
643 wavenames = ReplaceString(
";;", wavenames,
";")
681 string psh5_load_dataset(variable fileID,
string scanpath,
string datasetname, variable set_scale = defaultValue){
687 if (ParamIsDefault(set_scale))
691 dfref base_df = GetDataFolderDFR()
694 datasetpath = scanpath +
"/" + datasetname
695 datasetpath = ReplaceString(
"//", datasetpath,
"/")
699 if (ItemsInList(datasetname,
"/") >= 2)
700 regionname = StringFromList(0, datasetname,
"/")
701 regionpath = ReplaceString(
"//", scanpath +
"/" + regionname,
"/")
702 datasetname = RemoveListItem(0, datasetname,
"/")
703 NewDataFolder /o/s $regionname
706 regionpath = scanpath
709 STRUCT HDF5DataInfo di
711 variable err = HDF5DatasetInfo(fileID, datasetpath, 0, di)
713 print
"error accessing detector/data" 719 HDF5LoadData /O /Q /Z fileID, datasetpath
720 dataname = StringFromList(0, S_waveNames)
725 wave /z data = $dataname
726 if (waveexists(data))
736 setdatafolder base_df
758 variable nds = ItemsInList(file_datasets)
762 variable np = ItemsInList(pref_datasets)
767 for (ip = 0; ip < np; ip += 1)
768 for (ids = 0; ids < nds; ids += 1)
769 sds = StringFromList(ids, file_datasets)
770 index = ItemsInList(sds,
"/") - 1
771 mds = StringFromList(index, sds,
"/")
772 sp = StringFromList(ip, pref_datasets)
773 if (StringMatch(mds, sp))
784 sds = StringFromList(ids, file_datasets)
815 string psh5_load_scan_preview(variable fileID,
string scanpath, variable set_scale = defaultValue,
string pref_datasets = defaultValue){
821 if (ParamIsDefault(set_scale))
824 if (ParamIsDefault(pref_datasets) || (strlen(pref_datasets) == 0))
828 dfref saveDF = GetDataFolderDFR()
829 dfref dataDF = saveDF
834 datasetpath = scanpath +
"/" + datasetname
835 datasetpath = ReplaceString(
"//", datasetpath,
"/")
837 STRUCT HDF5DataInfo di
839 variable err = HDF5DatasetInfo(fileID, datasetpath, 0, di)
841 print
"error accessing detector/data" 847 HDF5LoadData /O /Q /Z fileID, datasetpath
848 dataname = StringFromList(0, S_waveNames)
849 wave /z data = $dataname
850 if (waveexists(data))
854 variable dim2start = 0
855 variable dim2count = 1
856 variable dim3start = 0
857 variable dim3count = 1
859 dim2start = floor(di.dims[2] / 2)
863 dim3start = floor(di.dims[3] / 2)
867 dataname =
psh5_load_dataset_slab(fileID, scanpath, datasetname, dim2start, dim2count, dim3start, dim3count)
870 wave /z data = $dataname
871 if (waveexists(data))
876 string positionerpath
878 wave /t /z ScanWritables
879 if (waveexists(ScanWritables) && (numpnts(ScanWritables) >= 1))
880 positioner = ScanWritables[0]
881 if (strlen(positioner) > 0)
882 positionerpath = scanpath +
"/" + positioner
883 positionerpath = ReplaceString(
"//", positionerpath,
"/")
884 HDF5LoadData /O /Q /Z fileID, positionerpath
889 newdatafolder /o/s attr
928 string psh5_load_scan_section(variable fileID,
string scanpath, variable dim, variable set_scale = defaultValue,
string pref_datasets = defaultValue){
939 if (ParamIsDefault(set_scale))
942 if (ParamIsDefault(pref_datasets) || (strlen(pref_datasets) == 0))
946 dfref saveDF = GetDataFolderDFR()
947 dfref dataDF = saveDF
952 datasetpath = scanpath +
"/" + datasetname
953 datasetpath = ReplaceString(
"//", datasetpath,
"/")
954 string dataname = StringFromList(ItemsInList(datasetpath,
"/") - 1, datasetpath,
"/")
955 string destname = dataname[0,29] + num2str(dim)
957 STRUCT HDF5DataInfo di
959 variable err = HDF5DatasetInfo(fileID, datasetpath, 0, di)
961 print
"error accessing detector/data" 963 else if (di.ndims != 3)
964 print
"error: rank of dataset != 3" 968 variable idx, idy, idz, idt
985 HDF5MakeHyperslabWave(
"slab", max(di.ndims, 4))
993 slab[idy][%Start] = floor(ny / 2)
994 slab[idx][%Block] = nx
995 make /n=(nx,nz) /o $destname
997 slab[idx][%Start] = floor(nx / 2)
998 slab[idy][%Block] = ny
999 make /n=(ny,nz) /o $destname
1001 slab[idz][%Block] = nz
1002 wave data = $destname
1005 HDF5LoadData /O /Q /Z /SLAB=slab /N=slabdata fileID, datasetpath
1009 data += slabdata[0][p][q][0]
1011 data += slabdata[p][0][q][0]
1014 killwaves /z slab, slabdata
1017 make /n=(1,1,1) /free dummy
1019 setdimlabel 0, -1, $GetDimLabel(dummy, dim, -1), data
1020 setdimlabel 1, -1, $kScanDimLabel, data
1022 setdatafolder dataDF
1025 string positionerpath
1027 wave /t /z ScanWritables
1028 if (waveexists(ScanWritables) && (numpnts(ScanWritables) >= 1))
1029 positioner = ScanWritables[0]
1030 if (strlen(positioner) > 0)
1031 positionerpath = scanpath +
"/" + positioner
1032 positionerpath = ReplaceString(
"//", positionerpath,
"/")
1033 HDF5LoadData /O /Q /Z fileID, positionerpath
1037 setdatafolder dataDF
1038 newdatafolder /o/s attr
1041 setdatafolder dataDF
1072 dfref saveDF = GetDataFolderDFR()
1073 SetDataFolder NewFreeDataFolder()
1075 string datasetpath = datapath +
"/" + datasetname
1076 datasetpath = ReplaceString(
"//", datasetpath,
"/")
1079 HDF5LoadData /O /Q /Z /A=
"Writable Dimension" /N=WriteDim fileID, datasetpath
1083 sprintf wnote,
"ScanDimension=%u", WriteDim[0]
1084 Note datawave, wnote
1087 HDF5LoadData /O /Q /Z /A=
"Writable Index" /N=WriteIndex fileID, datasetpath
1090 sprintf wnote,
"WriteableIndex=%u", WriteIndex[0]
1091 Note datawave, wnote
1094 HDF5LoadData /O /Q /Z /A=
"Readable Index" /N=ReadIndex fileID, datasetpath
1097 sprintf wnote,
"ReadableIndex=%u", ReadIndex[0]
1098 Note datawave, wnote
1101 setdatafolder saveDF
1129 if (ParamIsDefault(progress))
1136 datasetpath = datapath +
"/" + datasetname
1137 datasetpath = ReplaceString(
"//", datasetpath,
"/")
1138 datawavename = StringFromList(ItemsInList(datasetpath,
"/") - 1, datasetpath,
"/")
1140 STRUCT HDF5DataInfo di
1141 InitHDF5DataInfo(di)
1142 variable err = HDF5DatasetInfo(fileID, datasetpath, 0, di)
1144 print
"error accessing detector/data" 1148 print
"error: rank of dataset < 2" 1150 else if (di.ndims < 3)
1154 variable idx, idy, idz, idt, izt
1166 variable nx, ny, nz, nt, nzt
1171 make /n=(nx,ny,nz,nt) /o $datawavename
1172 wave data = $datawavename
1183 HDF5MakeHyperslabWave(
"slab", max(di.ndims, 4))
1189 slab[idx][%Block] = nx
1190 slab[idy][%Block] = ny
1193 for (iz = 0; iz < nz; iz += 1)
1194 for (it = 0; it < nt; it += 1)
1195 slab[idz][%Start] = iz
1196 slab[idt][%Start] = it
1197 HDF5LoadData /O /Q /Z /SLAB=slab /N=slabdata fileID, datasetpath
1200 data[][][iz][it] = slabdata[q][p][0][0]
1202 data[][][iz][it] = slabdata[p][q][0][0]
1223 killwaves /z slab, slabdata
1259 string psh5_load_dataset_slab(variable fileID,
string datapath,
string datasetname, variable dim2start, variable dim2count, variable dim3start, variable dim3count){
1270 datasetpath = datapath +
"/" + datasetname
1271 datasetpath = ReplaceString(
"//", datasetpath,
"/")
1272 datawavename = StringFromList(ItemsInList(datasetpath,
"/") - 1, datasetpath,
"/")
1274 STRUCT HDF5DataInfo di
1275 InitHDF5DataInfo(di)
1276 variable err = HDF5DatasetInfo(fileID, datasetpath, 0, di)
1278 print
"error accessing detector/data" 1282 print
"error: rank of dataset < 2" 1286 variable idx, idy, idz, idt
1301 make /n=(nx,ny) /o $datawavename
1302 wave data = $datawavename
1305 HDF5MakeHyperslabWave(
"slab", max(di.ndims, 4))
1311 slab[idx][%Block] = nx
1312 slab[idy][%Block] = ny
1316 variable dim2end = dim2start + dim2count - 1
1317 variable dim3end = dim3start + dim3count - 1
1318 for (iz = dim2start; iz <= dim2end; iz += 1)
1319 for (it = dim3start; it <= dim3end; it += 1)
1320 slab[idz][%Start] = iz
1321 slab[idt][%Start] = it
1322 HDF5LoadData /O /Q /Z /SLAB=slab /N=slabdata fileID, datasetpath
1326 data += slabdata[q][p][0][0]
1328 data += slabdata[p][q][0][0]
1338 killwaves /z slab, slabdata
1385 case "ScientaImage":
1386 setdimlabel 0, -1, $kEnergyDimLabel, data
1387 setdimlabel 1, -1, $kAngleDimLabel, data
1388 if (WaveDims(data) >= 3)
1389 setdimlabel 2, -1, $kScanDimLabel, data
1393 case "ImageAngleDistribution":
1394 case "ScientaAngleDistribution":
1395 if (WaveDims(data) >= 2)
1396 setdimlabel 0, -1, $kScanDimLabel, data
1397 setdimlabel 1, -1, $kAngleDimLabel, data
1399 setdimlabel 0, -1, $kAngleDimLabel, data
1403 case "ScientaSpectrum":
1404 case "ImageEnergyDistribution":
1405 case "ScientaEnergyDistribution":
1406 if (WaveDims(data) >= 2)
1407 setdimlabel 0, -1, $kScanDimLabel, data
1408 setdimlabel 1, -1, $kEnergyDimLabel, data
1410 setdimlabel 0, -1, $kEnergyDimLabel, data
1415 if (WaveDims(data) == 1)
1416 setdimlabel 0, -1, $kScanDimLabel, data
1423 dummy = GetRTError(1)
1437 dfref attrDF = dataDF:attr
1438 if (!DataFolderRefStatus(attrDF))
1439 string df = GetDataFolder(1, dataDF) +
":" 1442 dfref scanDF = dataDF
1454 dfref attrDF = dataDF:attr
1455 if (!DataFolderRefStatus(attrDF))
1456 string df = GetDataFolder(1, dataDF) +
":" 1458 dfref attrDF = scanDF:attr
1480 dfref scanDF = GetDataFolderDFR()
1483 make /n=3 /free lo, hi
1484 make /n=3 /t /free ax, un
1485 wave /t /z /SDFR=scanDF ScanReadables
1486 if (WaveExists(ScanReadables))
1488 variable nsr = numpnts(ScanReadables)
1491 for (isr = 0; isr < nsr; isr += 1)
1492 setdatafolder scanDF
1493 ssr = ScanReadables[isr]
1494 if (ItemsInList(ssr,
"/") >= 2)
1495 sdf = StringFromList(0, ssr,
"/")
1496 ssr = RemoveListItem(0, ssr,
"/")
1500 if (WaveExists(wsr))
1506 setdatafolder scanDF
1528 dfref saveDF = GetDataFolderDFR()
1529 dfref dataDF = GetWavesDataFolderDFR(data)
1531 setdatafolder dataDF
1532 make /n=3 /free lo, hi
1533 make /n=3 /t /free ax, un
1536 setdatafolder saveDF
1545 wave /SDFR=dataDF /Z w = $name
1547 wave /SDFR=scanDF /Z w = $name
1549 wave /SDFR=attrDF /Z w = $name
1602 dfref dataDF = GetDataFolderDFR()
1606 redimension /n=4 lo, hi, un, ax
1607 setdimlabel 0, 0, $kEnergyDimLabel, lo, hi, un, ax
1608 setdimlabel 0, 1, $kAngleDimLabel, lo, hi, un, ax
1609 setdimlabel 0, 2, $kScanDimLabel, lo, hi, un, ax
1610 setdimlabel 0, 3, $kDataDimLabel, lo, hi, un, ax
1613 lo[%$kEnergyDimLabel] = 0
1614 hi[%$kEnergyDimLabel] = 1
1615 un[%$kEnergyDimLabel] =
"eV" 1616 ax[%$kEnergyDimLabel] =
"Ekin" 1618 lo[%$kAngleDimLabel] = -1
1619 hi[%$kAngleDimLabel] = 1
1620 un[%$kAngleDimLabel] =
"arb." 1621 un[%$kAngleDimLabel] =
"slice" 1623 lo[%$kScanDimLabel] = 0
1624 hi[%$kScanDimLabel] = 1
1625 un[%$kScanDimLabel] =
"arb." 1626 ax[%$kScanDimLabel] =
"scan" 1628 lo[%$kDataDimLabel] = 0
1629 hi[%$kDataDimLabel] = 0
1630 un[%$kDataDimLabel] =
"arb." 1631 ax[%$kDataDimLabel] =
"value" 1633 wave /SDFR=attrDF /T /Z LensMode
1634 wave /Z ChannelBegin =
find_scale_wave(
"ScientaChannelBegin", dataDF, scanDF, attrDF)
1635 wave /Z ChannelEnd =
find_scale_wave(
"ScientaChannelEnd", dataDF, scanDF, attrDF)
1636 wave /Z SliceBegin =
find_scale_wave(
"ScientaSliceBegin", dataDF, scanDF, attrDF)
1637 wave /Z SliceEnd =
find_scale_wave(
"ScientaSliceEnd", dataDF, scanDF, attrDF)
1640 if (waveexists(LensMode) && (numpnts(LensMode) >= 1))
1641 strswitch(LensMode[0])
1643 lo[%$kAngleDimLabel] = -45/2
1644 hi[%$kAngleDimLabel] = +45/2
1645 un[%$kAngleDimLabel] =
"" 1646 ax[%$kAngleDimLabel] =
"angle" 1649 lo[%$kAngleDimLabel] = -60/2
1650 hi[%$kAngleDimLabel] = +60/2
1651 un[%$kAngleDimLabel] =
"" 1652 ax[%$kAngleDimLabel] =
"angle" 1654 case "Transmission":
1655 un[%$kAngleDimLabel] =
"arb." 1656 ax[%$kAngleDimLabel] =
"offset" 1662 if (waveexists(ChannelBegin) && waveexists(ChannelEnd) && (numpnts(ChannelBegin) >= 1) && (numpnts(ChannelEnd) >= 1))
1663 lo[%$kEnergyDimLabel] = ChannelBegin[0]
1664 hi[%$kEnergyDimLabel] = ChannelEnd[0]
1666 if (waveexists(SliceBegin) && waveexists(SliceEnd) && (numpnts(SliceBegin) >= 1) && (numpnts(SliceEnd) >= 1))
1667 lo[%$kAngleDimLabel] = SliceBegin[0]
1668 hi[%$kAngleDimLabel] = SliceEnd[0]
1671 wave /z /t /SDFR=scanDF ScanWritables
1672 if (WaveExists(ScanWritables))
1673 wave /z /SDFR=scanDF scanner = $ScanWritables[0]
1674 if (!WaveExists(scanner))
1675 wave /z /SDFR=attrDF scanner = $ScanWritables[0]
1677 if (WaveExists(scanner) && (numpnts(scanner) >= 1))
1678 lo[%$kScanDimLabel] = scanner[0]
1679 hi[%$kScanDimLabel] = scanner[numpnts(scanner)-1]
1680 ax[%$kScanDimLabel] = NameOfWave(scanner)
1681 strswitch(NameOfWave(scanner))
1683 ax[%$kScanDimLabel] =
"photon energy" 1684 un[%$kScanDimLabel] =
"eV" 1686 case "ManipulatorX":
1687 case "ManipulatorY":
1688 case "ManipulatorZ":
1691 case "RefocusYTrans":
1692 case "RefocusZTrans":
1694 un[%$kScanDimLabel] =
"mm" 1697 un[%$kScanDimLabel] =
"m" 1699 case "ManipulatorTheta":
1700 case "ManipulatorTilt":
1701 case "ManipulatorPhi":
1702 un[%$kScanDimLabel] =
"" 1710 un[%$kScanDimLabel] =
"mrad" 1758 sdim = GetDimLabel(data, 0, -1)
1760 setscale /i x lo[%$sdim], hi[%$sdim], un[%$sdim], data
1761 Note data,
"AxisLabelX=" + ax[%$sdim]
1764 sdim = GetDimLabel(data, 1, -1)
1766 setscale /i y lo[%$sdim], hi[%$sdim], un[%$sdim], data
1767 Note data,
"AxisLabelY=" + ax[%$sdim]
1770 sdim = GetDimLabel(data, 2, -1)
1772 setscale /i z lo[%$sdim], hi[%$sdim], un[%$sdim], data
1773 Note data,
"AxisLabelZ=" + ax[%$sdim]
1776 string data_unit = un[%$kDataDimLabel]
1777 string data_label = ax[%$kDataDimLabel]
1778 if (cmpstr(data_unit,
"arb.") == 0)
1779 strswitch(NameOfWave(data))
1780 case "ScientaImage":
1781 case "ImageAngleDistribution":
1782 case "ScientaAngleDistribution":
1783 case "ScientaSpectrum":
1784 case "ImageEnergyDistribution":
1785 case "ScientaEnergyDistribution":
1787 data_unit =
"counts" 1788 data_label =
"intensity" 1790 case "SampleCurrent":
1794 data_label =
"current" 1796 case "MachineCurrent":
1798 data_label =
"current" 1802 setscale d 0, 0, data_unit, data
1803 Note data,
"AxisLabelD=" + data_label
1804 Note data,
"Dataset=" + NameOfWave(data)
1846 string psh5_load_reduced(
string ANickName,
string APathName,
string AFileName, funcref reduction_func,
string reduction_param, variable progress = defaultValue){
1851 string reduction_param
1854 if (ParamIsDefault(progress))
1858 dfref saveDF = GetDataFolderDFR()
1861 variable timerRefNum
1862 variable /g psh5_perf_secs
1863 timerRefNum = startMSTimer
1865 variable fileID =
psh5_open_file(ANickName, APathName, AFileName)
1866 string wavenames =
"" 1868 dfref fileDF = GetDataFolderDFR()
1871 AFileName = s_filepath
1872 print
"loading " + s_filepath +
"\r" 1875 variable ng = ItemsInList(s_scanpaths)
1880 string positionerpath
1882 scanpath = StringFromList(ig, s_scanpaths)
1883 folder = ReplaceString(
"/", scanpath,
"")
1884 folder = ReplaceString(
" ", folder,
"")
1885 folder = CleanupName(folder, 0)
1886 setdatafolder fileDF
1887 newdatafolder /s /o $folder
1888 dfref dataDF = GetDataFolderDFR()
1890 newdatafolder /s /o attr
1893 setdatafolder dataDF
1894 wave /t /z ScanWritables
1895 if (waveexists(ScanWritables) && (numpnts(ScanWritables) >= 1))
1896 positioner = ScanWritables[0]
1897 if (strlen(positioner) > 0)
1898 positionerpath = scanpath +
"/" + positioner
1899 positionerpath = ReplaceString(
"//", positionerpath,
"/")
1900 HDF5LoadData /O /Q /Z fileID, positionerpath
1904 setdatafolder dataDF
1912 if (timerRefNum >= 0)
1913 psh5_perf_secs = stopMSTimer(timerRefNum) / 1e6
1916 setdatafolder saveDF
1970 string psh5_load_dataset_reduced(variable fileID,
string scanpath,
string datasetname, funcref reduction_func,
string reduction_param, variable progress = defaultValue, variable nthreads = defaultValue){
1975 string reduction_param
1979 if (ParamIsDefault(progress))
1982 if (ParamIsDefault(nthreads))
1986 dfref base_df = GetDataFolderDFR()
1990 string wavenames =
"" 1992 datasetpath = scanpath +
"/" + datasetname
1993 datasetpath = ReplaceString(
"//", datasetpath,
"/")
1994 datawavename = StringFromList(ItemsInList(datasetpath,
"/") - 1, datasetpath,
"/")
1998 if (ItemsInList(datasetname,
"/") >= 2)
1999 regionname = StringFromList(0, datasetname,
"/")
2000 regionpath = ReplaceString(
"//", scanpath +
"/" + regionname,
"/")
2001 datasetname = RemoveListItem(0, datasetname,
"/")
2002 NewDataFolder /o/s $regionname
2005 regionpath = scanpath
2008 STRUCT HDF5DataInfo di
2009 InitHDF5DataInfo(di)
2010 variable err = HDF5DatasetInfo(fileID, datasetpath, 0, di)
2012 print
"error accessing detector/data" 2017 print
"error: rank of dataset < 2" 2020 else if (di.ndims < 3)
2024 variable idx, idy, idz, idt
2036 variable nx, ny, nz, nt, nzt
2047 HDF5MakeHyperslabWave(
"slab", max(di.ndims, 4))
2053 slab[idx][%Block] = nx
2054 slab[idy][%Block] = ny
2058 nthreads = ThreadProcessorCount
2061 variable threadGroupID = ThreadGroupCreate(nthreads)
2063 for (ithread = 0; ithread < nthreads; ithread += 1)
2067 make /n=(nzt) /df /free processing_folders
2075 make /n=(nx,ny) /d /o $datawavename
2076 wave
template = $datawavename
2080 variable iz, it, izt
2083 for (iz = 0; iz < nz; iz += 1)
2084 for (it = 0; it < nt; it += 1)
2086 slab[idz][%Start] = iz
2087 slab[idt][%Start] = it
2088 dfname =
"processing_" + num2str(izt)
2089 newdatafolder /s $dfname
2090 HDF5LoadData /O /Q /Z /SLAB=slab /N=slabdata fileID, datasetpath
2093 duplicate
template, image
2094 variable /g r_index = iz
2095 variable /g s_index = it
2096 string /g func_param = reduction_param
2100 ThreadGroupPutDF threadGroupID, :
2102 processing_folders[izt] = GetDataFolderDFR()
2103 make /n=1/d profile1, profile2
2105 variable /g func_result
2106 func_result =
reduce_slab_image(slabdata, image, profile1, profile2, reduction_func, func_param)
2107 WaveClear slabdata, image, profile1, profile2
2123 killwaves /z slab, slabdata,
template 2129 for (izt = 0; (izt < nzt) && (result == 0); izt += 1)
2139 dfr = ThreadGroupGetDFR(threadGroupID, 1000)
2140 if (DatafolderRefStatus(dfr) != 0)
2152 dfr = processing_folders[izt]
2159 nvar rr = dfr:r_index
2160 nvar ss = dfr:s_index
2161 nvar func_result = dfr:func_result
2162 wave profile1 = dfr:profile1
2163 wave profile2 = dfr:profile2
2165 if (func_result == 0)
2167 make /n=(dimsize(profile1, 0), nz, nt) /d /o ReducedData1
2168 make /n=(dimsize(profile2, 0), nz, nt) /d /o ReducedData2
2169 setdimlabel 0, -1, $getdimlabel(profile1, 0, -1), ReducedData1
2170 setdimlabel 0, -1, $getdimlabel(profile2, 0, -1), ReducedData2
2171 setdimlabel 1, -1, $kScanDimLabel, ReducedData1
2172 setdimlabel 1, -1, $kScanDimLabel, ReducedData2
2175 setscale /p x dimoffset(profile1, 0), dimdelta(profile1, 0), waveunits(profile1, 0), ReducedData1
2176 setscale /p x dimoffset(profile2, 0), dimdelta(profile2, 0), waveunits(profile2, 0), ReducedData2
2177 setscale d 0, 0, waveunits(profile1, -1), ReducedData1
2178 setscale d 0, 0, waveunits(profile2, -1), ReducedData2
2180 ReducedData1[][rr][ss] = profile1[p]
2181 ReducedData2[][rr][ss] = profile2[p]
2183 print
"error during data reduction." 2190 variable tstatus = ThreadGroupRelease(threadGroupID)
2192 print
"error: thread did not terminate properly." 2196 for (izt = 0; izt < nzt; izt += 1)
2197 KillDataFolder /Z processing_folders[izt]
2203 redimension /n=(-1, 0, 0) ReducedData1
2204 redimension /n=(-1, 0, 0) ReducedData2
2206 redimension /n=(-1, nz, 0) ReducedData1
2207 redimension /n=(-1, nz, 0) ReducedData2
2209 wavenames =
"ReducedData1;ReducedData2;" 2215 setdatafolder base_df
2224 dfref dfr = ThreadGroupGetDFR(0, 1000)
2225 if (DataFolderRefStatus(dfr) == 0)
2235 wave slabdata = dfr:slabdata
2236 wave image = dfr:image
2237 svar func_param = dfr:func_param
2238 nvar rr = dfr:r_index
2239 nvar ss = dfr:s_index
2242 newdatafolder /s outDF
2243 make /n=1/d profile1, profile2
2244 variable /g r_index = rr
2245 variable /g s_index = ss
2246 variable /g func_result
2247 func_result =
reduce_slab_image(slabdata, image, profile1, profile2, reduction_func, func_param)
2250 WaveClear slabdata, image, profile1, profile2
2251 ThreadGroupPutDF 0, :
2258 threadsafe
static variable
reduce_slab_image(wave slabdata, wave image, wave profile1, wave profile2, funcref reduction_func,
string reduction_param){
2264 string reduction_param
2269 return reduction_func(image, profile1, profile2, reduction_param)
2290 dfref saveDF = GetDataFolderDFR()
2291 dfref fileDF = NewFreeDataFolder()
2292 setdatafolder fileDF
2302 HDF5OpenFile /P=$APathName /R fileID as AFileName
2304 filepath = s_path + s_filename
2306 nscans = ItemsInList(scanpaths)
2307 for (iscan = 0; iscan < nscans; iscan += 1)
2308 scanpath = StringFromList(iscan, scanpaths)
2309 info = info + scanpath +
"\r" 2312 HDF5CloseFile fileID
2315 setdatafolder saveDF
2338 string positions =
"" 2339 string positioners =
"" 2340 string readables =
"" 2341 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)
2363 if (WaveExists(ScanReadables) && (numpnts(ScanReadables) >= 1))
2365 n = ItemsInList(readables,
",")
2366 for (i = 0; i < n; i += 1)
2367 s = StringFromList(i, readables,
",")
2368 m = ItemsInList(s,
"/")
2370 s = StringFromList(m - 1, s,
"/")
2372 if (WhichListItem(s, detectors,
",") < 0)
2373 detectors = AddListItem(s, detectors,
",", inf)
2376 detectors =
"detectors = " + detectors
2377 info = AddListItem(detectors, info,
"\r", inf)
2381 if (strlen(regions) > 0)
2382 regions =
"regions = " + regions
2383 info = AddListItem(regions, info,
"\r", inf)
2397 variable n = numpnts(wt)
2399 for (i = 0; i < n; i += 1)
2400 list = AddListItem(wt[i], list, sep, inf)
2415 variable n = numpnts(w)
2418 for (i = 0; i < n; i += 1)
2419 sprintf s, format, w[i]
2420 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
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.
string psh5_load_preview(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.
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.
const variable kDetectorSensitivity
multiply scienta detector intensity by this value to get actual counts.
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.