1 #pragma rtGlobals=3// Use modern global access method and strict wave access. 2 #pragma IgorVersion = 6.36 3 #pragma ModuleName = PearlPShellImport 4 #include <HDF5 Browser> 5 #include "pearl-gui-tools" 6 #include "pearl-area-import" 77 const string kPreviewDatasets =
"ScientaImage;ScientaSpectrum;ImageAngleDistribution;ImageEnergyDistribution;Counts;SampleCurrent;";
80 const string kScientaScalingDatasets =
"LensMode;ScientaChannelBegin;ScientaChannelEnd;ScientaSliceBegin;ScientaSliceEnd;";
115 newdatafolder /s /o $(
"root:" + ANickName)
116 dfref fileDF = GetDataFolderDFR()
119 HDF5OpenFile /P=$APathName /R fileID as AFileName
122 string /g s_scanpaths
123 s_filepath = s_path + s_filename
169 string psh5_load_complete(
string ANickName,
string APathName,
string AFileName, variable load_data = defaultValue, variable load_attr = defaultValue){
176 if (ParamIsDefault(load_data))
179 if (ParamIsDefault(load_attr))
183 dfref saveDF = GetDataFolderDFR()
187 variable /g psh5_perf_secs
188 timerRefNum = startMSTimer
192 dfref fileDF = GetDataFolderDFR()
195 AFileName = s_filepath
196 print
"loading " + s_filepath +
"\r" 199 variable ng = ItemsInList(s_scanpaths,
";")
203 for (ig = 0; ig < ng; ig += 1)
204 sg = StringFromList(ig, s_scanpaths,
";")
205 folder = ReplaceString(
"/", sg,
"")
206 folder = ReplaceString(
" ", folder,
"")
207 folder = CleanupName(folder, 0)
209 newdatafolder /s /o $folder
218 psh5_perf_secs = stopMSTimer(timerRefNum) / 1e6
250 string psh5_load_preview(
string APathName,
string AFileName, variable load_data = defaultValue, variable load_attr = defaultValue,
string pref_scans = defaultValue,
string pref_datasets = defaultValue){
258 if (ParamIsDefault(load_data))
261 if (ParamIsDefault(load_attr))
264 if (ParamIsDefault(pref_scans))
265 pref_scans =
"*scan1*;" 267 if (ParamIsDefault(pref_datasets))
271 dfref saveDF = GetDataFolderDFR()
274 string scanpaths =
"" 279 variable /g adh5_perf_secs
280 timerRefNum = startMSTimer
282 HDF5OpenFile /P=$APathName /R /Z fileID as AFileName
284 AFileName = s_path + s_filename
285 dfref fileDF = GetDataFolderDFR()
288 variable ng = ItemsInList(scanpaths)
291 variable np = ItemsInList(pref_scans)
296 for (ip = 0; ip < np; ip += 1)
297 for (ig = 0; ig < ng; ig += 1)
298 sg = StringFromList(ig, scanpaths)
299 sp = StringFromList(ip, pref_scans)
300 if (StringMatch(sg, sp))
312 sg = StringFromList(ig, scanpaths)
316 newdatafolder /o/s attr
324 print
"no scans found in file " + AFileName
330 if (timerRefNum >= 0)
331 adh5_perf_secs = stopMSTimer(timerRefNum) / 1e6
360 string psh5_load_scan_complete(variable fileID,
string scanpath, variable load_data = defaultValue, variable load_attr = defaultValue){
366 if (ParamIsDefault(load_data))
369 if (ParamIsDefault(load_attr))
373 dfref saveDF = GetDataFolderDFR()
375 dfref dataDF = GetDataFolderDFR()
380 newdatafolder /s /o attr
387 if (load_data && load_attr)
407 HDF5ListGroup /F /TYPE=1 fileID,
"/" 410 variable ng = ItemsInList(S_HDF5ListGroup,
";")
414 for (ig = 0; ig < ng; ig += 1)
415 sg = StringFromList(ig, S_HDF5ListGroup,
";")
416 if (cmpstr(sg[1,4],
"scan") == 0)
417 scans = AddListItem(sg, scans,
";", inf)
442 variable include_regions
444 if (ParamIsDefault(include_regions))
449 HDF5ListGroup /TYPE=2 /Z fileID, scanpath
450 result = S_HDF5ListGroup
453 HDF5ListGroup /R /TYPE=2 /Z fileID, scanpath
454 variable n = ItemsInList(S_HDF5ListGroup)
457 string region_datasets
458 for (i = 0; i < n; i += 1)
459 ds = StringFromList(i, S_HDF5ListGroup)
460 if (StringMatch(ds,
"region*/*"))
462 result = AddListItem(ds, result,
";", inf)
484 HDF5ListGroup /TYPE=1 /Z fileID, scanpath
485 variable n = ItemsInList(S_HDF5ListGroup)
489 for (i = 0; i < n; i += 1)
490 s = StringFromList(i, S_HDF5ListGroup)
491 if (StringMatch(s,
"region*"))
492 result = AddListItem(s, result,
";", inf)
518 variable nds = ItemsInList(datasets)
522 string wavenames =
"" 523 for (ids = 0; ids < nds; ids += 1)
524 sds = StringFromList(ids, datasets)
526 wavenames = AddListItem(sw, wavenames,
";", inf)
558 if (ParamIsDefault(attr_sets))
562 string attr_path = ReplaceString(
"//", scanpath +
"/attrs",
"/")
563 string attr_list =
"" 565 HDF5ListGroup /TYPE=2 /Z fileID, attr_path
567 attr_list = S_HDF5ListGroup
577 for (ids = 0; ids < nds; ids += 1)
579 if (WhichListItem(sds, attr_list) < 0)
580 attr_list = AddListItem(sds, attr_list,
";", inf)
585 nds = ItemsInList(attr_list,
";")
586 string wavenames =
"" 587 for (ids = 0; ids < nds; ids += 1)
588 sds = StringFromList(ids, attr_list,
";")
589 HDF5LoadData /O /Q /Z fileID, attr_path +
"/" + sds
591 wavenames = AddListItem(s_wavenames, wavenames,
";", inf)
594 wavenames = ReplaceString(
";;", wavenames,
";")
624 string wavenames =
"" 626 HDF5LoadData /O /Q /Z /A=
"Dimensions" /N=ScanDimensions /TYPE=1 fileID, scanpath
628 wavenames = AddListItem(s_wavenames, wavenames,
";", inf)
630 make /n=1 /o ScanDimensions
632 wavenames = AddListItem(
"ScanDimensions", wavenames,
";", inf)
634 HDF5LoadData /O /Q /Z /A=
"Readables" /N=ScanReadables /TYPE=1 fileID, scanpath
636 wavenames = AddListItem(s_wavenames, wavenames,
";", inf)
638 make /n=1 /o /t ScanReadables
639 ScanReadables[0] =
"ScientaSpectrum" 640 wavenames = AddListItem(
"ScanReadables", wavenames,
";", inf)
642 HDF5LoadData /O /Q /Z /A=
"Writables" /N=ScanWritables /TYPE=1 fileID, scanpath
644 wavenames = AddListItem(s_wavenames, wavenames,
";", inf)
646 HDF5LoadData /O /Q /Z /A=
"Steps" /N=ScanSteps /TYPE=1 fileID, scanpath
648 wavenames = AddListItem(s_wavenames, wavenames,
";", inf)
650 wavenames = ReplaceString(
";;", wavenames,
";")
688 string psh5_load_dataset(variable fileID,
string scanpath,
string datasetname, variable set_scale = defaultValue){
694 if (ParamIsDefault(set_scale))
698 dfref base_df = GetDataFolderDFR()
701 datasetpath = scanpath +
"/" + datasetname
702 datasetpath = ReplaceString(
"//", datasetpath,
"/")
706 if (ItemsInList(datasetname,
"/") >= 2)
707 regionname = StringFromList(0, datasetname,
"/")
708 regionpath = ReplaceString(
"//", scanpath +
"/" + regionname,
"/")
709 datasetname = RemoveListItem(0, datasetname,
"/")
710 NewDataFolder /o/s $regionname
713 regionpath = scanpath
716 STRUCT HDF5DataInfo di
718 variable err = HDF5DatasetInfo(fileID, datasetpath, 0, di)
720 print
"error accessing detector/data" 726 HDF5LoadData /O /Q /Z fileID, datasetpath
727 dataname = StringFromList(0, S_waveNames)
732 wave /z data = $dataname
733 if (waveexists(data))
743 setdatafolder base_df
765 variable nds = ItemsInList(file_datasets)
769 variable np = ItemsInList(pref_datasets)
774 for (ip = 0; ip < np; ip += 1)
775 for (ids = 0; ids < nds; ids += 1)
776 sds = StringFromList(ids, file_datasets)
777 index = ItemsInList(sds,
"/") - 1
778 mds = StringFromList(index, sds,
"/")
779 sp = StringFromList(ip, pref_datasets)
780 if (StringMatch(mds, sp))
791 sds = StringFromList(ids, file_datasets)
822 string psh5_load_scan_preview(variable fileID,
string scanpath, variable set_scale = defaultValue,
string pref_datasets = defaultValue){
828 if (ParamIsDefault(set_scale))
831 if (ParamIsDefault(pref_datasets) || (strlen(pref_datasets) == 0))
835 dfref saveDF = GetDataFolderDFR()
836 dfref dataDF = saveDF
841 datasetpath = scanpath +
"/" + datasetname
842 datasetpath = ReplaceString(
"//", datasetpath,
"/")
844 STRUCT HDF5DataInfo di
846 variable err = HDF5DatasetInfo(fileID, datasetpath, 0, di)
848 print
"error accessing detector/data" 854 HDF5LoadData /O /Q /Z fileID, datasetpath
855 dataname = StringFromList(0, S_waveNames)
856 wave /z data = $dataname
857 if (waveexists(data))
861 variable dim2start = 0
862 variable dim2count = 1
863 variable dim3start = 0
864 variable dim3count = 1
866 dim2start = floor(di.dims[2] / 2)
870 dim3start = floor(di.dims[3] / 2)
874 dataname =
psh5_load_dataset_slab(fileID, scanpath, datasetname, dim2start, dim2count, dim3start, dim3count)
877 wave /z data = $dataname
878 if (waveexists(data))
883 string positionerpath
885 wave /t /z ScanWritables
886 if (waveexists(ScanWritables) && (numpnts(ScanWritables) >= 1))
887 positioner = ScanWritables[0]
888 if (strlen(positioner) > 0)
889 positionerpath = scanpath +
"/" + positioner
890 positionerpath = ReplaceString(
"//", positionerpath,
"/")
891 HDF5LoadData /O /Q /Z fileID, positionerpath
896 newdatafolder /o/s attr
935 string psh5_load_scan_section(variable fileID,
string scanpath, variable dim, variable set_scale = defaultValue,
string pref_datasets = defaultValue){
946 if (ParamIsDefault(set_scale))
949 if (ParamIsDefault(pref_datasets) || (strlen(pref_datasets) == 0))
953 dfref saveDF = GetDataFolderDFR()
954 dfref dataDF = saveDF
959 datasetpath = scanpath +
"/" + datasetname
960 datasetpath = ReplaceString(
"//", datasetpath,
"/")
961 string dataname = StringFromList(ItemsInList(datasetpath,
"/") - 1, datasetpath,
"/")
962 string destname = dataname[0,29] + num2str(dim)
964 STRUCT HDF5DataInfo di
966 variable err = HDF5DatasetInfo(fileID, datasetpath, 0, di)
968 print
"error accessing detector/data" 970 else if (di.ndims != 3)
971 print
"error: rank of dataset != 3" 975 variable idx, idy, idz, idt
992 HDF5MakeHyperslabWave(
"slab", max(di.ndims, 4))
1000 slab[idy][%Start] = floor(ny / 2)
1001 slab[idx][%Block] = nx
1002 make /n=(nx,nz) /o $destname
1004 slab[idx][%Start] = floor(nx / 2)
1005 slab[idy][%Block] = ny
1006 make /n=(ny,nz) /o $destname
1008 slab[idz][%Block] = nz
1009 wave data = $destname
1012 HDF5LoadData /O /Q /Z /SLAB=slab /N=slabdata fileID, datasetpath
1016 data += slabdata[0][p][q][0]
1018 data += slabdata[p][0][q][0]
1021 killwaves /z slab, slabdata
1024 make /n=(1,1,1) /free dummy
1026 setdimlabel 0, -1, $GetDimLabel(dummy, dim, -1), data
1027 setdimlabel 1, -1, $kScanDimLabel, data
1029 setdatafolder dataDF
1032 string positionerpath
1034 wave /t /z ScanWritables
1035 if (waveexists(ScanWritables) && (numpnts(ScanWritables) >= 1))
1036 positioner = ScanWritables[0]
1037 if (strlen(positioner) > 0)
1038 positionerpath = scanpath +
"/" + positioner
1039 positionerpath = ReplaceString(
"//", positionerpath,
"/")
1040 HDF5LoadData /O /Q /Z fileID, positionerpath
1044 setdatafolder dataDF
1045 newdatafolder /o/s attr
1048 setdatafolder dataDF
1079 dfref saveDF = GetDataFolderDFR()
1080 SetDataFolder NewFreeDataFolder()
1082 string datasetpath = datapath +
"/" + datasetname
1083 datasetpath = ReplaceString(
"//", datasetpath,
"/")
1086 HDF5LoadData /O /Q /Z /A=
"Writable Dimension" /N=WriteDim fileID, datasetpath
1090 sprintf wnote,
"ScanDimension=%u", WriteDim[0]
1091 Note datawave, wnote
1094 HDF5LoadData /O /Q /Z /A=
"Writable Index" /N=WriteIndex fileID, datasetpath
1097 sprintf wnote,
"WriteableIndex=%u", WriteIndex[0]
1098 Note datawave, wnote
1101 HDF5LoadData /O /Q /Z /A=
"Readable Index" /N=ReadIndex fileID, datasetpath
1104 sprintf wnote,
"ReadableIndex=%u", ReadIndex[0]
1105 Note datawave, wnote
1108 setdatafolder saveDF
1136 if (ParamIsDefault(progress))
1143 datasetpath = datapath +
"/" + datasetname
1144 datasetpath = ReplaceString(
"//", datasetpath,
"/")
1145 datawavename = StringFromList(ItemsInList(datasetpath,
"/") - 1, datasetpath,
"/")
1147 STRUCT HDF5DataInfo di
1148 InitHDF5DataInfo(di)
1149 variable err = HDF5DatasetInfo(fileID, datasetpath, 0, di)
1151 print
"error accessing detector/data" 1155 print
"error: rank of dataset < 2" 1157 else if (di.ndims < 3)
1161 variable idx, idy, idz, idt, izt
1173 variable nx, ny, nz, nt, nzt
1178 make /n=(nx,ny,nz,nt) /o $datawavename
1179 wave data = $datawavename
1190 HDF5MakeHyperslabWave(
"slab", max(di.ndims, 4))
1196 slab[idx][%Block] = nx
1197 slab[idy][%Block] = ny
1200 for (iz = 0; iz < nz; iz += 1)
1201 for (it = 0; it < nt; it += 1)
1202 slab[idz][%Start] = iz
1203 slab[idt][%Start] = it
1204 HDF5LoadData /O /Q /Z /SLAB=slab /N=slabdata fileID, datasetpath
1207 data[][][iz][it] = slabdata[q][p][0][0]
1209 data[][][iz][it] = slabdata[p][q][0][0]
1230 killwaves /z slab, slabdata
1266 string psh5_load_dataset_slab(variable fileID,
string datapath,
string datasetname, variable dim2start, variable dim2count, variable dim3start, variable dim3count){
1277 datasetpath = datapath +
"/" + datasetname
1278 datasetpath = ReplaceString(
"//", datasetpath,
"/")
1279 datawavename = StringFromList(ItemsInList(datasetpath,
"/") - 1, datasetpath,
"/")
1281 STRUCT HDF5DataInfo di
1282 InitHDF5DataInfo(di)
1283 variable err = HDF5DatasetInfo(fileID, datasetpath, 0, di)
1285 print
"error accessing detector/data" 1289 print
"error: rank of dataset < 2" 1293 variable idx, idy, idz, idt
1308 make /n=(nx,ny) /o $datawavename
1309 wave data = $datawavename
1312 HDF5MakeHyperslabWave(
"slab", max(di.ndims, 4))
1318 slab[idx][%Block] = nx
1319 slab[idy][%Block] = ny
1323 variable dim2end = dim2start + dim2count - 1
1324 variable dim3end = dim3start + dim3count - 1
1325 for (iz = dim2start; iz <= dim2end; iz += 1)
1326 for (it = dim3start; it <= dim3end; it += 1)
1327 slab[idz][%Start] = iz
1328 slab[idt][%Start] = it
1329 HDF5LoadData /O /Q /Z /SLAB=slab /N=slabdata fileID, datasetpath
1333 data += slabdata[q][p][0][0]
1335 data += slabdata[p][q][0][0]
1345 killwaves /z slab, slabdata
1392 case "ScientaImage":
1393 setdimlabel 0, -1, $kEnergyDimLabel, data
1394 setdimlabel 1, -1, $kAngleDimLabel, data
1395 if (WaveDims(data) >= 3)
1396 setdimlabel 2, -1, $kScanDimLabel, data
1400 case "ImageAngleDistribution":
1401 case "ScientaAngleDistribution":
1402 if (WaveDims(data) >= 2)
1403 setdimlabel 0, -1, $kScanDimLabel, data
1404 setdimlabel 1, -1, $kAngleDimLabel, data
1406 setdimlabel 0, -1, $kAngleDimLabel, data
1410 case "ScientaSpectrum":
1411 case "ImageEnergyDistribution":
1412 case "ScientaEnergyDistribution":
1413 if (WaveDims(data) >= 2)
1414 setdimlabel 0, -1, $kScanDimLabel, data
1415 setdimlabel 1, -1, $kEnergyDimLabel, data
1417 setdimlabel 0, -1, $kEnergyDimLabel, data
1422 if (WaveDims(data) == 1)
1423 setdimlabel 0, -1, $kScanDimLabel, data
1430 dummy = GetRTError(1)
1444 dfref attrDF = dataDF:attr
1445 if (!DataFolderRefStatus(attrDF))
1446 string df = GetDataFolder(1, dataDF) +
":" 1449 dfref scanDF = dataDF
1461 dfref attrDF = dataDF:attr
1462 if (!DataFolderRefStatus(attrDF))
1463 string df = GetDataFolder(1, dataDF) +
":" 1465 dfref attrDF = scanDF:attr
1487 dfref scanDF = GetDataFolderDFR()
1490 make /n=3 /free lo, hi
1491 make /n=3 /t /free ax, un
1492 wave /t /z /SDFR=scanDF ScanReadables
1493 if (WaveExists(ScanReadables))
1495 variable nsr = numpnts(ScanReadables)
1498 for (isr = 0; isr < nsr; isr += 1)
1499 setdatafolder scanDF
1500 ssr = ScanReadables[isr]
1501 if (ItemsInList(ssr,
"/") >= 2)
1502 sdf = StringFromList(0, ssr,
"/")
1503 ssr = RemoveListItem(0, ssr,
"/")
1507 if (WaveExists(wsr))
1513 setdatafolder scanDF
1535 dfref saveDF = GetDataFolderDFR()
1536 dfref dataDF = GetWavesDataFolderDFR(data)
1538 setdatafolder dataDF
1539 make /n=3 /free lo, hi
1540 make /n=3 /t /free ax, un
1543 setdatafolder saveDF
1552 wave /SDFR=dataDF /Z w = $name
1554 wave /SDFR=scanDF /Z w = $name
1556 wave /SDFR=attrDF /Z w = $name
1609 dfref dataDF = GetDataFolderDFR()
1613 redimension /n=4 lo, hi, un, ax
1614 setdimlabel 0, 0, $kEnergyDimLabel, lo, hi, un, ax
1615 setdimlabel 0, 1, $kAngleDimLabel, lo, hi, un, ax
1616 setdimlabel 0, 2, $kScanDimLabel, lo, hi, un, ax
1617 setdimlabel 0, 3, $kDataDimLabel, lo, hi, un, ax
1620 lo[%$kEnergyDimLabel] = 0
1621 hi[%$kEnergyDimLabel] = 1
1622 un[%$kEnergyDimLabel] =
"eV" 1623 ax[%$kEnergyDimLabel] =
"Ekin" 1625 lo[%$kAngleDimLabel] = -1
1626 hi[%$kAngleDimLabel] = 1
1627 un[%$kAngleDimLabel] =
"arb." 1628 un[%$kAngleDimLabel] =
"slice" 1630 lo[%$kScanDimLabel] = 0
1631 hi[%$kScanDimLabel] = 1
1632 un[%$kScanDimLabel] =
"arb." 1633 ax[%$kScanDimLabel] =
"scan" 1635 lo[%$kDataDimLabel] = 0
1636 hi[%$kDataDimLabel] = 0
1637 un[%$kDataDimLabel] =
"arb." 1638 ax[%$kDataDimLabel] =
"value" 1640 wave /SDFR=attrDF /T /Z LensMode
1641 wave /Z ChannelBegin =
find_scale_wave(
"ScientaChannelBegin", dataDF, scanDF, attrDF)
1642 wave /Z ChannelEnd =
find_scale_wave(
"ScientaChannelEnd", dataDF, scanDF, attrDF)
1643 wave /Z SliceBegin =
find_scale_wave(
"ScientaSliceBegin", dataDF, scanDF, attrDF)
1644 wave /Z SliceEnd =
find_scale_wave(
"ScientaSliceEnd", dataDF, scanDF, attrDF)
1647 if (waveexists(LensMode) && (numpnts(LensMode) >= 1))
1648 strswitch(LensMode[0])
1650 lo[%$kAngleDimLabel] = -45/2
1651 hi[%$kAngleDimLabel] = +45/2
1652 un[%$kAngleDimLabel] =
"" 1653 ax[%$kAngleDimLabel] =
"angle" 1656 lo[%$kAngleDimLabel] = -60/2
1657 hi[%$kAngleDimLabel] = +60/2
1658 un[%$kAngleDimLabel] =
"" 1659 ax[%$kAngleDimLabel] =
"angle" 1661 case "Transmission":
1662 un[%$kAngleDimLabel] =
"arb." 1663 ax[%$kAngleDimLabel] =
"offset" 1669 if (waveexists(ChannelBegin) && waveexists(ChannelEnd) && (numpnts(ChannelBegin) >= 1) && (numpnts(ChannelEnd) >= 1))
1670 lo[%$kEnergyDimLabel] = ChannelBegin[0]
1671 hi[%$kEnergyDimLabel] = ChannelEnd[0]
1673 if (waveexists(SliceBegin) && waveexists(SliceEnd) && (numpnts(SliceBegin) >= 1) && (numpnts(SliceEnd) >= 1))
1674 lo[%$kAngleDimLabel] = SliceBegin[0]
1675 hi[%$kAngleDimLabel] = SliceEnd[0]
1678 wave /z /t /SDFR=scanDF ScanWritables
1679 if (WaveExists(ScanWritables))
1680 wave /z /SDFR=scanDF scanner = $ScanWritables[0]
1681 if (!WaveExists(scanner))
1682 wave /z /SDFR=attrDF scanner = $ScanWritables[0]
1684 if (WaveExists(scanner) && (numpnts(scanner) >= 1))
1685 lo[%$kScanDimLabel] = scanner[0]
1686 hi[%$kScanDimLabel] = scanner[numpnts(scanner)-1]
1687 ax[%$kScanDimLabel] = NameOfWave(scanner)
1688 strswitch(NameOfWave(scanner))
1690 ax[%$kScanDimLabel] =
"photon energy" 1691 un[%$kScanDimLabel] =
"eV" 1693 case "ManipulatorX":
1694 case "ManipulatorY":
1695 case "ManipulatorZ":
1698 case "RefocusYTrans":
1699 case "RefocusZTrans":
1701 un[%$kScanDimLabel] =
"mm" 1704 un[%$kScanDimLabel] =
"m" 1706 case "ManipulatorTheta":
1707 case "ManipulatorTilt":
1708 case "ManipulatorPhi":
1709 un[%$kScanDimLabel] =
"" 1717 un[%$kScanDimLabel] =
"mrad" 1770 string snote = note(data)
1772 sdim = GetDimLabel(data, 0, -1)
1774 setscale /i x lo[%$sdim], hi[%$sdim], un[%$sdim], data
1775 snote = ReplaceStringByKey(
"AxisLabelX", snote, ax[%$sdim],
"=",
"\r")
1778 sdim = GetDimLabel(data, 1, -1)
1780 setscale /i y lo[%$sdim], hi[%$sdim], un[%$sdim], data
1781 snote = ReplaceStringByKey(
"AxisLabelY", snote, ax[%$sdim],
"=",
"\r")
1784 sdim = GetDimLabel(data, 2, -1)
1786 setscale /i z lo[%$sdim], hi[%$sdim], un[%$sdim], data
1787 snote = ReplaceStringByKey(
"AxisLabelZ", snote, ax[%$sdim],
"=",
"\r")
1790 string data_unit = un[%$kDataDimLabel]
1791 string data_label = ax[%$kDataDimLabel]
1793 variable def = (cmpstr(data_unit,
"arb.") == 0) && (cmpstr(data_label,
"value") == 0)
1796 s = StringByKey(
"AxisLabelD", snote,
"=",
"\r")
1801 s = StringByKey(
"AxisUnitD", snote,
"=",
"\r")
1809 strswitch(NameOfWave(data))
1810 case "ScientaImage":
1811 case "ImageAngleDistribution":
1812 case "ScientaAngleDistribution":
1813 case "ScientaSpectrum":
1814 case "ImageEnergyDistribution":
1815 case "ScientaEnergyDistribution":
1817 data_unit =
"counts" 1818 data_label =
"intensity" 1821 case "SampleCurrent":
1825 data_label =
"current" 1828 case "MachineCurrent":
1830 data_label =
"current" 1836 setscale d 0, 0, data_unit, data
1837 snote = ReplaceStringByKey(
"AxisLabelD", snote, data_label,
"=",
"\r")
1838 snote = ReplaceStringByKey(
"AxisUnitD", snote, data_unit,
"=",
"\r")
1839 snote = ReplaceStringByKey(
"Dataset", snote, NameOfWave(data),
"=",
"\r")
1893 string psh5_load_reduced(
string ANickName,
string APathName,
string AFileName, funcref reduction_func,
string reduction_param, variable progress = defaultValue, variable nthreads = defaultValue){
1898 string reduction_param
1902 if (ParamIsDefault(progress))
1905 if (ParamIsDefault(nthreads))
1909 dfref saveDF = GetDataFolderDFR()
1912 variable timerRefNum
1913 variable /g psh5_perf_secs
1914 timerRefNum = startMSTimer
1916 variable fileID =
psh5_open_file(ANickName, APathName, AFileName)
1917 string wavenames =
"" 1919 dfref fileDF = GetDataFolderDFR()
1922 AFileName = s_filepath
1923 print
"loading " + s_filepath +
"\r" 1926 variable ng = ItemsInList(s_scanpaths)
1931 string positionerpath
1933 scanpath = StringFromList(ig, s_scanpaths)
1934 folder = ReplaceString(
"/", scanpath,
"")
1935 folder = ReplaceString(
" ", folder,
"")
1936 folder = CleanupName(folder, 0)
1937 setdatafolder fileDF
1938 newdatafolder /s /o $folder
1939 dfref dataDF = GetDataFolderDFR()
1941 newdatafolder /s /o attr
1944 setdatafolder dataDF
1945 wave /t /z ScanWritables
1946 if (waveexists(ScanWritables) && (numpnts(ScanWritables) >= 1))
1947 positioner = ScanWritables[0]
1948 if (strlen(positioner) > 0)
1949 positionerpath = scanpath +
"/" + positioner
1950 positionerpath = ReplaceString(
"//", positionerpath,
"/")
1951 HDF5LoadData /O /Q /Z fileID, positionerpath
1955 setdatafolder dataDF
1958 wavenames =
psh5_load_dataset_reduced(fileID, scanpath, dataset, reduction_func, reduction_param, progress=progress, nthreads=nthreads)
1963 if (timerRefNum >= 0)
1964 psh5_perf_secs = stopMSTimer(timerRefNum) / 1e6
1967 setdatafolder saveDF
2022 string psh5_load_dataset_reduced(variable fileID,
string scanpath,
string datasetname, funcref reduction_func,
string reduction_param, variable progress = defaultValue, variable nthreads = defaultValue){
2027 string reduction_param
2031 if (ParamIsDefault(progress))
2034 if (ParamIsDefault(nthreads))
2038 dfref base_df = GetDataFolderDFR()
2042 string wavenames =
"" 2044 datasetpath = scanpath +
"/" + datasetname
2045 datasetpath = ReplaceString(
"//", datasetpath,
"/")
2046 datawavename = StringFromList(ItemsInList(datasetpath,
"/") - 1, datasetpath,
"/")
2050 if (ItemsInList(datasetname,
"/") >= 2)
2051 regionname = StringFromList(0, datasetname,
"/")
2052 regionpath = ReplaceString(
"//", scanpath +
"/" + regionname,
"/")
2053 datasetname = RemoveListItem(0, datasetname,
"/")
2054 NewDataFolder /o/s $regionname
2057 regionpath = scanpath
2060 STRUCT HDF5DataInfo di
2061 InitHDF5DataInfo(di)
2062 variable err = HDF5DatasetInfo(fileID, datasetpath, 0, di)
2064 print
"error accessing detector/data" 2069 print
"error: rank of dataset < 2" 2072 else if (di.ndims < 3)
2076 variable idx, idy, idz, idt
2088 variable nx, ny, nz, nt, nzt
2099 HDF5MakeHyperslabWave(
"slab", max(di.ndims, 4))
2105 slab[idx][%Block] = nx
2106 slab[idy][%Block] = ny
2110 nthreads = ThreadProcessorCount
2113 variable threadGroupID = ThreadGroupCreate(nthreads)
2115 for (ithread = 0; ithread < nthreads; ithread += 1)
2119 make /n=(nzt) /df /free processing_folders
2127 make /n=(nx,ny) /d /o $datawavename
2128 wave
template = $datawavename
2132 variable iz, it, izt
2136 make /n=0 /free /wave result_waves
2139 for (iz = 0; iz < nz; iz += 1)
2140 for (it = 0; it < nt; it += 1)
2142 slab[idz][%Start] = iz
2143 slab[idt][%Start] = it
2144 dfname =
"processing_" + num2str(izt)
2145 newdatafolder /s $dfname
2146 HDF5LoadData /O /Q /Z /SLAB=slab /N=slabdata fileID, datasetpath
2149 duplicate
template, image
2150 variable /g r_index = iz
2151 variable /g s_index = it
2152 string /g func_param = reduction_param
2156 ThreadGroupPutDF threadGroupID, :
2158 processing_folders[izt] = GetDataFolderDFR()
2159 make /n=1/d profile1, profile2
2161 wave /wave reduced_waves =
reduce_slab_image(slabdata, image, reduction_func, func_param)
2162 variable /g func_result = numpnts(reduced_waves)
2164 WaveClear slabdata, image, reduced_waves
2180 killwaves /z slab, slabdata,
template 2186 for (izt = 0; (izt < nzt) && (result == 0); izt += 1)
2196 dfr = ThreadGroupGetDFR(threadGroupID, 1000)
2197 if (DatafolderRefStatus(dfr) != 0)
2209 dfr = processing_folders[izt]
2216 nvar rr = dfr:r_index
2217 nvar ss = dfr:s_index
2218 nvar func_result = dfr:func_result
2220 if (func_result < 1)
2221 print
"error during data reduction." 2226 if (numpnts(result_waves) == 0)
2227 redimension /n=(func_result) result_waves
2228 for (iw = 0; iw < func_result; iw += 1)
2229 sw =
"redw_" + num2str(iw)
2230 wave profile = dfr:$sw
2231 sw =
"ReducedData" + num2str(iw+1)
2232 make /n=(dimsize(profile, 0), nz, nt) /d /o $sw
2234 setdimlabel 0, -1, $getdimlabel(profile, 0, -1), data
2235 setdimlabel 1, -1, $kScanDimLabel, data
2236 note data, note(profile)
2238 setscale /p x dimoffset(profile, 0), dimdelta(profile, 0), waveunits(profile, 0), data
2239 setscale d 0, 0, waveunits(profile, -1), data
2240 result_waves[iw] = data
2243 for (iw = 0; iw < func_result; iw += 1)
2244 sw =
"redw_" + num2str(iw)
2245 wave profile = dfr:$sw
2246 wave data = result_waves[iw]
2247 data[][rr][ss] = profile[p]
2252 variable tstatus = ThreadGroupRelease(threadGroupID)
2254 print
"error: thread did not terminate properly." 2258 for (izt = 0; izt < nzt; izt += 1)
2259 KillDataFolder /Z processing_folders[izt]
2264 nw = numpnts(result_waves)
2266 for (iw = 0; iw < nw; iw += 1)
2267 wave data = result_waves[iw]
2269 redimension /n=(-1, 0, 0) data
2271 redimension /n=(-1, nz, 0) data
2273 wavenames += nameofwave(data) +
";" 2280 setdatafolder base_df
2289 dfref dfr = ThreadGroupGetDFR(0, 1000)
2290 if (DataFolderRefStatus(dfr) == 0)
2300 wave slabdata = dfr:slabdata
2301 wave image = dfr:image
2302 svar func_param = dfr:func_param
2303 nvar rr = dfr:r_index
2304 nvar ss = dfr:s_index
2307 newdatafolder /s outDF
2308 variable /g r_index = rr
2309 variable /g s_index = ss
2310 wave /wave reduced_waves =
reduce_slab_image(slabdata, image, reduction_func, func_param)
2311 variable /g func_result = numpnts(reduced_waves)
2315 WaveClear slabdata, image, reduced_waves
2316 ThreadGroupPutDF 0, :
2323 threadsafe
static wave
reduce_slab_image(wave slabdata, wave image, funcref reduction_func,
string reduction_param){
2327 string reduction_param
2332 return reduction_func(image, reduction_param)
2353 dfref saveDF = GetDataFolderDFR()
2354 dfref fileDF = NewFreeDataFolder()
2355 setdatafolder fileDF
2365 HDF5OpenFile /P=$APathName /R fileID as AFileName
2367 filepath = s_path + s_filename
2369 nscans = ItemsInList(scanpaths)
2370 for (iscan = 0; iscan < nscans; iscan += 1)
2371 scanpath = StringFromList(iscan, scanpaths)
2372 info = info + scanpath +
"\r" 2375 HDF5CloseFile fileID
2378 setdatafolder saveDF
2401 string positions =
"" 2402 string positioners =
"" 2403 string readables =
"" 2404 string detectors =
"" 2409 wave /z ScanDimensions
2410 wave /t /z ScanWritables
2411 wave /t /z ScanReadables
2414 if (WaveExists(ScanSteps) && (numpnts(ScanSteps) >= 1))
2416 positions =
"positions = (" +
wave2list(ScanSteps,
"%u",
",") +
")" 2417 info = AddListItem(positions, info,
"\r", inf)
2419 if (WaveExists(ScanWritables) && (numpnts(ScanWritables) >= 1))
2420 positioners =
"positioners = " +
twave2list(ScanWritables,
",")
2421 info = AddListItem(positioners, info,
"\r", inf)
2426 if (WaveExists(ScanReadables) && (numpnts(ScanReadables) >= 1))
2428 n = ItemsInList(readables,
",")
2429 for (i = 0; i < n; i += 1)
2430 s = StringFromList(i, readables,
",")
2431 m = ItemsInList(s,
"/")
2433 s = StringFromList(m - 1, s,
"/")
2435 if (WhichListItem(s, detectors,
",") < 0)
2436 detectors = AddListItem(s, detectors,
",", inf)
2439 detectors =
"detectors = " + detectors
2440 info = AddListItem(detectors, info,
"\r", inf)
2444 if (strlen(regions) > 0)
2445 regions =
"regions = " + regions
2446 info = AddListItem(regions, info,
"\r", inf)
2460 variable n = numpnts(wt)
2462 for (i = 0; i < n; i += 1)
2463 list = AddListItem(wt[i], list, sep, inf)
2478 variable n = numpnts(w)
2481 for (i = 0; i < n; i += 1)
2482 sprintf s, format, w[i]
2483 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_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_reduced(string ANickName, string APathName, string AFileName, funcref reduction_func, string reduction_param, variable progress=defaultValue, variable nthreads=defaultValue)
load and reduce the ScientaImage dataset of the first scan of a PShell data 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
threadsafe variable adh5_get_result_waves(wave results, string result_prefix, variable start_index)
copy waves from wave reference wave into current data folder
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 threadsafe wave reduce_slab_image(wave slabdata, wave image, funcref reduction_func, string reduction_param)
static string wave2list(wave w, string format, string sep)
convert numeric wave to list.
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.
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.
threadsafe wave adh5_default_reduction(wave source, string *param)
function prototype for adh5_load_reduced_detector
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.