Source code for laue_dials.command_line.plot_wavelengths
#!/usr/bin/env python
"""
This script histograms the wavelengths present in a reflection table.
"""
import logging
import sys
import libtbx.phil
from dials.util import show_mail_handle_errors
from dials.util.options import (ArgumentParser,
reflections_and_experiments_from_files)
from matplotlib import pyplot as plt
from laue_dials.utils.version import laue_version
# Print laue-dials + DIALS versions
laue_version()
logger = logging.getLogger("laue-dials.command_line.plot_wavelengths")
help_message = """
This script generates a histogram of the wavelengths present in a DIALS reflection table.
This program takes a DIALS reflection table that contains a wavelength
column and produces a histogram of the wavelengths present in the
reflection table.
Examples:
laue.plot_wavelengths [options] FILENAME.refl
"""
# Set the phil scope
phil_scope = libtbx.phil.parse(
"""
show = True
.type = bool
.help = "Whether to display the generated histogram."
save = False
.type = bool
.help = "Whether to save the generated histogram."
output = "wavelengths.png"
.type = str
.help = "The filename for the generated histogram."
refined_only = False
.type = bool
.help = "Only histogram wavelengths of refined reflections."
n_bins = 30
.type = int
.help = "The number of bins to histogram wavelengths with."
lam_min = None
.type = int
.help = "The lower limit for wavelength plot in Angstroms."
lam_max = None
.type = int
.help = "The upper limit for wavelength plot in Angstroms."
log = 'laue.plot_wavelengths.log'
.type = str
.help = "The log filename."
""",
process_includes=True,
)
working_phil = phil_scope.fetch(sources=[phil_scope])
[docs]
@show_mail_handle_errors()
def run(args=None, *, phil=working_phil):
"""
Run the script to histogram the wavelengths present in a reflection table.
Args:
args (list): Command-line arguments.
phil: The phil scope for the program.
Returns:
None
"""
# Parse arguments
usage = "laue.plot_wavelengths [options] FILENAME.refl"
parser = ArgumentParser(
usage=usage,
phil=working_phil,
read_experiments=True,
read_reflections=True,
check_format=False,
epilog=help_message,
)
params, options = parser.parse_args(args=args, show_diff_phil=False)
# Configure logging
console = logging.StreamHandler(sys.stdout)
fh = logging.FileHandler(params.log, mode="w", encoding="utf-8")
loglevel = logging.INFO
logger.addHandler(fh)
logger.addHandler(console)
logging.captureWarnings(True)
warning_logger = logging.getLogger("py.warnings")
warning_logger.addHandler(fh)
warning_logger.addHandler(console)
dials_logger = logging.getLogger("dials")
dials_logger.addHandler(fh)
dials_logger.addHandler(console)
dxtbx_logger = logging.getLogger("dxtbx")
dxtbx_logger.addHandler(fh)
dxtbx_logger.addHandler(console)
xfel_logger = logging.getLogger("xfel")
xfel_logger.addHandler(fh)
xfel_logger.addHandler(console)
logger.setLevel(loglevel)
dials_logger.setLevel(loglevel)
dxtbx_logger.setLevel(loglevel)
xfel_logger.setLevel(loglevel)
fh.setLevel(loglevel)
# Log diff phil
diff_phil = parser.diff_phil.as_str()
if diff_phil != "":
logger.info("The following parameters have been modified:\n")
logger.info(diff_phil)
# Load reflection data
if not params.input.reflections:
parser.print_help()
return
refls, _ = reflections_and_experiments_from_files(
params.input.reflections, params.input.experiments
)
refls = refls[0]
# refls = flex.reflection_table.from_file(params.input.reflections)
if params.refined_only:
refls = refls.select(refls.get_flags(refls.flags.used_in_refinement))
if len(refls) == 0:
logger.info("No reflections in table after filtering.")
return
# Read wavelengths
try:
lams = refls["wavelength"].as_numpy_array()
except:
logger.info(
"Wavelength data could not be read. Please check to ensure there is a populated wavelength column in the reflection table."
)
return
# Apply wavelength restrictions
initial_count = len(lams)
if params.lam_min is not None:
lams = lams[lams >= params.lam_min]
if params.lam_max is not None:
lams = lams[lams <= params.lam_max]
if initial_count != len(lams):
logger.info(
"Wavelength restrictions have removed some reflections. Plot will not reflect entirety of the data."
)
fig = plt.figure()
plt.hist(lams, bins=params.n_bins)
plt.title("Wavelength Spectrum")
plt.xlabel("Wavelength (Angstroms)")
plt.ylabel("Number of reflections")
if params.save:
fig.savefig(params.output)
if params.show:
plt.show()
if __name__ == "__main__":
run()