From e905804bb88fdaee8c9bb1aff60a147df365adb9 Mon Sep 17 00:00:00 2001 From: nicwade Date: Mon, 12 Jul 2021 13:46:50 +0100 Subject: [PATCH 01/10] Adds savu citations documentation --- doc/source/index.rst | 9 +++++++++ doc/source/reference/savu_citations.rst | 23 +++++++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 doc/source/reference/savu_citations.rst diff --git a/doc/source/index.rst b/doc/source/index.rst index 712815a2a..81ceca266 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -66,6 +66,15 @@ Table of Contents reference/plugin_autosummary +.. _citations_content: + +.. toctree: + : caption Citations + : maxdepth: 2 + + reference/savu_citations + + Indices and tables ================== * :ref:`genindex` diff --git a/doc/source/reference/savu_citations.rst b/doc/source/reference/savu_citations.rst new file mode 100644 index 000000000..074038aed --- /dev/null +++ b/doc/source/reference/savu_citations.rst @@ -0,0 +1,23 @@ + +How to cite Savu software +========================= + +.. start_of_main_text + +All citations are contained in both the Savu process list and output Savu nexus file. These include: + +* Savu framework citations +* Plugin citations - specific to your process list + +You can extract these citations into BibTeX and EndNote formats using the savu_citations tool. From the command line run: + +>>> savu_citations + +Where the output file is the name of the file you would like to extract this information to. + +For example, + +>>> savu_citations process_lists.nxs citations.txt + +*** Please include all Savu citations in your relevant publications *** + From 303f4af9aaecb5c0050e3a436a6034293162d911 Mon Sep 17 00:00:00 2001 From: nicwade Date: Mon, 12 Jul 2021 13:53:08 +0100 Subject: [PATCH 02/10] doc update --- doc/source/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/index.rst b/doc/source/index.rst index 81ceca266..835396cf7 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -68,7 +68,7 @@ Table of Contents .. _citations_content: -.. toctree: +.. toctree:: : caption Citations : maxdepth: 2 From f42ea1bacf95ede1891f9df8510134162756a3f1 Mon Sep 17 00:00:00 2001 From: nicwade Date: Mon, 12 Jul 2021 15:15:39 +0100 Subject: [PATCH 03/10] docs update --- doc/source/index.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/source/index.rst b/doc/source/index.rst index 835396cf7..328b5efd0 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -69,8 +69,8 @@ Table of Contents .. _citations_content: .. toctree:: - : caption Citations - : maxdepth: 2 + :caption Citations + :maxdepth: 2 reference/savu_citations From bc3733640b0847e9694401ae448ed515aa3a7739 Mon Sep 17 00:00:00 2001 From: nicwade Date: Mon, 12 Jul 2021 15:21:43 +0100 Subject: [PATCH 04/10] doc updates --- doc/source/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/index.rst b/doc/source/index.rst index 328b5efd0..470401ce3 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -69,7 +69,7 @@ Table of Contents .. _citations_content: .. toctree:: - :caption Citations + :caption: Citations :maxdepth: 2 reference/savu_citations From 6b74a45d841fb48dc4107f24602d5fa3eab61bf6 Mon Sep 17 00:00:00 2001 From: nicwade Date: Mon, 12 Jul 2021 15:59:13 +0100 Subject: [PATCH 05/10] Updates Savu citations docs --- doc/source/reference/savu_citations.rst | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/doc/source/reference/savu_citations.rst b/doc/source/reference/savu_citations.rst index 074038aed..d6cd85d3b 100644 --- a/doc/source/reference/savu_citations.rst +++ b/doc/source/reference/savu_citations.rst @@ -4,12 +4,11 @@ How to cite Savu software .. start_of_main_text -All citations are contained in both the Savu process list and output Savu nexus file. These include: - +The relevant citations for your Savu job are contained in the "citations.txt" file in the Savu output folder, in BibTeX and EndNote formats. These include: * Savu framework citations * Plugin citations - specific to your process list -You can extract these citations into BibTeX and EndNote formats using the savu_citations tool. From the command line run: +All citations are also contained in both the Savu process list and output Savu nexus file and can be extracted into BibTeX and EndNote formats using the savu_citations tool. From the command line run: >>> savu_citations From 35ed02deeb404000564a7d30513a099b4cc51fa8 Mon Sep 17 00:00:00 2001 From: nicwade Date: Mon, 12 Jul 2021 16:07:45 +0100 Subject: [PATCH 06/10] Doc updates --- doc/source/reference/savu_citations.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/source/reference/savu_citations.rst b/doc/source/reference/savu_citations.rst index d6cd85d3b..c324cccec 100644 --- a/doc/source/reference/savu_citations.rst +++ b/doc/source/reference/savu_citations.rst @@ -5,6 +5,7 @@ How to cite Savu software .. start_of_main_text The relevant citations for your Savu job are contained in the "citations.txt" file in the Savu output folder, in BibTeX and EndNote formats. These include: + * Savu framework citations * Plugin citations - specific to your process list From 9fe9e197ce05b5d8a5f78070a6ee4afdb6623aca Mon Sep 17 00:00:00 2001 From: nicwade Date: Mon, 12 Jul 2021 16:08:09 +0100 Subject: [PATCH 07/10] Automatically extracts citation information into output folder --- savu/tomo_recon.py | 4 ++++ .../citation_extractor/citation_extractor.py | 23 +++++++++++++------ 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/savu/tomo_recon.py b/savu/tomo_recon.py index a432ade61..34911223a 100644 --- a/savu/tomo_recon.py +++ b/savu/tomo_recon.py @@ -30,6 +30,7 @@ from savu.version import __version__ import savu.core.utils as cu +from scripts.citation_extractor import citation_extractor from savu.core.basic_plugin_runner import BasicPluginRunner from savu.core.plugin_runner import PluginRunner @@ -217,6 +218,9 @@ def main(input_args=None): try: plugin_runner = pRunner(options) plugin_runner._run_plugin_list() + if options['process'] == 0: + in_file = plugin_runner.exp.meta_data['nxs_filename'] + citation_extractor.main(in_file=in_file, quiet=True) except Exception: # raise the error in the user log trace = traceback.format_exc() diff --git a/scripts/citation_extractor/citation_extractor.py b/scripts/citation_extractor/citation_extractor.py index ccd0f25e5..f3a2584b2 100644 --- a/scripts/citation_extractor/citation_extractor.py +++ b/scripts/citation_extractor/citation_extractor.py @@ -8,8 +8,8 @@ class NXcitation(object): def __init__(self, description, doi, endnote, bibtex): - self.description = description - self.doi = doi + self.description = description.decode('UTF-8') + self.doi = doi.decode('UTF-8') self.endnote = endnote.decode('UTF-8') self.bibtex = bibtex.decode('UTF-8') @@ -104,14 +104,23 @@ def __option_parser(doc=True): return parser if doc==True else parser.parse_args() -def main(): - args = __option_parser(doc=False) - infile = h5py.File(args.in_file, 'r') +def main(in_file=None, quiet=False): + # when calling directly from tomo_recon.py + if in_file: + out_file = os.path.join(os.path.dirname(in_file), 'citations.txt') + else: + args = __option_parser(doc=False) + in_file = args.in_file + out_file = args.out_file + + infile = h5py.File(in_file, 'r') citation_manager = NXciteVisitor().get_citation_manager(infile, '/') if citation_manager is not None: - with open(args.out_file, 'w') as outfile: + with open(out_file, 'w') as outfile: outfile.write(citation_manager.__str__()) - print("Extraction complete") + + if not quiet: + print("Extraction complete") if __name__ == '__main__': main() From 1d09edbdd11afcbc4bc020864dccb692e8b7e185 Mon Sep 17 00:00:00 2001 From: nicwade Date: Tue, 13 Jul 2021 09:25:08 +0100 Subject: [PATCH 08/10] Updates warning messages in docs --- .../tutorials/confluence/savu/savu_notes.rst | 21 +++---- .../confluence/savu/savu_tutorial.rst | 57 +++++++++---------- 2 files changed, 36 insertions(+), 42 deletions(-) diff --git a/doc/source/tutorials/confluence/savu/savu_notes.rst b/doc/source/tutorials/confluence/savu/savu_notes.rst index 15bf08fdd..50cd3ffb4 100644 --- a/doc/source/tutorials/confluence/savu/savu_notes.rst +++ b/doc/source/tutorials/confluence/savu/savu_notes.rst @@ -5,10 +5,7 @@ Savu - notes on basic use ----------------------------- -**Note**: The following tutorial for I13 users is out-of-date. There're more robust ring removal methods -(RemoveAllRings, RingRemovalSorting,...) than the selected methods below. There is no need to add Hdf5Saver -to save the output. - +**Note**: The following tutorial for I13 users is out-of-date. .. raw:: html @@ -82,7 +79,7 @@ to save the output.

Any savu_mpi jobs are run on the new compute cluster, named hamilton (after Margaret Hamilton), and can be monitored by executing:

Linux command
module load hamilton
     qstat
-

(note lower-case hamilton).

Suggested processes to include in a process list for tomography reconstruction

A typical Savu process list in DLS may contain all or most of the following processes in its linear chain of operations (ordered in a similar way to that indicated below):


Process positionProcess nameProcess categoryBrief description of processComment(s)Common alternative or more suitable process(es)*
1NxtomoLoaderloaderTo specify the location of raw dataset(s) to be used as input.
  1. Enables one to specify the location of dark- and flat-field datasets for use by any subsequent process that requires this information (e. g. DarkFlatFieldCorrection or Dezinger).
  2. Capable of handling the case of dark- and flat-field images being supplied in individual NeXus datasets.
  3. Expects its image-data input to be integer-valued.
  1. ImageLoader
  2. Hdf5TemplateLoader
  3. SavuNexusLoader
2DezingerfilterTo remove zingers from raw data.
  1. Current implementation of Dezinger expects its image-data input to be integer-valued.
  2. Outputs data in the floating-point format.
  1. DezingerSinogram
  2. DezingerSimple
3DarkFlatFieldCorrectioncorrectorTo apply the standard dark-and-flat-field normalisation to sample projections.
  1. Applies: (projection - dark) / (flat - dark), where dark and flat stand for the averaged dark- and flat-field images, respectively.
  2. Outputs data in the floating-point format.
  3. Needs to be explicitly included in every process list that seeks this correction (specifying the location of dark- and flat-field data in a loader, e. g. NxtomoLoader, is insufficient in this respect). 

4DistortionCorrectioncorrectorTo correct data for lens distortion.
  1. Requires information about the centre and coefficients of distortion, which need to be measured beforehand.
  2. Expects its image-data input to be in the floating-point format (generated, for example, by Dezinger or DarkFlatFieldCorrection).
  3. As this correction involves some intensity interpolation, it can result in some smoothing effects which can improve many undesirable artefacts, including ring artefacts.

5CcpiRingArtefactFilterfilterTo suppress ring artefacts.CcpiRingArtefactFilter is positioned before PaganinFilter as it tends to be efficient at suppressing ring artefacts found in typical datasets, but appears to be somewhat less successful on diffused images (which can occasionally be produced by PaganinFilter).
  1. RemoveAllRings
  2. RingRemovalWaveletfft
6VoCenteringfilterTo find an optimal value of CoR automatically.It may be prudent to test the outcome of VoCentering on a small, representative subset of data (use the preview parameter) before embarking on the reconstruction of the entire dataset, using the automatically-determined value of CoR.VoCenteringIterative
7PaganinFilterfilterTo retrieve the phase-contrast information.
  1. If the output images from PaganinFilter are reasonably free from the halo and shade-off artefacts, then it may be preferable to apply VoCentering immediately after this filter (rather than before it). 
  2. Since PaganinFilter is essentially a special low-pass filter, its application results in some smoothing effects which can improve many undesirable artefacts, including ring artefacts. In view of this, it may be preferable to apply this filter before applying any dedicated ring-suppression process(es).    
FresnelFilter
8RavenFilterfilterTo suppress ring artefacts.RavenFilter may complementarily be used after PaganinFilter as it can lead to an additional reduction of ring artefacts in somewhat diffused images that can occasionally be produced by PaganinFilter.RingRemovalWaveletfft
9AstraReconGpureconstructorTo reconstruct normalised and conditioned data.
  1. AstraReconCpu
  2. TomopyRecon
  3. TomobarRecon
10Hdf5saversaverTo save reconstruction(s) to output file(s).By default, Hdf5saver is the final process in every process list (hence there is normally no need to add it explicitly).TiffSaver

* Note that, when a process is replaced in a given process list by an alternative process, the latter may need to be included at a different position to that of the original process. For example, DezingerSinogram needs be included after DarkFlatFieldCorrection while Dezinger needs to be included before it.        


Examples

Example 1: Simple process list including VoCentering

Example 1: Process-list description (click to expand)...
Process positionProcess nameProcess parametersDesired outcomeShape of input image datasetShape of output image datasetComment(s)
1NxtomoLoader
  1. with non-default setting for the preview parameter;
  2. all other parameters at default settings
To load a particular 5-slice subset of the entire source dataset (found at the default location in the input NeXus scan file), representing 5 consecutive sinograms corresponding to tomography slices with indices from 1093 to 1097 (see 1.preview).(Z, img_L, img_W)(Z, 5, img_W)For example, (img_L, img_W) = (2160, 2560) for full-size images recorded by PCO Edge camera, hence the slice located at height 1093 lies approximately in the middle. These images contain 16-bit unsigned-integer data.
 2Dezingerat default settingsTo remove zingers from the 5-sinogram subset previously loaded in Process 1.(Z, 5, img_W)(Z, 5, img_W)
3DarkFlatFieldCorrectionat default settingsTo apply the standard dark-and-flat-field normalisation to each of the 5 sinograms loaded in Process 1 (using the dark- and flat-field data found at the default locations in the input NeXus scan file).(Z, 5, img_W)(Z, 5, img_W)
4CcpiRingArtefactFilter

at default settings

To suppress ring artefacts in each of the 5 sinograms loaded by Process 1.(Z, 5, img_W)(Z, 5, img_W)
5VoCentering

at default settings

  1. To find an optimal value of CoR for each of the first 3 sinograms from the 5-sinogram subset loaded in Process 1;
  2. To select a common optimal value of CoR from the above 3 (potentially different) values of CoR, with the view of applying it to reconstruct all, or any subset, of the 5-sinogram subset loaded in Process 1.
(Z, 5, img_W)n/aNote that the preview parameter of this VoCentering process selects the first 3 array slices (indexed 0, 1 and 2) in the 2-nd dimension (axis=1), which correspond to the middle 3 array slices (in the same dimension) with indices 1093, 1094, 1095 in the entire source dataset.
6AstraReconGpuat default settingsTo reconstruct the 5 sinograms loaded in Process 1 with the common optimal value of CoR determined by Process 5 (part 2).(Z, 5, img_W)(img_W, 5, img_W)Note that this AstraReconGpu will automatically receive the value of CoR determined by the VoCentering in Process 5, so it is harmless to leave the centre_of_rotation parameter of this AstraReconGpu at its default value of 0.0.
7Hdf5saverat default settingsTo save the 5 reconstructed tomography slices as a single 3d dataset in the output HDF5 file.(img_W, 5, img_W)(img_W, 5, img_W)This process is implicit.
+

(note lower-case hamilton).

Suggested processes to include in a process list for tomography reconstruction

A typical Savu process list in DLS may contain all or most of the following processes in its linear chain of operations (ordered in a similar way to that indicated below):


Process positionProcess nameProcess categoryBrief description of processComment(s)Common alternative or more suitable process(es)*
1NxtomoLoaderloaderTo specify the location of raw dataset(s) to be used as input.
  1. Enables one to specify the location of dark- and flat-field datasets for use by any subsequent process that requires this information (e. g. DarkFlatFieldCorrection or Dezinger).
  2. Capable of handling the case of dark- and flat-field images being supplied in individual NeXus datasets.
  3. Expects its image-data input to be integer-valued.
  1. ImageLoader
  2. Hdf5TemplateLoader
  3. SavuNexusLoader
2DezingerfilterTo remove zingers from raw data.
  1. Current implementation of Dezinger expects its image-data input to be integer-valued.
  2. Outputs data in the floating-point format.
  1. DezingerSinogram
  2. DezingerSimple
3DarkFlatFieldCorrectioncorrectorTo apply the standard dark-and-flat-field normalisation to sample projections.
  1. Applies: (projection - dark) / (flat - dark), where dark and flat stand for the averaged dark- and flat-field images, respectively.
  2. Outputs data in the floating-point format.
  3. Needs to be explicitly included in every process list that seeks this correction (specifying the location of dark- and flat-field data in a loader, e. g. NxtomoLoader, is insufficient in this respect).

4DistortionCorrectioncorrectorTo correct data for lens distortion.
  1. Requires information about the centre and coefficients of distortion, which need to be measured beforehand.
  2. Expects its image-data input to be in the floating-point format (generated, for example, by Dezinger or DarkFlatFieldCorrection).
  3. As this correction involves some intensity interpolation, it can result in some smoothing effects which can improve many undesirable artefacts, including ring artefacts.

5CcpiRingArtefactFilterfilterTo suppress ring artefacts.CcpiRingArtefactFilter is positioned before PaganinFilter as it tends to be efficient at suppressing ring artefacts found in typical datasets, but appears to be somewhat less successful on diffused images (which can occasionally be produced by PaganinFilter).
  1. RemoveAllRings
  2. RingRemovalWaveletfft
