User Tools

Site Tools


Sidebar

2019:groups:tools:adl

`

Analysis Description Language (ADL)

Develop a domain-specific language capable of describing the contents of an LHC analysis in a standard and unambiguous way.

Link to Sezen's presentation

HSF Gitter forum for discussions: ADL

ADL-related projects/discussions in Les Houches:

  • Estimation of overlaps in analysis using analysis descriptions (correlations exercise, how to use ADLs)
  • Recasting tools/methods comparison exercise with ADLs (recast comparison exercise, ADL implementation)
  • Questions for us to answer:
    • What is the ideal physics content for an ADL? An inclusive list discussed at the Fermilab ADL workshop is in this googledoc. You are welcome to take a look and edit.
    • What is the best syntax for expressing composite particles, like Zs, tops, Higgsses, etc.? How can we access information on the constituents?
    • What is the minimal list of math and HEP functions/operators we need for describing the analysis?
    • What are some challenging analysis descriptions to try?
    • How can we benefit from an ADL in analysis combination / finding out non-overlapping regions?

Parsing/interpreting tools for the current ADL:

  • adl2tnm (transpiler: python script converts adl to generic c++ analysis code) (github)
  • lhada2rivet (transpiler: python script converts LHADA to c++ code for Rivet) (github)
  • CutLang (runtime interpreter of adl, no intermediate code generation, no compilation) (github, Jupyter notebook: binder link)

Quantifying overlaps between analysis search regions using ADLs

Members: Sezen, Wolfgang (, Harrison)

Find and visualize overlaps in a model-independent way, without generating events. Directly sample the event selection. Useful for analysis design phase, or quick comparisons within experiments (e.g. Run2 CMS SUSY pMSSM combination)

  • Start from the analysis description, which lists objects and event selections.
  • Construct a feature space from all mathematically orthogonal “basic” variables (e.g. MET, jet1.pt, jet2.pt, electron1.eta, …).
  • Randomly sample the feature space for each analysis based on cuts on the feature space components (jet1.pt > 100, MET > 299, etc.).
  • Use the sampled points to compute values for “composite” variables such as HT(jets), dphi(jets), MT(lepton, MET), etc.
  • Compare feature spaces between analyses, find and visualize overlaps and exclusions.
  • As a very simple first step, we simply check if two analyses are disjoint in any of the basic variables.

ADLs for recasting

Members: Sezen, (Harrison, Gokhan as parser developers)

The ADL file and the external function fMtautau are given below for the CMS soft dilepton analysis considered in the LH19 recasting comparison

The ADL file

info analysis
  title "Search for new physics in events with two soft oppositely charged leptons and missing transverse momentum in proton-proton collisions at sqrts = 13 TeV "
  experiment CMS
  id SUS-16-048
  publication Phys. Lett. B 782 (2018) 440
  sqrtS 13.0
  lumi 35.9
  arXiv 1801.01846
  hepdata 
  doi 10.1016/j.physletb.2018.05.062
 
# ANALYSIS OBJECTS
object muons
  take Muon
  select pT [] 3.5 30
  select abs(eta) < 2.4
  # ID/iso efficiencies already folded into efficiencies provided by CMS:
  # https://twiki.cern.ch/twiki/bin/view/CMSPublic/SUSMoriond2017ObjectsEfficiency
 
object electrons
  take Electron
  select pT [] 3.5 30
  select abs(eta) < 2.5
  # ID/iso efficiencies already folded into efficiencies provided by CMS:
  # https://twiki.cern.ch/twiki/bin/view/CMSPublic/SUSMoriond2017ObjectsEfficiency
 
object leptons
  take electrons
  take muons
 
object jets
  take Jet
  select pT > 25  
  select abs(Eta) < 2.4
 
object bjets
  take jets
  select BTag == 1
 
object MET
  take MissingET
 
# EVENT VARIABLES
define dilepton = leptons[0] + leptons[1]
define dielectron = electrons[0] + electrons[1]
define dimuon = muons[0] + muons[1]
define HT = sum(jets.pT)
define MTl1 = sqrt( 2*leptons[0].pT * MET.MET*(1-cos(MET.phi - leptons[0].phi )))
define MTl2 = sqrt( 2*leptons[1].pT * MET.MET*(1-cos(MET.phi - leptons[1].phi )))
define Mtautau = fMtautau(leptons[0], leptons[1], MET)
 
# EVENT SELECTION
 
# Dimuon selection
# This selection follows the cutflow table in LH recasting twiki
# https://phystev.cnrs.fr/wiki/_detail/2019:groups:tools:cms-sus-16-048_cutflow.png?id=2019%3Agroups%3Atools%3Arecastcmp
region CharginoDimuonPresel
  weight xsec 0.688016
  select size(muons) == 2
  select muons[0].pT [] 5 30
  select muons[0].charge * muons[1].charge == -1
  select dimuon.pT > 3 
  select dimuon.mass [] 4 50
  select dimuon.mass ][ 9 10.5
  select MET.MET [] 125 200
  weight trigger 0.65
  select size(jets) >= 0
  select size(jets) >= 1
  select HT > 100
  select (MET.MET / HT) [] 0.6 1.4
  select size(bjets) == 0
  select Mtautau ][ 0 160 
  select MTl1 < 70 and MTl2 < 70
 
# Additional selections from the analysis (not included in the recast study)
 
# Dilepton preselection
#region DileptonPresel
  # This selection follows Table 1 in the paper 
  # (for the time being, except for the isolation criteria)
#  select size(leptons) == 2
#  select size(electrons) == 2 or size(muons) == 2
#  select leptons[0].charge * leptons[1].charge == -1
#  select leptons[0].pT > 5
#  select leptons[1].pT > 5
#  select size(bjets) == 0
#  select size(electrons) == 2 or size(muons) == 2 ? mass(dilepton) [] 4 9 : mass(dilepton) [] 10.5 50
#  select dilepton.pT > 3
#  select size(muons) == 2 ? MET.pT > 125 : MET.pT > 200
#  select MET.pT / HT [] 0.6 1.4
#  select HT > 100
#  select MTl1 < 70 and MTl2 < 70
 
# Dielectron selection
#region CharginoDielectronPresel
# This selection follows the cutflow table in the twiki
#  select size(electrons) == 2
#  select electrons[0].pT [] 5 30
#  select electrons[0].charge * electrons[1].charge == -1
#  select dielectron.pT > 3 
#  select dielectron.mass [] 4 9 or dielectron.mass [] 10.5 50
#  reject dielectron.mass [] 9 10.5
#  select MET.pT [] 125 200
#  select MET.pT / HT [] 0.6 1.4
#  select size(jets) >= 1
#  select HT > 100
#  select size(bjets) == 0
#  reject Mtautau [] 0 160 
#  select MTl1 < 70 and MTl2 < 70
 
# Stop dimuon preselection
#region StopDimuonPresel
#  # This selection follows the cutflow table in the twiki
#  select size(muons) == 2
#  select muons[0].pT [] 5 30
#  select muons[0].charge * muons[1].charge == -1
#  select dimuon.pT > 3 
#  select dimuon.mass [] 4 50
#  reject dimuon.mass [] 9 10.5
#  select MET.pT [] 125 200
#  select MET.pT / HT [] 0.6 1.4
#  select size(jets) >= 1
#  select HT > 100
#  select size(bjets) == 0
#  reject Mtautau [] 0 160

The external function Mtautau

  // Find m(tautau) for boosted taus with alligned decay products.
  // For leptons l1, l2 and neutrino(s) nu1, nu2 coming from tau1, tau2 decays,
  // collinearity implies p(nu1) = a * p(l1), p(nu2) = b * p(l2)
  //   1) Use the constraint from MET to find a and b
  //   2) Compute nu and tau momenta
  //   3) Find the ditau invariant mass
  // Suggested in arXiv:1401.1235 , used in CMS SUS-16-048
  // Coded by S. Sekmen
  double fMtautau(TLorentzVector& lep1, TLorentzVector& lep2, TLorentzVector& met){
 
    double px1 = lep1.Px();
    double py1 = lep1.Py();
    double px2 = lep2.Px();
    double py2 = lep2.Py();
    double metx = met.Px();
    double mety = met.Py();
 
    // Compute the solution of the two coupled equations:
    //     metx = a * px1 + b * px2
    //     mety = a * py1 + b * py2
    // for a and b:
 
    double a = (metx * py2 - mety * px2) / (px1 * py2 - py1 * px2);
    double b = (metx * py1 - mety * px1) / (px2 * py1 - py2 * px1);
 
   // Neutrino vectors
    TLorentzVector nu1, nu2;
    nu1.SetPxPyPzE(a*px1, a*py1, 0., sqrt(a*px1 * a*px1 + a*py1 * a*py1));
    nu2.SetPxPyPzE(b*px2, b*py2, 0., sqrt(b*px2 * b*px2 + b*py2 * b*py2));
 
    // Reconstruct the taus from leptons and neutrinos
    TLorentzVector tau1 = lep1 + nu1;
    TLorentzVector tau2 = lep2 + nu2;
 
    // Reconstruct the Z from Z --> tau tau
    TLorentzVector Z = tau1 + tau2;
 
    return Z.M();
  }
2019/groups/tools/adl.txt · Last modified: 2020/01/14 18:01 by sezen.sekmen