nxswriter 3.10.0__tar.gz → 3.11.0__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.
Files changed (218) hide show
  1. {nxswriter-3.10.0 → nxswriter-3.11.0}/.ci/install.sh +25 -14
  2. {nxswriter-3.10.0 → nxswriter-3.11.0}/.github/workflows/tests.yml +1 -1
  3. {nxswriter-3.10.0 → nxswriter-3.11.0}/ChangeLog +4 -0
  4. nxswriter-3.11.0/PKG-INFO +273 -0
  5. {nxswriter-3.10.0 → nxswriter-3.11.0}/nxswriter/Release.py +1 -1
  6. {nxswriter-3.10.0 → nxswriter-3.11.0}/nxswriter/TangoDataWriter.py +15 -1
  7. nxswriter-3.11.0/nxswriter.egg-info/PKG-INFO +273 -0
  8. nxswriter-3.10.0/PKG-INFO +0 -274
  9. nxswriter-3.10.0/nxswriter.egg-info/PKG-INFO +0 -274
  10. {nxswriter-3.10.0 → nxswriter-3.11.0}/.ci/debian10_py2/Dockerfile +0 -0
  11. {nxswriter-3.10.0 → nxswriter-3.11.0}/.ci/debian10_py3/Dockerfile +0 -0
  12. {nxswriter-3.10.0 → nxswriter-3.11.0}/.ci/debian11_py3/Dockerfile +0 -0
  13. {nxswriter-3.10.0 → nxswriter-3.11.0}/.ci/debian8_py2/Dockerfile +0 -0
  14. {nxswriter-3.10.0 → nxswriter-3.11.0}/.ci/debian8_py3/Dockerfile +0 -0
  15. {nxswriter-3.10.0 → nxswriter-3.11.0}/.ci/debian9_py2/Dockerfile +0 -0
  16. {nxswriter-3.10.0 → nxswriter-3.11.0}/.ci/debian9_py3/Dockerfile +0 -0
  17. {nxswriter-3.10.0 → nxswriter-3.11.0}/.ci/run.sh +0 -0
  18. {nxswriter-3.10.0 → nxswriter-3.11.0}/.ci/ubuntu16.04_py2/Dockerfile +0 -0
  19. {nxswriter-3.10.0 → nxswriter-3.11.0}/.ci/ubuntu16.04_py3/Dockerfile +0 -0
  20. {nxswriter-3.10.0 → nxswriter-3.11.0}/.ci/ubuntu18.04_py2/Dockerfile +0 -0
  21. {nxswriter-3.10.0 → nxswriter-3.11.0}/.ci/ubuntu18.04_py3/Dockerfile +0 -0
  22. {nxswriter-3.10.0 → nxswriter-3.11.0}/.ci/ubuntu20.04_py3/Dockerfile +0 -0
  23. {nxswriter-3.10.0 → nxswriter-3.11.0}/.flake8 +0 -0
  24. {nxswriter-3.10.0 → nxswriter-3.11.0}/.gitignore +0 -0
  25. {nxswriter-3.10.0 → nxswriter-3.11.0}/COPYRIGHT +0 -0
  26. {nxswriter-3.10.0 → nxswriter-3.11.0}/MANIFEST.in +0 -0
  27. {nxswriter-3.10.0 → nxswriter-3.11.0}/NXSDataWriter +0 -0
  28. {nxswriter-3.10.0 → nxswriter-3.11.0}/NXSDataWriter.xmi +0 -0
  29. {nxswriter-3.10.0 → nxswriter-3.11.0}/README.rst +0 -0
  30. {nxswriter-3.10.0 → nxswriter-3.11.0}/XMLExamples/MNI.xml +0 -0
  31. {nxswriter-3.10.0 → nxswriter-3.11.0}/XMLExamples/encodedImage.xml +0 -0
  32. {nxswriter-3.10.0 → nxswriter-3.11.0}/XMLExamples/encodedImage4.xml +0 -0
  33. {nxswriter-3.10.0 → nxswriter-3.11.0}/XMLExamples/scan.xml +0 -0
  34. {nxswriter-3.10.0 → nxswriter-3.11.0}/XMLExamples/scan2.xml +0 -0
  35. {nxswriter-3.10.0 → nxswriter-3.11.0}/XMLExamples/scan3.xml +0 -0
  36. {nxswriter-3.10.0 → nxswriter-3.11.0}/XMLExamples/test.xml +0 -0
  37. {nxswriter-3.10.0 → nxswriter-3.11.0}/XMLExamples/trigger.xml +0 -0
  38. {nxswriter-3.10.0 → nxswriter-3.11.0}/doc/Makefile +0 -0
  39. {nxswriter-3.10.0 → nxswriter-3.11.0}/doc/conf.py +0 -0
  40. {nxswriter-3.10.0 → nxswriter-3.11.0}/doc/index.rst +0 -0
  41. {nxswriter-3.10.0 → nxswriter-3.11.0}/doc/make.bat +0 -0
  42. {nxswriter-3.10.0 → nxswriter-3.11.0}/doc/nxswriter.rst +0 -0
  43. {nxswriter-3.10.0 → nxswriter-3.11.0}/doc_html/AttrCanFail.html +0 -0
  44. {nxswriter-3.10.0 → nxswriter-3.11.0}/doc_html/AttrCurrentFileId.html +0 -0
  45. {nxswriter-3.10.0 → nxswriter-3.11.0}/doc_html/AttrErrors.html +0 -0
  46. {nxswriter-3.10.0 → nxswriter-3.11.0}/doc_html/AttrFileName.html +0 -0
  47. {nxswriter-3.10.0 → nxswriter-3.11.0}/doc_html/AttrJSONRecord.html +0 -0
  48. {nxswriter-3.10.0 → nxswriter-3.11.0}/doc_html/AttrSkipAcquisition.html +0 -0
  49. {nxswriter-3.10.0 → nxswriter-3.11.0}/doc_html/AttrStepsPerFile.html +0 -0
  50. {nxswriter-3.10.0 → nxswriter-3.11.0}/doc_html/AttrXMLSettings.html +0 -0
  51. {nxswriter-3.10.0 → nxswriter-3.11.0}/doc_html/Attributes.html +0 -0
  52. {nxswriter-3.10.0 → nxswriter-3.11.0}/doc_html/ClassDescription.html +0 -0
  53. {nxswriter-3.10.0 → nxswriter-3.11.0}/doc_html/CmdCloseEntry.html +0 -0
  54. {nxswriter-3.10.0 → nxswriter-3.11.0}/doc_html/CmdCloseEntryAsynch.html +0 -0
  55. {nxswriter-3.10.0 → nxswriter-3.11.0}/doc_html/CmdCloseFile.html +0 -0
  56. {nxswriter-3.10.0 → nxswriter-3.11.0}/doc_html/CmdOpenEntry.html +0 -0
  57. {nxswriter-3.10.0 → nxswriter-3.11.0}/doc_html/CmdOpenEntryAsynch.html +0 -0
  58. {nxswriter-3.10.0 → nxswriter-3.11.0}/doc_html/CmdOpenFile.html +0 -0
  59. {nxswriter-3.10.0 → nxswriter-3.11.0}/doc_html/CmdRecord.html +0 -0
  60. {nxswriter-3.10.0 → nxswriter-3.11.0}/doc_html/CmdRecordAsynch.html +0 -0
  61. {nxswriter-3.10.0 → nxswriter-3.11.0}/doc_html/CmdState.html +0 -0
  62. {nxswriter-3.10.0 → nxswriter-3.11.0}/doc_html/CmdStatus.html +0 -0
  63. {nxswriter-3.10.0 → nxswriter-3.11.0}/doc_html/Commands.html +0 -0
  64. {nxswriter-3.10.0 → nxswriter-3.11.0}/doc_html/FullDocument.html +0 -0
  65. {nxswriter-3.10.0 → nxswriter-3.11.0}/doc_html/Properties.html +0 -0
  66. {nxswriter-3.10.0 → nxswriter-3.11.0}/doc_html/States.html +0 -0
  67. {nxswriter-3.10.0 → nxswriter-3.11.0}/doc_html/TitleBanner.html +0 -0
  68. {nxswriter-3.10.0 → nxswriter-3.11.0}/doc_html/index.html +0 -0
  69. {nxswriter-3.10.0 → nxswriter-3.11.0}/man/NXSDataWriter.1 +0 -0
  70. {nxswriter-3.10.0 → nxswriter-3.11.0}/man/nxsfromxml.1 +0 -0
  71. {nxswriter-3.10.0 → nxswriter-3.11.0}/man/nxswriter.1 +0 -0
  72. {nxswriter-3.10.0 → nxswriter-3.11.0}/nxsfromxml +0 -0
  73. {nxswriter-3.10.0 → nxswriter-3.11.0}/nxswriter/ClientSource.py +0 -0
  74. {nxswriter-3.10.0 → nxswriter-3.11.0}/nxswriter/DBaseSource.py +0 -0
  75. {nxswriter-3.10.0 → nxswriter-3.11.0}/nxswriter/DataHolder.py +0 -0
  76. {nxswriter-3.10.0 → nxswriter-3.11.0}/nxswriter/DataSourceFactory.py +0 -0
  77. {nxswriter-3.10.0 → nxswriter-3.11.0}/nxswriter/DataSourcePool.py +0 -0
  78. {nxswriter-3.10.0 → nxswriter-3.11.0}/nxswriter/DataSources.py +0 -0
  79. {nxswriter-3.10.0 → nxswriter-3.11.0}/nxswriter/DecoderPool.py +0 -0
  80. {nxswriter-3.10.0 → nxswriter-3.11.0}/nxswriter/EAttribute.py +0 -0
  81. {nxswriter-3.10.0 → nxswriter-3.11.0}/nxswriter/EField.py +0 -0
  82. {nxswriter-3.10.0 → nxswriter-3.11.0}/nxswriter/EGroup.py +0 -0
  83. {nxswriter-3.10.0 → nxswriter-3.11.0}/nxswriter/ELink.py +0 -0
  84. {nxswriter-3.10.0 → nxswriter-3.11.0}/nxswriter/EStrategy.py +0 -0
  85. {nxswriter-3.10.0 → nxswriter-3.11.0}/nxswriter/Element.py +0 -0
  86. {nxswriter-3.10.0 → nxswriter-3.11.0}/nxswriter/ElementThread.py +0 -0
  87. {nxswriter-3.10.0 → nxswriter-3.11.0}/nxswriter/Errors.py +0 -0
  88. {nxswriter-3.10.0 → nxswriter-3.11.0}/nxswriter/FElement.py +0 -0
  89. {nxswriter-3.10.0 → nxswriter-3.11.0}/nxswriter/FetchNameHandler.py +0 -0
  90. {nxswriter-3.10.0 → nxswriter-3.11.0}/nxswriter/H5Elements.py +0 -0
  91. {nxswriter-3.10.0 → nxswriter-3.11.0}/nxswriter/InnerXMLParser.py +0 -0
  92. {nxswriter-3.10.0 → nxswriter-3.11.0}/nxswriter/Metadata.py +0 -0
  93. {nxswriter-3.10.0 → nxswriter-3.11.0}/nxswriter/NXSFromXML.py +0 -0
  94. {nxswriter-3.10.0 → nxswriter-3.11.0}/nxswriter/NXSWriter.py +0 -0
  95. {nxswriter-3.10.0 → nxswriter-3.11.0}/nxswriter/NexusXMLHandler.py +0 -0
  96. {nxswriter-3.10.0 → nxswriter-3.11.0}/nxswriter/PyEvalSource.py +0 -0
  97. {nxswriter-3.10.0 → nxswriter-3.11.0}/nxswriter/StreamSet.py +0 -0
  98. {nxswriter-3.10.0 → nxswriter-3.11.0}/nxswriter/TangoSource.py +0 -0
  99. {nxswriter-3.10.0 → nxswriter-3.11.0}/nxswriter/ThreadPool.py +0 -0
  100. {nxswriter-3.10.0 → nxswriter-3.11.0}/nxswriter/Types.py +0 -0
  101. {nxswriter-3.10.0 → nxswriter-3.11.0}/nxswriter/__init__.py +0 -0
  102. {nxswriter-3.10.0 → nxswriter-3.11.0}/nxswriter.egg-info/SOURCES.txt +0 -0
  103. {nxswriter-3.10.0 → nxswriter-3.11.0}/nxswriter.egg-info/dependency_links.txt +0 -0
  104. {nxswriter-3.10.0 → nxswriter-3.11.0}/nxswriter.egg-info/not-zip-safe +0 -0
  105. {nxswriter-3.10.0 → nxswriter-3.11.0}/nxswriter.egg-info/requires.txt +0 -0
  106. {nxswriter-3.10.0 → nxswriter-3.11.0}/nxswriter.egg-info/top_level.txt +0 -0
  107. {nxswriter-3.10.0 → nxswriter-3.11.0}/setup.cfg +0 -0
  108. {nxswriter-3.10.0 → nxswriter-3.11.0}/setup.py +0 -0
  109. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/Checkers.py +0 -0
  110. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/ClientFieldTagAsynchH5Cpp_test.py +0 -0
  111. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/ClientFieldTagAsynchH5PY_test.py +0 -0
  112. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/ClientFieldTagServerH5Cpp_test.py +0 -0
  113. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/ClientFieldTagServerH5PY_test.py +0 -0
  114. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/ClientFieldTagWriterH5Cpp_test.py +0 -0
  115. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/ClientFieldTagWriterH5PY_test.py +0 -0
  116. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/ClientSource_test.py +0 -0
  117. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/Converters_test.py +0 -0
  118. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/DBFieldTagAsynchH5Cpp_test.py +0 -0
  119. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/DBFieldTagAsynchH5PY_test.py +0 -0
  120. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/DBFieldTagServerH5Cpp_test.py +0 -0
  121. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/DBFieldTagServerH5PY_test.py +0 -0
  122. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/DBFieldTagWriterH5Cpp_test.py +0 -0
  123. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/DBFieldTagWriterH5PY_test.py +0 -0
  124. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/DBaseSource_test.py +0 -0
  125. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/DataHolder_test.py +0 -0
  126. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/DataSourceDecoders_test.py +0 -0
  127. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/DataSourceFactory_test.py +0 -0
  128. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/DataSourcePool_test.py +0 -0
  129. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/DataSource_test.py +0 -0
  130. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/DecoderPool_test.py +0 -0
  131. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/EAttributeH5Cpp_test.py +0 -0
  132. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/EAttributeH5PY_test.py +0 -0
  133. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/EDimH5Cpp_test.py +0 -0
  134. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/EDimH5PY_test.py +0 -0
  135. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/EDimensionsH5Cpp_test.py +0 -0
  136. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/EDimensionsH5PY_test.py +0 -0
  137. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/EDocH5Cpp_test.py +0 -0
  138. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/EDocH5PY_test.py +0 -0
  139. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/EFieldH5Cpp_test.py +0 -0
  140. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/EFieldH5PY_test.py +0 -0
  141. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/EFieldReshapeH5Cpp_test.py +0 -0
  142. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/EFieldReshapeH5PY_test.py +0 -0
  143. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/EFileH5Cpp_test.py +0 -0
  144. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/EFileH5PY_test.py +0 -0
  145. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/EGroupH5Cpp_test.py +0 -0
  146. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/EGroupH5PY_test.py +0 -0
  147. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/ELinkH5Cpp_test.py +0 -0
  148. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/ELinkH5PY_test.py +0 -0
  149. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/EStrategyH5Cpp_test.py +0 -0
  150. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/EStrategyH5PY_test.py +0 -0
  151. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/ESymbolH5Cpp_test.py +0 -0
  152. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/ESymbolH5PY_test.py +0 -0
  153. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/ElementH5Cpp_test.py +0 -0
  154. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/ElementH5PY_test.py +0 -0
  155. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/ElementThread_test.py +0 -0
  156. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/Element_test.py +0 -0
  157. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/Errors_test.py +0 -0
  158. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/FElementH5Cpp_test.py +0 -0
  159. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/FElementH5PY_test.py +0 -0
  160. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/FElementWithAttrH5Cpp_test.py +0 -0
  161. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/FElementWithAttrH5PY_test.py +0 -0
  162. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/FetchNameHandler_test.py +0 -0
  163. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/FileWriterH5CppH5PY_test.py +0 -0
  164. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/FileWriterH5Cpp_test.py +0 -0
  165. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/FileWriterH5PY_test.py +0 -0
  166. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/H5CppWriter_test.py +0 -0
  167. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/H5PYWriter_test.py +0 -0
  168. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/InnerXMLParser_test.py +0 -0
  169. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/MYSQLSource_test.py +0 -0
  170. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/NTP_test.py +0 -0
  171. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/NXSDataWriterH5Cpp_test.py +0 -0
  172. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/NXSDataWriterH5PY_test.py +0 -0
  173. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/NXSFromXMLH5Cpp_test.py +0 -0
  174. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/NXSFromXMLH5PY_test.py +0 -0
  175. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/NexusXMLHandlerH5Cpp_test.py +0 -0
  176. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/NexusXMLHandlerH5PY_test.py +0 -0
  177. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/ORACLESource_test.py +0 -0
  178. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/PGSQLSource_test.py +0 -0
  179. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/ProxyHelper.py +0 -0
  180. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/ProxyTools_test.py +0 -0
  181. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/PyEvalSource_test.py +0 -0
  182. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/PyEvalTangoSourceH5Cpp_test.py +0 -0
  183. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/PyEvalTangoSourceH5PY_test.py +0 -0
  184. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/ServerSetUp.py +0 -0
  185. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/SimpleServer.py +0 -0
  186. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/SimpleServerSetUp.py +0 -0
  187. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/StreamSet_test.py +0 -0
  188. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/TNObject_test.py +0 -0
  189. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/TangoClassID.txt +0 -0
  190. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/TangoDataWriterH5CppH5PY_test.py +0 -0
  191. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/TangoDataWriterH5Cpp_test.py +0 -0
  192. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/TangoDataWriterH5PY_test.py +0 -0
  193. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/TangoFieldTagAsynchH5Cpp_test.py +0 -0
  194. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/TangoFieldTagAsynchH5PY_test.py +0 -0
  195. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/TangoFieldTagServerH5Cpp_test.py +0 -0
  196. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/TangoFieldTagServerH5PY_test.py +0 -0
  197. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/TangoFieldTagWriterH5Cpp_test.py +0 -0
  198. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/TangoFieldTagWriterH5PY_test.py +0 -0
  199. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/TangoSource_test.py +0 -0
  200. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/TgDevice_test.py +0 -0
  201. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/TgGroup_test.py +0 -0
  202. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/TgMember_test.py +0 -0
  203. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/ThreadPool_test.py +0 -0
  204. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/TstDataSource.py +0 -0
  205. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/UINT32decoder_test.py +0 -0
  206. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/UTF8decoder_test.py +0 -0
  207. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/VDEOdecoder_test.py +0 -0
  208. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/XMLFieldTagAsynchH5Cpp_test.py +0 -0
  209. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/XMLFieldTagAsynchH5PY_test.py +0 -0
  210. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/XMLFieldTagServerH5Cpp_test.py +0 -0
  211. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/XMLFieldTagServerH5PY_test.py +0 -0
  212. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/XMLFieldTagWriterH5Cpp_test.py +0 -0
  213. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/XMLFieldTagWriterH5PY_test.py +0 -0
  214. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/__init__.py +0 -0
  215. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/__main__.py +0 -0
  216. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/main.py +0 -0
  217. {nxswriter-3.10.0 → nxswriter-3.11.0}/test/mydb.pgsql +0 -0
  218. {nxswriter-3.10.0 → nxswriter-3.11.0}/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