6VoCenteringfilterTo find an optimal value of CoR automatically.It may be prudent to test the outcome of VoCentering on a small, representative subset of data (use the preview parameter) before embarking on the reconstruction of the entire dataset, using the automatically-determined value of CoR.VoCenteringIterative
7PaganinFilterfilterTo retrieve the phase-contrast information.
  1. If the output images from PaganinFilter are reasonably free from the halo and shade-off artefacts, then it may be preferable to apply VoCentering immediately after this filter (rather than before it).
  2. Since PaganinFilter is essentially a special low-pass filter, its application results in some smoothing effects which can improve many undesirable artefacts, including ring artefacts. In view of this, it may be preferable to apply this filter before applying any dedicated ring-suppression process(es).
FresnelFilter
8RavenFilterfilterTo suppress ring artefacts.RavenFilter may complementarily be used after PaganinFilter as it can lead to an additional reduction of ring artefacts in somewhat diffused images that can occasionally be produced by PaganinFilter.RingRemovalWaveletfft
9AstraReconGpureconstructorTo reconstruct normalised and conditioned data.
  1. AstraReconCpu
  2. TomopyRecon
  3. TomobarRecon
10Hdf5saversaverTo save reconstruction(s) to output file(s).By default, Hdf5saver is the final process in every process list (hence there is normally no need to add it explicitly).TiffSaver

* Note that, when a process is replaced in a given process list by an alternative process, the latter may need to be included at a different position to that of the original process. For example, DezingerSinogram needs be included after DarkFlatFieldCorrection while Dezinger needs to be included before it.


Examples

Example 1: Simple process list including VoCentering

Example 1: Process-list description (click to expand)...
Process positionProcess nameProcess parametersDesired outcomeShape of input image datasetShape of output image datasetComment(s)
1NxtomoLoader
  1. with non-default setting for the preview parameter;
  2. all other parameters at default settings
To load a particular 5-slice subset of the entire source dataset (found at the default location in the input NeXus scan file), representing 5 consecutive sinograms corresponding to tomography slices with indices from 1093 to 1097 (see 1.preview).(Z, img_L, img_W)(Z, 5, img_W)For example, (img_L, img_W) = (2160, 2560) for full-size images recorded by PCO Edge camera, hence the slice located at height 1093 lies approximately in the middle. These images contain 16-bit unsigned-integer data.
2Dezingerat default settingsTo remove zingers from the 5-sinogram subset previously loaded in Process 1.(Z, 5, img_W)(Z, 5, img_W)
3DarkFlatFieldCorrectionat default settingsTo apply the standard dark-and-flat-field normalisation to each of the 5 sinograms loaded in Process 1 (using the dark- and flat-field data found at the default locations in the input NeXus scan file).(Z, 5, img_W)(Z, 5, img_W)
4CcpiRingArtefactFilter

at default settings

To suppress ring artefacts in each of the 5 sinograms loaded by Process 1.(Z, 5, img_W)(Z, 5, img_W)
5VoCentering

at default settings

  1. To find an optimal value of CoR for each of the first 3 sinograms from the 5-sinogram subset loaded in Process 1;
  2. To select a common optimal value of CoR from the above 3 (potentially different) values of CoR, with the view of applying it to reconstruct all, or any subset, of the 5-sinogram subset loaded in Process 1.
(Z, 5, img_W)n/aNote that the preview parameter of this VoCentering process selects the first 3 array slices (indexed 0, 1 and 2) in the 2-nd dimension (axis=1), which correspond to the middle 3 array slices (in the same dimension) with indices 1093, 1094, 1095 in the entire source dataset.
6AstraReconGpuat default settingsTo reconstruct the 5 sinograms loaded in Process 1 with the common optimal value of CoR determined by Process 5 (part 2).(Z, 5, img_W)(img_W, 5, img_W)Note that this AstraReconGpu will automatically receive the value of CoR determined by the VoCentering in Process 5, so it is harmless to leave the centre_of_rotation parameter of this AstraReconGpu at its default value of 0.0.
7Hdf5saverat default settingsTo save the 5 reconstructed tomography slices as a single 3d dataset in the output HDF5 file.(img_W, 5, img_W)(img_W, 5, img_W)This process is implicit.
@@ -162,7 +159,7 @@ Example 1: Process list in Savu Configurator .. raw:: html
-


Where to look for the optimal value of CoR determined by VoCentering?

  • To find out which pixel coordinate was actually selected by VoCentering for setting the centre_of_rotation parameter of a subsequent reconstruction process, inspect a dataset located at /entry/final_result_tomo/meta_data/centre_of_rotation/centre_of_rotation in the primary output file, named <scan-number>_processed.nxs. Alternatively, see a dataset located at /<position-in-process-list>-VoCentering-cor_broadcast/data in the intermediate output file named cor_broadcast_p<position-in-process-list>_vo_centering.h5.
  • Incidentally, a dataset located at /entry/final_result_tomo/meta_data/cor_preview/cor_preview in the primary output file contains all (not-necessarily identical) values of CoR determined by VoCentering individually for each sinogram specified by the preview parameter of this process. Alternatively, a dataset located at /<position-in-process-list>-VoCentering-cor_preview/data in the intermediate output file cor_preview_p<position-in-process-list>_vo_centering.h5 contains the same information.



Example 2: More advanced process list including VoCentering

Example 2: Process-list description (click to expand)...


Process positionProcess nameProcess parametersDesired outcomeShape of input image datasetShape of output image datasetComment(s)
1NxtomoLoader
  1. with non-default setting for the preview parameter;
  2. all other parameters at default settings

To load a particular 5-slice subset of the entire source dataset (found at the default location in the input NeXus scan file), representing 5 consecutive sinograms corresponding to tomography slices with indices from 1093 to 1097 (see 1.preview).

(Z, img_L, img_W)(Z, 5, img_W)For example, (img_L, img_W) = (2160, 2560) for full-size images recorded by PCO Edge camera, hence the slice located at height 1093 lies approximately in the middle. These images contain 16-bit unsigned-integer data.
2Dezingerat default settingsTo remove zingers from the 5-sinogram subset previously loaded in Process 1.(Z, 5, img_W)(Z, 5, img_W)
3DarkFlatFieldCorrectionat default settingsTo apply the standard dark-and-flat-field normalisation to each of the 5 sinograms loaded in Process 1 (using the dark- and flat-field data found at the default locations in the input NeXus scan file).(Z, 5, img_W)(Z, 5, img_W)
4CcpiRingArtefactFilter
  1. with parameter tuning being applied on the param_r parameter;
  2. all other parameters at default settings
To suppress ring artefacts in each of the 5 sinograms loaded in Process 1, using the following 7 tuning values for param_r: 0.5, 0.05, 0.005 (default), 0.0005, 0.0001, 0.01, and 0.001.from the 5-sinogram subset loaded in Process 1;(Z, 5, img_W)(Z, 5, img_W, 7)Note that the parameter tuning performed on the param_r of this CcpiRingArtefactFilter adds an extra (4-th) dimension to the original image dataset.
5VoCentering
  1. with non-default setting for the preview parameter;
  2. all other parameters at default settings
  1. To find an optimal value of CoR for each of the first 3 sinograms (of the 5-sinogram subset loaded in Process 1) that were subsequently processed by Process 4 using the 2nd (index 1) value of param_r, i. e. param_r = 0.05 (see 5.preview);
  2. To select a common optimal value of CoR from the above 3 (potentially different) values of CoR, with the view of applying it to reconstruct all, or any subset, of the 35 (=5*7) parameter–tuned sinograms that are currently available for reconstruction in the pipeline.
(Z, 5, img_W, 1)n/aNote that the preview parameter of this VoCentering process selects the first 3 array slices (indexed 0, 1 and 2) in the 2-nd dimension (axis=1), which correspond to the middle 3 array slices (in the same dimension) with indices 1093, 1094, 1095 in the entire source dataset.
6AstraReconGpuat default settingsTo reconstruct all the 35 (=5*7) parameter–tuned sinograms with the common optimal value of CoR determined by Process 5 (part 2).(Z, 5, img_W, 7)(img_W, 5, img_W, 7)Note that this AstraReconGpu will automatically receive the value of CoR determined by the VoCentering in Process 5, so it is harmless to leave the centre_of_rotation parameter of this AstraReconGpu at its default value of 0.0.
7Hdf5saverat default settingsTo save all the 35 (=5*7) reconstructed tomography slices as a single 4d dataset in the output HDF5 file.(img_W, 5, img_W, 7)(img_W, 5, img_W, 7)This process is implicit.
+


Where to look for the optimal value of CoR determined by VoCentering?

  • To find out which pixel coordinate was actually selected by VoCentering for setting the centre_of_rotation parameter of a subsequent reconstruction process, inspect a dataset located at /entry/final_result_tomo/meta_data/centre_of_rotation/centre_of_rotation in the primary output file, named <scan-number>_processed.nxs. Alternatively, see a dataset located at /<position-in-process-list>-VoCentering-cor_broadcast/data in the intermediate output file named cor_broadcast_p<position-in-process-list>_vo_centering.h5.
  • Incidentally, a dataset located at /entry/final_result_tomo/meta_data/cor_preview/cor_preview in the primary output file contains all (not-necessarily identical) values of CoR determined by VoCentering individually for each sinogram specified by the preview parameter of this process. Alternatively, a dataset located at /<position-in-process-list>-VoCentering-cor_preview/data in the intermediate output file cor_preview_p<position-in-process-list>_vo_centering.h5 contains the same information.



Example 2: More advanced process list including VoCentering

Example 2: Process-list description (click to expand)...


Process positionProcess nameProcess parametersDesired outcomeShape of input image datasetShape of output image datasetComment(s)
1NxtomoLoader
  1. with non-default setting for the preview parameter;
  2. all other parameters at default settings

To load a particular 5-slice subset of the entire source dataset (found at the default location in the input NeXus scan file), representing 5 consecutive sinograms corresponding to tomography slices with indices from 1093 to 1097 (see 1.preview).

(Z, img_L, img_W)(Z, 5, img_W)For example, (img_L, img_W) = (2160, 2560) for full-size images recorded by PCO Edge camera, hence the slice located at height 1093 lies approximately in the middle. These images contain 16-bit unsigned-integer data.
2Dezingerat default settingsTo remove zingers from the 5-sinogram subset previously loaded in Process 1.(Z, 5, img_W)(Z, 5, img_W)
3DarkFlatFieldCorrectionat default settingsTo apply the standard dark-and-flat-field normalisation to each of the 5 sinograms loaded in Process 1 (using the dark- and flat-field data found at the default locations in the input NeXus scan file).(Z, 5, img_W)(Z, 5, img_W)
4CcpiRingArtefactFilter
  1. with parameter tuning being applied on the param_r parameter;
  2. all other parameters at default settings
To suppress ring artefacts in each of the 5 sinograms loaded in Process 1, using the following 7 tuning values for param_r: 0.5, 0.05, 0.005 (default), 0.0005, 0.0001, 0.01, and 0.001.from the 5-sinogram subset loaded in Process 1;(Z, 5, img_W)(Z, 5, img_W, 7)Note that the parameter tuning performed on the param_r of this CcpiRingArtefactFilter adds an extra (4-th) dimension to the original image dataset.
5VoCentering
  1. with non-default setting for the preview parameter;
  2. all other parameters at default settings
  1. To find an optimal value of CoR for each of the first 3 sinograms (of the 5-sinogram subset loaded in Process 1) that were subsequently processed by Process 4 using the 2nd (index 1) value of param_r, i. e. param_r = 0.05 (see 5.preview);
  2. To select a common optimal value of CoR from the above 3 (potentially different) values of CoR, with the view of applying it to reconstruct all, or any subset, of the 35 (=5*7) parameter–tuned sinograms that are currently available for reconstruction in the pipeline.
(Z, 5, img_W, 1)n/aNote that the preview parameter of this VoCentering process selects the first 3 array slices (indexed 0, 1 and 2) in the 2-nd dimension (axis=1), which correspond to the middle 3 array slices (in the same dimension) with indices 1093, 1094, 1095 in the entire source dataset.
6AstraReconGpuat default settingsTo reconstruct all the 35 (=5*7) parameter–tuned sinograms with the common optimal value of CoR determined by Process 5 (part 2).(Z, 5, img_W, 7)(img_W, 5, img_W, 7)Note that this AstraReconGpu will automatically receive the value of CoR determined by the VoCentering in Process 5, so it is harmless to leave the centre_of_rotation parameter of this AstraReconGpu at its default value of 0.0.
7Hdf5saverat default settingsTo save all the 35 (=5*7) reconstructed tomography slices as a single 4d dataset in the output HDF5 file.(img_W, 5, img_W, 7)(img_W, 5, img_W, 7)This process is implicit.
@@ -480,7 +477,7 @@ Example 6: Process list in Savu Configurator .. raw:: html
-



Example 7: Process list for reconstructing a series of identical tomography scans (stored sequentially in a single 3d dataset)


An example process list for reconstructing middle 500 slices (c.f. mid-250:mid+250 in [:, mid-250:mid+250, :, 1] of 1.preview) of the first two scans (c.f. 1 in [:, mid-250:mid+250, :, 1] in 1.preview) in a series of N ≥ 2 tomography scans, each containing 901 images (c.f. 901 in 1.3d_to_4d), with VoCentering being used on every 25-th slice (c.f. 0:end:25 in [:, 0:end:25, :, 0] in 3.preview) of the first scan only (c.f. the rightmost 0 in [:, 0:end:25, :, 0] in 3.preview):

+



Example 7: Process list for reconstructing a series of identical tomography scans (stored sequentially in a single 3d dataset)


An example process list for reconstructing middle 500 slices (c.f. mid-250:mid+250 in [:, mid-250:mid+250, :, 1] of 1.preview) of the first two scans (c.f. 1 in [:, mid-250:mid+250, :, 1] in 1.preview) in a series of N ≥ 2 tomography scans, each containing 901 images (c.f. 901 in 1.3d_to_4d), with VoCentering being used on every 25-th slice (c.f. 0:end:25 in [:, 0:end:25, :, 0] in 3.preview) of the first scan only (c.f. the rightmost 0 in [:, 0:end:25, :, 0] in 3.preview):

@@ -687,7 +684,7 @@ Example 6: Process list in Savu Configurator .. raw:: html
-




Appendices


Appendix A: Interoperability of the parameter-tuning and previewing operations

Since each instance of parameter tuning in Savu adds an extra dimension to the input dataset, it is often desirable to use the previewing (subset-selection) mechanism to reduce the workload of any subsequent resource-demanding processes, e. g. VoCentering or AstraReconGpu. This can be accomplished by setting the preview parameter of VoCentering or, respectively, that of AstraReconGpu to a desirable rank-3 slice of the incoming higher-order dataset, generated by one or more parameter-tuning operations invoked by the preceding processes (see, e.g., Example 2).     


Appendix B: Brief reference guide to specifying values for the parameter-tuning operations

Note that not every parameter in Savu is tunable. For any tunable parameter, one can input its tuning values using the methods described below:   

TaskSyntaxComment(s)Example(s)
To input an ordered list of n individual values.val_1; val_2;... val_n
  1. Input values need to be semi-colon separated.
  2. Note the absence of the trailing semi-colon.
  3. Input values can be non-numeric.

mod 6.7 1000.8;1010.8;1020.8;1030.8;1040.8

mod 6.centre_of_rotation 1000.8;1010.8;1020.8;1030.8;1040.8

mod 6.4 FBP_CUDA;CGLS_CUDA

mod 6.algorithm FBP_CUDA;CGLS_CUDA

To input an arithmetic sequence of all numbers starting from val_from and not exceeding val_to, calculated using the common difference of cmn_diff.

val_from:val_to:cmn_diff;

  1. The three defining numeric arguments need to be colon separated.
  2. Note the presence of the trailing semi-colon.
  3. The val_to limit will not be included in the output values unless it is one of the elements in the specified arithmetic sequence.
  4. It is sometimes useful to expand this Savu expression in Unix shell using the sequence-of-numbers (seq) command (note a different syntax), followed by the number-lines (nl) command, e.g.

    Linux command: seq <FIRST> <INCREMENT> <LAST>
    +




Appendices


Appendix A: Interoperability of the parameter-tuning and previewing operations

Since each instance of parameter tuning in Savu adds an extra dimension to the input dataset, it is often desirable to use the previewing (subset-selection) mechanism to reduce the workload of any subsequent resource-demanding processes, e. g. VoCentering or AstraReconGpu. This can be accomplished by setting the preview parameter of VoCentering or, respectively, that of AstraReconGpu to a desirable rank-3 slice of the incoming higher-order dataset, generated by one or more parameter-tuning operations invoked by the preceding processes (see, e.g., Example 2).


Appendix B: Brief reference guide to specifying values for the parameter-tuning operations

Note that not every parameter in Savu is tunable. For any tunable parameter, one can input its tuning values using the methods described below:

TaskSyntaxComment(s)Example(s)
To input an ordered list of n individual values.val_1; val_2;... val_n
  1. Input values need to be semi-colon separated.
  2. Note the absence of the trailing semi-colon.
  3. Input values can be non-numeric.

mod 6.7 1000.8;1010.8;1020.8;1030.8;1040.8

mod 6.centre_of_rotation 1000.8;1010.8;1020.8;1030.8;1040.8

mod 6.4 FBP_CUDA;CGLS_CUDA

mod 6.algorithm FBP_CUDA;CGLS_CUDA

To input an arithmetic sequence of all numbers starting from val_from and not exceeding val_to, calculated using the common difference of cmn_diff.

val_from:val_to:cmn_diff;

  1. The three defining numeric arguments need to be colon separated.
  2. Note the presence of the trailing semi-colon.
  3. The val_to limit will not be included in the output values unless it is one of the elements in the specified arithmetic sequence.
  4. It is sometimes useful to expand this Savu expression in Unix shell using the sequence-of-numbers (seq) command (note a different syntax), followed by the number-lines (nl) command, e.g.

    Linux command: seq <FIRST> <INCREMENT> <LAST>
    ~>seq 1000.8 10.0 1040.8 | nl
              1    1000.8
              2    1010.8
    @@ -705,10 +702,10 @@ Example 6: Process list in Savu Configurator
         
    1-based seq(n) = FIRST_VAL + (n-1) * INCREMENT

    or

    n = 0, 1, 2,...
    0-based seq(n) = FIRST_VAL + n * INCREMENT
    -

