Source code for ewoksid22.extract
import os
import shutil
import subprocess
from ewokscore import Task
from . import topas_extract
from . import dirutils
[docs]
class ID22TopasExtract(
Task,
input_names=["filename", "inp_file"],
optional_input_names=[
"entries",
"tth_min",
"tth_max",
"full_tth",
"outdirs",
"outprefix",
"primary_outdir",
"inp_step",
"startp",
],
):
[docs]
def run(self):
in_file = self.get_input_value("filename", None)
scans = self.get_input_value("entries", None)
if scans:
scans = sorted({int(float(s)) for s in scans})
assert len(scans) == 1, f"Extract only 1 scan ({scans})"
tth_min = self.get_input_value("tth_min", None)
tth_max = self.get_input_value("tth_max", None)
full_tth = self.get_input_value("full_tth", False)
outdirs = self.get_input_value("outdirs", dict())
primary_outdir = self.get_input_value("primary_outdir", None)
outdirs = dirutils.prepare_outdirs(outdirs, primary_outdir)
out_file = os.path.splitext(os.path.basename(in_file))[0]
if not self.missing_inputs.outprefix:
out_file = self.inputs.outprefix + "_" + out_file
out_file = out_file + "_calib"
# TODO: use all outdirs
rootpath = os.path.join(outdirs["primary"][1], out_file)
savepath_xye = os.path.join(rootpath, "topas_extract")
savepath_inp = os.path.join(rootpath, "topas_refine")
os.makedirs(savepath_xye, exist_ok=True)
os.makedirs(savepath_inp, exist_ok=True)
topas_extract.run(
in_file,
out_file,
scans=scans,
savepath=savepath_xye,
min_usr_tth=tth_min,
max_usr_tth=tth_max,
full_tth=full_tth,
)
scannr = scans[0]
savepath_xye = os.path.relpath(savepath_xye, savepath_inp)
xye_files = os.path.join(savepath_xye, out_file + f"_s{scannr}_MA")
inp_file = self.inputs.inp_file
inp_step = self.get_input_value("inp_step", 2)
startp = self.get_input_value("startp", 31)
inp_file_cp = os.path.join(savepath_inp, os.path.basename(inp_file))
shutil.copyfile(inp_file, inp_file_cp)
# Modify inp_file_cp and save xdds.inp
args = [
"gen_xdds_file",
xye_files,
os.path.basename(inp_file_cp),
0,
topas_extract.NUM_CHANNELS - 1,
startp,
topas_extract.X_HIGH,
inp_step,
]
args = list(map(str, args))
proc = subprocess.Popen(
args, stdout=subprocess.PIPE, cwd=os.path.dirname(inp_file_cp)
)
try:
outs, errs = proc.communicate(timeout=120)
except subprocess.TimeoutExpired:
proc.kill()
raise
with open(os.path.join(savepath_inp, "xdds.inp"), "wb") as f:
f.write(outs)