User Tools

Site Tools


Sidebar

2019:groups:tools:adl

This is an old revision of the document!


`

Analysis Description Language (ADL)

Members: Sezen S

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

Questions to answer for development:

  • What is the ideal physics content for an ADL? Google doc for physics content of the language
  • What is the most generic way of 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 do 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 language:

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

Analysis description file for the CMS soft dilepton analysis for the recasting exercise

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
 
object muons
  take Muon
  select pT [] 3.5 30
  select abs(eta) < 2.4
  # select some ID and iso - check with Delphes
  # e.g. select IsolationVarRhoCorr < 0.1
 
object electrons
  take Electron
  select pT [] 3.5 30
  select abs(eta) < 2.5
  # select some ID and iso - check with Delphes
  # select pT < 10 ? loose == 1 : tight == 1
 
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
 
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*(1-cos(MET.phi - leptons[0].phi )))
define MTl2 = sqrt( 2*leptons[1].pT * MET*(1-cos(MET.phi - leptons[1].phi )))
define Mtautau = {{https://phystev.cnrs.fr/wiki/wiki:syntax#external|fMtautau}}(lepton[0], lepton[1], MET)
 
region DileptonPreselection
  # This selection follows Table 1 in the paper 
  # (for the time being, except for the isolation criteria)
  select size(leptons) == 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 or 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
 
region CharginoDimuonPreselection
  # This selection follows the chargino 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 
  select MTl1 < 70 and MTl2 < 70
 
region StopDimuonPreselection
  # This selection follows the stop 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(a*px2, a*py2, 0., sqrt(a*px2 * a*px2 + a*py2 * a*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.1561558263.txt.gz · Last modified: 2019/06/26 16:11 by andy.buckley