diff --git a/Phys/StrippingSelections/python/StrippingSelections/StrippingRD/StrippingB2K1MuMu.py b/Phys/StrippingSelections/python/StrippingSelections/StrippingRD/StrippingB2K1MuMu.py new file mode 100644 index 0000000000000000000000000000000000000000..81ac957cbabaf2b2af45d36688486f1ae7fa8349 --- /dev/null +++ b/Phys/StrippingSelections/python/StrippingSelections/StrippingRD/StrippingB2K1MuMu.py @@ -0,0 +1,164 @@ +############################################################################### +# (c) Copyright 2000-2021 CERN for the benefit of the LHCb Collaboration # +# # +# This software is distributed under the terms of the GNU General Public # +# Licence version 3 (GPL Version 3), copied verbatim in the file "COPYING". # +# # +# In applying this licence, CERN does not waive the privileges and immunities # +# granted to it by virtue of its status as an Intergovernmental Organization # +# or submit itself to any jurisdiction. # +############################################################################### + +""" +Stripping options for "B0 -> ( Jpsi -> mu+ mu- ) ( K1(1270) -> ( K*(892) -> K+ pi- ) pi0 )"CC - reconstructed as Bd -> Jpsi K* for efficiency reasons' + +Author: James Brown +""" + +######################################################################## +__author__ = ['James Brown'] +__date__ = '23/06/2023' +__version__ = '$ 1.0 $' + +__all__ = ('Bd2K1MuMuLine', + 'makeBdK1Jpsi', + 'makeJpsis', + 'makeKstars', + 'default_config') + +from Gaudi.Configuration import * + +from GaudiConfUtils.ConfigurableGenerators import CombineParticles +from StandardParticles import StdLooseMuons, StdAllLooseKaons, StdAllLoosePions + +from PhysSelPython.Wrappers import Selection +from StrippingConf.StrippingLine import StrippingLine +from StrippingUtils.Utils import LineBuilder, checkConfig + +default_config = { + 'NAME' : 'Bd2K1MuMu', + 'WGs' : ['RD'], + 'BUILDERTYPE' : 'Bd2K1MuMuLine', + 'CONFIG' : {'PrescaleBd2K1MuMuLine' : 1, + ### B0 + 'BMassWindow' : 2500, + 'BDIRA' : 0.9995, + 'BIPCHI2' : 100, + 'BVertexCHI2' : 9, + 'BVDCHI2' : 100, + ### Intermediates - Jpsi/Kst + "InterMIPCHI2DV" : 0, + "InterVertexCHI2" : 9, + "JpsiUpperM" : 3300, + "JpsiLowerM" : 3000, + "KstUpperM" : 1100, + "KstLowerM" : 700, + "Kst_PT" : 800, + ### Final states + "fsPT" : 300, + "fsMIPCHI2DV" : 4, + "fsTRCHI2" : 4, + "fsTRGHOSTPROB" : 0.4, + "fsPROBNN" : 0.4, + "muPROBpi" : 0.95, + "fsM" : 2600, + }, + 'STREAMS' : ['Leptonic'] +} + +class Bd2K1MuMuLine( LineBuilder ) : + + __configuration_keys__ = default_config['CONFIG'].keys() + + def __init__( self,name,config ) : + + LineBuilder.__init__(self, name, config) + + Bd2K1MuMuName = name + + # Default SPD hits filter + SPDFilter = { + 'Code' : " ( recSummary(LHCb.RecSummary.nSPDhits,'Raw/Spd/Digits') < 600 )" , + 'Preambulo' : [ "from LoKiNumbers.decorators import *", "from LoKiCore.basic import LHCb" ] + } + + # Make parents + self.Jpsi = makeJpsis( "JpsisForBd2K1MuMu", + config['InterMIPCHI2DV'], config['InterVertexCHI2'], config['JpsiLowerM'], config['JpsiUpperM'], + config['fsPT'], config['fsMIPCHI2DV'], config['fsTRCHI2'], config['fsTRGHOSTPROB'], config['fsPROBNN'], config['muPROBpi'], config['fsM']) + self.Kst = makeKstars( "KstForBd2K1MuMu", + config['InterMIPCHI2DV'], config['InterVertexCHI2'], config['KstLowerM'], config['KstUpperM'], config['Kst_PT'], + config['fsPT'], config['fsMIPCHI2DV'], config['fsTRCHI2'], config['fsTRGHOSTPROB'], config['fsPROBNN'], config['fsM']) + + # Make B0 + self.BdK1Jpsi = makeBdK1Jpsi( name, self.Jpsi, self.Kst, + config['BMassWindow'], config['BVertexCHI2'], config['BIPCHI2'], config['BDIRA'], config['BVDCHI2']) + + self.lineBd2K1MuMu = StrippingLine( Bd2K1MuMuName+"Line", + prescale = config['PrescaleBd2K1MuMuLine'], + selection = self.BdK1Jpsi, + FILTER = SPDFilter, + EnableFlavourTagging = False, + RequiredRawEvents = ["Trigger","Muon","Calo","Rich","Velo","Tracker"]) + #RequiredRawEvents = ["Velo"]) + + self.registerLine(self.lineBd2K1MuMu) + +############################################################## + +def makeBdK1Jpsi( name, Jpsi, K1, + BMassWindow, BVertexCHI2, BIPCHI2, BDIRA, BVDCHI2) : + + _combination_cuts = "( ADAMASS('B0') < %(BMassWindow)s * MeV )" %locals() + + _mother_cuts = "( (VFASPF(VCHI2/VDOF) < %(BVertexCHI2)s ) & (BPVIPCHI2() < %(BIPCHI2)s ) & (BPVDIRA > %(BDIRA)s ) & (BPVVDCHI2 > %(BVDCHI2)s ) )" %locals() + + CombineBdK1Jpsi = CombineParticles( DecayDescriptor = "[B0 -> J/psi(1S) K*(892)0]cc", + CombinationCut = _combination_cuts, + MotherCut = _mother_cuts ) + + return Selection( name, + Algorithm = CombineBdK1Jpsi, + RequiredSelections = [ Jpsi, K1 ] ) + +def makeJpsis( name, + InterMIPCHI2DV, InterVertexCHI2, JpsiLowerM, JpsiUpperM, + fsPT, fsMIPCHI2DV, fsTRCHI2, fsTRGHOSTPROB, fsPROBNN, muPROBpi, fsM) : + + _daughters_cuts = '(HASMUON) & (ISMUON) & ( PT > %(fsPT)s ) & ( MIPCHI2DV(PRIMARY) > %(fsMIPCHI2DV)s ) & ( TRGHOSTPROB < %(fsTRGHOSTPROB)s ) & ( TRCHI2DOF < %(fsTRCHI2)s ) & ( PROBNNpi < %(muPROBpi)s ) & ( PROBNNmu > %(fsPROBNN)s )' %locals() + + _combination_cuts = "(AM > 100*MeV)" + + _mother_cuts = "(MM > %(JpsiLowerM)s *MeV) & (MM < %(JpsiUpperM)s *MeV) & (VFASPF(VCHI2/VDOF)<%(InterVertexCHI2)s) & (MIPCHI2DV(PRIMARY) > %(InterMIPCHI2DV)s )" %locals() + + CombineDiMuons = CombineParticles( DecayDescriptor = "J/psi(1S) -> mu+ mu-", + DaughtersCuts = { "mu+" : _daughters_cuts, "mu-" : _daughters_cuts}, + CombinationCut = _combination_cuts, + MotherCut = _mother_cuts ) + + DiMuonConf = CombineDiMuons.configurable("CombineDiMuons") + + return Selection( name, + Algorithm = CombineDiMuons, + RequiredSelections = [ StdLooseMuons ] ) + +def makeKstars( name, + InterMIPCHI2DV, InterVertexCHI2, KstLowerM, KstUpperM, Kst_PT, + fsPT, fsMIPCHI2DV, fsTRCHI2, fsTRGHOSTPROB, fsPROBNN, fsM) : + + _daughters_cuts = "(PT > %(fsPT)s) & (MIPCHI2DV(PRIMARY)>%(fsMIPCHI2DV)s) & (TRGHOSTPROB<%(fsTRGHOSTPROB)s) & (TRCHI2DOF<%(fsTRCHI2)s) & (M<%(fsM)s)" %locals() + + _combination_cuts = "(APT > 500 *MeV) & (ADAMASS('K*(892)0') < 300 *MeV) & (ADOCACHI2CUT(30, ''))" + + _mother_cuts = "(MM > %(KstLowerM)s *MeV) & (MM < %(KstUpperM)s *MeV) & (VFASPF(VCHI2/VDOF)<%(InterVertexCHI2)s) & (MIPCHI2DV(PRIMARY) > %(InterMIPCHI2DV)s ) & (PT>%(Kst_PT)s *MeV)" %locals() + + CombineKst = CombineParticles( DecayDescriptor = "[K*(892)0 -> K+ pi-]cc", + DaughtersCuts = {"K+" : _daughters_cuts + " & (PROBNNk>%(fsPROBNN)s)" %locals(), "pi-" : _daughters_cuts + " & (PROBNNpi>%(fsPROBNN)s)" %locals()}, + CombinationCut = _combination_cuts, + MotherCut = _mother_cuts) + + KstConf = CombineKst.configurable("CombineKst") + + return Selection( name, + Algorithm = CombineKst, + RequiredSelections = [ StdAllLooseKaons, StdAllLoosePions ] ) \ No newline at end of file