def makeLb2V0DDhh(self, name, config): """ Create and store a Lb -> KS(DD) p+ h- Selection object. Arguments: name : name of the Selection. config : config dictionary """ _massCutLow = "(AM>(5620-%s)*MeV)" % config['Lb_Mlow'] _massCutHigh = "(AM<(5620+%s)*MeV)" % config['Lb_Mhigh'] _aptCut = "(APT>%s*MeV)" % config['Lb_APTmin'] _daugMedPtCut = "(ANUM(PT>%s*MeV)>=2)" % config['LbDaug_MedPT_PT'] _daugMaxPtIPCut = "(AVAL_MAX(MIPDV(PRIMARY),PT)>%s)" % config[ 'LbDaug_MaxPT_IP'] _maxDocaChi2Cut = "(ACUTDOCACHI2(%s,''))" % config[ 'LbDaug_DD_maxDocaChi2'] _daugPtSumCut = "((APT1+APT2+APT3)>%s*MeV)" % config['LbDaug_DD_PTsum'] _combCuts = _aptCut + '&' + _daugPtSumCut + '&' + _daugMedPtCut + '&' + _massCutLow + '&' + _massCutHigh + '&' + _daugMaxPtIPCut + '&' + _maxDocaChi2Cut _ptCut = "(PT>%s*MeV)" % config['Lb_PTmin'] _vtxChi2Cut = "(VFASPF(VCHI2)<%s)" % config['Lb_VtxChi2'] _diraCut = "(BPVDIRA>%s)" % config['Lb_Dira'] _ipChi2Cut = "(MIPCHI2DV(PRIMARY)<%s)" % config['Lb_DD_IPCHI2wrtPV'] _fdCut = "(VFASPF(VMINVDDV(PRIMARY))>%s)" % config['Lb_FDwrtPV'] _fdChi2Cut = "(BPVVDCHI2>%s)" % config['Lb_DD_FDChi2'] _motherCuts = _ptCut + '&' + _vtxChi2Cut + '&' + _diraCut + '&' + _ipChi2Cut + '&' + _fdCut + '&' + _fdChi2Cut _Lb = CombineParticles() _Lb.DecayDescriptors = [ "Lambda_b0 -> p+ pi- KS0", "Lambda_b~0 -> p~- pi+ KS0", \ "Lambda_b0 -> p+ K- KS0", "Lambda_b~0 -> p~- K+ KS0"] _Lb.DaughtersCuts = { "K+": "TRCHI2DOF<%s" % config['Trk_Chi2'], "pi+": "TRCHI2DOF<%s" % config['Trk_Chi2'], "p+": "TRCHI2DOF<%s" % config['Trk_Chi2'] } _Lb.CombinationCut = _combCuts _Lb.MotherCut = _motherCuts self.selLb2V0DDhh = Selection( name, Algorithm=_Lb, RequiredSelections=[self.selKS2DD, self.hadrons])
def makeB2KSLLhh(self, name, config): """ Create and store a B -> KS(LL) h+ h- Selection object. Arguments: name : name of the Selection. config : config dictionary """ _massCutLow = "(AM>(5279-%s)*MeV)" % config['B_Mlow'] _massCutHigh = "(AM<(5279+%s)*MeV)" % config['B_Mhigh'] _aptCut = "(APT>%s*MeV)" % config['B_APTmin'] _daugMedPtCut = "(ANUM(PT>%s*MeV)>=2)" % config['BDaug_MedPT_PT'] _daugMaxPtIPCut = "(AVAL_MAX(MIPDV(PRIMARY),PT)>%s)" % config[ 'BDaug_MaxPT_IP'] _maxDocaChi2Cut = "(ACUTDOCACHI2(%s,''))" % config[ 'BDaug_LL_maxDocaChi2'] _daugPtSumCut = "((APT1+APT2+APT3)>%s*MeV)" % config['BDaug_LL_PTsum'] _combCuts = _aptCut + '&' + _daugPtSumCut + '&' + _daugMedPtCut + '&' + _massCutLow + '&' + _massCutHigh + '&' + _daugMaxPtIPCut + '&' + _maxDocaChi2Cut _ptCut = "(PT>%s*MeV)" % config['B_PTmin'] _vtxChi2Cut = "(VFASPF(VCHI2)<%s)" % config['B_VtxChi2'] _diraCut = "(BPVDIRA>%s)" % config['B_Dira'] _ipChi2Cut = "(MIPCHI2DV(PRIMARY)<%s)" % config['B_LL_IPCHI2wrtPV'] _fdCut = "(VFASPF(VMINVDDV(PRIMARY))>%s)" % config['B_FDwrtPV'] _fdChi2Cut = "(BPVVDCHI2>%s)" % config['B_LL_FDChi2'] _motherCuts = _ptCut + '&' + _vtxChi2Cut + '&' + _diraCut + '&' + _ipChi2Cut + '&' + _fdCut + '&' + _fdChi2Cut _B = CombineParticles() _B.DecayDescriptors = [ "B0 -> pi+ pi- KS0", \ "B0 -> K+ pi- KS0", "B0 -> pi+ K- KS0", \ "B0 -> K+ K- KS0" ] _B.DaughtersCuts = { "K+": "TRCHI2DOF<%s" % config['Trk_Chi2'], "pi+": "TRCHI2DOF<%s" % config['Trk_Chi2'] } _B.CombinationCut = _combCuts _B.MotherCut = _motherCuts self.selB2KSLLhh = Selection( name, Algorithm=_B, RequiredSelections=[self.selKS2LL, self.hadrons])
def makeD2hhh(moduleName, config): __configuration_keys__ = ("DauChi2Max", "DauPtMin", "DauPMin", "DauMIPChi2Min", "PtMin", "CombDMass", "DMass", "VtxChi2Max", "VDChi2Min", "MaxDauMIPChi2", "DIRAMin", "DOCAMax", "IPChi2Min") checkConfig(__configuration_keys__, config) StdPi = StdNoPIDsPions StdK = StdNoPIDsKaons Daughtercut = "((TRCHI2DOF<%(DauChi2Max)s) & " \ "(PT > %(DauPtMin)s*MeV) & (P > %(DauPMin)s*MeV) & " \ "(MIPCHI2DV(PRIMARY) > %(DauMIPChi2Min)s))" % config D2Kpipi = CombineParticles() D2Kpipi.DecayDescriptors = ["[D+ -> K- pi+ pi+]cc"] D2Kpipi.DaughtersCuts = {"pi+": Daughtercut, "K+": Daughtercut} D2Kpipi.CombinationCut = \ "((ADAMASS('D+') < %(CombDMass)s*MeV) | (ADAMASS('D_s+') < %(CombDMass)s*MeV)) & " \ "(APT>%(PtMin)s*MeV) & " \ "(AMAXDOCA('LoKi::TrgDistanceCalculator') < %(DOCAMax)s) & " \ "AHASCHILD(((ABSID == 'K+') | (ABSID == 'pi+')) & (MIPCHI2DV(PRIMARY) > %(MaxDauMIPChi2)s))" \ % config D2Kpipi.MotherCut = "((ADMASS('D+') < %(DMass)s*MeV) | (ADMASS('D_s+') < %(DMass)s*MeV))" \ "& (VFASPF(VCHI2/VDOF)<%(VtxChi2Max)s) & (BPVVDCHI2 > %(VDChi2Min)s) & (BPVDIRA > %(DIRAMin)s) & (BPVIPCHI2() > %(IPChi2Min)s)" % config D2KpipiSel = Selection("D2KpipiFor" + moduleName, Algorithm=D2Kpipi, RequiredSelections=[StdPi, StdK]) D2KKpi = copy(D2Kpipi) D2KKpi.DecayDescriptors = ["[D+ -> K- K+ pi+]cc"] D2KKpiSel = Selection("D2KKpiFor" + moduleName, Algorithm=D2KKpi, RequiredSelections=[StdPi, StdK]) DSel = MergedSelection("D2hhhFor" + moduleName, RequiredSelections=[D2KpipiSel, D2KKpiSel]) return DSel
def _makeMultibody(self, name, decay_descriptor, combcut, masscut): """ K0s2mumu selection object with muon Id and wide mass window starts from Phys/StdLooseMuons Please contact Diego Martinez Santos if you think of prescaling this line! Arguments: name : name of the Selection. """ daughters = [] if "mu" in decay_descriptor: daughters += [self.SelMuons] if "pi" in decay_descriptor: daughters += [self.SelPions] if "e+" or "e-" in decay_descriptor: daughters += [self.SelElectrons] if "K*(892)0" in decay_descriptor: if not "SelEMu" in dir(self): self.SelEMu = self._makePseudoKstar("SelEMuFor" + self._name) daughters += [self.SelEMu] if "phi(1020)" in decay_descriptor: if not "SelDiElectrons" in dir(self): self.SelDiElectrons = self._makePseudoPhi("SelDiElectronsFor" + self._name) daughters += [self.SelDiElectrons] if "J/psi(1S)" in decay_descriptor: if not "SelDiMuons" in dir(self): self.SelDiMuons = self._makePseudoJpsi("SelDiMuonsFor" + self._name) daughters += [self.SelDiMuons] if "KS0" in decay_descriptor: lifecut = "%(KSlife)s" % self.config elif "Lambda0" in decay_descriptor: lifecut = "%(L0life)s" % self.config Multibody = CombineParticles(DecayDescriptor=decay_descriptor) Multibody.CombinationCut = combcut #+ "& (AMAXDOCA('')<%(DiDOCA)s*mm)"% self.config Multibody.MotherCut = "(" + masscut + "& (BPVDIRA>0) & ((BPVVDSIGN*M/P) >" + lifecut + ") & (MIPCHI2DV(PRIMARY)< %(MultibodyIPChi2)s) & (VFASPF(VCHI2/VDOF)<%(MultibodyChi2dof)s))" % self.config return Selection(name, Algorithm=Multibody, RequiredSelections=daughters)
def __Selection_CreateDiMuon__(self, lName, DiMuonCuts, MuonCuts, IsMuonFlag): ''' Create a new dimuon from scratch ''' from GaudiConfUtils.ConfigurableGenerators import CombineParticles CombineDiMuon = CombineParticles() CombineDiMuon.DecayDescriptor = "J/psi(1S) -> mu- mu+" CombineDiMuon.DaughtersCuts = {"mu+": MuonCuts, "mu-": MuonCuts} CombineDiMuon.MotherCut = DiMuonCuts from StandardParticles import StdLooseMuons, StdVeryLooseMuons Muons = StdLooseMuons if IsMuonFlag else StdVeryLooseMuons from PhysSelPython.Wrappers import Selection SelDiMuon = Selection("Sel_" + lName + "_DiMuon", Algorithm=CombineDiMuon, RequiredSelections=[Muons]) return SelDiMuon
def _bhad2PMuX_fakemu_Lb(self): from GaudiConfUtils.ConfigurableGenerators import CombineParticles from PhysSelPython.Wrappers import Selection _pMu = CombineParticles(DecayDescriptors=self._config["DECAYS"], ReFitPVs=True) _pMu.Preambulo = self._Definitions() _pMu.CombinationCut = "(AM>%(pMuMassLower)s*MeV)" % self._config _pMu.MotherCut = self._LbMotherSelection() % self._config _pMu.ReFitPVs = True _pMuSel = Selection( "pMu_fakemu_Lb_for" + self._name, Algorithm=_pMu, RequiredSelections=[self._fakemuonFilter(), self._daughters()]) _LbSel = tosSelection(_pMuSel, {'Hlt2.*Topo2Body.*Decision%TOS': 0}) return _LbSel
def __Selection_CreateDiMuonSS__(self, lName, DiMuonCuts, MuonCuts, IsMuonFlag): ''' Clone the StdVeryLooseDiMuon to build same sign candidates ''' from GaudiConfUtils.ConfigurableGenerators import CombineParticles CombineDiMuonSS = CombineParticles() CombineDiMuonSS.DecayDescriptor = "[J/psi(1S) -> mu+ mu+]cc" CombineDiMuonSS.DaughtersCuts = {"mu+": MuonCuts, "mu-": MuonCuts} CombineDiMuonSS.MotherCut = DiMuonCuts from StandardParticles import StdLooseMuons, StdVeryLooseMuons Muons = StdLooseMuons if IsMuonFlag else StdVeryLooseMuons from PhysSelPython.Wrappers import Selection SelDiMuonSS = Selection("Sel_" + lName + "_DiMuonSS", Algorithm=CombineDiMuonSS, RequiredSelections=[Muons]) return SelDiMuonSS
def __Bs__(self, Dimuon, daughters, conf): """ Make and return a Bs selection """ _b2xmumu = CombineParticles() _b2xmumu.DecayDescriptors = conf['DECAYS'] _b2xmumu.CombinationCut = self.BdCombCut _b2xmumu.MotherCut = self.BdCut _sel_Daughters = MergedSelection("Selection_" + self.name + "_daughters", RequiredSelections=daughters) sel = Selection("Selection_" + self.name + "_B2XMuMu", Algorithm=_b2xmumu, RequiredSelections=[Dimuon, _sel_Daughters]) return sel
def __Trimu__(self, conf): ''' Create trimuon ''' from GaudiConfUtils.ConfigurableGenerators import CombineParticles CombineTriMuon = CombineParticles() CombineTriMuon.DecayDescriptors = [ "[B+ -> mu+ mu+ mu-]cc", "[B+ -> mu+ mu+ mu+]cc" ] sel_name = "TriMu" #CombineTriMuon.CombinationCut = self.TriMuLowQ2CombCut CombineTriMuon.MotherCut = self.TriMuCut + "&" + self.TriMuCut # choose from PhysSelPython.Wrappers import Selection SelTriMuon = Selection("Sel_" + self.name + "_" + sel_name, Algorithm=CombineTriMuon, RequiredSelections=[self.Muons]) return SelTriMuon
def __K10__(self,Kshort,Pions,conf): """ K_1 0 -> Ks pi+ pi- """ _k102kspipi = CombineParticles() _k102kspipi.DecayDescriptors = [ "K_1(1270)0 -> KS0 pi+ pi-" ] _k102kspipi.CombinationCut = self.__A1CombCut__(conf) _k102kspipi.MotherCut = self.__A1Cut__(conf) _sel_k10 = Selection( "Selection_"+self.name+"_k10", Algorithm=_k102kspipi, RequiredSelections=[Kshort,Pions] ) pick = Selection(self.name+"_K10_PickDecay", Algorithm = FilterDesktop( Code = "(DECTREE('K_1(1270)0 -> KS0 pi+ pi-'))" ), RequiredSelections = [_sel_k10]) return pick
def __CreateSelectionX3872__(self, lName, CombCut, MotherCut, InputSelections): ''' X3872 -> J/psi(1S) rho(770)0: note this can be used for the psi(2S) as well - just use different cuts! ''' from GaudiConfUtils.ConfigurableGenerators import CombineParticles CombineX3872 = CombineParticles() #CombineX3872.InputPrimaryVertices = self.__PVOutputLocation__ CombineX3872.DecayDescriptor = "X_1(3872) -> J/psi(1S) rho(770)0" CombineX3872.CombinationCut = CombCut CombineX3872.MotherCut = MotherCut from PhysSelPython.Wrappers import Selection SelX3872 = Selection("Sel_" + lName + "_X3872", Algorithm = CombineX3872, RequiredSelections = InputSelections) return SelX3872
def __HadronicB__(self, daughters, conf): """ Make and return a Bs selection """ _b2xmumu = CombineParticles() _b2xmumu.DecayDescriptors = conf['HADRONICDECAYS'] _b2xmumu.CombinationCut = self.BdCombCut _b2xmumu.MotherCut = self.BdCut + ' & ' + conf['Hadronic_Selection'] _sel_Daughters = MergedSelection("Selection_" + self.name + "_Hadronic_daughters", RequiredSelections=daughters) sel = Selection("Selection_" + self.name + "_Hadronic_B2XMuMu", Algorithm=_b2xmumu, RequiredSelections=[_sel_Daughters]) return sel
def __CreateSelectionBu__(self, lName, CombCut, MotherCut, InputSelections): ''' B+ -> K+ X3872 Selection ''' from GaudiConfUtils.ConfigurableGenerators import CombineParticles CombineBu = CombineParticles() #CombineBu.InputPrimaryVertices = self.__PVOutputLocation__ CombineBu.DecayDescriptors = ["B+ -> X_1(3872) K+", "B- -> X_1(3872) K-"] CombineBu.CombinationCut = CombCut CombineBu.MotherCut = MotherCut from PhysSelPython.Wrappers import Selection SelBu = Selection("Sel_" + lName + "_Bu", Algorithm = CombineBu, RequiredSelections = InputSelections) return SelBu
def makeB(name, decays, inputs, config): comboCuts = LoKiCuts(['AM', 'SUMPT'], config).code() momCuts = LoKiCuts( ['HASVERTEX', 'PT', 'VCHI2DOF', 'BPVLTIME', 'BPVIPCHI2'], config).code() cuts = '(BPVDIRA > 0) & ' cuts += '(NINGENERATION(ISBASIC & (MIPCHI2DV(PRIMARY) < %s),1)==0)' \ % config['HAD_MINIPCHI2_MIN'] momCuts = LoKiCuts.combine([cuts, momCuts]) momCuts += ' & (MM > %s) & (MM < %s)' % (config['AM_MIN'], config['AM_MAX']) alg = CombineParticles(DecayDescriptors=decays) alg.ReFitPVs = True alg.CombinationCut = comboCuts alg.MotherCut = momCuts #print 'makeB:',name,comboCuts,momCuts,decays return Selection(name + "DarkBosonSel", Algorithm=alg, RequiredSelections=inputs)
def __Rho__(self, Pions, conf): """ Make a rho """ wsCombinations = conf['HadronWS'] _rho2pipi = CombineParticles() if wsCombinations == True: _rho2pipi.DecayDescriptors = [ "rho(770)0 -> pi+ pi-", "rho(770)0 -> pi+ pi+", "rho(770)0 -> pi- pi-" ] else: _rho2pipi.DecayDescriptors = ["rho(770)0 -> pi+ pi-"] _rho2pipi.CombinationCut = self.KstarCombCut _rho2pipi.MotherCut = self.KstarCut _selRHO2PIPI = Selection("Selection_" + self.name + "_Rho", Algorithm=_rho2pipi, RequiredSelections=[Pions]) return _selRHO2PIPI
def __A1__(self, Pions, conf): """ Make A1 objects: a_1 - > pi pi pi """ # First make an a_1(1260)+ selection _a12pipipi = CombineParticles() _a12pipipi.DecayDescriptors = [ "[a_1(1260)+ -> pi+ pi+ pi-]cc" ] _a12pipipi.CombinationCut = self.__A1CombCut__(conf) _a12pipipi.MotherCut = self.__A1Cut__(conf) _sel_a1 = Selection( "Selection_"+self.name+"_a1", Algorithm=_a12pipipi, RequiredSelections=[Pions] ) pick = Selection(self.name+"_A1_PickDecay", Algorithm = FilterDesktop( Code = "(DECTREE('a_1(1260)+ -> pi+ pi+ pi-')) | (DECTREE('a_1(1260)- -> pi+ pi- pi-'))" ), RequiredSelections = [_sel_a1]) return pick
def __Selection_CreateBdToKstarMuMu__(self, lName, InputSelections, CombCut, MotherCut): ''' Bd -> K* mu mu Selection ''' from GaudiConfUtils.ConfigurableGenerators import CombineParticles CombineBd = CombineParticles() CombineBd.DecayDescriptor = "[B0 -> K*(892)0 J/psi(1S)]cc" CombineBd.CombinationCut = CombCut CombineBd.MotherCut = MotherCut from PhysSelPython.Wrappers import Selection SelBd = Selection("Sel_" + lName + "_Bd", Algorithm=CombineBd, RequiredSelections=InputSelections) return SelBd
def __Selection_CreateBuToKMuMu__(self, lName, InputSelections, CombCut, MotherCut): ''' Bu -> K mu mu Selection ''' from GaudiConfUtils.ConfigurableGenerators import CombineParticles CombineBu = CombineParticles() CombineBu.DecayDescriptor = "[B+ -> K+ J/psi(1S)]cc" CombineBu.CombinationCut = CombCut CombineBu.MotherCut = MotherCut from PhysSelPython.Wrappers import Selection SelBu = Selection("Sel_" + lName + "_Bu", Algorithm=CombineBu, RequiredSelections=InputSelections) return SelBu
def makeKst2Kpi(name, KaonPT, KaonIPCHI2, PionPT, PionIPCHI2, PionPIDK, KstarPT, KaonPIDK, KstarVCHI2, KstarMassWin): """ Create and return a Kstar -> K+pi- Selection object. Starts from DataOnDemand 'Phys/StdVeryLooseKaons'. Arguments: name : name of the Selection. KaonPT : Minimum transverse momentum of K (MeV). KaonIPCHI2 : Minimum impact parameter chi2 of K. PionPT : Minimum transverse momentum of pi (MeV). PionIPCHI2 : Minimum impact parameter chi2 of pi. PionPIDK : Maximum PID_{K-pi} of pi. KstarPT : Minimum transverse momentum of Kstar (MeV). KaonPIDK : Minimum PID_{K-pi} of K. KstarVCHI2 : Maximum Kstar vertex chi2 per degree of freedom. KstarMassWin : Kstar invariant mass window around PDG mass value (MeV). """ _stdKaons = DataOnDemand(Location="Phys/StdLooseKaons/Particles") _stdPions = DataOnDemand(Location="Phys/StdLoosePions/Particles") _Kstar2Kpi = CombineParticles() _Kstar2Kpi.DecayDescriptor = "[K*(892)0 -> K+ pi-]cc" _Kstar2Kpi.DaughtersCuts = { "K+": "(PT > %(KaonPT)s *MeV) & (PIDK > %(KaonPIDK)s) & (MIPCHI2DV(PRIMARY)> %(KaonIPCHI2)s)" % locals(), "pi-": "(PT > %(PionPT)s *MeV) & (PIDK < %(PionPIDK)s) & (MIPCHI2DV(PRIMARY)> %(PionIPCHI2)s)" % locals() } _Kstar2Kpi.CombinationCut = "(ADAMASS('K*(892)0') < %(KstarMassWin)s *MeV)" % locals( ) _Kstar2Kpi.MotherCut = "(VFASPF(VCHI2/VDOF)< %(KstarVCHI2)s) & (PT > %(KstarPT)s *MeV)" % locals( ) return Selection(name, Algorithm=_Kstar2Kpi, RequiredSelections=[_stdKaons, _stdPions])
def makeBu2KstDDhh( self, name, config ) : """ Create and store either a B+ -> Kst(DD)+ h+ h- Selection object Arguments: name : name of the Selection. config : config dictionary """ _trkChi2Cut = "(TRCHI2DOF<%s)" % config['Trk_Long_Chi2'] _trkGhostProbCut = "(TRGHOSTPROB<%s)" % config['Trk_Long_GhostProb'] _daughtersCuts = _trkChi2Cut+'&'+_trkGhostProbCut _massCutLow = "(AM>(5279-%s)*MeV)" % config['B_Mlow'] _massCutHigh = "(AM<(5279+%s)*MeV)" % config['B_Mhigh'] _aptCut = "(APT>%s*MeV)" % config['B_APTmin'] _daugMedPtCut = "(ANUM(PT>%s*MeV)>=2)" % config['BDaug_MedPT_PT'] _daugMaxPtIPCut = "(AVAL_MAX(MIPDV(PRIMARY),PT)>%s)" % config['BDaug_MaxPT_IP'] _maxDocaChi2Cut = "(ACUTDOCACHI2(%s,''))" % config['BDaug_DD_maxDocaChi2'] _daugPtSumCut = "((APT1+APT2+APT3)>%s*MeV)" % config['BDaug_DD_PTsum'] _combCuts = _aptCut+'&'+_daugPtSumCut+'&'+_daugMedPtCut+'&'+_massCutLow+'&'+_massCutHigh+'&'+_daugMaxPtIPCut+'&'+_maxDocaChi2Cut _ptCut = "(PT>%s*MeV)" % config['B_PTmin'] _vtxChi2Cut = "(VFASPF(VCHI2)<%s)" % config['B_VtxChi2'] _diraCut = "(BPVDIRA>%s)" % config['B_DD_Dira'] _ipChi2Cut = "(MIPCHI2DV(PRIMARY)<%s)" % config['B_DD_IPCHI2wrtPV'] _fdCut = "(VFASPF(VMINVDDV(PRIMARY))>%s)" % config['B_DD_FDwrtPV'] _fdChi2Cut = "(BPVVDCHI2>%s)" % config['B_DD_FDChi2'] _ipChi2SumCut = "(SUMTREE(MIPCHI2DV(PRIMARY),((ABSID=='pi+') | (ABSID=='pi-')),0.0) > %s)" % config['B_DD_IPCHI2sum'] _motherCuts = _ptCut+'&'+_vtxChi2Cut+'&'+_diraCut+'&'+_ipChi2Cut+'&'+_fdCut+'&'+_fdChi2Cut+'&'+_ipChi2SumCut _B = CombineParticles() _B.DaughtersCuts = { "pi+" : _daughtersCuts } _B.CombinationCut = _combCuts _B.MotherCut = _motherCuts _B.DecayDescriptors = [ "[B+ -> pi+ pi- K*(892)+]cc" ] self.selBu2KstDDhh = Selection (name, Algorithm = _B, RequiredSelections = [ self.selKst2KSDDpi, self.pions ])
def makeB2KSLDhh( self, name, config ) : """ Create and store either a B -> KS(LD) h+ h- Selection object, or a B -> KS(LD) h+(-) h+(-) Same Sign Selection Object Arguments: name : name of the Selection. config : config dictionary """ _trkChi2Cut = "(TRCHI2DOF<%s)" % config['Trk_Chi2'] _trkGhostProbCut = "(TRGHOSTPROB<%s)" % config['Trk_GhostProb'] _daughtersCuts = _trkChi2Cut+'&'+_trkGhostProbCut _massCutLow = "(AM>(5279-%s)*MeV)" % config['B_Mlow'] _massCutHigh = "(AM<(5279+%s)*MeV)" % config['B_Mhigh'] _aptCut = "(APT>%s*MeV)" % config['B_APTmin'] _daugMedPtCut = "(ANUM(PT>%s*MeV)>=2)" % config['BDaug_MedPT_PT'] _daugMaxPtIPCut = "(AVAL_MAX(MIPDV(PRIMARY),PT)>%s)" % config['BDaug_MaxPT_IP'] _maxDocaChi2Cut = "(ACUTDOCACHI2(%s,''))" % config['BDaug_LD_maxDocaChi2'] _daugPtSumCut = "((APT1+APT2+APT3)>%s*MeV)" % config['BDaug_LD_PTsum'] _combCuts = _daugPtSumCut+'&'+_massCutLow+'&'+_massCutHigh+'&'+_maxDocaChi2Cut+'&'+_aptCut+'&'+_daugMedPtCut+'&'+_daugMaxPtIPCut _diraCut = "(BPVDIRA>%s)" % config['B_LD_Dira'] _motherCuts = _diraCut _B = CombineParticles() _B.DaughtersCuts = { "pi+" : _daughtersCuts } _B.CombinationCut = _combCuts _B.MotherCut = _motherCuts if "SameSign" in name: _B.DecayDescriptors = [ "B_s0 -> K+ pi+ KS0", "B_s0 -> K- pi- KS0"] self.selB2KSLDhh_SameSign = Selection (name, Algorithm = _B, RequiredSelections = [ self.selKS2LD, self.pions, self.kaons ]) else: _B.DecayDescriptors = [ "B_s0 -> K+ pi- KS0", "B_s0 -> pi+ K- KS0"] self.selB2KSLDhh = Selection (name, Algorithm = _B, RequiredSelections = [ self.selKS2LD, self.pions, self.kaons ])
def makeUnbiasedB2DPi(moduleName, DName, DSel, config): StdPi = StdAllNoPIDsPions # Because of no IPchi2 cut Bachelorcut = "((TRCHI2DOF<%(BachelorChi2Max)s) & " \ "(PT > %(BachelorPtMin)s*MeV) & (P > %(BachelorPMin)s*MeV) & " \ "(MIPCHI2DV(PRIMARY) > %(BachelorMIPChi2Min)s))" % config Dcut = "((MINTREE(ABSID=='K+',PIDK)>0) & (MAXTREE(ABSID=='pi+',PIDK)<5))" B2DPi = CombineParticles() B2DPi.DecayDescriptors = ["[B_s0 -> D- pi+]cc"] B2DPi.DaughtersCuts = {"pi+": Bachelorcut, "D-": Dcut} B2DPi.CombinationCut = "((ADAMASS('B0') < %(CombDMass)s *MeV) | (ADAMASS('B_s0') < %(CombDMass)s *MeV))" % config B2DPi.MotherCut = "((VFASPF(VCHI2/VDOF)<%(VtxChi2Max)s) & " \ "(BPVDIRA > %(DIRAMin)s))" % config return Selection("Bs2DsPiWith" + DName + "For" + moduleName, Algorithm=B2DPi, RequiredSelections=[DSel, StdPi])
def _Lb2pMuNuVub_fakemu_Lb(self): from GaudiConfUtils.ConfigurableGenerators import CombineParticles from PhysSelPython.Wrappers import Selection _pMu = CombineParticles(DecayDescriptors=["[Lambda_b0 -> p+ mu-]cc"], ReFitPVs=True) _pMu.Preambulo = self._Definitions() _pMu.CombinationCut = "(AM>%(pMuMassLower)s*MeV)" % self._config _pMu.MotherCut = "(VFASPF(VCHI2/VDOF)< %(BVCHI2DOF)s) & (BPVDIRA> %(BDIRA)s)"\ "& (Lb_PT > %(pMuPT)s)"\ "& (BPVVDCHI2 >%(BFDCHI2HIGH)s)" % self._config _pMu.ReFitPVs = True _pMuSel = Selection( "pMu_fakemu_Lb_for" + self._name, Algorithm=_pMu, RequiredSelections=[self._fakemuonFilter(), self._protonFilter()]) _LbSel = tosSelection(_pMuSel, {'Hlt2.*Topo2Body.*Decision%TOS': 0}) return _LbSel
def makeKst2KSLLpi( self, name, config ) : # define all the cuts _massCutLo = "(AM > %s*MeV)" % config['Kstar_MassLo'] _massCutHi = "(AM < %s*MeV)" % config['Kstar_MassHi'] _trkChi2Cut = "(TRCHI2DOF<%s)" % config['Trk_Long_Chi2'] _trkGhostProbCut = "(TRGHOSTPROB<%s)" % config['Trk_Long_GhostProb'] _daughtersCuts = _trkChi2Cut+'&'+_trkGhostProbCut _allCuts = _massCutLo+'&'+_massCutHi # make the filter _filterKst2KSLLpi = CombineParticles() _filterKst2KSLLpi.DecayDescriptor = "[K*(892)+ -> KS0 pi+]cc" _filterKst2KSLLpi.CombinationCut = _allCuts _filterKst2KSLLpi.DaughtersCuts = { "pi+" : _daughtersCuts } _filterKst2KSLLpi.MotherCut = "ALL" # make and store the Selection object self.selKst2KSLLpi = Selection( name, Algorithm = _filterKst2KSLLpi, RequiredSelections = [self.selKS2LL, self.pions] )
def __Omega2PiPiPi0__(self, Pions, Pi0, conf): """ Make omega -> pi+ pi- pi0 """ _omega2pipipizero = CombineParticles() _omega2pipipizero.DecayDescriptor = "omega(782) -> pi+ pi- pi0" _omega2pipipizero.CombinationCut = "(ADAMASS('omega(782)') < %(Omega_CombMassWin)s * MeV) " % conf #"(ADOCACHI2CUT(20.,''))" _omega2pipipizero.MotherCut = "(ADMASS('omega(782)') < %(Omega_MassWin)s *MeV) & " \ "(VFASPF(VPCHI2)> %(OmegaChi2Prob)s )" %conf _omegaConf = _omega2pipipizero.configurable("Combine_" + self.name + "_PiPiPi0") _omegaConf.ParticleCombiners.update({'': 'OfflineVertexFitter:PUBLIC'}) _selOMEGA2PIPIPIZERO = Selection("Selection_" + self.name + "_omega2pipipizero", Algorithm=_omegaConf, RequiredSelections=[Pions, Pi0]) return _selOMEGA2PIPIPIZERO
def __InclDimuLowQ2__(self, conf, doWS=False): ''' Create a new dimuon for high q2 inclusive B->Xmumu ''' from GaudiConfUtils.ConfigurableGenerators import CombineParticles CombineDiMuon = CombineParticles() CombineDiMuon.DecayDescriptors = ["B0 -> mu- mu+"] sel_name = "InclDiMuLowQ2" #CombineDiMuon.CombinationCut = self.InclDiMuLowQ2CombCut CombineDiMuon.MotherCut = self.InclDiMuCut + "&" + self.InclDiMuLowQ2Cut # choose if doWS == True: CombineDiMuon.DecayDescriptors = [ "B0 -> mu- mu+", "B0 -> mu- mu-", "B0 -> mu+ mu+" ] from PhysSelPython.Wrappers import Selection SelDiMuon = Selection("Sel_" + self.name + "_" + sel_name, Algorithm=CombineDiMuon, RequiredSelections=[self.LowQ2Muons]) return SelDiMuon
def __FakeTrimu__(self, conf): """ Create trimuon """ CombineTriMuon = CombineParticles() CombineTriMuon.DecayDescriptor = "[B+ -> J/psi(1S) mu+]cc" sel_name = "FakeTriMu" #CombineTriMuon.CombinationCut = self.TriMuLowQ2CombCut #["[B+ ->mu+ mu+ mu-]cc", "[B+ ->mu+ mu+ mu+]cc"] CombineTriMuon.MotherCut = self.TriMuCut # choose from PhysSelPython.Wrappers import Selection #SelTriMuon = Selection("Sel_" + self.name + "_"+sel_name, Algorithm = CombineTriMuon, # RequiredSelections = [self.Jpsi, self.FakeMuon ]) SelTriMuon = Selection(sel_name, Algorithm=CombineTriMuon, RequiredSelections=[self.FakeMuons, self.Jpsi]) return SelTriMuon
def makeB2TauMu(name): """ Please contact Johannes Albrecht if you think of prescaling this line! Arguments: name : name of the Selection. """ #from Configurables import OfflineVertexFitter Bs2TauMu = CombineParticles() Bs2TauMu.DecayDescriptors = [ "[B_s0 -> tau+ mu-]cc", "[B_s0 -> tau+ mu+]cc" ] # Set the OfflineVertexFitter to keep the 4 tracks and not the J/Psi Kstar: #Bs2TauMu.addTool( OfflineVertexFitter ) #Bs2TauMu.ParticleCombiners.update( { "" : "OfflineVertexFitter"} ) #Bs2TauMu.OfflineVertexFitter.useResonanceVertex = False #Bs2TauMu.ReFitPVs = True Bs2TauMu.DaughtersCuts = { "mu+": "(MIPCHI2DV(PRIMARY)> 25.)&(TRCHI2DOF < 3 ) & (TRGHOSTPROB<0.3)" } Bs2TauMu.CombinationCut = "(ADAMASS('B_s0')<1200*MeV)"\ "& (AMAXDOCA('')<0.3*mm)" Bs2TauMu.MotherCut = "(VFASPF(VCHI2/VDOF)<9) "\ "& (ADMASS('B_s0') < 1200*MeV )"\ "& (BPVDIRA > 0) "\ "& (BPVVDCHI2> 225)"\ "& (BPVIPCHI2()< 25) " from CommonParticles import StdLooseDetachedTau, StdLooseDipion _stdLooseMuons = DataOnDemand(Location="Phys/StdLooseMuons/Particles") _stdLooseDetachedTaus = DataOnDemand( Location="Phys/StdLooseDetachedTau3pi/Particles") return Selection( name, Algorithm=Bs2TauMu, RequiredSelections=[_stdLooseMuons, _stdLooseDetachedTaus])
def makeKpKpKp_incl(name, _h_PT, _h_P, _h_IPCHI2, _h_TRCHI2DOF, _h_TRGHP, _3h_DOCA, _3h_PTmax, _3h_DIRA, _3h_FDCHI2, _3h_PVDOCAmin, _3h_CHI2, _3h_IPCHI2, _3h_PT, _3h_PTsum, _3h_Psum, _3h_PVIPCHI2sum, _3h_TRKCHIDOFmin, _3h_CORRMmax, _3h_CORRMmin, _3hKKK_Mmin, _3hKKK_Mmax): _daughtersCuts = { "K+": "(PT > %(_h_PT)s*MeV) \ & (P > %(_h_P)s*MeV) \ & (MIPCHI2DV(PRIMARY) > %(_h_IPCHI2)s) \ & (TRCHI2DOF < %(_h_TRCHI2DOF)s) \ & (TRGHOSTPROB < %(_h_TRGHP)s)" % locals() } _combinationCut = "(AM < %(_3hKKK_Mmax)s*MeV) \ & (AM > %(_3hKKK_Mmin)s*MeV) \ & (AMAXDOCA('LoKi::TrgDistanceCalculator') < %(_3h_DOCA)s)" % locals() _motherCut = "(MAXTREE(((ABSID=='K+') | (ABSID=='K-')),PT) > %(_3h_PTmax)s*MeV) \ & (BPVDIRA > %(_3h_DIRA)s) \ & (BPVVDCHI2 > %(_3h_FDCHI2)s) \ & (VFASPF(VMINVDDV(PRIMARY)) > %(_3h_PVDOCAmin)s) \ & (VFASPF(VCHI2) < %(_3h_CHI2)s) \ & (MIPCHI2DV(PRIMARY) < %(_3h_IPCHI2)s) \ & (PT > %(_3h_PT)s*MeV) \ & (SUMTREE(PT,((ABSID=='K+') | (ABSID=='K-')),0.0) > %(_3h_PTsum)s*MeV) \ & (SUMTREE(P,((ABSID=='K+') | (ABSID=='K-')),0.0) > %(_3h_Psum)s*MeV) \ & (SUMTREE(MIPCHI2DV(PRIMARY),((ABSID=='K+') | (ABSID=='K-')),0.0) > %(_3h_PVIPCHI2sum)s) \ & (MINTREE((('K+'==ABSID) | ('K-'==ABSID)),TRCHI2DOF) < %(_3h_TRKCHIDOFmin)s) \ & (BPVCORRM < %(_3h_CORRMmax)s * MeV)& (BPVCORRM > %(_3h_CORRMmin)s*MeV)" % locals( ) _KpKpKp = CombineParticles() _KpKpKp.DecayDescriptors = ["[B+ -> K+ K+ K+]cc"] _KpKpKp.MotherCut = _motherCut _KpKpKp.CombinationCut = _combinationCut _KpKpKp.DaughtersCuts = _daughtersCuts return Selection(name, Algorithm=_KpKpKp, RequiredSelections=[StdNoPIDsKaons])
def __Dimuon__(self, conf): ''' Create a new dimuon from scratch ''' wsCombinations=conf['DimuonWS'] from GaudiConfUtils.ConfigurableGenerators import CombineParticles CombineDiMuon = CombineParticles() if wsCombinations == True: CombineDiMuon.DecayDescriptors = ["J/psi(1S) -> mu- mu+", "J/psi(1S) -> mu+ mu+", " J/psi(1S) -> mu- mu-"] else: CombineDiMuon.DecayDescriptors = ["J/psi(1S) -> mu- mu+"] CombineDiMuon.DaughtersCuts = { "mu+" : self.MuonCut, "mu-" : self.MuonCut } CombineDiMuon.CombinationCut = self.DiMuonCombCut CombineDiMuon.MotherCut = self.DiMuonCut IsMuonFlag = conf['Muon_IsMuon'] from StandardParticles import StdAllLooseMuons, StdAllVeryLooseMuons Muons = StdAllLooseMuons if IsMuonFlag else StdAllVeryLooseMuons from PhysSelPython.Wrappers import Selection SelDiMuon = Selection("Sel_" + self.name + "_DiMuon", Algorithm = CombineDiMuon, RequiredSelections = [ Muons ] ) return SelDiMuon
bothstripping = MergedSelection("Selection_mergeddaughters", RequiredSelections = [LowQ2MuonsOnDemand,HighQ2MuonsOnDemand]) _filterDimuons = FilterDesktop(Code="ABSID==511") # Dimuons from B0--> mu mu stripping selection _selDimuons= Selection( "_selDimuons", Algorithm = _filterDimuons, RequiredSelections = [bothstripping] ) from Configurables import SubstitutePID subalg = SubstitutePID("_B2Jpsi_SubPID", Code="(DECTREE('B0 -> mu+ mu-'))", Substitutions={'B0 -> mu+ mu-' : 'J/psi(1S)'}, MaxChi2PerDoF=-666) subsel = Selection("subsel",Algorithm = subalg, RequiredSelections = [_selDimuons]) # Try and make B->J/psi K _B = CombineParticles() _B.DaughtersCuts = { "K+" : "(PT>500*MeV)&(MIPCHI2DV(PRIMARY) > 9)" } _B.MotherCut = "(DMASS('B+')<5000*MeV) & (VFASPF(VCHI2)/VFASPF(VDOF)<5.0) & (BPVDIRA > 0.999)" #need to check these cuts _B.DecayDescriptors = [ "[B+ -> J/psi(1S) K+]cc" ] _BdecaySelection = Selection( "TurboB", Algorithm = _B, RequiredSelections = [subsel,kaons] ) SeqB = SelectionSequence('SeqB', TopSelection = _BdecaySelection) # Here we just put the output candidates in an Tuple tupleB = DecayTreeTuple("bae-muon-data") tupleB.Inputs = [SeqB.outputLocation()] tupleB.Decay = "[B+ -> ^K+ ^(J/psi(1S) -> ^mu+ ^mu-)]CC" tupleB.ToolList = [ "TupleToolKinematic"
bothstripping = MergedSelection("Selection_mergeddaughters", RequiredSelections = [LowQ2MuonsOnDemand,HighQ2MuonsOnDemand]) _filterDimuons = FilterDesktop(Code="ABSID==511") # Dimuons from B0--> mu mu stripping selection _selDimuons= Selection( "_selDimuons", Algorithm = _filterDimuons, RequiredSelections = [bothstripping] ) from Configurables import SubstitutePID subalg = SubstitutePID("_B2Jpsi_SubPID", Code="(DECTREE('B0 -> mu+ mu-'))", Substitutions={'B0 -> mu+ mu-' : 'J/psi(1S)'}, MaxChi2PerDoF=-666) subsel = Selection("subsel",Algorithm = subalg, RequiredSelections = [_selDimuons]) # Try and make B->J/psi K _B = CombineParticles() _B.DaughtersCuts = { "K+" : "PT>500*MeV" } _B.MotherCut = "(DMASS('B+')<5000*MeV) & (VFASPF(VCHI2)<25.0)" #need to check these cuts _B.DecayDescriptors = [ "[B+ -> J/psi(1S) K+]cc" ] _BdecaySelection = Selection( "TurboB", Algorithm = _B, RequiredSelections = [subsel,kaons] ) SeqB = SelectionSequence('SeqB', TopSelection = _BdecaySelection) tupleB = DecayTreeTuple("bar-muon-tuple") tupleB.Inputs = [SeqB.outputLocation()] tupleB.Decay = "[B+ -> ^(J/psi(1S) -> ^mu+ ^mu-) ^K+]CC"