Пример #1
0
    def comp_smin(self, lepconep4, met, jets, bjets, wjets):
        self.blank_p4 = op.construct(
            "ROOT::Math::LorentzVector<ROOT::Math::PtEtaPhiM4D<float> >",
            ([op.c_float(0.),
              op.c_float(0.),
              op.c_float(0.),
              op.c_float(0.)]))
        #vis = op.multiSwitch((op.rng_len(jets) >= 4, bjets[0].p4+bjets[1].p4+wjets[0].p4+wjets[1].p4+lep.p4),
        #                     (op.rng_len(jets) == 3, bjets[0].p4+bjets[1].p4+wjets[0].p4+lep.p4),
        #                     op.construct("ROOT::Math::LorentzVector<ROOT::Math::PtEtaPhiM4D<float> >", (op.c_float(0.),
        #                                                                                                 op.c_float(0.),
        #                                                                                                 op.c_float(0.),
        #                                                                                                 op.c_float(0.))))
        vis = op.rng_sum(
            bjets, (lambda bj: bj.p4), start=self.blank_p4) + op.rng_sum(
                wjets, (lambda wj: wj.p4), start=self.blank_p4) + lepconep4

        vis_pt = vis.Pt()
        vis_m = vis.M()
        vis_et = op.sqrt(op.pow(vis_m, 2) + op.pow(vis_pt, 2))
        met_et = met.p4.E()
        return op.sqrt(
            op.pow(vis_m, 2) + 2 *
            (vis_et * met_et -
             (vis.Px() * met.p4.Px() + vis.Py() * met.p4.Py())))
Пример #2
0
def plotJetReco(contName, cont, sel, partName):
    plots = []

    plots.append(
        Plot.make1D(contName + "_deltaR",
                    op.map(cont, lambda m: op.deltaR(m.p4, m.genJet.p4)),
                    sel,
                    EquidistantBinning(100, 0., 0.2),
                    xTitle="#Delta R(%s_{gen},%s_{reco})" %
                    (partName, partName)))
    plots.append(
        Plot.make1D(
            contName + "_deltaR2",
            op.map(cont, lambda m: op.pow(op.deltaR(m.p4, m.genJet.p4), 2)),
            sel,
            EquidistantBinning(100, 0., 0.04),
            xTitle="#Delta R^{2}(%s_{gen},%s_{reco})" % (partName, partName)))

    plots.append(
        Plot.make1D(
            contName + "_deltaPtRel",
            op.map(cont, lambda m: (m.pt - m.genJet.pt) / m.pt),
            sel,
            EquidistantBinning(100, -2., 2.),
            xTitle="P_{T}(%s_{reco})-P_{T}(%s_{gen})/P_{T}(%s_{reco})" %
            (partName, partName, partName)))
    return plots
Пример #3
0
def findJPACategoryBoosted (self, selObj, lepton, muons, electrons, fatJets, jets, bJetsL, bJetsM, met, modelPathDict, event, HLL, nodeList, plot_yield=False):
    JPAfuncDict = {'f1':evaluateJPA_Hbb2Wj, 
                   'f2':evaluateJPA_Hbb1Wj}

    JPAMaxScoreList = []
    bestCombo_per_cat = []
    
    combo2     = op.combine(jets, N=2, pred=lambda j1,j2 : j1.pt > j2.pt, samePred=lambda j1,j2 : j1.idx != j2.idx)
    fakeCombo2 = op.combine(jets, N=2, pred=lambda j1,j2 : j1.pt >= j2.pt, samePred=None)

    funckeys = [k for k in JPAfuncDict.keys()]
    for idx, func in enumerate(funckeys):
        node        = nodeList[idx]
        modelpaths  = modelPathDict.get(node)
        model = makeOddEvenEvaluator(event%2, modelpaths[1], modelpaths[0], mvaType="TMVA")
        lambdaFunc = lambda jetCombo : JPAfuncDict[func](lepton, muons, electrons, fatJets, jetCombo, bJetsL, bJetsM, met, model, HLL)

        if idx == 0:
            best = op.rng_max_element_by(combo2, lambdaFunc)
            maxScore = op.switch(best.idx != -1, best.idx.op.this.result.second, op.c_float(-1.))
        else:
            best = op.rng_max_element_by(fakeCombo2, lambdaFunc)
            #best = op.rng_max_element_by(combo2, lambdaFunc)
            maxScore = best.idx.op.this.result.second
            #maxScore = op.switch(best.idx != -1, best.idx.op.this.result.second, op.c_float(-1.))

        JPAMaxScoreList.append(op.pow((1.0 + op.sqrt((1 - maxScore)/(1 + maxScore))), -1))
        #JPAMaxScoreList.append(maxScore)
        bestCombo_per_cat.append(best)

    evtCat = makeOddEvenEvaluator(event%2, modelPathDict.get('evCat')[1], modelPathDict.get('evCat')[0], mvaType="TMVA")
    JPAL2outList = evtCat(*JPAMaxScoreList)
    maxIdx = op.rng_max_element_index(JPAL2outList)

    newSelObj  = copy(selObj)
    selObjJPAjetsIdxDict = {}
    for i, node in enumerate(nodeList):
        outSelObj = copy(newSelObj)
        outSelObj.selName += '%s'%node
        outSelObj.yieldTitle += " in %s node"%node 
        outSelObj.refine(cut = [maxIdx == op.c_int(i)])
        #if plot_yield:
        #    outSelObj.makeYield(self.yieldPlots)
        if i < 2:
            selObjJPAjetsIdxDict[node] = [outSelObj, bestCombo_per_cat[i]]
        else:
            selObjJPAjetsIdxDict[node] = [outSelObj, None]

    return JPAMaxScoreList, JPAL2outList, selObjJPAjetsIdxDict
