nxtomomill 2.1.0.dev3__tar.gz → 2.1.0.dev4__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 (177) hide show
  1. {nxtomomill-2.1.0.dev3/nxtomomill.egg-info → nxtomomill-2.1.0.dev4}/PKG-INFO +2 -2
  2. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/app/dxfile2nx.py +15 -1
  3. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/app/h52nx.py +5 -0
  4. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/dxfile/dxfileconverter.py +11 -2
  5. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/dxfile/tests/test_dxfile.py +56 -11
  6. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/edf/edfconverter.py +9 -1
  7. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/fscan/fscanconverter.py +1 -3
  8. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisition/baseacquisition.py +2 -0
  9. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisition/standardacquisition.py +41 -6
  10. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisition/tests/test_legacy.py +1 -0
  11. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/tests/test_hdf5converter.py +20 -0
  12. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/io/config/confighandler.py +1 -0
  13. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/io/config/tests/test_confighandler.py +1 -0
  14. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/dx2nx.py +23 -2
  15. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/edf2nx/detector_section.py +5 -2
  16. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/edf2nx/edf2nx.py +1 -0
  17. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/h52nx/general_section.py +5 -0
  18. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/h52nx/h52nx.py +1 -0
  19. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/version.py +1 -1
  20. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4/nxtomomill.egg-info}/PKG-INFO +2 -2
  21. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill.egg-info/SOURCES.txt +0 -1
  22. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill.egg-info/requires.txt +1 -1
  23. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill.egg-info/top_level.txt +0 -1
  24. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/pyproject.toml +1 -1
  25. nxtomomill-2.1.0.dev3/nxtomomill/converter/edf/_Blosc2Jp2kWrapper.py +0 -63
  26. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/LICENSE +0 -0
  27. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/README.md +0 -0
  28. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/doc/conf.py +0 -0
  29. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/__init__.py +0 -0
  30. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/__main__.py +0 -0
  31. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/app/__init__.py +0 -0
  32. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/app/blissfluo2nx.py +0 -0
  33. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/app/blissfluoconfig.py +0 -0
  34. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/app/edf2nx.py +0 -0
  35. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/app/edf2nx_check.py +0 -0
  36. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/app/edfconfig.py +0 -0
  37. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/app/fluo2nx.py +0 -0
  38. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/app/fluoconfig.py +0 -0
  39. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/app/fscan2nx.py +0 -0
  40. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/app/h5config.py +0 -0
  41. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/app/nxcopy.py +0 -0
  42. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/app/patch_nx.py +0 -0
  43. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/app/split_nxfile.py +0 -0
  44. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/app/tests/test_bliss_fluo2nx_app.py +0 -0
  45. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/app/tests/test_dxfile2nx_app.py +0 -0
  46. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/app/tests/test_edf2nx_app.py +0 -0
  47. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/app/tests/test_edf_config_app.py +0 -0
  48. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/app/tests/test_fluo2nx_app.py +0 -0
  49. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/app/tests/test_h52nx_app.py +0 -0
  50. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/app/tests/test_h5_config_app.py +0 -0
  51. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/app/tests/test_nx_copy.py +0 -0
  52. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/app/tests/test_patch_nx_app.py +0 -0
  53. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/app/tests/test_split_nxfile_app.py +0 -0
  54. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/app/z_concatenate_scans.py +0 -0
  55. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/app/zstages2nxs.py +0 -0
  56. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/__init__.py +0 -0
  57. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/baseconverter.py +0 -0
  58. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/dxfile/__init__.py +0 -0
  59. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/edf/__init__.py +0 -0
  60. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/edf/checks.py +0 -0
  61. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/edf/tests/test_checks.py +0 -0
  62. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/edf/tests/test_edf2nx.py +0 -0
  63. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/edf/tests/test_edf2nx_check.py +0 -0
  64. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/fluo/__init__.py +0 -0
  65. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/fluo/blissfluoscan.py +0 -0
  66. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/fluo/fluoconverter.py +0 -0
  67. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/fluo/fluoscan.py +0 -0
  68. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/fluo/tests/__init__.py +0 -0
  69. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/fluo/tests/test_fluoscan2D.py +0 -0
  70. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/fluo/tests/test_fluoscan3D.py +0 -0
  71. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/fscan/__init__.py +0 -0
  72. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/__init__.py +0 -0
  73. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisition/__init__.py +0 -0
  74. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisition/_bliss_activeconfig.py +0 -0
  75. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisition/backandforth.py +0 -0
  76. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisition/blisstomoconfig.py +0 -0
  77. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisition/multitomo.py +0 -0
  78. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisition/pcotomoacquisition.py +0 -0
  79. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisition/tests/bliss_tomo_datasets.py +0 -0
  80. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisition/tests/test_acquisition.py +0 -0
  81. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisition/tests/test_acquisition_utils.py +0 -0
  82. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisition/tests/test_back_and_forth.py +0 -0
  83. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisition/tests/test_bliss_tomo_config.py +0 -0
  84. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisition/tests/test_holotomo.py +0 -0
  85. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisition/tests/test_multitomo_zseries.py +0 -0
  86. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisition/tests/test_multitomoacquisition.py +0 -0
  87. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisition/utils/__init__.py +0 -0
  88. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisition/utils/_context.py +0 -0
  89. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisition/utils/_keys.py +0 -0
  90. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisition/utils/_scan_type_finder.py +0 -0
  91. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisition/utils/bliss_scan_type.py +0 -0
  92. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisition/utils/detector.py +0 -0
  93. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisition/utils/machine_current.py +0 -0
  94. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisition/utils/series.py +0 -0
  95. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisition/utils/timestamps.py +0 -0
  96. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisition/zseriesacquisition.py +0 -0
  97. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/acquisitionConstructor.py +0 -0
  98. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/hdf5converter.py +0 -0
  99. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/post_processing/__init__.py +0 -0
  100. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/post_processing/dark_flat_copy.py +0 -0
  101. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/tests/test_frame_flip.py +0 -0
  102. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/tests/test_h52nx_utils.py +0 -0
  103. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/hdf5/utils.py +0 -0
  104. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/converter/version.py +0 -0
  105. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/io/__init__.py +0 -0
  106. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/io/config/__init__.py +0 -0
  107. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/io/config/configbase.py +0 -0
  108. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/io/config/dxconfig.py +0 -0
  109. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/io/config/edfconfig.py +0 -0
  110. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/io/config/fluoconfig.py +0 -0
  111. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/io/config/hdf5config.py +0 -0
  112. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/io/config/tests/__init__.py +0 -0
  113. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/io/tests/test_frame_group.py +0 -0
  114. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/io/tests/utils.py +0 -0
  115. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/__init__.py +0 -0
  116. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/base/ConfigBase.py +0 -0
  117. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/base/FrmFlatToNestedBase.py +0 -0
  118. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/base/NestedModelBase.py +0 -0
  119. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/base/__init__.py +0 -0
  120. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/base/general_section.py +0 -0
  121. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/base/instrument_section.py +0 -0
  122. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/base/source_section.py +0 -0
  123. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/blissfluo2nx/__init__.py +0 -0
  124. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/blissfluo2nx/blissfluo2nx.py +0 -0
  125. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/blissfluo2nx/general_section.py +0 -0
  126. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/edf2nx/__init__.py +0 -0
  127. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/edf2nx/dark_and_flat_section.py +0 -0
  128. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/edf2nx/general_section.py +0 -0
  129. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/edf2nx/keys_section.py +0 -0
  130. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/edf2nx/sample_section.py +0 -0
  131. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/edf2nx/unit_section.py +0 -0
  132. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/fluo2nx/__init__.py +0 -0
  133. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/fluo2nx/fluo2nx.py +0 -0
  134. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/fluo2nx/general_section.py +0 -0
  135. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/h52nx/FrameGroup.py +0 -0
  136. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/h52nx/__init__.py +0 -0
  137. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/h52nx/_acquisitionstep.py +0 -0
  138. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/h52nx/_context.py +0 -0
  139. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/h52nx/entries_and_title_section.py +0 -0
  140. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/h52nx/extra_params_section.py +0 -0
  141. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/h52nx/frame_type_section.py +0 -0
  142. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/h52nx/keys_section.py +0 -0
  143. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/h52nx/multitomo_section.py +0 -0
  144. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/tests/test_context.py +0 -0
  145. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/tests/test_edf2nx_model.py +0 -0
  146. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/tests/test_fluo2nx_model.py +0 -0
  147. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/tests/test_h52nx_model.py +0 -0
  148. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/tests/test_io_utils.py +0 -0
  149. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/models/utils.py +0 -0
  150. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/settings.py +0 -0
  151. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/test.py +0 -0
  152. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/tests/__init__.py +0 -0
  153. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/tests/datasets.py +0 -0
  154. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/tests/resources/__init__.py +0 -0
  155. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/tests/resources/edf2nx_config_files/__init__.py +0 -0
  156. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/tests/resources/fluo2nx_config_files/__init__.py +0 -0
  157. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/tests/resources/h52nx_config_files/__init__.py +0 -0
  158. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/tests/test_version.py +0 -0
  159. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/tests/utils/__init__.py +0 -0
  160. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/tests/utils/bliss.py +0 -0
  161. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/tests/utils/dxfile.py +0 -0
  162. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/utils/__init__.py +0 -0
  163. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/utils/_os.py +0 -0
  164. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/utils/flat_reducer.py +0 -0
  165. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/utils/h5pyutils.py +0 -0
  166. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/utils/hdf5.py +0 -0
  167. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/utils/io.py +0 -0
  168. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/utils/nexus.py +0 -0
  169. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/utils/pintutils.py +0 -0
  170. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/utils/tests/test_flat_reducer.py +0 -0
  171. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/utils/tests/test_h5pyutils.py +0 -0
  172. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/utils/tests/test_nexus_utils.py +0 -0
  173. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/utils/tests/test_utils.py +0 -0
  174. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill/utils/utils.py +0 -0
  175. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill.egg-info/dependency_links.txt +0 -0
  176. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/nxtomomill.egg-info/entry_points.txt +0 -0
  177. {nxtomomill-2.1.0.dev3 → nxtomomill-2.1.0.dev4}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nxtomomill
