Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Binder

EpiVacc is a multi-method model to simulate the impact of vaccine interventions against endemic diseases. This case study illustrates how the different modelling approaches work together and create an impact.

Topics:

  • Multi Method Modelling

Objectives:

  • How to model vaccine interventions and their impact?

  • What outcomes can be regarded and how can they be put in contrast?

  • How does hybrid / multi-method modelling enable this?


import io
import json
import os
import shutil
import zipfile

import numpy as np
import requests
from epi_vacc import Config, Scenario, PrimaryOutcomeId, UncertaintyScenario, ImmunityModel, OverallModel, \
    PrimaryOutcomesModel, PicoResultPlotter
from matplotlib import pyplot as plt
from scipy.integrate import solve_ivp

Background

Whether a vaccination program is funded by the health care system is an important and complex decision. The costs of purchasing and administering vaccines must be put in contrast with the population’s higher immune competence, the corresponding improved public health, and the related savings from a payer’s perspective due to the reduced burden of the disease. While the decision on whether one vaccination program should be funded by the system is already complex and multifaceted, it becomes particularly challenging when a decision for individual programs must be made at the expense of others due to financial constraints.

In the summer of 2024, the Federal Ministry of Health commissioned the TU Wien to carry out a study Bicher et al. (2025) analysing which vaccination programs would deliver the greatest benefit to the population for the 2025/2026 vaccination season. The aim of this study was to determine how the available budget could best be used to fund vaccinations programs (i.e. by reimbursing vaccination costs). The MoH, supported by their vaccination board (Nationales Impfgremium) proposed 15 different vaccination programs against 9 different pathogens:

Target PathogenWhoScheme
Pertussis15+ years5-annual booster
Hepatitis B15–60 year old who did not receive a vaccination as child3-stage base immunisation
Pneumococci60+ and risk personsSingle shot
MeningokocciChildren until 10 + risk persons from 25 (two different vaccines)4-/3-stage base immunisation & 5-annual booster for risk group
Tick-borne EncephalitisAllBase immunisation + 5-/3-annual booster
VZV (Varicella)Children2-stage base immunisation
VZV (Herpes-Zoster)60+2-stage immunisation
InfluenzaAll / 60+ and risk personsSeasonal booster
COVID-1912+ / 60+ and risk personsSeasonal booster
RSVPregnant / infants / 60+Single shot

At this point, there was little to no evidence on which of them they could afford with the given budget, and which would have the most benefit - and what could be regarded as benefit after all.

PICO Questions

In collaboration with the MoH the programs were translated into 70 PICO (Population-Intervention-Comparator-Outcomes) questions (see, Engen et al. (2024)). These questions clearly specified the target population (e.g. children, 60+, risk-persons), the planned intervention (e.g. seasonal booster shot against Influenza), the comparator in the absence of the intervention (no vaccinations, continued status-quo, all vaccinations paid privately) and the investigated outcomes (e.g. vaccination costs, mild/severe/death cases, treatment/hospitalisation costs). For most of the 15 programs, different PICO questions with different assumptions on the adherence of the target population, i.e. how many persons would take the vaccinations, were formulated. For more details, we refer to the published project report Bicher et al. (2025).

Modelling Challenges

At first, the problem seems to be a perfect application for epidemiological models, and indeed, the evaluation of vaccinations is one of the core application areas of these models. However, upon closer examination of the task, one finds oneself entering a rabbit hole, confronted with a multitude of challenges that quickly render a perfectly reasonable case study impossible. The most important are likely (see also bicher2026mathmatical):

  1. Remain unbiased in the light of heterogeneous pathogens and diseases.

  2. Depict the complex nature of real vaccination plans.

  3. Limited availability of data and system knowledge.

  4. Finding a representative evaluation time interval.

As a result, initial attempts to model the system using an agent-based approach, based on the GEPOC ABM population model (see Bicher et al. (2018)) failed. A more simplistic yet more applicable approach was found using a multi-method approach.

Conceptual and Implemented Model

The overall model strategy is depicted in Figure 1. We will not go into the details of each model here but only point out that the overall model structure consists of Markov-model type immunity model, a SIRVS-type epidemiologcal compartment model, and linear, static Primary and Secondary Outcomes models.

Multi-method concept of the EpiVacc model. Results from an immunity model (Markov-model), and from a SIRVS-type compartment model (differential equation model) feed into a Primary and Secondary Outcomes model (linear, static) to compute the impact of vaccination programs.

Figure 1:Multi-method concept of the EpiVacc model. Results from an immunity model (Markov-model), and from a SIRVS-type compartment model (differential equation model) feed into a Primary and Secondary Outcomes model (linear, static) to compute the impact of vaccination programs.

The model, henceforth referred to as EpiVacc is implemented in Python3 and found as package epi_vacc publicly in this git repository. We will iteratively explain how the model/package works and is used.

Model Configuration

Any experiment with the model requires the setup of a config-file in JSON format. This file contains all information about the PICO question and parameter values. The git repository provides two sample config files, one for a PICO related to Influenza vaccinations, one related to Hepatitis-B. We have a quick look into them.

url = "https://gitlab.tuwien.ac.at/martin.bicher/vacc_eval/-/archive/1.0.1/vacc_eval-1.0.1.zip"

# Download the zip file into memory
response = requests.get(url)
response.raise_for_status()

# the package requires a lot of things to be saved locally for reproducibility reasons
# so we need to make a temporary folder here
localfolder = './temp/'
if not os.path.isdir(localfolder):
    os.mkdir(localfolder)

# Load zip from memory and download the config files locally
with zipfile.ZipFile(io.BytesIO(response.content)) as z:
    ids = ["INF","HEP"] # ids for influenza and hepatitis
    configs = dict()
    for id in ids:
        fn = id+'.json'
        with z.open('vacc_eval-1.0.1/configs/'+fn,'r') as f:
            json_format = json.load(f) #load the file in JSON format
        json_format["resultFolder"] = localfolder #change the folder where the simulation should save the results
        with open(localfolder+fn,'w') as f:
            print(os.path.abspath(f.name))
            json.dump(json_format,f) #dump locally
        config = Config(localfolder+fn) #finally, open it as a config-object
        configs[id] = config

