added JF_stack calculator

This commit is contained in:
2025-11-11 15:52:03 +01:00
parent a70ef5caa2
commit ed645874dc
2 changed files with 52 additions and 1 deletions

View File

@@ -2,6 +2,7 @@ import re
from collections import defaultdict, deque
from pathlib import Path
from typing import Optional
import logging
import numpy as np
from matplotlib import pyplot as plt
@@ -13,8 +14,11 @@ from sfdata import SFDataFiles, sfdatafile, SFScanInfo
from joblib import Memory
from . import utils
from . import channels
from .utils import ROI
logger = logging.getLogger(__name__)
def setup_cachedirs(pgroup=None, cachedir=None):
"""
Sets the path to a persistent cache directory either from the given p-group (e.g. "p20841")
@@ -329,6 +333,51 @@ def perform_image_roi_crop(
return np.array(rois_within_batch)
@memory.cache()
def calculate_JF_stacks(scan : SFScanInfo,
lower_cutoff_threshold=7.6,
exclude_steps: list[int] | None = None,
recompute : bool=False,
detector : str = "JF16T03V02"):
"""Calculate image stacks for JF detectors in a scan."""
stacks = []
I0_norms = []
for i, step in enumerate(scan):
if exclude_steps is not None and i in exclude_steps:
logger.info(f"skipping step {i}")
continue
#subset = step["JF17T16V01", "JF20T01V01"]
JF_channels = [channels.JF, channels.JF_8M, channels.JF_I0, channels.GASMONITOR]
available_channels = [ch.name for ch in step.channels]
selected_channels = [ch for ch in JF_channels if ch in available_channels]
subset = step[*selected_channels] # only I0 for test cases
pids_before = len(subset.pids)
subset.drop_missing()
pids_after = len(subset.pids)
if pids_before != pids_after:
logger.warning(f"Step {i}: dropped {pids_before - pids_after} pulse IDs due to missing data.")
# we only consider the JF files here
files = [f.fname for f in step.files if "JF" in f.fname]
stack = perform_image_stack_sum(files, channel=detector,
lower_cutoff_threshold=lower_cutoff_threshold)
stacks.append(stack)
# TODO: define roi for I0 detector
stack_I0 = perform_image_roi_crop(files, channel=channels.JF_I0, lower_cutoff=2,)
I0_norm = np.sum(stack_I0, axis=(1, 2))
I0_norms.append(I0_norm)
return stacks, I0_norms
@memory.cache(ignore=["batch_size"]) # we ignore batch_size for caching purposes
def calculate_image_histograms(
filesets,

View File

@@ -100,8 +100,10 @@ class UnfinishedScanInfo(SFScanInfo):
def is_finished_scan(fname):
""" If the scan.json file is complete, valid and the files are on the disk the scan is finished.
This does not cover the case where a scan is interrupted and continued later.
It also relies on the behavior of RA that the scan.json is only fully written at the end of the scan.
It also relies on the behavior of RA that the scan.json is only fully written at the end of the scan."""
TODO: A clear criterion for a finished scan would be that another later scan exists."""
try:
content = json_load(fname)
files = [file for step in content['scan_files'] for file in step]