Skip to content

Commit 6db7bd8

Browse files
authored
Merge pull request #280 from cta-observatory/dl2_production
Look for the closest declination line and adequate NSB random forest model for DL2 production
2 parents 48f7e24 + 938b399 commit 6db7bd8

38 files changed

+1187
-407
lines changed

Diff for: environment.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@ dependencies:
2121
- click
2222
- pymongo
2323
- scikit-learn=1.2
24-
- ctapipe_io_lst=0.24
24+
- ctapipe_io_lst >=0.25.1,<0.26a0
2525
- ctaplot~=0.6.4
2626
- pyirf~=0.10
27-
- lstchain>=0.10.13
27+
- lstchain>=0.10.15
2828
- tenacity
2929
- pip:
3030
- lstcam_calib

Diff for: extra/history_files/sequence_LST1_04185.0001.history

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
04185.0001 lstchain_data_r0_to_dl1 v0.7.0 Thu Mar 25 12:53:40 UTC 2021 calibration.Run04183.0000.hdf5 drs4_pedestal.Run04179.0000.fits 0
2+
04185.0001 lstchain_dl1ab tailcut105 Thu Mar 25 13:06:09 UTC 2021 dl1_LST-1.Run04185.0001.h5 lstchain_standard_config_tailcut84.json 0
3+
04185.0001 lstchain_check_dl1 tailcut105 Thu Mar 25 13:07:02 UTC 2021 dl1_LST-1.Run04185.0001.h5 None 0

Diff for: extra/history_files/sequence_LST1_04185.0010.history

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
04185.0010 lstchain_data_r0_to_dl1 v0.7.0 Thu Mar 25 12:53:40 UTC 2021 calibration.Run04183.0000.hdf5 drs4_pedestal.Run04179.0000.fits 0
22
04185.0010 lstchain_dl1ab tailcut84 Thu Mar 25 13:06:09 UTC 2021 dl1_LST-1.Run04185.0010.h5 lstchain_standard_config_tailcut84.json 0
33
04185.0010 lstchain_check_dl1 tailcut84 Thu Mar 25 13:07:02 UTC 2021 dl1_LST-1.Run04185.0010.h5 None 0
4-
04185.0010 lstchain_dl1_to_dl2 model1 Thu Mar 25 13:07:02 UTC 2021 dl1_LST-1.Run04185.0010.h5 None 0
4+
04185.0010 lstchain_dl1_to_dl2 tailcut84/nsb_tuning_0.14 Thu Mar 25 13:07:02 UTC 2021 dl1_LST-1.Run04185.0010.h5 None 0

Diff for: pyproject.toml