print('print some fields to get an idea on what is included in the JSON file:')
print(configs['INF'].file_content.keys())
print(configs['INF'].file_content['vaccinationStages'])
2026-06-13 22:07:30 | INFO | Influenza_20260613-220730 | Create config instance from ./temp/INF.json for scenario Influenza
2026-06-13 22:07:30 | INFO | Hepatitis-B_20260613-220730 | Create config instance from ./temp/HEP.json for scenario Hepatitis-B
/builds/cookbooks/private/modelling-and-simulation-cookbook/notebooks/multi_method_modelling/temp/INF.json
/builds/cookbooks/private/modelling-and-simulation-cookbook/notebooks/multi_method_modelling/temp/HEP.json
print some fields to get an idea on what is included in the JSON file:
dict_keys(['resultFolder', 'scenarioName', 'subPopulations', 'vaccinationProperties', 'averageWaningDays', 'population', 'vaccinationStages', 'referenceOutcomes', 'R0', 'secondaryOutcomes'])
{'comparator': [{'id': 'vaccP', 'participantRatio': 0.08, 'years': [0.5, 1.5, 2.5, 3.5, 4.5, 60.5, 61.5, 62.5, 63.5, 64.5, 65.5, 66.5, 67.5, 68.5, 69.5, 70.5, 71.5, 72.5, 73.5, 74.5, 75.5, 76.5, 77.5, 78.5, 79.5, 80.5, 81.5, 82.5, 83.5, 84.5, 85.5, 86.5, 87.5, 88.5, 89.5, 90.5, 91.5, 92.5, 93.5, 94.5, 95.5, 96.5, 97.5, 98.5, 99.5]}, {'id': 'vaccP', 'participantRatio': 0.069, 'years': [5.5, 6.5, 7.5, 8.5, 9.5, 10.5, 11.5, 12.5, 13.5, 14.5]}, {'id': 'vaccP', 'participantRatio': 0.0218, 'years': [15.5, 16.5, 17.5, 18.5, 19.5, 20.5, 21.5, 22.5, 23.5, 24.5, 25.5, 26.5, 27.5, 28.5, 29.5]}, {'id': 'vaccP', 'participantRatio': 0.0502, 'years': [30.5, 31.5, 32.5, 33.5, 34.5, 35.5, 36.5, 37.5, 38.5, 39.5, 40.5, 41.5, 42.5, 43.5, 44.5]}, {'id': 'vaccP', 'participantRatio': 0.0703, 'years': [45.5, 46.5, 47.5, 48.5, 49.5, 50.5, 51.5, 52.5, 53.5, 54.5, 55.5, 56.5, 57.5, 58.5, 59.5]}], 'intervention': [{'id': 'vaccI', 'participantRatio': 0.433, 'years': [60.5, 61.5, 62.5, 63.5, 64.5, 65.5, 66.5, 67.5, 68.5, 69.5, 70.5, 71.5, 72.5, 73.5, 74.5, 75.5, 76.5, 77.5, 78.5, 79.5, 80.5, 81.5, 82.5, 83.5, 84.5, 85.5, 86.5, 87.5, 88.5, 89.5, 90.5, 91.5, 92.5, 93.5, 94.5, 95.5, 96.5, 97.5, 98.5, 99.5]}, {'id': 'vaccI', 'participantRatio': 0.13, 'years': [0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5, 10.5, 11.5, 12.5, 13.5, 14.5, 15.5, 16.5, 17.5, 18.5, 19.5, 20.5, 21.5, 22.5, 23.5, 24.5, 25.5, 26.5, 27.5, 28.5, 29.5, 30.5, 31.5, 32.5, 33.5, 34.5, 35.5, 36.5, 37.5, 38.5, 39.5, 40.5, 41.5, 42.5, 43.5, 44.5, 45.5, 46.5, 47.5, 48.5, 49.5, 50.5, 51.5, 52.5, 53.5, 54.5, 55.5, 56.5, 57.5, 58.5, 59.5]}], 'fit': [{'id': 'vaccI', 'participantRatio': 0.1422, 'years': [0.5, 1.5, 2.5, 3.5, 4.5]}, {'id': 'vaccI', 'participantRatio': 0.069, 'years': [5.5, 6.5, 7.5, 8.5, 9.5, 10.5, 11.5, 12.5, 13.5, 14.5]}, {'id': 'vaccI', 'participantRatio': 0.0218, 'years': [15.5, 16.5, 17.5, 18.5, 19.5, 20.5, 21.5, 22.5, 23.5, 24.5, 25.5, 26.5, 27.5, 28.5, 29.5]}, {'id': 'vaccI', 'participantRatio': 0.0502, 'years': [30.5, 31.5, 32.5, 33.5, 34.5, 35.5, 36.5, 37.5, 38.5, 39.5, 40.5, 41.5, 42.5, 43.5, 44.5]}, {'id': 'vaccI', 'participantRatio': 0.0703, 'years': [45.5, 46.5, 47.5, 48.5, 49.5, 50.5, 51.5, 52.5, 53.5, 54.5, 55.5, 56.5, 57.5, 58.5, 59.5]}, {'id': 'vaccI', 'participantRatio': 0.1271, 'years': [60.5, 61.5, 62.5, 63.5, 64.5, 65.5, 66.5, 67.5, 68.5, 69.5]}, {'id': 'vaccI', 'participantRatio': 0.2047, 'years': [70.5, 71.5, 72.5, 73.5, 74.5, 75.5, 76.5, 77.5, 78.5, 79.5]}, {'id': 'vaccI', 'participantRatio': 0.2414, 'years': [80.5, 81.5, 82.5, 83.5, 84.5, 85.5, 86.5, 87.5, 88.5, 89.5, 90.5, 91.5, 92.5, 93.5, 94.5, 95.5, 96.5, 97.5, 98.5, 99.5]}]}

Model Input: Vaccination Program

Mathematically, we define a vaccination program is interpreted as a list vj,j{1,,M}v_j,j\in \{1,\dots,M\} of tuples

vj:=(tj,rj,ej,cj),v_j:=(t_j,r_j,e_j,c_j),

whereas each tuple characterises one stage of the program. Hereby,

  • tjR0+t_j\in \mathbb{R}^+_0 stands for the recommended administration age of the vaccination shot

  • rj[0,1]r_j\in [0,1] refers to the expected participation among the population with age tjt_j

  • ej[0,1]e_j\in [0,1] refers to the effectiveness of the vaccine against a certain outcome, i.e. how well the vaccine protects the individual, and

  • cjR0+c_j \in \mathbb{R}^+_0 stands for the costs associated with administering the vaccination stage.

In full detail, rjr_j is sub-population dependent (e.g. risk population, pregrant,...), eje_j depends on the outcome of interest (e.g. infection, symptomatic, severe, ...), and cjc_j depends on the payer or payment program (e.g. privately paid, child-vaccination budget, ...).

Below we illustrate the comparator and intervention program against Hepatitis-B. The program is depicted with three sub-populations: base12 refers to the part of the population who get the first dose as a child with the age of 0 and the booster shot with 7. Those in base1 had the first one, but missed out the booster shot. The other show vaccination stages depict a refreshment vaccinations for those which could or did not want to participante in the (full) base immunisation program. To depict that the refreshment can be taken any time between age 16 and 60, multiple vaccination events with reduced participation are depicted. In the comparator, which should depict the status-quo, the refreshment is only taken by the base1 sub-population and is currently paid privatey, in the intervention, also the others subpopulation may get the vaccine and it is reimbursed.

def visualise_vacc_program(config:Config,scenario:Scenario) -> None:
    """
    Visualises the different stages of the configured vaccination program
    :param config: instance of the Config class
    :param scenario: one of Scenario.FIT,Scenario.COMPARATOR or Scenario.INTERVENTION
    """
    pops = config.sub_populations
    cmp = plt.get_cmap('viridis')
    k = 0
    for i,(p,r) in enumerate(pops.items()):
        plt.fill_between([0,100],[k,k],[k+r,k+r],color=cmp(i/len(pops.keys())),alpha=0.2,label=p)
        k+=r
    for stage in config.vaccination_stages[scenario]:
        a = stage.get_age()
        k = 0
        for p,r in pops.items():
            plt.plot([a,a],[k,k+stage.get_participant_ratio(p)*r],color='r',linewidth=3)
            k+=r
    plt.legend()
plt.figure(figsize=(8,6))
plt.subplot(2,1,1)
visualise_vacc_program(configs['HEP'],Scenario.COMPARATOR)
plt.title('Hepatitis-B, Comparator')
plt.xlim([0,100])
plt.ylim([0,1])
plt.subplot(2,1,2)
visualise_vacc_program(configs['HEP'],Scenario.INTERVENTION)
plt.title('Hepatitis-B, Intervention')
plt.xlim([0,100])
plt.ylim([0,1])
plt.tight_layout()
plt.show()
<Figure size 800x600 with 2 Axes>

Immunity Model

For every individual, we define a stochastic process X(t)X(t) modeling whether an individual is (1) or is not (0) protected against a certain outcome at precise age tt due to a vaccination. We furthermore aim to model

μ:R+[0,1]:tμ(t):=P(X(t)=1),\mu:\mathbb{R}^+\rightarrow [0,1]:t\mapsto \mu(t):=P(X(t)=1),

henceforth called vaccine-induced-immunity curve.