mod 6.7 1000.8:1040.8:10.0;

mod 6.centre_of_rotation 1000.8:1040.8:10.0;

mod 6.centre_of_rotation 1020.8-2*10.0:1020.8+2*10.0:10.0;



Appendix C: Batch processing

Batch processing in Savu can be done with the help of the savu-batch command, whose arguments are ordered in a logically identical way to that employed by the savu_mpi command, the only difference being the first argument, which is used to supply a path to a user-prepared batch file:

+

mod 6.7 1000.8:1040.8:10.0;

mod 6.centre_of_rotation 1000.8:1040.8:10.0;

mod 6.centre_of_rotation 1020.8-2*10.0:1020.8+2*10.0:10.0;



Appendix C: Batch processing

Batch processing in Savu can be done with the help of the savu-batch command, whose arguments are ordered in a logically identical way to that employed by the savu_mpi command, the only difference being the first argument, which is used to supply a path to a user-prepared batch file:

savu_mpi                      <SCAN_DATA_FILE> <SAVU_PROCESS_LIST_FILE> <OUT_DIR>
     savu-batch <BATCH_PARAM_FILE> <SCAN_DATA_DIR>  <SAVU_PROCESS_LIST_DIR>  <OUT_DIR> 
-


To make the savu-batch command available in Linux terminal, execute 'module load python/ana' and 'module load tomography': 

+


To make the savu-batch command available in Linux terminal, execute 'module load python/ana' and 'module load tomography':

Linux Command: Savu-batch @@ -750,7 +747,7 @@ batch.csv .. raw:: html -


Notes:

  1. savu-batch reconstructs scans using the savu_mpi command (on the cluster).
  2. savu-batch reconstructs scans sequentially one-by-one, monitoring and waiting (for the duration of <TIMEOUT_MINUTES>) for each reconstruction job to complete (on the cluster) before launching the next one.
  3. savu-batch reconstructs scans in the same order as that specified in <BATCH_PARAM_FILE>.
  4. savu-batch makes its own, internal copies of all input process-list files, specified in <BATCH_PARAM_FILE>, at the time of executing the savu-batch command, and then, if required, each of these copies is appropriately edited just before the savu_mpi command is executed on each of them.      
  5. The values of CoR specified in <BATCH_PARAM_FILE> are used as they are to set the centre_of_rotation parameter of any (active) reconstructor process found in the corresponding Savu process-list file (hence the user is responsible for making any adjustments needed to account for any additional cropping requested by, for example, the crop_edges parameter of DistortionCorrection, etc.). 
  6. If no value of CoR is specified for some item in <BATCH_PARAM_FILE>, then the value of the centre_of_rotation parameter found (at the time of launching savu-batch) in the corresponding Savu process-list file is used.
  7. savu-batch is able to handle process lists that don't include any processes requiring CoR (in which case an empty space, or any numerical value, can be provided as nothing depends on it).


Example:

+


Notes:

  1. savu-batch reconstructs scans using the savu_mpi command (on the cluster).
  2. savu-batch reconstructs scans sequentially one-by-one, monitoring and waiting (for the duration of <TIMEOUT_MINUTES>) for each reconstruction job to complete (on the cluster) before launching the next one.
  3. savu-batch reconstructs scans in the same order as that specified in <BATCH_PARAM_FILE>.
  4. savu-batch makes its own, internal copies of all input process-list files, specified in <BATCH_PARAM_FILE>, at the time of executing the savu-batch command, and then, if required, each of these copies is appropriately edited just before the savu_mpi command is executed on each of them.
  5. The values of CoR specified in <BATCH_PARAM_FILE> are used as they are to set the centre_of_rotation parameter of any (active) reconstructor process found in the corresponding Savu process-list file (hence the user is responsible for making any adjustments needed to account for any additional cropping requested by, for example, the crop_edges parameter of DistortionCorrection, etc.).
  6. If no value of CoR is specified for some item in <BATCH_PARAM_FILE>, then the value of the centre_of_rotation parameter found (at the time of launching savu-batch) in the corresponding Savu process-list file is used.
  7. savu-batch is able to handle process lists that don't include any processes requiring CoR (in which case an empty space, or any numerical value, can be provided as nothing depends on it).


Example:

@@ -761,7 +758,7 @@ Linux command: savu-batch .. raw:: html -


In the above savu-batch example, the arguments are as follows:

ArgumentArgument ValueComment(s)
<BATCH_PARAM_FILE>
/dls/i13/data/2018/mt12345-6/processing/process_lists/batch/batch.csv

<SCAN_DATA_DIR>
/dls/i13/data/2018/mt12345-6/raw
Contains all Nexus scan files specified in <BATCH_PARAM_FILE>, e.g. /dls/i13/data/2018/mt12345-6/raw/102923.nxs, etc.
<SAVU_PROCESS_LIST_DIR>
/dls/i13/data/2018/mt12345-6/processing/process_lists
  1. Contains all Savu process-list files specified in <BATCH_PARAM_FILE>, e.g. /dls/i13/data/2018/mt12345-6/processing/process_lists/4x/spl_f102921_d102922.nxs, etc.
  2. If <BATCH_PARAM_FILE> contains an absolute path to some Savu process-list file (as opposed to a path specified relative to <SAVU_PROCESS_LIST_DIR>), then this absolute path is always respected (i.e. <SAVU_PROCESS_LIST_DIR> is overridden).

<OUT_DIR>
/dls/i13/data/2018/mt12345-6/processing/reconstruction
  1. Any intermediate output sub-directories are automatically created if they don't already exist on the file system (provided the user has sufficient file-access permisions).
  2. For example, reconstruction of scan 102923, specified in line 2 of <BATCH_PARAM_FILE>, will be saved by Savu in /dls/i13/data/2018/mt12345-6/processing/reconstruction/4x/102923/<YYYYMMDDhhmmss>_102923/, i.e. the 4x/%s output directory, specified in the same line of <BATCH_PARAM_FILE>, is expanded to 4x/102923/, whereas the last (innermost) sub-directory, <YYYYMMDDhhmmss>_102923/, is automatically generated by Savu itself.
  3. If <BATCH_PARAM_FILE> contains an absolute path to some output directory (as opposed to a path specified relative to <OUT_DIR>), then this absolute path is always respected (i.e. <OUT_DIR> is overridden).  
<INTERMED_DIR>
/dls/i13/data/2018/mt12345-6/tmp


Additional notes:

  1. When preparing batch files, please use a Linux text editor as files created under Windows are not compatible.
  2. If you intend to run multiple batches, please wait for each individual batch to finish before submitting another one. 
  3. When supplying an e-mail address, please bear in kind that some mail boxes may automatically block machine-generated e-mail notifications.





+


In the above savu-batch example, the arguments are as follows:

ArgumentArgument ValueComment(s)
<BATCH_PARAM_FILE>
/dls/i13/data/2018/mt12345-6/processing/process_lists/batch/batch.csv

<SCAN_DATA_DIR>
/dls/i13/data/2018/mt12345-6/raw
Contains all Nexus scan files specified in <BATCH_PARAM_FILE>, e.g. /dls/i13/data/2018/mt12345-6/raw/102923.nxs, etc.
<SAVU_PROCESS_LIST_DIR>
/dls/i13/data/2018/mt12345-6/processing/process_lists
  1. Contains all Savu process-list files specified in <BATCH_PARAM_FILE>, e.g. /dls/i13/data/2018/mt12345-6/processing/process_lists/4x/spl_f102921_d102922.nxs, etc.
  2. If <BATCH_PARAM_FILE> contains an absolute path to some Savu process-list file (as opposed to a path specified relative to <SAVU_PROCESS_LIST_DIR>), then this absolute path is always respected (i.e. <SAVU_PROCESS_LIST_DIR> is overridden).

<OUT_DIR>
/dls/i13/data/2018/mt12345-6/processing/reconstruction
  1. Any intermediate output sub-directories are automatically created if they don't already exist on the file system (provided the user has sufficient file-access permisions).
  2. For example, reconstruction of scan 102923, specified in line 2 of <BATCH_PARAM_FILE>, will be saved by Savu in /dls/i13/data/2018/mt12345-6/processing/reconstruction/4x/102923/<YYYYMMDDhhmmss>_102923/, i.e. the 4x/%s output directory, specified in the same line of <BATCH_PARAM_FILE>, is expanded to 4x/102923/, whereas the last (innermost) sub-directory, <YYYYMMDDhhmmss>_102923/, is automatically generated by Savu itself.
  3. If <BATCH_PARAM_FILE> contains an absolute path to some output directory (as opposed to a path specified relative to <OUT_DIR>), then this absolute path is always respected (i.e. <OUT_DIR> is overridden).
<INTERMED_DIR>
/dls/i13/data/2018/mt12345-6/tmp


Additional notes:

  1. When preparing batch files, please use a Linux text editor as files created under Windows are not compatible.
  2. If you intend to run multiple batches, please wait for each individual batch to finish before submitting another one.
  3. When supplying an e-mail address, please bear in kind that some mail boxes may automatically block machine-generated e-mail notifications.





diff --git a/doc/source/tutorials/confluence/savu/savu_tutorial.rst b/doc/source/tutorials/confluence/savu/savu_tutorial.rst index 7269ef606..ce6af4964 100644 --- a/doc/source/tutorials/confluence/savu/savu_tutorial.rst +++ b/doc/source/tutorials/confluence/savu/savu_tutorial.rst @@ -5,10 +5,7 @@ Savu - tutorial on basic use ----------------------------- -**Note**: The following tutorial for I13 users is out-of-date. There're more robust ring removal methods -(RemoveAllRings, RingRemovalSorting,...) than the selected methods below. There is no need to add Hdf5Saver -to save the output. - +**Note**: The following tutorial for I13 users is out-of-date. .. raw:: html @@ -83,7 +80,7 @@ to save the output. -


This tutorial applies to Savu version 1.2 (the current default version is 2.1). 

If you require Savu version 1.2, please execute: 'module add savu/1.2' (instead of 'module add savu').


How to replicate in Savu the functionality of the tomo-centre & tomo-recon commands?


This page describes the basic use of Savu Tomography Reconstruction Pipeline for reconstructing image data in the HDF5 format. More precisely, it aims at providing some details on how to use Savu to deliver a functionality similar to that provided by the tomo-centre & the tomo-recon commands (c.f. Reconstruction from image data in the HDF format: the tomo-centre and tomo-recon commands). In particular, a brief discussion of the following typical tomography-reconstruction tasks is presented below:

  • applying dark- and flat-field correction
  • finding optimal centre of rotation (CoR)
  • suppressing ring artefacts
  • reconstructing a subset of slices or the entire dataset    

For more information about Savu Pipeline and its diverse capabilities, please peruse Savu


The conversion between the tomo-centre & the tomo-recon commands and Savu Pipeline is relatively straightforward:

Itemtomo-centre & tomo-reconSavuComment(s)
1module add tomographymodule add savuLinux command for loading an appropriate module.
2tomo-centre or tomo-reconsavu_mpiLinux command for executing an appropriate code on the compute cluster.
3<nexus_file><nexus_file>Path to input Nexus scan file containing tomography dataset.
4[options]Savu process-list fileOptional arguments for executing commands in item 2.
5<output_directory><output_directory>Path to output directory.


Similarly to the tomo-centre & tomo-recon commands, tomography reconstruction in Savu requires 3 objects: 2 input objects and 1 output object:


Object typeObject descriptionComment(s)
INPUTtomography-data fileThis object is provided by a path to Nexus scan file.
INPUT

Savu process-list (or process-configuration) file

(also known as plug-in list file)

This object is provided by a path to a special Nexus file containing a list of Savu processes (also known as plug-ins) that the user intends to apply to tomography dataset in the specified order.

The user can build this file from scratch or modify an existing template file to suit particular reconstruction needs.




OUTPUToutput directoryThis object is provided by a path to a directory in which Savu can create a special Nexus output file with reconstructed slices being stored as a 3d (or possibly higher-rank) dataset.


Savu process list is an ordered list of data-manipulation processes selected from Savu's repertoire of plug-ins to form a chain of sequential steps. Every process list in Savu requires a loader process as the initial processing step, a saver process as the final processing step, and any combination of intermediate correction, filter or reconstruction processes chained to each other and, of course, to the loader and the saver:


+


This tutorial applies to Savu version 1.2 (the current default version is 2.1).

If you require Savu version 1.2, please execute: 'module add savu/1.2' (instead of 'module add savu').


How to replicate in Savu the functionality of the tomo-centre & tomo-recon commands?


This page describes the basic use of Savu Tomography Reconstruction Pipeline for reconstructing image data in the HDF5 format. More precisely, it aims at providing some details on how to use Savu to deliver a functionality similar to that provided by the tomo-centre & the tomo-recon commands (c.f. Reconstruction from image data in the HDF format: the tomo-centre and tomo-recon commands). In particular, a brief discussion of the following typical tomography-reconstruction tasks is presented below:

  • applying dark- and flat-field correction
  • finding optimal centre of rotation (CoR)
  • suppressing ring artefacts
  • reconstructing a subset of slices or the entire dataset

For more information about Savu Pipeline and its diverse capabilities, please peruse Savu.


The conversion between the tomo-centre & the tomo-recon commands and Savu Pipeline is relatively straightforward:

Itemtomo-centre & tomo-reconSavuComment(s)
1module add tomographymodule add savuLinux command for loading an appropriate module.
2tomo-centre or tomo-reconsavu_mpiLinux command for executing an appropriate code on the compute cluster.
3<nexus_file><nexus_file>Path to input Nexus scan file containing tomography dataset.
4[options]Savu process-list fileOptional arguments for executing commands in item 2.
5<output_directory><output_directory>Path to output directory.


Similarly to the tomo-centre & tomo-recon commands, tomography reconstruction in Savu requires 3 objects: 2 input objects and 1 output object:


Object typeObject descriptionComment(s)
INPUTtomography-data fileThis object is provided by a path to Nexus scan file.
INPUT

Savu process-list (or process-configuration) file

(also known as plug-in list file)

This object is provided by a path to a special Nexus file containing a list of Savu processes (also known as plug-ins) that the user intends to apply to tomography dataset in the specified order.

The user can build this file from scratch or modify an existing template file to suit particular reconstruction needs.




OUTPUToutput directoryThis object is provided by a path to a directory in which Savu can create a special Nexus output file with reconstructed slices being stored as a 3d (or possibly higher-rank) dataset.


Savu process list is an ordered list of data-manipulation processes selected from Savu's repertoire of plug-ins to form a chain of sequential steps. Every process list in Savu requires a loader process as the initial processing step, a saver process as the final processing step, and any combination of intermediate correction, filter or reconstruction processes chained to each other and, of course, to the loader and the saver:


@@ -118,7 +115,7 @@ to save the output. >>> -

The >>> prompt indicates that the above Linux session is in the Savu Configurator mode. If desired, use the help command to view a brief description of Savu Configurator's commands:  

+

The >>> prompt indicates that the above Linux session is in the Savu Configurator mode. If desired, use the help command to view a brief description of Savu Configurator's commands:

Savu Configurator command: help @@ -162,7 +159,7 @@ to save the output. history : None >>>
-


To build a basic process list for tomography reconstruction in Savu, follow the steps described below:


Add Process 1: LOADER


Use the add command to include NxtomoLoader in the currently active, empty Savu process list as the initial, 1st process in the list:

Savu Configurator command: add NxtomoLoader
+


To build a basic process list for tomography reconstruction in Savu, follow the steps described below:


Add Process 1: LOADER


Use the add command to include NxtomoLoader in the currently active, empty Savu process list as the initial, 1st process in the list:

Savu Configurator command: add NxtomoLoader
>>> add NxtomoLoader
 
       1) NxtomoLoader
@@ -185,7 +182,7 @@ to save the output.
         <process-parameter index>) <parameter name> : <parameter value>
         ...
         <process-parameter index>) <parameter name> : <parameter value>]
-

The above <process index> and <process-parameter index> are used for referring to, and manipulating, processes in the currently active process list in Savu Configurator.


Add Process 2: DARK-FLAT-FIELD CORRECTION


Use the add command to include DarkFlatFieldCorrection in the currently active Savu process list as the next (i.e. 2nd) process in the list:

Savu Configurator command: add DarkFlatFieldCorrection
+

The above <process index> and <process-parameter index> are used for referring to, and manipulating, processes in the currently active process list in Savu Configurator.


Add Process 2: DARK-FLAT-FIELD CORRECTION


Use the add command to include DarkFlatFieldCorrection in the currently active Savu process list as the next (i.e. 2nd) process in the list:

Savu Configurator command: add DarkFlatFieldCorrection
>>> add DarkFlatFieldCorrection
 
       1) NxtomoLoader
@@ -202,7 +199,7 @@ to save the output.
         3)                pattern : PROJECTION
 
     >>>
-



Add Process 3: RAVEN FILTER


Use the add command to include RavenFilter in the currently active Savu process list as the next (i.e. 3rd) process:

Savu Configurator command: add RavenFilter
+



Add Process 3: RAVEN FILTER


Use the add command to include RavenFilter in the currently active Savu process list as the next (i.e. 3rd) process:

Savu Configurator command: add RavenFilter
>>> add RavenFilter
 
       1) NxtomoLoader
@@ -226,7 +223,7 @@ to save the output.
         6)                 uvalue : 20
 
     >>>
-



Add Process 4: ASTRA RECON GPU