Пример #4
0
    def __init__(self, HHself):
        # All the attributes of the BaseHH are contained in HHself object
        # All the lambdas will be saved in the highlevelLambdas object to avoid confusions of all the attributes of HH base object

        # 4-Momentum association #
        self.ll_p4 = lambda l1, l2: l1.p4 + l2.p4
        self.lljj_p4 = lambda l1, l2, j1, j2: l1.p4 + l2.p4 + j1.p4 + j2.p4
        self.lep1j_p4 = lambda lep, j1: lep.p4 + j1.p4
        self.lep2j_p4 = lambda lep, j1, j2: lep.p4 + j1.p4 + j2.p4
        self.lep3j_p4 = lambda lep, j1, j2, j3: lep.p4 + j1.p4 + j2.p4 + j3.p4
        self.lep4j_p4 = lambda lep, j1, j2, j3, j4: lep.p4 + j1.p4 + j2.p4 + j3.p4 + j4.p4

        # bReg corr 4 momenta of ak4-bTagged jet #
        self.bJetCorrP4 = lambda j: op._to.Construct(
            "ROOT::Math::LorentzVector<ROOT::Math::PtEtaPhiM4D<float> >",
            (j.pt * j.bRegCorr, j.eta, j.phi, j.mass)).result

        # Dilep-Met variables #
        self.DilepMET_deltaPhi = lambda l1, l2, met: self.ll_p4(l1, l2).Phi(
        ) - met.phi
        self.DilepMET_Pt = lambda l1, l2, met: op.sqrt(
            op.pow(met.pt * op.cos(met.phi) + self.ll_p4(l1, l2).Px(), 2) + op.
            pow(met.pt * op.sin(met.phi) + self.ll_p4(l1, l2).Py(), 2))
        # SingleLep-Met variables
        self.SinglepMet_Pt = lambda lep, met: op.sqrt(
            op.pow(met.pt * op.cos(met.phi) + lep.p4.Px(), 2) + op.pow(
                met.pt * op.sin(met.phi) + lep.p4.Py(), 2))
        self.SinglepMet_dPhi = lambda lep, met: lep.p4.Phi() - met.phi

        # Transverse mass #
        self.MT_ll = lambda l1, l2, met: op.sqrt(2 * self.ll_p4(l1, l2).Pt(
        ) * met.pt * (1 - op.cos(self.ll_p4(l1, l2).Phi() - met.phi)))
        self.MT_lljj = lambda l1, l2, j1, j2, met: op.sqrt(
            2 * self.lljj_p4(l1, l2, j1, j2).Pt() * met.pt *
            (1 - op.cos(self.lljj_p4(l1, l2, j1, j2).Phi() - met.phi)))
        self.MT = lambda lep, met: op.sqrt(2 * lep.p4.Pt() * met.pt * (
            1 - op.cos(lep.p4.Phi() - met.phi)))
        self.MT_W1W2_ljj = lambda lep, j1, j2, met: op.sqrt(
            2 * self.lep2j_p4(lep, j1, j2).Pt() * met.pt *
            (1 - op.cos(self.lep2j_p4(lep, j1, j2).Phi() - met.phi)))
        self.MT_W1W2_lj = lambda lep, j1, met: op.sqrt(
            2 * self.lep1j_p4(lep, j1).Pt() * met.pt *
            (1 - op.cos(self.lep1j_p4(lep, j1).Phi() - met.phi)))
        # TODO : clean different versions (eg MT)

        # dilep + dijet #
        self.M_lljj = lambda l1, l2, j1, j2: op.invariant_mass(
            self.lljj_p4(l1, l2, j1, j2))
        self.MinDR_lj = lambda l1, l2, j1, j2: op.min(
            op.min(op.deltaR(l1.p4, j1.p4), op.deltaR(l1.p4, j2.p4)),
            op.min(op.deltaR(l2.p4, j1.p4), op.deltaR(l2.p4, j2.p4)))

        self.MinDR_lep3j = lambda lep, j1, j2, j3: op.min(
            op.min(op.deltaR(lep.p4, j1.p4), op.deltaR(lep.p4, j2.p4)),
            op.deltaR(lep.p4, j3.p4))

        # Higgs related variables #
        self.HT2 = lambda l1, l2, j1, j2, met: op.sqrt(
            op.pow(met.pt * op.cos(met.phi) + l1.p4.Px() + l2.p4.Px(), 2) + op.
            pow(met.pt * op.sin(met.phi) + l1.p4.Py() + l2.p4.Py(), 2
                )) + op.abs((j1.p4 + j2.p4).Pt())
        self.HT2R = lambda l1, l2, j1, j2, met: self.HT2(
            met, l1, l2, j1, j2) / (met.pt + l1.p4.Pt() + l2.p4.Pt() + j1.p4.
                                    Pt() + j2.p4.Pt())
        self.HT2_l3jmet = lambda l, j1, j2, j3, met: op.sqrt(
            op.pow(met.pt * op.cos(met.phi) + l.p4.Px(), 2) + op.pow(
                met.pt * op.sin(met.phi) + l.p4.Py(), 2)) + op.abs(
                    (j1.p4 + j2.p4 + j3.p4).Pt())
        self.HT2R_l3jmet = lambda l, j1, j2, j3, met: self.HT2_l3jmet(
            met, l, j1, j2, j3) / (met.pt + l.p4.Pt() + j1.p4.Pt() + j2.p4.Pt(
            ) + j3.p4.Pt())
        self.HT2_l4jmet = lambda l, j1, j2, j3, j4, met: op.sqrt(
            op.pow(met.pt * op.cos(met.phi) + l.p4.Px(), 2) + op.pow(
                met.pt * op.sin(met.phi) + l.p4.Py(), 2)) + op.abs(
                    (j1.p4 + j2.p4 + j3.p4 + j4.p4).Pt())
        self.HT2R_l4jmet = lambda l, j1, j2, j3, j4, met: self.HT2_l4jmet(
            met, l, j1, j2, j3, j4) / (met.pt + l.p4.Pt() + j1.p4.Pt() + j2.p4.
                                       Pt() + j3.p4.Pt() + j4.p4.Pt())

        #min j1j2DR
        self.MinDiJetDRLoose = lambda j1, j2, j3: op.min(
            op.min(op.deltaR(j1.p4, j2.p4), op.deltaR(j2.p4, j3.p4)),
            op.deltaR(j1.p4, j3.p4))

        # ------------------------------------ lambdas for BDT variables ------------------------------------ #
        self.mindr_lep1_jet = lambda lep, jets: op.deltaR(
            lep.p4,
            op.sort(jets, lambda j: op.deltaR(lep.p4, j.p4))[0].p4)
        self.HT = lambda jets: op.rng_sum(jets, lambda j: j.p4.Pt())

        # mT2
        self.ET = lambda lep: op.sqrt(
            op.pow(lep.p4.M(), 2) + op.pow(lep.p4.Pt(), 2))
        self.mT2 = lambda jet, lep, met: (
            op.pow(jet.p4.M(), 2) + op.pow(lep.p4.M(), 2) + op.pow(
                met.p4.M(), 2) + 2 *
            (ET(lep) * ET(jet) -
             (lep.p4.Px() * jet.p4.Px() + lep.p4.Py() * jet.p4.Py())) + 2 *
            (ET(lep) * ET(met) -
             (lep.p4.Px() * met.p4.Px() + lep.p4.Py() * met.p4.Py())) + 2 *
            (ET(jet) * ET(met) -
             (jet.p4.Px() * met.p4.Px() + jet.p4.Py() * met.p4.Py())))

        # pZ component of met
        # https://github.com/HEP-KBFI/hh-bbww/blob/f4ab60f81a920268a3f2187b97a58ec449b26883/src/comp_metP4_B2G_18_008.cc
        # some necessary constants (visP4 = lepP4 + Wjj_simple)
        # - - - - - used to compute neuP4 - - - - - #
        _a = lambda visP4, met, mH: (op.pow(mH, 2) - op.pow(visP4.M(
        ), 2) + 2. * visP4.Px() * met.p4.Px() + 2. * visP4.Py() * met.p4.Py())
        _A = lambda visP4: 4.0 * op.pow(visP4.E(), 2) - op.pow(visP4.Pz(), 2)
        _B = lambda visP4, met, mH: -4.0 * _a(visP4, met, mH) * visP4.Pz()
        _C = lambda visP4, met, mH: 4.0 * op.pow(visP4.E(), 2) * (op.pow(
            met.p4.Px(), 2) + op.pow(met.p4.Py(), 2)) - op.pow(
                _a(visP4, met, mH), 2)
        _D = lambda visP4, met, mH: (op.pow(_B(visP4, met, mH), 2) - 4.0 * _A(
            visP4) * _C(visP4, met, mH))
        _pos = lambda visP4, met, mH: (-_B(visP4, met, mH) + op.sqrt(
            _D(visP4, met, mH))) / (2. * _A(visP4))
        _neg = lambda visP4, met, mH: (-_B(visP4, met, mH) - op.sqrt(
            _D(visP4, met, mH))) / (2. * _A(visP4))
        neuPz = lambda visP4, met, mH: (op.switch(
            _D(visP4, met, mH) < 0., -_B(visP4, met, mH) / (2. * _A(visP4)),
            op.switch(
                op.abs(_pos(visP4, met, mH)) < op.abs(_neg(visP4, met, mH)),
                _pos(visP4, met, mH), _neg(visP4, met, mH))))
        # - - - - - - - - - - - - - - - - - - - - - #
        neuP4 = lambda visP4, met, mH: op._to.Construct(
            "ROOT::Math::LorentzVector<ROOT::Math::PxPyPzE4D<float> >",
            (met.p4.Px(), met.p4.Py(), neuPz(visP4, met, mH),
             op.sqrt(
                 op.pow(met.p4.Px(), 2) + op.pow(met.p4.Py(), 2) + op.pow(
                     neuPz(visP4, met, mH), 2)))).result

        # P4 of W1 (l,neu)
        self.Wlep_simple = lambda j1P4, j2P4, lepP4, met, mH: lepP4 + neuP4(
            j1P4 + j2P4 + lepP4, met, mH)
        # P4 of W2 (j,j)
        self.Wjj_simple = lambda j1P4, j2P4: j1P4 + j2P4
        # P4 of HWW (W1 + W2)
        self.HWW_simple = lambda j1P4, j2P4, lepP4, met, mH: Wjj_simple(
            j1P4, j2P4) + Wlep_simple(lepP4, neuP4(j1P4 + j2P4 + lepP4, met, mH
                                                   ))
        # dR_HWW
        self.dR_Hww = lambda j1P4, j2P4, lepP4, met, mH: op.deltaR(
            Wjj_simple(j1P4, j2P4), Wlep_simple(j1P4, j2P4, lepP4, met, mH))
        # P4 of lep + met
        self.Wlep_met_simple = lambda lepP4, metP4: lepP4 + metP4
        # SimpleP4 of HWW (W1 + W2)
        self.HWW_met_simple = lambda j1P4, j2P4, lepP4, metP4: Wjj_simple(
            j1P4, j2P4) + Wlep_met_simple(lepP4, metP4)
        # Total P4
        self.HHP4_simple_met = lambda HbbRegP4, j1P4, j2P4, lepP4, metP4: HbbRegP4 + Wjj_simple(
            j1P4, j2P4) + Wlep_met_simple(lepP4, metP4)

        # CosThetaS calculation
        #comp_cosThetaS = lambda ob1p4, ob2p4 : op.abs(ob1p4.Boost(-(ob1p4+ob2p4).BoostVector()).CosTheta())
        motherPx = lambda ob1p4, ob2p4: (ob1p4.Px() + ob2p4.Px())
        motherPy = lambda ob1p4, ob2p4: (ob1p4.Py() + ob2p4.Py())
        motherPz = lambda ob1p4, ob2p4: (ob1p4.Pz() + ob2p4.Pz())
        motherE = lambda ob1p4, ob2p4: (ob1p4.E() + ob2p4.E())
        BoostP4 = lambda ob1p4, ob2p4: op._to.Construct(
            "ROOT::Math::LorentzVector<ROOT::Math::PxPyPzE4D<float> >",
            (motherPx(ob1p4, ob2p4), motherPy(ob1p4, ob2p4),
             motherPz(ob1p4, ob2p4), motherE(ob1p4, ob2p4))).result
        self.comp_cosThetaS = lambda ob1p4, ob2p4: op.abs(
            op.cos(op.deltaR(BoostP4(ob1p4, ob2p4), ob1p4)))

        # MET_LD
        # Equation 3 (page 33) of AN-2019/111 v13
        # Similar to MET, but more robust against pileup
        jetSumPx = lambda jets: op.rng_sum(jets, lambda j: j.p4.Px())
        jetSumPy = lambda jets: op.rng_sum(jets, lambda j: j.p4.Py())
        lepSumPx = lambda leps: op.rng_sum(leps, lambda l: l.p4.Px())
        lepSumPy = lambda leps: op.rng_sum(leps, lambda l: l.p4.Py())
        self.MET_LD = lambda met, jets, leps: 0.6 * met.pt + 0.4 * op.sqrt(
            op.pow(jetSumPx(jets) + lepSumPx(leps), 2) + op.pow(
                jetSumPy(jets) + lepSumPy(leps), 2))
