diff --git a/invisible_cities/cities/components.py b/invisible_cities/cities/components.py index e25823a55..97e15d2c2 100644 --- a/invisible_cities/cities/components.py +++ b/invisible_cities/cities/components.py @@ -42,6 +42,7 @@ from .. core .random_sampling import NoiseSampler from .. detsim import buffer_functions as bf from .. detsim .sensor_utils import trigger_times +from .. detsim .sensor_utils import get_rate_safe from .. detsim .sensor_utils import create_timestamp from .. reco import calib_functions as cf from .. reco import sensor_functions as sf @@ -507,13 +508,15 @@ def hits_and_kdst_from_files(paths: List[str]) -> Iterator[Dict[str,Union[HitCol timestamp = timestamp) -def MC_hits_from_files(files_in : List[str]) -> Generator: +def MC_hits_from_files(files_in : List[str], rate: float) -> Generator: + rate = get_rate_safe(rate) for filename in files_in: try: hits_df = load_mchits_df(filename) except tb.exceptions.NoSuchNodeError: continue for evt, hits in hits_df.groupby(level=0): + timestamp = create_timestamp(evt, rate) yield dict(event_number = evt, x = hits.x .values, y = hits.y .values, @@ -521,7 +524,7 @@ def MC_hits_from_files(files_in : List[str]) -> Generator: energy = hits.energy.values, time = hits.time .values, label = hits.label .values, - timestamp = 0) + timestamp = timestamp) def sensor_data(path, wf_type): diff --git a/invisible_cities/cities/detsim.py b/invisible_cities/cities/detsim.py index 0bf39dfd0..2945ae609 100644 --- a/invisible_cities/cities/detsim.py +++ b/invisible_cities/cities/detsim.py @@ -121,7 +121,7 @@ def get_bin_edges(pmt_wfs, sipm_wfs): @city def detsim(*, files_in, file_out, event_range, print_mod, compression, detector_db, run_number, s1_lighttable, s2_lighttable, sipm_psf, - buffer_params, physics_params): + buffer_params, physics_params, rate): physics_params_ = physics_params.copy() @@ -199,7 +199,7 @@ def detsim(*, files_in, file_out, event_range, print_mod, compression, , int(buffer_params["length"] / buffer_params["sipm_width"])) write_nohits_filter = fl.sink(event_filter_writer(h5out, "active_hits"), args=("event_number", "passed_active")) - result = fl.push(source= MC_hits_from_files(files_in), + result = fl.push(source= MC_hits_from_files(files_in, rate), pipe = fl.pipe( fl.slice(*event_range, close_all=True) , event_count_in.spy , print_every(print_mod) diff --git a/invisible_cities/config/detsim.conf b/invisible_cities/config/detsim.conf index 0941e4b9c..0b1ea8a0a 100644 --- a/invisible_cities/config/detsim.conf +++ b/invisible_cities/config/detsim.conf @@ -34,3 +34,5 @@ compression = "ZLIB4" # How frequently to print events print_mod = 1 + +rate = 0.5 * hertz diff --git a/invisible_cities/database/test_data/detsim_new_kr83m_fast.newformat.sim.h5 b/invisible_cities/database/test_data/detsim_new_kr83m_fast.newformat.sim.h5 index 2ae459ddd..1c7e15f41 100644 --- a/invisible_cities/database/test_data/detsim_new_kr83m_fast.newformat.sim.h5 +++ b/invisible_cities/database/test_data/detsim_new_kr83m_fast.newformat.sim.h5 @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e5a32705bb22ba9811d1ff625e182a2cc54e1fa13ee4c13d9220c10f73aacf3c -size 54677 +oid sha256:657244d292063d9bcb54d8bced757b7a0d883c079d6d32eebee21a53f2b12a1f +size 57661 diff --git a/invisible_cities/detsim/sensor_utils.py b/invisible_cities/detsim/sensor_utils.py index f2c21856d..95e3fa62d 100644 --- a/invisible_cities/detsim/sensor_utils.py +++ b/invisible_cities/detsim/sensor_utils.py @@ -1,6 +1,7 @@ import numpy as np import tables as tb import pandas as pd +import warnings from typing import Callable from typing import List @@ -14,6 +15,27 @@ from .. io .mcinfo_io import get_sensor_binning +def get_rate_safe(rate: float) -> float: + """ + Get rate value safely, and if it is zero, raise a warning. + + Parameters + ---------- + rate : float + Value of the rate. + + Returns + ------- + rate if rate != 0, else rate = 0.5 + """ + if rate == 0: + warnings.warn("Zero rate is unphysical, using default " + "rate of 0.5 Hz instead") + return 0.5 / units.ms + else: + return rate + + def create_timestamp(event_number: Union[int, float], rate : float ) -> float: """ diff --git a/invisible_cities/detsim/sensor_utils_test.py b/invisible_cities/detsim/sensor_utils_test.py index 0b403bf25..353e841f0 100644 --- a/invisible_cities/detsim/sensor_utils_test.py +++ b/invisible_cities/detsim/sensor_utils_test.py @@ -12,6 +12,7 @@ from . sensor_utils import pmt_and_sipm_bin_width from . sensor_utils import trigger_times from . sensor_utils import create_timestamp +from . sensor_utils import get_rate_safe def test_trigger_times(): @@ -115,3 +116,15 @@ def test_create_timestamp_greater_with_greater_eventnumber(): assert abs(timestamp_1) == timestamp_1 assert timestamp_1 < timestamp_2 assert abs(timestamp_2) == timestamp_2 + + +@mark.filterwarnings("ignore:Zero rate") +def test_get_rate_safe_allways_possitive(): + """ + Be sure that it woll always return the rate value such that + it is never unphysical. + """ + + rate = 0 + assert get_rate_safe(rate) > 0 +