From f25bc86421256105b90595e452cc9291cc311b1a Mon Sep 17 00:00:00 2001 From: Elli Sophie Jobst Date: Mon, 12 Dec 2022 14:34:33 +0100 Subject: [PATCH 01/26] Changes in configuration to move to ctapipe v0.17 --- setup.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/setup.py b/setup.py index ffadd98e..cb7819fa 100644 --- a/setup.py +++ b/setup.py @@ -16,10 +16,14 @@ use_scm_version={"write_to": os.path.join("ctapipe_io_magic", "_version.py")}, packages=find_packages(), install_requires=[ - 'ctapipe~=0.12.0', - 'astropy>=4.0.5,<5', - 'uproot~=4.1', - 'numpy', + 'ctapipe~=0.17', + 'astropy~=5.0', + 'bokeh~=2.0', + 'eventio>=1.9.1', + 'uproot~=4.2', + 'traitlets~=5.0,>=5.0.5', + 'tables~=3.4', + 'numpy>=1.17', 'scipy' ], package_data={ From c148fda0899da9fae9618f11ab356d5d6c1d3035 Mon Sep 17 00:00:00 2001 From: Elli Sophie Jobst Date: Mon, 12 Dec 2022 14:54:01 +0100 Subject: [PATCH 02/26] Changed config to ctapipe v0.17 --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index dce3da28..4cc4d45f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,8 +12,8 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: [3.7] - ctapipe-version: [v0.12.0] + python-version: [3.9] + ctapipe-version: [v0.17.0] steps: - uses: actions/checkout@v2 From 5ee2e316a1bf7ad8338532658d9ec56565a01ae0 Mon Sep 17 00:00:00 2001 From: Elli Sophie Jobst Date: Mon, 12 Dec 2022 15:15:48 +0100 Subject: [PATCH 03/26] Changed configuration to move to ctapipe v0.17.0 --- environment.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/environment.yml b/environment.yml index 5fcd3505..9ff38c23 100644 --- a/environment.yml +++ b/environment.yml @@ -1,13 +1,14 @@ name: magicio channels: + - conda-forge - default dependencies: - - astropy>=4.0.5,<5 - - python=3.7 - - conda-forge::ctapipe=0.12 - - conda-forge::eventio - - conda-forge::corsikaio - - traitlets + - astropy~=5.0 + - python=3.9 + - ctapipe=0.17 + - eventio>=1.9.1 + - corsikaio + - traitlets~=5.0,>=5.0.5 - zeromq - ipython - numba @@ -21,4 +22,4 @@ dependencies: - h5py - pip: - pytest_runner - - uproot~=4.1 \ No newline at end of file + - uproot~=4.2 \ No newline at end of file From 780368b5775715b8d602dc5d5e93f44029af00e0 Mon Sep 17 00:00:00 2001 From: Alessio Berti Date: Mon, 12 Dec 2022 16:40:50 +0100 Subject: [PATCH 04/26] Update ci.yml --- .github/workflows/ci.yml | 41 +++++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4cc4d45f..0bc05ba5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,33 +12,39 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: [3.9] - ctapipe-version: [v0.17.0] + python-version: ["3.8", "3.9", "3.10"] + ctapipe-version: ["v0.17.0",] + + defaults: + run: + shell: bash -exl {0} steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 with: fetch-depth: 0 - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v2 - with: + - name: Set python version + env: python-version: ${{ matrix.python-version }} + run: | + sed -i -e "s/- python=.*/- python=$PYTHON_VERSION/g" environment.yml - - name: Install dependencies + - name: Create and activate env + uses: conda-incubator/setup-miniconda@v2 + with: + mamba-version: "*" + use-mamba: true + activate-environment: ci + environment-file: environment.yml + + - name: install env: - PYTHON_VERSION: ${{ matrix.python-version }} CTAPIPE_VERSION: ${{ matrix.ctapipe-version }} - run: | - . $CONDA/etc/profile.d/conda.sh - conda config --set always_yes yes --set changeps1 no - sed -i -e "s/- python=.*/- python=$PYTHON_VERSION/g" environment.yml - conda env create -n ci -f environment.yml - conda activate ci + pip install -e . # we install ctapipe using pip to be able to select any commit, e.g. the current master pip install pytest-cov "git+https://github.com/cta-observatory/ctapipe@$CTAPIPE_VERSION" - pip install -e . git describe --tags - name: Download test data @@ -53,9 +59,6 @@ jobs: run: | # github actions starts a new shell for each "step", so we need to # activate our env again - source $CONDA/etc/profile.d/conda.sh - conda activate ci - coverage run -m pytest -v - coverage xml + pytest --cov=ctapipe_io_magic --cov-report=xml - uses: codecov/codecov-action@v1 From c4756c9448104ff00943539e924e6e225f7a4167 Mon Sep 17 00:00:00 2001 From: Alessio Berti Date: Tue, 13 Dec 2022 10:37:33 +0100 Subject: [PATCH 05/26] Update environment and setup files. --- environment.yml | 9 ++++----- setup.py | 8 ++------ 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/environment.yml b/environment.yml index 9ff38c23..19e0f1de 100644 --- a/environment.yml +++ b/environment.yml @@ -3,16 +3,15 @@ channels: - conda-forge - default dependencies: - - astropy~=5.0 - - python=3.9 + - astropy=5 + - python=3.10 - ctapipe=0.17 - - eventio>=1.9.1 + - eventio - corsikaio - - traitlets~=5.0,>=5.0.5 - zeromq - ipython - numba - - numpy>=1.18 + - numpy=1.22 - numpydoc - pytest - pyyaml diff --git a/setup.py b/setup.py index cb7819fa..792b5ed7 100644 --- a/setup.py +++ b/setup.py @@ -15,16 +15,12 @@ setup( use_scm_version={"write_to": os.path.join("ctapipe_io_magic", "_version.py")}, packages=find_packages(), + python_requires = >=3.8 install_requires=[ 'ctapipe~=0.17', 'astropy~=5.0', - 'bokeh~=2.0', - 'eventio>=1.9.1', 'uproot~=4.2', - 'traitlets~=5.0,>=5.0.5', - 'tables~=3.4', - 'numpy>=1.17', - 'scipy' + 'numpy>=1.20', ], package_data={ 'ctapipe_io_magic': ['resources/*'], From 726ca052925a400dd8a20257034ac84722e0baf3 Mon Sep 17 00:00:00 2001 From: Alessio Berti Date: Tue, 13 Dec 2022 10:46:35 +0100 Subject: [PATCH 06/26] Update setup. --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 792b5ed7..0310120c 100644 --- a/setup.py +++ b/setup.py @@ -15,8 +15,8 @@ setup( use_scm_version={"write_to": os.path.join("ctapipe_io_magic", "_version.py")}, packages=find_packages(), - python_requires = >=3.8 install_requires=[ + 'python>=3.8', 'ctapipe~=0.17', 'astropy~=5.0', 'uproot~=4.2', From b18499146e5fcae60f2e6d889893400bfc5824be Mon Sep 17 00:00:00 2001 From: Alessio Berti Date: Tue, 13 Dec 2022 15:59:13 +0100 Subject: [PATCH 07/26] Remove python requirement. --- setup.py | 1 - 1 file changed, 1 deletion(-) diff --git a/setup.py b/setup.py index 0310120c..0be786a9 100644 --- a/setup.py +++ b/setup.py @@ -16,7 +16,6 @@ use_scm_version={"write_to": os.path.join("ctapipe_io_magic", "_version.py")}, packages=find_packages(), install_requires=[ - 'python>=3.8', 'ctapipe~=0.17', 'astropy~=5.0', 'uproot~=4.2', From 2069f5a5ae371ca3ff3d892fcc6cfaf0e3dd5bc6 Mon Sep 17 00:00:00 2001 From: Alessio Berti Date: Fri, 16 Dec 2022 16:55:40 +0100 Subject: [PATCH 08/26] Update MAGICEventSource to be recognized as subclass of EventSource. --- ctapipe_io_magic/__init__.py | 45 +++++++++++++++++++++++++++++++----- 1 file changed, 39 insertions(+), 6 deletions(-) diff --git a/ctapipe_io_magic/__init__.py b/ctapipe_io_magic/__init__.py index 60f42125..e566fa99 100644 --- a/ctapipe_io_magic/__init__.py +++ b/ctapipe_io_magic/__init__.py @@ -26,6 +26,9 @@ ArrayEventContainer, SimulationConfigContainer, SimulatedEventContainer, + SchedulingBlockContainer, + ObservationBlockContainer, + PointingMode, ) from ctapipe.instrument import ( @@ -112,7 +115,7 @@ class MAGICEventSource(EventSource): Data level according to MARS convention metadata : dict Dictionary containing metadata - run_numbers : int + run_id : int Run number of the file simulation_config : SimulationConfigContainer Container filled with the information about the simulation @@ -199,7 +202,7 @@ def __init__(self, input_url=None, config=None, parent=None, **kwargs): self.files_ = [uproot.open(rootf) for rootf in self.file_list] run_info = self.parse_run_info() - self.run_numbers = run_info[0] + self.run_id = run_info[0][0] self.is_mc = run_info[1][0] self.telescope = run_info[2][0] self.mars_datalevel = run_info[3][0] @@ -210,7 +213,7 @@ def __init__(self, input_url=None, config=None, parent=None, **kwargs): self.datalevel = DataLevel.DL0 if self.is_simulation: - self.simulation_config = self.parse_simulation_header() + self._simulation_config = self.parse_simulation_header() self.is_stereo, self.is_sumt = self.parse_data_info() @@ -234,6 +237,24 @@ def __init__(self, input_url=None, config=None, parent=None, **kwargs): # Get the arrival time differences self.event_time_diffs = self.get_event_time_difference() + pointing_mode = PointingMode.TRACK + + self._scheduling_blocks = { + self.run_id: SchedulingBlockContainer( + sb_id=np.uint64(self.run_id), + producer_id=f"MAGIC-{self.telescope}", + pointing_mode=pointing_mode, + ) + } + + self._observation_blocks = { + self.run_id: ObservationBlockContainer( + obs_id=np.uint64(self.run_id), + sb_id=np.uint64(self.run_id), + producer_id=f"MAGIC-{self.telescope}", + ) + } + def __exit__(self, exc_type, exc_val, exc_tb): """ Releases resources (e.g. open files). @@ -731,7 +752,7 @@ def parse_metadata_info(self): metadata = dict() metadata["file_list"] = self.file_list - metadata['run_numbers'] = self.run_numbers + metadata['run_numbers'] = self.run_id metadata['is_simulation'] = self.is_simulation metadata['telescope'] = self.telescope metadata['subrun_number'] = [] @@ -818,7 +839,7 @@ def parse_simulation_header(self): simulation_config = dict() - for run_number, rootf in zip(self.run_numbers, self.files_): + for run_number, rootf in zip(self.run_id, self.files_): run_header_tree = rootf['RunHeaders'] spectral_index = run_header_tree['MMcCorsikaRunHeader.fSlopeSpec'].array(library="np")[0] @@ -968,6 +989,18 @@ def subarray(self): def is_simulation(self): return self.is_mc + @property + def observation_blocks(self): + return self._observation_blocks + + @property + def scheduling_blocks(self): + return self._scheduling_blocks + + @property + def simulation_config(self): + return self._simulation_config + @property def datalevels(self): return (self.datalevel, ) @@ -975,7 +1008,7 @@ def datalevels(self): @property def obs_ids(self): # ToCheck: will this be compatible in the future, e.g. with merged MC files - return self.run_numbers + return list(self.observation_blocks) def _get_badrmspixel_mask(self, event): """ From 0da734843a8d38ec56c1bdcf5431bd8f3d2b8d63 Mon Sep 17 00:00:00 2001 From: Alessio Berti Date: Fri, 16 Dec 2022 17:42:12 +0100 Subject: [PATCH 09/26] Add number of samples and gains. --- ctapipe_io_magic/constants.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ctapipe_io_magic/constants.py b/ctapipe_io_magic/constants.py index b5a93d1a..13101566 100644 --- a/ctapipe_io_magic/constants.py +++ b/ctapipe_io_magic/constants.py @@ -9,3 +9,5 @@ MC_SUMT_TRIGGER_PATTERN = 32 # also for data taken in stereo with SumTrigger DATA_STEREO_TRIGGER_PATTERN = 128 +N_PIXELS = 1039 +N_SAMPLES = 50 From 5b5e12446ba25fa4a4606c966117f23d7423479c Mon Sep 17 00:00:00 2001 From: Alessio Berti Date: Fri, 16 Dec 2022 17:42:34 +0100 Subject: [PATCH 10/26] Adapt containers. --- ctapipe_io_magic/__init__.py | 40 ++++++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/ctapipe_io_magic/__init__.py b/ctapipe_io_magic/__init__.py index e566fa99..f3b1a6ab 100644 --- a/ctapipe_io_magic/__init__.py +++ b/ctapipe_io_magic/__init__.py @@ -38,6 +38,8 @@ CameraDescription, CameraGeometry, CameraReadout, + SizeType, + ReflectorShape, ) from .mars_datalevels import MARSDataLevel @@ -50,6 +52,8 @@ DATA_MONO_SUMT_TRIGGER_PATTERN, PEDESTAL_TRIGGER_PATTERN, DATA_STEREO_TRIGGER_PATTERN, + N_PIXELS, + N_SAMPLES, ) __all__ = [ @@ -81,7 +85,7 @@ def load_camera_geometry(): ''' Load camera geometry from bundled resources of this repo ''' f = resource_filename( - 'ctapipe_io_magic', 'resources/MAGICCam.camgeom.fits.gz' + 'ctapipe_io_magic', 'resources/MAGICCam.camgeom1.fits.gz' ) Provenance().add_input_file(f, role="CameraGeometry") return CameraGeometry.from_table(f) @@ -202,7 +206,7 @@ def __init__(self, input_url=None, config=None, parent=None, **kwargs): self.files_ = [uproot.open(rootf) for rootf in self.file_list] run_info = self.parse_run_info() - self.run_id = run_info[0][0] + self.run_id = run_info[0] self.is_mc = run_info[1][0] self.telescope = run_info[2][0] self.mars_datalevel = run_info[3][0] @@ -240,17 +244,17 @@ def __init__(self, input_url=None, config=None, parent=None, **kwargs): pointing_mode = PointingMode.TRACK self._scheduling_blocks = { - self.run_id: SchedulingBlockContainer( - sb_id=np.uint64(self.run_id), + self.run_id[0]: SchedulingBlockContainer( + sb_id=np.uint64(self.run_id[0]), producer_id=f"MAGIC-{self.telescope}", pointing_mode=pointing_mode, ) } self._observation_blocks = { - self.run_id: ObservationBlockContainer( - obs_id=np.uint64(self.run_id), - sb_id=np.uint64(self.run_id), + self.run_id[0]: ObservationBlockContainer( + obs_id=np.uint64(self.run_id[0]), + sb_id=np.uint64(self.run_id[0]), producer_id=f"MAGIC-{self.telescope}", ) } @@ -648,11 +652,14 @@ def prepare_subarray_info(self): focal_length = u.Quantity(17, u.m) OPTICS = OpticsDescription( - 'MAGIC', - num_mirrors=1, - equivalent_focal_length=focal_length, + name='MAGIC', + size_type=SizeType.LST, + n_mirrors=1, + n_mirror_tiles=964, + reflector_shape=ReflectorShape.PARABOLIC, + equivalent_focal_length=u.Quantity(17, u.m), + effective_focal_length=u.Quantity(17*1.0713, u.m), mirror_area=u.Quantity(239.0, u.m**2), - num_mirror_tiles=964, ) # camera info from MAGICCam.camgeom.fits.gz file @@ -666,10 +673,13 @@ def prepare_subarray_info(self): u.GHz ) camera_readout = CameraReadout( - camera_name='MAGICCam', + name='MAGICCam', sampling_rate=sampling_speed, reference_pulse_shape=pulse_shape, - reference_pulse_sample_width=u.Quantity(0.5, u.ns) + reference_pulse_sample_width=u.Quantity(0.5, u.ns), + n_channels=1, + n_pixels=N_PIXELS, + n_samples=N_SAMPLES, ) camera = CameraDescription('MAGICCam', camera_geom, camera_readout) @@ -677,7 +687,7 @@ def prepare_subarray_info(self): camera.geometry.frame = CameraFrame(focal_length=OPTICS.equivalent_focal_length) MAGIC_TEL_DESCRIPTION = TelescopeDescription( - name='MAGIC', tel_type='MAGIC', optics=OPTICS, camera=camera + name='MAGIC', optics=OPTICS, camera=camera ) MAGIC_TEL_DESCRIPTIONS = {1: MAGIC_TEL_DESCRIPTION, 2: MAGIC_TEL_DESCRIPTION} @@ -875,7 +885,7 @@ def parse_simulation_header(self): energy_range_max=u.Quantity(e_high, u.GeV).to(u.TeV), prod_site_alt=u.Quantity(site_height, u.cm).to(u.m), spectral_index=spectral_index, - num_showers=n_showers, + n_showers=n_showers, shower_reuse=1, # shower_reuse not written in the magic root file, but since the # sim_events already include shower reuse we artificially set it From 695967bb54ba7b6d6beadb629b1d3884253ae003 Mon Sep 17 00:00:00 2001 From: Alessio Berti Date: Fri, 16 Dec 2022 17:44:10 +0100 Subject: [PATCH 11/26] Correct name of variable. --- ctapipe_io_magic/tests/test_magic_event_source.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ctapipe_io_magic/tests/test_magic_event_source.py b/ctapipe_io_magic/tests/test_magic_event_source.py index 2165eea4..d64ce7e1 100644 --- a/ctapipe_io_magic/tests/test_magic_event_source.py +++ b/ctapipe_io_magic/tests/test_magic_event_source.py @@ -171,7 +171,7 @@ def test_run_info(dataset): is_mc = [i[1] for i in run_info][0] telescope = [i[2] for i in run_info][0] datalevel = [i[3] for i in run_info][0] - assert run_numbers == source.run_numbers + assert run_numbers == source.run_id assert is_mc == source.is_simulation assert telescope == source.telescope assert datalevel == source.mars_datalevel From 9aadb381b209a2f538a712c2e66f6644dac80608 Mon Sep 17 00:00:00 2001 From: Alessio Berti Date: Fri, 16 Dec 2022 17:45:48 +0100 Subject: [PATCH 12/26] Remove not needed choice of focal length. --- ctapipe_io_magic/__init__.py | 12 ------------ .../tests/test_magic_event_source.py | 18 ------------------ 2 files changed, 30 deletions(-) diff --git a/ctapipe_io_magic/__init__.py b/ctapipe_io_magic/__init__.py index f3b1a6ab..8ef4351d 100644 --- a/ctapipe_io_magic/__init__.py +++ b/ctapipe_io_magic/__init__.py @@ -144,12 +144,6 @@ class MAGICEventSource(EventSource): help='Use mono events in MC stereo data (needed for mono analysis).' ).tag(config=True) - focal_length_choice = CaselessStrEnum( - ['nominal', 'effective'], - default_value='effective', - help='Which focal length to use when constructing the SubarrayDescription.', - ).tag(config=True) - def __init__(self, input_url=None, config=None, parent=None, **kwargs): """ Constructor @@ -645,12 +639,6 @@ def prepare_subarray_info(self): 2: [-34.99, 24.02, 0.00] * u.m } - if self.focal_length_choice == 'effective': - # Use the effective focal length that the coma aberration is corrected - focal_length = u.Quantity(17*1.0713, u.m) - else: - focal_length = u.Quantity(17, u.m) - OPTICS = OpticsDescription( name='MAGIC', size_type=SizeType.LST, diff --git a/ctapipe_io_magic/tests/test_magic_event_source.py b/ctapipe_io_magic/tests/test_magic_event_source.py index d64ce7e1..a59f27b9 100644 --- a/ctapipe_io_magic/tests/test_magic_event_source.py +++ b/ctapipe_io_magic/tests/test_magic_event_source.py @@ -234,24 +234,6 @@ def test_geom(dataset): assert source.subarray.tels[1].camera.geometry.pix_x.size == 1039 assert source.subarray.tels[2].camera.geometry.pix_x.size == 1039 - -@pytest.mark.parametrize('dataset', test_calibrated_all) -def test_focal_length_choice(dataset): - from astropy import units as u - from ctapipe_io_magic import MAGICEventSource - - with MAGICEventSource(input_url=dataset, process_run=False, focal_length_choice='nominal') as source: - assert source.subarray.tel[1].optics.equivalent_focal_length == u.Quantity(17, u.m) - assert source.subarray.tel[2].optics.equivalent_focal_length == u.Quantity(17, u.m) - assert source.subarray.tel[1].camera.geometry.frame.focal_length == u.Quantity(17, u.m) - assert source.subarray.tel[2].camera.geometry.frame.focal_length == u.Quantity(17, u.m) - - with MAGICEventSource(input_url=dataset, process_run=False, focal_length_choice='effective') as source: - assert source.subarray.tel[1].optics.equivalent_focal_length == u.Quantity(17*1.0713, u.m) - assert source.subarray.tel[2].optics.equivalent_focal_length == u.Quantity(17*1.0713, u.m) - assert source.subarray.tel[1].camera.geometry.frame.focal_length == u.Quantity(17*1.0713, u.m) - assert source.subarray.tel[2].camera.geometry.frame.focal_length == u.Quantity(17*1.0713, u.m) - # def test_eventseeker(): # dataset = get_dataset_path("20131004_M1_05029747.003_Y_MagicCrab-W0.40+035.root") # From f36d323f4ab1b1f33c14b67980cee6857d50401f Mon Sep 17 00:00:00 2001 From: Alessio Berti Date: Fri, 16 Dec 2022 17:53:26 +0100 Subject: [PATCH 13/26] Update ctapipe process config file. --- example_stage1_config.json | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/example_stage1_config.json b/example_stage1_config.json index 96311a94..392a14c9 100644 --- a/example_stage1_config.json +++ b/example_stage1_config.json @@ -6,8 +6,7 @@ "overwrite": true, "write_images": true, "write_parameters": true, - "write_stereo_shower": false, - "write_mono_shower": false, + "write_showers": false, "transform_image": true, "transform_peak_time": true }, @@ -24,17 +23,17 @@ }, "ImageQualityQuery": { "quality_criteria": [ - ["enough_pixels", "lambda im: np.count_nonzero(im) > 2"], - ["enough_charge", "lambda im: im.sum() > 50"] + ["enough_pixels", "np.count_nonzero(image) > 2"], + ["enough_charge", "image.sum() > 50"] ] } }, "ShowerProcessor": { "ShowerQualityQuery": { "quality_criteria": [ - ["enough intensity", "lambda p: p.hillas.intensity > 50"], - ["Positive width", "lambda p: p.hillas.width.value > 0"], - ["enough pixels", "lambda p: p.morphology.num_pixels > 3"] + ["enough intensity", "parameters.hillas.intensity > 50"], + ["Positive width", "parameters.hillas.width.value > 0"], + ["enough pixels", "parameters.morphology.num_pixels > 3"] ] } } From 14e6b6ea494398ddfc1512069a7ba57cbec31fba Mon Sep 17 00:00:00 2001 From: Alessio Berti Date: Fri, 16 Dec 2022 17:54:18 +0100 Subject: [PATCH 14/26] Correct name of geometry file. --- ctapipe_io_magic/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ctapipe_io_magic/__init__.py b/ctapipe_io_magic/__init__.py index 8ef4351d..015d5f94 100644 --- a/ctapipe_io_magic/__init__.py +++ b/ctapipe_io_magic/__init__.py @@ -85,7 +85,7 @@ def load_camera_geometry(): ''' Load camera geometry from bundled resources of this repo ''' f = resource_filename( - 'ctapipe_io_magic', 'resources/MAGICCam.camgeom1.fits.gz' + 'ctapipe_io_magic', 'resources/MAGICCam.camgeom.fits.gz' ) Provenance().add_input_file(f, role="CameraGeometry") return CameraGeometry.from_table(f) From ee9c77a55d90cd56a30005ea8ef198a327c9fc31 Mon Sep 17 00:00:00 2001 From: Alessio Berti Date: Fri, 16 Dec 2022 17:54:29 +0100 Subject: [PATCH 15/26] Update camera geometry fits file. --- .../resources/MAGICCam.camgeom.fits.gz | Bin 7287 -> 7189 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/ctapipe_io_magic/resources/MAGICCam.camgeom.fits.gz b/ctapipe_io_magic/resources/MAGICCam.camgeom.fits.gz index e39daadd5ddd64d0515a640bcdb522b868310aea..8e7491a6cdf48cfd09cb531ebfec0707079de4e8 100644 GIT binary patch literal 7189 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 E2Qe(?bpQYW literal 7287 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 From 65c9d944000f46b969a74b2d9581e431bd038187 Mon Sep 17 00:00:00 2001 From: Alessio Berti Date: Sat, 17 Dec 2022 13:04:09 +0100 Subject: [PATCH 16/26] Use single run-id. --- ctapipe_io_magic/__init__.py | 16 ++++++++-------- .../tests/test_magic_event_source.py | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ctapipe_io_magic/__init__.py b/ctapipe_io_magic/__init__.py index 015d5f94..8547c020 100644 --- a/ctapipe_io_magic/__init__.py +++ b/ctapipe_io_magic/__init__.py @@ -200,7 +200,7 @@ def __init__(self, input_url=None, config=None, parent=None, **kwargs): self.files_ = [uproot.open(rootf) for rootf in self.file_list] run_info = self.parse_run_info() - self.run_id = run_info[0] + self.run_id = run_info[0][0] self.is_mc = run_info[1][0] self.telescope = run_info[2][0] self.mars_datalevel = run_info[3][0] @@ -238,17 +238,17 @@ def __init__(self, input_url=None, config=None, parent=None, **kwargs): pointing_mode = PointingMode.TRACK self._scheduling_blocks = { - self.run_id[0]: SchedulingBlockContainer( - sb_id=np.uint64(self.run_id[0]), + self.run_id: SchedulingBlockContainer( + sb_id=np.uint64(self.run_id), producer_id=f"MAGIC-{self.telescope}", pointing_mode=pointing_mode, ) } self._observation_blocks = { - self.run_id[0]: ObservationBlockContainer( - obs_id=np.uint64(self.run_id[0]), - sb_id=np.uint64(self.run_id[0]), + self.run_id: ObservationBlockContainer( + obs_id=np.uint64(self.run_id), + sb_id=np.uint64(self.run_id), producer_id=f"MAGIC-{self.telescope}", ) } @@ -837,7 +837,7 @@ def parse_simulation_header(self): simulation_config = dict() - for run_number, rootf in zip(self.run_id, self.files_): + for rootf in self.files_: run_header_tree = rootf['RunHeaders'] spectral_index = run_header_tree['MMcCorsikaRunHeader.fSlopeSpec'].array(library="np")[0] @@ -867,7 +867,7 @@ def parse_simulation_header(self): max_wavelength = run_header_tree['MMcRunHeader_1.fCWaveUpper'].array(library="np")[0] min_wavelength = run_header_tree['MMcRunHeader_1.fCWaveLower'].array(library="np")[0] - simulation_config[run_number] = SimulationConfigContainer( + simulation_config[self.run_id] = SimulationConfigContainer( corsika_version=corsika_version, energy_range_min=u.Quantity(e_low, u.GeV).to(u.TeV), energy_range_max=u.Quantity(e_high, u.GeV).to(u.TeV), diff --git a/ctapipe_io_magic/tests/test_magic_event_source.py b/ctapipe_io_magic/tests/test_magic_event_source.py index a59f27b9..7f72c3d2 100644 --- a/ctapipe_io_magic/tests/test_magic_event_source.py +++ b/ctapipe_io_magic/tests/test_magic_event_source.py @@ -171,7 +171,7 @@ def test_run_info(dataset): is_mc = [i[1] for i in run_info][0] telescope = [i[2] for i in run_info][0] datalevel = [i[3] for i in run_info][0] - assert run_numbers == source.run_id + assert run_numbers == [source.run_id] assert is_mc == source.is_simulation assert telescope == source.telescope assert datalevel == source.mars_datalevel From 82ca2e40b42ecdce11cbef1946c27d02f93e3d62 Mon Sep 17 00:00:00 2001 From: Elli Sophie Jobst Date: Tue, 20 Dec 2022 17:24:34 +0100 Subject: [PATCH 17/26] Added eventsource_subclasses.py --- .github/workflows/ci.yml | 1 + eventsource_subclasses.py | 5 +++++ 2 files changed, 6 insertions(+) create mode 100644 eventsource_subclasses.py diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0bc05ba5..8996ca5d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -59,6 +59,7 @@ jobs: run: | # github actions starts a new shell for each "step", so we need to # activate our env again + python eventsource_subclasses.py | grep MAGICEventSource pytest --cov=ctapipe_io_magic --cov-report=xml - uses: codecov/codecov-action@v1 diff --git a/eventsource_subclasses.py b/eventsource_subclasses.py new file mode 100644 index 00000000..ecd8d5b6 --- /dev/null +++ b/eventsource_subclasses.py @@ -0,0 +1,5 @@ +from ctapipe.io import EventSource +from ctapipe.core import non_abstract_children + +for cls in non_abstract_children(EventSource): + print(cls.__name__) \ No newline at end of file From 763ff77d0dd95330ba6958783d552babd54f1a84 Mon Sep 17 00:00:00 2001 From: Alessio Berti Date: Mon, 17 Apr 2023 11:34:21 +0200 Subject: [PATCH 18/26] Fixes for reading correctly passwords with special characters. --- download_test_data.sh | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/download_test_data.sh b/download_test_data.sh index ea9b5c42..ee8a20c1 100644 --- a/download_test_data.sh +++ b/download_test_data.sh @@ -13,14 +13,12 @@ echo "https://webdav-magic.pic.es:8451/Users/ctapipe_io_magic/test_data/simulate echo "https://webdav-magic.pic.es:8451/Users/ctapipe_io_magic/test_data/simulated/calibrated/GA_M2_za35to50_8_824319_Y_w0.root" >> test_data_simulated.txt if [ -z "$TEST_DATA_USER" ]; then - echo -n "Username: " - read TEST_DATA_USER + read -p "Username: " TEST_DATA_USER echo fi if [ -z "$TEST_DATA_PASSWORD" ]; then - echo -n "Password: " - read -s TEST_DATA_PASSWORD + read -sr -p "Password: " TEST_DATA_PASSWORD echo fi @@ -32,7 +30,7 @@ if ! wget \ --no-verbose \ --timestamping \ --directory-prefix=test_data/real/calibrated; then - echo "Problem in downloading the test data set for real data." + echo "Problem in downloading the test data set (calibrated) for real data." fi if ! wget \ @@ -43,7 +41,7 @@ if ! wget \ --no-verbose \ --timestamping \ --directory-prefix=test_data/simulated/calibrated; then - echo "Problem in downloading the test data set for simulated data." + echo "Problem in downloading the test data set (calibrated) for simulated data." fi rm -f test_data_real.txt test_data_simulated.txt From 3201b905968965c7fd4bdaeecd2a4e76917eff27 Mon Sep 17 00:00:00 2001 From: Alessio Berti Date: Mon, 17 Apr 2023 11:47:18 +0200 Subject: [PATCH 19/26] Introduce again choice of focal length. --- ctapipe_io_magic/__init__.py | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/ctapipe_io_magic/__init__.py b/ctapipe_io_magic/__init__.py index 8547c020..00c85e90 100644 --- a/ctapipe_io_magic/__init__.py +++ b/ctapipe_io_magic/__init__.py @@ -18,7 +18,7 @@ from ctapipe.io import EventSource, DataLevel from ctapipe.core import Provenance -from ctapipe.core.traits import Bool, CaselessStrEnum +from ctapipe.core.traits import Bool, UseEnum from ctapipe.coordinates import CameraFrame from ctapipe.containers import ( @@ -40,6 +40,7 @@ CameraReadout, SizeType, ReflectorShape, + FocalLengthKind, ) from .mars_datalevels import MARSDataLevel @@ -144,6 +145,12 @@ class MAGICEventSource(EventSource): help='Use mono events in MC stereo data (needed for mono analysis).' ).tag(config=True) + focal_length_choice = UseEnum( + FocalLengthKind, + default_value=FocalLengthKind.EFFECTIVE, + help='Which focal length to use when constructing the SubarrayDescription.', + ).tag(config=True) + def __init__(self, input_url=None, config=None, parent=None, **kwargs): """ Constructor @@ -639,17 +646,30 @@ def prepare_subarray_info(self): 2: [-34.99, 24.02, 0.00] * u.m } + equivalent_focal_length = u.Quantity(16.97, u.m) + effective_focal_length = u.Quantity(17*1.0713, u.m) + OPTICS = OpticsDescription( name='MAGIC', size_type=SizeType.LST, n_mirrors=1, n_mirror_tiles=964, reflector_shape=ReflectorShape.PARABOLIC, - equivalent_focal_length=u.Quantity(17, u.m), - effective_focal_length=u.Quantity(17*1.0713, u.m), + equivalent_focal_length=equivalent_focal_length, + effective_focal_length=effective_focal_length, mirror_area=u.Quantity(239.0, u.m**2), ) + if self.focal_length_choice is FocalLengthKind.EFFECTIVE: + focal_length = effective_focal_length + elif self.focal_length_choice is FocalLengthKind.EQUIVALENT: + focal_length = equivalent_focal_length + else: + raise ValueError( + f"Invalid focal length choice: {self.focal_length_choice}" + ) + + # camera info from MAGICCam.camgeom.fits.gz file camera_geom = load_camera_geometry() @@ -672,7 +692,7 @@ def prepare_subarray_info(self): camera = CameraDescription('MAGICCam', camera_geom, camera_readout) - camera.geometry.frame = CameraFrame(focal_length=OPTICS.equivalent_focal_length) + camera.geometry.frame = CameraFrame(focal_length=focal_length) MAGIC_TEL_DESCRIPTION = TelescopeDescription( name='MAGIC', optics=OPTICS, camera=camera From be569faab23c3eb2d6a096748bd2fdd456512a9c Mon Sep 17 00:00:00 2001 From: Alessio Berti Date: Mon, 17 Apr 2023 12:01:34 +0200 Subject: [PATCH 20/26] Put test for focal length choice. --- .../tests/test_magic_event_source.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/ctapipe_io_magic/tests/test_magic_event_source.py b/ctapipe_io_magic/tests/test_magic_event_source.py index 7f72c3d2..04953944 100644 --- a/ctapipe_io_magic/tests/test_magic_event_source.py +++ b/ctapipe_io_magic/tests/test_magic_event_source.py @@ -234,6 +234,25 @@ def test_geom(dataset): assert source.subarray.tels[1].camera.geometry.pix_x.size == 1039 assert source.subarray.tels[2].camera.geometry.pix_x.size == 1039 + +@pytest.mark.parametrize('dataset', test_calibrated_all) +def test_focal_length_choice(dataset): + from astropy import units as u + from ctapipe_io_magic import MAGICEventSource + from ctapipe.instrument import FocalLengthKind + + with MAGICEventSource(input_url=dataset, process_run=False, focal_length_choice=FocalLengthKind.EQUIVALENT) as source: + assert source.subarray.tel[1].optics.equivalent_focal_length == u.Quantity(16.97, u.m) + assert source.subarray.tel[2].optics.equivalent_focal_length == u.Quantity(16.97, u.m) + assert source.subarray.tel[1].camera.geometry.frame.focal_length == u.Quantity(16.97, u.m) + assert source.subarray.tel[2].camera.geometry.frame.focal_length == u.Quantity(16.97, u.m) + + with MAGICEventSource(input_url=dataset, process_run=False, focal_length_choice=FocalLengthKind.EFFECTIVE) as source: + assert source.subarray.tel[1].optics.effective_focal_length == u.Quantity(17*1.0713, u.m) + assert source.subarray.tel[2].optics.effective_focal_length == u.Quantity(17*1.0713, u.m) + assert source.subarray.tel[1].camera.geometry.frame.focal_length == u.Quantity(17*1.0713, u.m) + assert source.subarray.tel[2].camera.geometry.frame.focal_length == u.Quantity(17*1.0713, u.m) + # def test_eventseeker(): # dataset = get_dataset_path("20131004_M1_05029747.003_Y_MagicCrab-W0.40+035.root") # From 445531b6eecb13242d8308f45fe1dc68c064bd1f Mon Sep 17 00:00:00 2001 From: Alessio Berti Date: Mon, 17 Apr 2023 12:06:05 +0200 Subject: [PATCH 21/26] Use uproot 5. --- environment.yml | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/environment.yml b/environment.yml index 19e0f1de..78690916 100644 --- a/environment.yml +++ b/environment.yml @@ -21,4 +21,4 @@ dependencies: - h5py - pip: - pytest_runner - - uproot~=4.2 \ No newline at end of file + - uproot~=5.0 \ No newline at end of file diff --git a/setup.py b/setup.py index 0be786a9..5a0eeba7 100644 --- a/setup.py +++ b/setup.py @@ -18,7 +18,7 @@ install_requires=[ 'ctapipe~=0.17', 'astropy~=5.0', - 'uproot~=4.2', + 'uproot~=5.0', 'numpy>=1.20', ], package_data={ From 561cb94bcef927e1d6d224c7c669ad8e69d20804 Mon Sep 17 00:00:00 2001 From: Alessio Berti Date: Tue, 18 Apr 2023 11:35:39 +0200 Subject: [PATCH 22/26] Change versions for ctapipe and uproot. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index aa4978fd..9f21e900 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ## *ctapipe* MAGIC event source -EventSource plugin for *ctapipe*, needed to read the calibrated data of the MAGIC telescope system. It requires the [*ctapipe*](https://github.com/cta-observatory/ctapipe) (v0.12.0) and [*uproot*](https://github.com/scikit-hep/uproot4) (>=4.1) packages to run. +EventSource plugin for *ctapipe*, needed to read the calibrated data of the MAGIC telescope system. It requires the [*ctapipe*](https://github.com/cta-observatory/ctapipe) (v0.17.0) and [*uproot*](https://github.com/scikit-hep/uproot4) (>=5) packages to run. #### Installation From da9013b28767e73b38c1a57e8a5309a89bfb5c18 Mon Sep 17 00:00:00 2001 From: Alessio Berti Date: Tue, 18 Apr 2023 11:39:55 +0200 Subject: [PATCH 23/26] Modify installation instructions to install via conda. --- README.md | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 9f21e900..9ed67a84 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ EventSource plugin for *ctapipe*, needed to read the calibrated data of the MAGI #### Installation -Provided that *ctapipe* is already installed, the installation can be done via *pip* (the module is available in PyPI): +If *ctapipe* is already installed, the installation can be done via *pip* (the module is available in PyPI): ```bash pip install ctapipe_io_magic @@ -12,21 +12,14 @@ pip install ctapipe_io_magic Alternatively, you can always clone the repository and install like in the following: -```bash -git clone https://github.com/cta-observatory/ctapipe_io_magic.git -pip install ./ctapipe_io_magic/ -``` - -This installation via *pip* (provided, *pip* is installed) has the advantage to be nicely controlled for belonging to a given conda environment (and to be uninstalled). Alternatively, do - ```bash git clone https://github.com/cta-observatory/ctapipe_io_magic.git cd ctapipe_io_magic -python setup.py install --user +conda env create -n ctapipe-io_magic -f environment.yml +conda activate ctapipe-io_magic +pip install . ``` -In all cases, using *pip* will check if the version of *ctapipe* and *uproot* is compatible with the requested version of *ctapipe_io_magic*. - #### Usage ```python From bd321b6843b3e5c59590150e2213785fcef1a94c Mon Sep 17 00:00:00 2001 From: Alessio Berti Date: Tue, 18 Apr 2023 13:06:49 +0200 Subject: [PATCH 24/26] Read number of pixels from camera geometry file. --- ctapipe_io_magic/__init__.py | 5 +++-- ctapipe_io_magic/constants.py | 1 - 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ctapipe_io_magic/__init__.py b/ctapipe_io_magic/__init__.py index 00c85e90..fc67dcaf 100644 --- a/ctapipe_io_magic/__init__.py +++ b/ctapipe_io_magic/__init__.py @@ -53,7 +53,6 @@ DATA_MONO_SUMT_TRIGGER_PATTERN, PEDESTAL_TRIGGER_PATTERN, DATA_STEREO_TRIGGER_PATTERN, - N_PIXELS, N_SAMPLES, ) @@ -673,6 +672,8 @@ def prepare_subarray_info(self): # camera info from MAGICCam.camgeom.fits.gz file camera_geom = load_camera_geometry() + n_pixels = camera_geom.n_pixels + pulse_shape_lo_gain = np.array([0., 1., 2., 1., 0.]) pulse_shape_hi_gain = np.array([1., 2., 3., 2., 1.]) pulse_shape = np.vstack((pulse_shape_lo_gain, pulse_shape_hi_gain)) @@ -686,7 +687,7 @@ def prepare_subarray_info(self): reference_pulse_shape=pulse_shape, reference_pulse_sample_width=u.Quantity(0.5, u.ns), n_channels=1, - n_pixels=N_PIXELS, + n_pixels=n_pixels, n_samples=N_SAMPLES, ) diff --git a/ctapipe_io_magic/constants.py b/ctapipe_io_magic/constants.py index 13101566..8637b195 100644 --- a/ctapipe_io_magic/constants.py +++ b/ctapipe_io_magic/constants.py @@ -9,5 +9,4 @@ MC_SUMT_TRIGGER_PATTERN = 32 # also for data taken in stereo with SumTrigger DATA_STEREO_TRIGGER_PATTERN = 128 -N_PIXELS = 1039 N_SAMPLES = 50 From a89ab9a4d559347c2cd3958c81118410188ac4c7 Mon Sep 17 00:00:00 2001 From: Alessio Berti Date: Wed, 19 Apr 2023 12:43:04 +0200 Subject: [PATCH 25/26] Read number of samples from RunHeaders. --- ctapipe_io_magic/__init__.py | 21 ++++++++++++++++++--- ctapipe_io_magic/constants.py | 1 - 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/ctapipe_io_magic/__init__.py b/ctapipe_io_magic/__init__.py index fc67dcaf..d2a9c142 100644 --- a/ctapipe_io_magic/__init__.py +++ b/ctapipe_io_magic/__init__.py @@ -53,7 +53,6 @@ DATA_MONO_SUMT_TRIGGER_PATTERN, PEDESTAL_TRIGGER_PATTERN, DATA_STEREO_TRIGGER_PATTERN, - N_SAMPLES, ) __all__ = [ @@ -668,12 +667,28 @@ def prepare_subarray_info(self): f"Invalid focal length choice: {self.focal_length_choice}" ) - # camera info from MAGICCam.camgeom.fits.gz file camera_geom = load_camera_geometry() n_pixels = camera_geom.n_pixels + n_samples_array_list = ["MRawRunHeader.fNumSamplesHiGain"] + n_samples_list = [] + + for rootf in self.files_: + nsample_info = rootf['RunHeaders'].arrays(n_samples_array_list, library="np") + n_samples_file = int(nsample_info['MRawRunHeader.fNumSamplesHiGain'][0]) + n_samples_list.append(n_samples_file) + + n_samples_list = np.unique(n_samples_list).tolist() + + if len(n_samples_list) > 1: + raise ValueError( + "Loaded files contain different number of readout samples. \ + Please load files with the same readout configuration.") + + n_samples = n_samples_list[0] + pulse_shape_lo_gain = np.array([0., 1., 2., 1., 0.]) pulse_shape_hi_gain = np.array([1., 2., 3., 2., 1.]) pulse_shape = np.vstack((pulse_shape_lo_gain, pulse_shape_hi_gain)) @@ -688,7 +703,7 @@ def prepare_subarray_info(self): reference_pulse_sample_width=u.Quantity(0.5, u.ns), n_channels=1, n_pixels=n_pixels, - n_samples=N_SAMPLES, + n_samples=n_samples, ) camera = CameraDescription('MAGICCam', camera_geom, camera_readout) diff --git a/ctapipe_io_magic/constants.py b/ctapipe_io_magic/constants.py index 8637b195..b5a93d1a 100644 --- a/ctapipe_io_magic/constants.py +++ b/ctapipe_io_magic/constants.py @@ -9,4 +9,3 @@ MC_SUMT_TRIGGER_PATTERN = 32 # also for data taken in stereo with SumTrigger DATA_STEREO_TRIGGER_PATTERN = 128 -N_SAMPLES = 50 From 97422996139630a887e8f5e8b241657f9bf5f123 Mon Sep 17 00:00:00 2001 From: Alessio Berti Date: Wed, 26 Apr 2023 10:45:45 +0200 Subject: [PATCH 26/26] Add description of changes for v0.5.0 --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 9ed67a84..2aa647d3 100644 --- a/README.md +++ b/README.md @@ -111,3 +111,4 @@ Some general information about the simulated data, useful for IRF calculation, a - v0.4.5: fixed automatic tests, add possibility to choose between effective and nominal focal length - v0.4.6: add support to read in data taken in mono mode (full for real data, partial for MCs). Fixed bug in recognition of mono/stereo or standard trigger/SumT data (added also for MC) - v0.4.7: add full support to read in real and MC data taken in mono mode, and with SumT. Added treatment of unsuitable pixels for MC data. Added readout of true XMax value from MC data (usually not available, filled with 0 otherwise) +- v0.5.0: release compatible with ctapipe 0.17. Also, the equivalent focal length is set to the correct value used in MAGIC simulations (i.e. 16.97 meters)