From 860a0bf55753e4f7709a04ba85e02fb623ed1127 Mon Sep 17 00:00:00 2001
From: mstahl <marian.stahl@cern.ch>
Date: Fri, 25 Mar 2022 11:02:48 -0400
Subject: [PATCH] [charm/prod_xsec] drop charm builders

---
 .../python/Hlt2Conf/lines/charm/prod_xsec.py  | 639 ++++++++++--------
 1 file changed, 349 insertions(+), 290 deletions(-)

diff --git a/Hlt/Hlt2Conf/python/Hlt2Conf/lines/charm/prod_xsec.py b/Hlt/Hlt2Conf/python/Hlt2Conf/lines/charm/prod_xsec.py
index 4240ae42631..e78c2bd8348 100644
--- a/Hlt/Hlt2Conf/python/Hlt2Conf/lines/charm/prod_xsec.py
+++ b/Hlt/Hlt2Conf/python/Hlt2Conf/lines/charm/prod_xsec.py
@@ -83,21 +83,19 @@ four-body lines:
 '''
 import math
 
+import Functors as F
+from Functors.math import in_range
 from GaudiKernel.SystemOfUnits import MeV, picosecond, GeV, mm, mrad
-
 from PyConf import configurable
 from Moore.config import register_line_builder
 from Moore.lines import Hlt2Line
-import Functors as F
 from RecoConf.reconstruction_objects import make_pvs
 from Hlt2Conf.standard_particles import (
     make_long_pions, make_has_rich_long_pions, make_has_rich_down_pions,
     make_has_rich_long_kaons, make_has_rich_long_protons)
-from Hlt2Conf.algorithms_thor import ParticleCombiner, ParticleFilter, require_all
+from Hlt2Conf.algorithms_thor import ParticleFilter, ParticleCombiner, require_all
 from Hlt2Conf.algorithms import ParticleContainersMerger
 from .prefilters import charm_prefilters
-from .builders import (filter_particles, combine_2body, combine_3body,
-                       combine_4body)
 from .particle_properties import _PION_M, _D0_M, _DP_M, _DS_M, _KS_M
 
 #################################################################################
@@ -105,53 +103,70 @@ from .particle_properties import _PION_M, _D0_M, _DP_M, _DS_M, _KS_M
 #################################################################################
 
 
-def xsec_make_loose_long_pions_from_d():
-    return filter_particles(
+def _xsec_make_loose_long_pions_from_d():
+    return ParticleFilter(
         make_has_rich_long_pions(),
-        pvs=make_pvs(),
-        pt_min=200 * MeV,
-        mipchi2_min=4.,
-        p_min=2 * GeV,
-        dllk_max=5.)
+        F.FILTER(
+            require_all(
+                F.PT > 200 * MeV,
+                F.MINIPCHI2CUT(IPChi2Cut=4., Vertices=make_pvs()),
+                F.P > 2 * GeV,
+                F.PID_K < 5.,
+            ), ),
+    )
 
 
-def xsec_make_long_pions_from_d():
-    return filter_particles(
+def _xsec_make_long_pions_from_d():
+    return ParticleFilter(
         make_has_rich_long_pions(),
-        pvs=make_pvs(),
-        pt_min=250 * MeV,
-        mipchi2_min=16.,
-        p_min=2 * GeV,
-        dllk_max=5.)
+        F.FILTER(
+            require_all(
+                F.PT > 250 * MeV,
+                F.MINIPCHI2CUT(IPChi2Cut=16., Vertices=make_pvs()),
+                F.P > 2 * GeV,
+                F.PID_K < 5.,
+            ), ),
+    )
 
 
-def xsec_make_loose_long_kaons_from_d():
-    return filter_particles(
+def _xsec_make_loose_long_kaons_from_d():
+    return ParticleFilter(
         make_has_rich_long_kaons(),
-        pvs=make_pvs(),
-        pt_min=200 * MeV,
-        mipchi2_min=4.,
-        p_min=2 * GeV,
-        dllk_min=5.)
+        F.FILTER(
+            require_all(
+                F.PT > 200 * MeV,
+                F.MINIPCHI2CUT(IPChi2Cut=4., Vertices=make_pvs()),
+                F.P > 2 * GeV,
+                F.PID_K > 5.,
+            ), ),
+    )
 
 
-def xsec_make_long_kaons_from_d():
-    return filter_particles(
+def _xsec_make_long_kaons_from_d():
+    return ParticleFilter(
         make_has_rich_long_kaons(),
-        pvs=make_pvs(),
-        pt_min=250 * MeV,
-        mipchi2_min=16.,
-        p_min=2 * GeV,
-        dllk_min=5.)
+        F.FILTER(
+            require_all(
+                F.PT > 250 * MeV,
+                F.MINIPCHI2CUT(IPChi2Cut=16., Vertices=make_pvs()),
+                F.P > 2 * GeV,
+                F.PID_K > 5.,
+            ), ),
+    )
 
 
-def xsec_make_long_soft_pions_from_d():
-    return filter_particles(
-        make_long_pions(), pt_min=100 * MeV, p_min=1.5 * GeV)
+def _xsec_make_long_soft_pions_from_d():
+    return ParticleFilter(
+        make_long_pions(),
+        F.FILTER(require_all(
+            F.PT > 100 * MeV,
+            F.P > 1.5 * GeV,
+        ), ),
+    )
 
 
 @configurable
-def xsec_make_dzeros_Kpi(
+def _xsec_make_dzeros_Kpi(
         comb_m_window=90 * MeV,
         m_window=80 * MeV,
         # TODO: not present in Run2 but certainly good, also think of HLT1
@@ -162,26 +177,28 @@ def xsec_make_dzeros_Kpi(
         # TODO: this cut essentially controls rate
         bpvfdchi2_min=49.,
         bpvdira_min=math.cos(17 * mrad)):
-    return combine_2body(
-        xsec_make_long_kaons_from_d(),
-        xsec_make_long_pions_from_d(),
-        "[D0 -> K- pi+]cc",
-        pvs=make_pvs(),
+    return ParticleCombiner(
+        [_xsec_make_long_kaons_from_d(),
+         _xsec_make_long_pions_from_d()],
+        DecayDescriptor="[D0 -> K- pi+]cc",
         name="Charm_XSec_D0_KmPip",
-        comb_m_min=_D0_M - comb_m_window,
-        comb_m_max=_D0_M + comb_m_window,
-        m_min=_D0_M - m_window,
-        m_max=_D0_M + m_window,
-        max_pt_min=max_pt_min,
-        doca_max=doca_max,
-        vchi2dof_max=vchi2dof_max,
-        bpvfdchi2_min=bpvfdchi2_min,
-        bpvdira_min=bpvdira_min)
+        CombinationCut=require_all(
+            in_range(_D0_M - comb_m_window, F.MASS, _D0_M + comb_m_window),
+            F.MAXDOCACUT(doca_max),
+            F.MAX(F.PT) > max_pt_min,
+        ),
+        CompositeCut=require_all(
+            in_range(_D0_M - m_window, F.MASS, _D0_M + m_window),
+            F.CHI2DOF < vchi2dof_max,
+            F.BPVFDCHI2(make_pvs()) > bpvfdchi2_min,
+            F.BPVDIRA(make_pvs()) > bpvdira_min,
+        ),
+    )
 
 
 # FIXME: make a 2 or 3 out of 4 track req in IPCHI2
 @configurable
-def xsec_make_dzeros_Kpipipi(
+def _xsec_make_dzeros_Kpipipi(
         comb_m_window=90 * MeV,
         m_window=80 * MeV,
         # TODO: design better PT cut strategy
@@ -192,32 +209,34 @@ def xsec_make_dzeros_Kpipipi(
         vchi2dof_max=25.,
         bpvfdchi2_min=16.,
         bpvdira_min=math.cos(20 * mrad)):
-
-    comb123_m_max = _D0_M + comb_m_window - _PION_M
-    comb12_m_max = _D0_M + comb_m_window - 2 * _PION_M
-    return combine_4body(
-        xsec_make_loose_long_kaons_from_d(),
-        xsec_make_loose_long_pions_from_d(),
-        xsec_make_loose_long_pions_from_d(),
-        xsec_make_loose_long_pions_from_d(),
-        "[D0 -> K- pi- pi+ pi+]cc",
-        pvs=make_pvs(),
+    # TODO: design better PT cut strategy
+    return ParticleCombiner(
+        [
+            _xsec_make_loose_long_kaons_from_d(),
+            _xsec_make_loose_long_pions_from_d(),
+            _xsec_make_loose_long_pions_from_d(),
+            _xsec_make_loose_long_pions_from_d()
+        ],
+        DecayDescriptor="[D0 -> K- pi- pi+ pi+]cc",
         name="Charm_XSec_D0_KmPimPipPip",
-        comb_m_min=_D0_M - comb_m_window,
-        comb_m_max=_D0_M + comb_m_window,
-        m_min=_D0_M - m_window,
-        m_max=_D0_M + m_window,
-        max_mipchi2_min=max_mipchi2_min,
-        docachi2_max=docachi2_max,
-        comb123_m_max=comb123_m_max,
-        comb12_m_max=comb12_m_max,
-        vchi2dof_max=vchi2dof_max,
-        bpvfdchi2_min=bpvfdchi2_min,
-        bpvdira_min=bpvdira_min)
+        Combination12Cut=F.MASS < _D0_M + comb_m_window - 2 * _PION_M,
+        Combination123Cut=F.MASS < _D0_M + comb_m_window - _PION_M,
+        CombinationCut=require_all(
+            in_range(_D0_M - comb_m_window, F.MASS, _D0_M + comb_m_window),
+            F.MAXDOCACHI2CUT(docachi2_max),
+            F.MAX(F.MINIPCHI2(make_pvs())) > max_mipchi2_min,
+        ),
+        CompositeCut=require_all(
+            in_range(_D0_M - m_window, F.MASS, _D0_M + m_window),
+            F.CHI2DOF < vchi2dof_max,
+            F.BPVFDCHI2(make_pvs()) > bpvfdchi2_min,
+            F.BPVDIRA(make_pvs()) > bpvdira_min,
+        ),
+    )
 
 
 @configurable
-def xsec_make_dplus_Kpipi(
+def _xsec_make_dplus_Kpipi(
         comb_m_window=90 * MeV,
         m_window=80 * MeV,
         # TODO: too hard? depends on HLT1
@@ -230,32 +249,33 @@ def xsec_make_dplus_Kpipi(
         bpvfdchi2_min=16.,
         bpvltime_min=0.15 * picosecond,
         bpvdira_min=math.cos(35 * mrad)):
-
-    comb12_m_max = _DP_M + comb_m_window - _PION_M
-    return combine_3body(
-        xsec_make_loose_long_kaons_from_d(),
-        xsec_make_loose_long_pions_from_d(),
-        xsec_make_loose_long_pions_from_d(),
-        "[D+ -> K- pi+ pi+]cc",
-        pvs=make_pvs(),
+    return ParticleCombiner(
+        [
+            _xsec_make_loose_long_kaons_from_d(),
+            _xsec_make_loose_long_pions_from_d(),
+            _xsec_make_loose_long_pions_from_d()
+        ],
+        DecayDescriptor="[D+ -> K- pi+ pi+]cc",
         name="Charm_XSec_Dp_KmPipPip",
-        comb_m_min=_DP_M - comb_m_window,
-        comb_m_max=_DP_M + comb_m_window,
-        m_min=_DP_M - m_window,
-        m_max=_DP_M + m_window,
-        max_pt_min=max_pt_min,
-        max_mipchi2_min=max_mipchi2_min,
-        trk_2of3_pt_min=trk_2of3_pt_min,
-        trk_2of3_mipchi2_min=trk_2of3_mipchi2_min,
-        comb12_m_max=comb12_m_max,
-        vchi2dof_max=vchi2dof_max,
-        bpvfdchi2_min=bpvfdchi2_min,
-        bpvltime_min=bpvltime_min,
-        bpvdira_min=bpvdira_min)
+        Combination12Cut=F.MASS < _DP_M + comb_m_window - _PION_M,
+        CombinationCut=require_all(
+            in_range(_DP_M - comb_m_window, F.MASS, _DP_M + comb_m_window),
+            F.MAX(F.PT) > max_pt_min,
+            F.SUM(F.PT > trk_2of3_pt_min) > 1,
+            F.MAX(F.MINIPCHI2(make_pvs())) > max_mipchi2_min,
+            F.SUM(F.MINIPCHI2(make_pvs()) > trk_2of3_mipchi2_min) > 1,
+        ),
+        CompositeCut=require_all(
+            in_range(_DP_M - m_window, F.MASS, _DP_M + m_window),
+            F.CHI2DOF < vchi2dof_max,
+            F.BPVFDCHI2(make_pvs()) > bpvfdchi2_min,
+            F.BPVLTIME(make_pvs()) > bpvltime_min,
+            F.BPVDIRA(make_pvs()) > bpvdira_min,
+        ),
+    )
 
 
-@configurable
-def xsec_make_dplus_KKpi(
+def _xsec_make_dplus_KKpi(
         comb_m_window=90 * MeV,
         m_window=80 * MeV,
         # TODO: too hard?
@@ -269,31 +289,34 @@ def xsec_make_dplus_KKpi(
         bpvltime_min=0.15 * picosecond,
         bpvdira_min=math.cos(35 * mrad)):
 
-    comb12_m_max = _DP_M + comb_m_window - _PION_M
-    return combine_3body(
-        xsec_make_loose_long_kaons_from_d(),
-        xsec_make_loose_long_kaons_from_d(),
-        xsec_make_loose_long_pions_from_d(),
-        "[D+ -> K- K+ pi+]cc",
-        pvs=make_pvs(),
+    return ParticleCombiner(
+        [
+            _xsec_make_loose_long_kaons_from_d(),
+            _xsec_make_loose_long_kaons_from_d(),
+            _xsec_make_loose_long_pions_from_d()
+        ],
+        DecayDescriptor="[D+ -> K- K+ pi+]cc",
         name="Charm_XSec_Dp_KmKpPip",
-        comb_m_min=_DP_M - comb_m_window,
-        comb_m_max=_DP_M + comb_m_window,
-        m_min=_DP_M - m_window,
-        m_max=_DP_M + m_window,
-        max_pt_min=max_pt_min,
-        max_mipchi2_min=max_mipchi2_min,
-        trk_2of3_pt_min=trk_2of3_pt_min,
-        trk_2of3_mipchi2_min=trk_2of3_mipchi2_min,
-        comb12_m_max=comb12_m_max,
-        vchi2dof_max=vchi2dof_max,
-        bpvfdchi2_min=bpvfdchi2_min,
-        bpvltime_min=bpvltime_min,
-        bpvdira_min=bpvdira_min)
+        Combination12Cut=F.MASS < _DP_M + comb_m_window - _PION_M,
+        CombinationCut=require_all(
+            in_range(_DP_M - comb_m_window, F.MASS, _DP_M + comb_m_window),
+            # TODO: too hard?
+            F.MAX(F.PT) > max_pt_min,
+            F.SUM(F.PT > trk_2of3_pt_min) > 1,
+            F.MAX(F.MINIPCHI2(make_pvs())) > max_mipchi2_min,
+            F.SUM(F.MINIPCHI2(make_pvs()) > trk_2of3_mipchi2_min) > 1,
+        ),
+        CompositeCut=require_all(
+            in_range(_DP_M - m_window, F.MASS, _DP_M + m_window),
+            F.CHI2DOF < vchi2dof_max,
+            F.BPVFDCHI2(make_pvs()) > bpvfdchi2_min,
+            F.BPVLTIME(make_pvs()) > bpvltime_min,
+            F.BPVDIRA(make_pvs()) > bpvdira_min,
+        ),
+    )
 
 
-@configurable
-def xsec_make_d_splus_KKpi(
+def _xsec_make_d_splus_KKpi(
         comb_m_window=90 * MeV,
         m_window=80 * MeV,
         # TODO: too hard?
@@ -307,45 +330,51 @@ def xsec_make_d_splus_KKpi(
         bpvfdchi2_min=16.,
         bpvltime_min=0.15 * picosecond,
         bpvdira_min=math.cos(35 * mrad)):
-
-    comb12_m_max = _DS_M + comb_m_window - _PION_M
-    return combine_3body(
-        xsec_make_loose_long_kaons_from_d(),
-        xsec_make_loose_long_kaons_from_d(),
-        xsec_make_loose_long_pions_from_d(),
-        "[D_s+ -> K- K+ pi+]cc",
-        pvs=make_pvs(),
+    return ParticleCombiner(
+        [
+            _xsec_make_loose_long_kaons_from_d(),
+            _xsec_make_loose_long_kaons_from_d(),
+            _xsec_make_loose_long_pions_from_d()
+        ],
+        DecayDescriptor="[D_s+ -> K- K+ pi+]cc",
         name="Charm_XSec_Dsp_KmKpPip",
-        comb_m_min=_DS_M - comb_m_window,
-        comb_m_max=_DS_M + comb_m_window,
-        m_min=_DS_M - m_window,
-        m_max=_DS_M + m_window,
-        max_pt_min=max_pt_min,
-        max_mipchi2_min=max_mipchi2_min,
-        trk_2of3_pt_min=trk_2of3_pt_min,
-        trk_2of3_mipchi2_min=trk_2of3_mipchi2_min,
-        comb12_m_max=comb12_m_max,
-        vchi2dof_max=vchi2dof_max,
-        bpvfdchi2_min=bpvfdchi2_min,
-        bpvltime_min=bpvltime_min,
-        bpvdira_min=bpvdira_min)
+        Combination12Cut=F.MASS < _DS_M + comb_m_window - _PION_M,
+        CombinationCut=require_all(
+            in_range(_DS_M - comb_m_window, F.MASS, _DS_M + comb_m_window),
+            F.MAX(F.PT) > max_pt_min,
+            F.SUM(F.PT > trk_2of3_pt_min) > 1,
+            F.MAX(F.MINIPCHI2(make_pvs())) > max_mipchi2_min,
+            F.SUM(F.MINIPCHI2(make_pvs()) > trk_2of3_mipchi2_min) > 1,
+        ),
+        CompositeCut=require_all(
+            in_range(_DS_M - m_window, F.MASS, _DS_M + m_window),
+            F.CHI2DOF < vchi2dof_max,
+            F.BPVFDCHI2(make_pvs()) > bpvfdchi2_min,
+            F.BPVLTIME(make_pvs()) > bpvltime_min,
+            F.BPVDIRA(make_pvs()) > bpvdira_min,
+        ),
+    )
 
 
-@configurable
-def xsec_make_dstars_D0pi(make_dzeros,
-                          comb_delta_m_min=130 * MeV - _PION_M,
-                          comb_delta_m_max=165 * MeV - _PION_M,
-                          delta_m_max=160 * MeV - _PION_M,
-                          vchi2dof_max=25.):
-    return combine_2body(
-        make_dzeros(),
-        xsec_make_long_soft_pions_from_d(),
-        "[D*(2010)+ -> D0 pi+]cc",
+def _xsec_make_dstars_D0pi(dzeros,
+                           pions,
+                           comb_delta_m_min=130 * MeV,
+                           comb_delta_m_max=165 * MeV,
+                           delta_m_max=160 * MeV,
+                           vchi2dof_max=25.):
+    return ParticleCombiner(
+        [dzeros, pions],
+        DecayDescriptor="[D*(2010)+ -> D0 pi+]cc",
         name="Charm_XSec_Dstp_D0pip",
-        comb_delta_m_min=comb_delta_m_min,
-        comb_delta_m_max=comb_delta_m_max,
-        delta_m_max=delta_m_max,
-        vchi2dof_max=vchi2dof_max)
+        CombinationCut=require_all(
+            F.MASS - F.CHILD(1, F.MASS) > comb_delta_m_min,
+            F.MASS - F.CHILD(1, F.MASS) < comb_delta_m_max,
+        ),
+        CompositeCut=require_all(
+            F.MASS - F.CHILD(1, F.MASS) < delta_m_max,
+            F.CHI2DOF < vchi2dof_max,
+        ),
+    )
 
 
 all_lines = {}
@@ -355,7 +384,7 @@ all_lines = {}
 
 @register_line_builder(all_lines)
 def dzero2kpi_line(name='Hlt2Charm_D0ToKmPip_XSec_Line', prescale=1.):
-    dzeros = xsec_make_dzeros_Kpi()
+    dzeros = _xsec_make_dzeros_Kpi()
     return Hlt2Line(
         name=name, algs=charm_prefilters() + [dzeros], prescale=prescale)
     #hlt1_filter_code="HLT_PASS_RE('SuperDooperLineDecision')")
@@ -364,15 +393,19 @@ def dzero2kpi_line(name='Hlt2Charm_D0ToKmPip_XSec_Line', prescale=1.):
 @register_line_builder(all_lines)
 def dstarp2dzeropip_dzero2kmpip_line(
         name='Hlt2Charm_DstpToD0Pip_D0ToKmPip_XSec_Line', prescale=1.):
-    dstars = xsec_make_dstars_D0pi(xsec_make_dzeros_Kpi)
+    dzeros = _xsec_make_dzeros_Kpi()
+    dstars = _xsec_make_dstars_D0pi(dzeros,
+                                    _xsec_make_long_soft_pions_from_d())
     return Hlt2Line(
-        name=name, algs=charm_prefilters() + [dstars], prescale=prescale)
+        name=name,
+        algs=charm_prefilters() + [dzeros, dstars],
+        prescale=prescale)
     #hlt1_filter_code="HLT_PASS_RE('SuperDooperLineDecision')")
 
 
 @register_line_builder(all_lines)
 def dzero2k3pi_line(name='Hlt2Charm_D0ToKmPimPipPip_XSec_Line', prescale=1.):
-    dzeros = xsec_make_dzeros_Kpipipi()
+    dzeros = _xsec_make_dzeros_Kpipipi()
     return Hlt2Line(
         name=name, algs=charm_prefilters() + [dzeros], prescale=prescale)
     #hlt1_filter_code="HLT_PASS_RE('SuperDooperLineDecision')")
@@ -381,15 +414,19 @@ def dzero2k3pi_line(name='Hlt2Charm_D0ToKmPimPipPip_XSec_Line', prescale=1.):
 @register_line_builder(all_lines)
 def dstarp2dzeropip_dzero2k3pi_line(
         name='Hlt2Charm_DstpToD0Pip_D0ToKmPimPipPip_XSec_Line', prescale=1.):
-    dstars = xsec_make_dstars_D0pi(xsec_make_dzeros_Kpipipi)
+    dzeros = _xsec_make_dzeros_Kpipipi()
+    dstars = _xsec_make_dstars_D0pi(dzeros,
+                                    _xsec_make_long_soft_pions_from_d())
     return Hlt2Line(
-        name=name, algs=charm_prefilters() + [dstars], prescale=prescale)
+        name=name,
+        algs=charm_prefilters() + [dzeros, dstars],
+        prescale=prescale)
     #hlt1_filter_code="HLT_PASS_RE('SuperDooperLineDecision')")
 
 
 @register_line_builder(all_lines)
 def dplus2kpipi_line(name='Hlt2Charm_DpToKmPipPip_XSec_Line', prescale=1.):
-    dpluses = xsec_make_dplus_Kpipi()
+    dpluses = _xsec_make_dplus_Kpipi()
     return Hlt2Line(
         name=name, algs=charm_prefilters() + [dpluses], prescale=prescale)
     #hlt1_filter_code="HLT_PASS_RE('SuperDooperLineDecision')")
@@ -397,7 +434,7 @@ def dplus2kpipi_line(name='Hlt2Charm_DpToKmPipPip_XSec_Line', prescale=1.):
 
 @register_line_builder(all_lines)
 def dplus2kkpi_line(name='Hlt2Charm_DpToKmKpPip_XSec_Line', prescale=1.):
-    dpluses = xsec_make_dplus_KKpi()
+    dpluses = _xsec_make_dplus_KKpi()
     return Hlt2Line(
         name=name, algs=charm_prefilters() + [dpluses], prescale=prescale)
     #hlt1_filter_code="HLT_PASS_RE('SuperDooperLineDecision')")
@@ -405,7 +442,7 @@ def dplus2kkpi_line(name='Hlt2Charm_DpToKmKpPip_XSec_Line', prescale=1.):
 
 @register_line_builder(all_lines)
 def dsplus2kkpi_line(name='Hlt2Charm_DspToKmKpPip_XSec_Line', prescale=1.):
-    dspluses = xsec_make_d_splus_KKpi()
+    dspluses = _xsec_make_d_splus_KKpi()
     return Hlt2Line(
         name=name, algs=charm_prefilters() + [dspluses], prescale=prescale)
     #hlt1_filter_code="HLT_PASS_RE('SuperDooperLineDecision')")
@@ -422,7 +459,7 @@ def xsec_make_protons_from_baryons(
         p_min=10 * GeV,
         mipchi2_min=6.0,
         dllp_min=5.0,
-        #dllp_m_dllk_min=5.0
+        #dllp_m_dllk_min > 5.0
 ):
     pvs = make_pvs()
     return ParticleFilter(
@@ -445,30 +482,39 @@ def xsec_make_kaons_from_baryons(
         trchi2dof_max=3.0,
         dllk_min=5.0,
 ):
-    return filter_particles(
+    pvs = make_pvs()
+    return ParticleFilter(
         make_has_rich_long_kaons(),
-        pvs=make_pvs(),
-        pt_min=pt_min,
-        p_min=p_min,
-        mipchi2_min=mipchi2_min,
-        trchi2dof_max=trchi2dof_max,
-        dllk_min=dllk_min)
+        F.FILTER(
+            require_all(
+                F.PT > pt_min,
+                F.P > p_min,
+                F.MINIPCHI2CUT(IPChi2Cut=mipchi2_min, Vertices=pvs),
+                F.CHI2DOF < trchi2dof_max,
+                F.PID_K > dllk_min,
+            ), ),
+    )
 
 
-@configurable
-def xsec_make_pions_from_baryons(pt_min=200 * MeV,
-                                 p_min=1 * GeV,
-                                 mipchi2_min=6.0,
-                                 trchi2dof_max=3.0,
-                                 dllk_max=5.0):
-    return filter_particles(
+def xsec_make_pions_from_baryons(
+        pt_min=200 * MeV,
+        p_min=1 * GeV,
+        mipchi2_min=6.0,
+        trchi2dof_max=3.0,
+        dllk_max=5.0,
+):
+    pvs = make_pvs()
+    return ParticleFilter(
         make_has_rich_long_pions(),
-        pvs=make_pvs(),
-        pt_min=pt_min,
-        p_min=p_min,
-        mipchi2_min=mipchi2_min,
-        trchi2dof_max=trchi2dof_max,
-        dllk_max=dllk_max)
+        F.FILTER(
+            require_all(
+                F.PT > pt_min,
+                F.P > p_min,
+                F.MINIPCHI2CUT(IPChi2Cut=mipchi2_min, Vertices=pvs),
+                F.CHI2DOF < trchi2dof_max,
+                F.PID_K < dllk_max,
+            ), ),
+    )
 
 
 @configurable
@@ -647,9 +693,9 @@ def xsec_make_double_charm(charm_hadrons, descriptor):
 
 
 def xsec_make_charm_hadron_container():
-    dzeros = xsec_make_dzeros_Kpi()
-    dplus = xsec_make_dplus_Kpipi()
-    d_splus = xsec_make_d_splus_KKpi()
+    dzeros = _xsec_make_dzeros_Kpi()
+    dplus = _xsec_make_dplus_Kpipi()
+    d_splus = _xsec_make_d_splus_KKpi()
     lcps = xsec_make_lcp_pKpi()
     return ParticleContainersMerger([dzeros, dplus, d_splus, lcps],
                                     name="Charm_XSec_DoubleCharm_Merger")
@@ -740,40 +786,50 @@ def xsec_make_long_pions_from_ks():
     """Return maker for pions filtered by thresholds common to LL kshort
     decay product selections.
     """
-    return filter_particles(
+    return ParticleFilter(
         make_has_rich_long_pions(),
-        pvs=make_pvs(),
-        mipchi2_min=36.,
-        dllk_max=5.)
+        F.FILTER(
+            require_all(
+                F.MINIPCHI2CUT(IPChi2Cut=36., Vertices=make_pvs()),
+                F.PID_K < 5.), ),
+    )
 
 
 def xsec_make_down_pions_from_ks():
     """Return maker for pions filtered by thresholds common to DD kshort
     decay product selections.
     """
-    return filter_particles(
+    return ParticleFilter(
         make_has_rich_down_pions(),
-        pt_min=175 * MeV,
-        p_min=3000 * MeV,
-        dllk_max=5.)
+        F.FILTER(
+            require_all(
+                F.PT > 175 * MeV,
+                F.P > 3000 * MeV,
+                F.PID_K < 5.,
+            ), ),
+    )
 
 
 def xsec_make_KSLL_from_d():
     """
     Returns KS0 -> pi+ pi- constructed with two long pions
     """
-    return combine_2body(
-        xsec_make_long_pions_from_ks(),
-        xsec_make_long_pions_from_ks(),
-        decay_descriptor="KS0 -> pi+ pi-",
-        pvs=make_pvs(),
+    return ParticleCombiner(
+        [xsec_make_long_pions_from_ks(),
+         xsec_make_long_pions_from_ks()],
+        DecayDescriptor="KS0 -> pi+ pi-",
         name="Charm_XSec_Ks0LL_PipPim",
-        comb_m_min=_KS_M - 50 * MeV,
-        comb_m_max=_KS_M + 50 * MeV,
-        vchi2dof_max=30.,
-        bpvltime_min=2 * picosecond,
-        m_min=_KS_M - 35 * MeV,
-        m_max=_KS_M + 35 * MeV)
+        CombinationCut=require_all(
+            F.MASS > _KS_M - 50 * MeV,
+            F.MASS < _KS_M + 50 * MeV,
+        ),
+        CompositeCut=require_all(
+            F.MASS > _KS_M - 35 * MeV,
+            F.MASS < _KS_M + 35 * MeV,
+            F.CHI2DOF < 30.,
+            F.BPVLTIME(make_pvs()) > 2 * picosecond,
+        ),
+    )
 
 
 def xsec_make_KSDD_from_d():
@@ -782,18 +838,21 @@ def xsec_make_KSDD_from_d():
 
     Only the standard particles-maker cuts are applied
     """
-    return combine_2body(
-        xsec_make_down_pions_from_ks(),
-        xsec_make_down_pions_from_ks(),
-        decay_descriptor="KS0 -> pi+ pi-",
-        pvs=make_pvs(),
+    return ParticleCombiner(
+        [xsec_make_down_pions_from_ks(),
+         xsec_make_down_pions_from_ks()],
+        DecayDescriptor="KS0 -> pi+ pi-",
         name="Charm_XSec_Ks0DD_PipPim",
-        comb_m_min=_KS_M - 80 * MeV,
-        comb_m_max=_KS_M + 80 * MeV,
-        vchi2dof_max=30.,
-        bpvvdz_min=400 * mm,
-        m_min=_KS_M - 64 * MeV,
-        m_max=_KS_M + 64 * MeV,
+        CombinationCut=require_all(
+            F.MASS > _KS_M - 80 * MeV,
+            F.MASS < _KS_M + 80 * MeV,
+        ),
+        CompositeCut=require_all(
+            F.MASS > _KS_M - 64 * MeV,
+            F.CHI2DOF < 30.,
+            F.BPVVDZ(make_pvs()) > 400 * mm,
+            F.MASS < _KS_M + 64 * MeV,
+        ),
     )
 
 
@@ -829,64 +888,24 @@ def xsec_make_dzero_Kshh(kshort,
     Remaining parameters define thresholds for the selection.
     """
 
-    return combine_3body(
-        kshort,
-        hadron1,
-        hadron2,
-        descriptor,
-        pvs=make_pvs(),
+    return ParticleCombiner(
+        [kshort, hadron1, hadron2],
+        DecayDescriptor=descriptor,
         name="Charm_XSec_D0_Ks0hh",
-        comb_m_min=comb_m_min,
-        comb_m_max=comb_m_max,
-        sum_pt_min=sum_pt_min,
-        doca23_max=doca23_max,
-        comb12_m_max=comb12_m_max,
-        pt_min=pt_min,
-        bpvdira_min=bpvdira_min,
-        vchi2dof_max=vchi2dof_max,
-        bpvltime_min=bpvltime_min,
-        m_min=m_min,
-        m_max=m_max)
-
-
-def xsec_make_dzero_KSLLpipi():
-    """
-    D0 --> KS0(LL) pi+ pi- maker.
-    """
-    return xsec_make_dzero_Kshh(xsec_make_KSLL_from_d(),
-                                xsec_make_long_pions_from_d(),
-                                xsec_make_long_pions_from_d(),
-                                "D0 -> KS0 pi+ pi-")
-
-
-def xsec_make_dzero_KSDDpipi():
-    """
-    D0 --> KS0(DD) pi+ pi- maker.
-    """
-    return xsec_make_dzero_Kshh(xsec_make_KSDD_from_d(),
-                                xsec_make_long_pions_from_d(),
-                                xsec_make_long_pions_from_d(),
-                                "D0 -> KS0 pi+ pi-")
-
-
-def xsec_make_dzero_KSLLKK():
-    """
-    D0 --> KS0(LL) K+ K- maker.
-    """
-    return xsec_make_dzero_Kshh(xsec_make_KSLL_from_d(),
-                                xsec_make_long_kaons_from_d(),
-                                xsec_make_long_kaons_from_d(),
-                                "D0 -> KS0 K+ K-")
-
-
-def xsec_make_dzero_KSDDKK():
-    """
-    D0 --> KS0(DD) K+ K- maker.
-    """
-    return xsec_make_dzero_Kshh(xsec_make_KSDD_from_d(),
-                                xsec_make_long_kaons_from_d(),
-                                xsec_make_long_kaons_from_d(),
-                                "D0 -> KS0 K+ K-")
+        Combination12Cut=F.MASS < comb12_m_max,
+        CombinationCut=require_all(
+            in_range(comb_m_min, F.MASS, comb_m_max),
+            F.SUM(F.PT) > sum_pt_min,
+            F.DOCA(2, 3) < doca23_max,
+        ),
+        CompositeCut=require_all(
+            in_range(m_min, F.MASS, m_max),
+            F.PT > pt_min,
+            F.CHI2DOF < vchi2dof_max,
+            F.BPVDIRA(make_pvs()) > bpvdira_min,
+            F.BPVLTIME(make_pvs()) > bpvltime_min,
+        ),
+    )
 
 
 ## D0 -> h+ h- KS0 Line builders
@@ -897,9 +916,13 @@ def dzero2ksLLpipi_line(name='Hlt2Charm_D0ToKsPimPip_LL_XSec_Line',
     """
     D0 --> KS0(LL) pi+ pi- line maker
     """
-    dzeros = xsec_make_dzero_KSLLpipi()
+    kshorts = xsec_make_KSLL_from_d()
+    pions = _xsec_make_long_pions_from_d()
+    dzeros = xsec_make_dzero_Kshh(kshorts, pions, pions, "D0 -> KS0 pi+ pi-")
     return Hlt2Line(
-        name=name, algs=charm_prefilters() + [dzeros], prescale=prescale)
+        name=name,
+        algs=charm_prefilters() + [kshorts, dzeros],
+        prescale=prescale)
     #hlt1_filter_code="HLT_PASS_RE('SuperDooperLineDecision')")
 
 
@@ -909,9 +932,13 @@ def dzero2ksDDpipi_line(name='Hlt2Charm_D0ToKsPimPip_DD_XSec_Line',
     """
     D0 --> KS0(DD) pi+ pi- line maker
     """
-    dzeros = xsec_make_dzero_KSDDpipi()
+    kshorts = xsec_make_KSDD_from_d()
+    pions = _xsec_make_long_pions_from_d()
+    dzeros = xsec_make_dzero_Kshh(kshorts, pions, pions, "D0 -> KS0 pi+ pi-")
     return Hlt2Line(
-        name=name, algs=charm_prefilters() + [dzeros], prescale=prescale)
+        name=name,
+        algs=charm_prefilters() + [kshorts, dzeros],
+        prescale=prescale)
     #hlt1_filter_code="HLT_PASS_RE('SuperDooperLineDecision')")
 
 
@@ -920,9 +947,13 @@ def dzero2ksLLkk_line(name='Hlt2Charm_D0ToKsKmKp_LL_XSec_Line', prescale=1.):
     """
     D0 --> KS0(DD) K+ K- line maker
     """
-    dzeros = xsec_make_dzero_KSLLKK()
+    kshorts = xsec_make_KSLL_from_d()
+    kaons = _xsec_make_long_kaons_from_d()
+    dzeros = xsec_make_dzero_Kshh(kshorts, kaons, kaons, "D0 -> KS0 K+ K-")
     return Hlt2Line(
-        name=name, algs=charm_prefilters() + [dzeros], prescale=prescale)
+        name=name,
+        algs=charm_prefilters() + [kshorts, dzeros],
+        prescale=prescale)
     #hlt1_filter_code="HLT_PASS_RE('SuperDooperLineDecision')")
 
 
@@ -931,9 +962,13 @@ def dzero2ksDDkk_line(name='Hlt2Charm_D0ToKsKmKp_DD_XSec_Line', prescale=1.):
     """
     D0 --> KS0(DD) K+ K- line maker
     """
-    dzeros = xsec_make_dzero_KSDDKK()
+    kshorts = xsec_make_KSDD_from_d()
+    kaons = _xsec_make_long_kaons_from_d()
+    dzeros = xsec_make_dzero_Kshh(kshorts, kaons, kaons, "D0 -> KS0 K+ K-")
     return Hlt2Line(
-        name=name, algs=charm_prefilters() + [dzeros], prescale=prescale)
+        name=name,
+        algs=charm_prefilters() + [kshorts, dzeros],
+        prescale=prescale)
     #hlt1_filter_code="HLT_PASS_RE('SuperDooperLineDecision')")
 
 
@@ -945,9 +980,15 @@ def dstar2dzeropi_dzero2ksLLpipi_line(
 
     Used for D0-D0bar tagging
     """
-    dstars = xsec_make_dstars_D0pi(xsec_make_dzero_KSLLpipi)
+    kshorts = xsec_make_KSLL_from_d()
+    pions = _xsec_make_long_pions_from_d()
+    dzeros = xsec_make_dzero_Kshh(kshorts, pions, pions, "D0 -> KS0 pi+ pi-")
+    dstars = _xsec_make_dstars_D0pi(dzeros,
+                                    _xsec_make_long_soft_pions_from_d())
     return Hlt2Line(
-        name=name, algs=charm_prefilters() + [dstars], prescale=prescale)
+        name=name,
+        algs=charm_prefilters() + [kshorts, dzeros, dstars],
+        prescale=prescale)
     #hlt1_filter_code="HLT_PASS_RE('SuperDooperLineDecision')")
 
 
@@ -959,9 +1000,15 @@ def dstar2dzeropi_dzero2ksDDpipi_line(
 
     Used for D0-D0bar tagging
     """
-    dstars = xsec_make_dstars_D0pi(xsec_make_dzero_KSDDpipi)
+    kshorts = xsec_make_KSDD_from_d()
+    pions = _xsec_make_long_pions_from_d()
+    dzeros = xsec_make_dzero_Kshh(kshorts, pions, pions, "D0 -> KS0 pi+ pi-")
+    dstars = _xsec_make_dstars_D0pi(dzeros,
+                                    _xsec_make_long_soft_pions_from_d())
     return Hlt2Line(
-        name=name, algs=charm_prefilters() + [dstars], prescale=prescale)
+        name=name,
+        algs=charm_prefilters() + [kshorts, dzeros, dstars],
+        prescale=prescale)
     #hlt1_filter_code="HLT_PASS_RE('SuperDooperLineDecision')")
 
 
@@ -973,9 +1020,15 @@ def dstar2dzeropi_dzero2ksLLkk_line(
 
     Used for D0-D0bar tagging
     """
-    dstars = xsec_make_dstars_D0pi(xsec_make_dzero_KSLLKK)
+    kshorts = xsec_make_KSLL_from_d()
+    kaons = _xsec_make_long_kaons_from_d()
+    dzeros = xsec_make_dzero_Kshh(kshorts, kaons, kaons, "D0 -> KS0 K+ K-")
+    dstars = _xsec_make_dstars_D0pi(dzeros,
+                                    _xsec_make_long_soft_pions_from_d())
     return Hlt2Line(
-        name=name, algs=charm_prefilters() + [dstars], prescale=prescale)
+        name=name,
+        algs=charm_prefilters() + [kshorts, dzeros, dstars],
+        prescale=prescale)
     #hlt1_filter_code="HLT_PASS_RE('SuperDooperLineDecision')")
 
 
@@ -987,7 +1040,13 @@ def dstar2dzeropi_dzero2ksDDkk_line(
 
     Used for D0-D0bar tagging
     """
-    dstars = xsec_make_dstars_D0pi(xsec_make_dzero_KSDDKK)
+    kshorts = xsec_make_KSDD_from_d()
+    kaons = _xsec_make_long_kaons_from_d()
+    dzeros = xsec_make_dzero_Kshh(kshorts, kaons, kaons, "D0 -> KS0 K+ K-")
+    dstars = _xsec_make_dstars_D0pi(dzeros,
+                                    _xsec_make_long_soft_pions_from_d())
     return Hlt2Line(
-        name=name, algs=charm_prefilters() + [dstars], prescale=prescale)
+        name=name,
+        algs=charm_prefilters() + [kshorts, dzeros, dstars],
+        prescale=prescale)
     #hlt1_filter_code="HLT_PASS_RE('SuperDooperLineDecision')")
-- 
GitLab