Пример #5
0
def findJPACategoryResolved (self, selObj, lepton, muons, electrons, jets, bJetsL, bJetsM, met, modelPathDict, event, HLL, nodeList, plot_yield=False):
    JPAfuncDict = {'f1':evaluateJPA_2b2Wj, 
                   'f2':evaluateJPA_2b1Wj, 
                   'f3':evaluateJPA_1b2Wj, 
                   'f4':evaluateJPA_2b0Wj, 
                   'f5':evaluateJPA_1b1Wj, 
                   'f6':evaluateJPA_1b0Wj}

    JPAMaxScoreList = []
    bestCombo_per_cat = []
    
    combo2_1b0W_1Wj = op.combine(jets, N=2, samePred=lambda j1,j2 : j1.idx != j2.idx)
    combo2_2b0Wj    = op.combine(jets, N=2, pred=lambda j1,j2 : j1.pt > j2.pt,  samePred=lambda j1,j2 : j1.idx != j2.idx)
    combo3_1b2Wj    = op.combine(jets, N=3, pred=lambda j1,j2,j3 : j2.pt > j3.pt,  samePred=lambda j1,j2 : j1.idx != j2.idx)
    combo3_2b1Wj    = op.combine(jets, N=3, pred=lambda j1,j2,j3 : j1.pt > j2.pt,  samePred=lambda j1,j2 : j1.idx != j2.idx)
    combo4          = op.combine(jets, N=4, pred=lambda j1,j2,j3,j4 : op.AND(j1.pt > j2.pt, j3.pt > j4.pt), samePred=lambda j1,j2 : j1.idx != j2.idx)

    funckeys = [k for k in JPAfuncDict.keys()]
    
    for idx, func in enumerate(funckeys):
        node        = nodeList[idx]
        modelpaths  = modelPathDict.get(node)
        model = makeOddEvenEvaluator(event%2, modelpaths[1], modelpaths[0], mvaType="TMVA")
        lambdaFunc = lambda jetCombo : JPAfuncDict[func](lepton, muons, electrons, jets, jetCombo, bJetsL, bJetsM, met, model, HLL)
        
        if idx == 0:
            best = op.rng_max_element_by(combo4, lambdaFunc)
            maxScore = op.switch(best.idx != -1, best.idx.op.this.result.second, op.c_float(-1.)) 
            #best.idx.op.this.canDefine=False
        elif idx == 1:
            best = op.rng_max_element_by(combo3_2b1Wj, lambdaFunc)            ## hack: index of best is first in a pair, with the maximum value as second
            maxScore = best.idx.op.this.result.second
        elif idx == 2:
            best = op.rng_max_element_by(combo3_1b2Wj, lambdaFunc)            ## hack: index of best is first in a pair, with the maximum value as second
            maxScore = best.idx.op.this.result.second
        elif idx == 3:
            best = op.rng_max_element_by(combo2_2b0Wj, lambdaFunc)            ## hack: index of best is first in a pair, with the maximum value as second
            maxScore = best.idx.op.this.result.second
        elif idx == 4:
            best = op.rng_max_element_by(combo2_1b0W_1Wj, lambdaFunc)            ## hack: index of best is first in a pair, with the maximum value as second
            maxScore = best.idx.op.this.result.second
        else:
            best = op.rng_max_element_by(combo2_1b0W_1Wj, lambdaFunc)            ## hack: index of best is first in a pair, with the maximum value as second
            maxScore = best.idx.op.this.result.second
            
        JPAMaxScoreList.append(op.pow((1.0 + op.sqrt((1 - maxScore)/(1 + maxScore))), -1))
        #JPAMaxScoreList.append(maxScore)
        bestCombo_per_cat.append(best)

    evtCat = makeOddEvenEvaluator(event%2, modelPathDict.get('evCat')[1], modelPathDict.get('evCat')[0], mvaType="TMVA")
    
    evtCatOutList = evtCat(*JPAMaxScoreList)
    maxIdx = op.rng_max_element_index(evtCatOutList)

    newSelObj  = copy(selObj)
    selObjJPAjetsIdxDict = {}

    for i, node in enumerate(nodeList):
        outSelObj = copy(newSelObj)
        outSelObj.selName += '%s'%node
        outSelObj.yieldTitle += " in %s node"%node 
        outSelObj.refine(cut = (maxIdx == i)) 
        if i < 6:
            selObjJPAjetsIdxDict[node] = [outSelObj, bestCombo_per_cat[i]]
        else:
            selObjJPAjetsIdxDict[node] = [outSelObj, None]

    return JPAMaxScoreList, evtCatOutList, selObjJPAjetsIdxDict
