musrfit 1.10.0
PNeXus.h
Go to the documentation of this file.
1/***************************************************************************
2
3 PNeXus.h
4
5 Author: Andreas Suter
6 e-mail: andreas.suter@psi.ch
7
8***************************************************************************/
9
10/***************************************************************************
11 * Copyright (C) 2007-2026 by Andreas Suter *
12 * andreas.suter@psi.ch *
13 * *
14 * This program is free software; you can redistribute it and/or modify *
15 * it under the terms of the GNU General Public License as published by *
16 * the Free Software Foundation; either version 2 of the License, or *
17 * (at your option) any later version. *
18 * *
19 * This program is distributed in the hope that it will be useful, *
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
22 * GNU General Public License for more details. *
23 * *
24 * You should have received a copy of the GNU General Public License *
25 * along with this program; if not, write to the *
26 * Free Software Foundation, Inc., *
27 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
28 ***************************************************************************/
29
100
101#ifndef _PNEXUS_H_
102#define _PNEXUS_H_
103
104#include <string>
105#include <vector>
106#include <map>
107#include <cctype>
108#include <algorithm>
109#include <any>
110#include <cstdint>
111
112#include "Minuit2/FCNBase.h"
113
114#ifdef HAVE_HDF4
115#include <mfhdf.h>
116#include <hdf.h>
117#endif // HAVE_HDF4
118
119#include <H5Cpp.h>
120
132namespace nxs {
133
146
182HDFType checkHDFType(const std::string& filename);
183
190std::string getIso8601TimestampLocal();
191
192} // end namespace nxs
193
194#ifdef HAVE_HDF4
217namespace nxH4 {
218
219class PNeXus;
220
253class PNeXusDeadTime : public ROOT::Minuit2::FCNBase
254{
255public:
264 PNeXusDeadTime(const PNeXus *nxs, bool debug=false);
265
270 bool IsValid() { return fValid; }
271
278 double Up() const { return fUp; }
279
288 double operator()(const std::vector<double> &par) const;
289
298 void Minimize(const int i);
299
306 const std::vector<uint32_t>& GetDimensions() const { return fDims; }
307
308private:
309 bool fDebug{false};
310 bool fValid;
311 int fGoodFrames{-1};
312 float fTimeResolution{0.0};
313 std::vector<uint32_t>fDims = {0, 0, 0};
314 int fT0Bin{-1};
315 int fFgbBin{-1};
316 int fLgbBin{-1};
317 std::vector<float> fDeadTime;
318 std::vector<int> fCounts;
319 double fUp{0.5};
320 unsigned int fIdx{0};
321};
322
323
340
370template <typename T> class PNXdata {
371public:
376
381 PNXdata(const H4DataType& dataType) : fDataType(dataType) {}
382
387 H4DataType GetDataType() const { return fDataType; }
388
393 void SetDataType(const H4DataType& dataType) { fDataType = dataType; }
394
399 const std::vector<T>& GetData() const { return fData; }
400
405 std::vector<T>& GetData() { return fData; }
406
411 void SetData(const std::vector<T>& data) { fData = data; }
412
417 const std::vector<uint32_t>& GetDimensions() const { return fDimensions; }
418
423 void SetDimensions(const std::vector<uint32_t>& dims) { fDimensions = dims; }
424
429 size_t GetRank() const { return fDimensions.size(); }
430
435 size_t GetNumElements() const {
436 if (fDimensions.empty()) return 0;
437 size_t total = 1;
438 for (auto dim : fDimensions) {
439 total *= dim;
440 }
441 return total;
442 }
443
449 void AddAttribute(const std::string& name, const std::any& value) {
450 fAttributes[name] = value;
451 }
452
459 std::any GetAttribute(const std::string& name) const {
460 return fAttributes.at(name);
461 }
462
468 bool HasAttribute(const std::string& name) const {
469 return fAttributes.find(name) != fAttributes.end();
470 }
471
476 const std::map<std::string, std::any>& GetAttributes() const {
477 return fAttributes;
478 }
479
484 std::map<std::string, std::any>& GetAttributes() {
485 return fAttributes;
486 }
487
488private:
490 std::vector<T> fData;
491 std::vector<uint32_t> fDimensions;
492 std::map<std::string, std::any> fAttributes;
493};
494
517class PNeXus {
518public:
533 PNeXus();
534
541 PNeXus(const std::string fln, const bool printDebug=false);
542
546 ~PNeXus();
547
552 std::string GetFileName() const { return fFileName; }
553
558 std::string GetHdf4LibVersion() const { return fHdf4LibVersion; }
559
564 std::string GetHdf4Version() const { return fHdf4Version; }
565
570 std::string GetNeXusVersion() const { return fNeXusVersion; }
571
576 int GetIdfVersion() const { return fIdfVersion; }
577
583 int ReadNexusFile();
584
589 const std::map<std::string, std::any>& GetDataMap() const { return fDataMap; }
590
595 std::map<std::string, std::any>& GetDataMap() { return fDataMap; }
596
602 bool HasDataset(const std::string& path) const { return fDataMap.find(path) != fDataMap.end(); }
603
610 template <typename T>
611 void SetDataset(const std::string& path, const PNXdata<T>& data) {
612 fDataMap[path] = data;
613 }
614
623 template <typename T>
624 PNXdata<T> GetDataset(const std::string& path) const {
625 return std::any_cast<PNXdata<T>>(fDataMap.at(path));
626 }
627
636 template <typename T>
637 PNXdata<T>& GetDatasetRef(const std::string& path) {
638 return std::any_cast<PNXdata<T>&>(fDataMap.at(path));
639 }
640
646 bool RemoveDataset(const std::string& path) {
647 auto it = fDataMap.find(path);
648 if (it != fDataMap.end()) {
649 fDataMap.erase(it);
650 return true;
651 }
652 return false;
653 }
654
658 void ClearDataMap() { fDataMap.clear(); }
659
664 size_t GetNumDatasets() const { return fDataMap.size(); }
665
673 template <typename T>
674 bool UpdateDatasetData(const std::string& path, const std::vector<T>& newData) {
675 if (!HasDataset(path)) return false;
676 try {
677 auto& dataset = std::any_cast<PNXdata<T>&>(fDataMap.at(path));
678 dataset.SetData(newData);
679 return true;
680 } catch (const std::bad_any_cast&) {
681 return false;
682 }
683 }
684
692 template <typename T>
693 bool UpdateDatasetDimensions(const std::string& path, const std::vector<uint32_t>& newDimensions) {
694 if (!HasDataset(path)) return false;
695 try {
696 auto& dataset = std::any_cast<PNXdata<T>&>(fDataMap.at(path));
697 dataset.SetDimensions(newDimensions);
698 return true;
699 } catch (const std::bad_any_cast&) {
700 return false;
701 }
702 }
703
712 template <typename T>
713 bool AddDatasetAttribute(const std::string& path, const std::string& attrName,
714 const std::any& attrValue) {
715 if (!HasDataset(path)) return false;
716 try {
717 auto& dataset = std::any_cast<PNXdata<T>&>(fDataMap.at(path));
718 dataset.AddAttribute(attrName, attrValue);
719 return true;
720 } catch (const std::bad_any_cast&) {
721 return false;
722 }
723 }
724
732 template <typename T>
733 bool RemoveDatasetAttribute(const std::string& path, const std::string& attrName) {
734 if (!HasDataset(path)) return false;
735 try {
736 auto& dataset = std::any_cast<PNXdata<T>&>(fDataMap.at(path));
737 auto& attrs = dataset.GetAttributes();
738 auto it = attrs.find(attrName);
739 if (it != attrs.end()) {
740 attrs.erase(it);
741 return true;
742 }
743 return false;
744 } catch (const std::bad_any_cast&) {
745 return false;
746 }
747 }
748
758 template <typename T>
759 bool AddDataset(const std::string& path, const std::vector<T>& data,
760 const std::vector<uint32_t>& dimensions,
761 const H4DataType& dataType = H4DataType::kINT32) {
762 if (HasDataset(path)) return false;
763 PNXdata<T> dataset(dataType);
764 dataset.SetData(data);
765 dataset.SetDimensions(dimensions);
766 fDataMap[path] = dataset;
767 return true;
768 }
769
778 template <typename T>
779 bool ModifyDataset(const std::string& path, const std::vector<T>& newData,
780 const std::vector<uint32_t>& newDimensions) {
781 if (!HasDataset(path)) return false;
782 try {
783 auto& dataset = std::any_cast<PNXdata<T>&>(fDataMap.at(path));
784 dataset.SetData(newData);
785 dataset.SetDimensions(newDimensions);
786 return true;
787 } catch (const std::bad_any_cast&) {
788 return false;
789 }
790 }
791
808 void Dump();
809
817 int WriteNexusFile(const std::string& filename, int idfVersion = 2);
818
830 bool AddGroupAttribute(const std::string& groupPath, const std::string& attrName,
831 const std::any& attrValue);
832
839 bool RemoveGroupAttribute(const std::string& groupPath, const std::string& attrName);
840
847 bool HasGroupAttribute(const std::string& groupPath, const std::string& attrName) const;
848
856 std::any GetGroupAttribute(const std::string& groupPath, const std::string& attrName) const;
857
863 const std::map<std::string, std::any>& GetGroupAttributes(const std::string& groupPath) const;
864
870 bool ClearGroupAttributes(const std::string& groupPath);
871
885 bool AddRootAttribute(const std::string& attrName, const std::any& attrValue);
886
887private:
888 bool fPrintDebug{false};
889 std::string fFileName{""};
890 int fIdfVersion{-1};
891 std::string fHdf4LibVersion{""};
892 std::string fHdf4Version{""};
893 std::string fNeXusVersion{""};
894 std::string fFileNameNxs{""};
895 std::string fFileTimeNxs{""};
896 std::string fCreatorNxs{""};
897 std::string fUserV1{""};
898 int32 fSdId{-1};
899 int32 fFileId{-1};
900 std::map<std::string, std::any> fDataMap;
901 std::map<std::string, std::map<std::string, std::any>> fGroupAttributes;
902
916 void HandleIdfV1(int32 sd_id);
917
931 void HandleIdfV2(int32 sd_id);
932
933 // ========================================================================
934 // Write methods for HDF4 file creation
935 // ========================================================================
936
943 template <typename T>
944 void WriteDatasetAttributes(int32 sds_id, const PNXdata<T>& data);
945
951 void WriteVGroupAttributes(int32 vgroup_id,
952 const std::map<std::string, std::any>& attributes);
953
966 int32 CreateVGroupHierarchy(int32 file_id, const std::string& path,
967 std::map<std::string, int32>& vgroupCache);
968
977 int32 WriteIntDataset(int32 sd_id, const std::string& path,
978 const PNXdata<int>& data);
979
988 int32 WriteFloatDataset(int32 sd_id, const std::string& path,
989 const PNXdata<float>& data);
990
999 int32 WriteStringDataset(int32 sd_id, const std::string& path,
1000 const PNXdata<std::string>& data);
1001
1007 void WriteFileAttributes(int32 sd_id);
1008
1009 // ========================================================================
1010 // Case-insensitive lookup helper methods
1011 // ========================================================================
1012
1020 static bool CaseInsensitiveEquals(const std::string& a, const std::string& b);
1021
1029 static std::vector<std::string> SplitPath(const std::string& path);
1030
1039 std::string FindAttributeName(int32 sd_id, const std::string& requestedName);
1040
1048 int32 FindDatasetIndex(int32 sd_id, const std::string& requestedName);
1049
1056 int32 FindDatasetRefByPath(const std::string& path);
1057
1058 // ========================================================================
1059 // Dataset reading helper methods
1060 // ========================================================================
1061
1068 void ReadIntDataset(int32 sd_id, const std::string& path);
1069
1076 void ReadFloatDataset(int32 sd_id, const std::string& path);
1077
1084 void ReadStringDataset(int32 sd_id, const std::string& path);
1085
1092 template <typename T>
1093 void ReadDatasetAttributes(int32 sds_id, PNXdata<T>& data);
1094
1100 static H4DataType convertHdf4Type(int32 hdf4_type);
1101
1107 static int32 convertToHdf4Type(H4DataType dataType);
1108};
1109
1110} // end namespace nxH4
1111#endif // HAVE_HDF4
1112
1162namespace nxH5 {
1163
1164class PNeXus;
1165
1198class PNeXusDeadTime : public ROOT::Minuit2::FCNBase
1199{
1200public:
1209 PNeXusDeadTime(const PNeXus *nxs, bool debug=false);
1210
1215 bool IsValid() { return fValid; }
1216
1223 double Up() const { return fUp; }
1224
1233 double operator()(const std::vector<double> &par) const;
1234
1243 void Minimize(const int i);
1244
1251 const std::vector<hsize_t>& GetDimensions() const { return fDims; }
1252
1268 std::vector<float> GetDeadTimeEstimated() { return fDeadTimeEstimated; }
1269
1270private:
1271 bool fDebug{false};
1272 bool fValid;
1273 int fGoodFrames{-1};
1274 float fTimeResolution{0.0};
1275 std::vector<hsize_t>fDims = {0, 0, 0};
1276 int fT0Bin{-1};
1277 int fFgbBin{-1};
1278 int fLgbBin{-1};
1279 std::vector<float> fDeadTime;
1280 std::vector<float> fDeadTimeEstimated;
1281 std::vector<int> fCounts;
1282 double fUp{0.5};
1283 unsigned int fIdx{0};
1284};
1285
1286
1316template <typename T> class PNXdata {
1317public:
1321 PNXdata() : fDataType(H5::PredType::NATIVE_INT) {}
1322
1327 PNXdata(const H5::DataType& dataType) : fDataType(dataType) {}
1328
1333 H5::DataType GetDataType() const { return fDataType; }
1334
1339 void SetDataType(const H5::DataType& dataType) { fDataType = dataType; }
1340
1345 const std::vector<T>& GetData() const { return fData; }
1346
1351 std::vector<T>& GetData() { return fData; }
1352
1357 void SetData(const std::vector<T>& data) { fData = data; }
1358
1363 const std::vector<hsize_t>& GetDimensions() const { return fDimensions; }
1364
1369 void SetDimensions(const std::vector<hsize_t>& dims) { fDimensions = dims; }
1370
1375 size_t GetRank() const { return fDimensions.size(); }
1376
1381 size_t GetNumElements() const {
1382 if (fDimensions.empty()) return 0;
1383 size_t total = 1;
1384 for (auto dim : fDimensions) {
1385 total *= dim;
1386 }
1387 return total;
1388 }
1389
1395 void AddAttribute(const std::string& name, const std::any& value) {
1396 fAttributes[name] = value;
1397 }
1398
1405 std::any GetAttribute(const std::string& name) const {
1406 return fAttributes.at(name);
1407 }
1408
1414 bool HasAttribute(const std::string& name) const {
1415 return fAttributes.find(name) != fAttributes.end();
1416 }
1417
1422 const std::map<std::string, std::any>& GetAttributes() const {
1423 return fAttributes;
1424 }
1425
1430 std::map<std::string, std::any>& GetAttributes() {
1431 return fAttributes;
1432 }
1433
1434private:
1435 H5::DataType fDataType;
1436 std::vector<T> fData;
1437 std::vector<hsize_t> fDimensions;
1438 std::map<std::string, std::any> fAttributes;
1439};
1440
1463class PNeXus {
1464public:
1488 PNeXus();
1489
1508 PNeXus(const std::string fln, const bool printDebug=false);
1509
1514 std::string GetFileName() const { return fFileName; }
1515
1520 std::string GetHdf5LibVersion() const { return fHdf5LibVersion; }
1521
1526 std::string GetHdf5Version() const { return fHdf5Version; }
1527
1532 std::string GetNeXusVersion() const { return fNeXusVersion; }
1533
1538 int GetIdfVersion() const { return fIdfVersion; }
1539
1547 int ReadNexusFile();
1548
1553 const std::map<std::string, std::any>& GetDataMap() const { return fDataMap; }
1554
1559 std::map<std::string, std::any>& GetDataMap() { return fDataMap; }
1560
1566 bool HasDataset(const std::string& path) const { return fDataMap.find(path) != fDataMap.end(); }
1567
1574 template <typename T>
1575 void SetDataset(const std::string& path, const PNXdata<T>& data) {
1576 fDataMap[path] = data;
1577 }
1578
1587 template <typename T>
1588 PNXdata<T> GetDataset(const std::string& path) const {
1589 return std::any_cast<PNXdata<T>>(fDataMap.at(path));
1590 }
1591
1600 template <typename T>
1601 PNXdata<T>& GetDatasetRef(const std::string& path) {
1602 return std::any_cast<PNXdata<T>&>(fDataMap.at(path));
1603 }
1604
1610 bool RemoveDataset(const std::string& path) {
1611 auto it = fDataMap.find(path);
1612 if (it != fDataMap.end()) {
1613 fDataMap.erase(it);
1614 return true;
1615 }
1616 return false;
1617 }
1618
1622 void ClearDataMap() { fDataMap.clear(); }
1623
1628 size_t GetNumDatasets() const { return fDataMap.size(); }
1629
1637 template <typename T>
1638 bool UpdateDatasetData(const std::string& path, const std::vector<T>& newData) {
1639 if (!HasDataset(path)) return false;
1640 try {
1641 auto& dataset = std::any_cast<PNXdata<T>&>(fDataMap.at(path));
1642 dataset.SetData(newData);
1643 return true;
1644 } catch (const std::bad_any_cast&) {
1645 return false;
1646 }
1647 }
1648
1656 template <typename T>
1657 bool UpdateDatasetDimensions(const std::string& path, const std::vector<hsize_t>& newDimensions) {
1658 if (!HasDataset(path)) return false;
1659 try {
1660 auto& dataset = std::any_cast<PNXdata<T>&>(fDataMap.at(path));
1661 dataset.SetDimensions(newDimensions);
1662 return true;
1663 } catch (const std::bad_any_cast&) {
1664 return false;
1665 }
1666 }
1667
1676 template <typename T>
1677 bool AddDatasetAttribute(const std::string& path, const std::string& attrName,
1678 const std::any& attrValue) {
1679 if (!HasDataset(path)) return false;
1680 try {
1681 auto& dataset = std::any_cast<PNXdata<T>&>(fDataMap.at(path));
1682 dataset.AddAttribute(attrName, attrValue);
1683 return true;
1684 } catch (const std::bad_any_cast&) {
1685 return false;
1686 }
1687 }
1688
1696 template <typename T>
1697 bool RemoveDatasetAttribute(const std::string& path, const std::string& attrName) {
1698 if (!HasDataset(path)) return false;
1699 try {
1700 auto& dataset = std::any_cast<PNXdata<T>&>(fDataMap.at(path));
1701 auto& attrs = dataset.GetAttributes();
1702 auto it = attrs.find(attrName);
1703 if (it != attrs.end()) {
1704 attrs.erase(it);
1705 return true;
1706 }
1707 return false;
1708 } catch (const std::bad_any_cast&) {
1709 return false;
1710 }
1711 }
1712
1722 template <typename T>
1723 bool AddDataset(const std::string& path, const std::vector<T>& data,
1724 const std::vector<hsize_t>& dimensions,
1725 const H5::DataType& dataType = H5::PredType::NATIVE_INT) {
1726 if (HasDataset(path)) return false;
1727 PNXdata<T> dataset(dataType);
1728 dataset.SetData(data);
1729 dataset.SetDimensions(dimensions);
1730 fDataMap[path] = dataset;
1731 return true;
1732 }
1733
1742 template <typename T>
1743 bool ModifyDataset(const std::string& path, const std::vector<T>& newData,
1744 const std::vector<hsize_t>& newDimensions) {
1745 if (!HasDataset(path)) return false;
1746 try {
1747 auto& dataset = std::any_cast<PNXdata<T>&>(fDataMap.at(path));
1748 dataset.SetData(newData);
1749 dataset.SetDimensions(newDimensions);
1750 return true;
1751 } catch (const std::bad_any_cast&) {
1752 return false;
1753 }
1754 }
1755
1778 void Dump();
1779
1803 int WriteNexusFile(const std::string& filename, int idfVersion = 2);
1804
1816 bool AddGroupAttribute(const std::string& groupPath, const std::string& attrName,
1817 const std::any& attrValue);
1818
1825 bool RemoveGroupAttribute(const std::string& groupPath, const std::string& attrName);
1826
1833 bool HasGroupAttribute(const std::string& groupPath, const std::string& attrName) const;
1834
1842 std::any GetGroupAttribute(const std::string& groupPath, const std::string& attrName) const;
1843
1849 const std::map<std::string, std::any>& GetGroupAttributes(const std::string& groupPath) const;
1850
1856 bool ClearGroupAttributes(const std::string& groupPath);
1857
1871 bool AddRootAttribute(const std::string& attrName, const std::any& attrValue);
1872
1873private:
1874 bool fPrintDebug{false};
1875 std::string fFileName{""};
1876 int fIdfVersion{-1};
1877 std::string fHdf5LibVersion{"n/a"};
1878 std::string fHdf5Version{""};
1879 std::string fNeXusVersion{""};
1880 std::string fFileNameNxs{""};
1881 std::string fFileTimeNxs{""};
1882 std::string fCreatorNxs{""};
1883 std::string fUserV1{""};
1884 std::map<std::string, std::any> fDataMap;
1885 std::map<std::string, std::map<std::string, std::any>> fGroupAttributes;
1886
1900 void HandleIdfV1(H5::H5File &file);
1901
1915 void HandleIdfV2(H5::H5File &file);
1916
1917 // ========================================================================
1918 // Write methods for HDF5 file creation
1919 // ========================================================================
1920
1928 H5::Group CreateGroupHierarchy(H5::H5File& file, const std::string& path);
1929
1936 template <typename T>
1937 void WriteDatasetAttributes(H5::DataSet& dataset, const PNXdata<T>& data);
1938
1944 void WriteGroupAttributes(H5::Group& group, const std::map<std::string, std::any>& attributes);
1945
1953 void WriteIntDataset(H5::H5File& file, const std::string& path,
1954 const PNXdata<int>& data);
1955
1963 void WriteFloatDataset(H5::H5File& file, const std::string& path,
1964 const PNXdata<float>& data);
1965
1973 void WriteStringDataset(H5::H5File& file, const std::string& path,
1974 const PNXdata<std::string>& data);
1975
1981 void WriteFileAttributes(H5::H5File& file);
1982
1983 // ========================================================================
1984 // Case-insensitive lookup helper methods
1985 // ========================================================================
1986
1994 static bool CaseInsensitiveEquals(const std::string& a, const std::string& b);
1995
2003 static std::vector<std::string> SplitPath(const std::string& path);
2004
2013 std::string FindAttributeName(H5::H5File& obj, const std::string& requestedName);
2014
2023 std::string FindGroupPath(H5::H5File& parent, const std::string& requestedPath);
2024
2032 std::string FindGroupPath(H5::Group& parent, const std::string& requestedPath);
2033
2043 std::string FindDatasetPath(H5::H5File& parent, const std::string& requestedPath);
2044
2053 std::string FindDatasetPath(H5::Group& parent, const std::string& requestedPath);
2054
2055 // ========================================================================
2056 // Dataset reading helper methods
2057 // ========================================================================
2058
2065 void ReadIntDataset(H5::H5File& file, const std::string& path);
2066
2073 void ReadFloatDataset(H5::H5File& file, const std::string& path);
2074
2081 void ReadStringDataset(H5::H5File& file, const std::string& path);
2082
2089 template <typename T>
2090 void ReadDatasetAttributes(H5::DataSet& dataset, PNXdata<T>& data);
2091};
2092
2093} // end namespace nxH5
2094
2095#endif // _PNEXUS_H_
Template class for storing HDF4 dataset content with attributes.
Definition PNeXus.h:370
const std::vector< T > & GetData() const
Get the data as a vector.
Definition PNeXus.h:399
std::vector< uint32_t > fDimensions
Dimensions of the dataset.
Definition PNeXus.h:491
std::vector< T > & GetData()
Get mutable reference to the data vector.
Definition PNeXus.h:405
PNXdata()
Default constructor.
Definition PNeXus.h:375
std::vector< T > fData
Data storage (flattened multi-dimensional array)
Definition PNeXus.h:490
void SetDataType(const H4DataType &dataType)
Set the HDF4 DataType.
Definition PNeXus.h:393
std::map< std::string, std::any > & GetAttributes()
Get mutable reference to all attributes.
Definition PNeXus.h:484
void SetData(const std::vector< T > &data)
Set the data vector.
Definition PNeXus.h:411
void SetDimensions(const std::vector< uint32_t > &dims)
Set the dimensions of the dataset.
Definition PNeXus.h:423
std::map< std::string, std::any > fAttributes
Attributes associated with this dataset.
Definition PNeXus.h:492
const std::map< std::string, std::any > & GetAttributes() const
Get all attributes.
Definition PNeXus.h:476
bool HasAttribute(const std::string &name) const
Check if an attribute exists.
Definition PNeXus.h:468
H4DataType fDataType
HDF4 datatype of the dataset.
Definition PNeXus.h:489
void AddAttribute(const std::string &name, const std::any &value)
Add an attribute to this dataset.
Definition PNeXus.h:449
H4DataType GetDataType() const
Get the HDF4 DataType.
Definition PNeXus.h:387
const std::vector< uint32_t > & GetDimensions() const
Get the dimensions of the dataset.
Definition PNeXus.h:417
size_t GetNumElements() const
Get total number of elements.
Definition PNeXus.h:435
size_t GetRank() const
Get the number of dimensions.
Definition PNeXus.h:429
std::any GetAttribute(const std::string &name) const
Get an attribute by name.
Definition PNeXus.h:459
PNXdata(const H4DataType &dataType)
Constructor with datatype.
Definition PNeXus.h:381
std::vector< int > fCounts
Count data for minimization.
Definition PNeXus.h:318
double Up() const
Get the error definition for the minimizer (FCNBase requirement)
Definition PNeXus.h:278
int fLgbBin
Last good bin for analysis.
Definition PNeXus.h:316
std::vector< uint32_t > fDims
Dimensions of count data [periods, spectra, bins].
Definition PNeXus.h:313
float fTimeResolution
Time resolution in picoseconds.
Definition PNeXus.h:312
int fT0Bin
T0 bin number (time zero reference)
Definition PNeXus.h:314
PNeXusDeadTime(const PNeXus *nxs, bool debug=false)
Constructor - initializes dead time calculator from NeXus data.
Definition PNeXus.cpp:163
int fGoodFrames
Number of good time frames for analysis.
Definition PNeXus.h:311
bool IsValid()
Check if the dead time calculator was initialized successfully.
Definition PNeXus.h:270
unsigned int fIdx
Current spectrum index being minimized.
Definition PNeXus.h:320
const std::vector< uint32_t > & GetDimensions() const
Get the dimensions of the count dataset.
Definition PNeXus.h:306
double fUp
UP parameter for Minuit2 (0.5 for chi-square)
Definition PNeXus.h:319
bool fDebug
Debug flag - if true, print additional diagnostic information.
Definition PNeXus.h:309
double operator()(const std::vector< double > &par) const
Function call operator - calculates chi-square for given parameters.
Definition PNeXus.cpp:268
std::vector< float > fDeadTime
Dead time values per detector (microseconds)
Definition PNeXus.h:317
bool fValid
Validity flag - true if required data was loaded successfully.
Definition PNeXus.h:310
int fFgbBin
First good bin for analysis.
Definition PNeXus.h:315
void Minimize(const int i)
Minimize dead time for a specific detector spectrum.
Definition PNeXus.cpp:300
NeXus HDF4 file reader with case-insensitive path lookup.
Definition PNeXus.h:517
bool AddRootAttribute(const std::string &attrName, const std::any &attrValue)
Definition PNeXus.cpp:2508
bool RemoveDataset(const std::string &path)
Remove a dataset from the data map.
Definition PNeXus.h:646
bool RemoveDatasetAttribute(const std::string &path, const std::string &attrName)
Remove an attribute from a dataset.
Definition PNeXus.h:733
std::string fHdf4LibVersion
HDF4 library version used when calling PNeXus.
Definition PNeXus.h:891
int32 WriteStringDataset(int32 sd_id, const std::string &path, const PNXdata< std::string > &data)
Write a string dataset with attributes and return its SDS reference.
Definition PNeXus.cpp:2220
bool RemoveGroupAttribute(const std::string &groupPath, const std::string &attrName)
Remove an attribute from a group.
Definition PNeXus.cpp:2457
bool AddGroupAttribute(const std::string &groupPath, const std::string &attrName, const std::any &attrValue)
Add or update an attribute for a group.
Definition PNeXus.cpp:2449
int32 FindDatasetIndex(int32 sd_id, const std::string &requestedName)
Find dataset index with case-insensitive matching.
Definition PNeXus.cpp:2572
void SetDataset(const std::string &path, const PNXdata< T > &data)
Add or update a dataset in the data map.
Definition PNeXus.h:611
bool AddDataset(const std::string &path, const std::vector< T > &data, const std::vector< uint32_t > &dimensions, const H4DataType &dataType=H4DataType::kINT32)
Create and add a new dataset with data, dimensions, and optional attributes.
Definition PNeXus.h:759
std::string fFileTimeNxs
Definition PNeXus.h:895
const std::map< std::string, std::any > & GetGroupAttributes(const std::string &groupPath) const
Get all attributes for a group.
Definition PNeXus.cpp:2487
~PNeXus()
Destructor - closes HDF4 file if open.
Definition PNeXus.cpp:356
bool UpdateDatasetData(const std::string &path, const std::vector< T > &newData)
Update the data of an existing dataset.
Definition PNeXus.h:674
std::string fFileNameNxs
Definition PNeXus.h:894
bool UpdateDatasetDimensions(const std::string &path, const std::vector< uint32_t > &newDimensions)
Update the dimensions of an existing dataset.
Definition PNeXus.h:693
static H4DataType convertHdf4Type(int32 hdf4_type)
Convert HDF4 data type to H4DataType enum.
Definition PNeXus.cpp:2744
void WriteDatasetAttributes(int32 sds_id, const PNXdata< T > &data)
Write dataset attributes from PNXdata object.
Definition PNeXus.cpp:2267
std::string fCreatorNxs
Definition PNeXus.h:896
std::string fFileName
NeXus HDF4 filename.
Definition PNeXus.h:889
std::string GetHdf4Version() const
Get the hdf4 version of the NeXus file.
Definition PNeXus.h:564
bool HasGroupAttribute(const std::string &groupPath, const std::string &attrName) const
Check if a group has a specific attribute.
Definition PNeXus.cpp:2471
static bool CaseInsensitiveEquals(const std::string &a, const std::string &b)
Compare two strings case-insensitively.
Definition PNeXus.cpp:2516
int32 fSdId
HDF4 SD interface identifier.
Definition PNeXus.h:898
std::string fNeXusVersion
NeXus version of the file.
Definition PNeXus.h:893
void HandleIdfV1(int32 sd_id)
Read datasets for IDF version 1 file structure.
Definition PNeXus.cpp:544
std::map< std::string, std::map< std::string, std::any > > fGroupAttributes
Map of group paths to their attributes.
Definition PNeXus.h:901
const std::map< std::string, std::any > & GetDataMap() const
Get the data map containing all datasets.
Definition PNeXus.h:589
int32 FindDatasetRefByPath(const std::string &path)
Find dataset reference by navigating VGroup hierarchy.
Definition PNeXus.cpp:2604
std::string GetHdf4LibVersion() const
Get the hdf4 library version.
Definition PNeXus.h:558
std::string fUserV1
Definition PNeXus.h:897
std::string GetNeXusVersion() const
Get the NeXus version of the file.
Definition PNeXus.h:570
void WriteVGroupAttributes(int32 vgroup_id, const std::map< std::string, std::any > &attributes)
Write attributes to a Vgroup.
Definition PNeXus.cpp:2316
PNXdata< T > GetDataset(const std::string &path) const
Get a dataset from the data map.
Definition PNeXus.h:624
std::string fHdf4Version
HDF4 version of the file.
Definition PNeXus.h:892
void ReadStringDataset(int32 sd_id, const std::string &path)
Read a string dataset and store in data map.
Definition PNeXus.cpp:842
std::map< std::string, std::any > fDataMap
Map of HDF4 paths to PNXdata objects.
Definition PNeXus.h:900
std::map< std::string, std::any > & GetDataMap()
Get mutable reference to the data map.
Definition PNeXus.h:595
int WriteNexusFile(const std::string &filename, int idfVersion=2)
Write the data map contents to a NeXus HDF4 file.
Definition PNeXus.cpp:1972
bool fPrintDebug
if true print additional debug information
Definition PNeXus.h:888
int32 CreateVGroupHierarchy(int32 file_id, const std::string &path, std::map< std::string, int32 > &vgroupCache)
Create the Vgroup hierarchy for a given path.
Definition PNeXus.cpp:2365
bool AddDatasetAttribute(const std::string &path, const std::string &attrName, const std::any &attrValue)
Add or update an attribute for a dataset.
Definition PNeXus.h:713
int GetIdfVersion() const
Get the Idf version of the file.
Definition PNeXus.h:576
static int32 convertToHdf4Type(H4DataType dataType)
Convert H4DataType enum to HDF4 data type.
Definition PNeXus.cpp:2771
void ReadIntDataset(int32 sd_id, const std::string &path)
Read an integer dataset and store in data map.
Definition PNeXus.cpp:690
bool HasDataset(const std::string &path) const
Check if a dataset path exists in the data map.
Definition PNeXus.h:602
std::string FindAttributeName(int32 sd_id, const std::string &requestedName)
Definition PNeXus.cpp:2551
std::any GetGroupAttribute(const std::string &groupPath, const std::string &attrName) const
Get an attribute value from a group.
Definition PNeXus.cpp:2481
int32 WriteIntDataset(int32 sd_id, const std::string &path, const PNXdata< int > &data)
Write an integer dataset with attributes and return its SDS reference.
Definition PNeXus.cpp:2124
void HandleIdfV2(int32 sd_id)
Read datasets for IDF version 2 file structure.
Definition PNeXus.cpp:628
bool ModifyDataset(const std::string &path, const std::vector< T > &newData, const std::vector< uint32_t > &newDimensions)
Modify an existing dataset's data and dimensions.
Definition PNeXus.h:779
static std::vector< std::string > SplitPath(const std::string &path)
Definition PNeXus.cpp:2528
bool ClearGroupAttributes(const std::string &groupPath)
Clear all attributes from a group.
Definition PNeXus.cpp:2498
void WriteFileAttributes(int32 sd_id)
Write root-level file attributes.
Definition PNeXus.cpp:2079
void ReadFloatDataset(int32 sd_id, const std::string &path)
Read a float dataset and store in data map.
Definition PNeXus.cpp:766
void ClearDataMap()
Clear all datasets from the data map.
Definition PNeXus.h:658
void Dump()
Print a human-readable dump of the NeXus file contents.
Definition PNeXus.cpp:981
PNXdata< T > & GetDatasetRef(const std::string &path)
Get a mutable reference to a dataset in the data map.
Definition PNeXus.h:637
size_t GetNumDatasets() const
Get the number of datasets in the data map.
Definition PNeXus.h:664
int32 WriteFloatDataset(int32 sd_id, const std::string &path, const PNXdata< float > &data)
Write a float dataset with attributes and return its SDS reference.
Definition PNeXus.cpp:2172
void ReadDatasetAttributes(int32 sds_id, PNXdata< T > &data)
Read dataset attributes and add to PNXdata object.
Definition PNeXus.cpp:920
std::string GetFileName() const
Get the filename of the NeXus file.
Definition PNeXus.h:552
int32 fFileId
HDF4 file identifier.
Definition PNeXus.h:899
int fIdfVersion
IDF version of the NeXus file.
Definition PNeXus.h:890
int ReadNexusFile()
Read and parse the NeXus HDF4 file.
Definition PNeXus.cpp:369
Template class for storing HDF5 dataset content with attributes.
Definition PNeXus.h:1316
const std::vector< T > & GetData() const
Get the data as a vector.
Definition PNeXus.h:1345
std::vector< T > & GetData()
Get mutable reference to the data vector.
Definition PNeXus.h:1351
std::map< std::string, std::any > & GetAttributes()
Get mutable reference to all attributes.
Definition PNeXus.h:1430
H5::DataType fDataType
HDF5 datatype of the dataset.
Definition PNeXus.h:1435
PNXdata(const H5::DataType &dataType)
Constructor with datatype.
Definition PNeXus.h:1327
H5::DataType GetDataType() const
Get the HDF5 DataType.
Definition PNeXus.h:1333
void SetDimensions(const std::vector< hsize_t > &dims)
Set the dimensions of the dataset.
Definition PNeXus.h:1369
void SetDataType(const H5::DataType &dataType)
Set the HDF5 DataType.
Definition PNeXus.h:1339
std::map< std::string, std::any > fAttributes
Attributes associated with this dataset.
Definition PNeXus.h:1438
std::any GetAttribute(const std::string &name) const
Get an attribute by name.
Definition PNeXus.h:1405
const std::map< std::string, std::any > & GetAttributes() const
Get all attributes.
Definition PNeXus.h:1422
void AddAttribute(const std::string &name, const std::any &value)
Add an attribute to this dataset.
Definition PNeXus.h:1395
std::vector< T > fData
Data storage (flattened multi-dimensional array)
Definition PNeXus.h:1436
PNXdata()
Default constructor.
Definition PNeXus.h:1321
const std::vector< hsize_t > & GetDimensions() const
Get the dimensions of the dataset.
Definition PNeXus.h:1363
size_t GetNumElements() const
Get total number of elements.
Definition PNeXus.h:1381
std::vector< hsize_t > fDimensions
Dimensions of the dataset.
Definition PNeXus.h:1437
size_t GetRank() const
Get the number of dimensions.
Definition PNeXus.h:1375
void SetData(const std::vector< T > &data)
Set the data vector.
Definition PNeXus.h:1357
bool HasAttribute(const std::string &name) const
Check if an attribute exists.
Definition PNeXus.h:1414
bool fValid
Validity flag - true if required data was loaded successfully.
Definition PNeXus.h:1272
unsigned int fIdx
Current spectrum index being minimized.
Definition PNeXus.h:1283
std::vector< int > fCounts
Count data for minimization.
Definition PNeXus.h:1281
double fUp
UP parameter for Minuit2 (0.5 for chi-square)
Definition PNeXus.h:1282
int fGoodFrames
Number of good time frames for analysis.
Definition PNeXus.h:1273
bool IsValid()
Check if the dead time calculator was initialized successfully.
Definition PNeXus.h:1215
PNeXusDeadTime(const PNeXus *nxs, bool debug=false)
Constructor - initializes dead time calculator from NeXus data.
Definition PNeXus.cpp:2793
std::vector< hsize_t > fDims
Dimensions of count data [periods, spectra, bins].
Definition PNeXus.h:1275
const std::vector< hsize_t > & GetDimensions() const
Get the dimensions of the count dataset.
Definition PNeXus.h:1251
int fT0Bin
T0 bin number (time zero reference)
Definition PNeXus.h:1276
double operator()(const std::vector< double > &par) const
Function call operator - calculates chi-square for given parameters.
Definition PNeXus.cpp:2920
void Minimize(const int i)
Minimize dead time for a specific detector spectrum.
Definition PNeXus.cpp:2960
bool fDebug
Debug flag - if true, print additional diagnostic information.
Definition PNeXus.h:1271
float fTimeResolution
Time resolution in picoseconds.
Definition PNeXus.h:1274
std::vector< float > fDeadTimeEstimated
Dead time values per detector (microseconds) as estimated from the data.
Definition PNeXus.h:1280
double Up() const
Get the error definition for the minimizer (FCNBase requirement)
Definition PNeXus.h:1223
int fFgbBin
First good bin for analysis.
Definition PNeXus.h:1277
std::vector< float > GetDeadTimeEstimated()
Get the estimated dead time values from minimization.
Definition PNeXus.h:1268
std::vector< float > fDeadTime
Dead time values per detector (microseconds) from the file.
Definition PNeXus.h:1279
int fLgbBin
Last good bin for analysis.
Definition PNeXus.h:1278
NeXus HDF5 file reader with case-insensitive path lookup.
Definition PNeXus.h:1463
std::string GetFileName() const
Get the filename of the NeXus file.
Definition PNeXus.h:1514
void WriteFloatDataset(H5::H5File &file, const std::string &path, const PNXdata< float > &data)
Write a float dataset with attributes.
Definition PNeXus.cpp:5248
void HandleIdfV2(H5::H5File &file)
Read datasets for IDF version 2 file structure.
Definition PNeXus.cpp:3693
std::string GetNeXusVersion() const
Get the NeXus version of the file.
Definition PNeXus.h:1532
std::map< std::string, std::any > & GetDataMap()
Get mutable reference to the data map.
Definition PNeXus.h:1559
std::string FindGroupPath(H5::H5File &parent, const std::string &requestedPath)
Definition PNeXus.cpp:3131
void Dump()
Definition PNeXus.cpp:3761
std::string fCreatorNxs
Definition PNeXus.h:1882
void HandleIdfV1(H5::H5File &file)
Read datasets for IDF version 1 file structure.
Definition PNeXus.cpp:3631
std::string fFileTimeNxs
Definition PNeXus.h:1881
bool HasDataset(const std::string &path) const
Check if a dataset path exists in the data map.
Definition PNeXus.h:1566
bool RemoveDatasetAttribute(const std::string &path, const std::string &attrName)
Remove an attribute from a dataset.
Definition PNeXus.h:1697
std::string FindAttributeName(H5::H5File &obj, const std::string &requestedName)
Definition PNeXus.cpp:3090
bool RemoveGroupAttribute(const std::string &groupPath, const std::string &attrName)
Remove an attribute from a group.
Definition PNeXus.cpp:5619
void WriteFileAttributes(H5::H5File &file)
Write root-level file attributes.
Definition PNeXus.cpp:5479
bool AddRootAttribute(const std::string &attrName, const std::any &attrValue)
Definition PNeXus.cpp:5712
void ReadFloatDataset(H5::H5File &file, const std::string &path)
Read a float dataset and store in data map.
Definition PNeXus.cpp:4835
std::string fFileName
NeXus HDF5 filename.
Definition PNeXus.h:1875
bool ModifyDataset(const std::string &path, const std::vector< T > &newData, const std::vector< hsize_t > &newDimensions)
Modify an existing dataset's data and dimensions.
Definition PNeXus.h:1743
int ReadNexusFile()
Read and parse the NeXus HDF5 file.
Definition PNeXus.cpp:3531
std::string fHdf5Version
HDF5 version of the file.
Definition PNeXus.h:1878
std::map< std::string, std::map< std::string, std::any > > fGroupAttributes
Map of group paths to their attributes.
Definition PNeXus.h:1885
void ReadIntDataset(H5::H5File &file, const std::string &path)
Read an integer dataset and store in data map.
Definition PNeXus.cpp:4769
const std::map< std::string, std::any > & GetDataMap() const
Get the data map containing all datasets.
Definition PNeXus.h:1553
void WriteGroupAttributes(H5::Group &group, const std::map< std::string, std::any > &attributes)
Write attributes to a group.
Definition PNeXus.cpp:5396
void WriteDatasetAttributes(H5::DataSet &dataset, const PNXdata< T > &data)
Write dataset attributes from PNXdata object.
Definition PNeXus.cpp:5089
static std::vector< std::string > SplitPath(const std::string &path)
Definition PNeXus.cpp:3052
bool AddGroupAttribute(const std::string &groupPath, const std::string &attrName, const std::any &attrValue)
Definition PNeXus.cpp:5605
int GetIdfVersion() const
Get the Idf version of the file.
Definition PNeXus.h:1538
void ReadDatasetAttributes(H5::DataSet &dataset, PNXdata< T > &data)
Read dataset attributes and add to PNXdata object.
Definition PNeXus.cpp:4971
H5::Group CreateGroupHierarchy(H5::H5File &file, const std::string &path)
Create nested group hierarchy for a given path.
Definition PNeXus.cpp:5027
void WriteIntDataset(H5::H5File &file, const std::string &path, const PNXdata< int > &data)
Write an integer dataset with attributes.
Definition PNeXus.cpp:5176
bool HasGroupAttribute(const std::string &groupPath, const std::string &attrName) const
Check if a group has a specific attribute.
Definition PNeXus.cpp:5648
std::map< std::string, std::any > fDataMap
Map of HDF5 paths to PNXdata objects.
Definition PNeXus.h:1884
bool ClearGroupAttributes(const std::string &groupPath)
Clear all attributes from a group.
Definition PNeXus.cpp:5693
void ReadStringDataset(H5::H5File &file, const std::string &path)
Read a string dataset and store in data map.
Definition PNeXus.cpp:4900
size_t GetNumDatasets() const
Get the number of datasets in the data map.
Definition PNeXus.h:1628
bool AddDataset(const std::string &path, const std::vector< T > &data, const std::vector< hsize_t > &dimensions, const H5::DataType &dataType=H5::PredType::NATIVE_INT)
Create and add a new dataset with data, dimensions, and optional attributes.
Definition PNeXus.h:1723
std::string fHdf5LibVersion
HDF5 library version used when calling PNeXus.
Definition PNeXus.h:1877
void SetDataset(const std::string &path, const PNXdata< T > &data)
Add or update a dataset in the data map.
Definition PNeXus.h:1575
const std::map< std::string, std::any > & GetGroupAttributes(const std::string &groupPath) const
Get all attributes for a group.
Definition PNeXus.cpp:5677
bool UpdateDatasetData(const std::string &path, const std::vector< T > &newData)
Update the data of an existing dataset.
Definition PNeXus.h:1638
bool fPrintDebug
if true print additional debug information
Definition PNeXus.h:1874
std::any GetGroupAttribute(const std::string &groupPath, const std::string &attrName) const
Get an attribute value from a group.
Definition PNeXus.cpp:5666
PNXdata< T > GetDataset(const std::string &path) const
Get a dataset from the data map.
Definition PNeXus.h:1588
bool UpdateDatasetDimensions(const std::string &path, const std::vector< hsize_t > &newDimensions)
Update the dimensions of an existing dataset.
Definition PNeXus.h:1657
int fIdfVersion
IDF version of the NeXus file.
Definition PNeXus.h:1876
std::string GetHdf5LibVersion() const
Get the HDF5 library version string.
Definition PNeXus.h:1520
std::string GetHdf5Version() const
Get the HDF5 version string from the file.
Definition PNeXus.h:1526
std::string FindDatasetPath(H5::H5File &parent, const std::string &requestedPath)
Definition PNeXus.cpp:3292
void ClearDataMap()
Clear all datasets from the data map.
Definition PNeXus.h:1622
PNXdata< T > & GetDatasetRef(const std::string &path)
Get a mutable reference to a dataset in the data map.
Definition PNeXus.h:1601
int WriteNexusFile(const std::string &filename, int idfVersion=2)
Definition PNeXus.cpp:5731
std::string fUserV1
Definition PNeXus.h:1883
std::string fFileNameNxs
Definition PNeXus.h:1880
void WriteStringDataset(H5::H5File &file, const std::string &path, const PNXdata< std::string > &data)
Write a string dataset with attributes.
Definition PNeXus.cpp:5321
std::string fNeXusVersion
NeXus version of the file.
Definition PNeXus.h:1879
static bool CaseInsensitiveEquals(const std::string &a, const std::string &b)
Compare two strings case-insensitively.
Definition PNeXus.cpp:3015
bool RemoveDataset(const std::string &path)
Remove a dataset from the data map.
Definition PNeXus.h:1610
bool AddDatasetAttribute(const std::string &path, const std::string &attrName, const std::any &attrValue)
Add or update an attribute for a dataset.
Definition PNeXus.h:1677
HDF4 implementation of the NeXus file reader/writer.
H4DataType
HDF4 data type enumeration.
Definition PNeXus.h:329
@ kUINT8
8-bit unsigned integer (DFNT_UINT8)
Definition PNeXus.h:338
@ kFLOAT32
32-bit floating point (DFNT_FLOAT32)
Definition PNeXus.h:331
@ kUINT16
16-bit unsigned integer (DFNT_UINT16)
Definition PNeXus.h:336
@ kINT16
16-bit signed integer (DFNT_INT16)
Definition PNeXus.h:335
@ kUINT32
32-bit unsigned integer (DFNT_UINT32)
Definition PNeXus.h:334
@ kINT8
8-bit signed integer (DFNT_INT8)
Definition PNeXus.h:337
@ kCHAR8
8-bit character (DFNT_CHAR8)
Definition PNeXus.h:333
@ kFLOAT64
64-bit floating point (DFNT_FLOAT64)
Definition PNeXus.h:332
@ kINT32
32-bit signed integer (DFNT_INT32)
Definition PNeXus.h:330
HDF5 implementation of the NeXus file reader/writer.
Common utilities for NeXus file handling.
HDFType
Enumeration of supported HDF file types.
Definition PNeXus.h:141
@ HDF5
HDF5 format (magic: 0x89 'H' 'D' 'F' 0x0d 0x0a 0x1a 0x0a)
Definition PNeXus.h:143
@ Unknown
Unrecognized file format.
Definition PNeXus.h:144
@ HDF4
HDF4 format (magic: 0x0e 0x03 0x13 0x01)
Definition PNeXus.h:142
HDFType checkHDFType(const std::string &filename)
Determine the HDF format type of a file by reading its header.
Definition PNeXus.cpp:100
std::string getIso8601TimestampLocal()
get the current time and return it as na IOS8601 time stamp.
Definition PNeXus.cpp:139