In the model we assume that XX is a Markov process: Transition 101\rightarrow 0 reflects waning of immunity. For our model, we assume that this process is memoryless (Markov process) with rate α\alpha, meaning that the immunity waning times are exponentially distributed. As a result, for any two t2>t1t_2>t_1

μ(t2)=P(X(t2)=1)=P(X(t2)=1X(t1)=1)P(X(t1)=1)=exp(α(t2t1))μ(t1).\mu(t_2)=P(X(t_2)=1) = P(X(t_2)=1|X(t_1)=1)P(X(t_1)=1)=\exp(-\alpha(t_2-t_1))\mu(t_1).

Transition 010\rightarrow 1 is externally triggered by the vaccination stages. For the jj-th stage at age tjt_j we find, that the person has a likelihood of rjr_j to participate in the program, and a likelihood of eje_j to gain immunity from the vaccination stage.

Let Xj:=limttjX(t)X_j^-:=\lim_{t\rightarrow t_j^-}X(t) define the state of the process right before the vaccination and μj:=P(Xj=1)\mu^{-}_j:=P(X_j^-=1), then

μ(tj)=P(X(tj)=1)=P(X(tj)=1Xj=1)μj+P(X(tj)=1Xj=0)(1μj)=μj+rjej(1μj).\mu(t_j)=P(X(t_j)=1)=P(X(t_j)=1|X_j^-=1)\mu^{-}_j+P(X(t_j)=1|X_j^-=0)(1-\mu^{-}_j) = \mu^{-}_j+r_je_j(1-\mu^{-}_j).

Combining the two equations provides μ\mu for arbitrary points in time.

We compute some immunity curves for different outcomes below. For Hepatitis-B we asumed no difference in protectivity against different outcomes, for Influena, however, data shows a declining protection against symptomatic disease for the elderly. In general protection levels against Influena can be seen on a much lower level due to (a) much faster waning, (b) smaller participant ratios, and (c) lower estimates for vaccine effectiveness.

cmp = plt.get_cmap('viridis')
for id in ['HEP','INF']:
    plt.figure(figsize=(8,3))
    for i,outcome in enumerate([PrimaryOutcomeId.SYMPTOMATIC,PrimaryOutcomeId.SEVERE,PrimaryOutcomeId.FATAL]):
        imdl = ImmunityModel(configs[id],outcome,Scenario.INTERVENTION,UncertaintyScenario.MAIN)
        res, res_supop = imdl.run()
        T = np.linspace(0,100,1000)
        X = [res.get_immunity(t) for t in T]
        plt.plot(T,X,color=cmp(i/2),label=outcome.name.lower())
    plt.legend()
    plt.xlabel('age')
    plt.ylabel('immunity probability')
    plt.xlim([0,100])
    plt.ylim([0,1])
    plt.title('immunity against '+id)
    plt.show()
<Figure size 800x300 with 1 Axes>
<Figure size 800x300 with 1 Axes>

Steady-State Property