Use the add command to include AstraReconGpu in the currently active Savu process list as the next (i.e. 4th) process in the list:

Savu Configurator command: add AstraReconGpu
+



Add Process 4: ASTRA RECON GPU


Use the add command to include AstraReconGpu in the currently active Savu process list as the next (i.e. 4th) process in the list:

Savu Configurator command: add AstraReconGpu
>>> add AstraReconGpu
 
       1) NxtomoLoader
@@ -262,7 +259,7 @@ to save the output.
        11)               sino_pad : True
 
     >>>
-


Add Process 5: SAVER


Use the add command to include Hdf5TomoSaver in the currently active Savu process list as the next (i.e. 5th) and final process in the list:

Savu Configurator command: add Hdf5TomoSaver
+


Add Process 5: SAVER


Use the add command to include Hdf5TomoSaver in the currently active Savu process list as the next (i.e. 5th) and final process in the list:

Savu Configurator command: add Hdf5TomoSaver
>>> add Hdf5TomoSaver
 
       1) NxtomoLoader
@@ -360,7 +357,7 @@ Savu Configurator command: save .nxs
 
 .. raw:: html
 
-    


If desired, the exit command can now be invoked to leave Savu Configurator to return to the original (savu-enabled) Linux session

Savu Configurator command: exit
+


If desired, the exit command can now be invoked to leave Savu Configurator to return to the original (savu-enabled) Linux session

Savu Configurator command: exit
>>> exit
     Are you sure? [y/N]y
     Thanks for using the application
@@ -377,7 +374,7 @@ Linux command: ls -l
 
 .. raw:: html
 
-    


Incidentally, note that all the processes in the above tomo_recon_base_config.nxs file are on their default settings. See Appendix A for information about viewing and interpreting the contents of Savu process-list files.



How to find optimal value of CoR in Savu?


As in the case of the tomo-centre command, an optimal value of CoR can be determined by visual inspection of a number of trial reconstructions of a test slice (or a set of test slices). Similarly to the tomo-centre command, one needs to specify the index of a test slice (or the indices of a set of test slices) and a list of trial CoRs. These additional parameters can be specified in Savu by modifying appropriate fields in tomo_recon_base_config.nxs. In what follows, /dls/mx-scratch/tomo/2013/cm12345-1/13429_subx.nxs is used as an example Nexus scan file (c.f. Session A. DAWN Training - Tomography) for finding an optimal CoR by reconstructing slice with index 1093 with the following 5 trial values for CoR:

1919.8 (= 2019.8 - 2*50.0)

1969.8  (= 2019.8 - 50.0)

2019.8 (this particular value is known to be optimal for this tomography dataset)

2069.8 (= 2019.8 + 50.0)

2119.8 (= 2019.8 + 2*50.0)

If not already available, launch Savu Configurator (see the top of this page), and then use the open command to load the previously-created tomo_recon_base_config.nxs file into Savu Configurator:

+


Incidentally, note that all the processes in the above tomo_recon_base_config.nxs file are on their default settings. See Appendix A for information about viewing and interpreting the contents of Savu process-list files.



How to find optimal value of CoR in Savu?


As in the case of the tomo-centre command, an optimal value of CoR can be determined by visual inspection of a number of trial reconstructions of a test slice (or a set of test slices). Similarly to the tomo-centre command, one needs to specify the index of a test slice (or the indices of a set of test slices) and a list of trial CoRs. These additional parameters can be specified in Savu by modifying appropriate fields in tomo_recon_base_config.nxs. In what follows, /dls/mx-scratch/tomo/2013/cm12345-1/13429_subx.nxs is used as an example Nexus scan file (c.f. Session A. DAWN Training - Tomography) for finding an optimal CoR by reconstructing slice with index 1093 with the following 5 trial values for CoR:

1919.8 (= 2019.8 - 2*50.0)

1969.8 (= 2019.8 - 50.0)

2019.8 (this particular value is known to be optimal for this tomography dataset)

2069.8 (= 2019.8 + 50.0)

2119.8 (= 2019.8 + 2*50.0)

If not already available, launch Savu Configurator (see the top of this page), and then use the open command to load the previously-created tomo_recon_base_config.nxs file into Savu Configurator:

Savu Configurator command: open <path-to-process-list-file> @@ -422,7 +419,7 @@ Linux command: ls -l >>>
-


Note that, at this particular stage, all 5 processes in the above tomo_recon_base_config.nxs file are on their default settings. Now, use the mod command to modify the preview parameter (<process-parameter index> = 6) of the NxtomoLoader process (<process index> = 1) so that a single slice, indexed 1093, is loaded for reconstruction (incidentally, the default setting of NxtomoLoader's preview parameter (i.e, [ ]) is to load in all slices). Since the shape of the tomography dataset in /dls/mx-scratch/tomo/2013/cm12345-1/13429_subx.nxs has the form (<tomography-rotation-angle-enumeration>, <raw-image-y-axis>, <raw-image-x-axis>) (see Appendix B for more details), one needs to select the middle index of the preview parameter to be 1093 and specify the other two indices so as to exhaust their respective full ranges of values.

Incidentally, the general syntax for selecting slicing parameters for preview has the form:

Savu Configurator syntax
+


Note that, at this particular stage, all 5 processes in the above tomo_recon_base_config.nxs file are on their default settings. Now, use the mod command to modify the preview parameter (<process-parameter index> = 6) of the NxtomoLoader process (<process index> = 1) so that a single slice, indexed 1093, is loaded for reconstruction (incidentally, the default setting of NxtomoLoader's preview parameter (i.e, [ ]) is to load in all slices). Since the shape of the tomography dataset in /dls/mx-scratch/tomo/2013/cm12345-1/13429_subx.nxs has the form (<tomography-rotation-angle-enumeration>, <raw-image-y-axis>, <raw-image-x-axis>) (see Appendix B for more details), one needs to select the middle index of the preview parameter to be 1093 and specify the other two indices so as to exhaust their respective full ranges of values.

Incidentally, the general syntax for selecting slicing parameters for preview has the form:

Savu Configurator syntax
<start>:<stop>:<step>:<chunk>

where each of the four components should be replaced with an integer or the key words ‘end’ or ‘mid’ (note that the <stop> slice does not get included in the resulting subset). In the case at hand, this leads to the following mod-ing:

>>> mod 1.6 [:, 1093, :]
@@ -437,7 +434,7 @@ Linux command: ls -l
         7)           ignore_flats : None
 
     >>> 
-

Note that expression [0:end:1:1, 1093:1093+1:1:1, 0:end:1:1] is equivalent in Savu Configurator to a more-compact expression [0:end:1:1, 1093, 0:end:1:1] and to the most-compact [:, 1093, :].


As for the desired 5 centring values, 1919.8, 1969.8, 2019.8, 2069.8, 2119.8, they can be selected via the center_of_rotation parameter (<process-parameter index> = 5) of the AstraReconGpu process (<process index> = 4) in a one-by-one fashion:

Savu Configurator command: mod
+

Note that expression [0:end:1:1, 1093:1093+1:1:1, 0:end:1:1] is equivalent in Savu Configurator to a more-compact expression [0:end:1:1, 1093, 0:end:1:1] and to the most-compact [:, 1093, :].


As for the desired 5 centring values, 1919.8, 1969.8, 2019.8, 2069.8, 2119.8, they can be selected via the center_of_rotation parameter (<process-parameter index> = 5) of the AstraReconGpu process (<process index> = 4) in a one-by-one fashion:

Savu Configurator command: mod
>>> mod 4.5 1919.8;1969.8;2019.8;2069.8;2119.8
 
       4) AstraReconGpu
@@ -546,7 +543,7 @@ Savu command: savu_mpi
 
 .. raw:: html
 
-    

As the above output from the savu_mpi command suggests, one should wait until the relevant cluster jobs are finished before examining any output images. The actual output directory is a time-stamped sub-directory of the command-line, nominal output directory, /dls/i13/data/2017/cm16786-1/processing/savu/vxu94780/13429/. In this particular case, all the output files can be found inside the 20170301145340_13429_subx sub-directory,  with the directory name being generated from template <YYYY><MM><DD><hh><mm><ss>_<Nexus-scan-filename>. The actual output directory contains a number of different files whose names are self-explanatory:

Linux command: ls -l
+

As the above output from the savu_mpi command suggests, one should wait until the relevant cluster jobs are finished before examining any output images. The actual output directory is a time-stamped sub-directory of the command-line, nominal output directory, /dls/i13/data/2017/cm16786-1/processing/savu/vxu94780/13429/. In this particular case, all the output files can be found inside the 20170301145340_13429_subx sub-directory, with the directory name being generated from template <YYYY><MM><DD><hh><mm><ss>_<Nexus-scan-filename>. The actual output directory contains a number of different files whose names are self-explanatory:

Linux command: ls -l
(savu_v1.2) ~>ll /dls/i13/data/2017/cm16786-1/processing/savu/vxu94780/13429/
     total 0
     drwxrwx---+ 2 vxu94780 vxu94780 512 Mar  1 14:56 20170301145340_13429_subx
@@ -561,7 +558,7 @@ Savu command: savu_mpi
     -rw-rw----+ 1 vxu94780 vxu94780 324153088 Mar  1 14:58 tomo_p2_astra_recon_gpu.h5
     -rw-rw----+ 1 vxu94780 vxu94780      1594 Mar  1 14:58 user.log
     (savu_v1.2) ~>
-


The subx_processed.nxs file is the principal output file for this Savu reconstruction, the filename being derived from template <Nexus-scan-filename>_processed.nxs. The 5 trial reconstructions are stored in the /entry/final_result_tomo dataset. Note that this subx_processed.nxs contains links to 2 external HDF5 files:

tomo_p1_dark_flat_field_correction.h5 (dark-and-flat-field-corrected dataset)

and

tomo_p2_astra_recon_gpu.h5 (reconstructed images).

Note also that /entry/final_result_tomo is in fact a link to the 2-AstraReconGpu-tomo group inside the tomo_p2_astra_recon_gpu.h5 file. These links can easily be identified in the following output from the h5dump -n command (do not forget to include the n-option or otherwise all datasets will be printed to the screen as long arrays of numbers!):

+


The subx_processed.nxs file is the principal output file for this Savu reconstruction, the filename being derived from template <Nexus-scan-filename>_processed.nxs. The 5 trial reconstructions are stored in the /entry/final_result_tomo dataset. Note that this subx_processed.nxs contains links to 2 external HDF5 files:

tomo_p1_dark_flat_field_correction.h5 (dark-and-flat-field-corrected dataset)

and

tomo_p2_astra_recon_gpu.h5 (reconstructed images).

Note also that /entry/final_result_tomo is in fact a link to the 2-AstraReconGpu-tomo group inside the tomo_p2_astra_recon_gpu.h5 file. These links can easily be identified in the following output from the h5dump -n command (do not forget to include the n-option or otherwise all datasets will be printed to the screen as long arrays of numbers!):

@@ -780,7 +777,7 @@ Linux command: h5dump -n >>>
-


Note that the RavenFilter process (<process-index> = 3) is now ON. If desired, use the disp <process-index> -v command (the v-option stands for verbose) to obtain more information about any relevant process parameters: 

Savu Configurator command: disp <process-index> -v
+


Note that the RavenFilter process (<process-index> = 3) is now ON. If desired, use the disp <process-index> -v command (the v-option stands for verbose) to obtain more information about any relevant process parameters:

Savu Configurator command: disp <process-index> -v
>>> disp 3 -v
 
       3) RavenFilter(savu.plugins.filters.raven_filter)
@@ -799,7 +796,7 @@ Linux command: h5dump -n 
         To define the shape of filter, e.g. bad=10, moderate=20, minor=50.
 
     >>> 
-

In the case of the RavenFilter process, the default value of 20 for the uvalue parameter is recommended to suppress ring artefacts of moderate severity, and this particular value appears reasonable to apply in the case of /dls/mx-scratch/tomo/2013/cm12345-1/13429_subx.nxsHowever, note that the uvalue parameter can be specified to be a set of values, e.g. a triple of numbers 15;20;23. Similarly, note that the default value of the reconstruction_type parameter (<process-parameter index> = 10) of the AstraReconGpu process (<process index> = 4) is FBP_CUDA, but this parameter can also be specified to be a set of values, e.g. FBP_CUDA;CGLS_CUDA. As before, use the disp <process-index> -v command to obtain more information about all options available for AstraReconGpu:

+

In the case of the RavenFilter process, the default value of 20 for the uvalue parameter is recommended to suppress ring artefacts of moderate severity, and this particular value appears reasonable to apply in the case of /dls/mx-scratch/tomo/2013/cm12345-1/13429_subx.nxs. However, note that the uvalue parameter can be specified to be a set of values, e.g. a triple of numbers 15;20;23. Similarly, note that the default value of the reconstruction_type parameter (<process-parameter index> = 10) of the AstraReconGpu process (<process index> = 4) is FBP_CUDA, but this parameter can also be specified to be a set of values, e.g. FBP_CUDA;CGLS_CUDA. As before, use the disp <process-index> -v command to obtain more information about all options available for AstraReconGpu:

Savu Configurator command: disp <process-index> -v @@ -839,7 +836,7 @@ Linux command: h5dump -n >>>
-

 


Now, use the save command to store all the above modifications of /dls/i13/data/2017/cm16786-1/processing/savu/vxu94780/savu_process_lists/tomo_recon_base_config.nxs in the same file:

+


Now, use the save command to store all the above modifications of /dls/i13/data/2017/cm16786-1/processing/savu/vxu94780/savu_process_lists/tomo_recon_base_config.nxs in the same file:

Savu Configurator command: save @@ -891,7 +888,7 @@ Savu command: savu_mpi

As the above output from the savu_mpi command suggests, one should wait until the relevant cluster jobs are finished before examining any output images. As in the case of the centring task, the actual output directory is a time-stamped sub-directory, called 20170301171639_13429_subx, of the command-line, nominal output directory, /dls/i13/data/2017/cm16786-1/processing/savu/vxu94780/13429/; it contains the following files:

Linux command: ls -l
+

As the above output from the savu_mpi command suggests, one should wait until the relevant cluster jobs are finished before examining any output images. As in the case of the centring task, the actual output directory is a time-stamped sub-directory, called 20170301171639_13429_subx, of the command-line, nominal output directory, /dls/i13/data/2017/cm16786-1/processing/savu/vxu94780/13429/; it contains the following files:

Linux command: ls -l
(savu_v1.2) ~>ll /dls/i13/data/2017/cm16786-1/processing/savu/vxu94780/13429/
     total 0
     drwxrwx---+ 2 vxu94780 vxu94780 512 Mar  1 14:56 20170301145340_13429_subx
@@ -909,7 +906,7 @@ Savu command: savu_mpi  
-    


As before, the subx_processed.nxs file is the principal Nexus output file, with the set of 4 reconstructed slices being stored in the /entry/final_result_tomo dataset. Note that this subx_processed.nxs contains links to 3 external HDF5 files:

tomo_p1_dark_flat_field_correction.h5 (dark-and-flat-field-corrected dataset),

tomo_p2_raven_filter.h5  (ring-artefact suppressed dataset),

and

tomo_p3_astra_recon_gpu.h5 (reconstructed images).

Note also that /entry/final_result_tomo is in fact a link to the 3-AstraReconGpu-tomo group inside tomo_p3_astra_recon_gpu.h5. As before, these links can easily be identified using the h5dump -n command (do not forget to include the n-option or otherwise all datasets will be printed to the screen as long arrays of numbers!):

+


As before, the subx_processed.nxs file is the principal Nexus output file, with the set of 4 reconstructed slices being stored in the /entry/final_result_tomo dataset. Note that this subx_processed.nxs contains links to 3 external HDF5 files:

tomo_p1_dark_flat_field_correction.h5 (dark-and-flat-field-corrected dataset),

tomo_p2_raven_filter.h5 (ring-artefact suppressed dataset),

and

tomo_p3_astra_recon_gpu.h5 (reconstructed images).

Note also that /entry/final_result_tomo is in fact a link to the 3-AstraReconGpu-tomo group inside tomo_p3_astra_recon_gpu.h5. As before, these links can easily be identified using the h5dump -n command (do not forget to include the n-option or otherwise all datasets will be printed to the screen as long arrays of numbers!):

Linux command: h5dump -n <file-path> @@ -999,7 +996,7 @@ Savu command: savu_mpi
-


See Appendix F for screenshots of the contents of a selection of final-reconstruction output files, viewed in hdfview and DAWN.



Additional remarks


Tips for more advanced use of Savu


Note that Savu contains a dedicated plug-in, called VoCentering, for finding an optimal value of CoR automatically. This filter process would typically be added to a tomography process list just before the reconstruction process, e.g. AstraReconGpu. Another filter process worth mentioning is PaganinFilter (this process would typically be included after any ring-artefacts-suppression process but before VoCentering).  

An additional selection of frequently used and handy Savu-Configurator commands can be found in Appendix G, whereas Appendix H contains a selection of Savu Tips & Tricks.


Extraction of TIFF images and their bit-depth reduction


For more information, please see Extraction of TIFF images from image data in the HDF format (with optional bit-depth reduction) and related matters.





Appendices

Appendix A: Viewing of the contents of Savu configuration files


The contents of any Savu process-list file can be viewed in the HDFView application or in DAWN (using either the File Browsing or DExplore perspective). However, if you opt for DAWN (recommended) and intend to use it in the same Linux terminal as Savu, then it is essential to execute 'module add savu' after 'module add dawn' (otherwise Savu might not work in the DAWN environment).

Linux command: hdfview <absolute-file-path>
+


See Appendix F for screenshots of the contents of a selection of final-reconstruction output files, viewed in hdfview and DAWN.



Additional remarks


Tips for more advanced use of Savu


