nxswriter 3.10.0__tar.gz → 3.11.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {nxswriter-3.10.0 → nxswriter-3.11.1}/.ci/install.sh +25 -14
- {nxswriter-3.10.0 → nxswriter-3.11.1}/.github/workflows/tests.yml +1 -1
- {nxswriter-3.10.0 → nxswriter-3.11.1}/ChangeLog +8 -0
- nxswriter-3.11.1/PKG-INFO +273 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/nxswriter/Release.py +1 -1
- {nxswriter-3.10.0 → nxswriter-3.11.1}/nxswriter/TangoDataWriter.py +17 -1
- nxswriter-3.11.1/nxswriter.egg-info/PKG-INFO +273 -0
- nxswriter-3.10.0/PKG-INFO +0 -274
- nxswriter-3.10.0/nxswriter.egg-info/PKG-INFO +0 -274
- {nxswriter-3.10.0 → nxswriter-3.11.1}/.ci/debian10_py2/Dockerfile +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/.ci/debian10_py3/Dockerfile +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/.ci/debian11_py3/Dockerfile +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/.ci/debian8_py2/Dockerfile +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/.ci/debian8_py3/Dockerfile +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/.ci/debian9_py2/Dockerfile +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/.ci/debian9_py3/Dockerfile +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/.ci/run.sh +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/.ci/ubuntu16.04_py2/Dockerfile +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/.ci/ubuntu16.04_py3/Dockerfile +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/.ci/ubuntu18.04_py2/Dockerfile +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/.ci/ubuntu18.04_py3/Dockerfile +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/.ci/ubuntu20.04_py3/Dockerfile +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/.flake8 +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/.gitignore +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/COPYRIGHT +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/MANIFEST.in +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/NXSDataWriter +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/NXSDataWriter.xmi +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/README.rst +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/XMLExamples/MNI.xml +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/XMLExamples/encodedImage.xml +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/XMLExamples/encodedImage4.xml +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/XMLExamples/scan.xml +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/XMLExamples/scan2.xml +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/XMLExamples/scan3.xml +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/XMLExamples/test.xml +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/XMLExamples/trigger.xml +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/doc/Makefile +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/doc/conf.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/doc/index.rst +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/doc/make.bat +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/doc/nxswriter.rst +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/doc_html/AttrCanFail.html +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/doc_html/AttrCurrentFileId.html +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/doc_html/AttrErrors.html +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/doc_html/AttrFileName.html +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/doc_html/AttrJSONRecord.html +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/doc_html/AttrSkipAcquisition.html +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/doc_html/AttrStepsPerFile.html +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/doc_html/AttrXMLSettings.html +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/doc_html/Attributes.html +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/doc_html/ClassDescription.html +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/doc_html/CmdCloseEntry.html +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/doc_html/CmdCloseEntryAsynch.html +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/doc_html/CmdCloseFile.html +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/doc_html/CmdOpenEntry.html +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/doc_html/CmdOpenEntryAsynch.html +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/doc_html/CmdOpenFile.html +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/doc_html/CmdRecord.html +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/doc_html/CmdRecordAsynch.html +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/doc_html/CmdState.html +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/doc_html/CmdStatus.html +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/doc_html/Commands.html +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/doc_html/FullDocument.html +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/doc_html/Properties.html +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/doc_html/States.html +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/doc_html/TitleBanner.html +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/doc_html/index.html +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/man/NXSDataWriter.1 +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/man/nxsfromxml.1 +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/man/nxswriter.1 +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/nxsfromxml +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/nxswriter/ClientSource.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/nxswriter/DBaseSource.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/nxswriter/DataHolder.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/nxswriter/DataSourceFactory.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/nxswriter/DataSourcePool.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/nxswriter/DataSources.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/nxswriter/DecoderPool.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/nxswriter/EAttribute.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/nxswriter/EField.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/nxswriter/EGroup.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/nxswriter/ELink.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/nxswriter/EStrategy.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/nxswriter/Element.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/nxswriter/ElementThread.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/nxswriter/Errors.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/nxswriter/FElement.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/nxswriter/FetchNameHandler.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/nxswriter/H5Elements.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/nxswriter/InnerXMLParser.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/nxswriter/Metadata.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/nxswriter/NXSFromXML.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/nxswriter/NXSWriter.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/nxswriter/NexusXMLHandler.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/nxswriter/PyEvalSource.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/nxswriter/StreamSet.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/nxswriter/TangoSource.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/nxswriter/ThreadPool.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/nxswriter/Types.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/nxswriter/__init__.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/nxswriter.egg-info/SOURCES.txt +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/nxswriter.egg-info/dependency_links.txt +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/nxswriter.egg-info/not-zip-safe +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/nxswriter.egg-info/requires.txt +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/nxswriter.egg-info/top_level.txt +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/setup.cfg +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/setup.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/Checkers.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/ClientFieldTagAsynchH5Cpp_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/ClientFieldTagAsynchH5PY_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/ClientFieldTagServerH5Cpp_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/ClientFieldTagServerH5PY_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/ClientFieldTagWriterH5Cpp_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/ClientFieldTagWriterH5PY_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/ClientSource_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/Converters_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/DBFieldTagAsynchH5Cpp_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/DBFieldTagAsynchH5PY_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/DBFieldTagServerH5Cpp_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/DBFieldTagServerH5PY_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/DBFieldTagWriterH5Cpp_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/DBFieldTagWriterH5PY_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/DBaseSource_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/DataHolder_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/DataSourceDecoders_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/DataSourceFactory_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/DataSourcePool_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/DataSource_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/DecoderPool_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/EAttributeH5Cpp_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/EAttributeH5PY_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/EDimH5Cpp_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/EDimH5PY_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/EDimensionsH5Cpp_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/EDimensionsH5PY_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/EDocH5Cpp_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/EDocH5PY_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/EFieldH5Cpp_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/EFieldH5PY_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/EFieldReshapeH5Cpp_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/EFieldReshapeH5PY_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/EFileH5Cpp_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/EFileH5PY_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/EGroupH5Cpp_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/EGroupH5PY_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/ELinkH5Cpp_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/ELinkH5PY_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/EStrategyH5Cpp_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/EStrategyH5PY_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/ESymbolH5Cpp_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/ESymbolH5PY_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/ElementH5Cpp_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/ElementH5PY_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/ElementThread_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/Element_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/Errors_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/FElementH5Cpp_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/FElementH5PY_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/FElementWithAttrH5Cpp_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/FElementWithAttrH5PY_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/FetchNameHandler_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/FileWriterH5CppH5PY_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/FileWriterH5Cpp_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/FileWriterH5PY_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/H5CppWriter_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/H5PYWriter_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/InnerXMLParser_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/MYSQLSource_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/NTP_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/NXSDataWriterH5Cpp_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/NXSDataWriterH5PY_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/NXSFromXMLH5Cpp_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/NXSFromXMLH5PY_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/NexusXMLHandlerH5Cpp_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/NexusXMLHandlerH5PY_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/ORACLESource_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/PGSQLSource_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/ProxyHelper.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/ProxyTools_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/PyEvalSource_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/PyEvalTangoSourceH5Cpp_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/PyEvalTangoSourceH5PY_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/ServerSetUp.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/SimpleServer.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/SimpleServerSetUp.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/StreamSet_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/TNObject_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/TangoClassID.txt +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/TangoDataWriterH5CppH5PY_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/TangoDataWriterH5Cpp_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/TangoDataWriterH5PY_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/TangoFieldTagAsynchH5Cpp_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/TangoFieldTagAsynchH5PY_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/TangoFieldTagServerH5Cpp_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/TangoFieldTagServerH5PY_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/TangoFieldTagWriterH5Cpp_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/TangoFieldTagWriterH5PY_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/TangoSource_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/TgDevice_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/TgGroup_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/TgMember_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/ThreadPool_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/TstDataSource.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/UINT32decoder_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/UTF8decoder_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/VDEOdecoder_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/XMLFieldTagAsynchH5Cpp_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/XMLFieldTagAsynchH5PY_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/XMLFieldTagServerH5Cpp_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/XMLFieldTagServerH5PY_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/XMLFieldTagWriterH5Cpp_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/XMLFieldTagWriterH5PY_test.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/__init__.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/__main__.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/main.py +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/mydb.pgsql +0 -0
- {nxswriter-3.10.0 → nxswriter-3.11.1}/test/sttest.py +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
2
|
|
|
3
3
|
# restart mysqldb
|
|
4
|
-
if [ "$1" = "debian11" ] || [ "$1" = "debian12" ]; then
|
|
4
|
+
if [ "$1" = "debian11" ] || [ "$1" = "debian12" ] || [ "$1" = "ubuntu24.04" ]; then
|
|
5
5
|
docker exec --user root ndts service mariadb restart
|
|
6
6
|
else
|
|
7
7
|
# workaround for a bug in debian9, i.e. starting mysql hangs
|
|
@@ -15,24 +15,35 @@ else
|
|
|
15
15
|
# docker exec --user root ndts /bin/bash -c '$(service mysql start &) && sleep 30'
|
|
16
16
|
fi
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
docker exec
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
18
|
+
echo "install tango-common"
|
|
19
|
+
docker exec --user root ndts /bin/bash -c 'apt-get -qq update; export DEBIAN_FRONTEND=noninteractive; apt-get -qq install -y tango-common; sleep 10'
|
|
20
|
+
if [ "$1" = "ubuntu24.04" ]; then
|
|
21
|
+
# docker exec --user tango ndts /bin/bash -c '/usr/lib/tango/DataBaseds 2 -ORBendPoint giop:tcp::10000 &'
|
|
22
|
+
docker exec --user root ndts /bin/bash -c 'echo -e "[client]\nuser=root\npassword=rootpw" > /root/.my.cnf'
|
|
23
|
+
docker exec --user root ndts /bin/bash -c 'echo -e "[client]\nuser=tango\nhost=localhost\npassword=rootpw" > /var/lib/tango/.my.cnf'
|
|
24
|
+
docker exec --user root ndts /usr/bin/mysql -e 'GRANT ALL PRIVILEGES ON tango.* TO "tango"@"%" identified by "rootpw"'
|
|
25
|
+
docker exec --user root ndts /usr/bin/mysql -e 'GRANT ALL PRIVILEGES ON tango.* TO "tango"@"localhost" identified by "rootpw"'
|
|
26
|
+
docker exec --user root ndts /usr/bin/mysql -e 'FLUSH PRIVILEGES'
|
|
27
|
+
fi
|
|
28
|
+
if [ "$1" = "ubuntu20.04" ] || [ "$1" = "ubuntu20.10" ] || [ "$1" = "ubuntu21.04" ] || [ "$1" = "ubuntu21.10" ] || [ "$1" = "ubuntu22.04" ]; then
|
|
27
29
|
# docker exec --user tango ndts /bin/bash -c '/usr/lib/tango/DataBaseds 2 -ORBendPoint giop:tcp::10000 &'
|
|
28
|
-
docker exec --user root ndts /bin/bash -c 'echo -e "[client]\nuser=tango\nhost=127.0.0.1\npassword=rootpw" > /var/lib/tango/.my.cnf'
|
|
29
30
|
docker exec --user root ndts /bin/bash -c 'echo -e "[client]\nuser=root\npassword=rootpw" > /root/.my.cnf'
|
|
31
|
+
docker exec --user root ndts /bin/bash -c 'echo -e "[client]\nuser=tango\nhost=127.0.0.1\npassword=rootpw" > /var/lib/tango/.my.cnf'
|
|
32
|
+
fi
|
|
33
|
+
echo "install tango-db"
|
|
34
|
+
docker exec --user root ndts /bin/bash -c 'apt-get -qq update; export DEBIAN_FRONTEND=noninteractive; apt-get -qq install -y tango-db; sleep 10'
|
|
35
|
+
if [ "$?" -ne "0" ]; then exit 255; fi
|
|
36
|
+
if [ "$1" = "ubuntu24.04" ]; then
|
|
37
|
+
docker exec --user tango ndts /usr/bin/mysql -e 'create database tango'
|
|
38
|
+
docker exec --user tango ndts /bin/bash -c '/usr/bin/mysql tango < /usr/share/dbconfig-common/data/tango-db/install/mysql'
|
|
30
39
|
fi
|
|
40
|
+
|
|
31
41
|
docker exec --user root ndts service tango-db restart
|
|
32
42
|
|
|
43
|
+
|
|
33
44
|
echo "install tango servers"
|
|
34
|
-
docker exec --user root ndts /bin/
|
|
35
|
-
if [ "$?"
|
|
45
|
+
docker exec --user root ndts /bin/bash -c 'apt-get -qq update; export DEBIAN_FRONTEND=noninteractive; apt-get -qq install -y tango-starter tango-test liblog4j1.2-java'
|
|
46
|
+
if [ "$?" -ne "0" ]; then exit 255; fi
|
|
36
47
|
|
|
37
48
|
# restart tango services
|
|
38
49
|
docker exec --user root ndts service tango-starter restart
|
|
@@ -43,7 +54,7 @@ if [ "$2" = "2" ]; then
|
|
|
43
54
|
docker exec --user root ndts /bin/sh -c 'apt-get -qq update; apt-get -qq install -y python-pytango nxsconfigserver-db python-nxstools'
|
|
44
55
|
else
|
|
45
56
|
echo "install python3-pytango"
|
|
46
|
-
if [ "$1" = "ubuntu20.04" ] || [ "$1" = "ubuntu20.10" ] || [ "$1" = "ubuntu21.04" ] || [ "$1" = "ubuntu23.10" ] || [ "$1" = "ubuntu22.04" ] || [ "$1" = "debian11" ] || [ "$1" = "debian12" ]; then
|
|
57
|
+
if [ "$1" = "ubuntu20.04" ] || [ "$1" = "ubuntu20.10" ] || [ "$1" = "ubuntu21.04" ] || [ "$1" = "ubuntu24.04" ] || [ "$1" = "ubuntu23.10" ] || [ "$1" = "ubuntu22.04" ] || [ "$1" = "debian11" ] || [ "$1" = "debian12" ]; then
|
|
47
58
|
docker exec --user root ndts /bin/sh -c 'apt-get -qq update; apt-get -qq install -y python3-tango nxsconfigserver-db python3-nxstools'
|
|
48
59
|
else
|
|
49
60
|
docker exec --user root ndts /bin/sh -c 'apt-get -qq update; apt-get -qq install -y python3-pytango nxsconfigserver-db python3-nxstools'
|
|
@@ -24,7 +24,7 @@ jobs:
|
|
|
24
24
|
runs-on: ubuntu-latest
|
|
25
25
|
strategy:
|
|
26
26
|
matrix:
|
|
27
|
-
os: [debian12, debian11, debian10,
|
|
27
|
+
os: [debian12, debian11, debian10, ubuntu24.04, ubuntu22.04, ubuntu20.04]
|
|
28
28
|
steps:
|
|
29
29
|
- uses: actions/checkout@v2
|
|
30
30
|
- uses: actions/setup-python@v2
|
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
2023-11-09 Jan Kotanski <jankotan@gmail.com>
|
|
2
|
+
* call finish on writer if exists (#165)
|
|
3
|
+
* tagged as 3.11.1
|
|
4
|
+
|
|
5
|
+
2023-11-09 Jan Kotanski <jankotan@gmail.com>
|
|
6
|
+
* add support for h5redis writer (#165)
|
|
7
|
+
* tagged as 3.11.0
|
|
8
|
+
|
|
1
9
|
2023-11-09 Jan Kotanski <jankotan@gmail.com>
|
|
2
10
|
* change tango.Device_4Impl to tango.LatestDeviceImpl (#160)
|
|
3
11
|
* tagged as 3.10.0
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: nxswriter
|
|
3
|
+
Version: 3.11.1
|
|
4
|
+
Summary: Nexus Data writer implemented as a Tango Server
|
|
5
|
+
Home-page: https://github.com/nexdatas/nxsdatawriter
|
|
6
|
+
Author: Jan Kotanski, Eugen Wintersberger , Halil Pasic
|
|
7
|
+
Author-email: jankotan@gmail.com, eugen.wintersberger@gmail.com, halil.pasic@gmail.com
|
|
8
|
+
License: GNU GENERAL PUBLIC LICENSE v3
|
|
9
|
+
Keywords: writer Tango server nexus data
|
|
10
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
11
|
+
Classifier: Intended Audience :: Science/Research
|
|
12
|
+
Classifier: Topic :: Scientific/Engineering :: Physics
|
|
13
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
14
|
+
Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
|
|
15
|
+
Classifier: Programming Language :: Python :: 2.7
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.4
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.5
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.6
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.7
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.8
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
23
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
24
|
+
|
|
25
|
+
Welcome to NXSDataWriter's documentation!
|
|
26
|
+
=========================================
|
|
27
|
+
|
|
28
|
+
|github workflow|
|
|
29
|
+
|docs|
|
|
30
|
+
|Pypi Version|
|
|
31
|
+
|Python Versions|
|
|
32
|
+
|
|
33
|
+
.. |github workflow| image:: https://github.com/nexdatas/nxsdatawriter/actions/workflows/tests.yml/badge.svg
|
|
34
|
+
:target: https://github.com/nexdatas/nxsdatawriter/actions
|
|
35
|
+
:alt:
|
|
36
|
+
|
|
37
|
+
.. |docs| image:: https://img.shields.io/badge/Documentation-webpages-ADD8E6.svg
|
|
38
|
+
:target: https://nexdatas.github.io/nxsdatawriter/index.html
|
|
39
|
+
:alt:
|
|
40
|
+
|
|
41
|
+
.. |Pypi Version| image:: https://img.shields.io/pypi/v/nxswriter.svg
|
|
42
|
+
:target: https://pypi.python.org/pypi/nxswriter
|
|
43
|
+
:alt:
|
|
44
|
+
|
|
45
|
+
.. |Python Versions| image:: https://img.shields.io/pypi/pyversions/nxswriter.svg
|
|
46
|
+
:target: https://pypi.python.org/pypi/nxswriter/
|
|
47
|
+
:alt:
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
Authors: Jan Kotanski, Eugen Wintersberger, Halil Pasic
|
|
51
|
+
|
|
52
|
+
------------
|
|
53
|
+
Introduction
|
|
54
|
+
------------
|
|
55
|
+
|
|
56
|
+
NXSDataWriter is a Tango server which allows to store NeXuS Data in H5 files.
|
|
57
|
+
|
|
58
|
+
The server provides storing data from other Tango devices,
|
|
59
|
+
various databases as well as passed by a user client via JSON strings.
|
|
60
|
+
|
|
61
|
+
Tango Server API: https://nexdatas.github.io/nxsdatawriter/doc_html
|
|
62
|
+
|
|
63
|
+
| Source code: https://github.com/nexdatas/nxsdatawriter
|
|
64
|
+
| Project Web page: https://nexdatas.github.io/nxsdatawriter
|
|
65
|
+
| NexDaTaS Web page: https://nexdatas.github.io
|
|
66
|
+
|
|
67
|
+
------------
|
|
68
|
+
Installation
|
|
69
|
+
------------
|
|
70
|
+
|
|
71
|
+
Install the dependencies:
|
|
72
|
+
|
|
73
|
+
| pninexus or h5py, tango, numpy, nxstools, sphinx
|
|
74
|
+
|
|
75
|
+
From sources
|
|
76
|
+
""""""""""""
|
|
77
|
+
|
|
78
|
+
Download the latest NexDaTaS version from
|
|
79
|
+
|
|
80
|
+
| https://github.com/nexdatas/nxsdatawriter
|
|
81
|
+
|
|
82
|
+
Extract sources and run
|
|
83
|
+
|
|
84
|
+
.. code-block:: console
|
|
85
|
+
|
|
86
|
+
$ python setup.py install
|
|
87
|
+
|
|
88
|
+
Debian packages
|
|
89
|
+
"""""""""""""""
|
|
90
|
+
|
|
91
|
+
Debian `bookworm`, `bullseye`, `buster` or Ubuntu `lunar`, `jammy`, `focal` packages can be found in the HDRI repository.
|
|
92
|
+
|
|
93
|
+
To install the debian packages, add the PGP repository key
|
|
94
|
+
|
|
95
|
+
.. code-block:: console
|
|
96
|
+
|
|
97
|
+
$ sudo su
|
|
98
|
+
$ curl -s http://repos.pni-hdri.de/debian_repo.pub.gpg | gpg --no-default-keyring --keyring gnupg-ring:/etc/apt/trusted.gpg.d/debian-hdri-repo.gpg --import
|
|
99
|
+
$ chmod 644 /etc/apt/trusted.gpg.d/debian-hdri-repo.gpg
|
|
100
|
+
|
|
101
|
+
and then download the corresponding source list
|
|
102
|
+
|
|
103
|
+
.. code-block:: console
|
|
104
|
+
|
|
105
|
+
$ cd /etc/apt/sources.list.d
|
|
106
|
+
$ wget http://repos.pni-hdri.de/bookworm-pni-hdri.list
|
|
107
|
+
|
|
108
|
+
To install tango server
|
|
109
|
+
|
|
110
|
+
.. code-block:: console
|
|
111
|
+
|
|
112
|
+
$ apt-get update
|
|
113
|
+
$ apt-get install nxswriter
|
|
114
|
+
|
|
115
|
+
or
|
|
116
|
+
|
|
117
|
+
.. code-block:: console
|
|
118
|
+
|
|
119
|
+
$ apt-get update
|
|
120
|
+
$ apt-get install nxswriter3
|
|
121
|
+
|
|
122
|
+
for older python3 releases.
|
|
123
|
+
|
|
124
|
+
To install only the python3 package
|
|
125
|
+
|
|
126
|
+
.. code-block:: console
|
|
127
|
+
|
|
128
|
+
$ apt-get update
|
|
129
|
+
$ apt-get install python3-nxswriter
|
|
130
|
+
|
|
131
|
+
and for python2
|
|
132
|
+
|
|
133
|
+
.. code-block:: console
|
|
134
|
+
|
|
135
|
+
$ apt-get update
|
|
136
|
+
$ apt-get install python-nxswriter
|
|
137
|
+
|
|
138
|
+
if exists.
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
From pip
|
|
143
|
+
""""""""
|
|
144
|
+
|
|
145
|
+
To install it from pip you can
|
|
146
|
+
|
|
147
|
+
.. code-block:: console
|
|
148
|
+
|
|
149
|
+
$ python3 -m venv myvenv
|
|
150
|
+
$ . myvenv/bin/activate
|
|
151
|
+
|
|
152
|
+
$ pip install nxswriter
|
|
153
|
+
|
|
154
|
+
Moreover it is also good to install
|
|
155
|
+
|
|
156
|
+
.. code-block:: console
|
|
157
|
+
|
|
158
|
+
$ pip install pytango
|
|
159
|
+
$ pip install pymysqldb
|
|
160
|
+
$ pip install psycopg2-binary
|
|
161
|
+
$ pip install cx-oracle
|
|
162
|
+
|
|
163
|
+
Setting NeXus Writer Server
|
|
164
|
+
"""""""""""""""""""""""""""
|
|
165
|
+
|
|
166
|
+
To set up NeXus Writer Server run
|
|
167
|
+
|
|
168
|
+
.. code-block:: console
|
|
169
|
+
|
|
170
|
+
$ nxsetup -x NXSDataWriter
|
|
171
|
+
|
|
172
|
+
The *nxsetup* command comes from the **python-nxstools** package.
|
|
173
|
+
|
|
174
|
+
-----------
|
|
175
|
+
Client code
|
|
176
|
+
-----------
|
|
177
|
+
|
|
178
|
+
In order to use Nexus Data Server one has to write a client code. Some simple client codes
|
|
179
|
+
are in the nexdatas repository. In this section we add some
|
|
180
|
+
comments related to the client code.
|
|
181
|
+
|
|
182
|
+
.. code-block:: python
|
|
183
|
+
|
|
184
|
+
# To use the Tango Server we must import the tango module and
|
|
185
|
+
# create DeviceProxy for the server.
|
|
186
|
+
|
|
187
|
+
import tango
|
|
188
|
+
|
|
189
|
+
device = "p09/tdw/r228"
|
|
190
|
+
dpx = tango.DeviceProxy(device)
|
|
191
|
+
dpx.set_timeout_millis(10000)
|
|
192
|
+
|
|
193
|
+
dpx.Init()
|
|
194
|
+
|
|
195
|
+
# Here device corresponds to a name of our Nexus Data Server.
|
|
196
|
+
# The Init() method resets the state of the server.
|
|
197
|
+
|
|
198
|
+
dpx.FileName = "test.h5"
|
|
199
|
+
dpx.OpenFile()
|
|
200
|
+
|
|
201
|
+
# We set the name of the output HDF5 file and open it.
|
|
202
|
+
|
|
203
|
+
# Now we are ready to pass the XML settings describing a structure of
|
|
204
|
+
# the output file as well as defining a way of data storing.
|
|
205
|
+
# Examples of the XMLSettings can be found in the XMLExamples directory.
|
|
206
|
+
|
|
207
|
+
with open("test.xml", 'r') as fl:
|
|
208
|
+
xml = fl.read()
|
|
209
|
+
dpx.XMLSettings = xml
|
|
210
|
+
|
|
211
|
+
dpx.JSONRecord = '{"data": {"parameterA":0.2},
|
|
212
|
+
"decoders":{"DESY2D":"desydecoders.desy2Ddec.desy2d"},
|
|
213
|
+
"datasources":{
|
|
214
|
+
"MCLIENT":"sources.DataSources.LocalClientSource"}
|
|
215
|
+
}'
|
|
216
|
+
|
|
217
|
+
dpx.OpenEntry()
|
|
218
|
+
|
|
219
|
+
# We read our XML settings settings from a file and pass them to the server via
|
|
220
|
+
# the XMLSettings attribute. Then we open an entry group related to the XML
|
|
221
|
+
# configuration. Optionally, we can also set JSONRecord, i.e. an attribute
|
|
222
|
+
# which contains a global JSON string with data needed to store during opening
|
|
223
|
+
# the entry and also other stages of recording. If external decoder for
|
|
224
|
+
# DevEncoded data is need one can registred it passing its packages and
|
|
225
|
+
# class names in JSONRecord,
|
|
226
|
+
# e.g. "desy2d" class of "DESY2D" label in "desydecoders.desy2Ddec" package.
|
|
227
|
+
# Similarly making use of "datasources" records of the JSON string one can
|
|
228
|
+
# registred additional datasources. The OpenEntry method stores data defined
|
|
229
|
+
# in the XML string with strategy=INIT.
|
|
230
|
+
# The JSONRecord attribute can be changed during recording our data.
|
|
231
|
+
|
|
232
|
+
# After finalization of the configuration process we can start recording
|
|
233
|
+
# the main experiment data in a STEP mode.
|
|
234
|
+
|
|
235
|
+
dpx.Record('{"data": {"p09/counter/exp.01":0.1, "p09/counter/exp.02":1.1}}')
|
|
236
|
+
|
|
237
|
+
# Every time we call the Record method all nexus fields defined with
|
|
238
|
+
# strategy=STEP are extended by one record unit and the assigned to them data
|
|
239
|
+
# is stored. As the method argument we pass a local JSON string with the client
|
|
240
|
+
# data. To record the client data one can also use the global JSONRecord string.
|
|
241
|
+
# Contrary to the global JSON string the local one is only
|
|
242
|
+
# valid during one record step.
|
|
243
|
+
|
|
244
|
+
dpx.Record('{"data": {"emittance_x": 0.1}, "triggers":["trigger1", "trigger2"] }')
|
|
245
|
+
|
|
246
|
+
# If you denote in your XML configuration string some fields by additional
|
|
247
|
+
# trigger attributes you may ask the server to store your data only in specific
|
|
248
|
+
# record steps. This can be helpful if you want to store your data in
|
|
249
|
+
# asynchronous mode. To this end you define in the local JSON string a list of
|
|
250
|
+
# triggers which are used in the current record step.
|
|
251
|
+
|
|
252
|
+
dpx.JSONRecord = '{"data": {"parameterB":0.3}}'
|
|
253
|
+
dpx.CloseEntry()
|
|
254
|
+
|
|
255
|
+
# After scanning experiment data in 'STEP' mode we close the entry.
|
|
256
|
+
# To this end we call the CloseEntry method which also stores data defined
|
|
257
|
+
# with strategy=FINAL. Since our HDF5 file can contain many entries we can again
|
|
258
|
+
# open the entry and repeat our record procedure. If we define more than one entry
|
|
259
|
+
# in one XML setting string the defined entries are recorded parallel
|
|
260
|
+
# with the same steps.
|
|
261
|
+
|
|
262
|
+
# Finally, we can close our output file by
|
|
263
|
+
|
|
264
|
+
dpx.CloseFile()
|
|
265
|
+
|
|
266
|
+
Additionally, one can use asynchronous versions of **OpenEntry**, **Record**, **CloseEntry**, i.e.
|
|
267
|
+
**OpenEntryAsynch**, **RecordAsynch**, **CloseEntryAsynch**. In this case data is stored
|
|
268
|
+
in a background thread and during this writing Tango Data Server has a state *RUNNING*.
|
|
269
|
+
|
|
270
|
+
In order to build the XML configurations in the easy way the authors of the server provide
|
|
271
|
+
for this purpose a specialized GUI tool, Component Designer.
|
|
272
|
+
The attached to the server XML examples
|
|
273
|
+
was created by XMLFile class defined in XMLCreator/simpleXML.py.
|
|
@@ -58,7 +58,14 @@ try:
|
|
|
58
58
|
WRITERS["h5cpp"] = H5CppWriter
|
|
59
59
|
except Exception:
|
|
60
60
|
pass
|
|
61
|
-
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
try:
|
|
64
|
+
from nxstools import h5rediswriter as H5RedisWriter
|
|
65
|
+
WRITERS["h5redis"] = H5RedisWriter
|
|
66
|
+
except Exception:
|
|
67
|
+
pass
|
|
68
|
+
DEFAULTWRITERS = ["h5cpp", "h5py", "h5redis"]
|
|
62
69
|
|
|
63
70
|
|
|
64
71
|
#: (:obj:`bool`) tango bug #213 flag related to EncodedAttributes in python3
|
|
@@ -545,6 +552,9 @@ class TangoDataWriter(object):
|
|
|
545
552
|
self.__nextfile()
|
|
546
553
|
elif "swmr" in self.__pars.keys() and self.__pars["swmr"]:
|
|
547
554
|
self.__nxFile.reopen(readonly=False, **self.__pars)
|
|
555
|
+
if self.__nxFile and hasattr(self.__nxFile, "prepare"):
|
|
556
|
+
# print("START")
|
|
557
|
+
self.__nxFile.prepare()
|
|
548
558
|
|
|
549
559
|
def __nextfile(self):
|
|
550
560
|
self.__nxFile.close()
|
|
@@ -625,6 +635,10 @@ class TangoDataWriter(object):
|
|
|
625
635
|
|
|
626
636
|
if self.__nxFile and hasattr(self.__nxFile, "flush"):
|
|
627
637
|
self.__nxFile.flush()
|
|
638
|
+
if self.__nxFile and hasattr(self.__nxFile, "start") and \
|
|
639
|
+
self.__datasources.counter == 1:
|
|
640
|
+
# print("START")
|
|
641
|
+
self.__nxFile.start()
|
|
628
642
|
if self.stepsperfile > 0:
|
|
629
643
|
if (self.__datasources.counter) % self.stepsperfile == 0:
|
|
630
644
|
self.__nextfile()
|
|
@@ -703,6 +717,8 @@ class TangoDataWriter(object):
|
|
|
703
717
|
|
|
704
718
|
if self.__nxFile and hasattr(self.__nxFile, "flush"):
|
|
705
719
|
self.__nxFile.flush()
|
|
720
|
+
if self.__nxFile and hasattr(self.__nxFile, "finish"):
|
|
721
|
+
self.__nxFile.finish()
|
|
706
722
|
|
|
707
723
|
if NXSMETA and self.__nxRoot:
|
|
708
724
|
args = {}
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: nxswriter
|
|
3
|
+
Version: 3.11.1
|
|
4
|
+
Summary: Nexus Data writer implemented as a Tango Server
|
|
5
|
+
Home-page: https://github.com/nexdatas/nxsdatawriter
|
|
6
|
+
Author: Jan Kotanski, Eugen Wintersberger , Halil Pasic
|
|
7
|
+
Author-email: jankotan@gmail.com, eugen.wintersberger@gmail.com, halil.pasic@gmail.com
|
|
8
|
+
License: GNU GENERAL PUBLIC LICENSE v3
|
|
9
|
+
Keywords: writer Tango server nexus data
|
|
10
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
11
|
+
Classifier: Intended Audience :: Science/Research
|
|
12
|
+
Classifier: Topic :: Scientific/Engineering :: Physics
|
|
13
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
14
|
+
Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
|
|
15
|
+
Classifier: Programming Language :: Python :: 2.7
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.4
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.5
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.6
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.7
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.8
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
23
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
24
|
+
|
|
25
|
+
Welcome to NXSDataWriter's documentation!
|
|
26
|
+
=========================================
|
|
27
|
+
|
|
28
|
+
|github workflow|
|
|
29
|
+
|docs|
|
|
30
|
+
|Pypi Version|
|
|
31
|
+
|Python Versions|
|
|
32
|
+
|
|
33
|
+
.. |github workflow| image:: https://github.com/nexdatas/nxsdatawriter/actions/workflows/tests.yml/badge.svg
|
|
34
|
+
:target: https://github.com/nexdatas/nxsdatawriter/actions
|
|
35
|
+
:alt:
|
|
36
|
+
|
|
37
|
+
.. |docs| image:: https://img.shields.io/badge/Documentation-webpages-ADD8E6.svg
|
|
38
|
+
:target: https://nexdatas.github.io/nxsdatawriter/index.html
|
|
39
|
+
:alt:
|
|
40
|
+
|
|
41
|
+
.. |Pypi Version| image:: https://img.shields.io/pypi/v/nxswriter.svg
|
|
42
|
+
:target: https://pypi.python.org/pypi/nxswriter
|
|
43
|
+
:alt:
|
|
44
|
+
|
|
45
|
+
.. |Python Versions| image:: https://img.shields.io/pypi/pyversions/nxswriter.svg
|
|
46
|
+
:target: https://pypi.python.org/pypi/nxswriter/
|
|
47
|
+
:alt:
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
Authors: Jan Kotanski, Eugen Wintersberger, Halil Pasic
|
|
51
|
+
|
|
52
|
+
------------
|
|
53
|
+
Introduction
|
|
54
|
+
------------
|
|
55
|
+
|
|
56
|
+
NXSDataWriter is a Tango server which allows to store NeXuS Data in H5 files.
|
|
57
|
+
|
|
58
|
+
The server provides storing data from other Tango devices,
|
|
59
|
+
various databases as well as passed by a user client via JSON strings.
|
|
60
|
+
|
|
61
|
+
Tango Server API: https://nexdatas.github.io/nxsdatawriter/doc_html
|
|
62
|
+
|
|
63
|
+
| Source code: https://github.com/nexdatas/nxsdatawriter
|
|
64
|
+
| Project Web page: https://nexdatas.github.io/nxsdatawriter
|
|
65
|
+
| NexDaTaS Web page: https://nexdatas.github.io
|
|
66
|
+
|
|
67
|
+
------------
|
|
68
|
+
Installation
|
|
69
|
+
------------
|
|
70
|
+
|
|
71
|
+
Install the dependencies:
|
|
72
|
+
|
|
73
|
+
| pninexus or h5py, tango, numpy, nxstools, sphinx
|
|
74
|
+
|
|
75
|
+
From sources
|
|
76
|
+
""""""""""""
|
|
77
|
+
|
|
78
|
+
Download the latest NexDaTaS version from
|
|
79
|
+
|
|
80
|
+
| https://github.com/nexdatas/nxsdatawriter
|
|
81
|
+
|
|
82
|
+
Extract sources and run
|
|
83
|
+
|
|
84
|
+
.. code-block:: console
|
|
85
|
+
|
|
86
|
+
$ python setup.py install
|
|
87
|
+
|
|
88
|
+
Debian packages
|
|
89
|
+
"""""""""""""""
|
|
90
|
+
|
|
91
|
+
Debian `bookworm`, `bullseye`, `buster` or Ubuntu `lunar`, `jammy`, `focal` packages can be found in the HDRI repository.
|
|
92
|
+
|
|
93
|
+
To install the debian packages, add the PGP repository key
|
|
94
|
+
|
|
95
|
+
.. code-block:: console
|
|
96
|
+
|
|
97
|
+
$ sudo su
|
|
98
|
+
$ curl -s http://repos.pni-hdri.de/debian_repo.pub.gpg | gpg --no-default-keyring --keyring gnupg-ring:/etc/apt/trusted.gpg.d/debian-hdri-repo.gpg --import
|
|
99
|
+
$ chmod 644 /etc/apt/trusted.gpg.d/debian-hdri-repo.gpg
|
|
100
|
+
|
|
101
|
+
and then download the corresponding source list
|
|
102
|
+
|
|
103
|
+
.. code-block:: console
|
|
104
|
+
|
|
105
|
+
$ cd /etc/apt/sources.list.d
|
|
106
|
+
$ wget http://repos.pni-hdri.de/bookworm-pni-hdri.list
|
|
107
|
+
|
|
108
|
+
To install tango server
|
|
109
|
+
|
|
110
|
+
.. code-block:: console
|
|
111
|
+
|
|
112
|
+
$ apt-get update
|
|
113
|
+
$ apt-get install nxswriter
|
|
114
|
+
|
|
115
|
+
or
|
|
116
|
+
|
|
117
|
+
.. code-block:: console
|
|
118
|
+
|
|
119
|
+
$ apt-get update
|
|
120
|
+
$ apt-get install nxswriter3
|
|
121
|
+
|
|
122
|
+
for older python3 releases.
|
|
123
|
+
|
|
124
|
+
To install only the python3 package
|
|
125
|
+
|
|
126
|
+
.. code-block:: console
|
|
127
|
+
|
|
128
|
+
$ apt-get update
|
|
129
|
+
$ apt-get install python3-nxswriter
|
|
130
|
+
|
|
131
|
+
and for python2
|
|
132
|
+
|
|
133
|
+
.. code-block:: console
|
|
134
|
+
|
|
135
|
+
$ apt-get update
|
|
136
|
+
$ apt-get install python-nxswriter
|
|
137
|
+
|
|
138
|
+
if exists.
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
From pip
|
|
143
|
+
""""""""
|
|
144
|
+
|
|
145
|
+
To install it from pip you can
|
|
146
|
+
|
|
147
|
+
.. code-block:: console
|
|
148
|
+
|
|
149
|
+
$ python3 -m venv myvenv
|
|
150
|
+
$ . myvenv/bin/activate
|
|
151
|
+
|
|
152
|
+
$ pip install nxswriter
|
|
153
|
+
|
|
154
|
+
Moreover it is also good to install
|
|
155
|
+
|
|
156
|
+
.. code-block:: console
|
|
157
|
+
|
|
158
|
+
$ pip install pytango
|
|
159
|
+
$ pip install pymysqldb
|
|
160
|
+
$ pip install psycopg2-binary
|
|
161
|
+
$ pip install cx-oracle
|
|
162
|
+
|
|
163
|
+
Setting NeXus Writer Server
|
|
164
|
+
"""""""""""""""""""""""""""
|
|
165
|
+
|
|
166
|
+
To set up NeXus Writer Server run
|
|
167
|
+
|
|
168
|
+
.. code-block:: console
|
|
169
|
+
|
|
170
|
+
$ nxsetup -x NXSDataWriter
|
|
171
|
+
|
|
172
|
+
The *nxsetup* command comes from the **python-nxstools** package.
|
|
173
|
+
|
|
174
|
+
-----------
|
|
175
|
+
Client code
|
|
176
|
+
-----------
|
|
177
|
+
|
|
178
|
+
In order to use Nexus Data Server one has to write a client code. Some simple client codes
|
|
179
|
+
are in the nexdatas repository. In this section we add some
|
|
180
|
+
comments related to the client code.
|
|
181
|
+
|
|
182
|
+
.. code-block:: python
|
|
183
|
+
|
|
184
|
+
# To use the Tango Server we must import the tango module and
|
|
185
|
+
# create DeviceProxy for the server.
|
|
186
|
+
|
|
187
|
+
import tango
|
|
188
|
+
|
|
189
|
+
device = "p09/tdw/r228"
|
|
190
|
+
dpx = tango.DeviceProxy(device)
|
|
191
|
+
dpx.set_timeout_millis(10000)
|
|
192
|
+
|
|
193
|
+
dpx.Init()
|
|
194
|
+
|
|
195
|
+
# Here device corresponds to a name of our Nexus Data Server.
|
|
196
|
+
# The Init() method resets the state of the server.
|
|
197
|
+
|
|
198
|
+
dpx.FileName = "test.h5"
|
|
199
|
+
dpx.OpenFile()
|
|
200
|
+
|
|
201
|
+
# We set the name of the output HDF5 file and open it.
|
|
202
|
+
|
|
203
|
+
# Now we are ready to pass the XML settings describing a structure of
|
|
204
|
+
# the output file as well as defining a way of data storing.
|
|
205
|
+
# Examples of the XMLSettings can be found in the XMLExamples directory.
|
|
206
|
+
|
|
207
|
+
with open("test.xml", 'r') as fl:
|
|
208
|
+
xml = fl.read()
|
|
209
|
+
dpx.XMLSettings = xml
|
|
210
|
+
|
|
211
|
+
dpx.JSONRecord = '{"data": {"parameterA":0.2},
|
|
212
|
+
"decoders":{"DESY2D":"desydecoders.desy2Ddec.desy2d"},
|
|
213
|
+
"datasources":{
|
|
214
|
+
"MCLIENT":"sources.DataSources.LocalClientSource"}
|
|
215
|
+
}'
|
|
216
|
+
|
|
217
|
+
dpx.OpenEntry()
|
|
218
|
+
|
|
219
|
+
# We read our XML settings settings from a file and pass them to the server via
|
|
220
|
+
# the XMLSettings attribute. Then we open an entry group related to the XML
|
|
221
|
+
# configuration. Optionally, we can also set JSONRecord, i.e. an attribute
|
|
222
|
+
# which contains a global JSON string with data needed to store during opening
|
|
223
|
+
# the entry and also other stages of recording. If external decoder for
|
|
224
|
+
# DevEncoded data is need one can registred it passing its packages and
|
|
225
|
+
# class names in JSONRecord,
|
|
226
|
+
# e.g. "desy2d" class of "DESY2D" label in "desydecoders.desy2Ddec" package.
|
|
227
|
+
# Similarly making use of "datasources" records of the JSON string one can
|
|
228
|
+
# registred additional datasources. The OpenEntry method stores data defined
|
|
229
|
+
# in the XML string with strategy=INIT.
|
|
230
|
+
# The JSONRecord attribute can be changed during recording our data.
|
|
231
|
+
|
|
232
|
+
# After finalization of the configuration process we can start recording
|
|
233
|
+
# the main experiment data in a STEP mode.
|
|
234
|
+
|
|
235
|
+
dpx.Record('{"data": {"p09/counter/exp.01":0.1, "p09/counter/exp.02":1.1}}')
|
|
236
|
+
|
|
237
|
+
# Every time we call the Record method all nexus fields defined with
|
|
238
|
+
# strategy=STEP are extended by one record unit and the assigned to them data
|
|
239
|
+
# is stored. As the method argument we pass a local JSON string with the client
|
|
240
|
+
# data. To record the client data one can also use the global JSONRecord string.
|
|
241
|
+
# Contrary to the global JSON string the local one is only
|
|
242
|
+
# valid during one record step.
|
|
243
|
+
|
|
244
|
+
dpx.Record('{"data": {"emittance_x": 0.1}, "triggers":["trigger1", "trigger2"] }')
|
|
245
|
+
|
|
246
|
+
# If you denote in your XML configuration string some fields by additional
|
|
247
|
+
# trigger attributes you may ask the server to store your data only in specific
|
|
248
|
+
# record steps. This can be helpful if you want to store your data in
|
|
249
|
+
# asynchronous mode. To this end you define in the local JSON string a list of
|
|
250
|
+
# triggers which are used in the current record step.
|
|
251
|
+
|
|
252
|
+
dpx.JSONRecord = '{"data": {"parameterB":0.3}}'
|
|
253
|
+
dpx.CloseEntry()
|
|
254
|
+
|
|
255
|
+
# After scanning experiment data in 'STEP' mode we close the entry.
|
|
256
|
+
# To this end we call the CloseEntry method which also stores data defined
|
|
257
|
+
# with strategy=FINAL. Since our HDF5 file can contain many entries we can again
|
|
258
|
+
# open the entry and repeat our record procedure. If we define more than one entry
|
|
259
|
+
# in one XML setting string the defined entries are recorded parallel
|
|
260
|
+
# with the same steps.
|
|
261
|
+
|
|
262
|
+
# Finally, we can close our output file by
|
|
263
|
+
|
|
264
|
+
dpx.CloseFile()
|
|
265
|
+
|
|
266
|
+
Additionally, one can use asynchronous versions of **OpenEntry**, **Record**, **CloseEntry**, i.e.
|
|
267
|
+
**OpenEntryAsynch**, **RecordAsynch**, **CloseEntryAsynch**. In this case data is stored
|
|
268
|
+
in a background thread and during this writing Tango Data Server has a state *RUNNING*.
|
|
269
|
+
|
|
270
|
+
In order to build the XML configurations in the easy way the authors of the server provide
|
|
271
|
+
for this purpose a specialized GUI tool, Component Designer.
|
|
272
|
+
The attached to the server XML examples
|
|
273
|
+
was created by XMLFile class defined in XMLCreator/simpleXML.py.
|