diff --git a/StrippingLambdab2PiLambdac2PEta.py b/StrippingLambdab2PiLambdac2PEta.py new file mode 100644 index 0000000000000000000000000000000000000000..56113d582cd215b55ef08ce3316267de50d19669 --- /dev/null +++ b/StrippingLambdab2PiLambdac2PEta.py @@ -0,0 +1,271 @@ +############################################################################### +# (c) Copyright 2000-2023 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. # +############################################################################### +''' +Speculative code for charmed baryon searches. +The following two channels are used: +Lambda_b0-> pi (Lambda_c+ -> p+ eta) +Lambda_b0-> pi (Lambda_c+ -> p+ eta') +''' + + +__author__ = ['Xiao-Rui Lyu', 'Pei-Rong Li', 'Miroslav Saur', 'Qi-Le Niu'] +__date__ = '2023/07/12' +__version__ = '$Revision: 0.1 $' +__all__ = ('StrippingLambdac2PEta' + ,'default_config') + + +from GaudiConfUtils.ConfigurableGenerators import FilterDesktop, CombineParticles +from StandardParticles import StdAllLoosePions, StdAllLooseProtons, StdLooseProtons, StdLoosePions +from StandardParticles import StdLooseMergedPi0, StdLooseResolvedPi0 +from StandardParticles import StdLooseResolvedEta, StdLooseEta2gg +from PhysSelPython.Wrappers import Selection, DataOnDemand, MergedSelection +from PhysSelPython.Wrappers import MultiSelectionSequence +from StrippingConf.StrippingLine import StrippingLine +from StrippingUtils.Utils import LineBuilder +from GaudiKernel.SystemOfUnits import MeV, GeV, mm, picosecond +import sys + + +default_name='Lambdac2PEta' + #### This is the dictionary of all tunable cuts ######## +default_config={ + 'NAME' : 'Lambdac2PEta', + 'WGs' : ['Charm'], + 'BUILDERTYPE' : 'StrippingLambdac2PEta', + 'STREAMS' : ['Charm'], + 'CONFIG' : { + 'GEC_nLongTrk' : 160 # adimensional + , 'signalPrescale' : 1.0 + , 'TRCHI2DOFMax' : 3.0 + , 'TrGhostProbMax' : 0.25 # same for all particles + , 'MINIPCHI2' : 3.0 # adimensiional + , 'ProtonP' : 3.0*GeV + , 'ProtonPT' : 500*MeV + , 'Proton_PIDpPIDpi_Min' : 5.0 + , 'Proton_PIDpPIDK_Min' : 0.0 + , 'PionP' : 3*GeV + , 'PionPT' : 250*MeV + , 'PionPIDK' : 5.0 + , 'ProbNNp' : 0.4 + , 'ProbNNpi' : 0.4 + , 'ProbNNpiMax' : 0.9 + + , 'Lc_M_HalfWin' : 200.0*MeV + , 'Lb_M_HalfWin' : 200.0*MeV + , 'Lc_Daug_1of3_MIPCHI2DV_Min': 3.0 + , 'Lc_ADOCAMAX_Max' : 0.15*mm + , 'Lc_APT_Min' : 1.2*GeV + , 'Lc_AP_Min' : 15*GeV + , 'Lc_VCHI2_Max' : 30.0 + , 'Lc_BPVVDCHI2_Min' : 16.0 + , 'Lc_BPVVDZ_Min' : 0.5*mm + , 'Lc_BPVDIRA_Min' : 0.95 + + #For Lb + , 'Lb_AP_Min': 20*GeV + , 'Lb_APT_Min': 1.5*GeV + , 'Lb_VCHI2_Max': 30 + , 'Lb_BPVVDCHI2_Min': 16 + , 'Lb_BPVVDZ_Min': 0.7*mm + , 'Lb_BPVDIRA_Min': 0.95 + } ## end of 'CONFIG' +} ## end of default_config + +#------------------------------------------------------------------------------------------------------------- +class StrippingLambdac2PEta(LineBuilder) : + __configuration_keys__ = default_config['CONFIG'].keys() + + def __init__(self, name, config) : + LineBuilder.__init__(self, name, config) + self.name = name + self.config = config + + GECs = { "Code":"( recSummaryTrack(LHCb.RecSummary.nLongTracks, TrLONG) < %(GEC_nLongTrk)s )" % config, + "Preambulo": ["from LoKiTracks.decorators import *"]} + + ########################################################################## + ## Basic particles: p+, pi + ########################################################################## + + self.selPi = Selection( "SelPifor" + name, + Algorithm = self._piFilter("Pifor"+name), + RequiredSelections = [StdLoosePions]) + + self.selProton = Selection( "SelPfor" + name, + Algorithm = self._protonFilter("Pfor"+name), + RequiredSelections = [StdLooseProtons]) + + self.makeEta() + # then use self.Eta2PiPiPi0 and self.Eta2PiPiGamma + + + ########################################################################## + self.DmesonSLList = self.makeLine() + + + #------------------------------------------------------------------------------------------ + #------------------------------------------------------------------------------------------ + # Sub Function + #------------------------------------------------------------------------------------------ + #------------------------------------------------------------------------------------------ + def _protonFilter( self, _name ): + _code = " (TRCHI2DOF < %(TRCHI2DOFMax)s)"\ + "& (PT > %(ProtonPT)s) & (P>%(ProtonP)s)"\ + "& (TRGHOSTPROB< %(TrGhostProbMax)s)"\ + "& (MIPCHI2DV(PRIMARY)> %(MINIPCHI2)s)"\ + "& (PROBNNp > %(ProbNNp)s) & (PROBNNpi < %(ProbNNpiMax)s)"\ + "& (HASRICH)&(PIDp-PIDpi>%(Proton_PIDpPIDpi_Min)s)"\ + "& (HASRICH)&(PIDp-PIDK>%(Proton_PIDpPIDK_Min)s)"% self.config + _pr = FilterDesktop(Code = _code) + return _pr + + + def _piFilter( self , _name): + _code = " (TRCHI2DOF < %(TRCHI2DOFMax)s)"\ + "& (P>%(PionP)s) & (PT > %(PionPT)s)"\ + "& (TRGHOSTPROB< %(TrGhostProbMax)s)"\ + "& (MIPCHI2DV(PRIMARY)> %(MINIPCHI2)s)"\ + "& (PIDK< %(PionPIDK)s) "\ + "& (HASRICH)&(PROBNNpi > %(ProbNNpi)s) " % self.config + _pi = FilterDesktop(Code = _code ) + return _pi + + + def makeLb0Line(self, line_name, prescale, Lc): + comb_cut = "in_range(200, AM, 200000)" + vertex_cut = "ALL" + + Lb0 = self.createCombinationSel(OutputList = "Lb02LcPi_" + line_name, + DecayDescriptor = "[Lambda_b0 -> Lambda_c+ pi-]cc", + DaughterLists = [Lc, self.selPi], + PreVertexCuts = comb_cut, + PostVertexCuts = vertex_cut ) + Lb0Line = StrippingLine( line_name, + prescale = prescale, + selection = Lb0, + EnableFlavourTagging = False ) + return Lb0Line + + + ##------------------------------------------------------------------------------------------ + ## -------------------- Begin to DpSL ------------ + def makeLine( self ): + + _strCutCombfor = "(AMINCHILD(MIPCHI2DV(PRIMARY))>%(Lc_Daug_1of3_MIPCHI2DV_Min)s)" \ + "& (AP>%(Lc_AP_Min)s)" \ + "& (ADAMASS('Lambda_c+') < %(Lc_M_HalfWin)s)" \ + "& (APT>%(Lc_APT_Min)s)" % self.config + + _strCutMothfor = "(VFASPF(VCHI2) < %(Lc_VCHI2_Max)s)" \ + "& (ADMASS('Lambda_c+') < %(Lc_M_HalfWin)s)" \ + "& (BPVVDCHI2>%(Lc_BPVVDCHI2_Min)s)" \ + "& (BPVDIRA>%(Lc_BPVDIRA_Min)s)" % self.config + + _strCutComb_Mass = "(ADAMASS('Lambda_c+') < 1.1*%(Lc_M_HalfWin)s)" % self.config + _strCutMoth_Mass = "(ADMASS('Lambda_c+') < %(Lc_M_HalfWin)s)" % self.config + + _strCutComb = _strCutCombfor + '&' + _strCutComb_Mass + _strCutMoth = _strCutMothfor + '&' + _strCutMoth_Mass + + ''' Stripping Lambda_c+ -> p+ eta ''' + PEta2PiPiPi0 = self.createCombinationSel(OutputList = "Lc2PEta2PiPiPi0" + self.name, + DecayDescriptor = "[Lambda_c+ -> p+ eta]cc", + DaughterLists = [self.selProton, self.Eta2PiPiPi0], + PreVertexCuts = _strCutComb, + PostVertexCuts = _strCutMoth ) + self.registerLine(self.makeLb0Line( + line_name=self.name + "Lb2LcPiLc2Eta2PiPiPi0", + prescale=self.config['signalPrescale'], + Lc=PEta2PiPiPi0 + )) + + ''' Stripping Lambda_c+ -> p+ eta_prime ''' + PEtap2PiPiEta = self.createCombinationSel(OutputList = "Lc2PEtap2PiPiEta" + self.name, + DecayDescriptor = "[Lambda_c+ -> p+ eta_prime]cc", + DaughterLists = [self.selProton, self.Etap2PiPiEta], + PreVertexCuts = _strCutComb, + PostVertexCuts = _strCutMoth ) + self.registerLine(self.makeLb0Line( + line_name=self.name + "Lb2LcPiLc2Etap2PiPiEta", + prescale=self.config['signalPrescale'], + Lc=PEtap2PiPiEta + )) + + ## -------------------- End of DpSL ------------ + ##------------------------------------------------------------------------------------------ + def makeEta(self): + #get standard containers + self.Pi0List = DataOnDemand(Location = "Phys/StdLoosePi02gg/Particles") + self.LoosePionList = DataOnDemand(Location = "Phys/StdLoosePions/Particles") + + #clean neutrals + _tightpi0_cut = "(CHILD(CL,1)>0.05) & (CHILD(CL,2)>0.05) & (PT>0.0*GeV)" + + #pipi vertex cuts + _pipix_cut = "(BPVVDZ>0) & (VFASPF(VCHI2)<9) & (BPVDIRA>0.95) & (BPVVDCHI2>25)" + + #pipix0 cuts + _eta_cut = "(ADAMASS('eta')<100*MeV) & (APT>1500*MeV)" + _etap_cut = "(ADAMASS('eta_prime')<200*MeV) & (APT>1500*MeV)" + + #filter standard containers + self.TightPi0List = self.createSubSel( OutputList = self.name + '_TightPi0', InputList = self.Pi0List, Cuts = _tightpi0_cut) + + #------------- + + self.Eta2PiPiPi0 = self.createCombinationSel( OutputList = self.name + "_Eta2PiPiPi0", + DecayDescriptor = "eta -> pi+ pi- pi0", + DaughterLists = [ self.LoosePionList, self.TightPi0List], + PreVertexCuts = _eta_cut, + PostVertexCuts = _pipix_cut) + #------------- + self.Etap2PiPiEta = self.createCombinationSel( OutputList = self.name + "_Etap2PiPiEta", + DecayDescriptor = "eta_prime -> pi+ pi- eta", + DaughterLists = [ self.LoosePionList, self.Eta2PiPiPi0], + PreVertexCuts = _etap_cut, + PostVertexCuts = _pipix_cut) + + ########################################################################## + ## Basic Function + ########################################################################## + def createSubSel( self, OutputList, InputList, Cuts ) : + '''create a selection using a FilterDesktop''' + filter = FilterDesktop(Code = Cuts) + return Selection( OutputList, + Algorithm = filter, + RequiredSelections = [ InputList ] ) + + def createCombinationSel( self, OutputList, + DecayDescriptor, + DaughterLists, + DaughterCuts = {} , + PreVertexCuts = "ALL", + PostVertexCuts = "ALL") : + '''create a selection using a ParticleCombiner with a single decay descriptor''' + if type(DecayDescriptor) is list: + combiner = CombineParticles( DecayDescriptors = DecayDescriptor, + DaughtersCuts = DaughterCuts, + MotherCut = PostVertexCuts, + CombinationCut = PreVertexCuts, + ReFitPVs = True) + return Selection ( OutputList, + Algorithm = combiner, + RequiredSelections = DaughterLists) + else: + combiner = CombineParticles( DecayDescriptor = DecayDescriptor, + DaughtersCuts = DaughterCuts, + MotherCut = PostVertexCuts, + CombinationCut = PreVertexCuts, + ReFitPVs = True) + return Selection ( OutputList, + Algorithm = combiner, + RequiredSelections = DaughterLists)