pax_global_header 0000666 0000000 0000000 00000000064 15114306024 0014506 g ustar 00root root 0000000 0000000 52 comment=b16983926c9abb3b4228148a29cba98677a5d5aa
nxtomomill-v2.0.1/ 0000775 0000000 0000000 00000000000 15114306024 0014076 5 ustar 00root root 0000000 0000000 nxtomomill-v2.0.1/.bandit 0000664 0000000 0000000 00000000025 15114306024 0015335 0 ustar 00root root 0000000 0000000 [bandit]
skips = B101 nxtomomill-v2.0.1/.coveragerc 0000664 0000000 0000000 00000000125 15114306024 0016215 0 ustar 00root root 0000000 0000000 [run]
omit =
*test_*.py,
nxtomomill/converter/hdf5/acquisition/baseaquisition.py,
nxtomomill-v2.0.1/.gitignore 0000664 0000000 0000000 00000001260 15114306024 0016065 0 ustar 00root root 0000000 0000000 # Build files
build
dist
ESRF_Orange3_Add_on.egg-info
Orange/version.py
doc/build
*.so
*.pyd
*.pyc
MANIFEST
# Cython generated files
__pycache__
# Editor files
.idea
.idea/*
*~
.project
.pydevproject
.settings/*
.DS_Store
# Windows temp files
Thumbs.db
# PyLint, Coverage reports
.pylint_cache/*
htmlcov/*
# Tmp files
*tmp
tmp*
*.edf
*.info
*.cfg
*.xml
*.db
*.tar.bz2
*.nx
*.hdf5
*.h5
*.log
dataset/
datasets/
*.egg-info*
# pytest[-cov] artefacts
.coverage
pylint.txt
# notebook checkpoints
*.ipynb_checkpoints/
# notebook nbconvert
*.nbconvert.ipynb
# octave files
octave-workspace
# sphinx
doc/_generated
html
#Local files
sandbox
# gitlabdataset test dataset
*__archive__* nxtomomill-v2.0.1/.gitlab-ci.yml 0000664 0000000 0000000 00000012207 15114306024 0016534 0 ustar 00root root 0000000 0000000 stages:
- style
- linting
- security
- dev_test
- test
- doc
- deploy
variables:
http_proxy: http://proxy.esrf.fr:3128
https_proxy: http://proxy.esrf.fr:3128
no_proxy: .esrf.fr,localhost
.build_template:
tags:
- linux
before_script:
- arch
- python --version
- python -m pip install pip setuptools wheel packaging --upgrade
- rm -rf artifacts
- mkdir artifacts
# style
black:
stage: style
extends: .build_template
image: python:3.10-buster
before_script:
- pip install black
script:
- LC_ALL=C.UTF-8 black --check --safe .
flake8:
stage: style
extends: .build_template
image: python:3.10-buster
before_script:
- pip install flake8
script:
- flake8 nxtomomill --ignore=E501,W503,E203,E731
# linting
pylint:
stage: linting
extends: .build_template
image: docker-registry.esrf.fr/dau/ewoks:python_3.12
before_script:
- mkdir -p artifacts/linting/
- pip install pylint
- pip install git+https://gitlab.esrf.fr/tomotools/nxtomo
- pip install .[test]
script:
- pylint --errors-only --exit-zero --output-format=text nxtomomill | tee pylint.txt
- N_ERRS=`wc -l < pylint.txt`
- echo "Found $N_ERRS linting errors"
# exit 1 must be on the "script" section. If in "after_script" for example the exit 1 will not make the test failed
- if [ $N_ERRS != "0" ]; then exit 1; fi
after_script:
- mv pylint.txt artifacts/linting/
artifacts:
paths:
- artifacts/linting/
when: on_failure
expire_in: 5h
# security
bandit:
stage: security
image: docker-registry.esrf.fr/dau/ewoks:python_3.12
before_script:
- python -m pip install bandit
- python -m pip list
script:
- bandit -r .
# doc
doc:
stage: doc
extends: .build_template
image: docker-registry.esrf.fr/dau/ewoks:python_3.10_doc
script:
- python -m pip install tomoscan --pre
- python -m pip install -e .[doc]
- sphinx-build doc html
- mv html artifacts/doc
artifacts:
paths:
- artifacts/doc/
when: on_success
expire_in: 2h
only:
- main
# dev_tests
.dev_test_template:
extends: .build_template
before_script:
- python -m pip install pytest pytest-cov silx --pre
- python -m pip install git+https://gitlab.esrf.fr/tomotools/nxtomo
- python -m pip install git+https://gitlab.esrf.fr/tomotools/tomoscan
- python -m pip install -e .[test]
script:
- python -m pytest $PYTEST_OPTIONS
dev_test_python3_10:
stage: dev_test
extends: .dev_test_template
variables:
PYTEST_OPTIONS: " --cov-config=.coveragerc --cov-report term-missing --cov-report html:code_coverage_infos --cov=nxtomomill nxtomomill/"
image: docker-registry.esrf.fr/dau/ewoks:python_3.10_glx
coverage: '/(?i)total.*? (100(?:\.0+)?\%|[1-9]?\d(?:\.\d+)?\%)$/'
artifacts:
paths:
- artifacts/code_coverage/
when: on_success
expire_in: 6h
dev_test_python3_11:
stage: dev_test
extends: .dev_test_template
image: docker-registry.esrf.fr/dau/ewoks:python_3.11_glx
variables:
TOMOTOOLS_SWMR: "True"
PYTEST_OPTIONS: "--cov-config=.coveragerc --cov=nxtomomill nxtomomill/ --capture=no --verbose"
dev_test_python3_12:
stage: dev_test
extends: .dev_test_template
image: docker-registry.esrf.fr/dau/ewoks:python_3.12_glx
variables:
TOMOTOOLS_SWMR: "True"
PYTEST_OPTIONS: "--cov-config=.coveragerc --cov=nxtomomill nxtomomill/ --capture=no --verbose"
# tests
.test_template:
extends: .build_template
before_script:
- python -m pip install pytest pytest-cov silx --pre
- python -m pip install git+https://gitlab.esrf.fr/tomotools/nxtomo
- python -m pip install git+https://gitlab.esrf.fr/tomotools/tomoscan.git
- python -m pip install -e .[test]
script:
- python -m pytest $PYTEST_OPTIONS
test_python3_8:
stage: test
extends: .test_template
image: docker-registry.esrf.fr/dau/ewoks:python_3.12_glx
variables:
TOMOTOOLS_SWMR: "False"
PYTEST_OPTIONS: "--cov-config=.coveragerc --cov=nxtomomill nxtomomill/"
only:
- main
allow_failure: true
test_python3_10:
stage: test
extends: .test_template
variables:
PYTEST_OPTIONS: " --cov-config=.coveragerc --cov-report term-missing --cov-report html:code_coverage_infos --cov=nxtomomill nxtomomill/"
image: docker-registry.esrf.fr/dau/ewoks:python_3.10_glx
coverage: '/(?i)total.*? (100(?:\.0+)?\%|[1-9]?\d(?:\.\d+)?\%)$/'
artifacts:
paths:
- artifacts/code_coverage/
when: on_success
expire_in: 6h
only:
- main
allow_failure: true
test_python3_11:
stage: test
extends: .test_template
image: docker-registry.esrf.fr/dau/ewoks:python_3.11_glx
variables:
TOMOTOOLS_SWMR: "True"
PYTEST_OPTIONS: "--cov-config=.coveragerc --cov=nxtomomill nxtomomill/ --capture=no --verbose"
only:
- main
allow_failure: true
test_python3_12:
stage: test
extends: test_python3_11
image: docker-registry.esrf.fr/dau/ewoks:python_3.12_glx
only:
- main
allow_failure: true
# deploy
pages:
stage: deploy
image: python:3.13
script:
- rm -rf public
- mv artifacts/doc public
after_script:
- ls -Rl public
artifacts:
paths:
- public
expire_in: 1h
only:
- main
nxtomomill-v2.0.1/.gitlab/ 0000775 0000000 0000000 00000000000 15114306024 0015416 5 ustar 00root root 0000000 0000000 nxtomomill-v2.0.1/.gitlab/issue_templates/ 0000775 0000000 0000000 00000000000 15114306024 0020624 5 ustar 00root root 0000000 0000000 nxtomomill-v2.0.1/.gitlab/issue_templates/bug_report.md 0000664 0000000 0000000 00000001547 15114306024 0023325 0 ustar 00root root 0000000 0000000 Description
-----------
(Summarize the bug encountered concisely)
Steps to reproduce
------------------
(How one can reproduce the issue - this is very important)
1. ...
2. ...
3. ...
What is the current bug behavior?
---------------------------------
(What actually happens)
What is the expected correct behavior?
--------------------------------------
(What you should see instead)
Relevant logs, error output, screenshots ...
--------------------------------------------
(Paste any relevant logs - please use code blocks (```) to format console output,
logs, and code as it's very hard to read otherwise.)
Possible fixes
--------------
(If you can, link to the line of code that might be responsible for the problem)
What versions of software are you using?
----------------------------------------
Any other comments?
-------------------
...
nxtomomill-v2.0.1/.gitlab/issue_templates/feature_request.md 0000664 0000000 0000000 00000000316 15114306024 0024351 0 ustar 00root root 0000000 0000000 Description
-----------
User Case(s)
------------
Test Case(s)
------------
Raw material (example script, data...)
--------------------------------------
Any other comments?
-------------------
...
nxtomomill-v2.0.1/.gitlab/merge_request_templates/ 0000775 0000000 0000000 00000000000 15114306024 0022343 5 ustar 00root root 0000000 0000000 nxtomomill-v2.0.1/.gitlab/merge_request_templates/default_merge_request.md 0000664 0000000 0000000 00000000417 15114306024 0027242 0 ustar 00root root 0000000 0000000 Description / Goal
------------------
TODO list
---------
- [ ]
...
- [ ] doc
- [ ] add test
INFO (how to use...)
--------------------
Any warning ?
-------------
associated materials (screenshot, test scripts...)
--------------------------------------------------
nxtomomill-v2.0.1/.pre-commit-config.yaml 0000664 0000000 0000000 00000000171 15114306024 0020356 0 ustar 00root root 0000000 0000000 repos:
- repo: https://github.com/psf/black
rev: 18.6b4
hooks:
- id: black
language_version: python3
nxtomomill-v2.0.1/.readthedocs.yaml 0000664 0000000 0000000 00000001144 15114306024 0017325 0 ustar 00root root 0000000 0000000 # Read the Docs configuration file
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
# Required
version: 2
# Set the version of Python and other tools you might need
build:
os: ubuntu-24.04
tools:
python: "3.12"
# Build documentation in the docs/ directory with Sphinx
sphinx:
configuration: doc/conf.py
# If using Sphinx, optionally build your docs in additional formats such as PDF
# formats:
# - pdf
# Optionally declare the Python requirements required to build your docs
python:
install:
- method: pip
path: .
extra_requirements:
- doc
nxtomomill-v2.0.1/CHANGELOG.md 0000664 0000000 0000000 00000025371 15114306024 0015717 0 ustar 00root root 0000000 0000000 # Changelog
All notable changes to this project will be documented in this file.
The format follows the [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) conventions and this project adheres to [Semantic Versioning 2.0.0](https://semver.org/spec/v2.0.0.html).
## [2.0.1] - 2025-12-04
### Fixed
- **h52nx**: be more resilient to esrf mounting point
## [2.0.0] - 2025-11-21
### Changed
- Save NXtomo according to McStats (a flip between *x*, *y* and *z* axes is now supported).
### Added
- **h52nx**
- Handle `rotation_is_clockwise`.
- Allow users to provide mechanical flips.
- Try to deduce scan category/type from `technique` / `scan_category`.
### Fixed
- **h52nx** – Improve robustness to invalid unit.
### Misc
- The minimum Python version required is now **3.10**.
## [1.2.7] - 2025-09-22
### Fixed
- **h52nx** – Read `optic_pixel_size` first to determine detector/pixel size (PR 337).
## [1.2.6] - 2025-09-19
### Fixed
- **h52nx** – Fix execution from the configuration file (PR 334).
## [1.2.5] - 2025-07-29
### Fixed
- **h52nx** – Improve robustness if the camera is defined but no dataset is created (PR 328).
## [1.2.4] - 2025-07-29
### Removed
- **h52nx** – Remove `bam_single_file` option (PR 324).
- Applications – Remove `configuration-level` option (PR 324).
### Changed
- Move config files to **pydantic** (PR 324).
## [1.2.3] - 2025-07-21
### Fixed
- **h52nx** – Fix performance issues from `deduce_machine_current` (PR 320).
## [1.2.0] - 2025‑07‑18
### Changed
- Refactored acquisition handling: added `_AcquisitionConstructor` classes (PR 313).
- `pcotomo` deprecated in favour of `multitomo`.
- Renamed `machine_electric_current` → `machine_current` (PR 305, 285).
- Switched from `pyunit` to **pint** for units handling (PR 310, 309, 306, 294).
- **Documentation**
- Use `program-output` (PR 299, 293).
### Added
- **h52nx**
- `--with-master-file` option (replaces the old `--no-master-file` flag).
- Propagation distance, sample‑to‑source distance, and sample pixel size handling.
- Bliss “back‑and‑forth” sequence handling.
- `sequence_number` handling.
### Fixed
- Silx deprecation warning removed (PR 315).
### Misc
- Minimum supported Python version is now **3.9**.
- Added **Bandit** to the CI pipeline.
## [1.1.0] - 2024‑12‑06
### Added
- **h52nx**
- `--no-master-file` option (PR 272).
- Cropping fix for machine‑current points (PR 177).
- Motor geometry fix (PR 195).
- Source‑to‑sample distance handling (PR 202).
- Region‑of‑interest (ROI) support (PR 172).
- **edf2nx**
- Option to use real angle values (PR 181).
### Changed
- **h52nx**
- Improved machine‑current deduction (PR 179).
### Misc
- Progress reporting moved to **tqdm** (PR 187).
- Removed legacy `3D‑XRD` and `XRD‑CT` classes (PR 196).
- Dropped `require_x_translation` and `require_z_translation` (PR 199).
- Removed `scan_numbers` usage (PR 173).
- Updated to `__future__` annotations (PR 166).
- Sources moved to the `src` directory (PR 130).
## [1.0.11] - 2024‑10‑07
### Changed
- **h52nx** – Modified Bliss file scan ordering to use each scan’s `start_time` when present.
## [1.0.9] - 2024‑08‑27
### Added
- **h52nx** – Added handling for Z‑series version 3 (PR 258).
## [1.0.0] - 2024‑02‑23
### Added
- **app**
- `nx-copy` – Copies an NXtomo and updates relative HDF5 VDS links (PR 188).
### Removed
- Removed `is_xrdct_entry` (PR 209).
### Misc
- Documentation rebuilt with **sphinx‑pydata‑theme**.
- Upgraded to **silx 2.0**.
## [0.13.2] - 2023‑08‑03
### Added
- **converter → hdf5**
- `bliss_original_files` option.
## [0.13.0] - 2023‑08‑01
### Changed
- **hdf5**
- Uses `technique/image` Bliss metadata when available (PR 147, 168).
- Improved multi‑tomo (`pcotomo`) robustness (PR 160, 159).
- `estimated_cor_from_motor` now set for 360° scans (PR 161).
- Better handling of cancelled scans (PR 158, 165).
- Removed `real pixel size` and `magnification` fields.
- **nexus**
- Strengthened node‑name vs‑path handling robustness (PR 173).
- **app**
- `edf2nx-check` – Verify previous conversions and optionally delete EDF sources (PR 164).
- `split-nxfile` – Split a file containing multiple NXtomo entries (PR 172).
- `z-concatenate-scans` – Concatenate a Z‑series into a single NXtomo (PR 174, 175).
- Deprecated `h5-quick-start` → `h5-config` and `edf-quick-start` → `edf-config` (PR 166).
- **misc**
- Deprecated `from_dx_to_nx` → `from_dx_config_to_nx` (PR 167).
- Replaced `str.format` with f‑strings where possible (PR 154).
- Added batch‑processing example to docs.
### Added
- **edf2**
- `output-checks` option to validate generated volumes (PR 155).
- `delete-edf` option to delete source EDF files after conversion (PR 155).
- `zstages2nxs` – Added `output_filename_template` option (PR 176).
### Removed
- **converter**
- Removed `x`/`y` real‑pixel‑size and magnification metadata.
- **hdf5**
- Removed unused plugins system (PR 177).
## [0.12.0] - 2023‑02‑23
### Added
- **app**
- `zstages2nxs` command (PR 145).
- **converter → hdf5**
- Frame‑flip information (PR 109).
### Changed
- **converter → edf2nx**
- Better handling of current units (PR 150).
### misc
- Dropped `numpy.distutils` for packaging (PR 151).
## [0.11.0] - 2022‑12‑15
### Added
- **converter → hdf5**
- Support for `{detector_name}` placeholders in paths.
- Flip handling.
- Fixed inability to locate pixel position & energy for Z‑series.
## [0.10.9] - 2022‑10‑26
### Added
- **converter → hdf5converter**
- Support for EBStomo `pcotomo` second version.
## [0.10.1] - 2022‑08‑31
### Fixed
- **converter**
- Default distance, X/Y/Z translation units set to **millimeter** in `EDFConfig`.
- Fixed field‑of‑view deduction in `edf2nx`.
## [0.10.0] - 2022‑08‑30
### Added
- **converter**
- `hdf5converter`
- Added magnification management (PR 110).
- Added sub‑selection of NXtomo by rotation angle and pcotomo‑specific parameters (PR 100).
- `edf2nx`
- Added option to avoid data duplication (PR 114, 115, 118).
- **nexus**
- Added `probe` to `NXsource` (PR 117).
### Changed
- **converter**
- Improved `NXdetector.data` setter (PR 122).
- Renamed attribute `unit` → `units`.
### Removed
- **converter**
- Removed deprecated `h5_to_nx` (since 0.5.0).
## [0.9.0] - 2022‑06‑24
### Added
- **converter → hdf5**
- Machine electrical current handling (PR 106).
- `is_rearranged` attribute management (PR 111).
- **converter → edf**
- Configuration‑file support (PR 104).
- **nexus**
- Added Nxtomo concatenation (PR 109).
## [0.8.0] - 2021‑06‑04
### Added
- **converter → hdf5**
- `bam_single_file` option (PR 96).
- pcotomo management (PR 91, 88).
- Added **nexus** module exposing an API to edit an NXtomo (PR 87).
## [0.7.0] - 2021‑01‑07
### Added
- **converter → hdf5**
- ExternalLink handling for Bliss proposal files (PR 85).
- **converter → edf**
- Fixed progress‑bar issues (PR 80).
- **patch‑nx**
- Option to convert all frames of a given type (PR 84).
- **dxfile2nx**
- Single‑value pixel‑size support (PR 77).
- **miscellaneous**
- Added missing aliases `flat`/`ref` (PR 83).
- Integrated validator (PR 81).
## [0.6.0] - 2021‑10‑04
### Added
- **app**
- `dxfile2nx` – Convert DX‑files to NXtomo.
- `h52nx` – New `duplicate_data` flag to force frame duplication.
- `h5-3dxrd-2nx` – Convert Bliss‑HDF5 3D‑XRD to enhanced NXtomo (updates VDS links).
- **converter**
- Added `dxfileconverter`.
## [0.5.0] - 2021‑04‑20
### Fixed
- **utils**
- Fixed negative‑index handling.
### Added
- **converter → hdf5**
- Added `start_time` & `end_time` fields.
- Full configuration‑file support (`HDF5Config`, `HDF5ConfigHandler`).
- `ignore_sub_entries` to skip specific scans.
- **app**
- `patch-nx` – Added `--embed-data` flag.
- Added `--ignore-sub-entries` option.
### Changed
- **converter → hdf5**
- Reworked virtual‑dataset creation.
- Enforced projection count consistency (`tomo_n`).
- Improved key/path discovery logic.
- Warning when no acquisitions are found.
- **utils**
- Refactored `_insert_frame_data` into `_FrameAppender` class.
- **app**
- Renamed `tomoh52nx` → `h52nx` (deprecating former).
- Renamed `tomoedf2nx` → `edf2nx` (deprecating former).
- `h52nx` now accepts a configuration file (`--config`).
## [0.4.0] - 2020‑11‑09
### Added
- **utils**
- `change_image_key_control` – Modify frame type in‑place.
- `add_dark_flat_nx_file` – Insert dark/flat series into an existing NXtomo.
- **converter → h5_to_nx**
- Proposal‑file handling (External/SoftLink).
- Saved discovered magnified/sample pixel size as `pixel_size`.
- Optional `display_advancement` flag.
- Z‑series split by Z value.
- Added NXdata for root‑level detector/image display.
- **app**
- `tomoh52nx` – Added warnings for files already containing NXtomo entries, auto‑creates output directories, checks write permissions, splits Z‑series.
### Changed
- **app**
- `patch-nx` – Modify existing NXtomo (add dark/flat, change frame type).
- **converter → h5_to_nx**
- Enforced relative paths for output files.
### Misc
- Minimum required **h5py ≥ 3**.
- Adopted **black** code‑style formatting.
## [0.3.4] - 2020‑10‑05
### Fixed
- Logging issues in the converter.
## [0.3.3] - 2020‑08‑26
### Added
- **h5_to_nx**
- `set-param` option to pre‑define parameters (e.g., energy) and avoid interactive prompts.
- **io**
- Support for HDF5 files via `tomoscan.io.HDF5File`.
## [0.3.1] - 2020‑08‑19
### Added
- `field_of_view` parameter.
- Plugin system allowing users to define motor positions from a Python script (PR !19).
## [0.3.0] - 2020‑03‑20
### Added
- **app**
- Various options to set titles.
- **h5_to_nx**
- Plugin support for custom motor positions.
- Distances now expressed in **metres**.
- **edf_to_nx**
- Distances now expressed in **metres**.
## [0.2.0] - 2020‑04‑22
### Added
- Entry point on `__main__`.
- **converter → h5_to_nx**
- Optional callback for input handling.
- **doc**
- API documentation.
- Tutorials for `tomoedf2nx` and `tomoh5tonx`.
## [0.1.0] - 2020‑03‑12
### Added
- **app**
- `tomoedf2nx` – Convert Bliss + EDF acquisitions to HDF5/NXtomo.
- `tomoh5tonx` – Convert Bliss/HDF5 acquisitions to NXtomo.
- **converter**
- `h5_to_nx` – Core conversion function from Bliss HDF5 to NXtomo.
- `get_bliss_tomo_entries` – Retrieve Bliss “roor” entries (e.g., `tomo:basic`, `tomo:fullturn`).
nxtomomill-v2.0.1/LICENSE 0000664 0000000 0000000 00000002351 15114306024 0015104 0 ustar 00root root 0000000 0000000
The nxtomomill library goal is to provide a python interface to read ESRF tomography dataset.
nxtomomill is distributed under the MIT license.
The MIT license follows:
Copyright (c) European Synchrotron Radiation Facility (ESRF)
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
nxtomomill-v2.0.1/README.md 0000664 0000000 0000000 00000002225 15114306024 0015356 0 ustar 00root root 0000000 0000000 # nxtomomill
nxtomomill provide a set of applications and tools around the [NXtomo](https://manual.nexusformat.org/classes/applications/NXtomo.html) format defined by the [NeXus community](https://manual.nexusformat.org/index.html#).
It includes for example the convertion from bliss raw data (@ESRF) to NXtomo, or from spec EDF (@ESRF) to NXtomo. But also creation from scratch and edition of an NXtomo from a python API.
It also embed a `nexus` module allowing users to easily edit Nxtomo
## installation
To install the latest 'nxtomomill' pip package
```bash
pip install nxtomomill
```
You can also install nxtomomill from source:
```bash
pip install git+https://gitlab.esrf.fr/tomotools/nxtomomill.git
```
## documentation
General documentation can be found here: [https://tomotools.gitlab-pages.esrf.fr/nxtomomill/](https://tomotools.gitlab-pages.esrf.fr/nxtomomill/)
## application
documentation regarding applications can be found here: [https://tomotools.gitlab-pages.esrf.fr/nxtomomill/tutorials/index.html](https://tomotools.gitlab-pages.esrf.fr/nxtomomill/tutorials/index.html)
or to get help you can directly go for
```bash
nxtomomill --help
```
nxtomomill-v2.0.1/doc/ 0000775 0000000 0000000 00000000000 15114306024 0014643 5 ustar 00root root 0000000 0000000 nxtomomill-v2.0.1/doc/Makefile 0000664 0000000 0000000 00000001176 15114306024 0016310 0 ustar 00root root 0000000 0000000 # Minimal makefile for Sphinx documentation
#
# You can set these variables from the command line, and also
# from the environment for the first two.
SPHINXOPTS ?=
SPHINXBUILD ?= sphinx-build
SOURCEDIR = source
BUILDDIR = build
# Put it first so that "make" without argument is like "make help".
help:
@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
.PHONY: help Makefile
# Catch-all target: route all unknown targets to Sphinx using the new
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
%: Makefile
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
nxtomomill-v2.0.1/doc/_static/ 0000775 0000000 0000000 00000000000 15114306024 0016271 5 ustar 00root root 0000000 0000000 nxtomomill-v2.0.1/doc/_static/navbar_icons/ 0000775 0000000 0000000 00000000000 15114306024 0020735 5 ustar 00root root 0000000 0000000 nxtomomill-v2.0.1/doc/_static/navbar_icons/gitlab.svg 0000664 0000000 0000000 00000005735 15114306024 0022732 0 ustar 00root root 0000000 0000000
nxtomomill-v2.0.1/doc/_static/navbar_icons/pypi.svg 0000664 0000000 0000000 00000170770 15114306024 0022453 0 ustar 00root root 0000000 0000000
nxtomomill-v2.0.1/doc/_templates/ 0000775 0000000 0000000 00000000000 15114306024 0017000 5 ustar 00root root 0000000 0000000 nxtomomill-v2.0.1/doc/_templates/autosummary/ 0000775 0000000 0000000 00000000000 15114306024 0021366 5 ustar 00root root 0000000 0000000 nxtomomill-v2.0.1/doc/_templates/autosummary/class.rst 0000664 0000000 0000000 00000001142 15114306024 0023223 0 ustar 00root root 0000000 0000000 {{ fullname | escape | underline}}
.. currentmodule:: {{ module }}
.. autoclass:: {{ objname }}
:members:
:show-inheritance:
:inherited-members:
{% block methods %}
.. automethod:: __init__
{% if methods %}
.. rubric:: {{ _('Methods') }}
.. autosummary::
{% for item in methods %}
~{{ name }}.{{ item }}
{%- endfor %}
{% endif %}
{% endblock %}
{% block attributes %}
{% if attributes %}
.. rubric:: {{ _('Attributes') }}
.. autosummary::
{% for item in attributes %}
~{{ name }}.{{ item }}
{%- endfor %}
{% endif %}
{% endblock %} nxtomomill-v2.0.1/doc/_templates/autosummary/module.rst 0000664 0000000 0000000 00000002145 15114306024 0023407 0 ustar 00root root 0000000 0000000 {{ fullname | escape | underline}}
.. automodule:: {{ fullname }}
{% block attributes %}
{% if attributes %}
.. rubric:: Module Attributes
.. autosummary::
:toctree:
{% for item in attributes %}
{{ item }}
{%- endfor %}
{% endif %}
{% endblock %}
{% block functions %}
{% if functions %}
.. rubric:: {{ _('Functions') }}
.. autosummary::
:toctree:
{% for item in functions %}
{{ item }}
{%- endfor %}
{% endif %}
{% endblock %}
{% block classes %}
{% if classes %}
.. rubric:: {{ _('Classes') }}
.. autosummary::
:toctree:
{% for item in classes %}
{{ item }}
{%- endfor %}
{% endif %}
{% endblock %}
{% block exceptions %}
{% if exceptions %}
.. rubric:: {{ _('Exceptions') }}
.. autosummary::
:toctree:
{% for item in exceptions %}
{{ item }}
{%- endfor %}
{% endif %}
{% endblock %}
{% block modules %}
{% if modules %}
.. rubric:: Modules
.. autosummary::
:toctree:
:recursive:
{% for item in modules %}
{{ item }}
{%- endfor %}
{% endif %}
{% endblock %} nxtomomill-v2.0.1/doc/_templates/version.html 0000664 0000000 0000000 00000000100 15114306024 0021342 0 ustar 00root root 0000000 0000000
{{ version }} nxtomomill-v2.0.1/doc/api.rst 0000664 0000000 0000000 00000000147 15114306024 0016150 0 ustar 00root root 0000000 0000000 API Reference
=============
.. autosummary::
:toctree: _generated
:recursive:
nxtomomill nxtomomill-v2.0.1/doc/conf.py 0000664 0000000 0000000 00000006444 15114306024 0016152 0 ustar 00root root 0000000 0000000 # Configuration file for the Sphinx documentation builder.
#
# This file only contains a selection of the most common options. For a full
# list see the documentation:
# https://www.sphinx-doc.org/en/master/usage/configuration.html
# -- Path setup --------------------------------------------------------------
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
#
# import os
# import sys
# sys.path.insert(0, os.path.abspath('.'))
# -- Project information -----------------------------------------------------
project = "nxtomomill"
copyright = "2020-2025, ESRF"
author = "P.-O. Autran, J. Lesaint, A. Mirone, C. Nemoz, P. Paleo, H. Payno, A. Sole, N. Vigano"
# The full version, including alpha/beta/rc tags
release = "2.0"
version = release
# -- General configuration ---------------------------------------------------
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = [
"sphinx.ext.autodoc",
"sphinx.ext.autosectionlabel",
"sphinx.ext.intersphinx",
"sphinx.ext.viewcode",
"sphinx.ext.doctest",
"sphinx.ext.inheritance_diagram",
"sphinx.ext.autosummary",
"nbsphinx",
"sphinx_design",
"sphinx_autodoc_typehints",
"sphinxcontrib.programoutput",
"myst_parser",
]
source_suffix = {
".rst": "restructuredtext",
".md": "markdown",
}
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ["_static"]
# Add any paths that contain templates here, relative to this directory.
templates_path = ["_templates"]
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
# This pattern also affects html_static_path and html_extra_path.
exclude_patterns = []
# -- Options for HTML output -------------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
#
html_theme = "pydata_sphinx_theme"
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = "sphinx"
html_logo = "img/nxtomomill.png"
# autosummary options
autosummary_generate = True
autodoc_default_flags = [
"members",
"undoc-members",
"show-inheritance",
]
html_theme_options = {
"icon_links": [
{
"name": "pypi",
"url": "https://pypi.org/project/nxtomomill",
"icon": "_static/navbar_icons/pypi.svg",
"type": "local",
},
{
"name": "gitlab",
"url": "https://gitlab.esrf.fr/tomotools/nxtomomill",
"icon": "_static/navbar_icons/gitlab.svg",
"type": "local",
},
],
"show_toc_level": 1,
"navbar_align": "left",
"show_version_warning_banner": True,
"navbar_start": ["navbar-logo", "version"],
"navbar_center": ["navbar-nav"],
"footer_start": ["copyright"],
"footer_center": ["sphinx-version"],
}
nxtomomill-v2.0.1/doc/development/ 0000775 0000000 0000000 00000000000 15114306024 0017165 5 ustar 00root root 0000000 0000000 nxtomomill-v2.0.1/doc/development/changelog.rst 0000664 0000000 0000000 00000000100 15114306024 0021635 0 ustar 00root root 0000000 0000000 .. include:: ../../CHANGELOG.md
:parser: myst_parser.sphinx_
nxtomomill-v2.0.1/doc/development/create_your_own_sequence.rst 0000664 0000000 0000000 00000006527 15114306024 0025025 0 ustar 00root root 0000000 0000000 How to define your own sequence to build an NXtomo
==================================================
Design
""""""
The conversion process is done as follow:
.. image:: img/nxtomomill_design_1.png
The first step this can be done two ways
.. image:: img/nxtomomill_design_2.png
Until now we were only using the title to deduce the acquisition and the type of frames of each Bliss entry.
But the `FRAME_TYPE_SECTION` allow us to ignore those titles and define manually the sequence of the acquisition.
Coming back to the `FRAME_TYPE_SECTION` section
`FRAME_TYPE_SECTION` section
''''''''''''''''''''''''''''
If this section is fill then the `ENTRIES_AND_TITLES_SECTION` will be ignored. Those are mutually exclusive sections.
From it we can define `data_scans` that allow us to define a sequence of scan defining an acquisition using [url](https://fr.wikipedia.org/wiki/Uniform_Resource_Locator). Like:
.. code-block:: text
data_scans = (
(frame_type=projections, entry=silx:///path/to/file?/path/to/scan/node,),
(frame_type=projections, entry=/path_relative_to_file),
)
Here we will create one acquisition from `silx:///path/to/file?/path/to/scan/node` to be used as a set of projections and `/path_relative_to_file` as a set of projections to.
.. note::
Url can be relative to different file
.. warning::
The created acquisition will follow the provided order
Example: create an NXtomo using the `data_scans` field
""""""""""""""""""""""""""""""""""""""""""""""""""""""
Using the configuration file
''''''''''''''''''''''''''''
You can find a file `conversion_using_data_scans.cfg` in the `solution` folder that create an acquisition using `data_scans`:
.. image:: img/nxtomomill_example_data_scans.png
It can be executed by calling:
.. code-block:: bash
nxtomomill h52nx --config conversion_using_data_scans.cfg
Using the python API
''''''''''''''''''''
.. code-block:: python
from nxtomomill.converter import from_h5_to_nx
from nxtomomill.io.config import TomoHDF5Config
from nxtomomill.io.config.h52nxtomo_models import FrameGroup
from silx.io.url import DataUrl
input_file_path = "bambou_hercules_0001.h5"
configuration = TomoHDF5Config()
configuration.input_file = input_file_path
configuration.output_file = "bambou_hercules_0001.nx"
configuration.data_scans = (
FrameGroup(
url=DataUrl(
file_path=input_file_path,
data_path="1.1",
scheme="silx",
),
frame_type="initialization",
),
FrameGroup(
url=DataUrl(
file_path=input_file_path,
data_path="2.1",
scheme="silx",
),
frame_type="darks",
),
FrameGroup(
url=DataUrl(
file_path=input_file_path,
data_path="3.1",
scheme="silx",
),
frame_type="flats",
),
FrameGroup(
url=DataUrl(
file_path=input_file_path,
data_path="4.1",
scheme="silx",
),
frame_type="projections",
),
)
res = from_h5_to_nx(configuration=configuration)
.. note::
you will see another way to create an NXtomo from scratch that could be another alternative.
nxtomomill-v2.0.1/doc/development/design/ 0000775 0000000 0000000 00000000000 15114306024 0020436 5 ustar 00root root 0000000 0000000 nxtomomill-v2.0.1/doc/development/design/acquisitions_class_diag.mdj 0000664 0000000 0000000 00000145227 15114306024 0026031 0 ustar 00root root 0000000 0000000 {
"_type": "Project",
"_id": "AAAAAAFF+h6SjaM2Hec=",
"name": "Untitled",
"ownedElements": [
{
"_type": "UMLModel",
"_id": "AAAAAAFF+qBWK6M3Z8Y=",
"_parent": {
"$ref": "AAAAAAFF+h6SjaM2Hec="
},
"name": "Model",
"ownedElements": [
{
"_type": "UMLClassDiagram",
"_id": "AAAAAAFF+qBtyKM79qY=",
"_parent": {
"$ref": "AAAAAAFF+qBWK6M3Z8Y="
},
"name": "Main",
"defaultDiagram": true,
"ownedViews": [
{
"_type": "UMLClassView",
"_id": "AAAAAAF5YEo6dhiOqvw=",
"_parent": {
"$ref": "AAAAAAFF+qBtyKM79qY="
},
"model": {
"$ref": "AAAAAAF5YEo6dRiMOo4="
},
"subViews": [
{
"_type": "UMLNameCompartmentView",
"_id": "AAAAAAF5YEo6dhiPytk=",
"_parent": {
"$ref": "AAAAAAF5YEo6dhiOqvw="
},
"model": {
"$ref": "AAAAAAF5YEo6dRiMOo4="
},
"subViews": [
{
"_type": "LabelView",
"_id": "AAAAAAF5YEo6dhiQ7VI=",
"_parent": {
"$ref": "AAAAAAF5YEo6dhiPytk="
},
"visible": false,
"font": "Arial;13;0",
"left": -160,
"top": -240,
"height": 13
},
{
"_type": "LabelView",
"_id": "AAAAAAF5YEo6dhiRYSo=",
"_parent": {
"$ref": "AAAAAAF5YEo6dhiPytk="
},
"font": "Arial;13;3",
"left": 45,
"top": 143,
"width": 555.39453125,
"height": 13,
"text": "BaseAcquisition"
},
{
"_type": "LabelView",
"_id": "AAAAAAF5YEo6dhiS7HE=",
"_parent": {
"$ref": "AAAAAAF5YEo6dhiPytk="
},
"visible": false,
"font": "Arial;13;0",
"left": -160,
"top": -240,
"width": 73.67724609375,
"height": 13,
"text": "(from Model)"
},
{
"_type": "LabelView",
"_id": "AAAAAAF5YEo6dxiTJno=",
"_parent": {
"$ref": "AAAAAAF5YEo6dhiPytk="
},
"visible": false,
"font": "Arial;13;0",
"left": -160,
"top": -240,
"height": 13,
"horizontalAlignment": 1
}
],
"font": "Arial;13;0",
"left": 40,
"top": 136,
"width": 565.39453125,
"height": 25,
"stereotypeLabel": {
"$ref": "AAAAAAF5YEo6dhiQ7VI="
},
"nameLabel": {
"$ref": "AAAAAAF5YEo6dhiRYSo="
},
"namespaceLabel": {
"$ref": "AAAAAAF5YEo6dhiS7HE="
},
"propertyLabel": {
"$ref": "AAAAAAF5YEo6dxiTJno="
}
},
{
"_type": "UMLAttributeCompartmentView",
"_id": "AAAAAAF5YEo6dxiU47Y=",
"_parent": {
"$ref": "AAAAAAF5YEo6dhiOqvw="
},
"model": {
"$ref": "AAAAAAF5YEo6dRiMOo4="
},
"subViews": [
{
"_type": "UMLAttributeView",
"_id": "AAAAAAF5YE3qxhuhs2k=",
"_parent": {
"$ref": "AAAAAAF5YEo6dxiU47Y="
},
"model": {
"$ref": "AAAAAAF5YE3qnRuekgo="
},
"font": "Arial;13;0",
"left": 45,
"top": 166,
"width": 555.39453125,
"height": 13,
"text": "+configuration",
"horizontalAlignment": 0
},
{
"_type": "UMLAttributeView",
"_id": "AAAAAAF5YE5rDRvMRFw=",
"_parent": {
"$ref": "AAAAAAF5YEo6dxiU47Y="
},
"model": {
"$ref": "AAAAAAF5YE5q+RvJz2Q="
},
"font": "Arial;13;0",
"left": 45,
"top": 181,
"width": 555.39453125,
"height": 13,
"text": "+root_url",
"horizontalAlignment": 0
}
],
"font": "Arial;13;0",
"left": 40,
"top": 161,
"width": 565.39453125,
"height": 38
},
{
"_type": "UMLOperationCompartmentView",
"_id": "AAAAAAF5YEo6dxiVdxg=",
"_parent": {
"$ref": "AAAAAAF5YEo6dhiOqvw="
},
"model": {
"$ref": "AAAAAAF5YEo6dRiMOo4="
},
"subViews": [
{
"_type": "UMLOperationView",
"_id": "AAAAAAF5YE8aExwSFh4=",
"_parent": {
"$ref": "AAAAAAF5YEo6dxiVdxg="
},
"model": {
"$ref": "AAAAAAF5YE8aAhwP3cw="
},
"font": "Arial;13;0",
"left": 45,
"top": 204,
"width": 555.39453125,
"height": 13,
"text": "+register_step(url, entry_type, copy_frames)",
"horizontalAlignment": 0
},
{
"_type": "UMLOperationView",
"_id": "AAAAAAF5YFSnrh0hmNg=",
"_parent": {
"$ref": "AAAAAAF5YEo6dxiVdxg="
},
"model": {
"$ref": "AAAAAAF5YFSnnB0euqk="
},
"font": "Arial;13;0",
"left": 45,
"top": 219,
"width": 555.39453125,
"height": 13,
"text": "+write_as_nxtomo(output_file, data_path, input_file_path, request_input, plugins, input_callback)",
"horizontalAlignment": 0
},
{
"_type": "UMLOperationView",
"_id": "AAAAAAF5YFcTpx5jjkw=",
"_parent": {
"$ref": "AAAAAAF5YEo6dxiVdxg="
},
"model": {
"$ref": "AAAAAAF5YFcTmR5gyVI="
},
"font": "Arial;13;0",
"left": 45,
"top": 234,
"width": 555.39453125,
"height": 13,
"text": "+set_plugins(plugins)",
"horizontalAlignment": 0
}
],
"font": "Arial;13;0",
"left": 40,
"top": 199,
"width": 565.39453125,
"height": 53
},
{
"_type": "UMLReceptionCompartmentView",
"_id": "AAAAAAF5YEo6dxiWRj0=",
"_parent": {
"$ref": "AAAAAAF5YEo6dhiOqvw="
},
"model": {
"$ref": "AAAAAAF5YEo6dRiMOo4="
},
"visible": false,
"font": "Arial;13;0",
"left": -80,
"top": -120,
"width": 10,
"height": 10
},
{
"_type": "UMLTemplateParameterCompartmentView",
"_id": "AAAAAAF5YEo6dxiXRX4=",
"_parent": {
"$ref": "AAAAAAF5YEo6dhiOqvw="
},
"model": {
"$ref": "AAAAAAF5YEo6dRiMOo4="
},
"visible": false,
"font": "Arial;13;0",
"left": -80,
"top": -120,
"width": 10,
"height": 10
}
],
"font": "Arial;13;0",
"containerChangeable": true,
"left": 40,
"top": 136,
"width": 565.39453125,
"height": 116,
"nameCompartment": {
"$ref": "AAAAAAF5YEo6dhiPytk="
},
"attributeCompartment": {
"$ref": "AAAAAAF5YEo6dxiU47Y="
},
"operationCompartment": {
"$ref": "AAAAAAF5YEo6dxiVdxg="
},
"receptionCompartment": {
"$ref": "AAAAAAF5YEo6dxiWRj0="
},
"templateParameterCompartment": {
"$ref": "AAAAAAF5YEo6dxiXRX4="
}
},
{
"_type": "UMLClassView",
"_id": "AAAAAAF5YErP9Ri4ZmE=",
"_parent": {
"$ref": "AAAAAAFF+qBtyKM79qY="
},
"model": {
"$ref": "AAAAAAF5YErP9Ri2oM4="
},
"subViews": [
{
"_type": "UMLNameCompartmentView",
"_id": "AAAAAAF5YErP9Ri5YMs=",
"_parent": {
"$ref": "AAAAAAF5YErP9Ri4ZmE="
},
"model": {
"$ref": "AAAAAAF5YErP9Ri2oM4="
},
"subViews": [
{
"_type": "LabelView",
"_id": "AAAAAAF5YErP9Ri6JAM=",
"_parent": {
"$ref": "AAAAAAF5YErP9Ri5YMs="
},
"visible": false,
"font": "Arial;13;0",
"height": 13
},
{
"_type": "LabelView",
"_id": "AAAAAAF5YErP9Ri7Bvo=",
"_parent": {
"$ref": "AAAAAAF5YErP9Ri5YMs="
},
"font": "Arial;13;1",
"left": 77,
"top": 399,
"width": 127.1181640625,
"height": 13,
"text": "StandardAcquisition"
},
{
"_type": "LabelView",
"_id": "AAAAAAF5YErP9Ri8Thk=",
"_parent": {
"$ref": "AAAAAAF5YErP9Ri5YMs="
},
"visible": false,
"font": "Arial;13;0",
"width": 73.67724609375,
"height": 13,
"text": "(from Model)"
},
{
"_type": "LabelView",
"_id": "AAAAAAF5YErP9Ri95vA=",
"_parent": {
"$ref": "AAAAAAF5YErP9Ri5YMs="
},
"visible": false,
"font": "Arial;13;0",
"height": 13,
"horizontalAlignment": 1
}
],
"font": "Arial;13;0",
"left": 72,
"top": 392,
"width": 137.1181640625,
"height": 25,
"stereotypeLabel": {
"$ref": "AAAAAAF5YErP9Ri6JAM="
},
"nameLabel": {
"$ref": "AAAAAAF5YErP9Ri7Bvo="
},
"namespaceLabel": {
"$ref": "AAAAAAF5YErP9Ri8Thk="
},
"propertyLabel": {
"$ref": "AAAAAAF5YErP9Ri95vA="
}
},
{
"_type": "UMLAttributeCompartmentView",
"_id": "AAAAAAF5YErP9Ri+rm4=",
"_parent": {
"$ref": "AAAAAAF5YErP9Ri4ZmE="
},
"model": {
"$ref": "AAAAAAF5YErP9Ri2oM4="
},
"font": "Arial;13;0",
"left": 72,
"top": 417,
"width": 137.1181640625,
"height": 10
},
{
"_type": "UMLOperationCompartmentView",
"_id": "AAAAAAF5YErP9hi/8bA=",
"_parent": {
"$ref": "AAAAAAF5YErP9Ri4ZmE="
},
"model": {
"$ref": "AAAAAAF5YErP9Ri2oM4="
},
"font": "Arial;13;0",
"left": 72,
"top": 427,
"width": 137.1181640625,
"height": 10
},
{
"_type": "UMLReceptionCompartmentView",
"_id": "AAAAAAF5YErP9hjAH18=",
"_parent": {
"$ref": "AAAAAAF5YErP9Ri4ZmE="
},
"model": {
"$ref": "AAAAAAF5YErP9Ri2oM4="
},
"visible": false,
"font": "Arial;13;0",
"width": 10,
"height": 10
},
{
"_type": "UMLTemplateParameterCompartmentView",
"_id": "AAAAAAF5YErP9hjBc5s=",
"_parent": {
"$ref": "AAAAAAF5YErP9Ri4ZmE="
},
"model": {
"$ref": "AAAAAAF5YErP9Ri2oM4="
},
"visible": false,
"font": "Arial;13;0",
"width": 10,
"height": 10
}
],
"font": "Arial;13;0",
"containerChangeable": true,
"left": 72,
"top": 392,
"width": 137.1181640625,
"height": 45,
"nameCompartment": {
"$ref": "AAAAAAF5YErP9Ri5YMs="
},
"attributeCompartment": {
"$ref": "AAAAAAF5YErP9Ri+rm4="
},
"operationCompartment": {
"$ref": "AAAAAAF5YErP9hi/8bA="
},
"receptionCompartment": {
"$ref": "AAAAAAF5YErP9hjAH18="
},
"templateParameterCompartment": {
"$ref": "AAAAAAF5YErP9hjBc5s="
}
},
{
"_type": "UMLClassView",
"_id": "AAAAAAF5YEsIARjizao=",
"_parent": {
"$ref": "AAAAAAFF+qBtyKM79qY="
},
"model": {
"$ref": "AAAAAAF5YEsIABjgVlY="
},
"subViews": [
{
"_type": "UMLNameCompartmentView",
"_id": "AAAAAAF5YEsIARjj4OU=",
"_parent": {
"$ref": "AAAAAAF5YEsIARjizao="
},
"model": {
"$ref": "AAAAAAF5YEsIABjgVlY="
},
"subViews": [
{
"_type": "LabelView",
"_id": "AAAAAAF5YEsIARjkM7Y=",
"_parent": {
"$ref": "AAAAAAF5YEsIARjj4OU="
},
"visible": false,
"font": "Arial;13;0",
"left": -128,
"top": -128,
"height": 13
},
{
"_type": "LabelView",
"_id": "AAAAAAF5YEsIARjlDkU=",
"_parent": {
"$ref": "AAAAAAF5YEsIARjj4OU="
},
"font": "Arial;13;1",
"left": 261,
"top": 343,
"width": 195.48876953125,
"height": 13,
"text": "ZSeriesBaseAcquisition"
},
{
"_type": "LabelView",
"_id": "AAAAAAF5YEsIARjmTD0=",
"_parent": {
"$ref": "AAAAAAF5YEsIARjj4OU="
},
"visible": false,
"font": "Arial;13;0",
"left": -128,
"top": -128,
"width": 73.67724609375,
"height": 13,
"text": "(from Model)"
},
{
"_type": "LabelView",
"_id": "AAAAAAF5YEsIARjn5nE=",
"_parent": {
"$ref": "AAAAAAF5YEsIARjj4OU="
},
"visible": false,
"font": "Arial;13;0",
"left": -128,
"top": -128,
"height": 13,
"horizontalAlignment": 1
}
],
"font": "Arial;13;0",
"left": 256,
"top": 336,
"width": 205.48876953125,
"height": 25,
"stereotypeLabel": {
"$ref": "AAAAAAF5YEsIARjkM7Y="
},
"nameLabel": {
"$ref": "AAAAAAF5YEsIARjlDkU="
},
"namespaceLabel": {
"$ref": "AAAAAAF5YEsIARjmTD0="
},
"propertyLabel": {
"$ref": "AAAAAAF5YEsIARjn5nE="
}
},
{
"_type": "UMLAttributeCompartmentView",
"_id": "AAAAAAF5YEsIARjoGG0=",
"_parent": {
"$ref": "AAAAAAF5YEsIARjizao="
},
"model": {
"$ref": "AAAAAAF5YEsIABjgVlY="
},
"font": "Arial;13;0",
"left": 256,
"top": 361,
"width": 205.48876953125,
"height": 10
},
{
"_type": "UMLOperationCompartmentView",
"_id": "AAAAAAF5YEsIARjpZEU=",
"_parent": {
"$ref": "AAAAAAF5YEsIARjizao="
},
"model": {
"$ref": "AAAAAAF5YEsIABjgVlY="
},
"subViews": [
{
"_type": "UMLOperationView",
"_id": "AAAAAAF5YFHDLRyRJU8=",
"_parent": {
"$ref": "AAAAAAF5YEsIARjpZEU="
},
"model": {
"$ref": "AAAAAAF5YFHDDxyO+ko="
},
"font": "Arial;13;0",
"left": 261,
"top": 376,
"width": 195.48876953125,
"height": 13,
"text": "+get_standard_sub_acquisitions()",
"horizontalAlignment": 0
},
{
"_type": "UMLOperationView",
"_id": "AAAAAAF5YFInkRy8cT8=",
"_parent": {
"$ref": "AAAAAAF5YEsIARjpZEU="
},
"model": {
"$ref": "AAAAAAF5YFInehy5wqs="
},
"font": "Arial;13;0",
"left": 261,
"top": 391,
"width": 195.48876953125,
"height": 13,
"text": "+get_z(entry)",
"horizontalAlignment": 0
}
],
"font": "Arial;13;0",
"left": 256,
"top": 371,
"width": 205.48876953125,
"height": 38
},
{
"_type": "UMLReceptionCompartmentView",
"_id": "AAAAAAF5YEsIARjqk2o=",
"_parent": {
"$ref": "AAAAAAF5YEsIARjizao="
},
"model": {
"$ref": "AAAAAAF5YEsIABjgVlY="
},
"visible": false,
"font": "Arial;13;0",
"left": -64,
"top": -64,
"width": 10,
"height": 10
},
{
"_type": "UMLTemplateParameterCompartmentView",
"_id": "AAAAAAF5YEsIARjrjQI=",
"_parent": {
"$ref": "AAAAAAF5YEsIARjizao="
},
"model": {
"$ref": "AAAAAAF5YEsIABjgVlY="
},
"visible": false,
"font": "Arial;13;0",
"left": -64,
"top": -64,
"width": 10,
"height": 10
}
],
"font": "Arial;13;0",
"containerChangeable": true,
"left": 256,
"top": 336,
"width": 205.48876953125,
"height": 73,
"nameCompartment": {
"$ref": "AAAAAAF5YEsIARjj4OU="
},
"attributeCompartment": {
"$ref": "AAAAAAF5YEsIARjoGG0="
},
"operationCompartment": {
"$ref": "AAAAAAF5YEsIARjpZEU="
},
"receptionCompartment": {
"$ref": "AAAAAAF5YEsIARjqk2o="
},
"templateParameterCompartment": {
"$ref": "AAAAAAF5YEsIARjrjQI="
}
},
{
"_type": "UMLAssociationView",
"_id": "AAAAAAF5YEtmKBl3vwU=",
"_parent": {
"$ref": "AAAAAAFF+qBtyKM79qY="
},
"model": {
"$ref": "AAAAAAF5YEtmJxlzzzY="
},
"subViews": [
{
"_type": "EdgeLabelView",
"_id": "AAAAAAF5YEtmKBl4WvE=",
"_parent": {
"$ref": "AAAAAAF5YEtmKBl3vwU="
},
"model": {
"$ref": "AAAAAAF5YEtmJxlzzzY="
},
"font": "Arial;13;0",
"left": 215,
"top": 375,
"width": 29.275390625,
"height": 13,
"alpha": 1.5707963267948966,
"distance": 15,
"hostEdge": {
"$ref": "AAAAAAF5YEtmKBl3vwU="
},
"edgePosition": 1,
"text": "+1..n"
},
{
"_type": "EdgeLabelView",
"_id": "AAAAAAF5YEtmKBl5K4w=",
"_parent": {
"$ref": "AAAAAAF5YEtmKBl3vwU="
},
"model": {
"$ref": "AAAAAAF5YEtmJxlzzzY="
},
"visible": null,
"font": "Arial;13;0",
"left": 226,
"top": 360,
"height": 13,
"alpha": 1.5707963267948966,
"distance": 30,
"hostEdge": {
"$ref": "AAAAAAF5YEtmKBl3vwU="
},
"edgePosition": 1
},
{
"_type": "EdgeLabelView",
"_id": "AAAAAAF5YEtmKBl6BQo=",
"_parent": {
"$ref": "AAAAAAF5YEtmKBl3vwU="
},
"model": {
"$ref": "AAAAAAF5YEtmJxlzzzY="
},
"visible": false,
"font": "Arial;13;0",
"left": 234,
"top": 404,
"height": 13,
"alpha": -1.5707963267948966,
"distance": 15,
"hostEdge": {
"$ref": "AAAAAAF5YEtmKBl3vwU="
},
"edgePosition": 1
},
{
"_type": "EdgeLabelView",
"_id": "AAAAAAF5YEtmKBl76y8=",
"_parent": {
"$ref": "AAAAAAF5YEtmKBl3vwU="
},
"model": {
"$ref": "AAAAAAF5YEtmKBl0edM="
},
"visible": false,
"font": "Arial;13;0",
"left": 231,
"top": 375,
"height": 13,
"alpha": 0.5235987755982988,
"distance": 30,
"hostEdge": {
"$ref": "AAAAAAF5YEtmKBl3vwU="
},
"edgePosition": 2
},
{
"_type": "EdgeLabelView",
"_id": "AAAAAAF5YEtmKBl8Lek=",
"_parent": {
"$ref": "AAAAAAF5YEtmKBl3vwU="
},
"model": {
"$ref": "AAAAAAF5YEtmKBl0edM="
},
"visible": false,
"font": "Arial;13;0",
"left": 231,
"top": 361,
"height": 13,
"alpha": 0.7853981633974483,
"distance": 40,
"hostEdge": {
"$ref": "AAAAAAF5YEtmKBl3vwU="
},
"edgePosition": 2
},
{
"_type": "EdgeLabelView",
"_id": "AAAAAAF5YEtmKBl9hJQ=",
"_parent": {
"$ref": "AAAAAAF5YEtmKBl3vwU="
},
"model": {
"$ref": "AAAAAAF5YEtmKBl0edM="
},
"visible": false,
"font": "Arial;13;0",
"left": 232,
"top": 403,
"height": 13,
"alpha": -0.5235987755982988,
"distance": 25,
"hostEdge": {
"$ref": "AAAAAAF5YEtmKBl3vwU="
},
"edgePosition": 2
},
{
"_type": "EdgeLabelView",
"_id": "AAAAAAF5YEtmKBl+z08=",
"_parent": {
"$ref": "AAAAAAF5YEtmKBl3vwU="
},
"model": {
"$ref": "AAAAAAF5YEtmKBl1IEs="
},
"visible": false,
"font": "Arial;13;0",
"left": 226,
"top": 376,
"height": 13,
"alpha": -0.5235987755982988,
"distance": 30,
"hostEdge": {
"$ref": "AAAAAAF5YEtmKBl3vwU="
}
},
{
"_type": "EdgeLabelView",
"_id": "AAAAAAF5YEtmKBl/bkg=",
"_parent": {
"$ref": "AAAAAAF5YEtmKBl3vwU="
},
"model": {
"$ref": "AAAAAAF5YEtmKBl1IEs="
},
"visible": false,
"font": "Arial;13;0",
"left": 221,
"top": 363,
"height": 13,
"alpha": -0.7853981633974483,
"distance": 40,
"hostEdge": {
"$ref": "AAAAAAF5YEtmKBl3vwU="
}
},
{
"_type": "EdgeLabelView",
"_id": "AAAAAAF5YEtmKBmAywg=",
"_parent": {
"$ref": "AAAAAAF5YEtmKBl3vwU="
},
"model": {
"$ref": "AAAAAAF5YEtmKBl1IEs="
},
"visible": false,
"font": "Arial;13;0",
"left": 236,
"top": 402,
"height": 13,
"alpha": 0.5235987755982988,
"distance": 25,
"hostEdge": {
"$ref": "AAAAAAF5YEtmKBl3vwU="
}
},
{
"_type": "UMLQualifierCompartmentView",
"_id": "AAAAAAF5YEtmKBmB/1E=",
"_parent": {
"$ref": "AAAAAAF5YEtmKBl3vwU="
},
"model": {
"$ref": "AAAAAAF5YEtmKBl0edM="
},
"visible": false,
"font": "Arial;13;0",
"width": 10,
"height": 10
},
{
"_type": "UMLQualifierCompartmentView",
"_id": "AAAAAAF5YEtmKBmC368=",
"_parent": {
"$ref": "AAAAAAF5YEtmKBl3vwU="
},
"model": {
"$ref": "AAAAAAF5YEtmKBl1IEs="
},
"visible": false,
"font": "Arial;13;0",
"width": 10,
"height": 10
}
],
"font": "Arial;13;0",
"head": {
"$ref": "AAAAAAF5YEsIARjizao="
},
"tail": {
"$ref": "AAAAAAF5YErP9Ri4ZmE="
},
"lineStyle": 1,
"points": "209:401;255:392",
"showVisibility": true,
"nameLabel": {
"$ref": "AAAAAAF5YEtmKBl4WvE="
},
"stereotypeLabel": {
"$ref": "AAAAAAF5YEtmKBl5K4w="
},
"propertyLabel": {
"$ref": "AAAAAAF5YEtmKBl6BQo="
},
"tailRoleNameLabel": {
"$ref": "AAAAAAF5YEtmKBl76y8="
},
"tailPropertyLabel": {
"$ref": "AAAAAAF5YEtmKBl8Lek="
},
"tailMultiplicityLabel": {
"$ref": "AAAAAAF5YEtmKBl9hJQ="
},
"headRoleNameLabel": {
"$ref": "AAAAAAF5YEtmKBl+z08="
},
"headPropertyLabel": {
"$ref": "AAAAAAF5YEtmKBl/bkg="
},
"headMultiplicityLabel": {
"$ref": "AAAAAAF5YEtmKBmAywg="
},
"tailQualifiersCompartment": {
"$ref": "AAAAAAF5YEtmKBmB/1E="
},
"headQualifiersCompartment": {
"$ref": "AAAAAAF5YEtmKBmC368="
}
},
{
"_type": "UMLGeneralizationView",
"_id": "AAAAAAF5YEuX6xnF62o=",
"_parent": {
"$ref": "AAAAAAFF+qBtyKM79qY="
},
"model": {
"$ref": "AAAAAAF5YEuX6hnD22Y="
},
"subViews": [
{
"_type": "EdgeLabelView",
"_id": "AAAAAAF5YEuX6xnGWk4=",
"_parent": {
"$ref": "AAAAAAF5YEuX6xnF62o="
},
"model": {
"$ref": "AAAAAAF5YEuX6hnD22Y="
},
"visible": false,
"font": "Arial;13;0",
"left": 204,
"top": 305,
"height": 13,
"alpha": 1.5707963267948966,
"distance": 15,
"hostEdge": {
"$ref": "AAAAAAF5YEuX6xnF62o="
},
"edgePosition": 1
},
{
"_type": "EdgeLabelView",
"_id": "AAAAAAF5YEuX6xnH6VM=",
"_parent": {
"$ref": "AAAAAAF5YEuX6xnF62o="
},
"model": {
"$ref": "AAAAAAF5YEuX6hnD22Y="
},
"visible": null,
"font": "Arial;13;0",
"left": 192,
"top": 295,
"height": 13,
"alpha": 1.5707963267948966,
"distance": 30,
"hostEdge": {
"$ref": "AAAAAAF5YEuX6xnF62o="
},
"edgePosition": 1
},
{
"_type": "EdgeLabelView",
"_id": "AAAAAAF5YEuX6xnIWik=",
"_parent": {
"$ref": "AAAAAAF5YEuX6xnF62o="
},
"model": {
"$ref": "AAAAAAF5YEuX6hnD22Y="
},
"visible": false,
"font": "Arial;13;0",
"left": 227,
"top": 324,
"height": 13,
"alpha": -1.5707963267948966,
"distance": 15,
"hostEdge": {
"$ref": "AAAAAAF5YEuX6xnF62o="
},
"edgePosition": 1
}
],
"font": "Arial;13;0",
"head": {
"$ref": "AAAAAAF5YEo6dhiOqvw="
},
"tail": {
"$ref": "AAAAAAF5YErP9Ri4ZmE="
},
"lineStyle": 1,
"points": "159:391;273:252",
"showVisibility": true,
"nameLabel": {
"$ref": "AAAAAAF5YEuX6xnGWk4="
},
"stereotypeLabel": {
"$ref": "AAAAAAF5YEuX6xnH6VM="
},
"propertyLabel": {
"$ref": "AAAAAAF5YEuX6xnIWik="
}
},
{
"_type": "UMLGeneralizationView",
"_id": "AAAAAAF5YEvHzBnrTBQ=",
"_parent": {
"$ref": "AAAAAAFF+qBtyKM79qY="
},
"model": {
"$ref": "AAAAAAF5YEvHzBnpWdU="
},
"subViews": [
{
"_type": "EdgeLabelView",
"_id": "AAAAAAF5YEvHzBnskVY=",
"_parent": {
"$ref": "AAAAAAF5YEvHzBnrTBQ="
},
"model": {
"$ref": "AAAAAAF5YEvHzBnpWdU="
},
"visible": false,
"font": "Arial;13;0",
"left": 327,
"top": 289,
"height": 13,
"alpha": 1.5707963267948966,
"distance": 15,
"hostEdge": {
"$ref": "AAAAAAF5YEvHzBnrTBQ="
},
"edgePosition": 1
},
{
"_type": "EdgeLabelView",
"_id": "AAAAAAF5YEvHzBntwJU=",
"_parent": {
"$ref": "AAAAAAF5YEvHzBnrTBQ="
},
"model": {
"$ref": "AAAAAAF5YEvHzBnpWdU="
},
"visible": null,
"font": "Arial;13;0",
"left": 312,
"top": 292,
"height": 13,
"alpha": 1.5707963267948966,
"distance": 30,
"hostEdge": {
"$ref": "AAAAAAF5YEvHzBnrTBQ="
},
"edgePosition": 1
},
{
"_type": "EdgeLabelView",
"_id": "AAAAAAF5YEvHzBnu60o=",
"_parent": {
"$ref": "AAAAAAF5YEvHzBnrTBQ="
},
"model": {
"$ref": "AAAAAAF5YEvHzBnpWdU="
},
"visible": false,
"font": "Arial;13;0",
"left": 356,
"top": 284,
"height": 13,
"alpha": -1.5707963267948966,
"distance": 15,
"hostEdge": {
"$ref": "AAAAAAF5YEvHzBnrTBQ="
},
"edgePosition": 1
}
],
"font": "Arial;13;0",
"head": {
"$ref": "AAAAAAF5YEo6dhiOqvw="
},
"tail": {
"$ref": "AAAAAAF5YEsIARjizao="
},
"lineStyle": 1,
"points": "351:335;334:252",
"showVisibility": true,
"nameLabel": {
"$ref": "AAAAAAF5YEvHzBnskVY="
},
"stereotypeLabel": {
"$ref": "AAAAAAF5YEvHzBntwJU="
},
"propertyLabel": {
"$ref": "AAAAAAF5YEvHzBnu60o="
}
},
{
"_type": "UMLClassView",
"_id": "AAAAAAF5YEv1xhoU1x0=",
"_parent": {
"$ref": "AAAAAAFF+qBtyKM79qY="
},
"model": {
"$ref": "AAAAAAF5YEv1xhoSSYo="
},
"subViews": [
{
"_type": "UMLNameCompartmentView",
"_id": "AAAAAAF5YEv1xhoVP9s=",
"_parent": {
"$ref": "AAAAAAF5YEv1xhoU1x0="
},
"model": {
"$ref": "AAAAAAF5YEv1xhoSSYo="
},
"subViews": [
{
"_type": "LabelView",
"_id": "AAAAAAF5YEv1xhoWIVY=",
"_parent": {
"$ref": "AAAAAAF5YEv1xhoVP9s="
},
"visible": false,
"font": "Arial;13;0",
"left": -112,
"top": 48,
"height": 13
},
{
"_type": "LabelView",
"_id": "AAAAAAF5YEv1xhoXi2k=",
"_parent": {
"$ref": "AAAAAAF5YEv1xhoVP9s="
},
"font": "Arial;13;1",
"left": 21,
"top": 511,
"width": 114.841796875,
"height": 13,
"text": "XRD3DAcquisition"
},
{
"_type": "LabelView",
"_id": "AAAAAAF5YEv1xhoYFZA=",
"_parent": {
"$ref": "AAAAAAF5YEv1xhoVP9s="
},
"visible": false,
"font": "Arial;13;0",
"left": -112,
"top": 48,
"width": 73.67724609375,
"height": 13,
"text": "(from Model)"
},
{
"_type": "LabelView",
"_id": "AAAAAAF5YEv1xhoZ9TQ=",
"_parent": {
"$ref": "AAAAAAF5YEv1xhoVP9s="
},
"visible": false,
"font": "Arial;13;0",
"left": -112,
"top": 48,
"height": 13,
"horizontalAlignment": 1
}
],
"font": "Arial;13;0",
"left": 16,
"top": 504,
"width": 124.841796875,
"height": 25,
"stereotypeLabel": {
"$ref": "AAAAAAF5YEv1xhoWIVY="
},
"nameLabel": {
"$ref": "AAAAAAF5YEv1xhoXi2k="
},
"namespaceLabel": {
"$ref": "AAAAAAF5YEv1xhoYFZA="
},
"propertyLabel": {
"$ref": "AAAAAAF5YEv1xhoZ9TQ="
}
},
{
"_type": "UMLAttributeCompartmentView",
"_id": "AAAAAAF5YEv1xhoaVN4=",
"_parent": {
"$ref": "AAAAAAF5YEv1xhoU1x0="
},
"model": {
"$ref": "AAAAAAF5YEv1xhoSSYo="
},
"subViews": [
{
"_type": "UMLAttributeView",
"_id": "AAAAAAF5YFf0qR6t5h0=",
"_parent": {
"$ref": "AAAAAAF5YEv1xhoaVN4="
},
"model": {
"$ref": "AAAAAAF5YFf0hx6nKTk="
},
"font": "Arial;13;0",
"left": 21,
"top": 534,
"width": 114.841796875,
"height": 13,
"text": "+base_tilt",
"horizontalAlignment": 0
},
{
"_type": "UMLAttributeView",
"_id": "AAAAAAF5YFgjAR7YAK0=",
"_parent": {
"$ref": "AAAAAAF5YEv1xhoaVN4="
},
"model": {
"$ref": "AAAAAAF5YFgi6x7SJh4="
},
"font": "Arial;13;0",
"left": 21,
"top": 549,
"width": 114.841796875,
"height": 13,
"text": "+rocking",
"horizontalAlignment": 0
}
],
"font": "Arial;13;0",
"left": 16,
"top": 529,
"width": 124.841796875,
"height": 38
},
{
"_type": "UMLOperationCompartmentView",
"_id": "AAAAAAF5YEv1xhobv/Y=",
"_parent": {
"$ref": "AAAAAAF5YEv1xhoU1x0="
},
"model": {
"$ref": "AAAAAAF5YEv1xhoSSYo="
},
"font": "Arial;13;0",
"left": 16,
"top": 567,
"width": 124.841796875,
"height": 10
},
{
"_type": "UMLReceptionCompartmentView",
"_id": "AAAAAAF5YEv1xhoclfw=",
"_parent": {
"$ref": "AAAAAAF5YEv1xhoU1x0="
},
"model": {
"$ref": "AAAAAAF5YEv1xhoSSYo="
},
"visible": false,
"font": "Arial;13;0",
"left": -56,
"top": 24,
"width": 10,
"height": 10
},
{
"_type": "UMLTemplateParameterCompartmentView",
"_id": "AAAAAAF5YEv1xxodm6E=",
"_parent": {
"$ref": "AAAAAAF5YEv1xhoU1x0="
},
"model": {
"$ref": "AAAAAAF5YEv1xhoSSYo="
},
"visible": false,
"font": "Arial;13;0",
"left": -56,
"top": 24,
"width": 10,
"height": 10
}
],
"font": "Arial;13;0",
"containerChangeable": true,
"left": 16,
"top": 504,
"width": 124.841796875,
"height": 73,
"nameCompartment": {
"$ref": "AAAAAAF5YEv1xhoVP9s="
},
"attributeCompartment": {
"$ref": "AAAAAAF5YEv1xhoaVN4="
},
"operationCompartment": {
"$ref": "AAAAAAF5YEv1xhobv/Y="
},
"receptionCompartment": {
"$ref": "AAAAAAF5YEv1xhoclfw="
},
"templateParameterCompartment": {
"$ref": "AAAAAAF5YEv1xxodm6E="
}
},
{
"_type": "UMLGeneralizationView",
"_id": "AAAAAAF5YEwTOxpZUjY=",
"_parent": {
"$ref": "AAAAAAFF+qBtyKM79qY="
},
"model": {
"$ref": "AAAAAAF5YEwTOxpXlwI="
},
"subViews": [
{
"_type": "EdgeLabelView",
"_id": "AAAAAAF5YEwTOxpaxZ4=",
"_parent": {
"$ref": "AAAAAAF5YEwTOxpZUjY="
},
"model": {
"$ref": "AAAAAAF5YEwTOxpXlwI="
},
"visible": false,
"font": "Arial;13;0",
"left": 98,
"top": 457,
"height": 13,
"alpha": 1.5707963267948966,
"distance": 15,
"hostEdge": {
"$ref": "AAAAAAF5YEwTOxpZUjY="
},
"edgePosition": 1
},
{
"_type": "EdgeLabelView",
"_id": "AAAAAAF5YEwTOxpbYxc=",
"_parent": {
"$ref": "AAAAAAF5YEwTOxpZUjY="
},
"model": {
"$ref": "AAAAAAF5YEwTOxpXlwI="
},
"visible": null,
"font": "Arial;13;0",
"left": 85,
"top": 450,
"height": 13,
"alpha": 1.5707963267948966,
"distance": 30,
"hostEdge": {
"$ref": "AAAAAAF5YEwTOxpZUjY="
},
"edgePosition": 1
},
{
"_type": "EdgeLabelView",
"_id": "AAAAAAF5YEwTOxpcMz8=",
"_parent": {
"$ref": "AAAAAAF5YEwTOxpZUjY="
},
"model": {
"$ref": "AAAAAAF5YEwTOxpXlwI="
},
"visible": false,
"font": "Arial;13;0",
"left": 125,
"top": 470,
"height": 13,
"alpha": -1.5707963267948966,
"distance": 15,
"hostEdge": {
"$ref": "AAAAAAF5YEwTOxpZUjY="
},
"edgePosition": 1
}
],
"font": "Arial;13;0",
"head": {
"$ref": "AAAAAAF5YErP9Ri4ZmE="
},
"tail": {
"$ref": "AAAAAAF5YEv1xhoU1x0="
},
"lineStyle": 1,
"points": "96:503;129:437",
"showVisibility": true,
"nameLabel": {
"$ref": "AAAAAAF5YEwTOxpaxZ4="
},
"stereotypeLabel": {
"$ref": "AAAAAAF5YEwTOxpbYxc="
},
"propertyLabel": {
"$ref": "AAAAAAF5YEwTOxpcMz8="
}
},
{
"_type": "UMLClassView",
"_id": "AAAAAAF5YEwzMhqCvV0=",
"_parent": {
"$ref": "AAAAAAFF+qBtyKM79qY="
},
"model": {
"$ref": "AAAAAAF5YEwzMhqAJ4Y="
},
"subViews": [
{
"_type": "UMLNameCompartmentView",
"_id": "AAAAAAF5YEwzMhqDv5s=",
"_parent": {
"$ref": "AAAAAAF5YEwzMhqCvV0="
},
"model": {
"$ref": "AAAAAAF5YEwzMhqAJ4Y="
},
"subViews": [
{
"_type": "LabelView",
"_id": "AAAAAAF5YEwzMhqETTE=",
"_parent": {
"$ref": "AAAAAAF5YEwzMhqDv5s="
},
"visible": false,
"font": "Arial;13;0",
"left": -240,
"top": -80,
"height": 13
},
{
"_type": "LabelView",
"_id": "AAAAAAF5YEwzMhqF8KE=",
"_parent": {
"$ref": "AAAAAAF5YEwzMhqDv5s="
},
"font": "Arial;13;1",
"left": 213,
"top": 511,
"width": 114.587890625,
"height": 13,
"text": "XRDCTAcquisition"
},
{
"_type": "LabelView",
"_id": "AAAAAAF5YEwzMhqGQow=",
"_parent": {
"$ref": "AAAAAAF5YEwzMhqDv5s="
},
"visible": false,
"font": "Arial;13;0",
"left": -240,
"top": -80,
"width": 73.67724609375,
"height": 13,
"text": "(from Model)"
},
{
"_type": "LabelView",
"_id": "AAAAAAF5YEwzMhqHUvU=",
"_parent": {
"$ref": "AAAAAAF5YEwzMhqDv5s="
},
"visible": false,
"font": "Arial;13;0",
"left": -240,
"top": -80,
"height": 13,
"horizontalAlignment": 1
}
],
"font": "Arial;13;0",
"left": 208,
"top": 504,
"width": 124.587890625,
"height": 25,
"stereotypeLabel": {
"$ref": "AAAAAAF5YEwzMhqETTE="
},
"nameLabel": {
"$ref": "AAAAAAF5YEwzMhqF8KE="
},
"namespaceLabel": {
"$ref": "AAAAAAF5YEwzMhqGQow="
},
"propertyLabel": {
"$ref": "AAAAAAF5YEwzMhqHUvU="
}
},
{
"_type": "UMLAttributeCompartmentView",
"_id": "AAAAAAF5YEwzMhqITNs=",
"_parent": {
"$ref": "AAAAAAF5YEwzMhqCvV0="
},
"model": {
"$ref": "AAAAAAF5YEwzMhqAJ4Y="
},
"font": "Arial;13;0",
"left": 208,
"top": 529,
"width": 124.587890625,
"height": 10
},
{
"_type": "UMLOperationCompartmentView",
"_id": "AAAAAAF5YEwzMhqJVgU=",
"_parent": {
"$ref": "AAAAAAF5YEwzMhqCvV0="
},
"model": {
"$ref": "AAAAAAF5YEwzMhqAJ4Y="
},
"font": "Arial;13;0",
"left": 208,
"top": 539,
"width": 124.587890625,
"height": 10
},
{
"_type": "UMLReceptionCompartmentView",
"_id": "AAAAAAF5YEwzMhqKJn0=",
"_parent": {
"$ref": "AAAAAAF5YEwzMhqCvV0="
},
"model": {
"$ref": "AAAAAAF5YEwzMhqAJ4Y="
},
"visible": false,
"font": "Arial;13;0",
"left": -120,
"top": -40,
"width": 10,
"height": 10
},
{
"_type": "UMLTemplateParameterCompartmentView",
"_id": "AAAAAAF5YEwzMhqL6qI=",
"_parent": {
"$ref": "AAAAAAF5YEwzMhqCvV0="
},
"model": {
"$ref": "AAAAAAF5YEwzMhqAJ4Y="
},
"visible": false,
"font": "Arial;13;0",
"left": -120,
"top": -40,
"width": 10,
"height": 10
}
],
"font": "Arial;13;0",
"containerChangeable": true,
"left": 208,
"top": 504,
"width": 124.587890625,
"height": 45,
"nameCompartment": {
"$ref": "AAAAAAF5YEwzMhqDv5s="
},
"attributeCompartment": {
"$ref": "AAAAAAF5YEwzMhqITNs="
},
"operationCompartment": {
"$ref": "AAAAAAF5YEwzMhqJVgU="
},
"receptionCompartment": {
"$ref": "AAAAAAF5YEwzMhqKJn0="
},
"templateParameterCompartment": {
"$ref": "AAAAAAF5YEwzMhqL6qI="
}
},
{
"_type": "UMLGeneralizationView",
"_id": "AAAAAAF5YExpLhrtC8I=",
"_parent": {
"$ref": "AAAAAAFF+qBtyKM79qY="
},
"model": {
"$ref": "AAAAAAF5YExpLhrrLFw="
},
"subViews": [
{
"_type": "EdgeLabelView",
"_id": "AAAAAAF5YExpLxruTfs=",
"_parent": {
"$ref": "AAAAAAF5YExpLhrtC8I="
},
"model": {
"$ref": "AAAAAAF5YExpLhrrLFw="
},
"visible": false,
"font": "Arial;13;0",
"left": 194,
"top": 475,
"height": 13,
"alpha": 1.5707963267948966,
"distance": 15,
"hostEdge": {
"$ref": "AAAAAAF5YExpLhrtC8I="
},
"edgePosition": 1
},
{
"_type": "EdgeLabelView",
"_id": "AAAAAAF5YExpLxrvFPE=",
"_parent": {
"$ref": "AAAAAAF5YExpLhrtC8I="
},
"model": {
"$ref": "AAAAAAF5YExpLhrrLFw="
},
"visible": null,
"font": "Arial;13;0",
"left": 184,
"top": 486,
"height": 13,
"alpha": 1.5707963267948966,
"distance": 30,
"hostEdge": {
"$ref": "AAAAAAF5YExpLhrtC8I="
},
"edgePosition": 1
},
{
"_type": "EdgeLabelView",
"_id": "AAAAAAF5YExpLxrwMkY=",
"_parent": {
"$ref": "AAAAAAF5YExpLhrtC8I="
},
"model": {
"$ref": "AAAAAAF5YExpLhrrLFw="
},
"visible": false,
"font": "Arial;13;0",
"left": 213,
"top": 452,
"height": 13,
"alpha": -1.5707963267948966,
"distance": 15,
"hostEdge": {
"$ref": "AAAAAAF5YExpLhrtC8I="
},
"edgePosition": 1
}
],
"font": "Arial;13;0",
"head": {
"$ref": "AAAAAAF5YErP9Ri4ZmE="
},
"tail": {
"$ref": "AAAAAAF5YEwzMhqCvV0="
},
"lineStyle": 1,
"points": "243:503;166:437",
"showVisibility": true,
"nameLabel": {
"$ref": "AAAAAAF5YExpLxruTfs="
},
"stereotypeLabel": {
"$ref": "AAAAAAF5YExpLxrvFPE="
},
"propertyLabel": {
"$ref": "AAAAAAF5YExpLxrwMkY="
}
}
]
},
{
"_type": "UMLClass",
"_id": "AAAAAAF5YEo6dRiMOo4=",
"_parent": {
"$ref": "AAAAAAFF+qBWK6M3Z8Y="
},
"name": "BaseAcquisition",
"attributes": [
{
"_type": "UMLAttribute",
"_id": "AAAAAAF5YE3qnRuekgo=",
"_parent": {
"$ref": "AAAAAAF5YEo6dRiMOo4="
},
"name": "configuration",
"type": ""
},
{
"_type": "UMLAttribute",
"_id": "AAAAAAF5YE5q+RvJz2Q=",
"_parent": {
"$ref": "AAAAAAF5YEo6dRiMOo4="
},
"name": "root_url",
"type": ""
}
],
"operations": [
{
"_type": "UMLOperation",
"_id": "AAAAAAF5YE8aAhwP3cw=",
"_parent": {
"$ref": "AAAAAAF5YEo6dRiMOo4="
},
"name": "register_step",
"parameters": [
{
"_type": "UMLParameter",
"_id": "AAAAAAF5YE+VbhwxoYE=",
"_parent": {
"$ref": "AAAAAAF5YE8aAhwP3cw="
},
"name": "url",
"type": ""
},
{
"_type": "UMLParameter",
"_id": "AAAAAAF5YE/XThxNjbU=",
"_parent": {
"$ref": "AAAAAAF5YE8aAhwP3cw="
},
"name": "entry_type",
"type": ""
},
{
"_type": "UMLParameter",
"_id": "AAAAAAF5YFAaiRxp/lM=",
"_parent": {
"$ref": "AAAAAAF5YE8aAhwP3cw="
},
"name": "copy_frames",
"type": ""
}
]
},
{
"_type": "UMLOperation",
"_id": "AAAAAAF5YFSnnB0euqk=",
"_parent": {
"$ref": "AAAAAAF5YEo6dRiMOo4="
},
"name": "write_as_nxtomo",
"parameters": [
{
"_type": "UMLParameter",
"_id": "AAAAAAF5YFTj6R1Ahyo=",
"_parent": {
"$ref": "AAAAAAF5YFSnnB0euqk="
},
"name": "output_file",
"type": ""
},
{
"_type": "UMLParameter",
"_id": "AAAAAAF5YFUHYx1cQCk=",
"_parent": {
"$ref": "AAAAAAF5YFSnnB0euqk="
},
"name": "data_path",
"type": ""
},
{
"_type": "UMLParameter",
"_id": "AAAAAAF5YFVAMx14psY=",
"_parent": {
"$ref": "AAAAAAF5YFSnnB0euqk="
},
"name": "input_file_path",
"type": ""
},
{
"_type": "UMLParameter",
"_id": "AAAAAAF5YFVgfx2UaaU=",
"_parent": {
"$ref": "AAAAAAF5YFSnnB0euqk="
},
"name": "request_input",
"type": ""
},
{
"_type": "UMLParameter",
"_id": "AAAAAAF5YFWAfh2wc38=",
"_parent": {
"$ref": "AAAAAAF5YFSnnB0euqk="
},
"name": "plugins",
"type": ""
},
{
"_type": "UMLParameter",
"_id": "AAAAAAF5YFWerh3Mz/k=",
"_parent": {
"$ref": "AAAAAAF5YFSnnB0euqk="
},
"name": "input_callback",
"type": ""
}
]
},
{
"_type": "UMLOperation",
"_id": "AAAAAAF5YFcTmR5gyVI=",
"_parent": {
"$ref": "AAAAAAF5YEo6dRiMOo4="
},
"name": "set_plugins",
"parameters": [
{
"_type": "UMLParameter",
"_id": "AAAAAAF5YFdD6B6CL2I=",
"_parent": {
"$ref": "AAAAAAF5YFcTmR5gyVI="
},
"name": "plugins",
"type": ""
}
]
}
],
"isAbstract": true
},
{
"_type": "UMLClass",
"_id": "AAAAAAF5YErP9Ri2oM4=",
"_parent": {
"$ref": "AAAAAAFF+qBWK6M3Z8Y="
},
"name": "StandardAcquisition",
"ownedElements": [
{
"_type": "UMLAssociation",
"_id": "AAAAAAF5YEtmJxlzzzY=",
"_parent": {
"$ref": "AAAAAAF5YErP9Ri2oM4="
},
"name": "1..n",
"end1": {
"_type": "UMLAssociationEnd",
"_id": "AAAAAAF5YEtmKBl0edM=",
"_parent": {
"$ref": "AAAAAAF5YEtmJxlzzzY="
},
"reference": {
"$ref": "AAAAAAF5YErP9Ri2oM4="
}
},
"end2": {
"_type": "UMLAssociationEnd",
"_id": "AAAAAAF5YEtmKBl1IEs=",
"_parent": {
"$ref": "AAAAAAF5YEtmJxlzzzY="
},
"reference": {
"$ref": "AAAAAAF5YEsIABjgVlY="
},
"aggregation": "composite"
}
},
{
"_type": "UMLGeneralization",
"_id": "AAAAAAF5YEuX6hnD22Y=",
"_parent": {
"$ref": "AAAAAAF5YErP9Ri2oM4="
},
"source": {
"$ref": "AAAAAAF5YErP9Ri2oM4="
},
"target": {
"$ref": "AAAAAAF5YEo6dRiMOo4="
}
}
]
},
{
"_type": "UMLClass",
"_id": "AAAAAAF5YEsIABjgVlY=",
"_parent": {
"$ref": "AAAAAAFF+qBWK6M3Z8Y="
},
"name": "ZSeriesBaseAcquisition",
"ownedElements": [
{
"_type": "UMLAssociation",
"_id": "AAAAAAF5YEtF6xkL5BY=",
"_parent": {
"$ref": "AAAAAAF5YEsIABjgVlY="
},
"end1": {
"_type": "UMLAssociationEnd",
"_id": "AAAAAAF5YEtF6xkMfYc=",
"_parent": {
"$ref": "AAAAAAF5YEtF6xkL5BY="
},
"reference": {
"$ref": "AAAAAAF5YEsIABjgVlY="
}
},
"end2": {
"_type": "UMLAssociationEnd",
"_id": "AAAAAAF5YEtF6xkNyXQ=",
"_parent": {
"$ref": "AAAAAAF5YEtF6xkL5BY="
},
"reference": {
"$ref": "AAAAAAF5YErP9Ri2oM4="
},
"aggregation": "composite"
}
},
{
"_type": "UMLGeneralization",
"_id": "AAAAAAF5YEvHzBnpWdU=",
"_parent": {
"$ref": "AAAAAAF5YEsIABjgVlY="
},
"source": {
"$ref": "AAAAAAF5YEsIABjgVlY="
},
"target": {
"$ref": "AAAAAAF5YEo6dRiMOo4="
}
}
],
"operations": [
{
"_type": "UMLOperation",
"_id": "AAAAAAF5YFHDDxyO+ko=",
"_parent": {
"$ref": "AAAAAAF5YEsIABjgVlY="
},
"name": "get_standard_sub_acquisitions"
},
{
"_type": "UMLOperation",
"_id": "AAAAAAF5YFInehy5wqs=",
"_parent": {
"$ref": "AAAAAAF5YEsIABjgVlY="
},
"name": "get_z",
"parameters": [
{
"_type": "UMLParameter",
"_id": "AAAAAAF5YFJRyhzbAYE=",
"_parent": {
"$ref": "AAAAAAF5YFInehy5wqs="
},
"name": "entry",
"type": ""
}
]
}
]
},
{
"_type": "UMLClass",
"_id": "AAAAAAF5YEv1xhoSSYo=",
"_parent": {
"$ref": "AAAAAAFF+qBWK6M3Z8Y="
},
"name": "XRD3DAcquisition",
"ownedElements": [
{
"_type": "UMLGeneralization",
"_id": "AAAAAAF5YEwTOxpXlwI=",
"_parent": {
"$ref": "AAAAAAF5YEv1xhoSSYo="
},
"source": {
"$ref": "AAAAAAF5YEv1xhoSSYo="
},
"target": {
"$ref": "AAAAAAF5YErP9Ri2oM4="
}
}
],
"attributes": [
{
"_type": "UMLAttribute",
"_id": "AAAAAAF5YFf0hx6nKTk=",
"_parent": {
"$ref": "AAAAAAF5YEv1xhoSSYo="
},
"name": "base_tilt",
"type": ""
},
{
"_type": "UMLAttribute",
"_id": "AAAAAAF5YFgi6x7SJh4=",
"_parent": {
"$ref": "AAAAAAF5YEv1xhoSSYo="
},
"name": "rocking",
"type": ""
}
]
},
{
"_type": "UMLClass",
"_id": "AAAAAAF5YEwzMhqAJ4Y=",
"_parent": {
"$ref": "AAAAAAFF+qBWK6M3Z8Y="
},
"name": "XRDCTAcquisition",
"ownedElements": [
{
"_type": "UMLGeneralization",
"_id": "AAAAAAF5YExpLhrrLFw=",
"_parent": {
"$ref": "AAAAAAF5YEwzMhqAJ4Y="
},
"source": {
"$ref": "AAAAAAF5YEwzMhqAJ4Y="
},
"target": {
"$ref": "AAAAAAF5YErP9Ri2oM4="
}
}
]
}
]
}
]
} nxtomomill-v2.0.1/doc/development/design/hdf5_converter.rst 0000664 0000000 0000000 00000003703 15114306024 0024110 0 ustar 00root root 0000000 0000000 HDF5Converter
'''''''''''''
The more it goes the more use cases the hdf5 converter has to handle.
Today it handles "classical" tomography acquisition, zseries and multi-tomo.
Behavior of the HDF5Converter
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The HDF5 is applying sequentially the following taks:
1. preprocess raw data (During converter creation)
browse raw data and collect information on Bliss scan sequence.
During this step it will determine for each entry if the frame type are dark, flats, projections or alignment.
Create an instance of Acquistion for each 'init' Bliss scan.
2. HDF5Converter.convert function
2.1 create for Acquisition instance one or several instances of :class:`NXtomo`.
2.2 Optional split of NXtomo (use case of multi-tomo) in order to obtain the final NXtomo.
2.3 save data to disk.
Acquistion classes
^^^^^^^^^^^^^^^^^^
To manage all the use cases it has evolved. Each acquisition has now it's own acquisition class. All based on the :class:`nxtomomill.converter.hdf5.acquisition.baseacquisition.BaseAcquisition`
- :class:`.StandardAcquisition` default acquisition.
- :class:`.ZSeriesBaseAcquisition` a serie of default acquisition with a set of z values. Create one NXTomo per different z
The regular conversion sequence is:
.. image:: img/hdf5_sequence_diagram.png
:width: 600 px
:align: center
Actually we also have two configuration handler classes. Both inherit from :class:`nxtomomill.io.confighandler.BaseHDF5ConfigHandler`.
The configuration handler is used to make the connection between applications options and configuration (:class:`nxtomomill.io.config.TomoHDF5Config`)
- :class:`.TomoHDF5ConfigHandler`: used by *h52nx* application
The configuration is used to make the conversion (defines input file, output file, entry titles, urls to be converted, source format...)
Actually there is also two configuration classes.
- :class:`.TomoHDF5Config`: define the configuration to generate a usual "NXTomo"
nxtomomill-v2.0.1/doc/development/design/hdf5_converter_seq.txt 0000664 0000000 0000000 00000001337 15114306024 0024770 0 ustar 00root root 0000000 0000000 # done from https://sequencediagram.org/
title bliss hdf5 to nexus hdf5 converter
user->ConfigHandler: provide configuration file\n and command options
ConfigHandler->ConfigHandler: check options\nvalidity
ConfigHandler->Configuration: generate
Configuration->user:return
user->converter: request conversion from a configuration
converter->converter: parse input files / entries
converter->converter: create `BaseAcquisition` instances\n(from titles or from urls)
converter->NXtomo: generate NXtomo instances from `BaseAcquisition` instances
NXtomo->converter:return
converter->NXtomo: Optional: apply modification to NXtomo instances from plugins
NXtomo->converter:return
converter->NXtomo: write NXtomo to disk
NXtomo->NXtomo: save nxtomomill-v2.0.1/doc/development/design/img/ 0000775 0000000 0000000 00000000000 15114306024 0021212 5 ustar 00root root 0000000 0000000 nxtomomill-v2.0.1/doc/development/design/img/hdf5_sequence_diagram.png 0000664 0000000 0000000 00000171707 15114306024 0026137 0 ustar 00root root 0000000 0000000 PNG
IHDR ] 5 IDATxy\w-hG