diff --git a/Phys/StrippingSelections/python/StrippingSelections/StrippingRD/StrippingS2Hyperons.py b/Phys/StrippingSelections/python/StrippingSelections/StrippingRD/StrippingS2Hyperons.py index 6fbfd67b689f211bc10671255bc550e9f767e9ea..b9e55a21d052523e4b800d16d4b5701f9f7f5756 100644 --- a/Phys/StrippingSelections/python/StrippingSelections/StrippingRD/StrippingS2Hyperons.py +++ b/Phys/StrippingSelections/python/StrippingSelections/StrippingRD/StrippingS2Hyperons.py @@ -9,20 +9,19 @@ # or submit itself to any jurisdiction. # ############################################################################### ''' -Stripping line for Omega- --> Lambda pi-, Xi0 --> p pi-, Xi0 --> p K- and Xi-/Omega- --> p pi- pi- (Delta S >= 2 forbidden modes, dubbed in the PDG as "S2 modes"). -Adapted from the ChargedHyperons module (Mike Sokoloff, Laurence Carson). +Stripping line for Omega- --> Lambda pi-, Xi0 --> p pi-, and Xi-/Omega- --> p pi- pi- (Delta S >= 2 forbidden modes, dubbed in the PDG as "S2 modes"). +Also included Lambda0 --> p+ pi-, and Xi- -->Lambda0 pi- for normalisation. Adapted from the ChargedHyperons module (Mike Sokoloff, Laurence Carson). ''' -__author__ = ['Vitalii Lisovskyi'] -__date__ = '01/09/2021' -__version__ = '$Revision: 1.0 $' -__all__ = ('StrippingS2HyperonsConf' - ,'default_config') +__author__ = ['Vitalii Lisovskyi', 'Frank Liu'] +__date__ = '10/07/2023' +__version__ = '$Revision: 2.0 $' +__all__ = ('StrippingS2HyperonsConf', 'default_config') from Gaudi.Configuration import * from GaudiConfUtils.ConfigurableGenerators import FilterDesktop, CombineParticles from StandardParticles import StdLoosePions, StdNoPIDsDownPions, StdLooseKaons, StdLooseDownKaons -from StandardParticles import StdAllLoosePions, StdAllLooseKaons +from StandardParticles import StdAllLoosePions, StdAllLooseKaons from PhysSelPython.Wrappers import Selection, DataOnDemand, MergedSelection from PhysSelPython.Wrappers import MultiSelectionSequence @@ -31,465 +30,503 @@ from StrippingUtils.Utils import LineBuilder from GaudiKernel.SystemOfUnits import MeV, mm, picosecond -default_name='S2Hyperons' - #### This is the dictionary of all tunable cuts ######## -default_config={ - 'NAME' : 'S2Hyperons', - 'WGs' : ['RD'], - 'BUILDERTYPE' : 'StrippingS2HyperonsConf', - 'STREAMS' : ['Charm'], - 'CONFIG' : { - 'TRCHI2DOFMax' : 3.0 - #, 'PionPIDK' : 5.0 - , 'ProtonProbNNp' : 0.3 - , 'XiMassWindow' : 25 * MeV - , 'OmegaMassWindow' : 30 * MeV - , 'LambdaLLMinDecayTime' : 2.0 * picosecond - , 'LambdaLLVtxChi2Max' : 5.0 - , 'LambdaDDVtxChi2Max' : 5.0 - , 'LambdaLLMassWin' : 8 * MeV - , 'LambdaDDMassWin' : 8 * MeV - , 'LambdaLLMinVZ' : -100. * mm - , 'LambdaLLMaxVZ' : 400. * mm - , 'LambdaDDMinVZ' : 400. * mm - , 'LambdaDDMaxVZ' : 2275. * mm - , 'TrGhostProbMax' : 0.25 - , 'KaonPIDK' : 0 - , 'ProbNNpMinLL' : 0.20 - , 'ProbNNpMinDD' : 0.05 - , 'Bachelor_PT_MIN' : 100 * MeV - , 'Proton_PT_MIN' : 1000 * MeV - , 'Proton_P_MIN' : 3000 * MeV - , 'Bachelor_BPVIPCHI2_MIN' : 40. - , 'XiDaughter_BPVIPCHI2_MIN' : 50. - , 'LooseDaughter_BPVIPCHI2_MIN' : 20. - , 'LambdaDeltaZ_MIN' : 5.0 * mm - , 'Hyperon_BPVLTIME_MIN' : 5.0 * picosecond - , 'PostVertexChi2_MIN' : 5.0 - , 'LambdaPr_PT_MIN' : 500. * MeV - , 'LambdaPi_PT_MIN' : 100. * MeV - } ## end of 'CONFIG' -} ## end of default_config -#------------------------------------------------------------------------------------------------------------- -class StrippingS2HyperonsConf(LineBuilder) : - - __configuration_keys__ = default_config['CONFIG'].keys() - - def __init__(self, name, config) : - LineBuilder.__init__(self, name, config) - self.name = name - self.config = config - - - - self.LongPionsList = MergedSelection("LongPionsFor" + self.name, - RequiredSelections = [DataOnDemand(Location = "Phys/StdAllLoosePions/Particles")]) - - self.DownstreamPionsList = MergedSelection("DownstreamPionsFor" + self.name, - RequiredSelections = [DataOnDemand(Location = "Phys/StdNoPIDsDownPions/Particles")]) - - self.LongProtonsList = MergedSelection("LongProtonsFor" + self.name, - RequiredSelections = [DataOnDemand(Location = "Phys/StdAllLooseProtons/Particles")]) - - self.DownstreamProtonsList = MergedSelection("DownstreamProtonsFor" + self.name, - RequiredSelections = [DataOnDemand(Location = "Phys/StdNoPIDsDownProtons/Particles")]) - - self.LongKaonsList = MergedSelection("LongKaonsFor" + self.name, - RequiredSelections = [DataOnDemand(Location = "Phys/StdAllLooseKaons/Particles")]) - - self.DownstreamKaonsList = MergedSelection("DownstreamKaonsFor" + self.name, - RequiredSelections = [DataOnDemand(Location = "Phys/StdNoPIDsDownKaons/Particles")]) - - self.GoodLongPionsList = self.createSubSel( OutputList = "GoodLongPionsFor" + self.name, - InputList = self.LongPionsList, - Cuts = "(TRCHI2DOF < %(TRCHI2DOFMax)s )"\ - " & (TRGHOSTPROB <%(TrGhostProbMax)s )" % self.config ) #\ - # " & (PIDK < %(PionPIDK)s )" % self.config ) - - self.GoodDownstreamPionsList = self.createSubSel( OutputList = "GoodDownstreamPionsFor" + self.name, - InputList = self.DownstreamPionsList, - Cuts = "(TRCHI2DOF < %(TRCHI2DOFMax)s)" % self.config ) #\ - #" & (PIDK < %(PionPIDK)s )" % self.config ) - - self.GoodLongProtonsList = self.createSubSel( OutputList = "GoodLongProtonsFor" + self.name, - InputList = self.LongProtonsList, - Cuts = "(TRCHI2DOF < %(TRCHI2DOFMax)s )"\ - " & (TRGHOSTPROB <%(TrGhostProbMax)s )" % self.config ) #\ - # " & (PIDK < %(PionPIDK)s )" % self.config ) - - self.GoodDownstreamProtonsList = self.createSubSel( OutputList = "GoodDownstreamProtonsFor" + self.name, - InputList = self.DownstreamProtonsList, - Cuts = "(TRCHI2DOF < %(TRCHI2DOFMax)s)" % self.config ) #\ - #" & (PIDK < %(PionPIDK)s )" % self.config ) - - self.GoodLongKaonsList = self.createSubSel( OutputList = "GoodLongKaonsFor" + self.name, - InputList = self.LongKaonsList, - Cuts = "(TRCHI2DOF < %(TRCHI2DOFMax)s )"\ - " & (TRGHOSTPROB < %(TrGhostProbMax)s )" % self.config ) #\ - #" & (PIDK > %(KaonPIDK)s )" % self.config ) - - - self.GoodDownstreamKaonsList = self.createSubSel( OutputList = "GoodDownstreamKaonsFor" + self.name, - InputList = self.DownstreamKaonsList, - Cuts = "(TRCHI2DOF < %(TRCHI2DOFMax)s )"% self.config )#\ - # " & (PIDK > %(KaonPIDK)s )" % self.config ) - - - - - - self.LambdaListLooseDD = MergedSelection("StdLooseDDLambdaFor" + self.name, - RequiredSelections = [DataOnDemand(Location = "Phys/StdLooseLambdaDD/Particles")]) - - self.LambdaListLooseLL = MergedSelection("StdLooseLLLambdaFor" + self.name, - RequiredSelections = [DataOnDemand(Location = "Phys/StdLooseLambdaLL/Particles")]) - - self.LambdaListLL = self.createSubSel(OutputList = "LambdaLLFor" + self.name, - InputList = self.LambdaListLooseLL , - Cuts = "(MAXTREE('p+'==ABSID, PT) > %(LambdaPr_PT_MIN)s ) "\ - "& (MAXTREE('pi-'==ABSID, PT) > %(LambdaPi_PT_MIN)s ) " \ - "& (MAXTREE('p+'==ABSID,PROBNNp) > %(ProbNNpMinLL)s ) "\ - "& (MINTREE('pi-'==ABSID, TRGHOSTPROB) < %(TrGhostProbMax)s )"\ - "& (MINTREE('p+'==ABSID, TRGHOSTPROB) < %(TrGhostProbMax)s )"\ - "& (ADMASS('Lambda0') < %(LambdaLLMassWin)s ) " - "& (VFASPF(VCHI2/VDOF) < %(LambdaLLVtxChi2Max)s ) "\ - "& (VFASPF(VZ) > %(LambdaLLMinVZ)s ) " \ - "& (VFASPF(VZ) < %(LambdaLLMaxVZ)s ) " \ - "& (BPVLTIME() > %(LambdaLLMinDecayTime)s )" % self.config \ - ) - - self.LambdaListDD = self.createSubSel(OutputList = "LambdaDDFor" + self.name, - InputList = self.LambdaListLooseDD , - Cuts = "(MAXTREE('p+'==ABSID, PT) > %(LambdaPr_PT_MIN)s ) "\ - "& (MAXTREE('pi-'==ABSID, PT) > %(LambdaPi_PT_MIN)s ) " \ - "& (MAXTREE('p+'==ABSID, PROBNNp) > %(ProbNNpMinDD)s ) "\ - "& (ADMASS('Lambda0') < %(LambdaDDMassWin)s ) " \ - "& (VFASPF(VCHI2/VDOF) < %(LambdaDDVtxChi2Max)s ) "\ - "& (VFASPF(VZ) < %(LambdaDDMaxVZ)s ) " \ - "& (VFASPF(VZ) > %(LambdaDDMinVZ)s )" % self.config \ - ) - - self.LambdaList = MergedSelection("LambdaFor" + self.name, - RequiredSelections = [self.LambdaListLL, self.LambdaListDD] - ) - - self.XizeroList = self.makeXizero() - self.XiminusList = self.makeXiminus() - self.OmegaminusList = self.makeOmegaminus() - self.XizeroS3List = self.makeXizeroS3() - self.OmegaS3List = self.makeOmegaS3() - - 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 = "AALL", - PostVertexCuts = "ALL" ) : - '''create a selection using a ParticleCombiner with a single decay descriptor''' - combiner = CombineParticles( DecayDescriptor = DecayDescriptor, - DaughtersCuts = DaughterCuts, - MotherCut = PostVertexCuts, - CombinationCut = PreVertexCuts, - ReFitPVs = True) - return Selection ( OutputList, - Algorithm = combiner, - RequiredSelections = DaughterLists) - - - -#------------------------------------------------------------------------------------------ - - def makeXizero( self ): - - ''' Make a Xi0 candidate from long tracks ''' - Xi02PPiLL = self.createCombinationSel(OutputList = "Xi02PPiLL"+ self.name, - DecayDescriptor = "[Xi0 -> p+ pi-]cc", - DaughterLists = [self.GoodLongPionsList, self.GoodLongProtonsList], - DaughterCuts = {"pi-" : "(PT> 1.5*%(Bachelor_PT_MIN)s ) &"\ - " (BPVIPCHI2() > %(XiDaughter_BPVIPCHI2_MIN)s )"% self.config, - "p+" : "(PT> %(Proton_PT_MIN)s ) & (P> %(Proton_P_MIN)s ) & (PROBNNp > %(ProtonProbNNp)s) & "\ - " (BPVIPCHI2() > %(XiDaughter_BPVIPCHI2_MIN)s )"% self.config}, - PreVertexCuts = "(ADAMASS('Xi0') < 2*%(XiMassWindow)s*MeV)"% self.config, - PostVertexCuts = "(VFASPF(VCHI2/VDOF)<%(PostVertexChi2_MIN)s ) & "\ - " (BPVLTIME() > %(Hyperon_BPVLTIME_MIN)s) & "\ - "(ADMASS('Xi0') < %(XiMassWindow)s*MeV) & "\ - "(BPVVDZ>0) "% self.config +default_name = 'S2Hyperons' +#### This is the dictionary of all tunable cuts ######## +default_config = { + 'NAME': 'S2Hyperons', + 'WGs': ['RD'], + 'BUILDERTYPE': 'StrippingS2HyperonsConf', + 'STREAMS': ['Charm'], + 'CONFIG': { + 'TRCHI2DOFMax': 3.0 # , 'PionPIDK' : 5.0 + , 'ProtonProbNNp': 0.3, 'XiMassWindow': 25 * MeV, 'OmegaMassWindow': 30 * MeV, 'LambdaLLMinDecayTime': 2.0 * picosecond, 'LambdaLLVtxChi2Max': 5.0, 'LambdaDDVtxChi2Max': 5.0, 'LambdaLLMassWin': 8 * MeV, 'LambdaDDMassWin': 8 * MeV, 'LambdaLLMinVZ': -100. * mm, 'LambdaLLMaxVZ': 400. * mm, 'LambdaDDMinVZ': 400. * mm, 'LambdaDDMaxVZ': 2275. * mm, 'TrGhostProbMax': 0.25, 'KaonPIDK': 0, 'ProbNNpMinLL': 0.20, 'ProbNNpMinDD': 0.05, 'Bachelor_PT_MIN': 100 * MeV, 'Proton_PT_MIN': 1000 * MeV, 'Proton_P_MIN': 3000 * MeV, 'Bachelor_BPVIPCHI2_MIN': 40., 'XiDaughter_BPVIPCHI2_MIN': 50., 'LooseDaughter_BPVIPCHI2_MIN': 20., 'LambdaDeltaZ_MIN': 5.0 * mm, 'Hyperon_BPVLTIME_MIN': 5.0 * picosecond, 'PostVertexChi2_MIN': 5.0, 'LambdaPr_PT_MIN': 500. * MeV, 'LambdaPi_PT_MIN': 100. * MeV, 'CommonRelInfoTools': [{"Type": "RelInfoVertexIsolation", "Location": "VtxIsoInfo"}], 'PrescaleLambda02PPi': 0.05 + } # end of 'CONFIG' +} # end of default_config +# ------------------------------------------------------------------------------------------------------------- + + +class StrippingS2HyperonsConf(LineBuilder): + + __configuration_keys__ = default_config['CONFIG'].keys() + + def __init__(self, name, config): + LineBuilder.__init__(self, name, config) + self.name = name + self.config = config + + self.LongPionsList = MergedSelection("LongPionsFor" + self.name, + RequiredSelections=[DataOnDemand(Location="Phys/StdAllLoosePions/Particles")]) + + self.DownstreamPionsList = MergedSelection("DownstreamPionsFor" + self.name, + RequiredSelections=[DataOnDemand(Location="Phys/StdNoPIDsDownPions/Particles")]) + + self.LongProtonsList = MergedSelection("LongProtonsFor" + self.name, + RequiredSelections=[DataOnDemand(Location="Phys/StdAllLooseProtons/Particles")]) + + self.DownstreamProtonsList = MergedSelection("DownstreamProtonsFor" + self.name, + RequiredSelections=[DataOnDemand(Location="Phys/StdNoPIDsDownProtons/Particles")]) + + self.LongKaonsList = MergedSelection("LongKaonsFor" + self.name, + RequiredSelections=[DataOnDemand(Location="Phys/StdAllLooseKaons/Particles")]) + + self.DownstreamKaonsList = MergedSelection("DownstreamKaonsFor" + self.name, + RequiredSelections=[DataOnDemand(Location="Phys/StdNoPIDsDownKaons/Particles")]) + + self.GoodLongPionsList = self.createSubSel(OutputList="GoodLongPionsFor" + self.name, + InputList=self.LongPionsList, + Cuts="(TRCHI2DOF < %(TRCHI2DOFMax)s )" + " & (TRGHOSTPROB <%(TrGhostProbMax)s )" % self.config) # \ + # " & (PIDK < %(PionPIDK)s )" % self.config ) + + self.GoodDownstreamPionsList = self.createSubSel(OutputList="GoodDownstreamPionsFor" + self.name, + InputList=self.DownstreamPionsList, + Cuts="(TRCHI2DOF < %(TRCHI2DOFMax)s)" % self.config) # \ + # " & (PIDK < %(PionPIDK)s )" % self.config ) + + self.GoodLongProtonsList = self.createSubSel(OutputList="GoodLongProtonsFor" + self.name, + InputList=self.LongProtonsList, + Cuts="(TRCHI2DOF < %(TRCHI2DOFMax)s )" + " & (TRGHOSTPROB <%(TrGhostProbMax)s )" % self.config) # \ + # " & (PIDK < %(PionPIDK)s )" % self.config ) + + self.GoodDownstreamProtonsList = self.createSubSel(OutputList="GoodDownstreamProtonsFor" + self.name, + InputList=self.DownstreamProtonsList, + Cuts="(TRCHI2DOF < %(TRCHI2DOFMax)s)" % self.config) # \ + # " & (PIDK < %(PionPIDK)s )" % self.config ) + + self.GoodLongKaonsList = self.createSubSel(OutputList="GoodLongKaonsFor" + self.name, + InputList=self.LongKaonsList, + Cuts="(TRCHI2DOF < %(TRCHI2DOFMax)s )" + " & (TRGHOSTPROB < %(TrGhostProbMax)s )" % self.config) # \ + # " & (PIDK > %(KaonPIDK)s )" % self.config ) + + self.GoodDownstreamKaonsList = self.createSubSel(OutputList="GoodDownstreamKaonsFor" + self.name, + InputList=self.DownstreamKaonsList, + Cuts="(TRCHI2DOF < %(TRCHI2DOFMax)s )" % self.config) # \ + # " & (PIDK > %(KaonPIDK)s )" % self.config ) + + self.LambdaListLooseDD = MergedSelection("StdLooseDDLambdaFor" + self.name, + RequiredSelections=[DataOnDemand(Location="Phys/StdLooseLambdaDD/Particles")]) + + self.LambdaListLooseLL = MergedSelection("StdLooseLLLambdaFor" + self.name, + RequiredSelections=[DataOnDemand(Location="Phys/StdLooseLambdaLL/Particles")]) + + self.LambdaListLL = self.createSubSel(OutputList="LambdaLLFor" + self.name, + InputList=self.LambdaListLooseLL, + Cuts="(MAXTREE('p+'==ABSID, PT) > %(LambdaPr_PT_MIN)s ) " + "& (MAXTREE('pi-'==ABSID, PT) > %(LambdaPi_PT_MIN)s ) " + "& (MAXTREE('p+'==ABSID,PROBNNp) > %(ProbNNpMinLL)s ) " + "& (MINTREE('pi-'==ABSID, TRGHOSTPROB) < %(TrGhostProbMax)s )" + "& (MINTREE('p+'==ABSID, TRGHOSTPROB) < %(TrGhostProbMax)s )" + "& (ADMASS('Lambda0') < %(LambdaLLMassWin)s ) " + "& (VFASPF(VCHI2/VDOF) < %(LambdaLLVtxChi2Max)s ) " + "& (VFASPF(VZ) > %(LambdaLLMinVZ)s ) " + "& (VFASPF(VZ) < %(LambdaLLMaxVZ)s ) " + "& (BPVLTIME() > %(LambdaLLMinDecayTime)s )" % self.config + ) + + self.LambdaListDD = self.createSubSel(OutputList="LambdaDDFor" + self.name, + InputList=self.LambdaListLooseDD, + Cuts="(MAXTREE('p+'==ABSID, PT) > %(LambdaPr_PT_MIN)s ) " + "& (MAXTREE('pi-'==ABSID, PT) > %(LambdaPi_PT_MIN)s ) " + "& (MAXTREE('p+'==ABSID, PROBNNp) > %(ProbNNpMinDD)s ) " + "& (ADMASS('Lambda0') < %(LambdaDDMassWin)s ) " + "& (VFASPF(VCHI2/VDOF) < %(LambdaDDVtxChi2Max)s ) " + "& (VFASPF(VZ) < %(LambdaDDMaxVZ)s ) " + "& (VFASPF(VZ) > %(LambdaDDMinVZ)s )" % self.config + ) + + self.LambdaList = MergedSelection("LambdaFor" + self.name, + RequiredSelections=[ + self.LambdaListLL, self.LambdaListDD] + ) + + self.XizeroList = self.makeXizero() + self.LambdazeroList = self.makeLambdazero() + self.XiminusControlList = self.makeXiminusControl() + self.XiminusList = self.makeXiminus() + self.OmegaminusList = self.makeOmegaminus() + self.OmegaS3List = self.makeOmegaS3() + + 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="AALL", + PostVertexCuts="ALL"): + '''create a selection using a ParticleCombiner with a single decay descriptor''' + combiner = CombineParticles(DecayDescriptor=DecayDescriptor, + DaughtersCuts=DaughterCuts, + MotherCut=PostVertexCuts, + CombinationCut=PreVertexCuts, + ReFitPVs=True) + return Selection(OutputList, + Algorithm=combiner, + RequiredSelections=DaughterLists) + + +# ------------------------------------------------------------------------------------------ + + def makeXizero(self): + ''' Make a Xi0 candidate from long tracks ''' + Xi02PPiLL = self.createCombinationSel(OutputList="Xi02PPiLL" + self.name, + DecayDescriptor="[Xi0 -> p+ pi-]cc", + DaughterLists=[ + self.GoodLongPionsList, self.GoodLongProtonsList], + DaughterCuts={"pi-": "(PT> 1.5*%(Bachelor_PT_MIN)s ) &" + " (BPVIPCHI2() > %(XiDaughter_BPVIPCHI2_MIN)s )" % self.config, + "p+": "(PT> %(Proton_PT_MIN)s ) & (P> %(Proton_P_MIN)s ) & (PROBNNp > %(ProtonProbNNp)s) & " + " (BPVIPCHI2() > %(XiDaughter_BPVIPCHI2_MIN)s )" % self.config}, + PreVertexCuts="(ADAMASS('Xi0') < 2*%(XiMassWindow)s*MeV)" % self.config, + PostVertexCuts="(VFASPF(VCHI2/VDOF)<%(PostVertexChi2_MIN)s ) & " + " (BPVLTIME() > %(Hyperon_BPVLTIME_MIN)s) & " + "(ADMASS('Xi0') < %(XiMassWindow)s*MeV) & " + "(BPVVDZ>0) " % self.config + ) + + ''' Make a Xi0 candidate from downstream tracks''' + Xi02PPiDD = self.createCombinationSel(OutputList="Xi02PPiDD" + self.name, + DecayDescriptor="[Xi0 -> p+ pi-]cc", + DaughterLists=[ + self.GoodDownstreamPionsList, self.GoodDownstreamProtonsList], + DaughterCuts={"pi-": "(PT> 2.5*%(Bachelor_PT_MIN)s ) &" + " (BPVIPCHI2() > %(XiDaughter_BPVIPCHI2_MIN)s )" % self.config, + "p+": "(PT> %(Proton_PT_MIN)s ) & (P> %(Proton_P_MIN)s ) & (PROBNNp > %(ProtonProbNNp)s ) & " + " (BPVIPCHI2() > %(XiDaughter_BPVIPCHI2_MIN)s )" % self.config}, + PreVertexCuts="(ADAMASS('Xi0') < 2*%(XiMassWindow)s*MeV)" % self.config, + PostVertexCuts="(VFASPF(VCHI2/VDOF)< %(PostVertexChi2_MIN)s ) &" + "(BPVLTIME() > %(Hyperon_BPVLTIME_MIN)s ) & " + "(ADMASS('Xi0') < %(XiMassWindow)s*MeV) & " + "(BPVVDZ>0) " % self.config + + ) +# Xi02PPi is a "Selection" object; MergedSelection passes everything which gets to it +# even when the output list is empty + Xi02PPi = MergedSelection("Xi02PPi"+self.name, + RequiredSelections=[Xi02PPiDD, Xi02PPiLL]) + +# NullFilter is a "FilterDesktop" object which is a type of "Algorithm" +# This one will pass all candidates + NullFilter = FilterDesktop(Code="ALL") + +# this is *also* a Selection, but it is "more selective" +# than Xi02PPi in the sense that it passes only events when something +# is in the output list + Xi02PPiSelection = Selection("Xi02PPiSelection"+self.name, + Algorithm=NullFilter, + RequiredSelections=[Xi02PPi]) + Xi02PPiLine = StrippingLine(self.name + "Xi02PPi", + algos=[Xi02PPiSelection], + RelatedInfoTools=self.config['CommonRelInfoTools']) + self.registerLine(Xi02PPiLine) + +# -------------------- end of makeXizero ------------ +# ------------------------------------------------------------------------------------------ + + def makeLambdazero(self): + ''' Make a Lambda0 candidate from long tracks ''' + Lambda02PPiLL = self.createCombinationSel(OutputList="Lambda02PPiLL" + self.name, + DecayDescriptor="[Lambda0 -> p+ pi-]cc", + DaughterLists=[ + self.GoodLongPionsList, self.GoodLongProtonsList], + DaughterCuts={"pi-": "(PT> 1.5*%(Bachelor_PT_MIN)s ) &" + " (BPVIPCHI2() > %(XiDaughter_BPVIPCHI2_MIN)s )" % self.config, + "p+": "(PT> %(Proton_PT_MIN)s ) & (P> %(Proton_P_MIN)s ) & (PROBNNp > %(ProtonProbNNp)s) & " + " (BPVIPCHI2() > %(XiDaughter_BPVIPCHI2_MIN)s )" % self.config}, + PreVertexCuts="(ADAMASS('Lambda0') < 2*%(XiMassWindow)s*MeV)" % self.config, + PostVertexCuts="(VFASPF(VCHI2/VDOF)<%(PostVertexChi2_MIN)s ) & " + " (BPVLTIME() > %(LambdaLLMinDecayTime)s) & " + "(ADMASS('Lambda0') < %(XiMassWindow)s*MeV) & " + "(BPVVDZ>0) " % self.config + ) + + ''' Make a Lambda0 candidate from downstream tracks''' + Lambda02PPiDD = self.createCombinationSel(OutputList="Lambda02PPiDD" + self.name, + DecayDescriptor="[Lambda0 -> p+ pi-]cc", + DaughterLists=[ + self.GoodDownstreamPionsList, self.GoodDownstreamProtonsList], + DaughterCuts={"pi-": "(PT> 2.5*%(Bachelor_PT_MIN)s ) &" + " (BPVIPCHI2() > %(XiDaughter_BPVIPCHI2_MIN)s )" % self.config, + "p+": "(PT> %(Proton_PT_MIN)s ) & (P> %(Proton_P_MIN)s ) & (PROBNNp > %(ProtonProbNNp)s ) & " + " (BPVIPCHI2() > %(XiDaughter_BPVIPCHI2_MIN)s )" % self.config}, + PreVertexCuts="(ADAMASS('Lambda0') < 2*%(XiMassWindow)s*MeV)" % self.config, + PostVertexCuts="(VFASPF(VCHI2/VDOF)< %(PostVertexChi2_MIN)s ) &" + "(BPVLTIME() > %(LambdaLLMinDecayTime)s ) & " + "(ADMASS('Lambda0') < %(XiMassWindow)s*MeV) & " + "(BPVVDZ>0) " % self.config + + ) +# Lambda02PPi is a "Selection" object; MergedSelection passes everything which gets to it +# even when the output list is empty + Lambda02PPi = MergedSelection("Lambda02PPi"+self.name, + RequiredSelections=[Lambda02PPiDD, Lambda02PPiLL]) + +# NullFilter is a "FilterDesktop" object which is a type of "Algorithm" +# This one will pass all candidates + NullFilter = FilterDesktop(Code="ALL") + +# this is *also* a Selection, but it is "more selective" +# than Lambda02PPi in the sense that it passes only events when something +# is in the output list + Lambda02PPiSelection = Selection("Lambda02PPiSelection"+self.name, + Algorithm=NullFilter, + RequiredSelections=[Lambda02PPi]) + Lambda02PPiLine = StrippingLine(self.name + "Lambda02PPi", + algos=[Lambda02PPiSelection], + RelatedInfoTools=self.config['CommonRelInfoTools'], + prescale=self.config['PrescaleLambda02PPi']) + self.registerLine(Lambda02PPiLine) + +# -------------------- end of makeLambdazero ------------ +# ------------------------------------------------------------------------------------------ + + def makeXiminusControl(self): + ''' Make a Xi minus candidate from long tracks ''' + Xim2LambdaPiLL = self.createCombinationSel(OutputList="Xim2LambdaPiLL" + self.name, + DecayDescriptor="[Xi- -> Lambda0 pi-]cc", + DaughterLists=[ + self.GoodLongPionsList, self.LambdaListLL], + DaughterCuts={"pi-": "(PT> %(Bachelor_PT_MIN)s ) &" + " (BPVIPCHI2() > %(LooseDaughter_BPVIPCHI2_MIN)s )" % self.config}, + PreVertexCuts="(ADAMASS('Xi-') < 2*%(XiMassWindow)s*MeV)" % self.config, + PostVertexCuts="(VFASPF(VCHI2/VDOF)<%(PostVertexChi2_MIN)s ) & " + " (BPVLTIME() > %(Hyperon_BPVLTIME_MIN)s) & " + "(ADMASS('Xi-') < %(XiMassWindow)s*MeV) & " + "(BPVVDZ>0) " % self.config + ) + + ''' Make a Xi minus candidate from downstream tracks''' + Xim2LambdaPiDD = self.createCombinationSel(OutputList="Xim2LambdaPiDD" + self.name, + DecayDescriptor="[Xi- -> Lambda0 pi-]cc", + DaughterLists=[ + self.GoodDownstreamPionsList, self.LambdaListDD], + DaughterCuts={"pi-": "(PT> %(Bachelor_PT_MIN)s ) &" + " (BPVIPCHI2() > %(LooseDaughter_BPVIPCHI2_MIN)s )" % self.config}, + PreVertexCuts="(ADAMASS('Xi-') < 2*%(XiMassWindow)s*MeV)" % self.config, + PostVertexCuts="(VFASPF(VCHI2/VDOF)< %(PostVertexChi2_MIN)s ) &" + "(BPVLTIME() > %(Hyperon_BPVLTIME_MIN)s ) & " + "(ADMASS('Xi-') < %(XiMassWindow)s*MeV) & " + "(BPVVDZ>0) " % self.config + + ) + + ''' Make a Xi minus candidate from long pi tracks and downstream lambda0 tracks''' + Xim2LambdaPiLD = self.createCombinationSel(OutputList="Xim2LambdaPiLD" + self.name, + DecayDescriptor="[Xi- -> Lambda0 pi-]cc", + DaughterLists=[ + self.GoodLongPionsList, self.LambdaListDD], + DaughterCuts={"pi-": "(PT> %(Bachelor_PT_MIN)s ) &" + " (BPVIPCHI2() > %(LooseDaughter_BPVIPCHI2_MIN)s )" % self.config}, + PreVertexCuts="(ADAMASS('Xi-') < 2*%(XiMassWindow)s*MeV)" % self.config, + PostVertexCuts="(VFASPF(VCHI2/VDOF)< %(PostVertexChi2_MIN)s ) &" + "(BPVLTIME() > %(Hyperon_BPVLTIME_MIN)s ) & " + "(ADMASS('Xi-') < %(XiMassWindow)s*MeV) & " + "(BPVVDZ>0) " % self.config + + ) + +# Xim2LambdaPi is a "Selection" object; MergedSelection passes everything which gets to it +# even when the output list is empty + Xim2LambdaPi = MergedSelection("Xim2LambdaPi"+self.name, + RequiredSelections=[Xim2LambdaPiDD, Xim2LambdaPiLL, Xim2LambdaPiLD]) + +# NullFilter is a "FilterDesktop" object which is a type of "Algorithm" +# This one will pass all candidates + NullFilter = FilterDesktop(Code="ALL") + +# this is *also* a Selection, but it is "more selective" +# than Xim2LambdaPi in the sense that it passes only events when something +# is in the output list + Xim2LambdaPiSelection = Selection("Xim2LambdaPiSelection"+self.name, + Algorithm=NullFilter, + RequiredSelections=[Xim2LambdaPi]) + Xim2LambdaPiLine = StrippingLine(self.name + "Xim2LambdaPi", + algos=[Xim2LambdaPiSelection], + RelatedInfoTools=self.config['CommonRelInfoTools']) + self.registerLine(Xim2LambdaPiLine) + +# -------------------- end of makeXiminusControl ------------ +# ------------------------------------------------------------------------------------------ + + def makeOmegaminus(self): + ''' Make an Omega minus candidate ''' + Omegaminus2LambdaPiLLL = self.createCombinationSel(OutputList="Omegaminus2LambdaPiLLL" + self.name, + DecayDescriptor="[Omega- -> Lambda0 pi-]cc", + DaughterLists=[ + self.GoodLongPionsList, self.LambdaListLL], + DaughterCuts={"pi-": "(PT> %(Bachelor_PT_MIN)s ) &" + " (BPVIPCHI2() > %(Bachelor_BPVIPCHI2_MIN)s )" % self.config}, + PreVertexCuts="(ADAMASS('Omega-') < %(OmegaMassWindow)s*MeV)" % self.config, + PostVertexCuts="(VFASPF(VCHI2/VDOF)< %(PostVertexChi2_MIN)s) &" + "(BPVLTIME() > %(Hyperon_BPVLTIME_MIN)s) & " + "(BPVVDZ>0) & " + "(CHILD(VFASPF(VZ),1)-VFASPF(VZ) > %(LambdaDeltaZ_MIN)s )" % self.config ) - - ''' Make a Xi0 candidate from downstream tracks''' - Xi02PPiDD = self.createCombinationSel(OutputList = "Xi02PPiDD"+ self.name, - DecayDescriptor = "[Xi0 -> p+ pi-]cc", - DaughterLists = [self.GoodDownstreamPionsList, self.GoodDownstreamProtonsList], - DaughterCuts = {"pi-" : "(PT> 2.5*%(Bachelor_PT_MIN)s ) &"\ - " (BPVIPCHI2() > %(XiDaughter_BPVIPCHI2_MIN)s )"% self.config, - "p+" : "(PT> %(Proton_PT_MIN)s ) & (P> %(Proton_P_MIN)s ) & (PROBNNp > %(ProtonProbNNp)s ) & "\ - " (BPVIPCHI2() > %(XiDaughter_BPVIPCHI2_MIN)s )"% self.config}, - PreVertexCuts = "(ADAMASS('Xi0') < 2*%(XiMassWindow)s*MeV)"% self.config, - PostVertexCuts = "(VFASPF(VCHI2/VDOF)< %(PostVertexChi2_MIN)s ) &"\ - "(BPVLTIME() > %(Hyperon_BPVLTIME_MIN)s ) & "\ - "(ADMASS('Xi0') < %(XiMassWindow)s*MeV) & "\ - "(BPVVDZ>0) "% self.config - - ) -## Xi02PPi is a "Selection" object; MergedSelection passes everything which gets to it -## even when the output list is empty - Xi02PPi = MergedSelection("Xi02PPi"+self.name, - RequiredSelections = [Xi02PPiDD,Xi02PPiLL] ) - -## NullFilter is a "FilterDesktop" object which is a type of "Algorithm" -## This one will pass all candidates - NullFilter= FilterDesktop(Code = "ALL") - -## this is *also* a Selection, but it is "more selective" -## than Xi02PPi in the sense that it passes only events when something -## is in the output list - Xi02PPiSelection = Selection( "Xi02PPiSelection"+self.name, - Algorithm = NullFilter, - RequiredSelections = [Xi02PPi]) - Xi02PPiLine = StrippingLine (self.name + "Xi02PPi", - algos = [Xi02PPiSelection]) - self.registerLine (Xi02PPiLine) - -## -------------------- end of makeXizero ------------ -#------------------------------------------------------------------------------------------ - - def makeOmegaminus( self ): - - ''' Make an Omega minus candidate ''' - Omegaminus2LambdaPiLLL = self.createCombinationSel(OutputList = "Omegaminus2LambdaPiLLL"+ self.name, - DecayDescriptor = "[Omega- -> Lambda0 pi-]cc", - DaughterLists = [self.GoodLongPionsList, self.LambdaListLL], - DaughterCuts = {"pi-" : "(PT> %(Bachelor_PT_MIN)s ) &"\ - " (BPVIPCHI2() > %(Bachelor_BPVIPCHI2_MIN)s )"% self.config}, - PreVertexCuts = "(ADAMASS('Omega-') < %(OmegaMassWindow)s*MeV)"% self.config, - PostVertexCuts = "(VFASPF(VCHI2/VDOF)< %(PostVertexChi2_MIN)s) &"\ - "(BPVLTIME() > %(Hyperon_BPVLTIME_MIN)s) & "\ - "(BPVVDZ>0) & "\ - "(CHILD(VFASPF(VZ),1)-VFASPF(VZ) > %(LambdaDeltaZ_MIN)s )"% self.config + ''' Make an Omega minus candidate ''' + Omegaminus2LambdaPiDDL = self.createCombinationSel(OutputList="Omegaminus2LambdaPiDDL" + self.name, + DecayDescriptor="[Omega- -> Lambda0 pi-]cc", + DaughterLists=[ + self.GoodLongPionsList, self.LambdaListDD], + DaughterCuts={"pi-": "(PT> %(Bachelor_PT_MIN)s ) &" + " (BPVIPCHI2() > %(Bachelor_BPVIPCHI2_MIN)s )" % self.config}, + PreVertexCuts="(ADAMASS('Omega-') < %(OmegaMassWindow)s*MeV)" % self.config, + PostVertexCuts="(VFASPF(VCHI2/VDOF)< %(PostVertexChi2_MIN)s) &" + "(BPVLTIME() > %(Hyperon_BPVLTIME_MIN)s) & " + "(BPVVDZ>0) & " + "(CHILD(VFASPF(VZ),1)-VFASPF(VZ) > %(LambdaDeltaZ_MIN)s )" % self.config ) - - ''' Make an Omega minus candidate ''' - Omegaminus2LambdaPiDDL = self.createCombinationSel(OutputList = "Omegaminus2LambdaPiDDL"+ self.name, - DecayDescriptor = "[Omega- -> Lambda0 pi-]cc", - DaughterLists = [self.GoodLongPionsList, self.LambdaListDD], - DaughterCuts = {"pi-" : "(PT> %(Bachelor_PT_MIN)s ) &"\ - " (BPVIPCHI2() > %(Bachelor_BPVIPCHI2_MIN)s )"% self.config}, - PreVertexCuts = "(ADAMASS('Omega-') < %(OmegaMassWindow)s*MeV)"% self.config, - PostVertexCuts = "(VFASPF(VCHI2/VDOF)< %(PostVertexChi2_MIN)s) &"\ - "(BPVLTIME() > %(Hyperon_BPVLTIME_MIN)s) & "\ - "(BPVVDZ>0) & "\ - "(CHILD(VFASPF(VZ),1)-VFASPF(VZ) > %(LambdaDeltaZ_MIN)s )"% self.config - ) - - ''' Make an Omega minus candidate ''' - Omegaminus2LambdaPiDDD = self.createCombinationSel(OutputList = "Omegaminus2LambdaPiDDD"+ self.name, - DecayDescriptor = "[Omega- -> Lambda0 pi-]cc", - DaughterLists = [self.GoodDownstreamPionsList, self.LambdaListDD], - DaughterCuts = {"pi-" : "(PT> %(Bachelor_PT_MIN)s ) &"\ - " (BPVIPCHI2() > %(Bachelor_BPVIPCHI2_MIN)s )"% self.config}, - PreVertexCuts = "(ADAMASS('Omega-') < %(OmegaMassWindow)s*MeV)"% self.config, - PostVertexCuts = "(VFASPF(VCHI2/VDOF)< %(PostVertexChi2_MIN)s) &"\ - "(BPVLTIME() > %(Hyperon_BPVLTIME_MIN)s) & "\ - "(BPVVDZ>0) & "\ - "(CHILD(VFASPF(VZ),1)-VFASPF(VZ) > %(LambdaDeltaZ_MIN)s )"% self.config - ) - - -## Omegaminus2LambdaPi is a "Selection" object; MergedSelection passes everything which gets to it -## even when the output list is empty - - - Omegaminus2LambdaPi = MergedSelection("Omegaminus2LambdaPi"+self.name, - #RequiredSelections = [Omegaminus2LambdaPiLLL,Omegaminus2LambdaPiDDL,Omegaminus2LambdaPiDDD] ) - RequiredSelections = [Omegaminus2LambdaPiDDL,Omegaminus2LambdaPiDDD,Omegaminus2LambdaPiLLL] ) -## NullFilter is a "FilterDesktop" object which is a type of "Algorithm" -## This one will pass all candidates - NullFilter= FilterDesktop(Code = "ALL") - -## this is *also* a Selection, but it is "more selective" -## than Omegaminus2LambdaPi in the sense that it passes only events when something -## is in the output list - Omegaminus2LambdaPiSelection = Selection( "Omegaminus2LambdaPiSelection"+self.name, - Algorithm = NullFilter, - RequiredSelections = [Omegaminus2LambdaPi]) - Omegaminus2LambdaPiLine = StrippingLine (self.name + "Omegaminus2LambdaPi", - algos = [Omegaminus2LambdaPiSelection]) - self.registerLine (Omegaminus2LambdaPiLine) - -## -------------------- end of makeOmegaminus ------------ -#------------------------------------------------------------------------------------------ - - def makeXiminus( self ): - - ''' Make a Xi minus candidate from long tracks ''' - Xim2PPiPiLLL = self.createCombinationSel(OutputList = "Xim2PPiPiLLL"+ self.name, - DecayDescriptor = "[Xi- -> p+ pi- pi-]cc", - DaughterLists = [self.GoodLongPionsList, self.GoodLongProtonsList], - DaughterCuts = {"pi-" : "(PT> 1.5*%(Bachelor_PT_MIN)s ) &"\ - " (BPVIPCHI2() > %(LooseDaughter_BPVIPCHI2_MIN)s )"% self.config, - "p+" : "(PT> %(Proton_PT_MIN)s ) & (P> %(Proton_P_MIN)s ) & (PROBNNp > %(ProtonProbNNp)s) & "\ - " (BPVIPCHI2() > %(LooseDaughter_BPVIPCHI2_MIN)s )"% self.config}, - PreVertexCuts = "(ADAMASS('Xi-') < 2*%(XiMassWindow)s*MeV)"% self.config, - PostVertexCuts = "(VFASPF(VCHI2/VDOF)<%(PostVertexChi2_MIN)s ) & "\ - " (BPVLTIME() > %(Hyperon_BPVLTIME_MIN)s) & "\ - "(ADMASS('Xi-') < %(XiMassWindow)s*MeV) & "\ - "(BPVVDZ>0) "% self.config + ''' Make an Omega minus candidate ''' + Omegaminus2LambdaPiDDD = self.createCombinationSel(OutputList="Omegaminus2LambdaPiDDD" + self.name, + DecayDescriptor="[Omega- -> Lambda0 pi-]cc", + DaughterLists=[ + self.GoodDownstreamPionsList, self.LambdaListDD], + DaughterCuts={"pi-": "(PT> %(Bachelor_PT_MIN)s ) &" + " (BPVIPCHI2() > %(Bachelor_BPVIPCHI2_MIN)s )" % self.config}, + PreVertexCuts="(ADAMASS('Omega-') < %(OmegaMassWindow)s*MeV)" % self.config, + PostVertexCuts="(VFASPF(VCHI2/VDOF)< %(PostVertexChi2_MIN)s) &" + "(BPVLTIME() > %(Hyperon_BPVLTIME_MIN)s) & " + "(BPVVDZ>0) & " + "(CHILD(VFASPF(VZ),1)-VFASPF(VZ) > %(LambdaDeltaZ_MIN)s )" % self.config ) - ''' Make a Xi minus candidate from downstream tracks''' - Xim2PPiPiDDD = self.createCombinationSel(OutputList = "Xim2PPiPiDDD"+ self.name, - DecayDescriptor = "[Xi- -> p+ pi- pi-]cc", - DaughterLists = [self.GoodDownstreamPionsList, self.GoodDownstreamProtonsList], - DaughterCuts = {"pi-" : "(PT> 2.5*%(Bachelor_PT_MIN)s ) &"\ - " (BPVIPCHI2() > %(LooseDaughter_BPVIPCHI2_MIN)s )"% self.config, - "p+" : "(PT> %(Proton_PT_MIN)s ) & (P> %(Proton_P_MIN)s ) & (PROBNNp > %(ProtonProbNNp)s ) & "\ - " (BPVIPCHI2() > %(LooseDaughter_BPVIPCHI2_MIN)s )"% self.config}, - PreVertexCuts = "(ADAMASS('Xi-') < 2*%(XiMassWindow)s*MeV)"% self.config, - PostVertexCuts = "(VFASPF(VCHI2/VDOF)< %(PostVertexChi2_MIN)s ) &"\ - "(BPVLTIME() > %(Hyperon_BPVLTIME_MIN)s ) & "\ - "(ADMASS('Xi-') < %(XiMassWindow)s*MeV) & "\ - "(BPVVDZ>0) "% self.config - - ) -## Xim2PPiPi is a "Selection" object; MergedSelection passes everything which gets to it -## even when the output list is empty - Xim2PPiPi = MergedSelection("Xim2PPiPi"+self.name, - RequiredSelections = [Xim2PPiPiDDD,Xim2PPiPiLLL] ) - -## NullFilter is a "FilterDesktop" object which is a type of "Algorithm" -## This one will pass all candidates - NullFilter= FilterDesktop(Code = "ALL") - -## this is *also* a Selection, but it is "more selective" -## than Xim2PPiPi in the sense that it passes only events when something -## is in the output list - Xim2PPiPiSelection = Selection( "Xim2PPiPiSelection"+self.name, - Algorithm = NullFilter, - RequiredSelections = [Xim2PPiPi]) - Xim2PPiPiLine = StrippingLine (self.name + "Xim2PPiPi", - algos = [Xim2PPiPiSelection]) - self.registerLine (Xim2PPiPiLine) - -## -------------------- end of makeXiminus ------------ -#------------------------------------------------------------------------------------------ - - def makeOmegaS3( self ): - - ''' Make an Omega minus candidate from long tracks ''' - Om2PPiPiLLL = self.createCombinationSel(OutputList = "Om2PPiPiLLL"+ self.name, - DecayDescriptor = "[Omega- -> p+ pi- pi-]cc", - DaughterLists = [self.GoodLongPionsList, self.GoodLongProtonsList], - DaughterCuts = {"pi-" : "(PT> 1.5*%(Bachelor_PT_MIN)s ) &"\ - " (BPVIPCHI2() > %(LooseDaughter_BPVIPCHI2_MIN)s )"% self.config, - "p+" : "(PT> %(Proton_PT_MIN)s ) & (P> %(Proton_P_MIN)s ) & (PROBNNp > %(ProtonProbNNp)s) & "\ - " (BPVIPCHI2() > %(LooseDaughter_BPVIPCHI2_MIN)s )"% self.config}, - PreVertexCuts = "(ADAMASS('Omega-') < 2*%(OmegaMassWindow)s*MeV)"% self.config, - PostVertexCuts = "(VFASPF(VCHI2/VDOF)<%(PostVertexChi2_MIN)s ) & "\ - " (BPVLTIME() > %(Hyperon_BPVLTIME_MIN)s) & "\ - "(ADMASS('Omega-') < %(OmegaMassWindow)s*MeV) & "\ - "(BPVVDZ>0) "% self.config - ) - - - ''' Make an Omega minus candidate from downstream tracks''' - Om2PPiPiDDD = self.createCombinationSel(OutputList = "Om2PPiPiDDD"+ self.name, - DecayDescriptor = "[Omega- -> p+ pi- pi-]cc", - DaughterLists = [self.GoodDownstreamPionsList, self.GoodDownstreamProtonsList], - DaughterCuts = {"pi-" : "(PT> 2.5*%(Bachelor_PT_MIN)s ) &"\ - " (BPVIPCHI2() > %(LooseDaughter_BPVIPCHI2_MIN)s )"% self.config, - "p+" : "(PT> %(Proton_PT_MIN)s ) & (P> %(Proton_P_MIN)s ) & (PROBNNp > %(ProtonProbNNp)s ) & "\ - " (BPVIPCHI2() > %(LooseDaughter_BPVIPCHI2_MIN)s )"% self.config}, - PreVertexCuts = "(ADAMASS('Omega-') < 2*%(OmegaMassWindow)s*MeV)"% self.config, - PostVertexCuts = "(VFASPF(VCHI2/VDOF)< %(PostVertexChi2_MIN)s ) &"\ - "(BPVLTIME() > %(Hyperon_BPVLTIME_MIN)s ) & "\ - "(ADMASS('Omega-') < %(OmegaMassWindow)s*MeV) & "\ - "(BPVVDZ>0) "% self.config - - ) -## Om2PPiPi is a "Selection" object; MergedSelection passes everything which gets to it -## even when the output list is empty - Om2PPiPi = MergedSelection("Om2PPiPi"+self.name, - RequiredSelections = [Om2PPiPiDDD,Om2PPiPiLLL] ) - -## NullFilter is a "FilterDesktop" object which is a type of "Algorithm" -## This one will pass all candidates - NullFilter= FilterDesktop(Code = "ALL") - -## Ximinus2Lambda2PiSelection is *also* a Selection, but it is "more selective" -## than Om2PPiPi in the sense that it passes only events when something -## is in the output list - Om2PPiPiSelection = Selection( "Om2PPiPiSelection"+self.name, - Algorithm = NullFilter, - RequiredSelections = [Om2PPiPi]) - Om2PPiPiLine = StrippingLine (self.name + "Om2PPiPi", - algos = [Om2PPiPiSelection]) - self.registerLine (Om2PPiPiLine) - -## -------------------- end of makeOmegaS3 ------------ -#------------------------------------------------------------------------------------------ - -#------------------------------------------------------------------------------------------ - - def makeXizeroS3( self ): - - ''' Make a Xi0 candidate from long tracks ''' - Xi02PKLL = self.createCombinationSel(OutputList = "Xi02PKLL"+ self.name, - DecayDescriptor = "[Xi0 -> p+ K-]cc", - DaughterLists = [self.GoodLongKaonsList, self.GoodLongProtonsList], - DaughterCuts = {"K-" : "(PT> %(Bachelor_PT_MIN)s ) & (PIDK > %(KaonPIDK)s ) & "\ - " (BPVIPCHI2() > %(LooseDaughter_BPVIPCHI2_MIN)s )"% self.config, - "p+" : "(PT> %(Proton_PT_MIN)s ) & (P> %(Proton_P_MIN)s ) & (PROBNNp > %(ProtonProbNNp)s) & "\ - " (BPVIPCHI2() > %(LooseDaughter_BPVIPCHI2_MIN)s )"% self.config}, - PreVertexCuts = "(ADAMASS('Xi0') < 2*%(OmegaMassWindow)s*MeV)"% self.config, - PostVertexCuts = "(VFASPF(VCHI2/VDOF)<%(PostVertexChi2_MIN)s ) & "\ - " (BPVLTIME() > %(Hyperon_BPVLTIME_MIN)s) & "\ - "(ADMASS('Xi0') < 1.5*%(OmegaMassWindow)s*MeV) & "\ - "(BPVVDZ>0) "% self.config - ) - +# Omegaminus2LambdaPi is a "Selection" object; MergedSelection passes everything which gets to it +# even when the output list is empty + + Omegaminus2LambdaPi = MergedSelection("Omegaminus2LambdaPi"+self.name, + # RequiredSelections = [Omegaminus2LambdaPiLLL,Omegaminus2LambdaPiDDL,Omegaminus2LambdaPiDDD] ) + RequiredSelections=[Omegaminus2LambdaPiDDL, Omegaminus2LambdaPiDDD, Omegaminus2LambdaPiLLL]) +# NullFilter is a "FilterDesktop" object which is a type of "Algorithm" +# This one will pass all candidates + NullFilter = FilterDesktop(Code="ALL") + +# this is *also* a Selection, but it is "more selective" +# than Omegaminus2LambdaPi in the sense that it passes only events when something +# is in the output list + Omegaminus2LambdaPiSelection = Selection("Omegaminus2LambdaPiSelection"+self.name, + Algorithm=NullFilter, + RequiredSelections=[Omegaminus2LambdaPi]) + Omegaminus2LambdaPiLine = StrippingLine(self.name + "Omegaminus2LambdaPi", + algos=[Omegaminus2LambdaPiSelection]) + self.registerLine(Omegaminus2LambdaPiLine) + +# -------------------- end of makeOmegaminus ------------ +# ------------------------------------------------------------------------------------------ + + def makeXiminus(self): + ''' Make a Xi minus candidate from long tracks ''' + Xim2PPiPiLLL = self.createCombinationSel(OutputList="Xim2PPiPiLLL" + self.name, + DecayDescriptor="[Xi- -> p+ pi- pi-]cc", + DaughterLists=[ + self.GoodLongPionsList, self.GoodLongProtonsList], + DaughterCuts={"pi-": "(PT> 1.5*%(Bachelor_PT_MIN)s ) &" + " (BPVIPCHI2() > %(LooseDaughter_BPVIPCHI2_MIN)s )" % self.config, + "p+": "(PT> %(Proton_PT_MIN)s ) & (P> %(Proton_P_MIN)s ) & (PROBNNp > %(ProtonProbNNp)s) & " + " (BPVIPCHI2() > %(LooseDaughter_BPVIPCHI2_MIN)s )" % self.config}, + PreVertexCuts="(ADAMASS('Xi-') < 2*%(XiMassWindow)s*MeV)" % self.config, + PostVertexCuts="(VFASPF(VCHI2/VDOF)<%(PostVertexChi2_MIN)s ) & " + " (BPVLTIME() > %(Hyperon_BPVLTIME_MIN)s) & " + "(ADMASS('Xi-') < %(XiMassWindow)s*MeV) & " + "(BPVVDZ>0) " % self.config + ) + + ''' Make a Xi minus candidate from downstream tracks''' + Xim2PPiPiDDD = self.createCombinationSel(OutputList="Xim2PPiPiDDD" + self.name, + DecayDescriptor="[Xi- -> p+ pi- pi-]cc", + DaughterLists=[ + self.GoodDownstreamPionsList, self.GoodDownstreamProtonsList], + DaughterCuts={"pi-": "(PT> 2.5*%(Bachelor_PT_MIN)s ) &" + " (BPVIPCHI2() > %(LooseDaughter_BPVIPCHI2_MIN)s )" % self.config, + "p+": "(PT> %(Proton_PT_MIN)s ) & (P> %(Proton_P_MIN)s ) & (PROBNNp > %(ProtonProbNNp)s ) & " + " (BPVIPCHI2() > %(LooseDaughter_BPVIPCHI2_MIN)s )" % self.config}, + PreVertexCuts="(ADAMASS('Xi-') < 2*%(XiMassWindow)s*MeV)" % self.config, + PostVertexCuts="(VFASPF(VCHI2/VDOF)< %(PostVertexChi2_MIN)s ) &" + "(BPVLTIME() > %(Hyperon_BPVLTIME_MIN)s ) & " + "(ADMASS('Xi-') < %(XiMassWindow)s*MeV) & " + "(BPVVDZ>0) " % self.config + + ) +# Xim2PPiPi is a "Selection" object; MergedSelection passes everything which gets to it +# even when the output list is empty + Xim2PPiPi = MergedSelection("Xim2PPiPi"+self.name, + RequiredSelections=[Xim2PPiPiDDD, Xim2PPiPiLLL]) + +# NullFilter is a "FilterDesktop" object which is a type of "Algorithm" +# This one will pass all candidates + NullFilter = FilterDesktop(Code="ALL") + +# this is *also* a Selection, but it is "more selective" +# than Xim2PPiPi in the sense that it passes only events when something +# is in the output list + Xim2PPiPiSelection = Selection("Xim2PPiPiSelection"+self.name, + Algorithm=NullFilter, + RequiredSelections=[Xim2PPiPi]) + Xim2PPiPiLine = StrippingLine(self.name + "Xim2PPiPi", + algos=[Xim2PPiPiSelection]) + self.registerLine(Xim2PPiPiLine) + +# -------------------- end of makeXiminus ------------ +# ------------------------------------------------------------------------------------------ + + def makeOmegaS3(self): + ''' Make an Omega minus candidate from long tracks ''' + Om2PPiPiLLL = self.createCombinationSel(OutputList="Om2PPiPiLLL" + self.name, + DecayDescriptor="[Omega- -> p+ pi- pi-]cc", + DaughterLists=[ + self.GoodLongPionsList, self.GoodLongProtonsList], + DaughterCuts={"pi-": "(PT> 1.5*%(Bachelor_PT_MIN)s ) &" + " (BPVIPCHI2() > %(LooseDaughter_BPVIPCHI2_MIN)s )" % self.config, + "p+": "(PT> %(Proton_PT_MIN)s ) & (P> %(Proton_P_MIN)s ) & (PROBNNp > %(ProtonProbNNp)s) & " + " (BPVIPCHI2() > %(LooseDaughter_BPVIPCHI2_MIN)s )" % self.config}, + PreVertexCuts="(ADAMASS('Omega-') < 2*%(OmegaMassWindow)s*MeV)" % self.config, + PostVertexCuts="(VFASPF(VCHI2/VDOF)<%(PostVertexChi2_MIN)s ) & " + " (BPVLTIME() > %(Hyperon_BPVLTIME_MIN)s) & " + "(ADMASS('Omega-') < %(OmegaMassWindow)s*MeV) & " + "(BPVVDZ>0) " % self.config + ) - ''' Make a Xi0 candidate from downstream tracks''' - Xi02PKDD = self.createCombinationSel(OutputList = "Xi02PKDD"+ self.name, - DecayDescriptor = "[Xi0 -> p+ K-]cc", - DaughterLists = [self.GoodDownstreamKaonsList, self.GoodDownstreamProtonsList], - DaughterCuts = {"K-" : "(PT> %(Bachelor_PT_MIN)s ) & (PIDK > %(KaonPIDK)s ) & "\ - " (BPVIPCHI2() > %(LooseDaughter_BPVIPCHI2_MIN)s )"% self.config, - "p+" : "(PT> %(Proton_PT_MIN)s ) & (P> %(Proton_P_MIN)s ) & (PROBNNp > %(ProtonProbNNp)s ) & "\ - " (BPVIPCHI2() > %(LooseDaughter_BPVIPCHI2_MIN)s )"% self.config}, - PreVertexCuts = "(ADAMASS('Xi0') < 3*%(OmegaMassWindow)s*MeV)"% self.config, - PostVertexCuts = "(VFASPF(VCHI2/VDOF)< %(PostVertexChi2_MIN)s ) &"\ - "(BPVLTIME() > %(Hyperon_BPVLTIME_MIN)s ) & "\ - "(ADMASS('Xi0') < 1.5*%(OmegaMassWindow)s*MeV) & "\ - "(BPVVDZ>0) "% self.config + ''' Make an Omega minus candidate from downstream tracks''' + Om2PPiPiDDD = self.createCombinationSel(OutputList="Om2PPiPiDDD" + self.name, + DecayDescriptor="[Omega- -> p+ pi- pi-]cc", + DaughterLists=[ + self.GoodDownstreamPionsList, self.GoodDownstreamProtonsList], + DaughterCuts={"pi-": "(PT> 2.5*%(Bachelor_PT_MIN)s ) &" + " (BPVIPCHI2() > %(LooseDaughter_BPVIPCHI2_MIN)s )" % self.config, + "p+": "(PT> %(Proton_PT_MIN)s ) & (P> %(Proton_P_MIN)s ) & (PROBNNp > %(ProtonProbNNp)s ) & " + " (BPVIPCHI2() > %(LooseDaughter_BPVIPCHI2_MIN)s )" % self.config}, + PreVertexCuts="(ADAMASS('Omega-') < 2*%(OmegaMassWindow)s*MeV)" % self.config, + PostVertexCuts="(VFASPF(VCHI2/VDOF)< %(PostVertexChi2_MIN)s ) &" + "(BPVLTIME() > %(Hyperon_BPVLTIME_MIN)s ) & " + "(ADMASS('Omega-') < %(OmegaMassWindow)s*MeV) & " + "(BPVVDZ>0) " % self.config - ) -## Xi02PK is a "Selection" object; MergedSelection passes everything which gets to it -## even when the output list is empty - Xi02PK = MergedSelection("Xi02PK"+self.name, - RequiredSelections = [Xi02PKDD,Xi02PKLL] ) - -## NullFilter is a "FilterDesktop" object which is a type of "Algorithm" -## This one will pass all candidates - NullFilter= FilterDesktop(Code = "ALL") - -## this is *also* a Selection, but it is "more selective" -## than Xi02PK in the sense that it passes only events when something -## is in the output list - Xi02PKSelection = Selection( "Xi02PKSelection"+self.name, - Algorithm = NullFilter, - RequiredSelections = [Xi02PK]) - Xi02PKLine = StrippingLine (self.name + "Xi02PK", - algos = [Xi02PKSelection]) - self.registerLine (Xi02PKLine) - -## -------------------- end of makeXizeroS3 ------------ -#------------------------------------------------------------------------------------------ + ) +# Om2PPiPi is a "Selection" object; MergedSelection passes everything which gets to it +# even when the output list is empty + Om2PPiPi = MergedSelection("Om2PPiPi"+self.name, + RequiredSelections=[Om2PPiPiDDD, Om2PPiPiLLL]) + +# NullFilter is a "FilterDesktop" object which is a type of "Algorithm" +# This one will pass all candidates + NullFilter = FilterDesktop(Code="ALL") + +# Ximinus2Lambda2PiSelection is *also* a Selection, but it is "more selective" +# than Om2PPiPi in the sense that it passes only events when something +# is in the output list + Om2PPiPiSelection = Selection("Om2PPiPiSelection"+self.name, + Algorithm=NullFilter, + RequiredSelections=[Om2PPiPi]) + Om2PPiPiLine = StrippingLine(self.name + "Om2PPiPi", + algos=[Om2PPiPiSelection]) + self.registerLine(Om2PPiPiLine) + +# -------------------- end of makeOmegaS3 ------------