To quantify the impact of the immunity level on the disease outcomes, we apply a steady-state assumption. I.e. we assume, that the population size (per age= remains constant and that the vaccination program (comparator or intervention) is sufficiently long in place to cause the same level of annual infections/cases and the same level of immunity. As a result, the average likelihood that a person between age aa and a+1a+1 is immunised is representative for the immunisation likeliood of the whole age cohort aa:

a{0,1,}:Ia:=aa+1μ(t)dt,\forall a\in \{0,1,\dots\}: \mathcal{I}_{a}:=\int_{a}^{a+1}\mu(t)dt,

and for the overall population by

Itot:=N(I)a=0100N1,\mathcal{I}^{tot}:=\frac{\vec{N}\cdot (\mathcal{I})_{a=0}^{100}}{\lVert\vec{N}\rVert_1},

whereas N=(Na)a=0N\vec{N}=(N_a)_{a=0}^{N} stands for size of the age cohorts.

We approximate a yearly cases OaO_a for a certain age aa as

Oa=(1Ia)Oa0,O_a=(1-\mathcal{I}_{a})O_a^0,

whereas Oa0O_a^0 stands for the yearly incidence in a naive population without vaccination - which need to be found in a calibration process.

Unfortunately, this solely linear approach neglects nonlinear herd-immunity effects in case the vaccine protects agains infection and transmission (which is not always given). Thus, we slightly extend this formula to

Oa=(1Ia)Ξ()Oa0,O_a=(1-\mathcal{I}_{a})\Xi(\cdot)O_a^0,

SIRVS-Model

The SIRVS-model (susceptible-infectious-recovered-vaccinated-susceptible) is a well known epidemic compartmental model based on the famous SIR-model by Kermack and McKendrick and unites the SIRS model with the SIRV model. It can be regarded at the simplest model considering herd-immunity effects, immunity-waning, and vaccinations at the same time and is defined by the following system of four coupled differential equations:

S˙(t)=βS(t)I(t)+δ1R(t)+δ2V(t)κS(t)I˙(t)=βS(t)I(t)γI(t)R˙(t)=γI(t)δ1R(t)V˙(t)=δ2V(t)+κS(t)\begin{array}{cccccc} \dot{S}(t)&=&-\beta S(t)I(t)&&+\delta_1R(t)+\delta_2V(t)&-\kappa S(t)\\ \dot{I}(t)&=&\beta S(t)I(t)&-\gamma I(t)&&\\ \dot{R}(t)&=&&\gamma I(t)&-\delta_1 R(t)&\\ \dot{V}(t)&=&&&-\delta_2 V(t)&+\kappa S(t)\\ \end{array}

Although the model dynamics are too complicated to be solved analytically, its steady-state is. By S˙=I˙=R˙=V˙=0\dot{S}=\dot{I}=\dot{R}=\dot{V}=0 we find, for example,

n()=n0()(1R0R01V()),n(\infty)=n_0(\infty)\left(1-\frac{R_0}{R_0-1}V(\infty)\right),

whereas n()n(\infty) and V()V(\infty) stand for the new infections n(t)=βS(t)I(t)n(t)=\beta S(t)I(t) and total vaccination in the steady state, n0n_0 for the new infections in a system without vaccinations (i.e. κ=0\kappa=0), and R0R_0 for the base reproduction rate R0=βγR_0=\frac{\beta}{\gamma} of the disease. By splitting the rate into self- and third-party protection, we identify our nonlinearity factor FF by

n()=n0()(1V())1BV()1V()Fn(\infty)=n_0(\infty)(1-V(\infty))\underbrace{\frac{1-BV(\infty)}{1-V(\infty)}}_{F}

which, transferred to our age-dependent framework, leads to

Ξ(R0,Itot)=1R0R01Itot1Itot.\Xi(R_0,\mathcal{I}^{tot})=\frac{1-\frac{R_0}{R_0-1}\mathcal{I}^{tot}}{1-\mathcal{I}^{tot}}.

We illustrate this factor with the SIRVS model below. It corresponds to the ratio between the two red lines in their steady state (i.e. to the right of the picture).

class SIRVSModel:
    def __init__(self, beta:float, gamma:float, delta1:float, delta2:float, kappa:float):
        """
        Implementation of the SIRVS model
        :param beta: infection rate
        :param gamma: recovery rate
        :param delta1: waning rate for recovered
        :param delta2: waning rate for vaccinated
        :param kappa: vaccination rate
        """
        self.beta = beta
        self.gamma = gamma
        self.delta1 = delta1
        self.delta2 = delta2
        self.kappa = kappa

    def rhs(self,t:float,x:np.ndarray) -> np.ndarray:
        """
        Right hand side of the SIRVS differential equation
        :param t: time
        :param x: state vector
        :return: derivative
        """
        y = np.zeros(4)
        infs = self.beta*x[0]*x[1]
        recs = self.gamma*x[1]
        wanes1 = self.delta1*x[2]
        wanes2 = self.delta2*x[3]
        vaccs = self.kappa*x[0]
        y[0]=-infs-vaccs+wanes1+wanes2
        y[1]=infs-recs
        y[2]=recs-wanes1
        y[3]=vaccs-wanes2
        return y

    def run(self,x0:np.ndarray,tend:float) -> tuple[np.ndarray,np.ndarray]:
        """
        Solves the ode using a runge-kutta solver and returns the results of the model
        :param x0: initial value
        :param tend: simulation end-time
        :return: vector of time instants and corresponding vector of states
        """
        res = solve_ivp(self.rhs,[0,tend],x0,max_step=1)
        return res.t,res.y

beta = 0.6
gamma= 0.2
delta1 = 0.01
delta2 = 0.01
kappa = 0.003
x0 = np.array([0.95, 0.05, 0.0, 0.0])
tend = 1000 # should be enough for a proper "steady state"
plt.figure(figsize=(10,5))

mdl = SIRVSModel(beta, gamma, delta1, delta2, 0.0) # model without vaccinations
tt, xx = mdl.run(x0, tend)
plt.plot(tt, xx[1, :], color=[1.0, 0.0, 0.0], label='infected (without vaccinations)')

iinf0 = xx[1,-1]

mdl = SIRVSModel(beta,gamma,delta1,delta2,kappa) # model with vaccinations
tt, xx = mdl.run(x0, tend)
plt.plot(tt,xx[1,:],color=[0.7,0.0,0.0],label='infected (with vaccinations)')
plt.plot(tt,xx[3,:],color='k',label='vaccinated')
plt.xlabel('time')
plt.ylabel('ratio of the population')

plt.ylim([0,0.14])
plt.xlim([0,tend])

plt.legend()
plt.show()
<Figure size 1000x500 with 1 Axes>

Outcomes Model and Model Fit

With Iak\mathcal{I}^k_a being the immunity against a certain outcome kk, e.g. symptomatic or severe disease, and Iai\mathcal{I}^i_a being the immunity against infection, we compute

Oai=(1Iai)Ξ(Itot,i,R0)Oa0,i,O_a^i=(1-\mathcal{I}^i_{a})\Xi(\mathcal{I}^{tot,i},R_0)O_a^{0,i},

whereas Oai,Oa0,iO_a^i,O_a^{0,i} refer to the total infections with and without vaccinations and

Oak=(1(IakIai))ΨakOai,O_a^k=(1-(\mathcal{I}^k_a-\mathcal{I}^i_a))\Psi_a^kO_a^{i},

whereas OakO_a^k stands for the observed cases with outcome kk. Factor Ψak\Psi_a^k is the age-dependent likelihood that an unvaccinated person of a certain age will develop the more severe outcome kk.

Given a certain status-quo vaccination program (in addition to the comparatpor and intervention) we may calibrate the missing factors to given surveillance data for the corresponding diseases (see Figure 2)

Strategy to fit the model with a status-quo vaccination program and data on certain reference outcomes.

Figure 2:Strategy to fit the model with a status-quo vaccination program and data on certain reference outcomes.

Below we fit the outcomes model given a set of immunity models and show the fitted probabilities Ψ\Psi. While the probabilities are somewhat in the same range for Hepatitis-B, they differ heavily for Influenza. For the latter, the likelihood for symptomatic disease is much higher than for more severe outcomes.

cmp = plt.get_cmap('viridis')
for id in ['HEP','INF']:
    plt.figure(figsize=(8,4))
    for i,po in enumerate([PrimaryOutcomeId.SYMPTOMATIC,PrimaryOutcomeId.SEVERE,PrimaryOutcomeId.FATAL]):
        mdl = ImmunityModel(configs[id], po, Scenario.FIT)
        imres = mdl.run()[0]
        pom = PrimaryOutcomesModel(configs[id].population, imres.get_average_immunity_vector(), None, None)
        ref = configs[id].reference_outcomes_specs[po]
        reference_values = ref.reference_values
        param = pom.fit_to_reference(ref.reference_values, ref.kernels_po[po]) # fits the model to the reference data
        plt.plot(*param.get_age_timeline(),color=cmp(i/2),label=po.name.lower())
    plt.legend()
    plt.xlabel('age')
    plt.ylabel('probability for more severe outcome')
    plt.title(id)
<Figure size 800x400 with 1 Axes>
<Figure size 800x400 with 1 Axes>

Secondary Outcomes

Finally, we fully exploit the fitted model. We assume, that any outcome of interest QmQ^m can be computed as a linear-combination of the primary outcomes, i.e. infected, symptomatic, severe and fatal cases, i.e.

Qm=kTm,kOkQ^m=\sum_{k}T^{m,k}O^k

for some kernel matrices TkT^k. This specification offers lots of freedom for defining outcomes: A zero-matrix will make the result independent of the corresponding primary. A diagonal matrix will create a proportional age-dependent relation, e.g., well suited to model age-dependent treatment costs. Finally, using a triangular matrix makes it possible to model a time-delay between primary and secondary outcome. We refer to the Hepatitis-B case study in the Results section for an example.

Comparing these outcomes for the comparator and the intervention program gives estimates for the benefits. However, one should not forget that different interventions are associated with different costs. So it is important to also contrast the benefits with the costs.

cmp = plt.get_cmap('viridis')
results = dict()
for id in ['HEP','INF']:
    om = OverallModel(configs[id])
    results[id] = om.run_pico()
    plotter = PicoResultPlotter(configs[id], results[id])
    plotter.plot_secondary_result_pico('hospitalized')
    plotter.plot_secondary_result_pico('sickLeaveCosts')
    plotter.plot_secondary_result_pico('vaccinations')
    plotter.plot_secondary_result_pico('vaccinationCosts_intervention')
    plt.show()
2026-06-13 22:07:39 | INFO | Hepatitis-B_20260613-220730 | initialises OverallModel with config for scenario Hepatitis-B
2026-06-13 22:07:39 | INFO | Hepatitis-B_20260613-220730 | compute scenario (<Scenario.FIT: 0>, <UncertaintyScenario.MAIN: 1>)
2026-06-13 22:07:39 | INFO | Hepatitis-B_20260613-220730 | run scenario FIT for uncertainty MAIN
2026-06-13 22:07:39 | INFO | Hepatitis-B_20260613-220730 | fit parameters to reference
2026-06-13 22:07:40 | INFO | Hepatitis-B_20260613-220730 | fit SEVERE parameters
2026-06-13 22:07:40 | INFO | Hepatitis-B_20260613-220730 | fit SYMPTOMATIC parameters
2026-06-13 22:07:40 | INFO | Hepatitis-B_20260613-220730 | fit FATAL parameters
2026-06-13 22:07:40 | INFO | Hepatitis-B_20260613-220730 | get already computed immunity curves
2026-06-13 22:07:40 | INFO | Hepatitis-B_20260613-220730 | compute primary results
2026-06-13 22:07:40 | INFO | Hepatitis-B_20260613-220730 | compute primary results for SEVERE
2026-06-13 22:07:40 | INFO | Hepatitis-B_20260613-220730 | compute primary results for SYMPTOMATIC
2026-06-13 22:07:40 | INFO | Hepatitis-B_20260613-220730 | compute primary results for FATAL
2026-06-13 22:07:40 | INFO | Hepatitis-B_20260613-220730 | compute secondary results
2026-06-13 22:07:40 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for hospitalized
2026-06-13 22:07:40 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for deaths
2026-06-13 22:07:40 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for hospitalDays
2026-06-13 22:07:41 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for hospitalCosts
2026-06-13 22:07:41 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for milds
2026-06-13 22:07:41 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for extramuralCosts
2026-06-13 22:07:41 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for workingSymptomatic
2026-06-13 22:07:41 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for sickLeaveDays
2026-06-13 22:07:41 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for sickLeaveCosts
2026-06-13 22:07:41 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for deathCosts
2026-06-13 22:07:41 | INFO | Hepatitis-B_20260613-220730 | create result-object for FIT/MAIN
2026-06-13 22:07:41 | INFO | Hepatitis-B_20260613-220730 | save ScenarioResult for (<Scenario.FIT: 0>, <UncertaintyScenario.MAIN: 1>) to JSON file ./temp/Hepatitis-B_20260613-220730/Scenario_fit_main.json
2026-06-13 22:07:41 | INFO | Hepatitis-B_20260613-220730 | successfully saved
2026-06-13 22:07:41 | INFO | Hepatitis-B_20260613-220730 | compute scenario (<Scenario.COMPARATOR: 1>, <UncertaintyScenario.LOW: 0>)
2026-06-13 22:07:41 | INFO | Hepatitis-B_20260613-220730 | run scenario COMPARATOR for uncertainty LOW
2026-06-13 22:07:41 | INFO | Hepatitis-B_20260613-220730 | get already fitted parameters
2026-06-13 22:07:41 | INFO | Hepatitis-B_20260613-220730 | compute immunity curves
2026-06-13 22:07:43 | INFO | Hepatitis-B_20260613-220730 | compute primary results
2026-06-13 22:07:43 | INFO | Hepatitis-B_20260613-220730 | compute primary results for SEVERE
2026-06-13 22:07:43 | INFO | Hepatitis-B_20260613-220730 | compute primary results for SYMPTOMATIC
2026-06-13 22:07:43 | INFO | Hepatitis-B_20260613-220730 | compute primary results for FATAL
2026-06-13 22:07:43 | INFO | Hepatitis-B_20260613-220730 | compute secondary results
2026-06-13 22:07:43 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for hospitalized
2026-06-13 22:07:43 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for deaths
2026-06-13 22:07:43 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for hospitalDays
2026-06-13 22:07:43 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for hospitalCosts
2026-06-13 22:07:43 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for milds
2026-06-13 22:07:43 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for extramuralCosts
2026-06-13 22:07:43 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for workingSymptomatic
2026-06-13 22:07:44 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for sickLeaveDays
2026-06-13 22:07:44 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for sickLeaveCosts
2026-06-13 22:07:44 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for deathCosts
2026-06-13 22:07:44 | INFO | Hepatitis-B_20260613-220730 | create result-object for COMPARATOR/LOW
2026-06-13 22:07:44 | INFO | Hepatitis-B_20260613-220730 | save ScenarioResult for (<Scenario.COMPARATOR: 1>, <UncertaintyScenario.LOW: 0>) to JSON file ./temp/Hepatitis-B_20260613-220730/Scenario_comparator_low.json
2026-06-13 22:07:44 | INFO | Hepatitis-B_20260613-220730 | successfully saved
2026-06-13 22:07:44 | INFO | Hepatitis-B_20260613-220730 | compute scenario (<Scenario.INTERVENTION: 2>, <UncertaintyScenario.LOW: 0>)
2026-06-13 22:07:44 | INFO | Hepatitis-B_20260613-220730 | run scenario INTERVENTION for uncertainty LOW
2026-06-13 22:07:44 | INFO | Hepatitis-B_20260613-220730 | get already fitted parameters
2026-06-13 22:07:44 | INFO | Hepatitis-B_20260613-220730 | compute immunity curves
2026-06-13 22:07:45 | INFO | Hepatitis-B_20260613-220730 | compute primary results
2026-06-13 22:07:45 | INFO | Hepatitis-B_20260613-220730 | compute primary results for SEVERE
2026-06-13 22:07:45 | INFO | Hepatitis-B_20260613-220730 | compute primary results for SYMPTOMATIC
2026-06-13 22:07:45 | INFO | Hepatitis-B_20260613-220730 | compute primary results for FATAL
2026-06-13 22:07:45 | INFO | Hepatitis-B_20260613-220730 | compute secondary results
2026-06-13 22:07:45 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for hospitalized
2026-06-13 22:07:45 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for deaths
2026-06-13 22:07:45 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for hospitalDays
2026-06-13 22:07:45 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for hospitalCosts
2026-06-13 22:07:45 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for milds
2026-06-13 22:07:46 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for extramuralCosts
2026-06-13 22:07:46 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for workingSymptomatic
2026-06-13 22:07:46 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for sickLeaveDays
2026-06-13 22:07:46 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for sickLeaveCosts
2026-06-13 22:07:46 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for deathCosts
2026-06-13 22:07:46 | INFO | Hepatitis-B_20260613-220730 | create result-object for INTERVENTION/LOW
2026-06-13 22:07:46 | INFO | Hepatitis-B_20260613-220730 | save ScenarioResult for (<Scenario.INTERVENTION: 2>, <UncertaintyScenario.LOW: 0>) to JSON file ./temp/Hepatitis-B_20260613-220730/Scenario_intervention_low.json
2026-06-13 22:07:46 | INFO | Hepatitis-B_20260613-220730 | successfully saved
2026-06-13 22:07:46 | INFO | Hepatitis-B_20260613-220730 | compute scenario (<Scenario.COMPARATOR: 1>, <UncertaintyScenario.MAIN: 1>)
2026-06-13 22:07:46 | INFO | Hepatitis-B_20260613-220730 | run scenario COMPARATOR for uncertainty MAIN
2026-06-13 22:07:46 | INFO | Hepatitis-B_20260613-220730 | get already fitted parameters
2026-06-13 22:07:46 | INFO | Hepatitis-B_20260613-220730 | compute immunity curves
2026-06-13 22:07:47 | INFO | Hepatitis-B_20260613-220730 | compute primary results
2026-06-13 22:07:47 | INFO | Hepatitis-B_20260613-220730 | compute primary results for SEVERE
2026-06-13 22:07:47 | INFO | Hepatitis-B_20260613-220730 | compute primary results for SYMPTOMATIC
2026-06-13 22:07:47 | INFO | Hepatitis-B_20260613-220730 | compute primary results for FATAL
2026-06-13 22:07:47 | INFO | Hepatitis-B_20260613-220730 | compute secondary results
2026-06-13 22:07:47 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for hospitalized
2026-06-13 22:07:48 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for deaths
2026-06-13 22:07:48 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for hospitalDays
2026-06-13 22:07:48 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for hospitalCosts
2026-06-13 22:07:48 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for milds
2026-06-13 22:07:48 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for extramuralCosts
2026-06-13 22:07:48 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for workingSymptomatic
2026-06-13 22:07:48 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for sickLeaveDays
2026-06-13 22:07:48 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for sickLeaveCosts
2026-06-13 22:07:48 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for deathCosts
2026-06-13 22:07:48 | INFO | Hepatitis-B_20260613-220730 | create result-object for COMPARATOR/MAIN
2026-06-13 22:07:48 | INFO | Hepatitis-B_20260613-220730 | save ScenarioResult for (<Scenario.COMPARATOR: 1>, <UncertaintyScenario.MAIN: 1>) to JSON file ./temp/Hepatitis-B_20260613-220730/Scenario_comparator_main.json
2026-06-13 22:07:48 | INFO | Hepatitis-B_20260613-220730 | successfully saved
2026-06-13 22:07:48 | INFO | Hepatitis-B_20260613-220730 | compute scenario (<Scenario.INTERVENTION: 2>, <UncertaintyScenario.MAIN: 1>)
2026-06-13 22:07:48 | INFO | Hepatitis-B_20260613-220730 | run scenario INTERVENTION for uncertainty MAIN
2026-06-13 22:07:48 | INFO | Hepatitis-B_20260613-220730 | get already fitted parameters
2026-06-13 22:07:48 | INFO | Hepatitis-B_20260613-220730 | compute immunity curves
2026-06-13 22:07:50 | INFO | Hepatitis-B_20260613-220730 | compute primary results
2026-06-13 22:07:50 | INFO | Hepatitis-B_20260613-220730 | compute primary results for SEVERE
2026-06-13 22:07:50 | INFO | Hepatitis-B_20260613-220730 | compute primary results for SYMPTOMATIC
2026-06-13 22:07:50 | INFO | Hepatitis-B_20260613-220730 | compute primary results for FATAL
2026-06-13 22:07:50 | INFO | Hepatitis-B_20260613-220730 | compute secondary results
2026-06-13 22:07:50 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for hospitalized
2026-06-13 22:07:50 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for deaths
2026-06-13 22:07:50 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for hospitalDays
2026-06-13 22:07:50 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for hospitalCosts
2026-06-13 22:07:50 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for milds
2026-06-13 22:07:50 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for extramuralCosts
2026-06-13 22:07:51 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for workingSymptomatic
2026-06-13 22:07:51 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for sickLeaveDays
2026-06-13 22:07:51 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for sickLeaveCosts
2026-06-13 22:07:51 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for deathCosts
2026-06-13 22:07:51 | INFO | Hepatitis-B_20260613-220730 | create result-object for INTERVENTION/MAIN
2026-06-13 22:07:51 | INFO | Hepatitis-B_20260613-220730 | save ScenarioResult for (<Scenario.INTERVENTION: 2>, <UncertaintyScenario.MAIN: 1>) to JSON file ./temp/Hepatitis-B_20260613-220730/Scenario_intervention_main.json
2026-06-13 22:07:51 | INFO | Hepatitis-B_20260613-220730 | successfully saved
2026-06-13 22:07:51 | INFO | Hepatitis-B_20260613-220730 | compute scenario (<Scenario.COMPARATOR: 1>, <UncertaintyScenario.HIGH: 2>)
2026-06-13 22:07:51 | INFO | Hepatitis-B_20260613-220730 | run scenario COMPARATOR for uncertainty HIGH
2026-06-13 22:07:51 | INFO | Hepatitis-B_20260613-220730 | get already fitted parameters
2026-06-13 22:07:51 | INFO | Hepatitis-B_20260613-220730 | compute immunity curves
2026-06-13 22:07:52 | INFO | Hepatitis-B_20260613-220730 | compute primary results
2026-06-13 22:07:52 | INFO | Hepatitis-B_20260613-220730 | compute primary results for SEVERE
2026-06-13 22:07:52 | INFO | Hepatitis-B_20260613-220730 | compute primary results for SYMPTOMATIC
2026-06-13 22:07:52 | INFO | Hepatitis-B_20260613-220730 | compute primary results for FATAL
2026-06-13 22:07:52 | INFO | Hepatitis-B_20260613-220730 | compute secondary results
2026-06-13 22:07:52 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for hospitalized
2026-06-13 22:07:52 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for deaths
2026-06-13 22:07:52 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for hospitalDays
2026-06-13 22:07:52 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for hospitalCosts
2026-06-13 22:07:52 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for milds
2026-06-13 22:07:52 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for extramuralCosts
2026-06-13 22:07:52 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for workingSymptomatic
2026-06-13 22:07:52 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for sickLeaveDays
2026-06-13 22:07:52 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for sickLeaveCosts
2026-06-13 22:07:52 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for deathCosts
2026-06-13 22:07:52 | INFO | Hepatitis-B_20260613-220730 | create result-object for COMPARATOR/HIGH
2026-06-13 22:07:52 | INFO | Hepatitis-B_20260613-220730 | save ScenarioResult for (<Scenario.COMPARATOR: 1>, <UncertaintyScenario.HIGH: 2>) to JSON file ./temp/Hepatitis-B_20260613-220730/Scenario_comparator_high.json
2026-06-13 22:07:53 | INFO | Hepatitis-B_20260613-220730 | successfully saved
2026-06-13 22:07:53 | INFO | Hepatitis-B_20260613-220730 | compute scenario (<Scenario.INTERVENTION: 2>, <UncertaintyScenario.HIGH: 2>)
2026-06-13 22:07:53 | INFO | Hepatitis-B_20260613-220730 | run scenario INTERVENTION for uncertainty HIGH
2026-06-13 22:07:53 | INFO | Hepatitis-B_20260613-220730 | get already fitted parameters
2026-06-13 22:07:53 | INFO | Hepatitis-B_20260613-220730 | compute immunity curves
2026-06-13 22:07:53 | INFO | Hepatitis-B_20260613-220730 | compute primary results
2026-06-13 22:07:53 | INFO | Hepatitis-B_20260613-220730 | compute primary results for SEVERE
2026-06-13 22:07:53 | INFO | Hepatitis-B_20260613-220730 | compute primary results for SYMPTOMATIC
2026-06-13 22:07:53 | INFO | Hepatitis-B_20260613-220730 | compute primary results for FATAL
2026-06-13 22:07:53 | INFO | Hepatitis-B_20260613-220730 | compute secondary results
2026-06-13 22:07:53 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for hospitalized
2026-06-13 22:07:53 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for deaths
2026-06-13 22:07:53 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for hospitalDays
2026-06-13 22:07:53 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for hospitalCosts
2026-06-13 22:07:53 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for milds
2026-06-13 22:07:53 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for extramuralCosts
2026-06-13 22:07:54 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for workingSymptomatic
2026-06-13 22:07:54 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for sickLeaveDays
2026-06-13 22:07:54 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for sickLeaveCosts
2026-06-13 22:07:54 | INFO | Hepatitis-B_20260613-220730 | attempt to compute secondary results for deathCosts
2026-06-13 22:07:54 | INFO | Hepatitis-B_20260613-220730 | create result-object for INTERVENTION/HIGH
2026-06-13 22:07:54 | INFO | Hepatitis-B_20260613-220730 | save ScenarioResult for (<Scenario.INTERVENTION: 2>, <UncertaintyScenario.HIGH: 2>) to JSON file ./temp/Hepatitis-B_20260613-220730/Scenario_intervention_high.json
2026-06-13 22:07:54 | INFO | Hepatitis-B_20260613-220730 | successfully saved
2026-06-13 22:07:54 | INFO | Hepatitis-B_20260613-220730 | make some result plots
<Figure size 1000x400 with 3 Axes>
<Figure size 1000x400 with 3 Axes>
<Figure size 500x500 with 1 Axes>
<Figure size 1000x400 with 3 Axes>
<Figure size 1000x1000 with 4 Axes>
<Figure size 1000x1000 with 4 Axes>
<Figure size 1000x1000 with 4 Axes>
<Figure size 1000x1000 with 2 Axes>
2026-06-13 22:08:13 | INFO | Influenza_20260613-220730 | initialises OverallModel with config for scenario Influenza
2026-06-13 22:08:13 | INFO | Influenza_20260613-220730 | compute scenario (<Scenario.FIT: 0>, <UncertaintyScenario.MAIN: 1>)
2026-06-13 22:08:13 | INFO | Influenza_20260613-220730 | run scenario FIT for uncertainty MAIN
2026-06-13 22:08:13 | INFO | Influenza_20260613-220730 | fit parameters to reference
2026-06-13 22:08:14 | INFO | Influenza_20260613-220730 | fit SEVERE parameters
2026-06-13 22:08:14 | INFO | Influenza_20260613-220730 | fit SYMPTOMATIC parameters
2026-06-13 22:08:14 | INFO | Influenza_20260613-220730 | fit FATAL parameters
2026-06-13 22:08:14 | INFO | Influenza_20260613-220730 | get already computed immunity curves
2026-06-13 22:08:14 | INFO | Influenza_20260613-220730 | compute primary results
2026-06-13 22:08:14 | INFO | Influenza_20260613-220730 | compute primary results for SEVERE
2026-06-13 22:08:14 | INFO | Influenza_20260613-220730 | compute primary results for SYMPTOMATIC
2026-06-13 22:08:14 | INFO | Influenza_20260613-220730 | compute primary results for FATAL
2026-06-13 22:08:14 | INFO | Influenza_20260613-220730 | compute secondary results
2026-06-13 22:08:14 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for hospitalized
2026-06-13 22:08:14 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for deaths
2026-06-13 22:08:14 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for hospitalDays
2026-06-13 22:08:14 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for hospitalCosts
2026-06-13 22:08:14 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for milds
2026-06-13 22:08:14 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for extramuralCosts
2026-06-13 22:08:14 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for workingSymptomatic
2026-06-13 22:08:14 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for sickLeaveDays
2026-06-13 22:08:14 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for sickLeaveCosts
2026-06-13 22:08:14 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for deathCosts
2026-06-13 22:08:14 | INFO | Influenza_20260613-220730 | create result-object for FIT/MAIN
2026-06-13 22:08:14 | INFO | Influenza_20260613-220730 | save ScenarioResult for (<Scenario.FIT: 0>, <UncertaintyScenario.MAIN: 1>) to JSON file ./temp/Influenza_20260613-220730/Scenario_fit_main.json
2026-06-13 22:08:14 | INFO | Influenza_20260613-220730 | successfully saved
2026-06-13 22:08:14 | INFO | Influenza_20260613-220730 | compute scenario (<Scenario.COMPARATOR: 1>, <UncertaintyScenario.LOW: 0>)
2026-06-13 22:08:14 | INFO | Influenza_20260613-220730 | run scenario COMPARATOR for uncertainty LOW
2026-06-13 22:08:14 | INFO | Influenza_20260613-220730 | get already fitted parameters
2026-06-13 22:08:14 | INFO | Influenza_20260613-220730 | compute immunity curves
2026-06-13 22:08:15 | INFO | Influenza_20260613-220730 | compute primary results
2026-06-13 22:08:15 | INFO | Influenza_20260613-220730 | compute primary results for SEVERE
2026-06-13 22:08:15 | INFO | Influenza_20260613-220730 | compute primary results for SYMPTOMATIC
2026-06-13 22:08:15 | INFO | Influenza_20260613-220730 | compute primary results for FATAL
2026-06-13 22:08:15 | INFO | Influenza_20260613-220730 | compute secondary results
2026-06-13 22:08:15 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for hospitalized
2026-06-13 22:08:15 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for deaths
2026-06-13 22:08:15 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for hospitalDays
2026-06-13 22:08:15 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for hospitalCosts
2026-06-13 22:08:15 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for milds
2026-06-13 22:08:15 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for extramuralCosts
2026-06-13 22:08:15 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for workingSymptomatic
2026-06-13 22:08:15 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for sickLeaveDays
2026-06-13 22:08:15 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for sickLeaveCosts
2026-06-13 22:08:15 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for deathCosts
2026-06-13 22:08:15 | INFO | Influenza_20260613-220730 | create result-object for COMPARATOR/LOW
2026-06-13 22:08:15 | INFO | Influenza_20260613-220730 | save ScenarioResult for (<Scenario.COMPARATOR: 1>, <UncertaintyScenario.LOW: 0>) to JSON file ./temp/Influenza_20260613-220730/Scenario_comparator_low.json
2026-06-13 22:08:16 | INFO | Influenza_20260613-220730 | successfully saved
2026-06-13 22:08:16 | INFO | Influenza_20260613-220730 | compute scenario (<Scenario.INTERVENTION: 2>, <UncertaintyScenario.LOW: 0>)
2026-06-13 22:08:16 | INFO | Influenza_20260613-220730 | run scenario INTERVENTION for uncertainty LOW
2026-06-13 22:08:16 | INFO | Influenza_20260613-220730 | get already fitted parameters
2026-06-13 22:08:16 | INFO | Influenza_20260613-220730 | compute immunity curves
2026-06-13 22:08:16 | INFO | Influenza_20260613-220730 | compute primary results
2026-06-13 22:08:16 | INFO | Influenza_20260613-220730 | compute primary results for SEVERE
2026-06-13 22:08:16 | INFO | Influenza_20260613-220730 | compute primary results for SYMPTOMATIC
2026-06-13 22:08:16 | INFO | Influenza_20260613-220730 | compute primary results for FATAL
2026-06-13 22:08:16 | INFO | Influenza_20260613-220730 | compute secondary results
2026-06-13 22:08:16 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for hospitalized
2026-06-13 22:08:16 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for deaths
2026-06-13 22:08:16 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for hospitalDays
2026-06-13 22:08:16 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for hospitalCosts
2026-06-13 22:08:16 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for milds
2026-06-13 22:08:16 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for extramuralCosts
2026-06-13 22:08:16 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for workingSymptomatic
2026-06-13 22:08:16 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for sickLeaveDays
2026-06-13 22:08:16 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for sickLeaveCosts
2026-06-13 22:08:16 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for deathCosts
2026-06-13 22:08:17 | INFO | Influenza_20260613-220730 | create result-object for INTERVENTION/LOW
2026-06-13 22:08:17 | INFO | Influenza_20260613-220730 | save ScenarioResult for (<Scenario.INTERVENTION: 2>, <UncertaintyScenario.LOW: 0>) to JSON file ./temp/Influenza_20260613-220730/Scenario_intervention_low.json
2026-06-13 22:08:17 | INFO | Influenza_20260613-220730 | successfully saved
2026-06-13 22:08:17 | INFO | Influenza_20260613-220730 | compute scenario (<Scenario.COMPARATOR: 1>, <UncertaintyScenario.MAIN: 1>)
2026-06-13 22:08:17 | INFO | Influenza_20260613-220730 | run scenario COMPARATOR for uncertainty MAIN
2026-06-13 22:08:17 | INFO | Influenza_20260613-220730 | get already fitted parameters
2026-06-13 22:08:17 | INFO | Influenza_20260613-220730 | compute immunity curves
2026-06-13 22:08:17 | INFO | Influenza_20260613-220730 | compute primary results
2026-06-13 22:08:17 | INFO | Influenza_20260613-220730 | compute primary results for SEVERE
2026-06-13 22:08:17 | INFO | Influenza_20260613-220730 | compute primary results for SYMPTOMATIC
2026-06-13 22:08:17 | INFO | Influenza_20260613-220730 | compute primary results for FATAL
2026-06-13 22:08:17 | INFO | Influenza_20260613-220730 | compute secondary results
2026-06-13 22:08:17 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for hospitalized
2026-06-13 22:08:17 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for deaths
2026-06-13 22:08:17 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for hospitalDays
2026-06-13 22:08:17 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for hospitalCosts
2026-06-13 22:08:17 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for milds
2026-06-13 22:08:17 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for extramuralCosts
2026-06-13 22:08:17 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for workingSymptomatic
2026-06-13 22:08:17 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for sickLeaveDays
2026-06-13 22:08:17 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for sickLeaveCosts
2026-06-13 22:08:17 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for deathCosts
2026-06-13 22:08:18 | INFO | Influenza_20260613-220730 | create result-object for COMPARATOR/MAIN
2026-06-13 22:08:18 | INFO | Influenza_20260613-220730 | save ScenarioResult for (<Scenario.COMPARATOR: 1>, <UncertaintyScenario.MAIN: 1>) to JSON file ./temp/Influenza_20260613-220730/Scenario_comparator_main.json
2026-06-13 22:08:18 | INFO | Influenza_20260613-220730 | successfully saved
2026-06-13 22:08:18 | INFO | Influenza_20260613-220730 | compute scenario (<Scenario.INTERVENTION: 2>, <UncertaintyScenario.MAIN: 1>)
2026-06-13 22:08:18 | INFO | Influenza_20260613-220730 | run scenario INTERVENTION for uncertainty MAIN
2026-06-13 22:08:18 | INFO | Influenza_20260613-220730 | get already fitted parameters
2026-06-13 22:08:18 | INFO | Influenza_20260613-220730 | compute immunity curves
2026-06-13 22:08:18 | INFO | Influenza_20260613-220730 | compute primary results
2026-06-13 22:08:18 | INFO | Influenza_20260613-220730 | compute primary results for SEVERE
2026-06-13 22:08:18 | INFO | Influenza_20260613-220730 | compute primary results for SYMPTOMATIC
2026-06-13 22:08:18 | INFO | Influenza_20260613-220730 | compute primary results for FATAL
2026-06-13 22:08:18 | INFO | Influenza_20260613-220730 | compute secondary results
2026-06-13 22:08:18 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for hospitalized
2026-06-13 22:08:18 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for deaths
2026-06-13 22:08:18 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for hospitalDays
2026-06-13 22:08:18 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for hospitalCosts
2026-06-13 22:08:18 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for milds
2026-06-13 22:08:18 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for extramuralCosts
2026-06-13 22:08:18 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for workingSymptomatic
2026-06-13 22:08:18 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for sickLeaveDays
2026-06-13 22:08:18 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for sickLeaveCosts
2026-06-13 22:08:19 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for deathCosts
2026-06-13 22:08:19 | INFO | Influenza_20260613-220730 | create result-object for INTERVENTION/MAIN
2026-06-13 22:08:19 | INFO | Influenza_20260613-220730 | save ScenarioResult for (<Scenario.INTERVENTION: 2>, <UncertaintyScenario.MAIN: 1>) to JSON file ./temp/Influenza_20260613-220730/Scenario_intervention_main.json
2026-06-13 22:08:19 | INFO | Influenza_20260613-220730 | successfully saved
2026-06-13 22:08:19 | INFO | Influenza_20260613-220730 | compute scenario (<Scenario.COMPARATOR: 1>, <UncertaintyScenario.HIGH: 2>)
2026-06-13 22:08:19 | INFO | Influenza_20260613-220730 | run scenario COMPARATOR for uncertainty HIGH
2026-06-13 22:08:19 | INFO | Influenza_20260613-220730 | get already fitted parameters
2026-06-13 22:08:19 | INFO | Influenza_20260613-220730 | compute immunity curves
2026-06-13 22:08:19 | INFO | Influenza_20260613-220730 | compute primary results
2026-06-13 22:08:19 | INFO | Influenza_20260613-220730 | compute primary results for SEVERE
2026-06-13 22:08:19 | INFO | Influenza_20260613-220730 | compute primary results for SYMPTOMATIC
2026-06-13 22:08:19 | INFO | Influenza_20260613-220730 | compute primary results for FATAL
2026-06-13 22:08:19 | INFO | Influenza_20260613-220730 | compute secondary results
2026-06-13 22:08:19 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for hospitalized
2026-06-13 22:08:19 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for deaths
2026-06-13 22:08:19 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for hospitalDays
2026-06-13 22:08:19 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for hospitalCosts
2026-06-13 22:08:19 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for milds
2026-06-13 22:08:19 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for extramuralCosts
2026-06-13 22:08:19 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for workingSymptomatic
2026-06-13 22:08:19 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for sickLeaveDays
2026-06-13 22:08:19 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for sickLeaveCosts
2026-06-13 22:08:19 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for deathCosts
2026-06-13 22:08:19 | INFO | Influenza_20260613-220730 | create result-object for COMPARATOR/HIGH
2026-06-13 22:08:19 | INFO | Influenza_20260613-220730 | save ScenarioResult for (<Scenario.COMPARATOR: 1>, <UncertaintyScenario.HIGH: 2>) to JSON file ./temp/Influenza_20260613-220730/Scenario_comparator_high.json
2026-06-13 22:08:20 | INFO | Influenza_20260613-220730 | successfully saved
2026-06-13 22:08:20 | INFO | Influenza_20260613-220730 | compute scenario (<Scenario.INTERVENTION: 2>, <UncertaintyScenario.HIGH: 2>)
2026-06-13 22:08:20 | INFO | Influenza_20260613-220730 | run scenario INTERVENTION for uncertainty HIGH
2026-06-13 22:08:20 | INFO | Influenza_20260613-220730 | get already fitted parameters
2026-06-13 22:08:20 | INFO | Influenza_20260613-220730 | compute immunity curves
2026-06-13 22:08:20 | INFO | Influenza_20260613-220730 | compute primary results
2026-06-13 22:08:20 | INFO | Influenza_20260613-220730 | compute primary results for SEVERE
2026-06-13 22:08:20 | INFO | Influenza_20260613-220730 | compute primary results for SYMPTOMATIC
2026-06-13 22:08:20 | INFO | Influenza_20260613-220730 | compute primary results for FATAL
2026-06-13 22:08:20 | INFO | Influenza_20260613-220730 | compute secondary results
2026-06-13 22:08:20 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for hospitalized
2026-06-13 22:08:20 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for deaths
2026-06-13 22:08:20 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for hospitalDays
2026-06-13 22:08:20 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for hospitalCosts
2026-06-13 22:08:20 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for milds
2026-06-13 22:08:20 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for extramuralCosts
2026-06-13 22:08:20 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for workingSymptomatic
2026-06-13 22:08:20 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for sickLeaveDays
2026-06-13 22:08:20 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for sickLeaveCosts
2026-06-13 22:08:20 | INFO | Influenza_20260613-220730 | attempt to compute secondary results for deathCosts
2026-06-13 22:08:20 | INFO | Influenza_20260613-220730 | create result-object for INTERVENTION/HIGH
2026-06-13 22:08:20 | INFO | Influenza_20260613-220730 | save ScenarioResult for (<Scenario.INTERVENTION: 2>, <UncertaintyScenario.HIGH: 2>) to JSON file ./temp/Influenza_20260613-220730/Scenario_intervention_high.json
2026-06-13 22:08:20 | INFO | Influenza_20260613-220730 | successfully saved
2026-06-13 22:08:20 | INFO | Influenza_20260613-220730 | make some result plots
<Figure size 1000x400 with 3 Axes>
<Figure size 1000x400 with 3 Axes>
<Figure size 500x500 with 1 Axes>
<Figure size 1000x400 with 3 Axes>
<Figure size 1000x1000 with 4 Axes>
<Figure size 1000x1000 with 4 Axes>
<Figure size 1000x1000 with 4 Axes>
<Figure size 1000x1000 with 1 Axes>
# close the logger instances
for c in configs.values():
    file_handler = c.logger.handlers[0]
    file_handler.close()
    c.logger.removeHandler(file_handler)
# clean up
try:
    shutil.rmtree(localfolder)
    print('successfully cleaned up')
except:
    print('cleaning up was unsuccessful')
successfully cleaned up
References
  1. Bicher, M., Brodersen, J., Erber, A., Geier, P., Jeleff, M., Popper, N., Rippinger, C., Urach, C., Zauner, G., Zechmeister, M., & Zimmermann, C. (2025). Impactevaluierung von Priorisierten Impfungen [Techreport]. TU Wien. 10.48436/SQVCQ-QWG65
  2. van Engen, A., Krüger, R., Parnaby, A., Rotaru, M., Ryan, J., Samaha, D., & Tzelis, D. (2024). The Impact of Additive Population(s), Intervention, Comparator(s), and Outcomes in a European Joint Clinical Health Technology Assessment. Value in Health, 27(12), 1722–1731. 10.1016/j.jval.2024.07.024
  3. Bicher, M., Urach, C., & Popper, N. (2018, December). GEPOC ABM: A GENERIC AGENT-BASED POPULATION MODEL FOR AUSTRIA. 2018 Winter Simulation Conference (WSC). 10.1109/wsc.2018.8632170