#!/usr/bin/env python
# -*- coding: utf-8 -*-
import argparse
import sys
import os
import h5py
import tomoscan.validator
from tomoscan.esrf.scan.nxtomoscan import NXtomoScan
from tomoscan.esrf.scan.edfscan import EDFTomoScan
[docs]
def get_scans(path, entries: str):
path = os.path.abspath(path)
res = []
if EDFTomoScan.is_tomoscan_dir(path):
res.append(EDFTomoScan(scan=path))
elif NXtomoScan.is_tomoscan_dir(path):
if entries == "__all__":
entries = NXtomoScan.get_valid_entries(path)
for entry in entries:
res.append(NXtomoScan(path, entry))
else:
raise TypeError(f"{path} does not looks like a folder containing .EDF or a valid nexus file ")
return res
[docs]
def main():
argv = sys.argv
parser = argparse.ArgumentParser(description="Check if provided scan(s) seems valid to be reconstructed.")
parser.add_argument("path", help="Data to validate (h5 file, edf folder)")
parser.add_argument("entries", help="Entries to be validated (in the case of a h5 file)", nargs="*")
parser.add_argument(
"--ignore-dark",
help="Do not check for dark",
default=True,
action="store_false",
dest="check_dark",
)
parser.add_argument(
"--ignore-flat",
help="Do not check for flat",
default=True,
action="store_false",
dest="check_flat",
)
parser.add_argument(
"--no-phase-retrieval",
help="Check scan energy, distance and pixel size",
dest="check_phase_retrieval",
default=True,
action="store_false",
)
parser.add_argument(
"--check-nan",
help="Check frames if contains any nan.",
dest="check_nan",
default=False,
action="store_true",
)
parser.add_argument(
"--skip-links-check",
"--no-link-check",
help="Check frames dataset if have some broken links.",
dest="check_vds",
default=True,
action="store_false",
)
parser.add_argument(
"--all-entries",
help="Check all entries of the files (for HDF5 only for now)",
default=False,
action="store_true",
)
parser.add_argument(
"--extend",
help="By default it only display items with issues. Extend will display them all",
dest="only_issues",
default=True,
action="store_false",
)
options = parser.parse_args(argv[1:])
if options.all_entries is True:
entries = "__all__"
else:
if len(options.entries) == 0 and h5py.is_hdf5(options.path):
entries = "__all__"
else:
entries = options.entries
scans = get_scans(path=options.path, entries=entries)
if len(scans) == 0:
raise ValueError(f"No scan found from file:{options.path}, entries:{options.entries}")
for scan in scans:
validator = tomoscan.validator.ReconstructionValidator(
scan=scan,
check_phase_retrieval=options.check_phase_retrieval,
check_values=options.check_nan,
check_vds=options.check_vds,
check_dark=options.check_dark,
check_flat=options.check_flat,
)
sys.stdout.write(validator.checkup(only_issues=options.only_issues))
return 0
if __name__ == "__main__":
main()