+2-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ classifiers = [
3333
requires-python = ">=3.10"
3434
dependencies = [
3535
"astropy~=5.0",
36-
"lstchain>=0.10.13",
36+
"lstchain>=0.10.15",
3737
"matplotlib",
3838
"numpy",
3939
"pandas",
@@ -76,6 +76,7 @@ reprocess_longterm = "osa.scripts.reprocess_longterm:main"
7676
gain_selection = "osa.scripts.gain_selection:main"
7777
update_source_catalog = "osa.scripts.update_source_catalog:main"
7878
gainsel_webmaker = "osa.scripts.gainsel_webmaker:main"
79+
sequencer_catB_tailcuts = "osa.scripts.sequencer_catB_tailcuts:main"
7980

8081
[tool.setuptools.packages.find]
8182
where = ["src"]

Diff for: src/osa/configs/options.py

+2
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
warning = None
1616
nocheck = None
1717
no_dl2 = None
18+
no_dl1ab = None
19+
no_gainsel = None
1820
prod_id = None
1921
dl1_prod_id = None
2022
dl2_prod_id = None

Diff for: src/osa/configs/sequencer.cfg

+12-4
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,18 @@ DRIVE_DIR: %(MONITORING)s/DrivePositioning
1414
RUN_SUMMARY_DIR: %(MONITORING)s/RunSummary
1515
RUN_CATALOG: %(MONITORING)s/RunCatalog
1616
PEDESTAL_FINDER_DIR: %(BASE)s/auxiliary/PedestalFinder
17+
TAILCUTS_FINDER_DIR: %(BASE)s/auxiliary/TailCuts
1718
ANALYSIS_DIR: %(BASE)s/running_analysis
18-
CALIB_BASE_DIR: %(MONITORING)s/PixelCalibration/Cat-A
19-
CALIB_DIR: %(CALIB_BASE_DIR)s/calibration
20-
PEDESTAL_DIR: %(CALIB_BASE_DIR)s/drs4_baseline
19+
CALIB_BASE_DIR: %(MONITORING)s/PixelCalibration
20+
CAT_A_CALIB_BASE: %(CALIB_BASE_DIR)s/Cat-A
21+
CAT_A_CALIB_DIR: %(CAT_A_CALIB_BASE)s/calibration
22+
CAT_A_PEDESTAL_DIR: %(CAT_A_CALIB_BASE)s/drs4_baseline
23+
CAT_B_CALIB_BASE: %(CALIB_BASE_DIR)s/Cat-B
2124
DL1_DIR: %(BASE)s/DL1
2225
DL1AB_DIR: %(BASE)s/DL1
2326
DL2_DIR: %(BASE)s/DL2
2427
DL3_DIR: %(BASE)s/DL3
28+
RF_MODELS: %(BASE)s/models/AllSky
2529
OSA_DIR: %(BASE)s/OSA
2630
CLOSER_DIR: %(OSA_DIR)s/Closer
2731
HIGH_LEVEL_DIR: %(OSA_DIR)s/HighLevel
@@ -45,22 +49,26 @@ DL2_PROD_ID: model2
4549
#charge_calibration: onsite_create_calibration_file
4650
drs4_baseline: lstcam_calib_onsite_create_drs4_pedestal_file
4751
charge_calibration: lstcam_calib_onsite_create_calibration_file
52+
catB_calibration: onsite_create_cat_B_calibration_file
4853
use_ff_heuristic_id: False
4954

5055
# Data processing steps in datasequence script
5156
r0_to_dl1: lstchain_data_r0_to_dl1
5257
dl1ab: lstchain_dl1ab
5358
check_dl1: lstchain_check_dl1
5459
dl1_to_dl2: lstchain_dl1_to_dl2
60+
tailcuts_finder: lstchain_find_tailcuts
5561

5662
# To be set by the user
5763
dl1a_config: /software/lstchain/data/lstchain_standard_config.json
5864
store_image_dl1ab: True
5965
merge_dl1_datacheck: True
66+
apply_catB_calibration: False
67+
apply_standard_dl1b_config: False
6068
use_ff_heuristic_gain_selection: False
6169
dl1b_config: /software/lstchain/data/lstchain_standard_config.json
6270
dl2_config: /software/lstchain/data/lstchain_standard_config.json
63-
rf_models: /data/models/prod5/zenith_20deg/20201023_v0.6.3
71+
mc_prod: 20240918_v0.10.12_allsky_
6472
dl3_config: /software/lstchain/data/dl3_std_config.json
6573
max_tries: 3
6674

Diff for: src/osa/conftest.py

+127-3
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@
3131
date = datetime.fromisoformat("2020-01-17")
3232
nightdir = date_to_dir(date)
3333
prod_id = "v0.1.0"
34-
dl1_prod_id = cfg.get("LST1", "DL1_PROD_ID")
35-
dl2_prod_id = cfg.get("LST1", "DL2_PROD_ID")
34+
dl1_prod_id = "tailcut84"
35+
dl2_prod_id = "tailcut84/nsb_tuning_0.14"
3636

3737

3838
@pytest.fixture(scope="session")
@@ -412,6 +412,9 @@ def sequence_list(
412412
r0_data,
413413
pedestal_ids_file,
414414
merged_run_summary,
415+
dl1b_config_files,
416+
tailcuts_log_files,
417+
rf_models,
415418
):
416419
"""Creates a sequence list from a run summary file."""
417420
options.directory = running_analysis_dir
@@ -574,10 +577,131 @@ def database(osa_dir):
574577

575578

576579
@pytest.fixture(scope="session")
577-
def gain_selection_flag_file(osa_dir):
580+
def rf_models_allsky_basedir(base_test_dir):
581+
directory = base_test_dir / "models/AllSky"
582+
directory.mkdir(parents=True, exist_ok=True)
583+
return directory
584+
585+
586+
@pytest.fixture(scope="session")
587+
def rf_model_path(rf_models_allsky_basedir):
588+
mc_prod = "20240131_allsky_v0.10.5_all_dec_base"
589+
declination_str = "dec_2276"
590+
rf_model_path = rf_models_allsky_basedir / mc_prod / declination_str
591+
rf_model_path.mkdir(parents=True, exist_ok=True)
592+
return rf_model_path
578593

594+
595+
@pytest.fixture(scope="session")
596+
def gain_selection_flag_file(osa_dir):
579597
GainSel_dir = osa_dir / "GainSel" / "20200117"
580598
GainSel_dir.mkdir(parents=True, exist_ok=True)
581599
file = GainSel_dir / "GainSelFinished.txt"
582600
file.touch()
583601
return file
602+
603+
604+
@pytest.fixture(scope="session")
605+
def catB_closed_file(running_analysis_dir):
606+
607+
catB_closed_file = running_analysis_dir / "catB_00003.closed"
608+
catB_closed_file.touch()
609+
return catB_closed_file
610+
611+
612+
@pytest.fixture(scope="session")
613+
def catB_calib_base_dir(monitoring_dir):
614+
615+
catB_calib_base_dir = monitoring_dir / "PixelCalibration" / "Cat-B"
616+
catB_calib_base_dir.mkdir(parents=True, exist_ok=True)
617+
return catB_calib_base_dir
618+
619+
620+
@pytest.fixture(scope="session")
621+
def catB_calibration_file(catB_calib_dir):
622+
623+
catB_calib_dir = catB_calib_base_dir / "calibration" / nightdir / prod_id
624+
catB_calib_file = catB_calib_dir / "cat_B_calibration_filters_52.Run00003.h5"
625+
catB_calib_file.touch()
626+
return catB_calib_file
627+
628+
629+
@pytest.fixture(scope="session")
630+
def tailcuts_finder_dir(base_test_dir):
631+
tailcuts_finder_dir = base_test_dir / "auxiliary" / "TailCuts"
632+
tailcuts_finder_dir.mkdir(parents=True, exist_ok=True)
633+
return tailcuts_finder_dir
634+
635+
636+
@pytest.fixture(scope="session")
637+
def dl1b_config_files(tailcuts_finder_dir):
638+
config_information = dedent(
639+
"""\
640+
{
641+
"tailcuts_clean_with_pedestal_threshold": {
642+
"picture_thresh": 8,
643+
"boundary_thresh": 4,
644+
"sigma": 2.5,
645+
"keep_isolated_pixels": false,
646+
"min_number_picture_neighbors": 2,
647+
"use_only_main_island": false,
648+
"delta_time": 2
649+
},
650+
"dynamic_cleaning": {
651+
"apply": true,
652+
"threshold": 267,
653+
"fraction_cleaning_intensity": 0.03
654+
}
655+
}"""
656+
)
657+
config_file1 = tailcuts_finder_dir / "dl1ab_Run01807.json"
658+
config_file1.touch()
659+
config_file1.write_text(config_information)
660+
config_file2 = tailcuts_finder_dir / "dl1ab_Run01808.json"
661+
config_file2.touch()
662+
config_file2.write_text(config_information)
663+
config_file3 = tailcuts_finder_dir / "dl1ab_Run04185.json"
664+
config_file3.touch()
665+
config_file3.write_text(config_information)
666+
return config_file1, config_file2, config_file3
667+
668+
669+
@pytest.fixture(scope="session")
670+
def tailcuts_log_files(tailcuts_finder_dir):
671+
log_information = dedent(
672+
"""\
673+
Median of 95% quantile of pedestal charge: 5.416 p.e.
674+
675+
Additional NSB rate (over dark MC): 0.2221 p.e./ns
676+
lstchain_find_tailcuts finished successfully!
677+
"""
678+
)
679+
log_file1 = tailcuts_finder_dir / "log_find_tailcuts_Run01807.log"
680+
log_file1.touch()
681+
log_file1.write_text(log_information)
682+
log_file2 = tailcuts_finder_dir / "log_find_tailcuts_Run01808.log"
683+
log_file2.touch()
684+
log_file2.write_text(log_information)
685+
log_file3 = tailcuts_finder_dir / "log_find_tailcuts_Run04185.log"
686+
log_file3.touch()
687+
log_file3.write_text(log_information)
688+
return log_file1, log_file2, log_file3
689+
690+
691+
@pytest.fixture(scope="session")
692+
def rf_models_base_dir(base_test_dir):
693+
directory = base_test_dir / "models/AllSky"
694+
directory.mkdir(parents=True, exist_ok=True)
695+
return directory
696+
697+
698+
@pytest.fixture(scope="session")
699+
def rf_models(rf_models_base_dir):
700+
rf_models_prefix = cfg.get("lstchain", "mc_prod")
701+
rf_models_path1 = rf_models_base_dir / f"{rf_models_prefix}nsb_tuning_0.00"
702+
rf_models_path1.mkdir(parents=True, exist_ok=True)
703+
rf_models_path2 = rf_models_base_dir / f"{rf_models_prefix}nsb_tuning_0.14/dec_2276"
704+
rf_models_path2.mkdir(parents=True, exist_ok=True)
705+
rf_models_path3 = rf_models_base_dir / f"{rf_models_prefix}nsb_tuning_0.14/dec_4822"
706+
rf_models_path3.mkdir(parents=True, exist_ok=True)
707+
return rf_models_path1, rf_models_path2, rf_models_path3

Diff for: src/osa/high_level/significance.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@
2626
from osa.configs.config import cfg
2727
from osa.nightsummary.extract import get_source_list
2828
from osa.paths import DEFAULT_CFG, destination_dir, analysis_path
29-
from osa.utils.cliopts import get_prod_id, get_dl2_prod_id
29+
from osa.utils.cliopts import get_prod_id
30+
from osa.paths import get_dl2_prod_id
3031
from osa.utils.logging import myLogger
3132
from osa.utils.utils import date_to_dir, YESTERDAY
3233

@@ -209,7 +210,6 @@ def main(
209210
flat_date = date_to_dir(date)
210211
options.tel_id = telescope
211212
options.prod_id = get_prod_id()
212-
options.dl2_prod_id = get_dl2_prod_id()
213213
options.directory = analysis_path(options.tel_id)
214214
dl2_directory = Path(cfg.get("LST1", "DL2_DIR"))
215215
highlevel_directory = destination_dir("HIGH_LEVEL", create_dir=True)
@@ -232,7 +232,7 @@ def main(
232232
dl2_directory
233233
/ flat_date
234234
/ options.prod_id
235-
/ options.dl2_prod_id
235+
/ get_dl2_prod_id(run)
236236
/ f"dl2_LST-1.Run{run:05d}.h5"
237237
)
238238
df = pd.concat([df, pd.read_hdf(input_file, key=dl2_params_lstcam_key)])

Diff for: src/osa/high_level/tests/test_significance.py

+3
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ def test_significance(
1010
systematic_correction_files,
1111
pedestal_ids_file,
1212
merged_run_summary,
13+
dl1b_config_files,
14+
tailcuts_log_files,
15+
rf_models,
1316
):
1417
output = sp.run(
1518
["theta2_significance", "-d", "2020-01-17", "-s", "LST1"],

0 commit comments

Comments
 (0)