Note that Savu contains a dedicated plug-in, called VoCentering, for finding an optimal value of CoR automatically. This filter process would typically be added to a tomography process list just before the reconstruction process, e.g. AstraReconGpu. Another filter process worth mentioning is PaganinFilter (this process would typically be included after any ring-artefacts-suppression process but before VoCentering).

An additional selection of frequently used and handy Savu-Configurator commands can be found in Appendix G, whereas Appendix H contains a selection of Savu Tips & Tricks.


Extraction of TIFF images and their bit-depth reduction


For more information, please see Extraction of TIFF images from image data in the HDF format (with optional bit-depth reduction) and related matters.





Appendices

Appendix A: Viewing of the contents of Savu configuration files


The contents of any Savu process-list file can be viewed in the HDFView application or in DAWN (using either the File Browsing or DExplore perspective). However, if you opt for DAWN (recommended) and intend to use it in the same Linux terminal as Savu, then it is essential to execute 'module add savu' after 'module add dawn' (otherwise Savu might not work in the DAWN environment).

Linux command: hdfview <absolute-file-path>
(savu_v1.2) ~>module add hdfview
     Loading 64 bit hdfview
     (savu_v1.2) ~>
@@ -1013,7 +1010,7 @@ Savu command: savu_mpi  >>> mod 1.4 ['<dark_file>', '<dark_path>', 1]


and, correspondingly,

Savu Configurator syntax
>>> mod 1.1 ['<flat_file>', '<flat_path>', 1]
-


For example, the tomo-centre example given on Reconstruction from image data in the HDF format: the tomo-centre and tomo-recon commands can be reproduced by mod-ing the NxtomoLoader process (<process-index> = 1) for the presence of external darks and flats as follows:

+


For example, the tomo-centre example given on Reconstruction from image data in the HDF format: the tomo-centre and tomo-recon commands can be reproduced by mod-ing the NxtomoLoader process (<process-index> = 1) for the presence of external darks and flats as follows:

Savu Configurator command: mod @@ -1061,7 +1058,7 @@ Savu command: savu_mpi

Note that the shape of the /entry/final_result_tomo/data dataset in subx_processed.nxs is 4008 x 4 x 4008, where the number 4 corresponds to the total number of final-reconstruction images, as expected. To view the /entry/final_result_tomo/data dataset as individual images, first left-click on the dataset to select it, then right-click on it and choose the Open As option from the menu, and finally configure this option as illustrated on the screenshot below:

+

Note that the shape of the /entry/final_result_tomo/data dataset in subx_processed.nxs is 4008 x 4 x 4008, where the number 4 corresponds to the total number of final-reconstruction images, as expected. To view the /entry/final_result_tomo/data dataset as individual images, first left-click on the dataset to select it, then right-click on it and choose the Open As option from the menu, and finally configure this option as illustrated on the screenshot below:

.. image:: ../../../files_and_images/confluence/58589621/58591786.png @@ -1072,7 +1069,7 @@ Savu command: savu_mpi


Note that viewing of images stored in HDF5 datasets is most conveniently done in DAWN. For information on how to use DAWN, see DAWN Tutorials.  The screenshots of the Data-Browsing and DExplore perspectives are shown below:  

+


Note that viewing of images stored in HDF5 datasets is most conveniently done in DAWN. For information on how to use DAWN, see DAWN Tutorials. The screenshots of the Data-Browsing and DExplore perspectives are shown below:

.. image:: ../../../files_and_images/confluence/58589621/59900189.png @@ -1122,7 +1119,7 @@ Savu command: savu_mpi -


list <any-characters>*

Use the list command with the trailing asterisk (*) wildcard to filter through any relevant Savu plug-ins. For example, there is no need to memorise the precise (case-sensitive) name of the Raven correction in Savu or the name of the NxtomoLoader loader because their exact, full names can conveniently be identified with the aid of their approximate, 'lazy' names as follows: 

Savu Configurator command: list <any-characters>*
+


list <any-characters>*

Use the list command with the trailing asterisk (*) wildcard to filter through any relevant Savu plug-ins. For example, there is no need to memorise the precise (case-sensitive) name of the Raven correction in Savu or the name of the NxtomoLoader loader because their exact, full names can conveniently be identified with the aid of their approximate, 'lazy' names as follows:

Savu Configurator command: list <any-characters>*
>>> list rav*
     -----------------------------------------
     RavenFilter
@@ -1170,7 +1167,7 @@ Savu command: savu_mpi  
-    


move <from-process-index> <to-process-index>

Use the move <from-process-index> <to-process-index> command to swap the places of any 2 processes in the currently active provess list in Savu Configurator. For example, one can first invoke the add command to attach the VoCentering process (<process index> = 6) to the end of the basic process list of 5 processes, and then move this process to its more appropriate position in the chain, situated immediately before the AstraReconGpu process (<process index> = 4) : 


+


move <from-process-index> <to-process-index>

Use the move <from-process-index> <to-process-index> command to swap the places of any 2 processes in the currently active provess list in Savu Configurator. For example, one can first invoke the add command to attach the VoCentering process (<process index> = 6) to the end of the basic process list of 5 processes, and then move this process to its more appropriate position in the chain, situated immediately before the AstraReconGpu process (<process index> = 4) :


Savu Configurator command: move <from> <to> @@ -1318,7 +1315,7 @@ Savu command: savu_mpi
-

Appendix H: Savu Tips & Tricks


  1. The contents of any Nexus file (generated by Savu) are best viewed in DAWN, using either the File Browsing or DExplore perspective. However, if you intend to use DAWN in the same Linux terminal as Savu, then remember that it is essential to execute 'module add savu' after 'module add dawn' (as otherwise Savu might not work in the DAWN environment).

  2. Use the savu_mpi command with either the -d or the --tmp option to save any intermediate, auxiliary files to a temporary, periodically-purged directory, e.g. /dls/i13/data/2017/cm16786-1/tmp/ or, more generally, /dls/<ixx>/data/<YYYY>/<visit-id>/tmp/. For more information about this option, execute the savu -h command. 

  3. If neither destination path nor filename are provided on invoking the save command on the currently-open process list in Savu Configurator, then this process list gets saved in (overwrites) the original process-list file (i.e. the file whose path was supplied on invoking the preceding open command), e.g.

    +

    Appendix H: Savu Tips & Tricks


    1. The contents of any Nexus file (generated by Savu) are best viewed in DAWN, using either the File Browsing or DExplore perspective. However, if you intend to use DAWN in the same Linux terminal as Savu, then remember that it is essential to execute 'module add savu' after 'module add dawn' (as otherwise Savu might not work in the DAWN environment).

    2. Use the savu_mpi command with either the -d or the --tmp option to save any intermediate, auxiliary files to a temporary, periodically-purged directory, e.g. /dls/i13/data/2017/cm16786-1/tmp/ or, more generally, /dls/<ixx>/data/<YYYY>/<visit-id>/tmp/. For more information about this option, execute the savu -h command.

    3. If neither destination path nor filename are provided on invoking the save command on the currently-open process list in Savu Configurator, then this process list gets saved in (overwrites) the original process-list file (i.e. the file whose path was supplied on invoking the preceding open command), e.g.

      @@ -1373,7 +1370,7 @@ Savu Configurator command: save (savu_v1.2) >ll /dls/tmp/tomo_recon_base_config_raven_off_COPY_IN_DLS_TMP.nxs -rw-rw-r--. 1 vxu94780 vxu94780 34216 Mar 13 20:51 /dls/tmp/tomo_recon_base_config_raven_off_COPY_IN_DLS_TMP.nxs
      -
    4. Apart from the dataset containing reconstructed slices (i.e. /entry/final_result_tomo/data), Savu's principal output file, <Nexus-scan-filename>_processed.nxs, contains all details of the process list that was used to generate these reconstructions. This can be quite convenient, for example, to retrieve or verify the value of CoR or any other reconstruction parameter that was used in a particular reconstruction chain. In addition, one can invoke the open command directly on the <Nexus-scan-filename>_processed.nxs file to load its internally-stored process list into Savu Configurator, and then use this process list, or perhaps its modified version, to reconstruct another tomography dataset, stored in a different Nexus scan file.
          

    5. cntd.

            




    +
  4. Apart from the dataset containing reconstructed slices (i.e. /entry/final_result_tomo/data), Savu's principal output file, <Nexus-scan-filename>_processed.nxs, contains all details of the process list that was used to generate these reconstructions. This can be quite convenient, for example, to retrieve or verify the value of CoR or any other reconstruction parameter that was used in a particular reconstruction chain. In addition, one can invoke the open command directly on the <Nexus-scan-filename>_processed.nxs file to load its internally-stored process list into Savu Configurator, and then use this process list, or perhaps its modified version, to reconstruct another tomography dataset, stored in a different Nexus scan file.

  5. cntd.