Пример #6
0
def plotMatching(contName, list_cont, list_sel, partName):
    plots = []

    dr_plots = []
    dr2_plots = []
    ptrel_plots = []
    TF_plots = []
    for idx, (cont, sel) in enumerate(zip(list_cont, list_sel)):
        dr_plots.append(
            Plot.make1D(contName + str(idx) + "_deltaR",
                        op.map(cont, lambda m: op.deltaR(m[0].p4, m[1].p4)),
                        sel,
                        EquidistantBinning(100, 0., 0.2),
                        xTitle="#Delta R(%s_{gen},%s_{reco})" %
                        (partName, partName)))
        dr2_plots.append(
            Plot.make1D(contName + str(idx) + "_deltaR2",
                        op.map(
                            cont,
                            lambda m: op.pow(op.deltaR(m[0].p4, m[1].p4), 2)),
                        sel,
                        EquidistantBinning(100, 0., 0.04),
                        xTitle="#Delta R^{2}(%s_{gen},%s_{reco})" %
                        (partName, partName)))

        ptrel_plots.append(
            Plot.make1D(
                contName + str(idx) + "_deltaPtRel",
                op.map(cont, lambda m: (m[1].pt - m[0].pt) / m[1].pt),
                sel,
                EquidistantBinning(100, -2., 2.),
                xTitle="P_{T}(%s_{reco})-P_{T}(%s_{gen})/P_{T}(%s_{reco})" %
                (partName, partName, partName)))
        TF_plots.append(
            Plot.make2D(contName + str(idx) + "_TF",
                        (op.map(cont, lambda m: m[0].p4.E()),
                         op.map(cont, lambda m: m[1].p4.E() - m[0].p4.E())),
                        sel, [
                            EquidistantBinning(100, 0., 500.),
                            EquidistantBinning(400, -200., 200.)
                        ],
                        xTitle="E^{parton}(e^{-})",
                        yTitle="#Delta E = E^{reco}(%s)-E^{parton}(%s)" %
                        (partName, partName)))

    plots.append(
        SummedPlot(contName + "_deltaR",
                   dr_plots,
                   xTitle="#Delta R(%s_{gen},%s_{reco})" %
                   (partName, partName)))
    plots.append(
        SummedPlot(contName + "_deltaR2",
                   dr2_plots,
                   xTitle="#Delta R^{2}(%s_{gen},%s_{reco})" %
                   (partName, partName)))
    plots.append(
        SummedPlot(contName + "_deltaPtRel",
                   ptrel_plots,
                   xTitle="P_{T}(%s_{reco})-P_{T}(%s_{gen}/P_{T}(%s_{reco})" %
                   (partName, partName, partName)))
    plots.append(
        SummedPlot(contName + "_TF",
                   TF_plots,
                   xTitle="#Delta E = E^{reco}(%s)-E^{patron}(%s)" %
                   (partName, partName)))

    return plots
