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 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 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 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 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 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 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 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 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 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 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 __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
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 __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 __Selection_CreateK1__(self, lName, K1CombCut, K1Cut, KaonCut, PionCut, UseNoPIDsParticles): ''' Make K1 using StdNoPID common particles ''' from StandardParticles import StdAllNoPIDsPions, StdAllNoPIDsKaons, StdAllLooseKaons, StdAllLoosePions #just a test!!!!! _requires = [ StdAllNoPIDsKaons, StdAllNoPIDsPions ] if UseNoPIDsParticles else [StdAllLooseKaons, StdAllLoosePions] #_requires = [StdAllLooseKaons, StdAllLoosePions] from GaudiConfUtils.ConfigurableGenerators import CombineParticles CombineK1 = CombineParticles() CombineK1.DecayDescriptor = "[K_1(1270)+ -> K+ pi- pi+]cc" CombineK1.CombinationCut = K1CombCut CombineK1.MotherCut = K1Cut CombineK1.DaughtersCuts = {"K+": KaonCut, "pi-": PionCut} from PhysSelPython.Wrappers import Selection SelK1 = Selection( "Sel_" + lName + "_K1", Algorithm=CombineK1, RequiredSelections=_requires) #[StdNoPIDsPions, StdNoPIDsKaons]) return SelK1
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 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 _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 makeD2HHHInc(name, DaughterPT, DaughterP, DaughterIPChi2, Daughter2IPChi2, DaughterDOCA, DaughterDOCAChi2, PTSum, DDIRA, DIPChi2, DdcaFDChi2, DPt, DVXChi2NDOF, MinMassPosFit, MaxMassPosFit ): """ Create and return a D -> HHHInclusive selection Arguments: name : name of the Selection. pionSel : Pion Selection (from CommonParticles) DaughterPT : Minimum PT among daughters DaughterP : Minimum P among daughters DaughterIPChi2 : Minimum IPChi2 among daughters Daughter2IPChi2: Minimum IPChi2 required to at least 2 daughters DaughterDOCA : Maximum distance of closest approach between 2 daughters DaughterDOCAChi2:Maximum distance of closest approach between 2 daughters in error units PTSum : Minimum sum of daughters momenta DDIRA : Minimum opening angle between sum_p and FD-direction DIPChi2 : Maximum IPChi2 of the D DdcaFDChi2 : Minimum distance from SV to any PV DPt : Minimum D Momentum DVXChi2NDOF : Maximum Chi2 of the D Vertex MinMassPosFit : Minimum value of HHH invariant mass (MeV) MaxMassPosFit : Maximum value of HHH invariant mass (MeV). """ _DaughterCuts = "((MIPCHI2DV(PRIMARY)) > %(DaughterIPChi2)s ) & (P > %(DaughterP)s *MeV) & (PT > %(DaughterPT)s *MeV) " % locals() _Combcuts_HHH = "(ADOCACHI2CUT(%(DaughterDOCAChi2)s,'')) & (ADOCACUT(%(DaughterDOCA)s*mm,'')) & (ACHILD(PT,1)+ACHILD(PT,2)+ACHILD(PT,3) > %(PTSum)s*MeV) & (ANUM(MIPCHI2DV(PRIMARY) > %(Daughter2IPChi2)s ) >= 2) " % locals() _Mothercuts_HHH = """ (PT > %(DPt)s) & (VFASPF(VCHI2/VDOF) < %(DVXChi2NDOF)s) & (BPVDIRA > %(DDIRA)s) & (BPVIPCHI2() < %(DIPChi2)s) & (VFASPF(VMINVDCHI2DV(PRIMARY)) > %(DdcaFDChi2)s) """ % locals() _cutsMassPosFit = " (in_range ( %(MinMassPosFit)s , M , %(MaxMassPosFit)s )) " % locals() _combHHH = CombineParticles() _combHHH.DecayDescriptor = '[D+ -> pi- pi+ pi+]cc' _combHHH.DaughtersCuts = { "pi+" : '(' + _DaughterCuts + ')' } _combHHH.CombinationCut = '(' + _Combcuts_HHH + ')' _combHHH.MotherCut = '(' + _Mothercuts_HHH + ' & ' + _cutsMassPosFit + ')' return Selection ( name, Algorithm = _combHHH, RequiredSelections = [StdNoPIDsPions])
def _4jets( self, name, ptcut ): HighPT4Jets = CombineParticles() HighPT4Jets.ParticleCombiners = { "" : "LoKi::VertexFitter" } HighPT4Jets.IgnoreP2PVFromInputLocations = True HighPT4Jets.DecayDescriptor = "H_10 -> CELLjet CELLjet CELLjet CELLjet" HighPT4Jets.DaughtersCuts = { "CELLjet" : "PT > "+ptcut+"*MeV" } HighPT4Jets.CombinationCut = "(ADOCACHI2CUT(50, ''))" HighPT4Jets.MotherCut = "VFASPF(VCHI2PDOF) < 20" return HighPT4Jets
def _psi2s2jpsihh(self, name, jpsi, pions): """ Combine J/Psi and 2 pions to make psi(2S) """ _psi2S = CombineParticles() _psi2S.DecayDescriptor = "psi(2S) -> J/psi(1S) pi+ pi-" _psi2S.CombinationCut = "(ADAMASS('psi(2S)')<200*MeV)" _psi2S.MotherCut = "(ADMASS('psi(2S)')<200*MeV)" return Selection(name, Algorithm=_psi2S, RequiredSelections=[jpsi, pions, pions])
def _dSPlus(self, name, Pion, Kaons): """ Make Ds -> K K Pi """ _dsPlus = CombineParticles() _dsPlus.DecayDescriptor = "[D_s+ -> K+ K- pi+]cc" _dsPlus.MotherCut = "(ADMASS('D_s+') < 300 *MeV)" _dsPlusConf = _dsPlus.configurable("Combine_" + name + "_Dsplus") _selDsPlus = Selection("Selection_" + name + "_DsPlus", Algorithm=_dsPlusConf, RequiredSelections=[Pion, Kaons]) return _selDsPlus
def __Kstar__(self, Kaons, Pions, conf): """ Make a kstar """ _kstar2kpi = CombineParticles() _kstar2kpi.DecayDescriptor = "[K*(892)0 -> K+ pi-]cc" _kstar2kpi.MotherCut = self.__KpiCuts__(conf) _selKSTAR2KPI = Selection("Selection_" + self.name + "_Kstar", Algorithm=_kstar2kpi, RequiredSelections=[Kaons, Pions]) return _selKSTAR2KPI
def __Rho__(self, Pions, conf): """ Make a rho """ _rho2pipi = CombineParticles() _rho2pipi.DecayDescriptor = "rho(770)0 -> pi+ pi-" _rho2pipi.MotherCut = self.__KpiCuts__(conf) _selRHO2PIPI = Selection("Selection_" + self.name + "_Rho", Algorithm=_rho2pipi, RequiredSelections=[Pions]) return _selRHO2PIPI
def __Phi__(self, Kaons, conf): """ Make a phi """ _phi2kk = CombineParticles() _phi2kk.DecayDescriptor = "phi(1020) -> K+ K-" _phi2kk.MotherCut = self.__KpiCuts__(conf) _selPHI2KK = Selection("Selection_" + self.name + "_Phi", Algorithm=_phi2kk, RequiredSelections=[Kaons]) return _selPHI2KK
def __Kstar2KsPi__(self, Kshort, Pions, conf): """ Make a kstarplus """ _kstar2kspi = CombineParticles() _kstar2kspi.DecayDescriptor = "[K*(892)+ -> KS0 pi+]cc" _kstar2kspi.MotherCut = self.__KpiCuts__(conf) _selKSTAR2KSPI = Selection("Selection_" + self.name + "_Kstar2kspi", Algorithm=_kstar2kspi, RequiredSelections=[Kshort, Pions]) return _selKSTAR2KSPI
def __Bs__(self, Muons, Kaons, conf): """ Make and return a Bs selection """ _bs2KKmumu = CombineParticles() _bs2KKmumu.DecayDescriptor = "B_s0 -> K+ K- mu+ mu-" _bs2KKmumu.CombinationCut = "(ADAMASS('B_s0') < 1000.0 *MeV) & (AM12 < 1070.0 *MeV)" _bs2KKmumu.MotherCut = self.__BsCuts__(conf) SelBS2KKMUMU = Selection( "Selection_"+self.name, Algorithm = _bs2KKmumu, RequiredSelections = [ Muons, Kaons ] ) return SelBS2KKMUMU
def _dSStarPlus(self, name, DPlus, Gamma): """ Make Ds* -> Ds (=D_s+ for us) Gamma """ _dsstar = CombineParticles() _dsstar.DecayDescriptor = "[D*_s+ -> D_s+ gamma]cc" _dsstar.MotherCut = "(ADMASS('D*_s+') < 300 *MeV)" _dsstar.DaughtersCuts = {'gamma': '(CL > 0.25)'} _dsstarConf = _dsstar.configurable("Combine_" + name + "_Dsstar") _selDsSTAR = Selection("Selection_" + name + "_DsStar", Algorithm=_dsstarConf, RequiredSelections=[DPlus, Gamma]) return _selDsSTAR
def _myf0(self, name, pions): """ Copy of the stuff which makes the StdLooseDetachedDipion """ _f0 = CombineParticles() _f0.DecayDescriptor = "f_0(980) -> pi+ pi-" _f0.CombinationCut = "(AM<2700.0*MeV)" _f0.MotherCut = "(M<2700.0*MeV)" _f0Conf = _f0.configurable("Combine_" + name) _self0 = Selection("SelectionOff0For" + name, RequiredSelections=[pions], Algorithm=_f0Conf) return _self0