Source code for nabu.app.reconstruct_helical
from .. import version
from ..resources.utils import is_hdf5_extension
from ..pipeline.config import parse_nabu_config_file
from ..pipeline.config_validators import convert_to_int
from .cli_configs import ReconstructConfig
from .utils import parse_params_values
from .reconstruct import update_reconstruction_start_end, get_log_file
[docs]
def main_helical():
ReconstructConfig["dry_run"] = {
"help": "Stops after printing some information on the reconstruction layout.",
"default": 0,
"type": int,
}
ReconstructConfig["diag_zpro_run"] = {
"help": "run the pipeline without reconstructing but collecting the contributing radios slices for angles theta+n*360. The given argument is the number of thet in the interval [0 ,180[. The same number is taken if available in [180,360[. And the whole is repated is available in [0,360[ for a total of 4*diag_zpro_run possible exctracted contributions",
"default": 0,
"type": int,
}
args = parse_params_values(
ReconstructConfig,
parser_description=f"Perform a helical tomographic reconstruction",
program_version="nabu " + version,
)
# Imports are done here, otherwise "nabu --version" takes forever
from ..pipeline.helical.processconfig import ProcessConfig
from ..pipeline.helical.helical_reconstruction import HelicalReconstructorRegridded
#
# A crash with scikit-cuda happens only on PPC64 platform if and nvidia-persistenced is running.
# On such machines, a warm-up has to be done.
import platform
if platform.machine() == "ppc64le":
try:
from silx.math.fft.cufft import CUFFT
except: # can't catch narrower - cublasNotInitialized requires cublas !
CUFFT = None
#
logfile = get_log_file(args["logfile"], args["log_file"], forbidden=[args["input_file"]])
conf_dict = parse_nabu_config_file(args["input_file"])
update_reconstruction_start_end(conf_dict, args["slice"].strip())
proc = ProcessConfig(conf_dict=conf_dict, create_logger=logfile)
logger = proc.logger
if "rotate_projections" in proc.processing_steps:
message = """ The rotate_projections step is activated. The Helical pipelines are not yet suited for projection rotation
it will soon be implemented. For the moment
you should desactivate the rotation options in nabu.conf
"""
raise ValueError(message)
# Determine which reconstructor to use
reconstructor_cls = None
phase_method = None
if "phase" in proc.processing_steps:
phase_method = proc.processing_options["phase"]["method"]
# fix the reconstruction roi if not given
if "reconstruction" in proc.processing_steps:
rec_config = proc.processing_options["reconstruction"]
rot_center = rec_config["rotation_axis_position"]
Nx, Ny = proc.dataset_info.radio_dims
if proc.nabu_config["reconstruction"]["auto_size"]:
if 2 * rot_center > Nx:
w = int(round(2 * rot_center))
else:
w = int(round(2 * Nx - 2 * rot_center))
rec_config["start_x"] = int(round(rot_center - w / 2))
rec_config["end_x"] = int(round(rot_center + w / 2))
rec_config["start_y"] = rec_config["start_x"]
rec_config["end_y"] = rec_config["end_x"]
reconstructor_cls = HelicalReconstructorRegridded
logger.debug("Using pipeline: %s" % reconstructor_cls.__name__)
# Get extra options
extra_options = {
"gpu_mem_fraction": args["gpu_mem_fraction"],
"cpu_mem_fraction": args["cpu_mem_fraction"],
}
extra_options.update(
{
##### ??? "use_phase_margin": args["use_phase_margin"],
"max_chunk_size": args["max_chunk_size"] if args["max_chunk_size"] > 0 else None,
"phase_margin": args["phase_margin"],
"dry_run": args["dry_run"],
"diag_zpro_run": args["diag_zpro_run"],
}
)
R = reconstructor_cls(proc, logger=logger, extra_options=extra_options)
R.reconstruct()
if not R.dry_run:
R.merge_data_dumps()
if is_hdf5_extension(proc.nabu_config["output"]["file_format"]):
R.merge_hdf5_reconstructions()
R.merge_histograms()
# here we have been called by the cli. The return value 0 means OK
return 0
if __name__ == "__main__":
main_helical()