Пример #7
0
    def __init__(self, HHself):
        # All the attributes of the BaseHH are contained in HHself object
        # All the lambdas will be saved in the highlevelLambdas object to avoid confusions of all the attributes of HH base object

        # conept #
        self.conept = lambda lep: op.switch(
            op.abs(lep.pdgId) == 11, HHself.electron_conept[lep.idx], HHself.
            muon_conept[lep.idx])

        self.electron_conept = lambda ele: HHself.electron_conept[ele.idx]
        self.muon_conept = lambda mu: HHself.muon_conept[mu.idx]

        # 4-Momentum association #
        self.ll_p4 = lambda l1, l2: l1.p4 + l2.p4
        self.lljj_p4 = lambda l1, l2, j1, j2: l1.p4 + l2.p4 + j1.p4 + j2.p4
        self.lep1j_p4 = lambda lep, j1: lep.p4 + j1.p4
        self.lep2j_p4 = lambda lep, j1, j2: lep.p4 + j1.p4 + j2.p4
        self.lep3j_p4 = lambda lep, j1, j2, j3: lep.p4 + j1.p4 + j2.p4 + j3.p4
        self.lep4j_p4 = lambda lep, j1, j2, j3, j4: lep.p4 + j1.p4 + j2.p4 + j3.p4 + j4.p4

        # bReg corr 4 momenta of ak4-bTagged jet #
        self.bJetCorrP4 = lambda j: op._to.Construct(
            "ROOT::Math::LorentzVector<ROOT::Math::PtEtaPhiM4D<float> >",
            (j.pt * j.bRegCorr, j.eta, j.phi, j.mass * j.bRegCorr)).result

        # Dilep-Met variables #
        self.DilepMET_deltaPhi = lambda l1, l2, met: self.ll_p4(l1, l2).Phi(
        ) - met.phi
        self.DilepMET_Pt = lambda l1, l2, met: op.sqrt(
            op.pow(met.pt * op.cos(met.phi) + self.ll_p4(l1, l2).Px(), 2) + op.
            pow(met.pt * op.sin(met.phi) + self.ll_p4(l1, l2).Py(), 2))
        # SingleLep-Met variables
        #self.SinglepMet_Pt = lambda lep,met : op.sqrt(op.pow(met.pt*op.cos(met.phi)+lep.p4.Px(),2)+op.pow(met.pt*op.sin(met.phi)+lep.p4.Py(),2))
        self.SinglepMet_Pt = lambda lep, met: (lep.p4 + met.p4).Pt()
        #self.SinglepMet_dPhi = lambda lep, met : lep.p4.Phi()-met.phi
        self.SinglepMet_dPhi = lambda lep, met: op.deltaPhi(lep.p4, met.p4)

        # Transverse mass #
        self.MT_ll = lambda l1, l2, met: op.sqrt(2 * self.ll_p4(l1, l2).Pt(
        ) * met.pt * (1 - op.cos(self.ll_p4(l1, l2).Phi() - met.phi)))
        self.MT_lljj = lambda l1, l2, j1, j2, met: op.sqrt(
            2 * self.lljj_p4(l1, l2, j1, j2).Pt() * met.pt *
            (1 - op.cos(self.lljj_p4(l1, l2, j1, j2).Phi() - met.phi)))
        self.MT = lambda lep, met: op.sqrt(2 * lep.p4.Pt() * met.pt * (
            1 - op.cos(lep.p4.Phi() - met.phi)))
        self.MT_W1W2_ljj = lambda lep, j1, j2, met: op.sqrt(
            2 * self.lep2j_p4(lep, j1, j2).Pt() * met.pt *
            (1 - op.cos(self.lep2j_p4(lep, j1, j2).Phi() - met.phi)))
        self.MT_W1W2_lj = lambda lep, j1, met: op.sqrt(
            2 * self.lep1j_p4(lep, j1).Pt() * met.pt *
            (1 - op.cos(self.lep1j_p4(lep, j1).Phi() - met.phi)))
        # TODO : clean different versions (eg MT)

        # dilep + dijet #
        self.M_lljj = lambda l1, l2, j1, j2: op.invariant_mass(
            self.lljj_p4(l1, l2, j1, j2))
        self.M_HH = lambda l1, l2, j1, j2, met: op.invariant_mass(
            l1.p4, l2.p4, j1.p4, j2.p4, met.p4)
        self.MinDR_lj = lambda l1, l2, j1, j2: op.min(
            op.min(op.deltaR(l1.p4, j1.p4), op.deltaR(l1.p4, j2.p4)),
            op.min(op.deltaR(l2.p4, j1.p4), op.deltaR(l2.p4, j2.p4)))
        self.MinDR_part1_partCont = lambda part1, partCont: op.rng_min(
            partCont, lambda part2: op.deltaR(part1.p4, part2.p4))
        self.MinDEta_part1_partCont = lambda part1, partCont: op.rng_min(
            partCont, lambda part2: op.abs(part1.eta - part2.eta))
        self.MinDPhi_part1_partCont = lambda part1, partCont: op.rng_min(
            partCont, lambda part2: op.abs(op.deltaPhi(part1.p4, part2.p4)))

        self.MinDR_part1_dipart = lambda part1, dipart: op.min(*(
            op.deltaR(part1.p4, dipart[i2].p4) for i2 in range(2)))

        self.JetsMinDR = lambda l, j1, j2: op.min(op.deltaR(l.p4, j1.p4),
                                                  op.deltaR(l.p4, j2.p4))
        self.LepsMinDR = lambda j, l1, l2: op.min(op.deltaR(j.p4, l1.p4),
                                                  op.deltaR(j.p4, l2.p4))

        self.MinDR_lep3j = lambda lep, j1, j2, j3: op.min(
            op.min(op.deltaR(lep.p4, j1.p4), op.deltaR(lep.p4, j2.p4)),
            op.deltaR(lep.p4, j3.p4))

        self.MinDR_lj = lambda l1, l2, j1, j2: op.min(
            op.min(op.deltaR(l1.p4, j1.p4), op.deltaR(l1.p4, j2.p4)),
            op.min(op.deltaR(l2.p4, j1.p4), op.deltaR(l2.p4, j2.p4)))

        self.MinDR_lep2j = lambda lep, j1, j2: op.min(op.deltaR(lep.p4, j1.p4),
                                                      op.deltaR(lep.p4, j2.p4))
        self.MinDR_lep3j = lambda lep, j1, j2, j3: op.min(
            op.min(op.deltaR(lep.p4, j1.p4), op.deltaR(lep.p4, j2.p4)),
            op.deltaR(lep.p4, j3.p4))
        self.MinDR_lep4j = lambda lep, j1, j2, j3, j4: op.min(
            op.min(op.min(op.deltaR(lep.p4, j1.p4), op.deltaR(lep.p4, j2.p4)),
                   op.deltaR(lep.p4, j3.p4)), op.deltaR(lep.p4, j4.p4))
        self.MinDPhi_lep2j = lambda lep, j1, j2: op.min(
            op.abs(op.deltaPhi(lep.p4, j1.p4)),
            op.abs(op.deltaPhi(lep.p4, j2.p4)))
        self.MinDPhi_lep3j = lambda lep, j1, j2, j3: op.min(
            op.min(op.abs(op.deltaPhi(lep.p4, j1.p4)),
                   op.abs(op.deltaPhi(lep.p4, j2.p4))),
            op.abs(op.deltaPhi(lep.p4, j3.p4)))
        self.MinDPhi_lep4j = lambda lep, j1, j2, j3, j4: op.min(
            op.min(
                op.min(op.abs(op.deltaPhi(lep.p4, j1.p4)),
                       op.abs(op.deltaPhi(lep.p4, j2.p4))),
                op.abs(op.deltaPhi(lep.p4, j3.p4))),
            op.abs(op.deltaPhi(lep.p4, j4.p4)))
        self.MinDEta_lep2j = lambda lep, j1, j2: op.min(
            op.abs(lep.eta - j1.eta), op.abs(lep.eta - j2.eta))
        self.MinDEta_lep3j = lambda lep, j1, j2, j3: op.min(
            op.min(op.abs(lep.eta - j1.eta), op.abs(lep.eta - j2.eta)),
            op.abs(lep.eta - j3.eta))
        self.MinDEta_lep4j = lambda lep, j1, j2, j3, j4: op.min(
            op.min(op.min(op.abs(lep.eta - j1.eta), op.abs(lep.eta - j2.eta)),
                   op.abs(lep.eta - j3.eta)), op.abs(lep.eta - j4.eta))

        self.MaxDR_lep2j = lambda lep, j1, j2: op.max(op.deltaR(lep.p4, j1.p4),
                                                      op.deltaR(lep.p4, j2.p4))
        self.MaxDR_lep3j = lambda lep, j1, j2, j3: op.max(
            op.max(op.deltaR(lep.p4, j1.p4), op.deltaR(lep.p4, j2.p4)),
            op.deltaR(lep.p4, j3.p4))
        self.MaxDR_lep4j = lambda lep, j1, j2, j3, j4: op.max(
            op.max(op.max(op.deltaR(lep.p4, j1.p4), op.deltaR(lep.p4, j2.p4)),
                   op.deltaR(lep.p4, j3.p4)), op.deltaR(lep.p4, j4.p4))
        self.MaxDPhi_lep2j = lambda lep, j1, j2: op.max(
            op.abs(op.deltaPhi(lep.p4, j1.p4)),
            op.abs(op.deltaPhi(lep.p4, j2.p4)))
        self.MaxDPhi_lep3j = lambda lep, j1, j2, j3: op.max(
            op.max(op.abs(op.deltaPhi(lep.p4, j1.p4)),
                   op.abs(op.deltaPhi(lep.p4, j2.p4))),
            op.abs(op.deltaPhi(lep.p4, j3.p4)))
        self.MaxDPhi_lep4j = lambda lep, j1, j2, j3, j4: op.max(
            op.max(
                op.max(op.abs(op.deltaPhi(lep.p4, j1.p4)),
                       op.abs(op.deltaPhi(lep.p4, j2.p4))),
                op.abs(op.deltaPhi(lep.p4, j3.p4))),
            op.abs(op.deltaPhi(lep.p4, j4.p4)))
        self.MaxDEta_lep2j = lambda lep, j1, j2: op.max(
            op.abs(lep.eta - j1.eta), op.abs(lep.eta - j2.eta))
        self.MaxDEta_lep3j = lambda lep, j1, j2, j3: op.max(
            op.max(op.abs(lep.eta - j1.eta), op.abs(lep.eta - j2.eta)),
            op.abs(lep.eta - j3.eta))
        self.MaxDEta_lep4j = lambda lep, j1, j2, j3, j4: op.max(
            op.max(op.max(op.abs(lep.eta - j1.eta), op.abs(lep.eta - j2.eta)),
                   op.abs(lep.eta - j3.eta)), op.abs(lep.eta - j4.eta))

        # Higgs related variables #
        #self.HT2 = lambda l1,l2,j1,j2,met : op.sqrt(op.pow(met.pt*op.cos(met.phi)+l1.p4.Px()+l2.p4.Px(),2)+op.pow(met.pt*op.sin(met.phi)+l1.p4.Py()+l2.p4.Py(),2)) + op.abs((j1.p4+j2.p4).Pt())
        #self.HT2R = lambda l1,l2,j1,j2,met : self.HT2(met,l1,l2,j1,j2)/(met.pt+l1.p4.Pt()+l2.p4.Pt()+j1.p4.Pt()+j2.p4.Pt())
        #self.HT2_l1jmet  = lambda l,j1,met : op.sqrt(op.pow(met.pt*op.cos(met.phi)+l.p4.Px(),2)+op.pow(met.pt*op.sin(met.phi)+l.p4.Py(),2)) + op.abs(j1.p4.Pt())
        #self.HT2R_l1jmet = lambda l,j1,met : self.HT2_l1jmet(l,j1,met)/(met.pt+l.p4.Pt()+j1.p4.Pt())
        #self.HT2_l2jmet  = lambda l,j1,j2,met : op.sqrt(op.pow(met.pt*op.cos(met.phi)+l.p4.Px(),2)+op.pow(met.pt*op.sin(met.phi)+l.p4.Py(),2)) + op.abs((j1.p4+j2.p4).Pt())
        #self.HT2R_l2jmet = lambda l,j1,j2,met : self.HT2_l2jmet(l,j1,j2,met)/(met.pt+l.p4.Pt()+j1.p4.Pt()+j2.p4.Pt())
        #self.HT2_l3jmet  = lambda l,j1,j2,j3,met : op.sqrt(op.pow(met.pt*op.cos(met.phi)+l.p4.Px(),2)+op.pow(met.pt*op.sin(met.phi)+l.p4.Py(),2)) + op.abs((j1.p4+j2.p4+j3.p4).Pt())

        self.HT_SL = lambda jets: op.rng_sum(jets, lambda j: j.pt)
        # 0b
        self.HT2_0b = lambda l, met: op.abs((met.p4 + l.p4).Pt())
        self.HT2R_0b = lambda l, met: self.HT2_0b(l, met) / (met.pt + l.pt)

        # 1b0Wj
        self.HT2_1b0Wj = lambda l, j1, met: op.abs(
            (met.p4 + l.p4).Pt()) + j1.pt
        self.HT2R_1b0Wj = lambda l, j1, met: self.HT2_1b0Wj(l, j1, met) / (
            met.pt + l.pt + j1.pt)

        # 1b1Wj
        self.HT2_1b1Wj = lambda l, j1, j3, met: op.abs(
            (met.p4 + l.p4 + j3.p4).Pt()) + j1.pt
        self.HT2R_1b1Wj = lambda l, j1, j3, met: self.HT2_1b1Wj(
            l, j1, j3, met) / (met.pt + l.pt + j1.pt + j3.pt)

        #2b0Wj
        self.HT2_2b0Wj = lambda l, j1, j2, met: op.abs(
            (met.p4 + l.p4).Pt()) + op.abs((j1.p4 + j2.p4).Pt())
        self.HT2R_2b0Wj = lambda l, j1, j2, met: self.HT2_2b0Wj(
            l, j1, j2, met) / (met.pt + l.pt + j1.pt + j2.pt)

        # 1b2Wj
        self.HT2_1b2Wj = lambda l, j1, j3, j4, met: op.abs(
            (met.p4 + l.p4 + j3.p4 + j4.p4).Pt()) + j1.pt
        self.HT2R_1b2Wj = lambda l, j1, j3, j4, met: self.HT2_1b2Wj(
            l, j1, j3, j4, met) / (met.pt + l.pt + j1.pt + j3.pt + j4.pt)

        # 2b1Wj
        self.HT2_2b1Wj = lambda l, j1, j2, j3, met: op.abs(
            (met.p4 + l.p4 + j3.p4).Pt()) + op.abs((j1.p4 + j2.p4).Pt())
        self.HT2R_2b1Wj = lambda l, j1, j2, j3, met: self.HT2_2b1Wj(
            l, j1, j2, j3, met) / (met.pt + l.pt + j1.pt + j2.pt + j3.pt)

        #self.HT2_l4jmet  = lambda l,j1,j2,j3,j4,met : op.sqrt(op.pow(met.pt*op.cos(met.phi)+l.p4.Px(),2)+op.pow(met.pt*op.sin(met.phi)+l.p4.Py(),2)) + op.abs((j1.p4+j2.p4+j3.p4+j4.p4).Pt())
        # 2b2Wj
        self.HT2_2b2Wj = lambda l, j1, j2, j3, j4, met: op.abs(
            (met.p4 + l.p4 + j3.p4 + j4.p4).Pt()) + op.abs(
                (j1.p4 + j2.p4).Pt())
        self.HT2R_2b2Wj = lambda l, j1, j2, j3, j4, met: self.HT2_2b2Wj(
            l, j1, j2, j3, j4, met) / (met.pt + l.pt + j1.pt + j2.pt + j3.pt +
                                       j4.pt)

        #min j1j2DR
        self.MinDiJetDRLoose = lambda j1, j2, j3: op.min(
            op.min(op.deltaR(j1.p4, j2.p4), op.deltaR(j2.p4, j3.p4)),
            op.deltaR(j1.p4, j3.p4))
        self.MinDiJetDRTight = lambda j1, j2, j3, j4: op.min(
            op.min(
                op.min(self.MinDiJetDRLoose(j1, j2, j3), op.deltaR(
                    j1.p4, j4.p4)), op.deltaR(j2.p4, j4.p4)),
            op.deltaR(j3.p4, j4.p4))
        self.MinDiJetDEtaLoose = lambda j1, j2, j3: op.min(
            op.min(op.abs(j1.eta - j2.eta), op.abs(j2.eta - j3.eta)),
            op.abs(j1.eta - j3.eta))
        self.MinDiJetDEtaTight = lambda j1, j2, j3, j4: op.min(
            op.min(
                op.min(self.MinDiJetDEtaLoose(j1, j2, j3),
                       op.abs(j1.eta - j4.eta)), op.abs(j2.eta - j4.eta)),
            op.abs(j3.eta - j4.eta))
        self.MinDiJetDPhiLoose = lambda j1, j2, j3: op.min(
            op.min(op.abs(op.deltaPhi(j1.p4, j2.p4)),
                   op.abs(op.deltaPhi(j2.p4, j3.p4))),
            op.abs(op.deltaPhi(j1.p4, j3.p4)))
        self.MinDiJetDPhiTight = lambda j1, j2, j3, j4: op.min(
            op.min(
                op.min(self.MinDiJetDPhiLoose(j1, j2, j3),
                       op.abs(op.deltaPhi(j1.p4, j4.p4))),
                op.abs(op.deltaPhi(j2.p4, j4.p4))),
            op.abs(op.deltaPhi(j3.p4, j4.p4)))

        self.MaxDiJetDRLoose = lambda j1, j2, j3: op.max(
            op.max(op.deltaR(j1.p4, j2.p4), op.deltaR(j2.p4, j3.p4)),
            op.deltaR(j1.p4, j3.p4))
        self.MaxDiJetDRTight = lambda j1, j2, j3, j4: op.max(
            op.max(
                op.max(self.MaxDiJetDRLoose(j1, j2, j3), op.deltaR(
                    j1.p4, j4.p4)), op.deltaR(j2.p4, j4.p4)),
            op.deltaR(j3.p4, j4.p4))
        self.MaxDiJetDEtaLoose = lambda j1, j2, j3: op.max(
            op.max(op.abs(j1.eta - j2.eta), op.abs(j2.eta - j3.eta)),
            op.abs(j1.eta - j3.eta))
        self.MaxDiJetDEtaTight = lambda j1, j2, j3, j4: op.max(
            op.max(
                op.max(self.MaxDiJetDEtaLoose(j1, j2, j3),
                       op.abs(j1.eta - j4.eta)), op.abs(j2.eta - j4.eta)),
            op.abs(j3.eta - j4.eta))
        self.MaxDiJetDPhiLoose = lambda j1, j2, j3: op.max(
            op.max(op.abs(op.deltaPhi(j1.p4, j2.p4)),
                   op.abs(op.deltaPhi(j2.p4, j3.p4))),
            op.abs(op.deltaPhi(j1.p4, j3.p4)))
        self.MaxDiJetDPhiTight = lambda j1, j2, j3, j4: op.max(
            op.max(
                op.max(self.MaxDiJetDPhiLoose(j1, j2, j3),
                       op.abs(op.deltaPhi(j1.p4, j4.p4))),
                op.abs(op.deltaPhi(j2.p4, j4.p4))),
            op.abs(op.deltaPhi(j3.p4, j4.p4)))

        # ------------------------------------ lambdas for BDT variables ------------------------------------ #
        # min jet-lep DR
        self.mindr_lep1_jet = lambda lep, jets: op.deltaR(
            lep.p4,
            op.sort(jets, lambda j: op.deltaR(lep.p4, j.p4))[0].p4)

        # HT
        self.HTfull = lambda fleps, j1p4, j2p4, j3p4, j4p4: j1p4.Pt(
        ) + j2p4.Pt() + j3p4.Pt() + j4p4.Pt() + op.rng_sum(
            fleps, lambda l: l.p4.Pt())
        self.HTmiss = lambda fleps, j1p4, j2p4, j3p4: j1p4.Pt() + j2p4.Pt(
        ) + j3p4.Pt() + op.rng_sum(fleps, lambda l: l.p4.Pt())

        # mT2
        ET = lambda lepp4: op.sqrt(
            op.pow(lepp4.M(), 2) + op.pow(lepp4.Pt(), 2))
        self.mT2 = lambda jetp4, lepp4, metp4: (
            op.pow(jetp4.M(), 2) + op.pow(lepp4.M(), 2) + op.pow(metp4.M(), 2)
            + 2 * (ET(lepp4) * ET(jetp4) -
                   (lepp4.Px() * jetp4.Px() + lepp4.Py() * jetp4.Py())) + 2 *
            (ET(lepp4) * ET(metp4) -
             (lepp4.Px() * metp4.Px() + lepp4.Py() * metp4.Py())) + 2 *
            (ET(jetp4) * ET(metp4) -
             (jetp4.Px() * metp4.Px() + jetp4.Py() * metp4.Py())))

        # pZ component of met
        # https://github.com/HEP-KBFI/hh-bbww/blob/f4ab60f81a920268a3f2187b97a58ec449b26883/src/comp_metP4_B2G_18_008.cc
        # some necessary constants (visP4 = lepP4 + Wjj_simple)
        # - - - - - used to compute neuP4 - - - - - #
        ax = lambda visP4, met: 125.18 * 125.18 - op.pow(visP4.M(
        ), 2) + 2. * visP4.Px() * met.p4.Px() + 2. * visP4.Py() * met.p4.Py()
        A = lambda visP4: 4.0 * op.pow(visP4.E(), 2) - op.pow(visP4.Pz(), 2)
        B = lambda visP4, met: -4.0 * ax(visP4, met) * visP4.Pz()
        C = lambda visP4, met: 4.0 * op.pow(visP4.E(), 2) * (op.pow(
            met.p4.Px(), 2) + op.pow(met.p4.Py(), 2)) - op.pow(
                ax(visP4, met), 2)
        D = lambda visP4, met: (op.pow(B(visP4, met), 2) - 4.0 * A(visP4) * C(
            visP4, met))
        pos = lambda visP4, met: (-B(visP4, met) + op.sqrt(D(visP4, met))) / (
            2. * A(visP4))
        neg = lambda visP4, met: (-B(visP4, met) - op.sqrt(D(visP4, met))) / (
            2. * A(visP4))
        neuPz = lambda visP4, met: (op.switch(
            D(visP4, met) < 0., -B(visP4, met) / (2 * A(visP4)),
            op.switch(
                op.abs(pos(visP4, met)) < op.abs(neg(visP4, met)),
                pos(visP4, met), neg(visP4, met))))
        # - - - - - - - - - - - - - - - - - - - - - #
        self.neuP4 = lambda visP4, met: op._to.Construct(
            "ROOT::Math::LorentzVector<ROOT::Math::PxPyPzE4D<float> >",
            (met.p4.Px(), met.p4.Py(), neuPz(visP4, met),
             op.sqrt(
                 op.pow(met.p4.Px(), 2) + op.pow(met.p4.Py(), 2) + op.pow(
                     neuPz(visP4, met), 2)))).result

        # P4 of W1 (l,neu)
        self.Wlep_simple = lambda wj1P4, wj2P4, lepP4, met: lepP4 + self.neuP4(
            wj1P4 + wj2P4 + lepP4, met)
        # P4 of W2 (j,j)
        self.Wjj_simple = lambda j1P4, j2P4: j1P4 + j2P4
        # DR_HadW_bJet
        self.dR_HadW_bjet = lambda bP4, j1P4, j2P4: op.deltaR(
            self.Wjj_simple(j1P4, j2P4), bP4)
        # P4 of HWW (W1 + W2)
        self.HWW_simple = lambda wj1P4, wj2P4, lepP4, met: self.Wjj_simple(
            wj1P4, wj2P4) + self.Wlep_simple(wj1P4, wj2P4, lepP4, met)
        # dR_HWW
        self.dR_Hww = lambda j1P4, j2P4, lepP4, met: op.deltaR(
            self.Wjj_simple(j1P4, j2P4),
            self.Wlep_simple(j1P4, j2P4, lepP4, met))
        self.dEta_Hww = lambda j1P4, j2P4, lepP4, met: op.abs(
            self.Wjj_simple(j1P4, j2P4).Eta() - self.Wlep_simple(
                j1P4, j2P4, lepP4, met).Eta())
        self.dPhi_Hww = lambda j1P4, j2P4, lepP4, met: op.abs(
            op.deltaPhi(self.Wjj_simple(j1P4, j2P4),
                        self.Wlep_simple(j1P4, j2P4, lepP4, met)))
        # P4 of lep + met
        self.Wlep_met_simple = lambda lepP4, metP4: lepP4 + metP4
        # SimpleP4 of HWW (W1 + W2)
        self.HWW_met_simple = lambda j1P4, j2P4, lepP4, metP4: self.Wjj_simple(
            j1P4, j2P4) + self.Wlep_met_simple(lepP4, metP4)
        # Total P4
        self.HHP4_simple_met = lambda HbbRegP4, j1P4, j2P4, lepP4, metP4: HbbRegP4 + self.Wjj_simple(
            j1P4, j2P4) + self.Wlep_met_simple(lepP4, metP4)

        # CosThetaS calculation
        #comp_cosThetaS = lambda ob1p4, ob2p4 : op.abs(ob1p4.Boost(-(ob1p4+ob2p4).BoostVector()).CosTheta())
        motherPx = lambda ob1p4, ob2p4: (ob1p4.Px() + ob2p4.Px())
        motherPy = lambda ob1p4, ob2p4: (ob1p4.Py() + ob2p4.Py())
        motherPz = lambda ob1p4, ob2p4: (ob1p4.Pz() + ob2p4.Pz())
        motherE = lambda ob1p4, ob2p4: (ob1p4.E() + ob2p4.E())
        betaX = lambda ob1p4, ob2p4: motherPx(ob1p4, ob2p4) / motherE(
            ob1p4, ob2p4)
        betaY = lambda ob1p4, ob2p4: motherPy(ob1p4, ob2p4) / motherE(
            ob1p4, ob2p4)
        betaZ = lambda ob1p4, ob2p4: motherPz(ob1p4, ob2p4) / motherE(
            ob1p4, ob2p4)
        beta2 = lambda ob1p4, ob2p4: op.pow(betaX(ob1p4, ob2p4), 2) + op.pow(
            betaY(ob1p4, ob2p4), 2) + op.pow(betaZ(ob1p4, ob2p4), 2)
        gamma = lambda ob1p4, ob2p4: 1.0 / op.sqrt(1 - beta2(ob1p4, ob2p4))
        betap = lambda ob1p4, ob2p4: betaX(ob1p4, ob2p4) * motherPx(
            ob1p4, ob2p4) + betaY(ob1p4, ob2p4) * motherPy(
                ob1p4, ob2p4) + betaZ(ob1p4, ob2p4) * motherPz(ob1p4, ob2p4)
        gamma2 = lambda ob1p4, ob2p4: op.switch(
            beta2(ob1p4, ob2p4) > 0,
            (gamma(ob1p4, ob2p4) - 1) / beta2(ob1p4, ob2p4), op.c_float(0.0))
        boostPx = lambda ob1p4, ob2p4: ob1p4.Px() + gamma2(
            ob1p4, ob2p4) * betap(ob1p4, ob2p4) * betaX(ob1p4, ob2p4) + gamma(
                ob1p4, ob2p4) * betaX(ob1p4, ob2p4) * ob1p4.E()
        boostPy = lambda ob1p4, ob2p4: ob1p4.Px() + gamma2(
            ob1p4, ob2p4) * betap(ob1p4, ob2p4) * betaY(ob1p4, ob2p4) + gamma(
                ob1p4, ob2p4) * betaY(ob1p4, ob2p4) * ob1p4.E()
        boostPz = lambda ob1p4, ob2p4: ob1p4.Pz() + gamma2(
            ob1p4, ob2p4) * betap(ob1p4, ob2p4) * betaZ(ob1p4, ob2p4) + gamma(
                ob1p4, ob2p4) * betaZ(ob1p4, ob2p4) * ob1p4.E()
        boostP = lambda ob1p4, ob2p4: op.sqrt(
            op.pow(boostPx(ob1p4, ob2p4), 2) + op.pow(boostPy(ob1p4, ob2p4), 2)
            + op.pow(boostPz(ob1p4, ob2p4), 2))
        self.comp_cosThetaS = lambda ob1p4, ob2p4: op.abs(
            boostPz(ob1p4, ob2p4) / boostP(ob1p4, ob2p4))

        #BoostP3  = lambda ob1p4,ob2p4 : op._to.Construct("ROOT::Math::TVector<ROOT::Math::PxPyPz3D<float>>",(-motherPx(ob1p4,ob2p4), -motherPy(ob1p4,ob2p4), -motherPz(ob1p4,ob2p4))).result
        #boost = lambda ob1p4,ob2p4 : op.construct("ROOT::Math::Boost", (-motherPx(ob1p4,ob2p4)/motherE(ob1p4,ob2p4),
        #                                                                -motherPy(ob1p4,ob2p4)/motherE(ob1p4,ob2p4),
        #                                                                -motherPz(ob1p4,ob2p4)/motherE(ob1p4,ob2p4)))
        #self.comp_cosThetaS = lambda ob1p4,ob2p4 : op.abs(boost(ob1p4,ob2p4)(ob1p4).CosTheta())

        #p4_boosted = lambda ob1p4,ob2p4 : op.extMethod("ROOT::Math::Boost{-motherPx(ob1p4,ob2p4)/motherE(ob1p4,ob2p4), -motherPy(ob1p4,ob2p4)/motherE(ob1p4,ob2p4), -motherPz(ob1p4,ob2p4)/motherE(ob1p4,ob2p4)}", returnType=(ob1p4+ob2p4)._typeName)(ob1p4+ob2p4)
        #self.comp_cosThetaS = lambda ob1p4,ob2p4 : op.deltaR(ob1p4, p4_boosted(ob1p4,ob2p4))

        #boost = lambda ob1p4, ob2p4: op.construct("ROOT::Math::Boost", (-betaX(ob1p4, ob2p4), -betaY(ob1p4, ob2p4), -betaZ(ob1p4, ob2p4)))
        #boostP4 = lambda ob1p4,ob2p4 : boost(ob1p4,ob2p4)(ob1p4)
        #self.comp_cosThetaS = lambda ob1p4,ob2p4 : op.abs(boostP4(ob1p4,ob2p4).Pz()/op.sqrt(op.pow(boostP4(ob1p4,ob2p4).Px(),2) + op.pow(boostP4(ob1p4,ob2p4).Py(),2) + op.pow(boostP4(ob1p4,ob2p4).Pz(),2)))

        # MET_LD
        # Equation 3 (page 33) of AN-2019/111 v13
        # Similar to MET, but more robust against pileup
        jetSumPx = lambda jets: op.rng_sum(jets, lambda j: j.p4.Px())
        jetSumPy = lambda jets: op.rng_sum(jets, lambda j: j.p4.Py())
        #lepSumPx = lambda leps : op.rng_sum(leps, lambda l : l.p4.Px())
        #lepSumPy = lambda leps : op.rng_sum(leps, lambda l : l.p4.Py())
        lepSumPx = lambda mus, els: op.rng_sum(mus, lambda l: l.p4.Px(
        )) + op.rng_sum(els, lambda l: l.p4.Px())
        lepSumPy = lambda mus, els: op.rng_sum(mus, lambda l: l.p4.Py(
        )) + op.rng_sum(els, lambda l: l.p4.Py())
        self.MET_LD = lambda met, jets, mus, els: 0.6 * met.pt + 0.4 * op.sqrt(
            op.pow(jetSumPx(jets) + lepSumPx(mus, els), 2) + op.pow(
                jetSumPy(jets) + lepSumPy(mus, els), 2))

        empty_p4 = op.construct(
            "ROOT::Math::LorentzVector<ROOT::Math::PtEtaPhiM4D<float> >",
            ([op.c_float(0.),
              op.c_float(0.),
              op.c_float(0.),
              op.c_float(0.)]))
        self.MET_LD_DL = lambda met, jets, electrons, muons : 0.6 * met.pt +\
                    0.4* (op.rng_sum(jets, (lambda j : j.p4), start=empty_p4) + op.rng_sum(electrons, (lambda e : e.p4), start=empty_p4) + op.rng_sum(muons, (lambda m : m.p4), start=empty_p4)).Pt()

        # conept
        self.lambdaConePt = lambda lep: op.switch(
            op.abs(lep.pdgId) == 13, HHself.muon_conept[lep.idx], HHself.
            electron_conept[lep.idx])

        # angle between 2 planes
        aDotB = lambda a, b: a.Px() * b.Px() + a.Py() * b.Py() + a.Pz() * b.Pz(
        )
        aMagB = lambda a, b: (op.sqrt(
            op.pow(a.Px(), 2) + op.pow(a.Py(), 2) + op.pow(a.Pz(), 2))) * (
                op.sqrt(
                    op.pow(b.Px(), 2) + op.pow(b.Py(), 2) + op.pow(b.Pz(), 2)))
        self.angleWWplane = lambda lp4, met, j3p4, j4p4: op.acos(
            aDotB(j3p4 + j4p4,
                  self.neuP4(j3p4 + j4p4 + lp4, met) + lp4) / aMagB(
                      j3p4 + j4p4,
                      self.neuP4(j3p4 + j4p4 + lp4, met) + lp4))
        #self.angleWWplane = lambda lp4, met, j3p4, j4p4 : ((j3p4+j4p4).Vect().Unit()).Angle((self.neuP4(j3p4+j4p4+lp4, met)+lp4).Vect().Unit())
        self.angleBetPlanes = lambda j1p4, j2p4, j3p4, j4p4: op.acos(
            op.c_float(
                aDotB(j1p4 + j2p4, j3p4 + j4p4) / aMagB(
                    j1p4 + j2p4, j3p4 + j4p4)))

        self.empty_p4 = op.construct(
            "ROOT::Math::LorentzVector<ROOT::Math::PtEtaPhiM4D<float> >",
            ([op.c_float(0.),
              op.c_float(0.),
              op.c_float(0.),
              op.c_float(0.)]))
        self.MET_LD_DL = lambda met, jets, electrons, muons : 0.6 * met.pt +\
                    0.4* (op.rng_sum(jets, (lambda j : j.p4), start=self.empty_p4) + op.rng_sum(electrons, (lambda e : e.p4), start=self.empty_p4) + op.rng_sum(muons, (lambda m : m.p4), start=self.empty_p4)).Pt()

        self.isBoosted = op.AND(
            op.rng_len(HHself.ak8BJets) >= 1,
            op.rng_len(HHself.ak4JetsCleanedFromAk8b) >= 1)
        #self.isBoosted  = op.rng_len(HHself.ak8BJets) >= 1
        self.isResolved = op.AND(
            op.rng_len(HHself.ak4Jets) >= 3,
            op.rng_len(HHself.ak4BJets) >= 1,
            op.rng_len(HHself.ak8BJets) == 0)
        #self.has1Wj     = op.rng_len(HHself.probableWJets) == 1
        #self.has2Wj     = op.rng_len(HHself.wJetsPairs) >= 1
        #self.isFullReco = op.AND(op.rng_len(HHself.bJetsByScore) >= 2, op.rng_len(HHself.wJetsPairs) >= 1)
        #self.isMissReco = op.AND(op.rng_len(HHself.bJetsByScore) >= 2, op.rng_len(HHself.probableWJets) == 1)

        #self.comp_m_hh_bregcorr = lambda bjets, wjets, lep, met : (op.rng_sum(bjets, (lambda bj : self.bJetCorrP4(bj)), start=empty_p4) +
        #                                                           op.rng_sum(wjets, (lambda wj : self.bJetCorrP4(wj)), start=empty_p4) +
        #                                                           met.p4 +
        #                                                           lep.p4).M()
        self.comp_m_hh_bregcorr = lambda bjets, wjets, lepconep4, met: (
            op.rng_sum(bjets, (lambda bj: self.bJetCorrP4(bj)), start=empty_p4)
            + op.rng_sum(wjets, (lambda wj: self.bJetCorrP4(wj)),
                         start=empty_p4) + met.p4 + lepconep4).M()

        #self.comp_pt_hh         = lambda bjets, wjets, lep, met : (op.rng_sum(bjets, (lambda bj : bj.p4), start=empty_p4) +
        #                                                           op.rng_sum(wjets, (lambda wj : wj.p4), start=empty_p4) +
        #                                                           met.p4 +
        #                                                           lep.p4).Pt()
        self.comp_pt_hh = lambda bjets, wjets, lepconep4, met: (op.rng_sum(
            bjets, (lambda bj: bj.p4), start=empty_p4) + op.rng_sum(
                wjets,
                (lambda wj: wj.p4), start=empty_p4) + met.p4 + lepconep4).Pt()
        #self.comp_dphi_hbb_hww  = lambda bjets, wjets, lep, met : op.deltaPhi((op.rng_sum(wjets, (lambda wj : wj.p4), start=empty_p4) + met.p4 + lep.p4),
        #                                                                            op.rng_sum(bjets, (lambda bj : bj.p4), start=empty_p4))
        #self.comp_dphi_hbb_hwwvis = lambda bjets, wjets, lep : op.deltaPhi((op.rng_sum(wjets, (lambda wj : wj.p4), start=empty_p4) + lep.p4),
        #                                                                         op.rng_sum(bjets, (lambda bj : bj.p4), start=empty_p4))
        self.comp_dphi_hbb_hww = lambda bjets, wjets, lepconep4, met: op.deltaPhi(
            (op.rng_sum(wjets, (lambda wj: wj.p4), start=empty_p4) + met.p4 +
             lepconep4), op.rng_sum(bjets, (lambda bj: bj.p4), start=empty_p4))
        self.comp_dphi_hbb_hwwvis = lambda bjets, wjets, lepconep4: op.deltaPhi(
            (op.rng_sum(wjets,
                        (lambda wj: wj.p4), start=empty_p4) + lepconep4),
            op.rng_sum(bjets, (lambda bj: bj.p4), start=empty_p4))