From 5089495292ca5889949a89b524618837605af03a Mon Sep 17 00:00:00 2001 From: ggmarshall Date: Fri, 2 Oct 2026 02:36:55 +0200 Subject: [PATCH] Use the agg backend in all plotting par scripts Only ecal.py set it. With an X11 DISPLAY in the environment (e.g. ssh -X) the other scripts picked TkAgg inside the container and died with exit 1 and no traceback when the X connection dropped. Assisted-by: Generative AI --- src/legenddataflowscripts/par/geds/dsp/dplms.py | 3 +++ src/legenddataflowscripts/par/geds/dsp/eopt.py | 3 +++ src/legenddataflowscripts/par/geds/dsp/nopt.py | 3 +++ src/legenddataflowscripts/par/geds/dsp/pz.py | 3 +++ src/legenddataflowscripts/par/geds/hit/aoe.py | 3 +++ src/legenddataflowscripts/par/geds/hit/lq.py | 3 +++ src/legenddataflowscripts/par/geds/hit/qc.py | 3 +++ 7 files changed, 21 insertions(+) diff --git a/src/legenddataflowscripts/par/geds/dsp/dplms.py b/src/legenddataflowscripts/par/geds/dsp/dplms.py index 409733a..8c4c399 100644 --- a/src/legenddataflowscripts/par/geds/dsp/dplms.py +++ b/src/legenddataflowscripts/par/geds/dsp/dplms.py @@ -6,6 +6,7 @@ from pathlib import Path import lh5 +import matplotlib as mpl import numpy as np import pygama.math.distributions as pmd # noqa: F401 from dbetto.catalog import Props @@ -25,6 +26,8 @@ take_table_rows, ) +mpl.use("agg") # no display needed; avoids X11 when DISPLAY is set + def par_geds_dsp_dplms() -> None: """Compute DPLMS optimal filter coefficients for HPGe detectors. diff --git a/src/legenddataflowscripts/par/geds/dsp/eopt.py b/src/legenddataflowscripts/par/geds/dsp/eopt.py index 50a63b3..abe4fa1 100644 --- a/src/legenddataflowscripts/par/geds/dsp/eopt.py +++ b/src/legenddataflowscripts/par/geds/dsp/eopt.py @@ -7,6 +7,7 @@ from pathlib import Path import lh5 +import matplotlib as mpl import numpy as np import pygama.pargen.energy_optimisation as om # noqa: F401 import sklearn.gaussian_process.kernels as ker @@ -27,6 +28,8 @@ require_peaks_present, ) +mpl.use("agg") # no display needed; avoids X11 when DISPLAY is set + warnings.filterwarnings(action="ignore", category=RuntimeWarning) try: warnings.filterwarnings(action="ignore", category=np.exceptions.RankWarning) diff --git a/src/legenddataflowscripts/par/geds/dsp/nopt.py b/src/legenddataflowscripts/par/geds/dsp/nopt.py index e90df3e..ba52df9 100644 --- a/src/legenddataflowscripts/par/geds/dsp/nopt.py +++ b/src/legenddataflowscripts/par/geds/dsp/nopt.py @@ -6,6 +6,7 @@ from pathlib import Path import lh5 +import matplotlib as mpl import numpy as np import pygama.pargen.noise_optimization as pno from dbetto.catalog import Props @@ -20,6 +21,8 @@ require_config_keys, ) +mpl.use("agg") # no display needed; avoids X11 when DISPLAY is set + def par_geds_dsp_nopt() -> None: """Optimise DSP filter parameters for noise performance. diff --git a/src/legenddataflowscripts/par/geds/dsp/pz.py b/src/legenddataflowscripts/par/geds/dsp/pz.py index 3baeea2..3255895 100644 --- a/src/legenddataflowscripts/par/geds/dsp/pz.py +++ b/src/legenddataflowscripts/par/geds/dsp/pz.py @@ -6,6 +6,7 @@ from pathlib import Path import lh5 +import matplotlib as mpl import numpy as np from dbetto.catalog import Props from dspeed import build_dsp @@ -24,6 +25,8 @@ take_table_rows, ) +mpl.use("agg") # no display needed; avoids X11 when DISPLAY is set + def par_geds_dsp_pz() -> None: """Determine the pole-zero (PZ) decay constant(s) for HPGe waveforms. diff --git a/src/legenddataflowscripts/par/geds/hit/aoe.py b/src/legenddataflowscripts/par/geds/hit/aoe.py index 093b515..facaca2 100644 --- a/src/legenddataflowscripts/par/geds/hit/aoe.py +++ b/src/legenddataflowscripts/par/geds/hit/aoe.py @@ -10,6 +10,7 @@ import warnings from pathlib import Path +import matplotlib as mpl import numpy as np from dbetto.catalog import Props from pygama.pargen.AoE_cal import * # noqa: F403 @@ -28,6 +29,8 @@ require_unique_suffixes, ) +mpl.use("agg") # no display needed; avoids X11 when DISPLAY is set + log = logging.getLogger(__name__) warnings.filterwarnings(action="ignore", category=RuntimeWarning) diff --git a/src/legenddataflowscripts/par/geds/hit/lq.py b/src/legenddataflowscripts/par/geds/hit/lq.py index ffbc764..ccecd8f 100644 --- a/src/legenddataflowscripts/par/geds/hit/lq.py +++ b/src/legenddataflowscripts/par/geds/hit/lq.py @@ -9,6 +9,7 @@ import warnings from pathlib import Path +import matplotlib as mpl import numpy as np import pandas as pd from dbetto.catalog import Props @@ -30,6 +31,8 @@ require_unique_suffixes, ) +mpl.use("agg") # no display needed; avoids X11 when DISPLAY is set + log = logging.getLogger(__name__) warnings.filterwarnings(action="ignore", category=RuntimeWarning) diff --git a/src/legenddataflowscripts/par/geds/hit/qc.py b/src/legenddataflowscripts/par/geds/hit/qc.py index 3e9a138..a89548a 100644 --- a/src/legenddataflowscripts/par/geds/hit/qc.py +++ b/src/legenddataflowscripts/par/geds/hit/qc.py @@ -9,6 +9,7 @@ import warnings from pathlib import Path +import matplotlib as mpl import numpy as np from dbetto.catalog import Props from lh5 import ls @@ -28,6 +29,8 @@ prepare_output_paths, ) +mpl.use("agg") # no display needed; avoids X11 when DISPLAY is set + log = logging.getLogger(__name__) warnings.filterwarnings(action="ignore", category=RuntimeWarning)