import glob from pathlib import Path import boost_histogram as bh import numpy as np def get_first_file(path : Path, file_prefix : str): """ Get the first file with lowest index in directory that matches the given prefix. """ first_file = min(path.glob(f'{file_prefix}*'), default=None) if first_file is None: raise ValueError(f"No files found in {path} with prefix {file_prefix}") return first_file def save_fit_parameters(fit_params : dict, output_file : Path): """ Save the fit parameters to a text file. Parameters ---------- fit_params : dict The fit parameters to save. output_file : Path The path to the output file. """ with open(output_file, 'w') as f: for key, value in fit_params.items(): f.write(f"{key}: {value}\n") def create_histogram_from_data(data : np.ndarray, bin_range : tuple[float, float] = None, bin_width : float = None) -> bh.Histogram: """ Create a histogram from the given data. Parameters ---------- data : np.ndarray The data to create the histogram from. bin_range : tuple[float, float], optional The range of the bins. Default is None, which means the range is determined from the data. bin_width : float, optional The width of each bin. Default is None, which means the number of bins is determined automatically. Returns ------- bh.Histogram The created boost histogram. """ if bin_range is None: min = np.min(data) max = np.max(data) bin_range = (min - 0.05*(max - min), max + 0.05*(max - min)) # add 5% margin to the range if bin_width is None: bins = 200 # 0.5 % else: bins = int((bin_range[1] - bin_range[0]) / bin_width) hist = bh.Histogram(bh.axis.Regular(bins, bin_range[0], bin_range[1])) hist.fill(data) return hist