3
- Version: 2.1.0.dev3
3
+ Version: 2.1.0.dev4
4
4
  Summary: applications and library to convert raw format to NXtomo format
5
5
  Author-email: Henri Payno <henri.payno@esrf.fr>, Pierre Paleo <pierre.paleo@esrf.fr>, Pierre-Olivier Autran <pierre-olivier.autran@esrf.fr>, Jérôme Lesaint <jerome.lesaint@esrf.fr>, Alessandro Mirone <mirone@esrf.fr>
6
6
  License:
@@ -55,7 +55,7 @@ License-File: LICENSE
55
55
  Requires-Dist: numpy
56
56
  Requires-Dist: h5py>=3.0
57
57
  Requires-Dist: silx>=2.0
58
- Requires-Dist: nxtomo>=3.1.0dev0
58
+ Requires-Dist: nxtomo>=3.1.0dev1
59
59
  Requires-Dist: pint
60
60
  Requires-Dist: packaging
61
61
  Requires-Dist: tomoscan[full]>=2.2.0a4
@@ -103,9 +103,16 @@ def main(argv):
103
103
  "--fov",
104
104
  "--field-of-view",
105
105
  default=None,
106
- help="field of view. Can be Full or Half",
106
+ help="DEPRECATED: field of view as string. Use --half-acquisition instead.",
107
107
  dest="field_of_view",
