def select_event(
    event                             = None,
    selection                         = "all",
    required_variables                = None,
    ensure_required_variables_present = False,
    verbose                           = True
    ):

    """
    Select a HEP event.
    """

    if required_variables is None:
        required_variables = [
            "Aplan_bjets",
            "Aplan_jets",
            "Centrality_all",
            "ClassifBDTOutput_6jsplit",
            "ClassifBDTOutput_basic",
            "ClassifBDTOutput_withReco_6jsplit",
            "ClassifBDTOutput_withReco_basic",
            "ClassifHPLUS_Semilep_HF_BDT200_Output",
            "dEtajj_MaxdEta",
            "dRbb_avg",
            "dRbb_MaxM",
            "dRbb_MaxPt",
            "dRbb_min",
            "dRbj_Wmass",
            "dRHl_MaxdR",
            "dRHl_MindR",
            "dRjj_min",
            "dRlepbb_MindR",
            "dRlj_MindR",
            "dRuu_MindR",
            "H1_all",
            "H4_all",
            "HhadT_nJets",
            "HiggsbbM",
            "HiggsjjM",
            "HT_all",
            "HT_jets",
            "Mbb_MaxM",
            "Mbb_MaxPt",
            "Mbb_MindR",
            "Mbj_MaxPt",
            "Mbj_MindR",
            "Mbj_Wmass",
            "met_met",
            "met_phi",
            "MHiggs",
            "Mjj_HiggsMass",
            "Mjjj_MaxPt",
            "Mjj_MaxPt",
            "Mjj_MindR",
            "Mjj_MinM",
            "mu",
            "Muu_MindR",
            "NBFricoNN_dil",
            "nBTags",
            "nBTags30",
            "nBTags50",
            "nBTags60",
            "nBTags70",
            "nBTags77",
            "nBTags80",
            "nBTags85",
            "nBTags90",
            "nBTagsFlatBEff_30",
            "nBTagsFlatBEff_40",
            "nBTagsFlatBEff_50",
            "nBTagsFlatBEff_60",
            "nBTagsFlatBEff_70",
            "nBTagsFlatBEff_77",
            "nBTagsFlatBEff_85",
            "nElectrons",
            "nHFJets",
            "NHiggs_30",
            "Njet_pt40",
            "Njet_pt40",
            "nJets",
            "nMuons",
            "nPrimaryVtx",
            "pT_jet3",
            "pT_jet5",
            "pTuu_MindR",
            "semilepMVAreco_b1higgsbhadtop_dR",
            "semilepMVAreco_bbhiggs_dR",
            "semilepMVAreco_BDT_output",
            "semilepMVAreco_BDT_output_6jsplit",
            "semilepMVAreco_BDT_output_truthMatchPattern",
            "semilepMVAreco_BDT_withH_output",
            "semilepMVAreco_BDT_withH_output_6jsplit",
            "semilepMVAreco_BDT_withH_output_truthMatchPattern",
            "semilepMVAreco_hadWb1Higgs_mass",
            "semilepMVAreco_higgsbhadtop_withH_dR",
            "semilepMVAreco_higgsbleptop_mass",
            "semilepMVAreco_higgsbleptop_withH_dR",
            "semilepMVAreco_higgslep_dR",
            "semilepMVAreco_higgsleptop_dR",
            "semilepMVAreco_higgs_mass",
            "semilepMVAreco_higgsq1hadW_mass",
            "semilepMVAreco_higgsttbar_withH_dR",
            "semilepMVAreco_leptophadtop_dR",
            "semilepMVAreco_leptophadtop_withH_dR",
            "semilepMVAreco_Ncombinations",
            "semilepMVAreco_nuApprox_recoBDT",
            "semilepMVAreco_nuApprox_recoBDT_6jsplit",
            "semilepMVAreco_nuApprox_recoBDT_withH",
            "semilepMVAreco_nuApprox_recoBDT_withH_6jsplit",
            "semilepMVAreco_ttH_Ht_withH",
            #"ttHF_mva_discriminant",
            "el_d0sig[0]",
            "el_delta_z0_sintheta[0]",
            "el_e[0]",
            "el_eta[0]",
            "el_phi[0]",
            "el_pt[0]",
            "el_topoetcone20[0]",
            #"mu_d0sig[0]",
            #"mu_delta_z0_sintheta[0]",
            #"mu_e[0]",
            #"mu_eta[0]",
            #"mu_phi[0]",
            #"mu_pt[0]",
            "mu_topoetcone20[0]",
            "jet_e[0]",
            "jet_eta[0]",
            "jet_jvt[0]",
            "jet_mv2c10[0]",
            "jet_mv2c20[0]",
            "jet_phi[0]",
            "jet_pt[0]",
            "jet_semilepMVAreco_recoBDT_cand[0]",
            "jet_semilepMVAreco_recoBDT_cand_6jsplit[0]",
            "jet_semilepMVAreco_recoBDT_withH_cand[0]",
            "jet_semilepMVAreco_recoBDT_withH_cand_6jsplit[0]",
            "jet_e[1]",
            "jet_eta[1]",
            "jet_jvt[1]",
            "jet_mv2c10[1]",
            "jet_mv2c20[1]",
            "jet_phi[1]",
            "jet_pt[1]",
            "jet_semilepMVAreco_recoBDT_cand[1]",
            "jet_semilepMVAreco_recoBDT_cand_6jsplit[1]",
            "jet_semilepMVAreco_recoBDT_withH_cand[1]",
            "jet_semilepMVAreco_recoBDT_withH_cand_6jsplit[1]",
            "jet_e[2]",
            "jet_eta[2]",
            "jet_jvt[2]",
            "jet_mv2c10[2]",
            "jet_mv2c20[2]",
            "jet_phi[2]",
            "jet_pt[2]",
            "jet_semilepMVAreco_recoBDT_cand[2]",
            "jet_semilepMVAreco_recoBDT_cand_6jsplit[2]",
            "jet_semilepMVAreco_recoBDT_withH_cand[2]",
            "jet_semilepMVAreco_recoBDT_withH_cand_6jsplit[2]",
            "jet_e[3]",
            "jet_eta[3]",
            "jet_jvt[3]",
            "jet_mv2c10[3]",
            "jet_mv2c20[3]",
            "jet_phi[3]",
            "jet_pt[3]",
            "jet_semilepMVAreco_recoBDT_cand[3]",
            "jet_semilepMVAreco_recoBDT_cand_6jsplit[3]",
            "jet_semilepMVAreco_recoBDT_withH_cand[3]",
            "jet_semilepMVAreco_recoBDT_withH_cand_6jsplit[3]"
        ]

    if ensure_required_variables_present and not all([hasattr(event, variable) for variable in required_variables]):

        return False

    #for variable in required_variables:
    #    if not hasattr(event, variable):
    #        print("missing {variable}".format(variable = variable))

    # By default, do not pass.
    conditions = [False]

    if selection == "ejets":

        conditions = [
            event.nElectrons == 1,                      # Require 1 electron.
            event.nJets >= 4,                           # Require >= 4 jets.
            #event.nLjets >= 1                          # Require a single large-R jet.
        ]

    elif selection == "mujets":

        conditions = [
            event.nMuons == 1,                          # Require 1 muon.
            event.nJets >= 4,                           # Require >= 4 jets.
            #event.nLjets >= 1                          # Require a single large-R jet.
        ]

    if selection == "ejets_5JE4BI":

        conditions = [
            event.nElectrons == 1,                      # Require 1 electron.
            event.nJets == 5,                           # Require 5 jets.
            event.nBTags >= 4                           # Require >= 4 b tags.
            #event.nLjets >= 1                          # Require a single large-R jet.
        ]

    if selection == "ejets_6JI4BI":

        conditions = [
            event.nElectrons == 1,                      # Require 1 electron.
            event.nJets >= 6,                           # Require >=6 jets.
            event.nBTags >= 4                           # Require >= 4 b tags.
            #event.nLjets >= 1                          # Require a single large-R jet.
        ]

    elif selection == "all":

        conditions = [
            event.nElectrons == 1 or event.nMuons == 1, # Require 1 electron or 1 muon.
            event.nJets >= 4,                           # Require >= 4 jets.
            #event.nLjets >= 1                          # Require a single large-R jet.
        ]

    if all(conditions):

        if verbose:
            log.info("event number {event_number} passed selection {selection}".format(
                event_number = event.eventNumber,
                selection    = selection
            ))

        return True

    else:

        return False