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())))
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
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
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))
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
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
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))