tomwer 1.2.1__py3-none-any.whl → 1.3.12__py3-none-any.whl
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.
- orangecontrib/tomwer/tutorials/icat_publication.ows +58 -0
- orangecontrib/tomwer/widgets/__init__.py +11 -11
- orangecontrib/tomwer/widgets/control/DataDiscoveryOW.py +2 -2
- orangecontrib/tomwer/widgets/control/DataListOW.py +9 -7
- orangecontrib/tomwer/widgets/control/DataListenerOW.py +6 -6
- orangecontrib/tomwer/widgets/control/DataSelectorOW.py +21 -10
- orangecontrib/tomwer/widgets/control/DataValidatorOW.py +6 -6
- orangecontrib/tomwer/widgets/control/EDF2NXTomomillOW.py +24 -7
- orangecontrib/tomwer/widgets/control/EmailOW.py +4 -4
- orangecontrib/tomwer/widgets/control/NXTomomillMixIn.py +3 -3
- orangecontrib/tomwer/widgets/control/NXTomomillOW.py +64 -23
- orangecontrib/tomwer/widgets/control/NXtomoConcatenate.py +20 -8
- orangecontrib/tomwer/widgets/control/NotifierOW.py +1 -0
- orangecontrib/tomwer/widgets/control/SingleTomoObjOW.py +6 -6
- orangecontrib/tomwer/widgets/control/VolumeSelector.py +7 -4
- orangecontrib/tomwer/widgets/control/VolumeSymLinkOW.py +182 -182
- orangecontrib/tomwer/widgets/debugtools/DatasetGeneratorOW.py +5 -5
- orangecontrib/tomwer/widgets/edit/DarkFlatPatchOW.py +4 -4
- orangecontrib/tomwer/widgets/edit/ImageKeyEditorOW.py +3 -3
- orangecontrib/tomwer/widgets/edit/ImageKeyUpgraderOW.py +8 -1
- orangecontrib/tomwer/widgets/edit/NXtomoEditorOW.py +3 -3
- orangecontrib/tomwer/widgets/edit/test/test_nxtomo_editor.py +3 -3
- orangecontrib/tomwer/widgets/icat/PublishProcessedDataOW.py +115 -0
- orangecontrib/tomwer/widgets/icat/RawDataScreenshotCreatorOW.py +98 -0
- orangecontrib/tomwer/widgets/icat/SaveToGalleryAndPublishOW.py +129 -0
- orangecontrib/tomwer/widgets/icat/__init__.py +13 -0
- orangecontrib/tomwer/widgets/icat/icons/add_gallery.png +0 -0
- orangecontrib/tomwer/widgets/icat/icons/add_gallery.svg +82 -0
- orangecontrib/tomwer/widgets/icat/icons/publish_processed_data.png +0 -0
- orangecontrib/tomwer/widgets/icat/icons/publish_processed_data.svg +95 -0
- orangecontrib/tomwer/widgets/icat/icons/raw_screenshots.png +0 -0
- orangecontrib/tomwer/widgets/icat/icons/raw_screenshots.svg +143 -0
- orangecontrib/tomwer/widgets/icons/tomwer_data_portal.png +0 -0
- orangecontrib/tomwer/widgets/icons/tomwer_data_portal.svg +76 -0
- orangecontrib/tomwer/widgets/reconstruction/AxisOW.py +22 -20
- orangecontrib/tomwer/widgets/reconstruction/CastNabuVolumeOW.py +19 -3
- orangecontrib/tomwer/widgets/reconstruction/NabuHelicalPrepareWeightsDoubleOW.py +184 -169
- orangecontrib/tomwer/widgets/reconstruction/NabuOW.py +23 -0
- orangecontrib/tomwer/widgets/reconstruction/NabuVolumeOW.py +39 -5
- orangecontrib/tomwer/widgets/reconstruction/SAAxisOW.py +18 -22
- orangecontrib/tomwer/widgets/reconstruction/SADeltaBetaOW.py +18 -26
- orangecontrib/tomwer/widgets/reconstruction/SinoNormOW.py +15 -19
- orangecontrib/tomwer/widgets/visualization/DataViewerOW.py +9 -9
- orangecontrib/tomwer/widgets/visualization/DiffViewerOW.py +1 -1
- orangecontrib/tomwer/widgets/visualization/LivesliceOW.py +1 -1
- orangecontrib/tomwer/widgets/visualization/NXtomoMetadataViewerOW.py +3 -3
- orangecontrib/tomwer/widgets/visualization/SinogramViewerOW.py +0 -1
- orangecontrib/tomwer/widgets/visualization/VolumeViewerOW.py +3 -29
- tomwer/__main__.py +7 -64
- tomwer/app/axis.py +3 -3
- tomwer/app/canvas.py +8 -0
- tomwer/app/canvas_launcher/config.py +16 -14
- tomwer/app/canvas_launcher/environ.py +1 -0
- tomwer/app/canvas_launcher/mainwindow.py +4 -1
- tomwer/app/darkref.py +1 -1
- tomwer/app/darkrefpatch.py +1 -1
- tomwer/app/diffframe.py +3 -3
- tomwer/app/imagekeyeditor.py +5 -5
- tomwer/app/imagekeyupgrader.py +5 -5
- tomwer/app/intensitynormalization.py +14 -13
- tomwer/app/{saaxis.py → multicor.py} +3 -3
- tomwer/app/{sadeltabeta.py → multipag.py} +3 -3
- tomwer/app/nabuapp.py +0 -11
- tomwer/app/radiostack.py +6 -4
- tomwer/app/samplemoved.py +3 -2
- tomwer/app/scanviewer.py +4 -2
- tomwer/app/sinogramviewer.py +3 -2
- tomwer/app/slicestack.py +3 -2
- tomwer/app/zstitching.py +88 -6
- tomwer/core/cluster/cluster.py +26 -0
- tomwer/core/log/logger.py +7 -5
- tomwer/core/process/conditions/filters.py +1 -1
- tomwer/core/process/control/datalistener/datalistener.py +19 -14
- tomwer/core/process/control/datawatcher/edfdwprocess.py +0 -9
- tomwer/core/process/control/nxtomoconcatenate.py +13 -13
- tomwer/core/process/control/nxtomomill.py +92 -34
- tomwer/core/process/control/scantransfer.py +20 -43
- tomwer/core/process/control/scanvalidator.py +3 -2
- tomwer/core/process/control/test/test_concatenate_nxtomos.py +9 -9
- tomwer/core/process/control/test/test_email.py +4 -4
- tomwer/core/process/control/test/test_h52nx_process.py +59 -7
- tomwer/core/process/control/test/test_volume_link.py +64 -64
- tomwer/core/process/control/timer.py +1 -1
- tomwer/core/process/control/volumesymlink.py +200 -200
- tomwer/core/process/edit/darkflatpatch.py +14 -15
- tomwer/core/process/edit/imagekeyeditor.py +41 -39
- tomwer/core/process/icat/__init__.py +0 -0
- tomwer/core/process/icat/createscreenshots.py +100 -0
- tomwer/core/process/icat/gallery.py +377 -0
- tomwer/core/process/icat/icatbase.py +36 -0
- tomwer/core/process/icat/publish.py +228 -0
- tomwer/core/process/icat/screenshots.py +27 -0
- tomwer/core/process/output.py +52 -0
- tomwer/core/process/reconstruction/axis/axis.py +280 -69
- tomwer/core/process/reconstruction/axis/mode.py +163 -48
- tomwer/core/process/reconstruction/axis/params.py +29 -21
- tomwer/core/process/reconstruction/darkref/darkrefs.py +41 -127
- tomwer/core/process/reconstruction/darkref/darkrefscopy.py +4 -3
- tomwer/core/process/reconstruction/darkref/params.py +1 -1
- tomwer/core/process/reconstruction/nabu/castvolume.py +4 -4
- tomwer/core/process/reconstruction/nabu/helical.py +9 -5
- tomwer/core/process/reconstruction/nabu/nabucommon.py +71 -78
- tomwer/core/process/reconstruction/nabu/nabuscores.py +425 -53
- tomwer/core/process/reconstruction/nabu/nabuslices.py +114 -93
- tomwer/core/process/reconstruction/nabu/nabuvolume.py +54 -27
- tomwer/core/process/reconstruction/nabu/plane.py +9 -0
- tomwer/core/process/reconstruction/nabu/settings.py +2 -2
- tomwer/core/process/reconstruction/nabu/utils.py +164 -26
- tomwer/core/process/reconstruction/output.py +108 -0
- tomwer/core/process/reconstruction/saaxis/saaxis.py +238 -264
- tomwer/core/process/reconstruction/sadeltabeta/sadeltabeta.py +151 -87
- tomwer/core/process/reconstruction/scores/params.py +7 -4
- tomwer/core/process/reconstruction/scores/scores.py +13 -0
- tomwer/core/process/reconstruction/test/test_axis_params.py +2 -2
- tomwer/core/process/reconstruction/test/test_darkref.py +3 -3
- tomwer/core/process/reconstruction/test/test_darkref_copy.py +7 -7
- tomwer/core/process/reconstruction/test/test_saaxis.py +3 -4
- tomwer/core/process/reconstruction/test/test_sadeltabeta.py +2 -2
- tomwer/core/process/stitching/nabustitcher.py +13 -12
- tomwer/core/process/task.py +34 -26
- tomwer/core/process/test/test_axis.py +13 -12
- tomwer/core/process/test/test_dark_and_flat.py +10 -7
- tomwer/core/process/test/test_data_transfer.py +10 -8
- tomwer/core/process/test/test_nabu.py +14 -6
- tomwer/core/process/test/test_normalization.py +4 -4
- tomwer/core/scan/blissscan.py +3 -3
- tomwer/core/scan/edfscan.py +13 -10
- tomwer/core/scan/hdf5scan.py +19 -530
- tomwer/core/scan/nxtomoscan.py +534 -0
- tomwer/core/scan/scanbase.py +72 -44
- tomwer/core/scan/scanfactory.py +13 -13
- tomwer/core/scan/test/test_edf.py +2 -2
- tomwer/core/scan/test/test_future_scan.py +3 -3
- tomwer/core/scan/test/test_h5.py +18 -16
- tomwer/core/scan/test/test_process_registration.py +4 -40
- tomwer/core/scan/test/test_scan.py +5 -78
- tomwer/core/settings.py +22 -2
- tomwer/core/test/test_scanutils.py +8 -7
- tomwer/core/test/test_utils.py +35 -28
- tomwer/core/tomwer_object.py +1 -1
- tomwer/core/utils/__init__.py +0 -466
- tomwer/core/utils/deprecation.py +1 -1
- tomwer/core/utils/dictutils.py +14 -0
- tomwer/core/utils/lbsram.py +35 -0
- tomwer/core/utils/nxtomoutils.py +1 -1
- tomwer/core/utils/scanutils.py +6 -6
- tomwer/core/utils/spec.py +263 -0
- tomwer/core/volume/edfvolume.py +6 -6
- tomwer/core/volume/hdf5volume.py +6 -6
- tomwer/core/volume/jp2kvolume.py +6 -6
- tomwer/core/volume/rawvolume.py +6 -6
- tomwer/core/volume/tiffvolume.py +12 -12
- tomwer/core/volume/volumefactory.py +2 -2
- tomwer/gui/cluster/slurm.py +274 -65
- tomwer/gui/cluster/supervisor.py +12 -0
- tomwer/gui/cluster/test/test_cluster.py +14 -2
- tomwer/gui/cluster/test/test_supervisor.py +3 -3
- tomwer/gui/configuration/__init__.py +0 -0
- tomwer/gui/{reconstruction/nabu → configuration}/action.py +1 -32
- tomwer/gui/configuration/level.py +22 -0
- tomwer/gui/control/actions.py +54 -0
- tomwer/gui/control/datalist.py +83 -16
- tomwer/gui/control/datalistener.py +4 -16
- tomwer/gui/control/datawatcher/controlwidget.py +2 -4
- tomwer/gui/control/datawatcher/datawatcher.py +1 -24
- tomwer/gui/control/{email.py → emailnotifier.py} +9 -18
- tomwer/gui/control/history.py +2 -2
- tomwer/gui/control/observations.py +2 -2
- tomwer/gui/control/reducedarkflatselector.py +9 -9
- tomwer/gui/control/selectorwidgetbase.py +36 -9
- tomwer/gui/control/serie/seriecreator.py +5 -22
- tomwer/gui/control/test/test_email.py +1 -1
- tomwer/gui/control/test/test_scanvalidator.py +6 -5
- tomwer/gui/control/test/test_single_tomo_obj.py +3 -3
- tomwer/gui/control/tomoobjdisplaymode.py +8 -0
- tomwer/gui/debugtools/datasetgenerator.py +3 -3
- tomwer/gui/edit/dkrfpatch.py +20 -26
- tomwer/gui/edit/imagekeyeditor.py +11 -12
- tomwer/gui/edit/nxtomoeditor.py +111 -44
- tomwer/gui/edit/nxtomowarmer.py +7 -6
- tomwer/gui/edit/test/test_dkrf_patch.py +13 -13
- tomwer/gui/edit/test/test_image_key_editor.py +3 -3
- tomwer/gui/edit/test/test_nx_editor.py +40 -16
- tomwer/gui/icat/__init__.py +0 -0
- tomwer/gui/icat/createscreenshots.py +80 -0
- tomwer/gui/icat/gallery.py +214 -0
- tomwer/gui/icat/publish.py +187 -0
- tomwer/gui/imagefromfile.py +2 -2
- tomwer/gui/qfolderdialog.py +24 -1
- tomwer/gui/reconstruction/axis/CompareImages.py +88 -168
- tomwer/gui/reconstruction/axis/axis.py +171 -57
- tomwer/gui/reconstruction/axis/radioaxis.py +122 -257
- tomwer/gui/reconstruction/darkref/darkrefcopywidget.py +3 -2
- tomwer/gui/reconstruction/darkref/darkrefwidget.py +2 -1
- tomwer/gui/reconstruction/nabu/castvolume.py +14 -3
- tomwer/gui/reconstruction/nabu/check.py +9 -9
- tomwer/gui/reconstruction/nabu/helical.py +29 -12
- tomwer/gui/reconstruction/nabu/nabuconfig/base.py +2 -4
- tomwer/gui/reconstruction/nabu/nabuconfig/nabuconfig.py +2 -1
- tomwer/gui/reconstruction/nabu/nabuconfig/output.py +126 -35
- tomwer/gui/reconstruction/nabu/nabuconfig/phase.py +39 -32
- tomwer/gui/reconstruction/nabu/nabuconfig/preprocessing.py +222 -31
- tomwer/gui/reconstruction/nabu/nabuconfig/reconstruction.py +57 -27
- tomwer/gui/reconstruction/nabu/nabuflow.py +12 -20
- tomwer/gui/reconstruction/nabu/slices.py +10 -11
- tomwer/gui/reconstruction/nabu/volume.py +22 -10
- tomwer/gui/reconstruction/normalization/intensity.py +18 -48
- tomwer/gui/reconstruction/saaxis/corrangeselector.py +8 -24
- tomwer/gui/reconstruction/saaxis/dimensionwidget.py +1 -1
- tomwer/gui/reconstruction/saaxis/saaxis.py +9 -21
- tomwer/gui/reconstruction/sadeltabeta/saadeltabeta.py +45 -12
- tomwer/gui/reconstruction/scores/control.py +2 -9
- tomwer/gui/reconstruction/scores/scoreplot.py +13 -11
- tomwer/gui/reconstruction/test/test_axis.py +41 -16
- tomwer/gui/reconstruction/test/test_nabu.py +31 -9
- tomwer/gui/reconstruction/test/test_saaxis.py +3 -3
- tomwer/gui/reconstruction/test/test_sadeltabeta.py +12 -2
- tomwer/gui/settings.py +5 -28
- tomwer/gui/stackplot.py +2 -5
- tomwer/gui/stitching/action.py +49 -0
- tomwer/gui/stitching/config/axisparams.py +7 -24
- tomwer/gui/stitching/config/output.py +10 -8
- tomwer/gui/stitching/config/positionoveraxis.py +22 -23
- tomwer/gui/stitching/normalization.py +117 -0
- tomwer/gui/stitching/stitchandbackground.py +4 -6
- tomwer/gui/stitching/stitching.py +267 -45
- tomwer/gui/stitching/stitching_preview.py +62 -55
- tomwer/gui/stitching/stitching_raw.py +13 -12
- tomwer/gui/stitching/z_stitching/fineestimation.py +0 -60
- tomwer/gui/utils/buttons.py +112 -29
- tomwer/gui/utils/inputwidget.py +43 -25
- tomwer/gui/utils/lineselector/lineselector.py +1 -1
- tomwer/gui/utils/scandescription.py +4 -0
- tomwer/gui/utils/step.py +144 -0
- tomwer/gui/utils/unitsystem.py +2 -5
- tomwer/gui/utils/vignettes.py +176 -15
- tomwer/gui/visualization/dataviewer.py +48 -35
- tomwer/gui/visualization/diffviewer/diffviewer.py +7 -16
- tomwer/gui/visualization/diffviewer/shiftwidget.py +2 -5
- tomwer/gui/visualization/scanoverview.py +1 -1
- tomwer/gui/visualization/sinogramviewer.py +20 -36
- tomwer/gui/visualization/test/test_diffviewer.py +3 -3
- tomwer/gui/visualization/test/test_nx_tomo_metadata_viewer.py +4 -4
- tomwer/gui/visualization/test/test_sinogramviewer.py +2 -2
- tomwer/gui/visualization/test/test_stacks.py +3 -3
- tomwer/gui/visualization/test/test_volumeviewer.py +65 -67
- tomwer/gui/visualization/volumeviewer.py +114 -113
- tomwer/io/utils/h5pyutils.py +3 -3
- tomwer/io/utils/raw_and_processed_data.py +84 -0
- tomwer/io/utils/tomoobj.py +4 -6
- tomwer/io/utils/utils.py +7 -7
- tomwer/resources/gui/icons/parameters.svg +1 -1
- tomwer/resources/gui/icons/ruler.png +0 -0
- tomwer/resources/gui/icons/ruler.svg +273 -0
- tomwer/resources/gui/icons/short_description.png +0 -0
- tomwer/resources/gui/icons/short_description.svg +58 -0
- tomwer/resources/gui/icons/url.png +0 -0
- tomwer/resources/gui/icons/url.svg +58 -0
- tomwer/resources/gui/illustrations/no_rot.svg +1 -1
- tomwer/synctools/stacks/edit/darkflatpatch.py +19 -14
- tomwer/synctools/stacks/edit/imagekeyeditor.py +2 -2
- tomwer/synctools/stacks/reconstruction/axis.py +4 -4
- tomwer/synctools/stacks/reconstruction/castvolume.py +22 -7
- tomwer/synctools/stacks/reconstruction/dkrefcopy.py +25 -20
- tomwer/synctools/stacks/reconstruction/nabu.py +2 -2
- tomwer/synctools/stacks/reconstruction/normalization.py +2 -2
- tomwer/synctools/stacks/reconstruction/saaxis.py +2 -2
- tomwer/synctools/stacks/reconstruction/sadeltabeta.py +2 -2
- tomwer/synctools/test/test_darkRefs.py +7 -58
- tomwer/synctools/test/test_foldertransfer.py +6 -6
- tomwer/synctools/utils/scanstages.py +6 -6
- tomwer/tests/conftest.py +34 -0
- tomwer/tests/datasets.py +13 -0
- tomwer/tests/test_scripts.py +91 -41
- tomwer/tests/utils.py +5 -0
- tomwer/third_part/WaitingOverlay.py +110 -0
- tomwer/third_part/__init__.py +0 -0
- tomwer/version.py +2 -2
- tomwer-1.3.12-py3.11-nspkg.pth +1 -0
- {tomwer-1.2.1.dist-info → tomwer-1.3.12.dist-info}/METADATA +73 -58
- {tomwer-1.2.1.dist-info → tomwer-1.3.12.dist-info}/RECORD +287 -286
- {tomwer-1.2.1.dist-info → tomwer-1.3.12.dist-info}/WHEEL +1 -1
- orangecontrib/tomwer/widgets/reconstruction/TofuOW.py +0 -197
- orangecontrib/tomwer/widgets/reconstruction/icons/XY_lamino.svg +0 -168
- orangecontrib/tomwer/widgets/reconstruction/icons/XZ_lamino.svg +0 -275
- orangecontrib/tomwer/widgets/reconstruction/icons/YZ_lamino.svg +0 -182
- tomwer/app/lamino.py +0 -143
- tomwer/core/process/reconstruction/lamino/__init__.py +0 -1
- tomwer/core/process/reconstruction/lamino/tofu.py +0 -1000
- tomwer/core/process/test/test_lamino.py +0 -76
- tomwer/core/test/test_lamino.py +0 -92
- tomwer/gui/reconstruction/lamino/__init__.py +0 -31
- tomwer/gui/reconstruction/lamino/tofu/TofuOptionLoader.py +0 -107
- tomwer/gui/reconstruction/lamino/tofu/__init__.py +0 -1
- tomwer/gui/reconstruction/lamino/tofu/misc.py +0 -148
- tomwer/gui/reconstruction/lamino/tofu/projections.py +0 -896
- tomwer/gui/reconstruction/lamino/tofu/settings.py +0 -75
- tomwer/gui/reconstruction/lamino/tofu/tofu.py +0 -432
- tomwer/gui/reconstruction/lamino/tofu/tofuexpert.py +0 -567
- tomwer/gui/reconstruction/lamino/tofu/tofuoutput.py +0 -760
- tomwer/gui/reconstruction/test/test_lamino.py +0 -189
- tomwer/resources/gui/icons/esrf_1.svg +0 -307
- tomwer/resources/gui/icons/lamino_parameters.svg +0 -70
- tomwer/resources/gui/icons/triangle.svg +0 -80
- tomwer/resources/gui/illustrations/lamino_angle.png +0 -0
- tomwer/resources/gui/illustrations/lamino_angle.svg +0 -509
- tomwer/resources/gui/illustrations/lamino_beta_angle.png +0 -0
- tomwer/resources/gui/illustrations/lamino_beta_angle.svg +0 -97
- tomwer/resources/gui/illustrations/lamino_theta_angle.png +0 -0
- tomwer/resources/gui/illustrations/lamino_theta_angle.svg +0 -368
- tomwer/resources/gui/illustrations/manual_slice.png +0 -0
- tomwer/resources/gui/illustrations/manual_slice.svg +0 -221
- tomwer/resources/gui/illustrations/psi_angle.png +0 -0
- tomwer/resources/gui/illustrations/psi_angle.svg +0 -479
- tomwer/resources/gui/illustrations/rotation_center.png +0 -0
- tomwer/resources/gui/illustrations/rotation_center.svg +0 -276
- tomwer/resources/gui/illustrations/slice_stack.png +0 -0
- tomwer/resources/gui/illustrations/slice_stack.svg +0 -266
- tomwer/resources/gui/illustrations/xy_slice.png +0 -0
- tomwer/resources/gui/illustrations/xy_slice.svg +0 -269
- tomwer/resources/gui/illustrations/xz_slice.png +0 -0
- tomwer/resources/gui/illustrations/xz_slice.svg +0 -270
- tomwer/resources/gui/illustrations/yz_slice.png +0 -0
- tomwer/resources/gui/illustrations/yz_slice.svg +0 -270
- tomwer/synctools/stacks/reconstruction/lamino.py +0 -233
- tomwer/synctools/test/test_scanstages.py +0 -162
- tomwer/tests/utils/__init__.py +0 -247
- tomwer/tests/utils/utilstest.py +0 -220
- tomwer-1.2.1-py3.11-nspkg.pth +0 -1
- /tomwer/core/process/control/{email.py → emailnotifier.py} +0 -0
- {tomwer-1.2.1.dist-info → tomwer-1.3.12.dist-info}/LICENSE +0 -0
- {tomwer-1.2.1.dist-info → tomwer-1.3.12.dist-info}/entry_points.txt +0 -0
- {tomwer-1.2.1.dist-info → tomwer-1.3.12.dist-info}/namespace_packages.txt +0 -0
- {tomwer-1.2.1.dist-info → tomwer-1.3.12.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,263 @@
|
|
1
|
+
import fileinput
|
2
|
+
import logging
|
3
|
+
import os
|
4
|
+
|
5
|
+
import fabio.edfimage
|
6
|
+
from lxml import etree
|
7
|
+
from pyunitsystem import metricsystem
|
8
|
+
|
9
|
+
|
10
|
+
_logger = logging.getLogger(__name__)
|
11
|
+
|
12
|
+
|
13
|
+
def _getInformation(scan, refFile, information, _type, aliases=None):
|
14
|
+
"""
|
15
|
+
Parse files contained in the given directory to get the requested
|
16
|
+
information
|
17
|
+
|
18
|
+
:param scan: directory containing the acquisition. Must be an absolute path
|
19
|
+
:param refFile: the refXXXX_YYYY which should contain information about the
|
20
|
+
scan.
|
21
|
+
:return: the requested information or None if not found
|
22
|
+
"""
|
23
|
+
|
24
|
+
def parseRefFile(filePath):
|
25
|
+
header = fabio.open(filePath).header
|
26
|
+
for k in aliases:
|
27
|
+
if k in header:
|
28
|
+
return _type(header[k])
|
29
|
+
return None
|
30
|
+
|
31
|
+
def parseXMLFile(filePath):
|
32
|
+
try:
|
33
|
+
for alias in info_aliases:
|
34
|
+
tree = etree.parse(filePath)
|
35
|
+
elmt = tree.find("acquisition/" + alias)
|
36
|
+
if elmt is None:
|
37
|
+
continue
|
38
|
+
else:
|
39
|
+
info = _type(elmt.text)
|
40
|
+
if info == -1:
|
41
|
+
return None
|
42
|
+
else:
|
43
|
+
return info
|
44
|
+
except etree.XMLSyntaxError as e:
|
45
|
+
_logger.warning(e)
|
46
|
+
return None
|
47
|
+
|
48
|
+
def parseInfoFile(filePath):
|
49
|
+
def extractInformation(text, alias):
|
50
|
+
text = text.replace(alias, "")
|
51
|
+
text = text.replace("\n", "")
|
52
|
+
text = text.replace(" ", "")
|
53
|
+
text = text.replace("=", "")
|
54
|
+
return _type(text)
|
55
|
+
|
56
|
+
info = None
|
57
|
+
f = open(filePath, "r")
|
58
|
+
line = f.readline()
|
59
|
+
while line:
|
60
|
+
for alias in info_aliases:
|
61
|
+
if alias in line:
|
62
|
+
info = extractInformation(line, alias)
|
63
|
+
break
|
64
|
+
line = f.readline()
|
65
|
+
f.close()
|
66
|
+
return info
|
67
|
+
|
68
|
+
info_aliases = [information]
|
69
|
+
if aliases is not None:
|
70
|
+
assert type(aliases) in (tuple, list)
|
71
|
+
[info_aliases.append(alias) for alias in aliases]
|
72
|
+
|
73
|
+
if not os.path.isdir(scan):
|
74
|
+
return None
|
75
|
+
|
76
|
+
if refFile is not None and os.path.isfile(refFile):
|
77
|
+
try:
|
78
|
+
info = parseRefFile(refFile)
|
79
|
+
except IOError as e:
|
80
|
+
_logger.warning(e)
|
81
|
+
else:
|
82
|
+
if info is not None:
|
83
|
+
return info
|
84
|
+
|
85
|
+
baseName = os.path.basename(scan)
|
86
|
+
infoFiles = [os.path.join(scan, baseName + ".info")]
|
87
|
+
infoOnDataVisitor = infoFiles[0].replace("lbsram", "", 1)
|
88
|
+
# hack to check in lbsram, would need to be removed to add some consistency
|
89
|
+
if os.path.isfile(infoOnDataVisitor):
|
90
|
+
infoFiles.append(infoOnDataVisitor)
|
91
|
+
for infoFile in infoFiles:
|
92
|
+
if os.path.isfile(infoFile) is True:
|
93
|
+
info = parseInfoFile(infoFile)
|
94
|
+
if info is not None:
|
95
|
+
return info
|
96
|
+
|
97
|
+
xmlFiles = [os.path.join(scan, baseName + ".xml")]
|
98
|
+
xmlOnDataVisitor = xmlFiles[0].replace("lbsram", "", 1)
|
99
|
+
# hack to check in lbsram, would need to be removed to add some consistency
|
100
|
+
if os.path.isfile(xmlOnDataVisitor):
|
101
|
+
xmlFiles.append(xmlOnDataVisitor)
|
102
|
+
for xmlFile in xmlFiles:
|
103
|
+
if os.path.isfile(xmlFile) is True:
|
104
|
+
info = parseXMLFile(xmlFile)
|
105
|
+
if info is not None:
|
106
|
+
return info
|
107
|
+
|
108
|
+
return None
|
109
|
+
|
110
|
+
|
111
|
+
def getClosestEnergy(scan, refFile=None):
|
112
|
+
"""
|
113
|
+
Parse files contained in the given directory to get information about the
|
114
|
+
incoming energy for the serie `iSerie`
|
115
|
+
|
116
|
+
:param scan: directory containing the acquisition
|
117
|
+
:param refFile: the refXXXX_YYYY which should contain information about the
|
118
|
+
energy.
|
119
|
+
:return: the energy in keV or none if no energy found
|
120
|
+
"""
|
121
|
+
return _getInformation(
|
122
|
+
os.path.abspath(scan),
|
123
|
+
refFile,
|
124
|
+
information="Energy",
|
125
|
+
aliases=["energy", "ENERGY"],
|
126
|
+
_type=float,
|
127
|
+
)
|
128
|
+
|
129
|
+
|
130
|
+
def getTomo_N(scan):
|
131
|
+
"""Return the number of radio taken"""
|
132
|
+
return _getInformation(
|
133
|
+
os.path.abspath(scan),
|
134
|
+
refFile=None,
|
135
|
+
information="TOMO_N",
|
136
|
+
_type=int,
|
137
|
+
aliases=["tomo_N", "Tomo_N"],
|
138
|
+
)
|
139
|
+
|
140
|
+
|
141
|
+
def getDARK_N(scan):
|
142
|
+
return _getInformation(
|
143
|
+
os.path.abspath(scan),
|
144
|
+
refFile=None,
|
145
|
+
information="DARK_N",
|
146
|
+
_type=int,
|
147
|
+
aliases=["dark_N"],
|
148
|
+
)
|
149
|
+
|
150
|
+
|
151
|
+
def rebaseParFile(_file, oldfolder, newfolder):
|
152
|
+
"""Update the given .par file to replace oldfolder location by the newfolder.
|
153
|
+
|
154
|
+
.. warning:: make the replacement in place.
|
155
|
+
|
156
|
+
:param _file: par file to update
|
157
|
+
:param oldfolder: previous location of the .par file
|
158
|
+
:param newfolder: new location of the .par file
|
159
|
+
"""
|
160
|
+
with fileinput.FileInput(_file, inplace=True, backup=".bak") as parfile:
|
161
|
+
for line in parfile:
|
162
|
+
line = line.rstrip().replace(oldfolder, newfolder, 1)
|
163
|
+
print(line)
|
164
|
+
|
165
|
+
|
166
|
+
def getDim1Dim2(scan):
|
167
|
+
"""
|
168
|
+
|
169
|
+
:param scan: path to the acquisition
|
170
|
+
:return: detector definition
|
171
|
+
:rtype: tuple of int
|
172
|
+
"""
|
173
|
+
d1 = _getInformation(
|
174
|
+
scan=scan,
|
175
|
+
refFile=None,
|
176
|
+
information="Dim_1",
|
177
|
+
aliases=["projectionSize/DIM_1"],
|
178
|
+
_type=int,
|
179
|
+
)
|
180
|
+
d2 = _getInformation(
|
181
|
+
scan=scan,
|
182
|
+
refFile=None,
|
183
|
+
information="Dim_2",
|
184
|
+
aliases=["projectionSize/DIM_2"],
|
185
|
+
_type=int,
|
186
|
+
)
|
187
|
+
return d1, d2
|
188
|
+
|
189
|
+
|
190
|
+
def getParametersFromParOrInfo(_file):
|
191
|
+
"""
|
192
|
+
Create a dictionary from the file with the information name as keys and
|
193
|
+
their values as values
|
194
|
+
"""
|
195
|
+
assert os.path.exists(_file) and os.path.isfile(_file)
|
196
|
+
ddict = {}
|
197
|
+
f = open(_file, "r")
|
198
|
+
lines = f.readlines()
|
199
|
+
for line in lines:
|
200
|
+
if "=" not in line:
|
201
|
+
continue
|
202
|
+
line_str = line.replace(" ", "")
|
203
|
+
line_str = line_str.rstrip("\n")
|
204
|
+
# remove on the line comments
|
205
|
+
if "#" in line_str:
|
206
|
+
line_str = line_str.split("#")[0]
|
207
|
+
if line_str == "":
|
208
|
+
continue
|
209
|
+
try:
|
210
|
+
key, value = line_str.split("=")
|
211
|
+
except ValueError:
|
212
|
+
_logger.error('fail to extract information from "%s"' % line_str)
|
213
|
+
else:
|
214
|
+
ddict[key.lower()] = value
|
215
|
+
return ddict
|
216
|
+
|
217
|
+
|
218
|
+
def getFirstProjFile(scan):
|
219
|
+
"""Return the first .edf containing a projection"""
|
220
|
+
if os.path.isdir(scan) is False:
|
221
|
+
return None
|
222
|
+
files = sorted(os.listdir(scan))
|
223
|
+
|
224
|
+
while (
|
225
|
+
len(files) > 0
|
226
|
+
and (files[0].startswith(os.path.basename(scan)) and files[0].endswith(".edf"))
|
227
|
+
is False
|
228
|
+
):
|
229
|
+
files.remove(files[0])
|
230
|
+
|
231
|
+
if len(files) > 0:
|
232
|
+
return os.path.join(scan, files[0])
|
233
|
+
else:
|
234
|
+
return None
|
235
|
+
|
236
|
+
|
237
|
+
def getPixelSize(scan):
|
238
|
+
"""
|
239
|
+
Try to retrieve the pixel size from the set of files.
|
240
|
+
|
241
|
+
:return: the pixel size in meter or None
|
242
|
+
:rtype: None or float
|
243
|
+
"""
|
244
|
+
if os.path.isdir(scan) is False:
|
245
|
+
return None
|
246
|
+
value = _getInformation(
|
247
|
+
scan=scan,
|
248
|
+
refFile=None,
|
249
|
+
information="PixelSize",
|
250
|
+
_type=float,
|
251
|
+
aliases=["pixelSize"],
|
252
|
+
)
|
253
|
+
if value is None:
|
254
|
+
parFile = os.path.join(scan, os.path.basename(scan) + ".par")
|
255
|
+
if os.path.exists(parFile):
|
256
|
+
ddict = getParametersFromParOrInfo(parFile)
|
257
|
+
if "IMAGE_PIXEL_SIZE_1".lower() in ddict:
|
258
|
+
value = float(ddict["IMAGE_PIXEL_SIZE_1".lower()])
|
259
|
+
# for now pixel size are stored in microns. We want to return them in meter
|
260
|
+
if value is not None:
|
261
|
+
return value * metricsystem.micrometer.value
|
262
|
+
else:
|
263
|
+
return None
|
tomwer/core/volume/edfvolume.py
CHANGED
@@ -86,11 +86,11 @@ class EDFVolume(_EDFVolume, TomwerVolumeBase, Dataset):
|
|
86
86
|
file_prefix=self._volume_basename,
|
87
87
|
metadata={
|
88
88
|
"name": self.url.file_path(),
|
89
|
-
"creation_time":
|
90
|
-
|
91
|
-
|
92
|
-
"modification_time":
|
93
|
-
|
94
|
-
|
89
|
+
"creation_time": (
|
90
|
+
datetime.fromtimestamp(stat.st_ctime) if stat else None
|
91
|
+
),
|
92
|
+
"modification_time": (
|
93
|
+
datetime.fromtimestamp(stat.st_ctime) if stat else None
|
94
|
+
),
|
95
95
|
},
|
96
96
|
)
|
tomwer/core/volume/hdf5volume.py
CHANGED
@@ -103,11 +103,11 @@ class HDF5Volume(_HDF5Volume, TomwerVolumeBase, Dataset):
|
|
103
103
|
entry=self.url.data_path(),
|
104
104
|
metadata={
|
105
105
|
"name": self.url.file_path(),
|
106
|
-
"creation_time":
|
107
|
-
|
108
|
-
|
109
|
-
"modification_time":
|
110
|
-
|
111
|
-
|
106
|
+
"creation_time": (
|
107
|
+
datetime.fromtimestamp(stat.st_ctime) if stat else None
|
108
|
+
),
|
109
|
+
"modification_time": (
|
110
|
+
datetime.fromtimestamp(stat.st_ctime) if stat else None
|
111
|
+
),
|
112
112
|
},
|
113
113
|
)
|
tomwer/core/volume/jp2kvolume.py
CHANGED
@@ -87,11 +87,11 @@ class JP2KVolume(_JP2KVolume, TomwerVolumeBase, Dataset):
|
|
87
87
|
file_prefix=self._volume_basename,
|
88
88
|
metadata={
|
89
89
|
"name": self.url.file_path(),
|
90
|
-
"creation_time":
|
91
|
-
|
92
|
-
|
93
|
-
"modification_time":
|
94
|
-
|
95
|
-
|
90
|
+
"creation_time": (
|
91
|
+
datetime.fromtimestamp(stat.st_ctime) if stat else None
|
92
|
+
),
|
93
|
+
"modification_time": (
|
94
|
+
datetime.fromtimestamp(stat.st_ctime) if stat else None
|
95
|
+
),
|
96
96
|
},
|
97
97
|
)
|
tomwer/core/volume/rawvolume.py
CHANGED
@@ -97,11 +97,11 @@ class RawVolume(_RawVolume, TomwerVolumeBase, Dataset):
|
|
97
97
|
file_path=self.url.file_path(),
|
98
98
|
metadata={
|
99
99
|
"name": self.url.file_path(),
|
100
|
-
"creation_time":
|
101
|
-
|
102
|
-
|
103
|
-
"modification_time":
|
104
|
-
|
105
|
-
|
100
|
+
"creation_time": (
|
101
|
+
datetime.fromtimestamp(stat.st_ctime) if stat else None
|
102
|
+
),
|
103
|
+
"modification_time": (
|
104
|
+
datetime.fromtimestamp(stat.st_ctime) if stat else None
|
105
|
+
),
|
106
106
|
},
|
107
107
|
)
|
tomwer/core/volume/tiffvolume.py
CHANGED
@@ -103,12 +103,12 @@ class TIFFVolume(_TIFFVolume, TomwerVolumeBase, Dataset):
|
|
103
103
|
file_prefix=self._volume_basename,
|
104
104
|
metadata={
|
105
105
|
"name": self.url.file_path(),
|
106
|
-
"creation_time":
|
107
|
-
|
108
|
-
|
109
|
-
"modification_time":
|
110
|
-
|
111
|
-
|
106
|
+
"creation_time": (
|
107
|
+
datetime.fromtimestamp(stat.st_ctime) if stat else None
|
108
|
+
),
|
109
|
+
"modification_time": (
|
110
|
+
datetime.fromtimestamp(stat.st_ctime) if stat else None
|
111
|
+
),
|
112
112
|
},
|
113
113
|
)
|
114
114
|
|
@@ -145,12 +145,12 @@ class MultiTIFFVolume(_MultiTIFFVolume, TomwerVolumeBase, Dataset):
|
|
145
145
|
tiff_file=self.url.file_path(),
|
146
146
|
metadata={
|
147
147
|
"name": self.url.file_path(),
|
148
|
-
"creation_time":
|
149
|
-
|
150
|
-
|
151
|
-
"modification_time":
|
152
|
-
|
153
|
-
|
148
|
+
"creation_time": (
|
149
|
+
datetime.fromtimestamp(stat.st_ctime) if stat else None
|
150
|
+
),
|
151
|
+
"modification_time": (
|
152
|
+
datetime.fromtimestamp(stat.st_ctime) if stat else None
|
153
|
+
),
|
154
154
|
},
|
155
155
|
)
|
156
156
|
|
@@ -38,7 +38,7 @@ from tomoscan.factory import Factory as _oVolumeFactory
|
|
38
38
|
from tomoscan.identifier import BaseIdentifier, ScanIdentifier, VolumeIdentifier
|
39
39
|
|
40
40
|
from tomwer.core.scan.edfscan import EDFTomoScan, EDFTomoScanIdentifier
|
41
|
-
from tomwer.core.scan.
|
41
|
+
from tomwer.core.scan.nxtomoscan import NXtomoScan
|
42
42
|
from tomwer.core.volume import (
|
43
43
|
EDFVolume,
|
44
44
|
HDF5Volume,
|
@@ -156,7 +156,7 @@ class VolumeFactory(_oVolumeFactory):
|
|
156
156
|
if tomo_type == VolumeIdentifier.TOMO_TYPE:
|
157
157
|
return HDF5Volume.from_identifier(identifier=identifier)
|
158
158
|
elif tomo_type == ScanIdentifier.TOMO_TYPE:
|
159
|
-
return
|
159
|
+
return NXtomoScan.from_identifier(identifier=identifier)
|
160
160
|
else:
|
161
161
|
raise NotImplementedError()
|
162
162
|
elif scheme == "jp2k":
|