diff --git a/rate-estimation/menu2lib/menu2lib.py b/rate-estimation/menu2lib/menu2lib.py index 1236d0a..5416a22 100644 --- a/rate-estimation/menu2lib/menu2lib.py +++ b/rate-estimation/menu2lib/menu2lib.py @@ -1,3 +1,4 @@ + """L1 trigger menu to C++ library for rate estimations.""" import argparse @@ -145,7 +146,7 @@ def hasCorrelationCuts(condition): for cut in condition.getCuts(): if cut.getCutType() in (tmEventSetup.DeltaEta, tmEventSetup.OvRmDeltaR, tmEventSetup.Mass, tmEventSetup.MassUpt, - tmEventSetup.OvRmDeltaEta, tmEventSetup.DeltaR): + tmEventSetup.OvRmDeltaEta, tmEventSetup.DeltaR, tmEventSetup.MassDeltaR): requireDeltaEta = True if requireDeltaEta: @@ -332,6 +333,8 @@ def getLookUpTable(scaleMap, obj1, obj2): precisionMath = getPrecision(scaleMap, obj1, obj2, 'Math') precisionPt = getPrecision(scaleMap, obj1, obj2, 'MassPt') + precisionInvDeltaR = getPrecision(scaleMap, obj1, obj2, 'InverseDeltaRMath') + has_deta = not (isVectorSum(obj1) or isVectorSum(obj2)) convert = ((obj1.getType() != obj2.getType()) and @@ -347,6 +350,7 @@ def getLookUpTable(scaleMap, obj1, obj2): rc['PREC_MASS'] = 2*precisionPt + precisionMath rc['COS_DPHI'] = "LUT_COS_DPHI_%s_%s" % (getObjectName(obj1), getObjectName(obj2)) + if has_unconstrained_pt: rc['UPT0'] = "LUT_%s_UPT" % getObjectName(obj1) rc['UPT1'] = "LUT_%s_UPT" % getObjectName(obj2) @@ -356,6 +360,8 @@ def getLookUpTable(scaleMap, obj1, obj2): rc['COSH_DETA'] = "LUT_COSH_DETA_%s_%s" % (getObjectName(obj1), getObjectName(obj2)) rc['PREC_DR'] = 2*precisionDelta + rc['PREC_MASSDR'] = 2*precisionPt + precisionMath + precisionInvDeltaR + if convert: if obj1.getType() == tmEventSetup.Muon: rc['CONV_PHI'] = 'LUT_PHI_%s2%s' % (getObjectName(obj2), getObjectName(obj1)) @@ -378,6 +384,10 @@ def toDeltaR(value): return "%.2f" % math.sqrt(value) +def toMassDeltaR(value): + return "%.2f" % math.sqrt(2.*value) + + def warning(message): print(message) return '' @@ -403,6 +413,7 @@ def render(menu, template): j2_env.filters['warning'] = warning j2_env.filters['toMass'] = toMass j2_env.filters['toDeltaR'] = toDeltaR + j2_env.filters['toMassDeltaR'] = toMassDeltaR j2_env.filters['chkChgCor'] = chkChgCor j2_env.filters['getPrefix'] = getPrefix j2_env.filters['isMuon'] = isMuon diff --git a/rate-estimation/menu2lib/templates/MenuTemplate.cc b/rate-estimation/menu2lib/templates/MenuTemplate.cc index e25410a..2c431bc 100644 --- a/rate-estimation/menu2lib/templates/MenuTemplate.cc +++ b/rate-estimation/menu2lib/templates/MenuTemplate.cc @@ -277,7 +277,7 @@ PermutationFactory::cache_t PermutationFactory::cache_ = {}; {% include 'CaloCaloCorrelationTemplate.cc' %} {% endif %} - {% elif cond.getType() in (tmEventSetup.InvariantMassUpt, ) %} + {% elif cond.getType() in (tmEventSetup.InvariantMassUpt, tmEventSetup.InvariantMassDeltaR) %} {% set objects = cond.getObjects() %} {% set combination = tmEventSetup.getObjectCombination(objects[0].getType(), objects[1].getType()) %} {% if combination == tmEventSetup.MuonMuonCombination %} diff --git a/rate-estimation/menu2lib/templates/MuonMuonLUT.jinja2 b/rate-estimation/menu2lib/templates/MuonMuonLUT.jinja2 index 1cce32a..378d21a 100644 --- a/rate-estimation/menu2lib/templates/MuonMuonLUT.jinja2 +++ b/rate-estimation/menu2lib/templates/MuonMuonLUT.jinja2 @@ -52,4 +52,17 @@ const int LUT_MU_UPT[] = { {{x}}{% if not loop.last %},{% endif %} {%- endfor -%} }; + +{# inverse deltaR #} +const int prec_mu_mu_invdelta = {{ scaleMap | getPrecisionByName('MU', 'MU', 'InverseDeltaRMath') }}; +const int prec_mu_mu_massdr = prec_mu_mu_mass * prec_mu_mu_invdelta; + +{# {% set mu_mu_invdelta = scaleMap | getDeltaLut(tmGrammar.MU, tmGrammar.MU, tmGrammar.INVERSE_DR) %} #} +{# const int LUT_INVDR_MU_MU[] = { #} +{# {% for x in mu_mu_invdelta[tmGrammar.INVERSE_DR] -%} #} +{# {{x}}{% if not loop.last %},{% endif %} #} +{# {%- endfor -%} #} +{# }; #} + {# eof #} + diff --git a/rate-estimation/menu2lib/templates/macros.jinja2 b/rate-estimation/menu2lib/templates/macros.jinja2 index d35ddcd..7b983c0 100644 --- a/rate-estimation/menu2lib/templates/macros.jinja2 +++ b/rate-estimation/menu2lib/templates/macros.jinja2 @@ -113,6 +113,18 @@ const long long mass2 = upt0 * upt1 * (coshDeltaEta - cosDeltaPhi); {%- endmacro -%} +{# + # set mass2 over delta R2 + #} +{%- macro setMass2DeltaR2(prefix0, prefix1, idx0, idx1, LUTS, iPi, useDelta=True) -%} + {{ setMass2(prefix0, prefix1, idx0, idx1, LUTS, iPi, useDelta) }} + const long long inversedR2 = {{LUTS.COS_DPHI}}[deltaIPhi]; + {# dummy LUT for now #} + const long long mass2deltaR2 = mass2 * inversedR2; +{%- endmacro -%} +{# get actual LUT name #} + + {# # set mass3 #} @@ -287,6 +299,11 @@ {{ setMassUpt2(prefix, prefix, idx0, idx1, LUTS, iPi, False) }} {{ applyFunctionCut('mass2', cut, LUTS.PREC_MASS) }} + {% elif cut.getCutType() == tmEventSetup.MassDeltaR %} + // {{ cut.getMinimum().value | toMassDeltaR }} <= massdr <= {{ cut.getMaximum().value | toMassDeltaR}} + {{ setMass2DeltaR2(prefix, prefix, idx0, idx1, LUTS, iPi, False) }} + {{ applyFunctionCut('mass2deltaR2', cut, LUTS.PREC_MASSDR) }} + {% elif cut.getCutType() == tmEventSetup.ChargeCorrelation %} if (data->{{prefix}}Chg.at({{idx0}}) == 0) continue; // charge valid bit not set if (data->{{prefix}}Chg.at({{idx1}}) == 0) continue; // charge valid bit not set