def buildPIDLineWithJpsi(self, configRowId): ## Resolves possible clone statements _config = self._resolveCloning(configRowId) ## Prepares the tag&probe cut if needed _combinationCutJpsi = _config['JpsiCombinationCut'] _combinationCut = _config['CombinationCut'] if 'TagAndProbeCut' in _config: _id = ["1", "2"] _combinationCutJpsi += ' & ' _combinationCutJpsi += self._buildTagProbeCut( _config['TagAndProbeCut'], _id) ###print _combinationCut _algorithmJpsi = CombineParticles() #_algorithmJpsi = CombineParticles(self.name + configRowId + 'JpsiAlgorithm') _algorithmJpsi.CombinationCut = _combinationCutJpsi _algorithmJpsi.DaughtersCuts = _config['DaughtersCuts'] _algorithmJpsi.MotherCut = _config['JpsiMotherCut'] _algorithmJpsi.DecayDescriptor = _config['DecayDescriptorJpsi'] _requiredSelections = [ DataOnDemand(x) for x in _config['InputTESJpsi'] ] _selectionJpsi = Selection(self.name + configRowId + 'SelectionJpsi', Algorithm=_algorithmJpsi, RequiredSelections=_requiredSelections) _algorithm = CombineParticles() #_algorithm = CombineParticles(self.name + configRowId + 'Algorithm') _algorithm.CombinationCut = _combinationCut _algorithm.DaughtersCuts = _config['DaughtersCuts'] _algorithm.MotherCut = _config['MotherCut'] _algorithm.DecayDescriptor = _config['DecayDescriptor'] _requiredSelections = [_selectionJpsi] + [ DataOnDemand(x) for x in _config['InputTES'] ] _selection = Selection(self.name + configRowId + 'Selection', Algorithm=_algorithm, RequiredSelections=_requiredSelections) _line = StrippingLine( self.name + configRowId + 'Line', prescale=_config['Prescale'], checkPV=_config['CheckPV'], EnableFlavourTagging=False, RequiredRawEvents=_config['RawEvent'] #, MDSTFlag = _config['MDST.DST'] , HLT1=_config['Hlt1Filter'], HLT2=_config['Hlt2Filter'], algos=[_selection], ODIN=self.odin) return _line
def __Selection_CreateDiMuonSSLowP__(self, lName, DiMuonCuts, MuonCuts, IsMuonFlag, MuonPIDmu): ''' Clone the StdVeryLooseDiMuon to build same sign candidates ''' from StandardParticles import StdNoPIDsMuons, StdVeryLooseMuons _requires = [StdNoPIDsMuons] from GaudiConfUtils.ConfigurableGenerators import CombineParticles muhigh = '(0.5<PPINFO(LHCb.ProtoParticle.InAccMuon,-1)) ' mulow = '(0.5>PPINFO(LHCb.ProtoParticle.InAccMuon,-1)) & ( PIDmu > 3.0 )' CombineDiMuonSSLowP = CombineParticles() CombineDiMuonSSLowP.DecayDescriptor = "[J/psi(1S) -> mu+ mu+]cc" CombineDiMuonSSLowP.DaughtersCuts = { "mu+" : MuonCuts, "mu-": MuonCuts } if IsMuonFlag: CombineDiMuonSSLowP.CombinationCut = "( ACHILDCUT(PPINFO(LHCb.ProtoParticle.InAccMuon,-1)>0.5,1) & ACHILDCUT(PPINFO(LHCb.ProtoParticle.InAccMuon,-1)<0.5,2) & ACHILDCUT(ISMUON, 1) & ACHILDCUT(PIDmu > "+str(MuonPIDmu) +",2) ) | ( ACHILDCUT(PPINFO(LHCb.ProtoParticle.InAccMuon,-1)>0.5,2) & ACHILDCUT(PPINFO(LHCb.ProtoParticle.InAccMuon,-1)<0.5,1) & ACHILDCUT(ISMUON, 2) & ACHILDCUT(PIDmu > "+str(MuonPIDmu) + " ,1) )" else: CombineDiMuonSSLowP.CombinationCut = "( ACHILDCUT(PPINFO(LHCb.ProtoParticle.InAccMuon,-1)>0.5,1) & ACHILDCUT(PPINFO(LHCb.ProtoParticle.InAccMuon,-1)<0.5,2) & ACHILDCUT(ISMUONLOOSE, 1) & ACHILDCUT(PIDmu > 0.0 ,2) ) | ( ACHILDCUT(PPINFO(LHCb.ProtoParticle.InAccMuon,-1)>0.5,2) & ACHILDCUT(PPINFO(LHCb.ProtoParticle.InAccMuon,-1)<0.5,1) & ACHILDCUT(ISMUONLOOSE, 2) & ACHILDCUT(PIDmu > 0.0 ,1) )" CombineDiMuonSSLowP.MotherCut = DiMuonCuts from StandardParticles import StdLooseMuons, StdVeryLooseMuons Muons = StdLooseMuons if IsMuonFlag else StdVeryLooseMuons from PhysSelPython.Wrappers import Selection SelDiMuonSSLowP = Selection("Sel_" + lName + "_DiMuonSSLowP", Algorithm = CombineDiMuonSSLowP, RequiredSelections = _requires ) return SelDiMuonSSLowP
def makeTau2PhiMu(name): """ Please contact Giulio Dujany if you think of prescaling this line! Arguments: name : name of the Selection. """ #from Configurables import OfflineVertexFitter Tau2PhiMu = CombineParticles() Tau2PhiMu.DecayDescriptor = " [ tau+ -> phi(1020) mu+ ]cc" makePhi = CombineParticles() makePhi.DecayDescriptor = "phi(1020) -> K+ K-" makePhi.DaughtersCuts = { "K+": "(ISLONG) & (TRCHI2DOF < 3 ) & (TRGHOSTPROB<0.3) & (PT>300*MeV) & (PIDK > 0) & ( BPVIPCHI2 () > 9 )", "K-": "(ISLONG) & (TRCHI2DOF < 3 ) & (TRGHOSTPROB<0.3) & (PT>300*MeV) & (PIDK > 0) & ( BPVIPCHI2 () > 9 )" } _kaons = DataOnDemand(Location='Phys/StdLooseKaons/Particles') makePhi.CombinationCut = "(ADAMASS('phi(1020)')<30*MeV)" makePhi.MotherCut = " ( VFASPF(VCHI2) < 25 ) & (MIPCHI2DV(PRIMARY)> 9)" SelPhi = Selection(name + "SelPhi", Algorithm=makePhi, RequiredSelections=[_kaons]) Tau2PhiMu.DaughtersCuts = { "mu-": " ( PT > 300 * MeV ) & ( TRCHI2DOF < 3 ) & (TRGHOSTPROB<0.3) & ( BPVIPCHI2 () > 9 )" } Tau2PhiMu.CombinationCut = "(ADAMASS('tau-')<150*MeV)" Tau2PhiMu.MotherCut = "( VFASPF(VCHI2) < 25 ) & ( (BPVLTIME () * c_light) > 50 * micrometer ) & ( BPVIPCHI2() < 100 ) " _stdLooseMuons = DataOnDemand(Location="Phys/StdLooseMuons/Particles") SelTau = Selection(name + "makeTau", Algorithm=Tau2PhiMu, RequiredSelections=[SelPhi, _stdLooseMuons]) # Trigger selection from Configurables import TisTosParticleTagger _tisTosFilter = TisTosParticleTagger(name + "Triggered") _tisTosFilter.TisTosSpecs = { 'L0Global%TIS': 0, 'L0MuonDecision%TOS': 0, 'Hlt1TrackAllL0Decision%TOS': 0, 'Hlt1TrackMuonDecision%TOS': 0 } SelTau_triggered = Selection( name, Algorithm=_tisTosFilter, RequiredSelections=[SelTau], ) return SelTau_triggered
def makeEtaPrime2pipipi(name, config): """ eta' selection for tau -> mu eta' Please contact Guido Andreassi if you think of prescaling this line! Arguments: name : name of the Selection , configuration dictionary. """ EtaPrime2pipipi = CombineParticles() EtaPrime2pipipi.DecayDescriptor = "eta_prime -> pi+ pi- pi0" EtaPrime2pipipi.ReFitPVs = True EtaPrime2pipipi.DaughtersCuts = { "pi+": "{piplus_cuts}".format(**config), "pi-": "{piminus_cuts}".format(**config), "pi0": "{pi0_cuts}".format(**config) } EtaPrime2pipipi.CombinationCut = "{etap_mass_window}".format(**config) EtaPrime2pipipi.MotherCut = "{etap_cuts}".format(**config) _stdLoosePions = DataOnDemand(Location="Phys/StdLoosePions/Particles") _stdLooseResolvedPi0 = DataOnDemand( Location="Phys/StdLooseResolvedPi0/Particles") _stdLooseMergedPi0 = DataOnDemand( Location="Phys/StdLooseMergedPi0/Particles") _stdPi0 = MergedSelection( "Pi0For" + name, RequiredSelections=[_stdLooseResolvedPi0, _stdLooseMergedPi0]) return Selection(name, Algorithm=EtaPrime2pipipi, RequiredSelections=[_stdLoosePions, _stdPi0])
def makeEtaPrime2pipigamma(name, config): """ eta' selection for tau -> mu eta' Please contact Guido Andreassi if you think of prescaling this line! Arguments: name : name of the Selection , configuration dictionary. """ EtaPrime2pipigamma = CombineParticles() EtaPrime2pipigamma.DecayDescriptor = "eta_prime -> pi+ pi- gamma" EtaPrime2pipigamma.ReFitPVs = True EtaPrime2pipigamma.DaughtersCuts = { "pi+": "{piplus_cuts}".format(**config), "pi-": "{piminus_cuts}".format(**config), "gamma": "{gamma_cuts}".format(**config) } EtaPrime2pipigamma.CombinationCut = "{etap_mass_window}".format(**config) EtaPrime2pipigamma.MotherCut = "{etap_cuts}".format(**config) _stdLoosePions = DataOnDemand(Location="Phys/StdLoosePions/Particles") _stdLooseAllPhotons = DataOnDemand( Location="Phys/StdLooseAllPhotons/Particles") return Selection(name, Algorithm=EtaPrime2pipigamma, RequiredSelections=[_stdLoosePions, _stdLooseAllPhotons])
def makeD02kpipi0(name): pi0sel = MergedSelection( "Pi0For" + name, RequiredSelections=[StdLooseMergedPi0, StdLooseResolvedPi0]) str_D0_ChargedDau = "(PT>500*MeV) & (P>5*GeV) & (MIPCHI2DV(PRIMARY)>4) & (TRCHI2DOF<5)" str_D0_Pi0 = "(PT>800*MeV) & (P>5*GeV)" str_D0_CombCuts = "(ADAMASS('D0')<200*MeV) & (ADOCA(1,2) < 1.5) & (AHASCHILD(((ABSID == 'K+') | (ABSID == 'pi+')) & (MIPCHI2DV(PRIMARY)>40)))" str_D0_MotherCuts = "(BPVDIRA>0.9) & (PT>2.5*GeV) & (VFASPF(VCHI2/VDOF)<10) & (BPVVDCHI2>36)" str_D0_DecayDescriptor_RS = "[D0 -> K- pi+ pi0]cc" str_D0_Sidebands = "200*MeV" d0 = CombineParticles() d0.DecayDescriptor = str_D0_DecayDescriptor_RS d0.DaughtersCuts = { "K-": str_D0_ChargedDau + ' & ((PPINFO(LHCb.ProtoParticle.RichDLLk,-1000))>0)', "pi+": str_D0_ChargedDau + ' & ((PPINFO(LHCb.ProtoParticle.RichDLLk,-1000))<0)', "pi0": str_D0_Pi0 } d0.CombinationCut = str_D0_CombCuts d0.MotherCut = str_D0_MotherCuts return Selection( "D02Kpipi0For" + name, Algorithm=d0, RequiredSelections=[pi0sel, StdNoPIDsPions, StdNoPIDsKaons])
def make5pi_excl(name, _h_PT, _h_IPCHI2, _h_TRCHI2DOF, _h_TRGHP, _5h_DOCA, _5h_DIRA, _5h_FDCHI2, _5h_CHI2, _5h_PT, _5h_PVIPCHI2sum, _5h_Mmin, _5h_Mmax, _probnnpi): _daughtersCuts = { "pi+": " (PT > %(_h_PT)s*MeV) \ & (TRCHI2DOF < %(_h_TRCHI2DOF)s) \ & (MIPCHI2DV(PRIMARY) > %(_h_IPCHI2)s) \ & (PROBNNpi > %(_probnnpi)s) \ & (TRGHP < %(_h_TRGHP)s) " % locals() } _combinationCut = "(AM < %(_5h_Mmax)s*MeV) \ & (AM > %(_5h_Mmin)s*MeV) \ & (AMAXDOCA('LoKi::TrgDistanceCalculator') < %(_5h_DOCA)s)" % locals() _motherCut = " (BPVDIRA > %(_5h_DIRA)s) \ & (BPVVDCHI2 > %(_5h_FDCHI2)s) \ & (VFASPF(VCHI2) < %(_5h_CHI2)s) \ & (PT > %(_5h_PT)s*MeV) \ & (SUMTREE(MIPCHI2DV(PRIMARY),((ABSID=='pi+') | (ABSID=='pi-')),0.0) > %(_5h_PVIPCHI2sum)s) " \ % locals() _5pi = CombineParticles() _5pi.DecayDescriptors = ["[B+ -> pi+ pi+ pi+ pi- pi-]cc"] _5pi.MotherCut = _motherCut _5pi.CombinationCut = _combinationCut _5pi.DaughtersCuts = _daughtersCuts return Selection(name, Algorithm=_5pi, RequiredSelections=[StdNoPIDsPions])
def makeDetachedJPsi(name): """ detached JPsi selection for B--> JPsi X calibration and normalization channels. Please contact Flavio Archilli if you think of prescaling this line! Arguments: name : name of the Selection. """ #from Configurables import OfflineVertexFitter DetachedJPsi = CombineParticles() DetachedJPsi.DecayDescriptor = "J/psi(1S) -> e+ e-" #DetachedJPsi.addTool( OfflineVertexFitter ) #DetachedJPsi.ParticleCombiners.update( { "" : "OfflineVertexFitter"} ) #DetachedJPsi.OfflineVertexFitter.useResonanceVertex = False DetachedJPsi.ReFitPVs = True DetachedJPsi.DaughtersCuts = { "e+" : "(TRCHI2DOF < 3 ) "\ "& (MIPCHI2DV(PRIMARY)> 25.) "\ "& (PIDe > 2) "} DetachedJPsi.CombinationCut = "(ADAMASS('J/psi(1S)')<1000*MeV) "\ "& (AMAXDOCA('')<0.3*mm)" DetachedJPsi.MotherCut = "(VFASPF(VCHI2)<9) "\ "& (ADMASS('J/psi(1S)') < 1000*MeV )"\ "& (BPVDIRA > 0) "\ "& (BPVVDCHI2>169)" _stdLooseElectrons = DataOnDemand( Location="Phys/StdLooseElectrons/Particles") return Selection(name, Algorithm=DetachedJPsi, RequiredSelections=[_stdLooseElectrons])
def makeBs2Kst_0Kst_0(name, Kst_0sel, BMassWin, BVCHI2, BDOCA, BIPCHI2, BFDistanceCHI2, SumPT, BDIRA): """ Create and return a Bs -> Kstar_0(1430)(Kpi) anti-Kstar_0(1430)(Kpi) Selection object. Arguments: name : name of the Selection. Kst_0sel : Kst_0(1430) -> K+pi- Selection object. BMassWin : Bs invariant mass window around PDG mass value (MeV). BVCHI2 : Maximum Bs vertex chi2 per degree of freedom. BDOCA : Maximum Bs DOCA. BFDistanceCHI2 : Minimum Bs Flight Distance chi2. SumPT : Sum|pT| of the daughters. """ _motherCuts = " (VFASPF(VCHI2/VDOF) < %(BVCHI2)s) & (MIPCHI2DV(PRIMARY)< %(BIPCHI2)s) & (BPVVDCHI2 > %(BFDistanceCHI2)s) & (BPVDIRA > %(BDIRA)s)" % locals( ) _combinationCut = "(ADAMASS('B_s0') < %(BMassWin)s *MeV) & (AMAXDOCA('',False)< %(BDOCA)s *mm) "\ "& ( (AMINCHILD(PT,ID=='K+') + AMINCHILD(PT,ID=='K-') + AMINCHILD(PT,ID=='pi-') + AMINCHILD(PT,ID=='pi+'))> %(SumPT)s *MeV)" % locals() _Bs = CombineParticles() _Bs.DecayDescriptor = "B_s0 -> K*_0(1430)0 K*_0(1430)~0" _Bs.CombinationCut = _combinationCut _Bs.MotherCut = _motherCuts _Bs.ReFitPVs = True return Selection(name, Algorithm=_Bs, RequiredSelections=[Kst_0sel])
def __Selection_CreateKstar__(self, lName, KstarCombCut, KstarCut, KaonCut, PionCut, UseNoPIDsParticles): ''' Make K* using StdNoPID common particles ''' from StandardParticles import StdNoPIDsPions, StdNoPIDsKaons, StdLooseKaons, StdLoosePions _requires = [ StdNoPIDsKaons, StdNoPIDsPions ] if UseNoPIDsParticles else [StdLooseKaons, StdLoosePions] from GaudiConfUtils.ConfigurableGenerators import CombineParticles CombineKstar = CombineParticles() CombineKstar.DecayDescriptor = "[K*(892)0 -> K+ pi-]cc" CombineKstar.CombinationCut = KstarCombCut CombineKstar.MotherCut = KstarCut CombineKstar.DaughtersCuts = {"K+": KaonCut, "pi-": PionCut} from PhysSelPython.Wrappers import Selection SelKstar = Selection( "Sel_" + lName + "_Kstar", Algorithm=CombineKstar, RequiredSelections=_requires) #[StdNoPIDsPions, StdNoPIDsKaons]) return SelKstar
def makeB2LpLL( self, name, config ) : """ Create and store a B -> Lambda~0(LL) p+ Selection object. Arguments: name : name of the Selection. config : config dictionary """ _massCutLow = "(AM>(5279-%s)*MeV)" % config['B_2bodyMlow'] _massCutHigh = "(AM<(5279+%s)*MeV)" % config['B_2bodyMhigh'] _aptCut = "(APT>%s*MeV)" % config['B_APTmin'] _daugMedPtCut = "(ANUM(PT>%s*MeV)>=2)" % config['BDaug_MedPT_PT'] _maxDocaChi2Cut = "(ACUTDOCACHI2(%s,''))" % config['BDaug_LL_maxDocaChi2'] _daugPtSumCut = "(APT1>%s*MeV)" % config['B_LL_PTMin'] _combCuts = _aptCut+'&'+_daugPtSumCut+'&'+_daugMedPtCut+'&'+_massCutLow+'&'+_massCutHigh+'&'+_maxDocaChi2Cut _ptCut = "(PT>%s*MeV)" % config['B_PTmin'] _vtxChi2Cut = "(VFASPF(VCHI2)<%s)" % config['B_VtxChi2'] _diraCut = "(BPVDIRA>%s)" % config['B_LL_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 = [ "B- -> p~- Lambda0", "B+ -> p+ Lambda~0" ] _B.DaughtersCuts = { "p+" : "TRCHI2DOF<%s"% config['Trk_Chi2'] } _B.CombinationCut = _combCuts _B.MotherCut = _motherCuts return Selection (name, Algorithm = _B, RequiredSelections = [self.selLambda2LL, StdLooseProtons ])
def makeBs2PhiKst(name, Phisel, Kstsel, BMassWin, BVCHI2, BDOCA, BDIRA): """ Create and return a Bs -> Phi (KK) Kstar (Kpi) Selection object. Arguments: name : name of the Selection. Phisel : Phi -> K+K- Selection object. Kstsel : Kst -> K+pi- Selection object. BMassWin : Bs invariant mass window around PDG mass value (MeV). BVCHI2 : Maximum Bs vertex chi2 per degree of freedom. BDOCA : Maximum Bs DOCA. """ _motherCuts = "(VFASPF(VCHI2/VDOF) < %(BVCHI2)s) & (BPVDIRA > %(BDIRA)s)" % locals( ) _combinationCut = "(ADAMASS('B_s0') < %(BMassWin)s *MeV) & (AMAXDOCA('',False)< %(BDOCA)s *mm)" % locals( ) _Bs = CombineParticles() _Bs.DecayDescriptor = "[B_s0 -> phi(1020) K*(892)~0]cc" _Bs.CombinationCut = _combinationCut _Bs.MotherCut = _motherCuts _Bs.ReFitPVs = True return Selection(name, Algorithm=_Bs, RequiredSelections=[Phisel, Kstsel])
def makePhi2KK(name, KaonPT, KaonIPCHI2, KaonPIDK, PhiMassWin, PhiPT, PhiVCHI2): """ Create and return a Phi -> KK Selection object. Starts from DataOnDemand 'Phys/StdLoosePhi2KK'. Arguments: name : name of the Selection. KaonPT : Minimum transverse momentum of K (MeV). KaonIPCHI2 : Minimum impact parameter chi2 of K. KaonPIDK : Minimum PID_{K-pi} of K. PhiPT : Minimum transverse momentum of Phi (MeV). PhiMassWin : Phi invariant mass window around PDG mass value (MeV). PhiVCHI2 : Maximum Phi vertex chi2 (per degree of freedom?) """ _stdKaons = DataOnDemand(Location="Phys/StdLooseKaons/Particles") _Phi2KK = CombineParticles() _Phi2KK.DecayDescriptor = "phi(1020) -> K+ K-" _Phi2KK.DaughtersCuts = { "K+": "(PT>%(KaonPT)s*MeV)&(MIPCHI2DV(PRIMARY)>%(KaonIPCHI2)s)&(PIDK > %(KaonPIDK)s)" % locals() } _Phi2KK.CombinationCut = "(ADAMASS('phi(1020)') < %(PhiMassWin)s *MeV)" % locals( ) _Phi2KK.MotherCut = "(VFASPF(VCHI2/VDOF)< %(PhiVCHI2)s) & (PT > %(PhiPT)s *MeV)" % locals( ) return Selection(name, Algorithm=_Phi2KK, RequiredSelections=[_stdKaons])
def __InclDimuHighQ2__(self, conf, doWS=False, doCCbar=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 = "InclDiMuHighQ2" CombineDiMuon.MotherCut = self.InclDiMuHighQ2Cut # choose if doCCbar == True: # make sure cant run WS combinations if running ccbar sel_name += "Jpsi" CombineDiMuon.CombinationCut = "AM > 0 *MeV" CombineDiMuon.MotherCut = self.InclDiMuCCbarCut 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.HighQ2Muons]) return SelDiMuon
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
def Dstar(name, D0Sel, config): """ Selection for D* """ _DSt = CombineParticles() _DSt.DecayDescriptor = "[D*(2010)+ -> D0 pi+]cc" slowPiCuts = "(PT>%(SlowPiPt)s) & (TRCHI2DOF < %(SlowPiTrkChi2)s)" % locals( )['config'] d0Cuts = "ALL" _DSt.DaughtersCuts = {'pi+': slowPiCuts, 'D0': d0Cuts} combcut = """ (APT>%(DstarPt)s) & (ADAMASS('D*(2010)+')<75) & (AM - AM1 < 165 * MeV) """ _DSt.CombinationCut = combcut % locals()['config'] mothercut = """ (VFASPF(VCHI2PDOF)<%(DstarVtxChi2Ndof)s) & (M-MAXTREE('D0'==ABSID,M)<%(DeltaM_Max)s) & (M-MAXTREE('D0'==ABSID,M)>%(DeltaM_Min)s) """ _DSt.MotherCut = mothercut % locals()['config'] DSt = Selection("SelDSt2D0PiFor" + name, Algorithm=_DSt, RequiredSelections=[StdAllNoPIDsPions, D0Sel]) return DSt
def D0(name, config): """ Selection for D0 """ _D0 = CombineParticles() _D0.DecayDescriptor = "[D0 -> K- pi+]cc" dauCutStr = "(PT > %(DaugPt)s) & (P > %(DaugP)s) & (TRCHI2DOF < %(DaugTrkChi2)s) & (MIPCHI2DV(PRIMARY) > %(DaugIPChi2)s)" % locals( )['config'] _D0.DaughtersCuts = {"K+": dauCutStr, "pi+": dauCutStr} _D0.CombinationCut = "(AMINDOCA('')<0.5)&(ADAMASS('D0')<85 * MeV)" % locals( )['config'] mothercut = """ (PT>%(D0Pt)s) & (VFASPF(VCHI2PDOF)<%(D0VtxChi2Ndof)s) & (BPVVDCHI2>%(D0FDChi2)s) & (BPVDIRA>%(D0BPVDira)s) & (BPVIPCHI2()<%(D0IPChi2)s) & (ADMASS('D0') < %(D0MassWin)s ) & ( ADWM( 'D0' , WM( 'pi-' , 'K+') ) > %(DCS_WrongMass)s) """ # take these out as they shape the sidebands # & ( ADWM( 'D0' , WM( 'K-' , 'K+') ) > %(KK_WrongMass)s) # & ( ADWM( 'D0' , WM( 'pi-' , 'pi+') ) > %(PiPi_WrongMass)s) # """ _D0.MotherCut = mothercut % locals()['config'] D0 = Selection("SelD02RSKPiFor" + name, Algorithm=_D0, RequiredSelections=[StdAllNoPIDsKaons, StdAllNoPIDsPions]) return D0
def __Bs__(self, Dimuon, Kaons, Pions, Kshort, Lambda, Phi, Rho, Kstar, Kstar2KsPi, Kstar2KPi0, conf): """ Make and return a Bs selection """ _b2xmumu = CombineParticles() _b2xmumu.DecayDescriptors = [ "B0 -> J/psi(1S) phi(1020)", "[B0 -> J/psi(1S) K*(892)0]cc", "B0 -> J/psi(1S) rho(770)0", "B0 -> J/psi(1S) KS0", "[B+ -> J/psi(1S) K+]cc", "[B+ -> J/psi(1S) pi+]cc", "[B+ -> J/psi(1S) K*(892)+]cc", "[Lambda_b0 -> J/psi(1S) Lambda0]cc" ] _b2xmumu.CombinationCut = "(AM > 4900.0 *MeV) & (AM < 7000.0 *MeV)" _b2xmumu.MotherCut = self.__BsCuts__(conf) _sel_Daughters = MergedSelection( "Selection_" + self.name + "_daughters", RequiredSelections=[ Kaons, Pions, Kshort, Lambda, Phi, Rho, Kstar, Kstar2KsPi, Kstar2KPi0 ]) sel = Selection("Selection_" + self.name + "_bs2xmumu", Algorithm=_b2xmumu, RequiredSelections=[Dimuon, _sel_Daughters]) return sel
def _Lb2pMuNuVub_low_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)"\ "& (Lb_MCORR < %(pMuMCORR)s)"\ "& (BPVVDCHI2 >%(BFDCHI2HIGH)s)" % self._config _pMu.ReFitPVs = True _pMuSel = Selection( "pMu_low_Lb_for" + self._name, Algorithm=_pMu, RequiredSelections=[self._muonFilter(), self._protonFilter()]) _LbSel = tosSelection( _pMuSel, { 'Hlt2.*TopoMu2Body.*Decision%TOS': 0, 'Hlt2.*SingleMuon.*Decision%TOS': 0 }) return _LbSel
def makeB2ee(name): """ Please contact Johannes Albrecht if you think of prescaling this line! Arguments: name : name of the Selection. """ #from Configurables import OfflineVertexFitter Bs2ee = CombineParticles() Bs2ee.DecayDescriptors = ["B_s0 -> e+ e-", "[B_s0 -> e+ e+]cc"] #Bs2ee.addTool( OfflineVertexFitter ) #Bs2ee.ParticleCombiners.update( { "" : "OfflineVertexFitter"} ) #Bs2ee.OfflineVertexFitter.useResonanceVertex = False Bs2ee.ReFitPVs = False Bs2ee.DaughtersCuts = {"e+": "(MIPCHI2DV(PRIMARY)> 25.)&(TRCHI2DOF < 3 )"} Bs2ee.CombinationCut = "(ADAMASS('B_s0')<1200*MeV)"\ "& (AMAXDOCA('')<0.3*mm)" Bs2ee.MotherCut = "(VFASPF(VCHI2/VDOF)<9) "\ "& (ADMASS('B_s0') < 1200*MeV )"\ "& (BPVDIRA > 0) "\ "& (BPVVDCHI2> 225)"\ "& (BPVIPCHI2()< 25) " _stdLooseElectrons = DataOnDemand( Location="Phys/StdLooseElectrons/Particles") return Selection(name, Algorithm=Bs2ee, RequiredSelections=[_stdLooseElectrons])
def _makeTrigLikeDiMuons(self,name) : """ Make PseudoJpsi (combination of two detached muons, inspired in Hlt2Soft) Arguments: name : name of the selection """ PseudoJPsi = CombineParticles(DecayDescriptor = "J/psi(1S) -> mu+ mu-") PseudoJPsi.DecayDescriptor = "J/psi(1S) -> mu+ mu-" PseudoJPsi.CombinationCut = "(AMAXDOCA('')<%(DiDOCA)s*mm)" %self.config PseudoJPsi.MotherCut = ("(MINTREE('mu-' == ABSID, MIPDV(PRIMARY)) > %(IP)s)" + " & (CHILDCUT((TRGHOSTPROB < %(TRACK_TRGHOSTPROB_MAX)s),1))" + " & (CHILDCUT((TRGHOSTPROB < %(TRACK_TRGHOSTPROB_MAX)s),2))" + " & (MINTREE('mu-' == ABSID, MIPCHI2DV(PRIMARY)) > %(IPChi2Min)s)" + " & (MAXTREE('mu-' == ABSID, MIPCHI2DV(PRIMARY)) < %(IPChi2Max)s)" + " & ( VFASPF (sqrt(VX*VX+VY*VY)) > %(Rho)s) " + " & ( VFASPF ( VZ ) < %(SVZ)s) " + " & ((MIPDV(PRIMARY)/BPVVDZ)< %(MaxIpDistRatio)s)" + " & (MM < %(MaxMass)s)" + " & (VFASPF(VCHI2PDOF)<%(VertexChi2)s )" + " & (DOCAMAX < %(DiDOCA)s)" + " & (BPVVDZ > %(MinVDZ)s) " + " & (BPVDIRA > %(MinBPVDira)s) " #+ " & (PCUTA (ALV (1,2) < %(cosAngle)s))" ) % self.config return Selection (name, Algorithm = PseudoJPsi, RequiredSelections = [self.SelMuons])
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'] _daugMedPtCut = "(ANUM(PT>%s*MeV)>=2)" % config['BDaug_MedPT_PT'] _daugMaxPtIPCut = "(AVAL_MAX(MIPDV(PRIMARY),PT)>%s)" % config['BDaug_MaxPT_IP'] _hhDocaCut = "(ADOCA(1,2)<%s)" % config['hh_DOCA'] _daugPtSumCut = "((APT1+APT2+APT3)>%s*MeV)" % config['BDaug_LL_PTsum'] _combCuts = _massCutLow+'&'+_massCutHigh+'&'+_daugMedPtCut+'&'+_daugMaxPtIPCut+'&'+_hhDocaCut+'&'+_daugPtSumCut _vtxChi2Cut = "(VFASPF(VCHI2)<%s)" % config['B_VtxChi2'] _diraCut = "(BPVDIRA>%s)" % config['B_Dira'] _ipCut = "(MIPDV(PRIMARY)<%s)" % config['B_IPwrtPV'] _fdCut = "(VFASPF(VMINVDDV(PRIMARY))>%s)" % config['B_FDwrtPV'] _fdChi2Cut = "(BPVVDCHI2>%s)" % config['B_LL_FDChi2'] _motherCuts = _vtxChi2Cut+'&'+_diraCut+'&'+_ipCut+'&'+_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.pions, self.kaons ])
def makeTau2eMuMu(name): """ Please contact Johannes Albrecht if you think of prescaling this line! Arguments: name : name of the Selection. """ #from Configurables import OfflineVertexFitter Tau2eMuMu = CombineParticles() Tau2eMuMu.DecayDescriptors = [ " [ tau+ -> e+ mu+ mu- ]cc", " [ tau+ -> mu+ mu+ e- ]cc" ] Tau2eMuMu.DaughtersCuts = { "mu+" : " ( PT > 300 * MeV ) & ( TRCHI2DOF < 3 ) & ( BPVIPCHI2 () > 9 ) & (TRGHOSTPROB<0.3) " , "e+" : " ( PT > 300 * MeV ) & ( TRCHI2DOF < 3 ) & ( BPVIPCHI2 () > 9 ) "\ "& (PIDe > 2) " } Tau2eMuMu.CombinationCut = "(ADAMASS('tau+')<200*MeV)" Tau2eMuMu.MotherCut = """ ( VFASPF(VCHI2) < 15 ) & ( (BPVLTIME () * c_light) > 100 * micrometer ) & ( BPVIPCHI2() < 100 ) """ _stdLooseMuons = DataOnDemand(Location="Phys/StdLooseMuons/Particles") _stdLooseElectrons = DataOnDemand( Location="Phys/StdLooseElectrons/Particles") return Selection(name, Algorithm=Tau2eMuMu, RequiredSelections=[_stdLooseMuons, _stdLooseElectrons])
def _makePi0MuMu(self,name, combcut) : """ K0s2pi0mumu selection object in signal region. Arguments: name : name of the Selection combcut : cut at combination level """ from StandardParticles import StdLooseResolvedPi0 as Pi0s #from Configurables import OfflineVertexFitter K0s2Pi0MuMu1 = CombineParticles(DecayDescriptor = "KS0 -> pi0 J/psi(1S)") #K0s2Pi0MuMu1.addTool( OfflineVertexFitter ) #K0s2Pi0MuMu1.ParticleCombiners.update( { "" : "OfflineVertexFitter"} ) #K0s2Pi0MuMu1.OfflineVertexFitter.useResonanceVertex = False #K0s2Pi0MuMu1.ReFitPVs = True K0s2Pi0MuMu1.CombinationCut = combcut K0s2Pi0MuMu1.MotherCut = "((BPVDIRA> %(KSdira)s ) "\ "& ((BPVVDSIGN*M/P) > %(KSlife)s) "\ "& (MIPDV(PRIMARY)<%(KSip)s*mm) "\ "& (M> %(KSsignalminMass)s * MeV) "\ "& ( (M< %(KSsignalmaxMass)s * MeV) ))" %self.config return Selection (name, Algorithm = K0s2Pi0MuMu1, RequiredSelections = [ self.SelDiMuons, Pi0s])
def makeBu(name): """ detached Bu-->JPsiK selection. Please contact Flavio Archilli if you think of prescaling this line! Arguments: name : name of the Selection. """ #from Configurables import OfflineVertexFitter SelDJPsi = makeDetachedJPsi(name) PreselBu2JPsiKCommon = CombineParticles() PreselBu2JPsiKCommon.DecayDescriptor = " [B+ -> J/psi(1S) K+]cc " #PreselBu2JPsiKCommon.addTool( OfflineVertexFitter ) #PreselBu2JPsiKCommon.ParticleCombiners.update( { "" : "OfflineVertexFitter"} ) #PreselBu2JPsiKCommon.OfflineVertexFitter.useResonanceVertex = False PreselBu2JPsiKCommon.ReFitPVs = True PreselBu2JPsiKCommon.DaughtersCuts = { "K+": "(ISLONG) & (TRCHI2DOF < 3 ) &(MIPCHI2DV(PRIMARY)>25)& (PT>250*MeV) & (TRGHOSTPROB<0.3) " } PreselBu2JPsiKCommon.CombinationCut = "(ADAMASS('B+') < 600*MeV)" PreselBu2JPsiKCommon.MotherCut = "(BPVIPCHI2()< 25)& (VFASPF(VCHI2)<45) " _kaons = DataOnDemand(Location='Phys/StdNoPIDsKaons/Particles') return Selection("SelBu2KJPsiee", Algorithm=PreselBu2JPsiKCommon, RequiredSelections=[SelDJPsi, _kaons])
def _makeK0s2TwoProngs(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. """ if "mu+" in decay_descriptor: dname = "mu+" daughters = self.SelMuons else: dname = "pi+" daughters = self.SelPions K0s2MuMu = CombineParticles(DecayDescriptor = decay_descriptor) K0s2MuMu.DaughtersCuts = { dname : "(MIPCHI2DV(PRIMARY)> 100.)"} K0s2MuMu.CombinationCut = combcut + "& (AMAXDOCA('')<%(DiDOCA)s*mm)"% self.config K0s2MuMu.MotherCut = "("+ masscut + "& (BPVDIRA>0) & ((BPVVDSIGN*M/P) > %(KSlife)s) & (MIPDV(PRIMARY)<0.4*mm))" %self.config return Selection (name, Algorithm = K0s2MuMu, RequiredSelections = [ daughters])
def makeBs2XMuMu(name, DecayDescriptor, DaughterLists, BsMassWin, BsVCHI2DOF, BsDIRA, BsIPCHI2, BsFDCHI2): from Configurables import CombineParticles, OfflineVertexFitter combinerName = "Combine" + name _Bs = CombineParticles(combinerName) _Bs.DecayDescriptor = DecayDescriptor _Bs.CombinationCut = "ADAMASS('B_s0') < %(BsMassWin)s *MeV" % locals() _Bs.MotherCut = " (VFASPF(VCHI2/VDOF) < %(BsVCHI2DOF)s)" \ "& (BPVDIRA > %(BsDIRA)s)" \ "& (BPVIPCHI2() < %(BsIPCHI2)s)" \ "& (BPVVDCHI2 > %(BsFDCHI2)s)" % locals() # _Bs.ReFitPVs = True # Set the OfflineVertexFitter to keep the 4 tracks _Bs.addTool( OfflineVertexFitter ) _Bs.ParticleCombiners.update( { "" : "OfflineVertexFitter"} ) _Bs.OfflineVertexFitter.useResonanceVertex = False return Selection(name, Algorithm = _Bs, RequiredSelections = DaughterLists)
def makeTau2MuEtaPrime(self, name, config, setEtaPrime): """ tau -> mu eta' selection Please contact Guido Andreassi if you think of prescaling this line! Arguments: name : name of the Selection, configuration dictionary. """ if setEtaPrime == 'gamma': self.SelEtaPrime = makeEtaPrime2pipigamma( "selEtap_gamma", config['config_EtaPrime2pipigamma']) if setEtaPrime == 'pi0': self.SelEtaPrime = makeEtaPrime2pipipi( "selEtap_pi0", config['config_EtaPrime2pipipi']) Tau2MuEtaPrime = CombineParticles() Tau2MuEtaPrime.DecayDescriptor = "[tau+ -> mu+ eta_prime]cc " Tau2MuEtaPrime.ReFitPVs = True Tau2MuEtaPrime.DaughtersCuts = {"mu+": "{muplus_cuts}".format(**config)} Tau2MuEtaPrime.CombinationCut = "{tau_mass_window}".format(**config) Tau2MuEtaPrime.MotherCut = "{tau_cuts}".format(**config) _muons = DataOnDemand(Location="Phys/StdLooseMuons/Particles") return Selection(name, Algorithm=Tau2MuEtaPrime, RequiredSelections=[self.SelEtaPrime, _muons])
def makeBu2KSDDh(self, name, config): """ Create and store a B -> KS(DD) 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'] _daugMaxPtIPCut = "(AVAL_MAX(MIPDV(PRIMARY),PT)>%s)" % config[ 'BDaug_MaxPT_IP'] _daugPtSumCut = "((APT1+APT2)>%s*MeV)" % config['BDaug_DD_PTsum'] _combCuts = _daugPtSumCut + '&' + _massCutLow + '&' + _massCutHigh + '&' + _daugMaxPtIPCut _pCut = "(P>%s*MeV)" % config['B_Pmin'] _vtxChi2Cut = "(VFASPF(VCHI2)<%s)" % config['B_DD_VtxChi2'] _diraCut = "(BPVDIRA>%s)" % config['B_Dira'] _ipChi2Cut = "(MIPCHI2DV(PRIMARY)<%s)" % config['B_DD_IPCHI2wrtPV'] _fdCut = "(VFASPF(VMINVDDV(PRIMARY))>%s)" % config['B_FDwrtPV'] _fdChi2Cut = "(BPVVDCHI2>%s)" % config['B_DD_FDChi2'] _motherCuts = _pCut + '&' + _vtxChi2Cut + '&' + _diraCut + '&' + _ipChi2Cut + '&' + _fdCut + '&' + _fdChi2Cut _B = CombineParticles() _B.DecayDescriptors = ["B+ -> pi+ KS0", "B- -> pi- KS0"] _B.DaughtersCuts = {"pi+": "TRCHI2DOF<%s" % config['Trk_Chi2']} _B.CombinationCut = _combCuts _B.MotherCut = _motherCuts return Selection(name, Algorithm=_B, RequiredSelections=[self.selKS2DD, self.selH])
def __CreateSelectionRho__(self, lName, RhoCombCut, RhoCut, PionCut): ''' rho(770)0 -> pi+ pi- selection (from StdAllLoosePions) ''' from StandardParticles import StdAllLoosePions from GaudiConfUtils.ConfigurableGenerators import CombineParticles CombineRho = CombineParticles() CombineRho.InputPrimaryVertices = self.__PVOutputLocation__ CombineRho.DecayDescriptor = "rho(770)0 -> pi+ pi-" if (len(RhoCombCut) > 0): CombineRho.CombinationCut = RhoCombCut CombineRho.MotherCut = RhoCut CombineRho.DaughtersCuts = {"pi+": PionCut} from PhysSelPython.Wrappers import Selection SelRho = Selection("SelBuild_" + lName + "_Rho", Algorithm=CombineRho, RequiredSelections=[StdAllLoosePions]) return SelRho