- echo "install tango db"
20
- docker exec --user root ndts /bin/sh -c 'apt-get -qq update; apt-get -qq install -y tango-db tango-common; sleep 10'
21
- if [ "$?" != "0" ]; then exit 255; fi
22
-
23
- docker exec --user root ndts /bin/bash -c 'export DEBIAN_FRONTEND=noninteractive; apt-get -qq update; apt-get -qq install -y tango-db tango-common; sleep 10'
24
- if [ "$?" != "0" ]; then exit 255; fi
25
-
26
- if [ "$1" = "ubuntu20.04" ] || [ "$1" = "ubuntu20.10" ] || [ "$1" = "ubuntu21.04" ] || [ "$1" = "ubuntu21.10" ] || [ "$1" = "ubuntu22.04" ] || [ "$1" = "ubuntu23.10" ]; then
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/sh -c 'apt-get -qq update; apt-get -qq install -y tango-starter tango-test'
35
- if [ "$?" != "0" ]; then exit 255; fi
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, ubuntu23.10, ubuntu22.04, ubuntu20.04]
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,7 @@
1
+ 2023-11-09 Jan Kotanski <jankotan@gmail.com>
2
+ * add support for h5redis writer (#165)
3
+ * tagged as 3.11.0
4
+
1
5
  2023-11-09 Jan Kotanski <jankotan@gmail.com>
2
6
  * change tango.Device_4Impl to tango.LatestDeviceImpl (#160)
3
7
  * tagged as 3.10.0
@@ -0,0 +1,273 @@
1
+ Metadata-Version: 2.1
2
+ Name: nxswriter
3
+ Version: 3.11.0
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.
@@ -21,4 +21,4 @@
21
21
 
22
22
 
23
23
  #: package version
24
- __version__ = "3.10.0"
24
+ __version__ = "3.11.0"
@@ -58,7 +58,14 @@ try:
58
58
  WRITERS["h5cpp"] = H5CppWriter
59
59
  except Exception:
60
60
  pass
61
- DEFAULTWRITERS = ["h5cpp", "h5py"]
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()
@@ -0,0 +1,273 @@
1
+ Metadata-Version: 2.1
2
+ Name: nxswriter
3
+ Version: 3.11.0
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.