From 4b226fd135ae84017c8607a691d53d1928b40553 Mon Sep 17 00:00:00 2001 From: nicwade Date: Tue, 13 Jul 2021 12:27:50 +0100 Subject: [PATCH 09/10] Updates for the release --- doc/source/howto/install/savu_hpc.rst | 2 +- install/savu_hpc/savu_installer.tar.gz | Bin 18985 -> 11413 bytes system_files/dls/modulefile/{3.0 => 4.0} | 78 +++++++++-------------- 3 files changed, 31 insertions(+), 49 deletions(-) rename system_files/dls/modulefile/{3.0 => 4.0} (61%) diff --git a/doc/source/howto/install/savu_hpc.rst b/doc/source/howto/install/savu_hpc.rst index b3d9bc21e..7609a9375 100644 --- a/doc/source/howto/install/savu_hpc.rst +++ b/doc/source/howto/install/savu_hpc.rst @@ -10,7 +10,7 @@ performance, we recommend a fast network interconnect, such as infiniBand, and a high performance parallel filesystem, such as GPFS or Lustre. Requirements: - - A Unix system with an `openMPI `_ library installed. + - A Unix system with MPI libraries installed: Savu has been test with `openMPI `_ (latest version 4.1.1) **Installation of Savu HPC outside Diamond Light Source (DLS) systems** diff --git a/install/savu_hpc/savu_installer.tar.gz b/install/savu_hpc/savu_installer.tar.gz index 889b7dff8d03716ad1eaedee0e1e7a1dd042a48e..5b9505eb30e360bbc63d417ad862e7d81d1f2965 100644 GIT binary patch literal 11413 zcmZX2V{~2N7Hw=Bjcq#(8nkg5qp{Q2R%6??ZKJVm+vZ7fUen%t$9V7k`sSK*uDRC! zvClqx6NSNmIH;WKf`Fg#15{VV>z?mVs+M3L$@Y|L_o=2*z2c(-Z)5zyWmngtOKa;J zl?^54!EI(T(X6&Zr>z#n3-J?+leNiD)LT|f9n$X_Wve33&YBu!%jXS3@9R!w&;A@2CNE{9 zK>O!3^ghQHbStTFnz6edqw?a~%m;U?J7i=|xzS!YdKfs8d#)2xZRLCe(R_|!S&I0K zWc@pxKKd`5pTl*7^`zt{wZhs8$KzaI)!DDtyrj-yhbl>oISKGp2 ztoUUzJ-}b!+ary;a1PhDVN<67W04p^_`aIu)kWf8=9AqM3B*nA3{D{5$sHot2#s%% zB78Cl$f}vxV&i?l6TAJF!Yw8l7NQK!@NS5|5PUd-#M;VT&bB;NOAusafsU;AWF^m#lj*4Na?+}fT#Kuwl<@Ku9=8YrcRu6fp z$a2L@%TJp$gww-8*e|e?K6aGir;{UChsNu<$`stPxi}ZNvMiYA$J01^TUw&`B2Ju4T{>Wu?sWRtW-hfpmion8zb#1;MO~78TT$DR*^dQu^rWX+ zy)j3cpg*f2zf1G{oyDl-ZBYi0+3550%sX%SLiquxoww*!4@CaHu=Gx$Mpa#OfV(sp z-IA`kre6(R-2qOsNjQ?$*Fc#;&!Gk(qt+0@ak5nx^Ij4d2T0yE2NHR7Hj2ONX#RXitw4J5?oc`X4kXGg|6GA= z*(AW;3#<54K;F}dj68!UGEZc0W4zRAkZoTrD-P3AD`03ZwUZbzVkK~U2-BzgHdNyT}vtF+|oIL z8Zw21vHQNe_wV3)kI9;9@$e#gh z)}jL5BTzfmGpPA`c&KzE7`UCFR}5A@Y+T0JPV9P6Y^XE+5Mm>NzT2tj;=wQCIK701 z{uIrzpY@4+g7q`TG9Oa-A)(`;SpiQ3q~V?Cr1g8ZH}YnNQfuih(kk%;PGB;)CFse# zUvpV^bh3T}N;jt8Nks&=vMh_xgQ)@8N%BrBGXc{-N= z$r*!xA&8fAXzpu~uig1(t(sLsJL@1*8M-N`WdCyjZxAjVSsyGc^y27BxDR;Id-%DJ zCT92#IXSms^+zxPGv!Dbh1nuk@(cN?I2B`SPG_c+Mq#Lh1jFi{dW}WI zsr8&$%oQh^vO_l!`uag;y<5?X%zE^z>f_8@nf7|cb_Ub~&55|0M%|=HWXcfzsRryg7XrMFn;8 zW4lxU=O-2_t~Gn`X0-zm*xCW+#{v0 z51~x}E#AdVb7e`nBX-haKORC_*%{gj$t<#h{f&yO`y0a@zg(2*E}iT z{>%G#)T+gzQB@RD^5=VkNWOI8G))O`e$H^q!Q5ro-x^Q`Oo9DkoJ{rL1~4ix-=WG- ze^o*mqW4JMWVj%xsTOsSUE0)yVJ0pg3W(VMP&dB$zLkP94Ic%+{Iqi=3hSwMN46@x zOmigO^a7SKj^ogGEp3`?gwQk-O~8}VA~etOJ(c0BuCs@5(vSK9wL+gA75@dRzhpAkV<`p@y|Q$S#(1pIhsZ5C}c z153`n8Cf7>hRl1CrOuHd7fp?({)!=o19^vrL|U4@*uuO%Lu+)ds8`!_{;id2g&$9} zgZG8SdEM5gD^a0Qt8a5EwH&toh4%`Dfd#@F1Y> zK~K+$c$1DTk0$adk=IXZO`@zU0Y1+M&@9>c*@)T62qc3a3$%?Wr z3RMyy)usX-t=m-|gxa@W&;d{ti!lS0P97t=v40id<#M%qeR1vHF@sNU)6}6==Fpu@ zsQLvpiHndVcF7`*^K_{}$-%@)QiPn{KAxzd*-^y*0~{xMz{gA z=s4UBYuxAvwg*COsy^ByOa2WJ5T;JON;m+*2qKw2#_;I=i=D1Q}g zyP-naY%DeC%_hQ!@fwBqu?%ug`p3?y9So7iDyr+qkmO1t!@DTXbCOdJW8`DtA~~gO zpNP8mJ)p6?cMJHGdeZMWqbt)f6vhn=ovX*VaM0Ls(k69}-&s>2(jV(ez*`pvl~5Xw z`jabxKulmvp@uY*!oJmbxfw5mN)oG5NF#^n4QF;Kb%#MKzB4&uACSG*s+fRYC=MKO z@ZZ!zGLnTbb2_o$al5$sEl17maxhLTxxI01mC8se>6kRkJj1qftDmN?rnR(EGGmnl zc#i~gaDA(}#?VC*^J>=tza$|NH9L)a zCj}lk4312VIzPt9-~WU>$zrBEB5`^WFh~V$y?G?q$>;O*d_OG=ILg+c8x@wV8acA# z=oiYS4K48r(i-^+Yx=g5+k!(Vs#hhiA&nerDQ2$S;j(>(ErpDcFBc z?x2D-R5mf~PMo8N0ab%eQ!E)moq(q}$Nmoo*PZ ztsDaPhJAuY_oY3dm2ra@%>(Dn+bXVser&3WAsLA$E<7$YmuF=iFnJ*dcKmxmlBP9nAq zv}pL52f0GQJHOmlC$GP7A~Vx)$iq_Y_15=bxH@o{QEYlcN^iCk{0KN#bh1>sxof1J z>}QfdiKPHjKhwnV5NgJDLCFUby_u)IRHYvi!kEXwq~r@9xiB@>bUVIkuVvU@HUib$ zQt6jMC4+6cWB#OSti~iVN_K;=j#ew~6hgi!aE&#N!ek*l7~Qs6`$cvSPU9PkxD$%F z5t@~hPxEcULIHYcn9-uuba0GKGu8!Iy+mh~)zG5Fmi=4R>ciX^Nd@+$A*;Gi%yMo8 z;H?4w0d2)J?dAT>`!KPpSu6?hLiZB$Le~?wjrwLLa}W>&XrltmH9hd)KSsQ~j(Wa8 zOW_6x9W04zUOF=NaKP(sfHp_e*&xnjK-P*8LoRMQG;a@hp+W0gLC-~Q_<#Z$=qDHh zBfaRgZzT8$A--zXfw?FtU=>Z@t|r~MI>)b$&lM-J+PEwoUj6f{)`W8SG*g^UgEeWYR{UAKYs-$ePYrA$F?bfo*XNwRRQoycp2X@C;JY z@e=amI`v7PnaFa)SNc}a)(0A9EC6kH2w=0N7st&xy(p}kx$kh7q-T_+gKNkW;r`4H zo>mD7Poc?_FaHB+0a>y*;R3-VYRBJ8WMc@!+VkAZ&DA60 zT&V$te11-rz7YS&=#NGX!(OL7EW8aJMs+sXjEo0z}d_?mN3H zNsJ3LnjLkSA`5hUWr7cYEq`uW#+R{!G1@xj<^}+wdcCFLPv;D270i5W>~}w!^h>9* z4-c>v@zj1RIaHWuO;-KeCRp*^ZnrlK(Y12;?f6IwX4>RtN1wYP#SRAPI$#*XB(GL% z)@c9=go;lZrI2#)c5UxKM$8t!i*(hRyW7feQNH%%l? zy0bmFQ`LVm+hO;ykm*7<{qW6LVsJ85fJbj(U|ZBC&^6dD;FU(sfvCzy#{}5mR748YR-7d~2a3e^0ybmgAqq$x zF&Ho$V4)5oq-TzjxU=T zb-)gl$7=u+vO=r@%WEJ!<#S`dR3Uu_ef_wAw=A-vU^(_?(+}WKr$-EV%yRd(?Usef zBGjN0dq@!NQosxRYO-6UqiGb?H0*t)0lhjGn7w}1?aLa(&bh2#m7m4jHI;dm?dFG99VY!i6O!58%cM4{j#g|IX&(^CE^ZX}&nS4N6O{GuUcTyb+h5 zK<>6W8he06RcA()9_qj;uRL)~Zv5UEFwN(QVmFIw5RrOE!F*Pr8VZ-+2B%y|gY3m@O8Sv3S&DJjhCiX`#^vC#ZV;PjDcYhw#* zs-9s=Qqp56jTiX}8>WqZ+DJav%F5bVIlVc|r)#iAuv4fXnnv^Yufq>%&DrxZ-KI;H zP3~a}!x5@Z7A=fJ+3*Ucpb^G>N9=*ldbk!3;t-#HmTHdp|LlvLwmKc34<_h)IR_(` zNnz(>s3@~!^l?!9ZNa9(Tg@6jT->qTsPSX5+f@y*M$kh*r7>^>VlMtRv4++c>C8nE z9xP*kA)saNmWjd>#glz0vQf$Ol-AV3p`O)QjX4{M#Y^l{g@@`{Mw(_}mCbVAxRw-$DDpHr_2;()+Fe$-p`~J@E zc%|zncEW%|btis`)ofo|Q^#>it_#zm>jVjW!4|Wgfk>&61Uko`Mk{1w4jcuDbTDGG zXDMW5%Np~QVC_o{{i7Vc&#h<&48c(bt6)+Kxd9~&;|nTP_Rx90D7J6)_$LV`UTnHq zE1|I6oYN*lHJZ4oL1{lgD=-sq+soH>k1C=1I1FsuMXFyR$JIPB^N274k!UMRW#T2i zo?3A!s*F2i?pteJr?ji;h+G024}1eQyX4N@B2HrDZ+P1R*sx{kl69c$XsCs zG1a=0#HFE(PfIDBe`YVt-AM=lXE$1?xk?RwK82)%{qETM) zetS?o*lF;n9H{l{N}C&-91_ar1RGF=AtexJ2i4GGrXZx?mt^*(7 zr&WLdEcPNSO(TG-8Q9C_ShivGM28Jc=DANUyz_fNipx46`<7#bf>;^v%Adm4iuO`X z>m`<5sMy0~JGA@u5exrk`715OH@2j6^{qXu2^WP$EhZBtg;R#e8E!iw$QL|!4lUEq zPSL_>=w6JSGj4c(QnF@u^RcRcJ+aIM?jf_fte8@vq@t#eneUOQjF=O@TOlmGdB-mGp^cF!O z64w>&v`)&J&Na07H5MWr=ZcxW?@GD*c2&`&HszGnRg+?+k;F)KM;5GMo|_81I<6i{ z(0VD~KH0m5%#AsmHVDv*=a`eke);9`5 zPM5y=awc^$F-c%dyHS}Dt1vvx-MVp}QTw5p1T}VO(IYwQI(*b%=QV^eX+@A0>QEIb zBfQN(9tMxH)~3=JUdc;dhx851MEu24Nq&&z8FvhVAZN15_j`rqIkEZK`r0624`a$Ovo?G zk5o|{%vB^;U}h{0Wo9IiXB>ZZG#e|7mgGF8IFe6Q|MEKKp@dykXBs`yI$_#@FWj1IZ#^NS%v) z$Cez0Xk$tM;mUDRP9sym@FZ(uFb{*T%qm;#J9rN<5V(Aip`4!hoR1hb5!mNZL_L&&@v3TdvvPTzNT7^1 zDBkfyxqwyPthpzS^&IZcBYcL=2xawo&2l~3*5)zIV*a6bGM8UkY+1MV{XqH1HkthU zJDgEz#}uno=YDBepu+KWGZm*P_bHrtm+j}(`X8$ERj^E>mDq>3*@cbQqHV3`Vw6DP z7cWd6rHypOx`gu9L7OE-?uxIjUTmbD7}E_`f_hA>HD?kd+#R`GoL@D zb~MJl%mC315+0)6hBgZJbB^UfQ?1D|tx!oXT_$eSzqy^(eSxA^rrk@tZyZiXl;MuJ zTc7Q0Kd&L)w|c0qa4%TOZ7p1%TCmSznnmiP3c1gg%K#XF41mX5zslaMRblPJk*#(a znmp6^(MUWLyy=jgt_+DeM-!BIQWrt=qRk%hit^5x7NO&IY|ieU09+zZ z$&}}7Fb`iYq*hXD?^v)@e&h-;dQp#y4F%3L=!T@YJC(s8QfXiXsb93VAi6s%ob0P) zjwJKl_+z(9SkTKMdh&BO^V#x#u39P0J%;|&xOs_wJH*;iSWt=)HC-hp%hr+Eug;iW z^4lr&mDovN54AmiF+hRf7Fs~gZqSvz;AesHaDifmpRxb_0$Dxg58FwMu;{C z8J|k%)dGm^G1EDYfXn0QOuO~X()|p5+#=oPT2Y@S{ob72Py1p~7WZN}k)#ay3VDLV zSXx@|Dzm(U*=A?wii4%V z%q|^g$D6PT5KhZCr;OWGPCng{!P`SOClM~SDwE?c+O#cG ziVD?Bw{!P|9J>{S3<(@>(}SCasOd}KrpHPdqdwcydYNB!riu@(&aNw86unT~H z>?nV)VsRRNm~I1l(%7`KHfi}*b$Z@}#YBSh>8gU&N~tVFJctn%EOXV+qpgvyDvCWu zMu;gtB*~jYx=0zv;U{I1FzDoo*3)z)ZdBdAm`-S?VuqM8L0HqY7Jkfmvw8SK1;Zu% z!%bNn{)~63lt}n&A+?>kE@OE5@5j3hm)=HdLMz86A6tS(+G0c?dd!)N84hoY4n*b)GUaMfzN_=OQh- z$fVe&0NOT*j8B)P1CEbS^TlaD=3(69;kO)=_XkR{$hU>DmeOZspxxu+`{mmSy09PD z;@QBxT`v^QGM#B0Q;KimyAqTq!Y(WyEKR{aUGQ9w$VS6{Y34UjQEa?drQSZUUm8>=&CUpt(u zX@ww)OawlSsM1pv=8z}qE)PFO1dwuU7(1L7N_((WtDcB@yedabL2})oJ7;}1_L|Ut z7|O3qTv8~Sa$QzEfI!{N5k}zb&$29SO)j*xLh)1Ji)%d@$Vexw=y*{xrfZG616_j3 zoa^;efmX}Vo&(j&-R8ZhMrdDK zzN|2QdKvMC->+d<#gb_l83&gQGagDFL-IYPRMAjbKjy#7d%j-s%}YxHl!L##{NSR} z9tLJ|fTmn_mydb!L2um973{xi#vh1z^}c;|cH&2Q*@dKY1_tdj(491)d1o2cjF0n^ zcd0zeK@e$aoYs-cJr_vM7xBlR??=xh)b&a1%ZyMJM1#$5k3~3W(vGXE6EW#u952ek z2-@NA3yw;3B1CKx@qgtd#SU2Gr^`%KWvNeCYOpG$tnNr3@6aj$sA*3osq`mQUK?*M(BbFz={NA;d`;w7C+dDXw_Hne`UxVN zQ2ubFTx0B^G6*3fNVQr1DyIq{3||)EDJ>g3eBGtQowXm?M?xrEYwi<`ElM#fX=s^H z-Tz&e%Hf!*{f$dr@)Bdn6&?9&!^Z75&0`V?rf~D_v*TG+7VF|+`~9FYJeT4cD?&b2 zSZgjs6D$jN$Gw4u7xF49lH%2%nkvYO3HYo0V(SbM_^kP-;u&3#mmPZgNbGewmE%T& zgN#EpBDIcr{(j|k&Vw3FtXU@pm5|rnl-WkxrkW|4=`((JK+_a*>GuWq7p2dQF+8-P z-}O`NjvZLSPJu^#&K<3sc6C3B!wZl6R1(Tt=(6NU8lP>xPR|%w%@bzT<*Fwh0O;$3 zK>>>23))K7BjCJ2k=MJqkvi)O?uv0*>N{(oQd(zc7D*Km(|6YgbX0j3J1f`tWYo*F z5m-^*<%qoZYkJj-N9Y;Jg9sm42l<7HW2evU2dLM*`sjW?S+&X~BVr3H6d7Rfm>CMp z*~$%fxnnIem>GE=m~!9ulmf1$7sK3J3fg9nw@Bhd%m9B zd_H{5szdhQ;#7ql8CO!ZyS^)>AgQ&$OK65yML*Q)8>zZlSHZqPUA3J+-PZ5;P#9{~BAF#dS5W#Cs?Ino zv8%|1zD{)!*`RY9h}ue6T4uC|#?OrQq2#;x;uIjsPp{?izNPdLrPV{O{gMb$QCwktM*7`Cwu4ILrsrw zAi&_IFH5PBKG<2@gu#?qi^MA|0P4j-=mwak;%9Pd0tpOyKh*2~j&Zi7P+w0291Q98 z1&;hU2tXx!kGkaB0=|YEGHn6*zeUr1TA#Au`SbFgCUscIBh|!+KTVWOc z2&?!s<>UmsttSAnl+Fh+HNav5HwDj*i2Mbejp)O<*}4B9l-92fKV>461?mZPhdX6b z&p>*_mOW`Y&n}e3VyEyw{(peoPC9$iM*#c<;fPIKU--X$|I>xCo-e0NE-D^l`96FGZLW4Zc?qu`$U;T4$Gtm?@@;g94tSofhKq+j0>s8DK0=g(<>Xm4CzAqKn2e}pE^9KYQL*jqX-RRTQv%XZh6mb8l=ZlOUbWk}_MYstsp% zWBV=x&W}n)1^JKqpY~@M*&xJ!H`6D_`u}tY{um&V+}^d(8oHw441{4PxV)GUW=aO- z$1#lwQwmc|8Yqsdgeos4{R#JjWKpTg4)vi0`%thP)juduWrz=h0{~CqqkJwaA$56A z9P|P1SdV$z<}#~Y>3H;eUu#|Iy#K!K`hz$=J>0)y1Ea2W2;b0L7)V?gwiw=tm0JN5nr679;)P`@4Zi%>P7M3y6VN^sAb{Yn$X9|3k`O=Rr??D3=z8{+S4(><$U8;P~N8G61 zUp7YcO7PF!Wvlj)pyy0U0r{`98#omQ`7s@e1LniQoT6|gSdOt>K?3rT^0Cq1ZT~2- zuphp^{nTjx6-5Ff{xZiB3~MG=f>^bGhyG%Nejgmy`n#Q$?_YyySQiO75BdG*haL1b1Ay0*t4 z5JvFZdLpm~>lHaqXC(8PuWBY>fdBS5`!R|pzaew`nZAqLIxFaBucbLmo$y+MFu*S(Vj&(Vg*;0H>6JqeM(*UlGTW#$z_ChZE7A!Qr9N zoe6iOW;W~2XGwtlkV%r+|GEEQ%Gtlv|LOr>f)CaIA2GfK3gk;+k79DjYG#k4B)%o^ zkp^cSKV$d(b3{}MMVko~vapX3&-zFk>a0}mEMmD_Odc5M?IN-PYjH1fPc#~=lDUP`Uh1pF>nTRp#^kqQ4FaHw

As=4M`dyl=lMpexwj)DU-=Bm;MgFNr>a9b5i;pYW)zG1>u0xN&`_sS`)k2V<5 z68?0sCR{zfXm`L<28#sHq59WKL`Om#T7F zMVSRcfy>Gr*$_NcWiJP0n;uI>x?Ru37~)MD={2ja;utqC`<*#ZMH*^`Lix?-ma>9& z45)?2l2nA5T;>^_Cz3EH7-dcc04CY74SbFzo)Ds>J*=NDJT7uy+nJT_A3?*{BAx=b z$`(7YDjA6(dkWO@rIaS|dlX5=DqnI%`m6*ZdbyBTT28}eXE!j8B^>jAlkFST5hQRW zf51)o!V2K@2$+(eUv7nPk}LzH4vLkw!k#OwaXSQlg3fQ|2cn`LJ2X=Uj*my+^SMY! zw<#5wO=PINSox{-c)-P2cS0&qk^PD4yColS_!IIwW_N08 zFlE3;?U_hy&7>9f0+aD$>Px4BM^t?P+3R@EXV%V+-3-3@`hW@iQ?bdkg7Eb4gKPDU?)^zF{gi&MTf8 z7Ns9b}uEa-rW8qwi^B&gqAd1i)hpm zA@6!{wuT^l1c~4&6vo~9iRp8(bYcK9C2m6+JI)wO88-zJqPCU#GWAt8bdrikQGjpL z+%$|-8`ij+(=ya#oEe6Zu{(F8szUPlrw67YWskFA7M!A_lL8xPNCmANi5wCyR|-jk zyJ0G>A4gcjoUEMJNB1-CTT>-LOmDD{bhshW(Mm=12$0hw{b3OG4A)|0ZiX2Tt@;+E zaP~_?a+pt7-E1_Tu9^qu% z@n?9c@K5=m1jkI`D6{GK@Urp%?Fz!*jHrUV#1CxyFA$fZ4arn4U5>SsqtX=BvC9k3 zz=KNIkt9s@*VB&ZU&e^n0gbBoy*Q;wlSR& zcQ`$+ZH!Quqvtc|Nn^MO9e_Vv>%%>?6a&Ta&x3zTtP2t5dNOv;dHPpMPw8gbFpt;@ z>YnIVgrK!*)<=}L1VdnyS$cJF72zH72zYc>iZgi-c6)`;2m$w}KPwbdF(qr^(5Sli**>fG@m*(gb0s({tEIqKc zIiihCrt^gEW!(haqqGA|geGelE|lxLwg<7w#ptHzSWY<+j2n#}C%53#ClC zs|6cG!I0<}kCtYmJga*j#(@-E*gmaQF>Rm9S%+JcU?T)ez`tpUddw$u&B_O48>Cvv z^gFX=dxW()=(xOm&vHbQvp(75^1OtpGs1;8-}FqR8s8f1&)z|uODD9(DU%D;T|;rp zvJ{<@bSp6_(dEW5VMWl$X$rmx@DT}Hpr|+HDEEw?$csBhF&7dgE=$?yB}68}M4|+c z;FRRR~<3cT<>h(9|AM;;^!7i1@K*QS~c#JU}HLBlayV2wEjr*`ee} zUrwl(Mk1tD#E3f6DO- zrMt5C$7>Zz@?wgEdPS?;m$Tjx6H1EX5?Xv@gq$G5br4E65`oy=6`Ubdj0Q$8ARQ@k z?Bw?bZ`9!IMwb*P$X1P20Vp|#JjT4$jxvINi$v+iY$K;b^J(ad;|9Ju_?s3Q!1Pkw z^dV-d+NHSVN7vxb!%Mt#MijxzF8ePJ$~+>aCnOR7CNT_6=~ac3fITU(F;pZUVT~>w zGfa{yMlPeb0@9g7MuoIgM&!|6bjBy`5A+6y0ip>L*vkdVfiU z@Y6ZrlP_nFg&r{-qKW>^^mKB-`|qzZtXLYnaFVvrxeMbg0ur?JGa0-5N_b(;;K3C! zbn2-6XhQX^`sZeo5J{>e`I@uGeamsJ860c<3~kU^l8(tk)ak#=1pLiEQ&?!O|2jnv zt2?ulAXuWWHllfXEl(XpY%mHxvdJ9Ra?qpHS#MvGSq@*=|!5E)+%?B^013 zcf!`bwg@E!&WqtH9{4moW^JRx3GKxj7%Wd=M&Y#9Q6ttH!9(`Cq|cWw=ZW?QJ7O1w zD<`Gu%SMlmCiko^42)vwi?^7IspziEbA@AjEAR{nDO-w@ubW~D1;cylV6E7j|}r2&A>uLo(bAwZKO&Uesih6hc_m-V#T%s<&ZwgBP>SDK*^?A z#O*v*+ir9RpxZwdC<~K8H!~2O+{C3MTFY-Dg9B_!Z3J0KM#1e1vDj23O$x*Zl8i zD@Q%CwW4s+CPU?l3{J!iMoo1PiTudOjE-biR{1#qqL6~PK=)JJ(EM^OSkJj!(zF7F zorcKOhNdGs(@q{I4CWC_w@#Z8EP&XowmPyA>&CMKBB23+X-zyYWE%-lt$Vjn;25$g zM7>CSpG?9NsU(&nx|k+?&5CO|#+ET>8dmGpo95`6TUB^C=a>jlc z_-kTZiQ14FZ=P-*x4CF2G6omSSZW^^o~hAf^zCH_GLj!J`p1K9PMbX>yOUN+8KI%~ zg`wPGH|KuRthIUCpNW&l9q%HKR0Y9olVnmvk)7?hN`;S7Ueok5VjAvzSO&Lc{D-2P z&6*NN0j~6v&CA&8`vTJ6>W1}~PvwwNjp z`xmdZB~nsMqb=0W1WYkBBo>C8yFTFE7eu&(^t!ZPgGwDd@YC)N9H8JcE*rtIF>l0I5p-xD&PFVUdgEQ;QMy^CA+{LC`@(N7VC5_wg5JOJ%la z9PMOJ4j0^H%fT7tncZc8Q?m06RBTxEU#<-iG~l;_XLOnmiYt*WV~WRzFW zGFH=iBFegX%{8gz6&-g{u1u$a6XdvIGou&+9hKJj)?gv#qwYiF;rHvTMXbH%r=KzM z2AreBM~w4aEtKug_Be-o%A`%g3L0)MlWJ|bV-`lb$dn^z`)z6Jy}e}>hp5o*Og3yX zyN8Zm6+c^_#PO+d<~@{=d4e%Kr3K-NVq`L}{5r=~a}{Cpog zG0lLNHPeSYf~_gQJ7CfNT{>5v&NAhE7eD>2ngRdWTmw)$_QTZlkw1;C>r@L#=S|6Y zd-nsSEYFesH^r#=Txke4$6f|=RAu_$qFUJ;R?X=Uub~nyRN0AhLLK$QP1@lt?(P>| z)615%gonvI56mfvwAvmM#0&Mcwv=0TQUt_d+(y45B&0B$OxNlq!Mh$^p%fx>TcqC3 zeH^kOe79vem}7BkN*Jg4wDa~dL&g!|RF^zLz^`+3w?TE%qn~FXmX3iCLQOK)f=Uz6 zqF5rcKh&1b*EOmbakkl69Ve9w)UCyI=-3-1Ufo;p=@=se)Rc=6rBlk;0v8BeGIz6J zqCBz~QC>+p&Wx(Wlf9SH*TiMIOc3r>zIRrE|B8+8;~-H$X6XsHBoA?5rnH{TDwJw& ze5Hw^xr$e(OL~7DQf9X<$0om~L()vp+iz)XswuBHJ)@ASvNfr+k{}&Fyki$TY_206 z!kA)GnQ0|AlB#+-0Z*=sxxiY1{Aw6E2CL#TKe+BC9zM#RzEc!s@!5k{qQdzC9VfsP z_p`e5iHuJ5Il!vDggqKp-LR?h*B!hGB+RWTMFal2M%lUzG6(o7+}YP3@AI%$9W(sN zrpyLdoSE-U4_le{Okt)#;e;S==JB2O2j$M-Vno5lLRXf2%v*0~AD-NwWDxz=`P^nD z29-_U8~Q#A9!yz;g|LqWejaCU!}E|jEX=&Orqr$RX=d$+(R1A&_#Ke#6xb)m2MmpQ z*H~yh?F#kwp9M;uSHV~WnUYd{ima0EKAPdN4h|#CHnpzq3lbITiS5-D)l4(B*lBmJ zTE%WAL85T#9d!SUa?k6=d{cqEp~rqJtj>V3Za+E&NU>~s@V^CsMM;S#E|}8`jkdEs z4nAs}P&89qq;IY@wlcczkQi#>lzagSBaQWPDu4Rg`dTBC=ka4?U#*dQvjvp}ElhZT zu<4QW(`1;H`doRC)H?Rn6*(s0$H6d2RY$a$DC2F_AwN%^D=Cv+T(Mc3kjIHH6yu3G zNQwD06lP^a?Qs*nN``^%Vhs9gl80F(B^C}-e*Bj?7tIWOQFVToTRJ0L&b}0bJ?FM5P%MQ7FVBDyV}IjnVEJBPsQPZ2kM&Uq+;=&n9R>~Cxa+tdo0U1dcEkW>^@v5|V%m&gR{e{}jreS-X`qErOL2pi zOkUGed$&*63>*QtQw~AdB=qZ*XE7adLwV_v1{~%Z!@y+QWv(XXq7F)p%cmQRY`aR0 z-_Cat7M_)ELc4knjso4saFrQ*OAP#O8bn(P2|<);uog)}FyZ?SQOV$Ar(MrqvAmgw zyuN{}NSEGl-XF8sghw`-1R%YIIpczM-Fng#FikjFo45V!+Yv)Sxk#$2OaM_f=e`$| zkvCnbddIiSUB5p+F$fBPxqBneK&Ku^o$aN2{Kwrc5(t@mkgTi{>wp4l0O$rsyq0sP zfl@Mj(~;)S>J^2tnbFso#^*z)x9jaCiAmbw@Yrr9^=k*waAv%5c`H^@gnFlo!>7x=dT0B18Gf1<{0+jo>oAAwvtKoIet?I3x8 zWJ=5Q@~JAe!wK#>Ql?yS(;;Q?%qyVSp3DV9VAA^O`|}0Ll%7s|t2;=#TKosq)YT1L zuj`TmM(iS>JEOowb}PBt%_6N=d&=ksX5vSlB;c+Rn74IN0+Zd z45L&>nAg!G-^}|}He#j_HZR0SBEulahycX>BtNL%#n^58B>&^YXiLE6HKE(D4(cPZ z+YkLozD)`9N&eNovfD2M?u{}41h~q6$f3B(hWeQGk?fEEi=p2y`D?Sq{ZF=)^7DUj-|7D5(Ng@A8Ul3O zWB4zPjcgw6KZ*Y>>~;E2br7J^0fOMaEH)V`TLLcV!7ktY|F`^qO4geGOZB&+;uOH& zbbrGmentPS$)(}Xg{;lG^cPs;zf??2-omDkzsv-bVj4Y(=-B$#uPPx9m+VV1a&U#_x=b~P?Qn}_(X zk6pP(tw*3CPWCOoc>&ntGt|wNE|ALvv&sf2)RZa(`5h$|;jLPnE6Y1X8YoAQFbPQC zc<`j2*eZAwaTG$4p@snGLqc^T_o4~NN~yz5e!4^_t9ZQGIoAXorJqV(RUc9!!j<^l zJ-;4a`ZjEKJU^dD-RdQ8cHYIl&iH*4V{W<+y??*99VMxqjPdUunIVUXfiBFEgdj%B zqs9WbU`PqWREA95ZPopp_V9MSv-S<4OgJNaT%u)Psosx*oLdwkhf3PIxFn-s0w}vVL}76QSfs^PKB^ z{nByw@pdjh^SsHh0TQ~&%L16dM-=+ruAlJu#reLga`(DTO)k;S*mX&Qp2D2>VFLj5 z_~PO|4sFcaK`N;8)(7cXrM32x@Y#WE(_zFAYCjfhHdu$(DHZ(bz&=@ldXPSsbf=pzw`tt(Q0%yKzJR z@=I0qXHW6zw+ioT;u(6$BI+jWOjI))$o22mrlg`w-@gPv$?wyJua##7NwcrU?=IKg z;f`{_!_}02GJ~JEfm)FZy3NF8XRGVOkjyeofT>Vmj04oFan8g`$6VcuRbJ;TUhRLN zQ7#JbFfX~3(0oXmeE@=31_kt*7QjY|DiZT}S5=U_w;WF69l*LO*#gSiArC}-P3j^P zq2dEBw~Lnss1UI_TF;iQ-T4}?#j^Q~>akzN{Z5=*dCI;n?3Y(v8w$l|Y##P;RYo$B z3XP7Uip}#SD3o@y-l<7pin(5^ba}QbX5A?1X6%gOzRJb!2;2{p`O6nHP;Cac_->g+ zeIEc`ElYN_Zal51|7P2te+k+zWceylsHI4qrjG&ngjJu#fcJW@F}mYc|~w)00I(tft8laMv@4Dg`@*G4=*&PJqF-Blp`XXj zI!_JU_iMguw3^9-kq+^De=oh`P4aDRk9+eVU^Lh4O%hxiP#{!6AbnQCk05uQ8V=I?wcE3<#^9-}4 z!6(rw?$Y*;fx@D;G(il#&bX`)MJnM-!mrA9&Ku1Y#2#gh=xQ<2pytR?bH*EffX6T&91Q5ZHZ#tK%g3ggMXbJvs%Ga0daK5S%90qKV+!`<;mENYW6tyNl5uc+|NMTCm}a5z6D1S zFY)SM&(*OvyL>(#u)X#z;<{5DJR5GnxbKJIC+gZ`G=x5-pR<_!4BG&kNY|QUOQQCy zL^65;u0ETv<>E8=d4P5^7u!QJ$U>thc9UWG7X>;^QM`{of50!X+;@Gp?#=aDm?kFtH3NO z@#+b4r59zFx4fhG1Fa1#C1+0WPMxq%D*`LOB9f|tJrGKao?N|MD3EPto3Egm-Fmt~ zN{F@a^ztLHH`Yh2m9#V|Ox?g418Y!fyN9`}k!qHm{iFD_i9*lyvLo44>vw}wwJxh{ zfT6tB5g#kOq*%vhF2eMewWT9b?OK0SOspVUYy3QCF9CX_xiV&n+!`Mtv0Dkf>NB1r z_M|VVEn!{GA209E+M#PiA>D1=l8Tz}Uq}VPWfj z<3B~9B`_Tf>uH{sCZK}6>h`{7SKRxc9dG09@M(o9T$RBW@N3{1B;`V4%L)@Gxpwu; zne;(n8UatEYm8YLnum*MQhj{0eE-@!2Wx`$22&g_tLsL#wMc1>~B1d7XLNr_9}Qkw6mxGj!vjLx~_8q_vjW%I^2 z7_rwlVChru=fqJydv67;>-pRk-^irKE_9N287^ZtlZ`b2!6z9ysIAlz{ZF4n*)3srWNOLpbW({j4kfEOg5n9Q0Ahtv*E57LqB0G!qb`~h0GrsP%P<50r3 zE<|7V;~$WEgS&nyCe&zqg~z*`R0w98??&4uP0$w(;=e|8dI?)LMmROFMuWv(Q)jU~ z)^O>&W87?%eEH^mv;`$45j5jqWPO)<+kDBe(caVrdWLvA%x3rs9E+;Y-}gOQHPO%Q z!ZXw_P=hH##ClNTja260S-GQ!r_8%5ZD{_*zhpyib-O!8JYJt~+I6X!IH1H9_uG>E z3Ij#G$9kPqAS1O)@bkE-S~QwC$0m-iXEPS0-xegdG|XU*MY@oJ+9 za#zhCva03{;$UL@8tiWd$2>%@^}mo*pCakx3z;8_;RoXcB*mj+t-Y)U1odJvu7*zR zf)-kc=oIf~xdTHoJ}g#%wm#ZCX>_bLJ92mU*|G;qVvp)JBM)|pGmCZ`o9Zjo1+X0n z)erPH86YK2QdJU#QKL0B)b$Pk1m$NcX6;JFsvbikYoH)&7!z`uC36{&WRAwi;>KH) zetz0SE;H4pQHR+tF}d;wqWGkYd`js&k%#J9VQ&IWM1fj%n&_^6FBWgw%$0U28pf|; z25WtpH^4+nd5s;k`=q)@(B>cDA?I$I07so72PD z^x;WIHSDH0SAkDWV{Y8A77Nq-YnlA;5mPgP&m>;0tOAeD9!KrnIDjc}12q1Jw0>%R2D>1V_NO!Thm{$V zBZzT`$-EyX?)2;22eUbPk~b5f&09pY5eSor=29@QF%`{sBwl4dXrbPFAS|W1`sS&# za|JGl)gdpB6RSt}u8U{f${V+P8@sr(^<)78CI&6V@BDX9@0V4wOsU2Yo8Zi}&2G8F zK>-3?!f3A_I-V#&hN;apO-hYQ0(>a zc{R3@bpi+x#s^ImPl$cpL5pEh(Np?j-tYG1y(xB=vj!nsTlH^a92^wvbG1cRQ>g;Q zTRvDhHOFhId+Pds7K;f41l1+xMUw@Og2fp!TX{t@PNGSeI`CIkX-jJ&J2vt5L)6`x zf+olk&>yfUhmK60QrL+bO^KDr$LoBo(qw{`g{7I<@22mHtTtLms6V^evfT)_FgyUT(hGrX)$#k<8O5< zT0AmV-dkhrp6ivf>`liPDaYVvGrhp)pNoF<)ga(u0T_^PJ5|nJcniE&$Mq>Rk1EB) zS`WmfGPi%9ol%A>T>Ej!6f>n)Z>;>|AQ_LgwDV)8{NgGAiR1IKzMH2g-9Ba`rbcM7 z(gcTn>6JrII|s}sMrL*2C;Kd@;`#BLxhd0MeQLE{LNrDaOc8SoPb`d zOU~SlJ!<^Pz9c$IedWj@n^OO7#2jk|pEr8pchd%3&M<~FXAQONmfc}Ti{62}pQT=+ zHdOiPV*S{Y2Q6K53cJqS_1~<@s;a9%ivus4LtJ>Le$5nF^>pXa5rVnQ)9%f^1|36<=6 zAFrRvt~+72ab9zZX73!;wDFYl#Qij= z9Jkd>uDZGx^d9-LU8qy?nZID<$L=8PcglkyIEiH}LjA_B9_n}hY!Sp{6Jb**SxnV? z;B~HTt8jY`E+#vi3=Mo)!g3vDuP>|8H!AzHQw;}lL$7-4{!(wwTaSC4>LZK3^@)92 zHP|*2h3Ihx_ls!QT)87i;A_X*-UtV!-e}{#%b7sXp_<;i)`#i4q`U3A2?>oI$!PwZ z)l@c3@j@z*+!yl1eaoAoWr@QaU4w$BvBm*$*08-L>tL)1`_8w0WM5kZgke@eQ$rC z*$d2yvLZRn?x6I|IM_Ovg3lhJO0XX5+1%yW6Oew-76z%k!224Ikeo{g^+W)=_7XL9 zjF?(c@rzM?H~u*+kT$9!rZO2O}^V>SENen&t3p02x})Lq7O>Oo;;IG|Vu zx@AxZS_Hm_O1b^1HCSa0_37JwJ~InU@kh!{f^;ZN_SOY+{nMpKnUo&G#Nxr+TWIWh zqLa=Zz7x&YNYPg%_P%I~(dyd5vVB9N@eVz`;YB-*nvNniZM5aAmU)?FEvrdF^k#PQ zZ^?QCA|-*pVOCxX?QAsAlqw2-abQ?-p_JHgp`^6m+pnmhDg1l_y(sxS8nwNqypTO=5Tu#t(8N0sraG?={-_e5Y+8XKT~q_HgHF|9Xdm z@F57^!wSx+J9KQnT`6B-+78c?OZZs-JmN~x+${s6hI#OAn;tv{DEK8eE!lRvJJNBZvJLf zzN@FKVgTZsycXf^nm|{o9)hDDXs44g^>CP`RqG8v18_7qo_Ju&V8@15$)^XX;1Qa= z=r5Iz$FQJ6P`pMY1pLHYetrAGV7rTcfXMO^<+WLpsj~<7e9c3wed~w(6#e=LI@mQK z|0qTt_yEN^@+N^?!tKsBLBf!Sej*^y$57~7b|18FxOD#dg{#kpOQ66~b(66nvDxKC%|}aQOx0HL zb2)#&={O?M)A8B}b!unV^eV*cttR?AONLDN*nu_E))c#h{Tr&=@I50zpMgk7$Gx4a zbsPv5H2CqdiDTLO;gw`m2y#fw3i8Vr1!f#6@Gi$w~=NQnd?4o>EyuJ`7Yr|d*8K={u ze~|IM>i(h~BCbz(aJ%|O5QkU^R4#=wJ$o-*Guq<^_B*l^z?iZ`Au%BucdX#{`s)o6 zF?OFCYogOdX=l=^xP60L7eqxeAljmF3)?X<^*H14wV(`^&Xhl2zU9qF+)*BUrMLL( zMYl|iR1$@{kii>$+q9L**%J|$a`Q%Gjs$;#zFgQc5_0+FA*~`{Dx9;Zh?gvXdzh7d zTkkRyNlV^%cwZ!xx1IpDAZ|5D1x6wAx1H0{rM< z06epT0@^3$kcGMk2W`KsA?!vy6)j3DoeS{GzEfF(JKHH z;`n%+5CVt(kxY^ly}5(^|0R>+s77b#cC3z+MHbZvDOiDEVdvW-;Bqv2`OMJpNX+`I z(=Mylvh-KSP>pyrO}LGrWp%-3Yk3P6d(Y25kc>VL*4qBUBPSH4u~j%F>&}Jc)-ZAZ zJ^!Q~R=U}Efh#Gj$_`T&qMMJj9#MQu_(X}~(+Tkj&lyqHlX!xUCi}26%=`w(q}n$> zBwXM3Bo;X=0J9Uh$-?YL=4v(^{>cCB{(EW_TVpt`i%YH6C=p}0{gFTg09&hx@Ne-QrhQ@VggqUgTET`zWiD)-|BU`{cYDFoX1i0nr-zm?4Y-lAyqE$qr-_j3H4xFQ?;a|XuCq! zt$Y(G^@`n?24wg_@JN^iqO1uSbp-VY%2ooKGD_Ww9 zyA38b-4z*RK~sU#ner$nXJjy)FxEsqD^oz#?zhL=(j+1ewqS@_z*KS=zp)dw?&h|R zP;MGkv?7%juhvg%6b}a5CVG0IBE!kqU&?rxWv*q*{01E6$uG`3s2e21;HsaHpuw>T zN|aMoYu&iLz}Heu%NlZ<3=RQVmL~N9X%?Fx-Bg~~J@Ylp1{a!I%I5SnP*Yqh8$btUs zQ=;XG;Km75VEqy2&uP6#$!Hp?vF$#crFJIl5geW%#yOh1Flf6)uOAChD|lg5PzTim7?vPI+HT)yz)GI9@G+l(D#1SZ=?@b`lN>&zM zJKYM-cOvGklJ*-P%cvdgUZrltWjT2d>X6eeed?306KaMz+Bnl1X?+eX!WosYy#Vs> z3f6JKB@y2=gZh(+8`}mn*L-g9Qew(!%vv(dABG4l>m0^XO1^?Y;ka6#)JaJQOY)l{ zM3Vu^BGhI~QiaN}^C@g%SPcOK-_{mHra!xF4ofOFS)g*^-N@DF*%W{3h!ZRoTW1Xy z7#hI;AT-HMlvC2=F%NAe;DnV^0f9S_AxAtJIyc|GP2svsef# z51G&yvkRP5F=d@=WjT*(*WB){x93tyG3V zHj4i%63KxkI+s*e7vvpiVigqB)oHzyOpM`*$;CFFw)E9|*#@yD?w%nc#;%AABbq)s4c|;QSG>VBZxV)S&-~o5Q4PS}n>F z7P30LhBdD^Es*uXc(E$j&U#0mXh=cLhGQY@Hf5k)SUjJxv`IU!?O~{r!^9zhVaKG0 z0#X+1cxO;*m7p|FBb%85ad3Tn1rVvoRgxcsI1iw7!du#JFV>`4f|R){@&)GZJM?tJ z4kt_b$cQU8RvDDB0&NMofwpnjnWHS*s5VUy0Jb@cmFQKQC1(l9!If@cZ8TE zj@b2|G)HA|YgR6BO0N;G_Cu+wwd>^i?=eI~)MKZMxq`QknlZx2aV2dS6W-+;XJ`x~GRu-gR)8*QtOoBENskFEOMqtHumOeS68bt7e0~L% zhE3Z%ygf6448ppFne;phz?(_Th!Cb;Rm@18P&3n1+BMUyXU){K6tfmH+A`$?s6A^W z`Zc9xj0N4$axCfjegGEJhZT?Od|l9O8^-#e!CsZ8|7mUD$7F!RD0T7jZ^og~G}kNE zHBsRbtjSKH9}#)hmNUAgo^n}r<1{#oEM+KcE^}Yr^M9uPx@3#P?{ms@5g%(^nr%iaF@4~QQsMcN_!n*bU0 zql8+4-s|=N`%`xe-u%gkQus3Yr^WdfLX|@a>>J`S^4~ zl%W7zUZx=%v02Ww`HpMk7ti>yzM=)eV~ta>-_()@nA42A5K;o;5?_1$Nz$pK(yi#` z+Y(WuvE6RvhxwD!I3g@8jAvTovUwA9uCeGtyv_Jug74mVY?rT$3ock$9EE4i<;tl> zz`6MiMv*AhLPLZO($VRG!jcMFv$94S*o%>vw z_;k0l1csibsV?Q-n@r2_-u$y#ci7V^sYmo@`!rTxI}&uqTlJkJ2Xh;4`sM9tS7Go4 zNi&!?m{<&bIHIYe8CN_9g3X!McNCe^OLSK-33#}W9cxaMmPx5A-*`+aGGp>xZZ3zD zc35jON9l<5l;@bFpnTHZRw=HSUVK%cGr5gpKgX1GoP-nkBk&*Si%s{NBAQ}8r@Ts~ zyV!OMd5z(!F%cPt>grN>F^{A51EZYNJ9ZtVSK7dZ`|uup2Rf{{>@e!O{eLLF znyvh{53jX&j6@P4Ui)l(9B{Bea;6=_&WBf~t%zQ$znd`!$=Fi7;TZ1w)#(&_cG7|Q4#HasGyGcQQfBzIO?iGj2 z8xmrl5d&DFri4T3)XRRZS>~+WR$W&DLF_T`ZMn;j*QBq>QxSb?CXW1BHAdSCp>4Ev z(l&4JL~Wrp6tmY`&d$i$mlofV_nJVMyi%LFXfLvwNMZTp$TpYn>Pu0Jx8S_G&02?B zaEWyy_3B7#Brg#_joS?#C|D1Sq~&&@s9JPQVEe9;IS8a>T3yh239bVV@?gPOiMFMi zzhDo`^tXX}z@Gd#32OXqkuAlN&WP}1!dKhtYT_kLm}QW3M2HaA)ZzOpwO+3>OwNi@ zTe@PT2Y+kl&)<`1;5$!>KUwB#)U>~@Y=0uTJ#6UvmTA)S$uv_pnz!(FX2P>6kzuJ* zJLCJ%*R~tOBblYab4KgAKJ%lcSd+@O536BV&WW_S3(GimbF9F;oTFAKAVWu=nETST z#oz-suLdUO8`YX>Qiw$g#iaCMtB(W1jQ$@@DNy}dVakb;Z0cm|-GoKJd7pV2srXIC zu+-EFg;O4)ro@@mB6v=-A9KnbZ`AbSj08KCFTn!zNrSK}R z4P^|FF_f-jt6F{=jlhKAz^Srk;1!#{<=x^c+QD5i=L3$S_f4qRBIZqRK-Kv)cchDu zgXSek_}8){rc2v=Ez6=2XTVn$D)M?;^PHd7E})-VqkFwOojOgdA!d`aS^x=gNriqy#8tQ_Cbi*CD~op zwKY#t0`j2hi14`-b0Q5Z_>bUd0ATq#jTaBxQ(R4Ti27bkL=7H9~L+53N97IJ!Gmyx2fWvycMKentE+2vTrpA;1I)&(3Y* zeT0!-2@vf+srP~u9v#14^nq&BNJ(la?Decrb(jy<0kpi-KExZH4t*5-KB7x$?H^~IFo%^ z)VfP$pngR9E2G)dcqw4m(?H1Wcm8OX_=`z#RQYRt!r?iS*}sYX)AJk`Tl)}S59 zjF!i>s!wx9%xP@G{BGusG^HIx4tczNR`ua*NJ*~B2AV?KrGF)?LI3O&)}M(VFE_cB zeQNbc@Q0rqO%Gcloa6DhKDbGZTJ+vaH}LG(BeSWeEmVI_%RIhd_I-CT#e(Y5I(PG|If9)a}+I1w}y7Rp(X`vo5pu<%XvJqq2y=eY=0`16kb{%02l(fK8!; zxkG@-gKeElDgJ5t8X>^!zJOgpfn|YpuLfm+bz^|JKNfz7|HU*W<^PKnmI2#pL}UKj zfd}IS_ow_POX9D&0qfOTuGAq!#b_?Zy1_8*5C2!CLT_;pZ-Bs!lK)vl8Nhujq5UWHzk`1~{~zBUr#8p&A0`{tzs{zwLVq)9(U|%#$ZU1m!RsXerK??@o)&3{RYNrQM)qnF5#M;|aFkEL_5=3D59tYRDi4&BBU1iUy zzH!K^hL&~vc>s4u)LQ_1{iMegy}E{pRzdEhpIZbI=$yd_g03CgAen% z!yGcAUjjiwKoU~4kLTF^YrU;5dZF(wpuwOgyVh3bkL$mOKHX1Kv%w=^c;B(p%sPC# zHroL3hJnyCvBO9+dhvuy(Hnq>1L(RxD(8xKXOC%GxmnSb)9nSt8Qkwg?e4d;@(+5O z?LPO8S7sT@?uW|`UrD#;4`8p5dAolXJVClQE};UXtlPmKy{>)=Wq2rNAuUY?PkEvf z_^7Sec{p?>FaVfSBi#zC`KU8${DhBBov%pG>eV|_vbH(8l55O2nQ_KbLtI+%55C3iHCINtAk}xWXX+lz&RdXVtqv9RqXOSSWOc!x;EaNB{s^PZB zeZzMg{r)m>da2jpalM(4UBrcXR#M<|M=AMwA)tCp{504VXRp!YM~B$%gGO{IKr{m) z0e^a0lo_j02?g;IL|%h%!k833LRvHlUWqdAK?Z1B#5kaw^Tn&|&(gp@U(>?XCKtk4 zC>YAgO3RxG8H_jhbnEf@pf;T=XNPu3klWk%h(on9)Dwef84QD(1!lF{t7E2pcBbF4k)eNmIqPsRx{!~%R)V`M5 zl@dxzgGVvO(qcTZ4?)|JqP8ZsF{!p{dz3^3gV-t}g8cqrreDsv=RNnn_k6g|eeQ?% zT>Gi5Jo_bKnTod{Ok=Q6Re!YhC&J3Y7T&=%?q=R}5+n0|*mUWOR%M-u)dh!|ueGdY zdhhN^%wmcGBBX%pdvu9hmQ4fds zlJG=9eTmO2`ZsaWWs%8dl9+UKrJp6eP?mI%W1btEsoLpaUvk#lq8~c6I~$7dm8K(P z^zN227~PyJpH>EjD;~kT6P0Xh!!L}0#x%oM5p11e1){@~^*OFrUv>TWaW>&qW?$5A z5au<#LRf=kKXuZen85YXOscL2xw#Gx)c zG~xw`pR^y~U&=fw8aC!~`;3v7heaAUhk;9RiXMERf42VSPd+~NZ*XqK5-cH55xQC4knhu2{T=d3n}dWcW8W@> zji6Ct^vaViQuC^kE*oOG#==Q?ruqHTm+IuvW?x}<1r6NbRbu2w z$3x5N$gj7=K+~7vDYGJE*4^tkON@S1rjTcwB_4$&WRnZ^AR}PUxR(oZ=}SL2 zjzAZ)=%d)>2O0w6(Sy_)&$2bLliUJ35x~{`n)wz2=BfHn+o|h7)BRZ`w(@y z0Iv&$UAfxdF_QtUwHkFcCs;+?XfY-A^FX_ z%#on%z40!o#Jz{+oCQWooD2%NmhTV`jLbW~DNShS*a7~Pnm%HNFalNRrw-WGv*0Gr zW11IsW)PG4Tyq1AClP@6+H#l*dj?HtdP~ALlwQ{cmoGcSHYcFuwuK zYu@QI5bT*5ltS7CNlgNE%{ZXOzfG0FZ)-xcu?C4IYpVjsLwn@Y7p+`T8$Zhrqs*~k zo6GbA{akgVmb3%9-6W&V5mJ<|)+0&o1{RTP3V`rlACKMTBWdjcp!%AF0jNN)Ft3ky z5E@u@`24!S29nj1q?Uo%d;6g^I1UxBgyv$={_E94V&W+eL{=MI#J_30m{(OAaGwrz z6d}>D2TobQs1-G(ci$qBI>#3R{n2LRngJAj;9-9ymE=G)jBVm`)zMi2mh36KY_72L zUx~ra_C0I)qWQ0Ir}vnt!}x8QsRUB7%|f@6GzaGE0tU47HT;``%%xLh`$x|+GoQ*C zgInBjCGL8>dpaMq$_RF^i=j?jXuGYRmp4jraBMW@Om0&|%ZG-#FMs8xENlmYgWMuJ zHGMl~aa^19UtUq%!lV1XBn`RbF`t#3%D5kk&}!u>{9N&5SdEg*MH;Qu0+S6%=B diff --git a/system_files/dls/modulefile/3.0 b/system_files/dls/modulefile/4.0 similarity index 61% rename from system_files/dls/modulefile/3.0 rename to system_files/dls/modulefile/4.0 index 29800bb0b..87663b845 100644 --- a/system_files/dls/modulefile/3.0 +++ b/system_files/dls/modulefile/4.0 @@ -13,46 +13,29 @@ proc ModulesHelp { } { module load global/directories + if { [info exists env(SAVUHOME)] } { set gitrepo $env(SAVUHOME) } -# Set RHEL 6 or 7 -# set redhatrelease [eval exec "cat /etc/redhat-release"] -# if { [regexp -nocase {release 6} $redhatrelease] } { -# set OS rhel6 -# } elseif { [regexp -nocase {release 7} $redhatrelease] } { -# set OS rhel7 -# } else { -# puts stderr "Incompatible operating system." -# } - -# # switch OS -# if { [info exists env(SWITCH_SAVU_OS)] } { -# if { [string equal $OS rhel7] } { -# set OS rhel6 -# } else { -# set OS rhel7 -# } -# } - -#============================================================================ -# When creating a new module, update these variables. -set savu_version 3.0 - -set mpi_version 3.1.4 -# if { [string equal $OS rhel6] } { -# set PYTHON_HOME $env(softwaredir)/savu/2.4_RHEL6/miniconda -# setenv SAVU_PLUGINS_PATH /dls_sw/apps/savu/2.4_RHEL6/savu_plugins -# #puts stderr "\tLoading Savu for RHEL 6" -# } else { - set PYTHON_HOME $env(softwaredir)/savu/3.0_RHEL7/savu - # set PYTHON_HOME $env(softwaredir)/savu/3.0_RHEL7/miniconda - setenv SAVU_PLUGINS_PATH /dls_sw/apps/savu/3.0_RHEL7/savu_plugins - #puts stderr "\tLoading Savu for RHEL 7" -# } - -#============================================================================ + +set hostname [eval exec "cat /proc/sys/kernel/hostname"] +if { [regexp -nocase {cs03r-sc-serv-39} $hostname] } { + puts stderr "\t Unfortunately Savu won't work on this node, please start a new nx session." + exit +} elseif { [regexp -nocase {cs03r-sc-serv-40} $hostname] } { + puts stderr "\t Unfortunately Savu won't work on this node, please start a new nx session." + exit +} else { + #============================================================================ + # When creating a new module, update these variables. + set savu_version 4.0 + set mpi_version 4.1.1 + set PYTHON_HOME /dls_sw/apps/savu/4.0/miniconda + set hebi /dls_sw/apps/savu/hebi + #============================================================================ +} + set mach $tcl_platform(machine) module-whatis "loads Savu version $savu_version" @@ -74,6 +57,7 @@ if { [module-info mode load] } { module load openmpi/$mpi_version } + if { ! [info exists env(SAVU_PRERELEASE)] } { puts stderr "\n\t\t ********************************************" puts stderr "\t\t * Loading Savu version $savu_version *" @@ -91,37 +75,35 @@ if { [module-info mode load] } { module unload openmpi/$mpi_version } - # TODO is this necessary? SAVUHOME seems like a user-set environment - # so we shouldn't automatically delete it - # if { [info exists env(SAVUHOME)] } { - # unsetenv SAVUHOME - # puts stderr "Cleaning up SAVUHOME" - # } - - # if { [info exists env(SWITCH_SAVU_OS)] } { - # unsetenv SWITCH_SAVU_OS - # puts stderr "Cleaning up SWITCH_SAVU_OS" - # } + if { [info exists env(SAVUHOME)] } { + unsetenv SAVUHOME + puts stderr "Cleaning up SAVUHOME" + } + } setenv PYTHONNOUSERSITE True prepend-path PATH $PYTHON_HOME/bin +prepend-path PATH $hebi module add fastxrf set-alias "savu_mpi" "savu_launcher.sh -s $savu_version" set-alias "savu_mpi_auto" "savu_launcher.sh -s $savu_version -t AUTO" set-alias "savu_mpi_preview" "savu_launcher.sh -s $savu_version -t PREVIEW" +set-alias "savu_mpi_com14" "savu_launcher.sh -s $savu_version -t BIG" if { [info exists gitrepo] } { prepend-path PATH $gitrepo prepend-path PYTHONPATH $gitrepo + prepend-path PYTHONPATH $gitrepo/scripts # required for the configurators set-alias "savu_mpi_dev" "$gitrepo/system_files/dls/mpi/savu_launcher.sh -s $savu_version -i" set-alias "savu_mpi_local" "$gitrepo/system_files/dls/mpi/savu_mpijob_local.sh" - set-alias "savu_config" "python $gitrepo/scripts/config_generator/savu_config.py" + set-alias "savu_config" "python -m config_generator.savu_config" set-alias "savu" "python $gitrepo/savu/tomo_recon.py" set-alias "savu_citations" "python $gitrepo/scripts/citation_extractor/citation_extractor.py" } else { set-alias "savu" "savu -s cs04r-sc-serv-14" set-alias "savu_mpi_local" "savu_mpijob_local.sh" } + From d85314bd866e789e96b0254bea5ebf14deed9a9d Mon Sep 17 00:00:00 2001 From: nicwade Date: Tue, 13 Jul 2021 14:12:26 +0100 Subject: [PATCH 10/10] Adds basic installation notes --- install/installation_notes.txt | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 install/installation_notes.txt diff --git a/install/installation_notes.txt b/install/installation_notes.txt new file mode 100644 index 000000000..a0fbbb688 --- /dev/null +++ b/install/installation_notes.txt @@ -0,0 +1,22 @@ +Installation notes (for creating a new release and installing at Diamond) +========================================================================= + +- Freeze on pull requests +- Install latest version of Savu from Master into /dls_sw/apps/savu +- Create savu_plugins folder in /dls_sw/apps/savu/$release/ +- Create a new module file +- Test new installation +- Update Savu/install/latest_version.py to contain the new version number (and the corresponding file) +- Update installation notes with the latest tested versions of libraries +- Create tar.gz of the new install folder + >>> tar -zcvf savu_installer.tar.gz Savu/install/savu_hpc/savu_installer +- Push all changes to Github (ensure all tests passing) and check download link works correctly +- Collate release notes + Get all Git commits since the last release: git log --oneline v3.0.. HEAD > a.txt + Get all Git files added since the last release: git diff v3.0 HEAD --name-status | grep A +- Create release on Github +- Reinstall Savu into new release Conda environment +- Further testing +- (Make this module default load if during shutdown) +- Email beamlines +