def set_smearing( self, pdgids=None, energy_resolution_abs=0.0, energy_resolution_rel=0.0, pt_resolution_abs=0.0, pt_resolution_rel=0.0, eta_resolution_abs=0.0, eta_resolution_rel=0.0, phi_resolution_abs=0.0, phi_resolution_rel=0.0, ): """ Sets up the smearing of measured momenta from shower and detector effects. This function can be called with pdgids=None, in which case the settinigs are used for all visible particles, or with pdgids set to a list of PDG ids representing particles, for instance [11, -11] for electrons (and positrons). For all particles of this type, and for the energy, pT, phi, and eta, the measurement error is drawn from a Gaussian with mean 0 and standard deviation given by `(X_resolution_abs + X * X_resolution_rel)`. Here `X` is the quantity (E, pT, phi, eta) of interest and X_resolution_abs and X_resolution_rel are the corresponding keywords. In the case of energy and pT, values smaller than 0 will lead to a re-drawing of the measurement error. Instead of such numerical values, either the energy or pT resolution (but not both!) may be set to None. In this case, this quantity is calculated from the mass of the particle and all other smeared particles. For instance, when pt_resolution_abs is None or pt_resolution_rel is None, for the given particles the energy, phi, and eta are smeared (according to their respective resolutions). Then the transverse momentum is calculated from the on-shell condition `p^2 = m^2`, or `pT = sqrt(E^2 - m^2) / cosh(eta)`. When this does not have a solution, the pT is set to zero. On the other hand, when energy_resolution_abs is None or energy_resolution_abs is None, for the given particles the pT, phi, and eta are smeared, and then the energy is calculated as `E = sqrt(pT * cosh(eta))^2 + m^2)`. Parameters ---------- pdgids : None or list of int, optional Defines the particles these smearing functions affect. If None, all particles are affected. Note that if set_smearing() is called multiple times for a given particle, the earlier calls will be forgotten and only the last smearing function will take effect. Default value: None. energy_resolution_abs : float or None, optional Absolute measurement uncertainty for the energy in GeV. None means that the energy is not smeared directly, but calculated from the on-shell condition. Default value: 0. energy_resolution_rel : float or None, optional Relative measurement uncertainty for the energy. None means that the energy is not smeared directly, but calculated from the on-shell condition. Default value: 0. pt_resolution_abs : float or None, optional Absolute measurement uncertainty for the pT in GeV. None means that the pT is not smeared directly, but calculated from the on-shell condition. Default value: 0. pt_resolution_rel : float or None, optional Relative measurement uncertainty for the pT. None means that the pT is not smeared directly, but calculated from the on-shell condition. Default value: 0. eta_resolution_abs : float, optional Absolute measurement uncertainty for eta. Default value: 0. eta_resolution_rel : float, optional Relative measurement uncertainty for eta. Default value: 0. phi_resolution_abs : float, optional Absolute measurement uncertainty for phi. Default value: 0. phi_resolution_rel : float, optional Relative measurement uncertainty for phi. Default value: 0. Returns ------- None """ if pdgids is None: pdgids = get_elementary_pdg_ids() for pdgid in pdgids: self.energy_resolution[pdgid] = (energy_resolution_abs, energy_resolution_rel) self.pt_resolution[pdgid] = (pt_resolution_abs, pt_resolution_rel) self.eta_resolution[pdgid] = (eta_resolution_abs, eta_resolution_rel) self.phi_resolution[pdgid] = (phi_resolution_abs, phi_resolution_rel)
def __init__(self, filename): # Initialize samples self.lhe_sample_filenames = [] self.sample_k_factors = [] self.sample_is_backgrounds = [] self.sampling_benchmarks = [] self.sample_systematics = [] # Initialize observables self.observables = OrderedDict() # Initialize cuts self.cuts = [] # Initialize efficiencies self.efficiencies = [] # Smearing function parameters self.energy_resolution = {} self.pt_resolution = {} self.eta_resolution = {} self.phi_resolution = {} for pdgid in get_elementary_pdg_ids(): self.energy_resolution[pdgid] = (0.0, 0.0) self.pt_resolution[pdgid] = (0.0, 0.0) self.eta_resolution[pdgid] = (0.0, 0.0) self.phi_resolution[pdgid] = (0.0, 0.0) self.pt_resolution["met"] = (0.0, 0.0) # Initialize samples self.reference_benchmark = None self.observations = None self.weights = None self.events_sampling_benchmark_ids = [] # Initialize event summary self.signal_events_per_benchmark = None self.background_events = None # Information from .h5 file self.filename = filename ( _, benchmarks, _, _, _, _, _, self.systematics, _, _, _, _, _, _, ) = load_madminer_settings(filename, include_nuisance_benchmarks=False) self.benchmark_names_phys = list(benchmarks.keys()) self.n_benchmarks_phys = len(benchmarks) # Initialize nuisance parameters self.nuisance_parameters = OrderedDict()