108
108
  )
109
+ parser.add_argument(
110
+ "--half-acquisition",
111
+ help="Use half acquisition instead of full acquisition.",
112
+ action="store_true",
113
+ dest="half_acquisition",
114
+ default=None,
115
+ )
109
116
  # as distance is not stored in the dxfile and requested for paganin
110
117
  # we provide some default value
111
118
  parser.add_argument(
@@ -139,6 +146,12 @@ def main(argv):
139
146
  )
140
147
  options = parser.parse_args(argv[1:])
141
148
 
149
+ if options.field_of_view is not None and options.half_acquisition is not None:
150
+ raise ValueError(
151
+ "Cannot use --field-of-view and --half-acquisition together. "
152
+ "Please use --half-acquisition."
153
+ )
154
+
142
155
  distance = options.distance
143
156
  if distance is not None:
144
157
  distance = float(options.distance)
@@ -163,6 +176,7 @@ def main(argv):
163
176
  scan_range=convert_2elmts__tuple_to_float(options.scan_range),
164
177
  pixel_size=_get_pixel_size(options.pixel_size),
165
178
  field_of_view=options.field_of_view,
179
+ half_acquisition=options.half_acquisition,
166
180
  distance=distance,
167
181
  overwrite=options.overwrite,
168
182
  duplicate_data=options.duplicate_data,
@@ -125,6 +125,11 @@ def main(argv):
125
125
  "parse raw data to find this information.",
126
126
  default=None,
127
127
  )
128
+ parser.add_argument(
129
+ "--half-acquisition",
130
+ help="If the scan is an half-acquisition (CoR at the borders of projections).",
131
+ default=None,
132
+ )
128
133
  parser.add_argument(
129
134
  "--no-input",
130
135
  "--no-input-for-missing-information",
@@ -49,6 +49,7 @@ def from_dx_to_nx(
49
49
  scan_range: tuple = (0.0, 180.0),
50
50
  pixel_size=(None, None),
51
51
  field_of_view: FieldOfView | str | None = None,
52
+ half_acquisition: bool | None = None,
52
53
  distance: float | None = None,
53
54
  overwrite: bool = True,
54
55
  energy: float | None = None,
@@ -84,6 +85,7 @@ def from_dx_to_nx(
84
85
  configuration.scan_range = scan_range
85
86
  configuration.pixel_size = pixel_size
86
87
  configuration.field_of_view = field_of_view
88
+ configuration.half_acquisition = half_acquisition
87
89
  configuration.sample_detector_distance = distance
88
90
  configuration.overwrite = overwrite
89
91
  configuration.energy = energy
@@ -200,6 +202,10 @@ class _DxFileToNxConverter(BaseConverter):
200
202
  def field_of_view(self) -> FieldOfView | None:
201
203
  return self._configuration.field_of_view
202
204
 
205
+ @property
206
+ def half_acquisition(self) -> bool | None:
207
+ return self._configuration.half_acquisition
208
+
203
209
  @property
204
210
  def energy(self) -> float | None:
205
211
  return self._configuration.energy
@@ -281,12 +287,15 @@ class _DxFileToNxConverter(BaseConverter):
281
287
  detector_grp["y_pixel_size"] = y_pixel_size
282
288
  detector_grp["y_pixel_size"].attrs["units"] = "m"
283
289
  # field of view
284
- if self.field_of_view is not None:
290
+ if self.field_of_view is not None or self.half_acquisition is not None:
285
291
  with HDF5File(self.output_file, mode="a") as h5f:
286
292
  root_grp = h5f.require_group(self.output_entry)
287
293
  instrument_grp = root_grp.require_group("instrument")
288
294
  detector_grp = instrument_grp.require_group("detector")
289
- detector_grp["field_of_view"] = self.field_of_view.value
295
+ if self.field_of_view is not None:
296
+ detector_grp["field_of_view"] = self.field_of_view.value
297
+ if self.half_acquisition is not None:
298
+ detector_grp["half_acquisition"] = self.half_acquisition
290
299
  # distance
291
300
  if self._configuration.sample_detector_distance is None:
292
301
  # if value not set by the user let read it
@@ -1,16 +1,18 @@
1
1
  # coding: utf-8
2
2
 
3
3
  import os
4
+ import h5py
4
5
  import pytest
5
6
  import numpy
6
7
 
7
- from nxtomomill import converter
8
+ from nxtomomill.converter.dxfile.dxfileconverter import from_dx_config_to_nx
9
+ from nxtomomill.models.dx2nx import DX2nxModel
8
10
  from nxtomomill.tests.utils.dxfile import MockDxFile
9
11
 
10
12
  from tomoscan.esrf.scan.nxtomoscan import NXtomoScan
11
13
  from tomoscan.validator import is_valid_for_reconstruction
12
14
 
13
- from silx.io.utils import get_data
15
+ from silx.io.utils import get_data, h5py_read_dataset
14
16
 
15
17
 
16
18
  @pytest.mark.parametrize("duplicate_data", (True, False))
@@ -32,11 +34,13 @@ def test_dx_file_conversion(tmp_path, duplicate_data):
32
34
 
33
35
  output_file = os.path.join(folder, "dxfile.nx")
34
36
 
35
- results = converter.from_dx_to_nx(
37
+ config = DX2nxModel(
36
38
  input_file=dxfile_path,
37
39
  output_file=output_file,
38
40
  duplicate_data=duplicate_data,
39
41
  )
42
+
43
+ results = from_dx_config_to_nx(config)
40
44
  assert len(results) == 1
41
45
  assert os.path.exists(output_file)
42
46
  _, entry = results[0]
@@ -62,17 +66,58 @@ def test_dx_file_conversion(tmp_path, duplicate_data):
62
66
 
63
67
  # if overwrite not requested should fail on reprocessing
64
68
  with pytest.raises(OSError):
65
- converter.from_dx_to_nx(
69
+ from_dx_config_to_nx(
70
+ DX2nxModel(
71
+ input_file=dxfile_path,
72
+ output_file=output_file,
73
+ duplicate_data=duplicate_data,
74
+ overwrite=False,
75
+ )
76
+ )
77
+
78
+ # if overwrite requested should succeed
79
+ from_dx_config_to_nx(
80
+ DX2nxModel(
66
81
  input_file=dxfile_path,
67
82
  output_file=output_file,
68
83
  duplicate_data=duplicate_data,
69
- overwrite=False,
84
+ overwrite=True,
70
85
  )
86
+ )
71
87
 
72
- # if overwrite requested should succeed
73
- converter.from_dx_to_nx(
74
- input_file=dxfile_path,
75
- output_file=output_file,
76
- overwrite=True,
77
- duplicate_data=duplicate_data,
88
+
89
+ def test_dx_file_conversion_half_acquisition(tmp_path):
90
+ folder = tmp_path / "test_dx_file_conversion_half_acquisition"
91
+ folder.mkdir()
92
+ dxfile_path = os.path.join(folder, "dxfile.h5")
93
+
94
+ n_projections = 10
95
+ n_darks = 1
96
+ n_flats = 1
97
+ MockDxFile(
98
+ file_path=dxfile_path,
99
+ n_projection=n_projections,
100
+ n_darks=n_darks,
101
+ n_flats=n_flats,
78
102
  )
103
+
104
+ output_file = os.path.join(folder, "dxfile_half.nx")
105
+
106
+ results = from_dx_config_to_nx(
107
+ DX2nxModel(
108
+ input_file=dxfile_path,
109
+ output_file=output_file,
110
+ half_acquisition=True,
111
+ )
112
+ )
113
+ assert len(results) == 1
114
+ assert os.path.exists(output_file)
115
+
116
+ with h5py.File(output_file, "r") as h5f:
117
+ assert h5py_read_dataset(
118
+ h5f["entry0000/instrument/detector/half_acquisition"]
119
+ ) is numpy.bool(True)
120
+ assert (
121
+ h5py_read_dataset(h5f["entry0000/instrument/detector/field_of_view"])
122
+ == "Half"
123
+ )
@@ -1000,16 +1000,24 @@ def __process(
1000
1000
  output_grp["/entry/instrument"].attrs["NX_class"] = "NXinstrument"
1001
1001
  output_grp["/entry/instrument/detector"].attrs["NX_class"] = "NXdetector"
1002
1002
  output_grp["/entry/instrument/detector/data"].attrs["interpretation"] = "image"
1003
- if configuration.field_of_view is not None:
1003
+ if configuration.half_acquisition is not None:
1004
+ half_acquisition = configuration.half_acquisition
1005
+ field_of_view = "Half" if half_acquisition else "Full"
1006
+ elif configuration.field_of_view is not None:
1004
1007
  field_of_view = configuration.field_of_view
1008
+ half_acquisition = field_of_view is FieldOfView.HALF
1005
1009
  elif abs(scan.scan_range) == 180:
1006
1010
  field_of_view = "Full"
1011
+ half_acquisition = False
1007
1012
  elif abs(scan.scan_range) == 360:
1008
1013
  field_of_view = "Half"
1014
+ half_acquisition = True
1009
1015
 
1010
1016
  if field_of_view is not None:
1011
1017
  field_of_view = FieldOfView(field_of_view)
1012
1018
  output_grp["/entry/instrument/detector/field_of_view"] = field_of_view.value
1019
+ if half_acquisition is not None:
1020
+ output_grp["/entry/instrument/detector/half_acquisition"] = half_acquisition
1013
1021
 
1014
1022
  output_grp["/entry/sample"].attrs["NX_class"] = "NXsample"
1015
1023
  output_grp["/entry/definition"] = "NXtomo"
@@ -125,9 +125,7 @@ def from_fscan_to_nx(
125
125
  )
126
126
  my_nxtomo.sample.rotation_angle = np.concatenate(rotation_angles) * _ureg.degree
127
127
 
128
- my_nxtomo.instrument.detector.field_of_view = (
129
- "Half" if (halftomo and do_360) else "Full"
130
- )
128
+ my_nxtomo.instrument.detector.half_acquisition = halftomo and do_360
131
129
  my_nxtomo.instrument.detector.x_pixel_size = (
132
130
  my_nxtomo.instrument.detector.y_pixel_size
133
131
  ) = (6.5 * 1e-6)
@@ -71,6 +71,8 @@ class BaseAcquisition:
71
71
 
72
72
  _FOV_PATH = "technique/scan/field_of_view"
73
73
 
74
+ _HALF_ACQUISITION = "technique/scan/half_acquisition"
75
+
74
76
  _NB_LOOP_PATH = ("technique/scan/nb_loop", "technique/proj/nb_loop")
75
77
 
76
78
  _NB_TOMO_PATH = ("technique/scan/nb_tomo", "technique/proj/nb_tomo")
@@ -1126,7 +1126,7 @@ class StandardAcquisition(BaseAcquisition):
1126
1126
  _logger.warning(mess)
1127
1127
  return 10e-6 * _ureg.meter
1128
1128
 
1129
- def _get_field_of_view(self) -> str:
1129
+ def _get_field_of_view(self) -> str | None:
1130
1130
  if self.configuration.field_of_view is not None:
1131
1131
  return self.configuration.field_of_view.value
1132
1132
  url = self.parent_root_url() or self.root_url
@@ -1138,11 +1138,27 @@ class StandardAcquisition(BaseAcquisition):
1138
1138
  if self._FOV_PATH in entry:
1139
1139
  return h5py_read_dataset(entry[self._FOV_PATH])
1140
1140
  else:
1141
- # FOV is optional: don't raise an error
1142
1141
  _logger.warning(
1143
- f"unable to find information regarding field of view for entry {entry}. set it to default value (Full)"
1142
+ f"Unable to find information regarding field of view for entry {entry}. Set it to default value (Full)"
1144
1143
  )
1145
- return "Full"
1144
+ return None
1145
+
1146
+ def _get_half_acquisition(self) -> bool | None:
1147
+ if self.configuration.half_acquisition is not None:
1148
+ return self.configuration.half_acquisition
1149
+ url = self.parent_root_url() or self.root_url
1150
+ if url is None:
1151
+ return None
1152
+ with EntryReader(
1153
+ url, open_mode_for_reading=self.configuration.open_mode_for_reading
1154
+ ) as entry:
1155
+ if self._HALF_ACQUISITION in entry:
1156
+ return bool(h5py_read_dataset(entry[self._HALF_ACQUISITION]))
1157
+ else:
1158
+ _logger.warning(
1159
+ f"Unable to find information regarding 'half_acquisition' for entry {entry}."
1160
+ )
1161
+ return None
1146
1162
 
1147
1163
  def _update_configuration_from_tomo_config(self):
1148
1164
  """
@@ -1213,9 +1229,21 @@ class StandardAcquisition(BaseAcquisition):
1213
1229
  active_tomo_config_dataset_name = h5py_read_dataset(
1214
1230
  dataset_name, decode_ascii=True
1215
1231
  )[0]
1232
+
1233
+ active_tomo_config_path = (
1234
+ f"instrument/{active_tomo_config_dataset_name}"
1235
+ )
1236
+ if active_tomo_config_path not in entry:
1237
+ _logger.error(
1238
+ f"Cannot find the active tomo config in {active_tomo_config_path!r}"
1239
+ )
1240
+ self._active_config_tomo_detector = None
1241
+ return
1242
+
1216
1243
  active_tomo_config = BlissActiveConfig.from_hdf5_group(
1217
- entry[f"instrument/{active_tomo_config_dataset_name}"]
1244
+ entry[active_tomo_config_path]
1218
1245
  )
1246
+
1219
1247
  if active_tomo_config.tomo_detector:
1220
1248
  # tomo_detector is given as a tuple of 1 element
1221
1249
  self._active_config_tomo_detector = (
@@ -1353,7 +1381,14 @@ class StandardAcquisition(BaseAcquisition):
1353
1381
  DetXFlipTransformation(flip=self.ud_flipped)
1354
1382
  )
1355
1383
 
1356
- # fov
1384
+ # half-acquisition
1385
+ half_acquisition = self._get_half_acquisition()
1386
+ assert isinstance(
1387
+ half_acquisition, (bool, type(None))
1388
+ ), f"half acquisition has to be a boolean or None. Got {half_acquisition}"
1389
+ # Note: default value is False and not None. So if the half_acquisition is not found in the metadata we will set it to False
1390
+ nx_tomo.instrument.detector.half_acquisition = half_acquisition
1391
+ # fov (deprecated. half-acquisition is preferred)
1357
1392
  fov = self._get_field_of_view()
1358
1393
  if fov is not None:
1359
1394
  nx_tomo.instrument.detector.field_of_view = fov
@@ -61,6 +61,7 @@ def test_S59_68p41b_16mm_6p5mm_F8_0001_dataset(
61
61
  assert len(nxtomo.instrument.detector.image_key) == n_frames
62
62
  assert len(nxtomo.instrument.detector.image_key_control) == n_frames
63
63
  assert nxtomo.instrument.detector.field_of_view.value == "Full"
64
+ assert nxtomo.instrument.detector.half_acquisition is None
64
65
 
65
66
  N_PROJ = 10000
66
67
 
@@ -1496,3 +1496,23 @@ def test_keys_operations(tmp_path):
1496
1496
  first_scan.z_translation,
1497
1497
  (numpy.array([150.49] * n_frames) * _ureg.millimeter).to_base_units().magnitude,
1498
1498
  )
1499
+
1500
+
1501
+ def test_invalid_active_tomo_config(tmp_path):
1502
+ config = TomoHDF5Config()
1503
+ config.input_file = GitlabDataset.get_dataset(
1504
+ os.sep.join(
1505
+ (
1506
+ "h5_datasets",
1507
+ "failling",
1508
+ "SPL_WG_WG_K_03_Zseries_LR_167_P_239_7479_D_2477_0000_0000.h5",
1509
+ )
1510
+ )
1511
+ )
1512
+ config.output_file = str(tmp_path / "test.nx")
1513
+ result = converter.from_h5_to_nx(configuration=config)
1514
+ assert len(result) == 1
1515
+ output_file, output_entry = result[0]
1516
+ assert os.path.exists(output_file)
1517
+ scan = NXtomo().load(file_path=output_file, data_path=output_entry)
1518
+ assert len(scan.sample.rotation_angle) == 2542
@@ -131,6 +131,7 @@ class TomoHDF5ConfigHandler:
131
131
  "sub_entries_to_ignore",
132
132
  "raises_error",
133
133
  "field_of_view",
134
+ "half_acquisition",
134
135
  "request_input",
135
136
  "default_data_copy",
136
137
  "sample_x_keys",
@@ -41,6 +41,7 @@ class _ARParseMock(object):
41
41
  self.no_master_file = False
42
42
  self.file_extension = None
43
43
  self.field_of_view = None
44
+ self.half_acquisition = None
44
45
  self.sample_detector_distance_keys = None
45
46
  self.use_abs_path_for_vds = None
46
47
  self.open_mode_for_reading = "robust"
@@ -4,7 +4,13 @@ from __future__ import annotations
4
4
 
5
5
  from nxtomo.nxobject.nxdetector import FieldOfView
6
6
  from .base.general_section import GeneralSection
7
- from pydantic import Field, ConfigDict, field_serializer, field_validator
7
+ from pydantic import (
8
+ Field,
9
+ ConfigDict,
10
+ field_serializer,
11
+ field_validator,
12
+ model_validator,
13
+ )
8
14
 
9
15
  __all__ = [
10
16
  "DX2nxModel",
@@ -38,8 +44,13 @@ class DX2nxModel(GeneralSection):
38
44
  default=(None, None),
39
45
  description="Pixel size can be provided - in meter - as (x_pizel_size, y_pixel_size)",
40
46
  )
47
+ half_acquisition: bool | None = Field(
48
+ default=None,
49
+ description="If True, run a half acquisition. This replaces the string-based field_of_view setting.",
50
+ )
41
51
  field_of_view: FieldOfView | None = Field(
42
- default=None, description="Detector field of view"
52
+ default=None,
53
+ description="DEPRECATED: Detector field of view. Use half_acquisition instead.",
43
54
  )
44
55
  sample_detector_distance: float | None = Field(
45
56
  default=1.0, description="sample / detector distance in meter"
@@ -55,6 +66,16 @@ class DX2nxModel(GeneralSection):
55
66
  return None
56
67
  return FieldOfView(value)
57
68
 
69
+ @model_validator(mode="after")
70
+ def normalize_half_acquisition(self):
71
+ if self.half_acquisition is not None and self.field_of_view is None:
72
+ self.field_of_view = (
73
+ FieldOfView.HALF if self.half_acquisition else FieldOfView.FULL
74
+ )
75
+ elif self.field_of_view is not None and self.half_acquisition is None:
76
+ self.half_acquisition = self.field_of_view == FieldOfView.HALF
77
+ return self
78
+
58
79
  @field_serializer(
59
80
  "field_of_view",
60
81
  when_used="always",
@@ -9,10 +9,13 @@ from pydantic import BaseModel, Field, field_validator, ConfigDict, field_serial
9
9
  class DetectorSection(BaseModel):
10
10
 
11
11
  model_config = ConfigDict(validate_assignment=True, validate_by_name=True)
12
-
12
+ half_acquisition: bool | None = Field(
13
+ default=None,
14
+ description="Is the acquisition an full acquisition of an half acquisition (CoR in at borders of projections)",
15
+ )
13
16
  field_of_view: FieldOfView | None = Field(
14
17
  default=None,
15
- description="Detector field of view. If set must be in `Half` or `Full`",
18
+ description="Deprecated to the benefit of 'half_acquisition'. Detector field of view. If set must be in `Half` or `Full`",
16
19
  )
17
20
 
18
21
  @field_validator(
@@ -80,6 +80,7 @@ class EDF2nxModel(
80
80
  ),
81
81
  detector_section=DetectorSection(
82
82
  field_of_view=self.field_of_view,
83
+ half_acquisition=self.half_acquisition,
83
84
  ),
84
85
  unit_section=UnitSection(
85
86
  pixel_size_unit=self.pixel_size_unit,
@@ -38,6 +38,10 @@ class GeneralSection(_GeneralSectionBase):
38
38
  default=None,
39
39
  description="Force output to be a 'Full' or 'Half' acquisition. Else determine from existing metadata",
40
40
  )
41
+ half_acquisition: bool | None = Field(
42
+ default=None,
43
+ description="Is is a full acquisition or an half-acquisition (CoR at bordrs of projections)",
44
+ )
41
45
  create_control_data: bool = Field(
42
46
  default=True, description="Generate control/data - filled with machine current."
43
47
  )
@@ -77,6 +81,7 @@ class GeneralSection(_GeneralSectionBase):
77
81
  @field_validator(
78
82
  "check_tomo_n",
79
83
  "rotation_is_clockwise",
84
+ "half_acquisition",
80
85
  mode="before",
81
86
  )
82
87
  @classmethod
@@ -49,6 +49,7 @@ class H52nxModel(
49
49
  single_file=self.single_file,
50
50
  no_master_file=self.no_master_file,
51
51
  field_of_view=self.field_of_view,
52
+ half_acquisition=self.half_acquisition,
52
53
  rotation_is_clockwise=self.rotation_is_clockwise,
53
54
  create_control_data=self.create_control_data,
54
55
  check_tomo_n=self.check_tomo_n,
@@ -57,7 +57,7 @@ MAJOR = 2
57
57
  MINOR = 1
58
58
  MICRO = 0
59
59
  RELEV = "dev" # <16
60
- SERIAL = 3 # <16
60
+ SERIAL = 4 # <16
61
61
 
62
62
  date = __date__
63
63
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nxtomomill
3
- Version: 2.1.0.dev3
3
+ Version: 2.1.0.dev4
4
4
  Summary: applications and library to convert raw format to NXtomo format
5
5
  Author-email: Henri Payno <henri.payno@esrf.fr>, Pierre Paleo <pierre.paleo@esrf.fr>, Pierre-Olivier Autran <pierre-olivier.autran@esrf.fr>, Jérôme Lesaint <jerome.lesaint@esrf.fr>, Alessandro Mirone <mirone@esrf.fr>
6
6
  License:
@@ -55,7 +55,7 @@ License-File: LICENSE
55
55
  Requires-Dist: numpy
56
56
  Requires-Dist: h5py>=3.0
57
57
  Requires-Dist: silx>=2.0
58
- Requires-Dist: nxtomo>=3.1.0dev0
58
+ Requires-Dist: nxtomo>=3.1.0dev1
59
59
  Requires-Dist: pint
60
60
  Requires-Dist: packaging
61
61
  Requires-Dist: tomoscan[full]>=2.2.0a4
@@ -46,7 +46,6 @@ nxtomomill/converter/version.py
46
46
  nxtomomill/converter/dxfile/__init__.py
47
47
  nxtomomill/converter/dxfile/dxfileconverter.py
48
48
  nxtomomill/converter/dxfile/tests/test_dxfile.py
49
- nxtomomill/converter/edf/_Blosc2Jp2kWrapper.py
50
49
  nxtomomill/converter/edf/__init__.py
51
50
  nxtomomill/converter/edf/checks.py
52
51
  nxtomomill/converter/edf/edfconverter.py
@@ -1,7 +1,7 @@
1
1
  numpy
2
2
  h5py>=3.0
3
3
  silx>=2.0
4
- nxtomo>=3.1.0dev0
4
+ nxtomo>=3.1.0dev1
5
5
  pint
6
6
  packaging
7
7
  tomoscan[full]>=2.2.0a4
@@ -36,7 +36,7 @@ dependencies = [
36
36
  "numpy",
37
37
  "h5py>=3.0",
38
38
  "silx>=2.0",
39
- "nxtomo>=3.1.0dev0",
39
+ "nxtomo>=3.1.0dev1",
40
40
  "pint",
41
41
  "packaging",
42
42
  "tomoscan[full] >=2.2.0a4",
@@ -1,63 +0,0 @@
1
- from __future__ import annotations
2
- import numpy
3
- from h5py import Dataset
4
-
5
- try:
6
- import blosc2
7
- import blosc2_grok
8
- except ImportError:
9
- _has_blosc2 = False
10
- else:
11
- _has_blosc2 = True
12
-
13
-
14
- class Blosc2Jp2kWrapper:
15
- """Wrapper to apply JP2K conversion to a dataset"""
16
-
17
- def __init__(self, dataset: Dataset, compression_params: dict):
18
- self.dataset: Dataset = dataset
19
- self.compression_params: dict = self.get_default_compression_params()
20
- self.compression_params.update(compression_params)
21
-
22
- blosc2_grok.set_params_defaults(
23
- # codec=blosc2.Codec.GROK,
24
- cod_format=blosc2_grok.GrkFileFmt.GRK_FMT_JP2,
25
- num_threads=self.compression_params["nthreads"],
26
- quality_mode="rates",
27
- quality_layers=numpy.array(
28
- [self.compression_params["cratio"]],
29
- dtype=numpy.float64,
30
- ),
31
- verbose=True,
32
- )
33
-
34
- def __setitem__(self, name, value):
35
- z, _, _ = name
36
- Z, Y, X = self.dataset.shape
37
-
38
- # Verify data type compatibility
39
- if value.dtype not in [numpy.float32, numpy.float64, numpy.uint16]:
40
- raise ValueError(f"Unsupported dtype: {value.dtype}")
41
-
42
- b2im = blosc2.asarray(
43
- value.reshape(1, Y, X),
44
- chunks=(1, Y, X),
45
- blocks=(1, Y, X),
46
- cparams=self.compression_params,
47
- )
48
- cframe = b2im.schunk.to_cframe()
49
- self.dataset.id.write_direct_chunk((z, 0, 0), cframe, filter_mask=0)
50
-
51
- @classmethod
52
- def get_default_compression_params(cls) -> dict:
53
- if _has_blosc2:
54
- return {
55
- "codec": blosc2.Codec.GROK,
56
- "filters": [],
57
- "splitmode": blosc2.SplitMode.NEVER_SPLIT,
58
- "nthreads": 4,
59
- "cratio": 10,
60
- "verbose": True,
61
- }
62
- else:
63
- return {}
File without changes