def makeBu2InflatonK(name, SelInflatonLong): """ detached Bu -> Inflaton K selection. Arguments: name : name of the Selection. """ from Configurables import OfflineVertexFitter Bu2InflatonK = CombineParticles("Combine" + name) Bu2InflatonK.DecayDescriptor = " [B+ -> KS0 K+]cc " Bu2InflatonK.addTool(OfflineVertexFitter) #Bu2InflatonK.VertexFitters.update( { "" : "OfflineVertexFitter"} ) Bu2InflatonK.ParticleCombiners.update({"": "OfflineVertexFitter"}) Bu2InflatonK.OfflineVertexFitter.useResonanceVertex = False Bu2InflatonK.ReFitPVs = True Bu2InflatonK.DaughtersCuts = { "K+": "(ISLONG) & (TRCHI2DOF < 3 ) &(MIPCHI2DV(PRIMARY)>25)& (PT>250*MeV) " } Bu2InflatonK.CombinationCut = "(ADAMASS('B+') < 500*MeV)" Bu2InflatonK.MotherCut = "(BPVIPCHI2()< 50)& (VFASPF(VCHI2)<100)& (D2DVVDDOT(1) > 0.3*mm)" _kaons = DataOnDemand(Location='Phys/StdLooseKaons/Particles') return Selection("Sel" + name, Algorithm=Bu2InflatonK, RequiredSelections=[SelInflatonLong, _kaons])
def makeBs2InflatonPhi(name, SelInflatonLong): """ detached Bs -> Inflaton Phi selection. Arguments: name : name of the Selection. """ from Configurables import OfflineVertexFitter _phi = DataOnDemand(Location='Phys/StdLooseDetachedPhi2KK/Particles') Bs2InflatonPhi = CombineParticles("Combine" + name) Bs2InflatonPhi.DecayDescriptor = "B_s0 -> KS0 phi(1020)" Bs2InflatonPhi.addTool(OfflineVertexFitter) #Bs2InflatonPhi.VertexFitters.update( { "" : "OfflineVertexFitter"} ) Bs2InflatonPhi.ParticleCombiners.update({"": "OfflineVertexFitter"}) Bs2InflatonPhi.OfflineVertexFitter.useResonanceVertex = False Bs2InflatonPhi.ReFitPVs = True Bs2InflatonPhi.DaughtersCuts = {"phi(1020)": "MIPCHI2DV(PRIMARY)> 25."} Bs2InflatonPhi.CombinationCut = "(ADAMASS('B_s0') < 500*MeV)" Bs2InflatonPhi.MotherCut = "(BPVIPCHI2()< 50)& (VFASPF(VCHI2)<100)& (D2DVVDDOT(1) > 0.3*mm)" return Selection("Sel" + name, Algorithm=Bs2InflatonPhi, RequiredSelections=[SelInflatonLong, _phi])
def makeBs2KstKst(name, Kstsel, BMassWin, BVCHI2, BDOCA, BIPCHI2): """ Create and return a Bs -> Kstar (Kpi) anti-Kstar (Kpi) Selection object. Arguments: name : name of the Selection. 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) & (MIPCHI2DV(PRIMARY)< %(BIPCHI2)s)" % locals( ) _combinationCut = "(ADAMASS('B_s0') < %(BMassWin)s *MeV) & (AMAXDOCA('')< %(BDOCA)s *mm)" % locals( ) _Bs = CombineParticles('_' + name) _Bs.DecayDescriptor = "B_s0 -> K*(892)0 K*(892)~0" _Bs.CombinationCut = _combinationCut _Bs.MotherCut = _motherCuts _Bs.ReFitPVs = True _Bs.addTool(OfflineVertexFitter) # _Bs.VertexFitters.update( { "" : "OfflineVertexFitter"} ) _Bs.ParticleCombiners.update({"": "OfflineVertexFitter" }) # Fix for DaVinci v32r0 by A.Poluektov _Bs.OfflineVertexFitter.useResonanceVertex = False return Selection(name, Algorithm=_Bs, RequiredSelections=[Kstsel])
def makeD2MuMuMuMu(name, inputSel): """ D --> 4 mu selection """ from Configurables import OfflineVertexFitter D2MuMuMuMu = CombineParticles("Combine" + name) D2MuMuMuMu.DecayDescriptor = "D0 -> mu+ mu- mu+ mu-" D2MuMuMuMu.addTool(OfflineVertexFitter) D2MuMuMuMu.ParticleCombiners.update({"": "OfflineVertexFitter"}) D2MuMuMuMu.DaughtersCuts = { "mu+" : "(TRCHI2DOF < 3.0 ) "\ " & (MIPCHI2DV(PRIMARY)> 4.)"\ " & (TRGHOSTPROB<0.3) "\ " & (P> 3000.*MeV)"} D2MuMuMuMu.CombinationCut = "(ADAMASS('D0')<300*MeV) "\ "& (AMAXDOCA('')<0.2*mm) " D2MuMuMuMu.MotherCut = "(VFASPF(VCHI2/VDOF)<12.) "\ "& (BPVVDZ > 0.) " \ "& (MIPCHI2DV(PRIMARY) < 25. )" return Selection(name, Algorithm=D2MuMuMuMu, RequiredSelections=inputSel)
def makeDefault(name) : """ default Bs2mumu selection object (tighter selection a la roadmap) starts from Phys/StdNoPIDsMuons Please contact Johannes Albrecht if you think of prescaling this line! Arguments: name : name of the Selection. """ from Configurables import OfflineVertexFitter Bs2MuMuNoMuID = CombineParticles("Comine"+name) Bs2MuMuNoMuID.DecayDescriptor = "B_s0 -> mu+ mu-" # Set the OfflineVertexFitter to keep the 4 tracks and not the J/Psi Kstar: Bs2MuMuNoMuID.addTool( OfflineVertexFitter() ) Bs2MuMuNoMuID.VertexFitters.update( { "" : "OfflineVertexFitter"} ) Bs2MuMuNoMuID.OfflineVertexFitter.useResonanceVertex = False Bs2MuMuNoMuID.ReFitPVs = True Bs2MuMuNoMuID.DaughtersCuts = { "mu+" : "(MIPCHI2DV(PRIMARY)> 25.)&(TRCHI2DOF < 4 )" } Bs2MuMuNoMuID.CombinationCut = "(ADAMASS('B_s0')<600*MeV)"\ "& (AMAXDOCA('')<0.3*mm)" Bs2MuMuNoMuID.MotherCut = "(VFASPF(VCHI2/VDOF)<9) "\ "& (ADMASS('B_s0') < 600*MeV )"\ "& (BPVDIRA > 0) "\ "& (BPVVDCHI2> 225)"\ "& (BPVIPCHI2()< 25) " _stdNoPIDsMuons = DataOnDemand(Location = "Phys/StdNoPIDsMuons/Particles") return Selection (name, Algorithm = Bs2MuMuNoMuID, RequiredSelections = [ _stdNoPIDsMuons])
def makeBu(name): """ detached Bu-->JPsiK selection. Selection is aligned to the Bs2MuMu selection. Please contact Johannes Albrecht if you think of prescaling this line! Arguments: name : name of the Selection. """ from Configurables import OfflineVertexFitter SelDJPsi = makeDetachedJPsi(name) PreselBu2JPsiKCommon = CombineParticles("PreselBu2JPsiKCommon") PreselBu2JPsiKCommon.DecayDescriptor = " [B+ -> J/psi(1S) K+]cc " PreselBu2JPsiKCommon.addTool(OfflineVertexFitter()) PreselBu2JPsiKCommon.VertexFitters.update({"": "OfflineVertexFitter"}) PreselBu2JPsiKCommon.OfflineVertexFitter.useResonanceVertex = False PreselBu2JPsiKCommon.ReFitPVs = True PreselBu2JPsiKCommon.DaughtersCuts = { "K+": "(ISLONG) & (TRCHI2DOF < 5 ) &(MIPCHI2DV(PRIMARY)>25)& (PT>250*MeV) " } PreselBu2JPsiKCommon.CombinationCut = "(ADAMASS('B+') < 500*MeV)" PreselBu2JPsiKCommon.MotherCut = "(BPVIPCHI2()< 25)& (VFASPF(VCHI2)<45) " _kaons = DataOnDemand(Location='Phys/StdNoPIDsKaons/Particles') return Selection("SelBu2JPsiK", Algorithm=PreselBu2JPsiKCommon, RequiredSelections=[SelDJPsi, _kaons])
def makeD2MuMuMuMu(name): """ D --> 4 mu selection should become inclusive bb-->4 mu selection ?? """ from Configurables import OfflineVertexFitter D2MuMuMuMu = CombineParticles("Combine" + name) D2MuMuMuMu.DecayDescriptor = "D0 -> mu+ mu- mu+ mu-" # Set the OfflineVertexFitter to keep the 4 tracks and not the J/Psi Kstar: D2MuMuMuMu.addTool(OfflineVertexFitter()) D2MuMuMuMu.VertexFitters.update({"": "OfflineVertexFitter"}) D2MuMuMuMu.OfflineVertexFitter.useResonanceVertex = False D2MuMuMuMu.ReFitPVs = True D2MuMuMuMu.DaughtersCuts = { "mu+" : "(TRCHI2DOF < 5 ) "\ " & (MIPCHI2DV(PRIMARY)> 9.)"} D2MuMuMuMu.CombinationCut = "(ADAMASS('D0')<1000*MeV) "\ "& (AMAXDOCA('')<0.3*mm) " D2MuMuMuMu.MotherCut = "(VFASPF(VCHI2/VDOF)<10) "\ "& (BPVDIRA > 0.9998) "\ "& (BPVVDCHI2>48.)"\ " & (M>864.83) & (M<2868.47)"\ "& (BPVIPCHI2()< 30) " _stdLooseMuons = DataOnDemand(Location="Phys/StdLooseMuons/Particles") return Selection(name, Algorithm=D2MuMuMuMu, RequiredSelections=[_stdLooseMuons])
def makeNoMuID(name, mupt=0, kspt=0): """ default K0s2mumu selection object starts from Phys/StdNoPIDsMuons Please contact Diego Martinez Santos if you think of prescaling this line! Arguments: name : name of the Selection. """ from Configurables import OfflineVertexFitter K0s2MuMuNoMuID = CombineParticles("Comine" + name) K0s2MuMuNoMuID.DecayDescriptor = "KS0 -> pi+ pi-" # Set the OfflineVertexFitter to keep the 4 tracks and not the J/Psi Kstar: K0s2MuMuNoMuID.addTool(OfflineVertexFitter) K0s2MuMuNoMuID.ParticleCombiners.update({"": "OfflineVertexFitter"}) K0s2MuMuNoMuID.OfflineVertexFitter.useResonanceVertex = False K0s2MuMuNoMuID.ReFitPVs = True K0s2MuMuNoMuID.DaughtersCuts = { "pi+": "(MIPCHI2DV(PRIMARY)> 100.)&(TRCHI2DOF < 5 ) & (PT >" + str(mupt) + " * MeV )" } K0s2MuMuNoMuID.CombinationCut = "(ADAMASS('KS0')<100*MeV)"\ "& (AMAXDOCA('')<0.3*mm)" K0s2MuMuNoMuID.MotherCut = "((BPVDIRA>0) & ((BPVVDSIGN*M/P) > 0.1*89.53*2.9979e-01) & (MIPDV(PRIMARY)<0.4*mm) & (M>400) & (M<600) & (PT > " + str( kspt) + " * MeV))" _stdNoPIDsPions = DataOnDemand(Location="Phys/StdNoPIDsPions/Particles") return Selection(name, Algorithm=K0s2MuMuNoMuID, RequiredSelections=[_stdNoPIDsPions])
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("Combine"+name) 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 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('')< %(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('_' + name) _Bs.DecayDescriptor = "B_s0 -> K*_0(1430)0 K*_0(1430)~0" _Bs.CombinationCut = _combinationCut _Bs.MotherCut = _motherCuts _Bs.ReFitPVs = True _Bs.addTool(OfflineVertexFitter) # _Bs.VertexFitters.update( { "" : "OfflineVertexFitter"} ) _Bs.ParticleCombiners.update({"": "OfflineVertexFitter" }) # Fix for DaVinci v32r0 by A.Poluektov _Bs.OfflineVertexFitter.useResonanceVertex = False return Selection(name, Algorithm=_Bs, RequiredSelections=[Kst_0sel])
def makeSidebandRegion(self, name): """ K0s2pi0mumu selection object in sideband region. Arguments: name : name of the Selection """ from Configurables import OfflineVertexFitter K0s2Pi0MuMu2 = CombineParticles("Combine" + name) K0s2Pi0MuMu2.DecayDescriptor = "KS0 -> pi0 J/psi(1S)" K0s2Pi0MuMu2.addTool(OfflineVertexFitter) K0s2Pi0MuMu2.ParticleCombiners.update({"": "OfflineVertexFitter"}) K0s2Pi0MuMu2.OfflineVertexFitter.useResonanceVertex = False K0s2Pi0MuMu2.ReFitPVs = True K0s2Pi0MuMu2.CombinationCut = " (AM > %(KSsidebminMass)s * MeV)"\ "& (AM < %(KSsidebmaxMass)s * MeV)" %self.config K0s2Pi0MuMu2.MotherCut = "((BPVDIRA> %(KSdira)s ) "\ "& ((BPVVDSIGN*M/P) > %(KSlife)s*2.9979e-01) "\ "& (MIPDV(PRIMARY)<%(KSip)s*mm) "\ "& (M> %(KSsidebminMass)s * MeV) "\ "& ( (M< %(KSsidebmaxMass)s * MeV) ))" %self.config return Selection( name, Algorithm=K0s2Pi0MuMu2, RequiredSelections=[self.PseudoJPsiSel, self._stdLoosePi0s])
def makeK0s2mm(name) : """ 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. """ from Configurables import OfflineVertexFitter K0s2MuMu = CombineParticles("Combine"+name) K0s2MuMu.DecayDescriptor = "KS0 -> mu+ mu-" K0s2MuMu.addTool( OfflineVertexFitter ) K0s2MuMu.ParticleCombiners.update( { "" : "OfflineVertexFitter"} ) K0s2MuMu.OfflineVertexFitter.useResonanceVertex = False K0s2MuMu.ReFitPVs = True K0s2MuMu.DaughtersCuts = { "mu+" : "(MIPCHI2DV(PRIMARY)> 100.)&(TRCHI2DOF < 5 )" } K0s2MuMu.CombinationCut ="(ADAMASS('KS0')<1000*MeV)"\ "& (AMAXDOCA('')<0.3*mm)" K0s2MuMu.MotherCut = "((BPVDIRA>0) & ((BPVVDSIGN*M/P) > 0.1*89.53*2.9979e-01) & (MIPDV(PRIMARY)<0.4*mm) & (M>450))" _stdLooseMuons = DataOnDemand(Location = "Phys/StdLooseMuons/Particles") return Selection (name, Algorithm = K0s2MuMu, RequiredSelections = [ _stdLooseMuons])
def _create_4jets(self, inputs, minPT=5 * GeV, LeadingPT=0 * GeV, Nsvtag=0): cmb_cuts = "(abs(ACHILD(BPV(VZ),1)-ACHILD(BPV(VZ),2))<1*mm) & (abs(ACHILD(BPV(VZ),1)-ACHILD(BPV(VZ),3))<1*mm) & (abs(ACHILD(BPV(VZ),1)-ACHILD(BPV(VZ),4))<1*mm)" _4jets = CombineParticles( "4JetCreatation" + str(minPT) + str(LeadingPT) + str(Nsvtag), ParticleCombiners={"": "LoKi::VertexFitter"}, DecayDescriptor="H_10 -> CELLjet CELLjet CELLjet CELLjet", CombinationCut=cmb_cuts, DaughtersCuts={"CELLjet": "(PT > " + str(minPT) + ")"}, MotherCut="((INTREE((ABSID=='CELLjet')&(PT>" + str(LeadingPT) + ")))&(INTREE((ABSID=='CELLjet')&(PINFO(9990,0)>0)))&(" + str(Nsvtag) + " < NINTREE((ABSID=='CELLjet')&(PINFO(9991,0) > 5 ))))") _4jets.addTool(LoKi__VertexFitter, name="LoKi::VertexFitter") vfitter = getattr(_4jets, "LoKi::VertexFitter") vfitter.Jets = "" return Selection( self._name + "4jets_PTmin" + str(minPT).split('*')[0] + "LeadPT" + str(LeadingPT).split('*')[0] + "Nsv" + str(Nsvtag) + "Selection", Algorithm=_4jets, RequiredSelections=inputs)
def makeKPiPiPiMassMeas(name, config): """ Line for the selection of K+ -> pi+ pi+ pi-, Before prescaling this line, please contact the authors listed above Arguments: name : name of the Selection. config : dictionary of tunable cuts """ from Configurables import OfflineVertexFitter KPiPiPi = CombineParticles("Combine" + name) KPiPiPi.DecayDescriptor = "[K+ -> pi+ pi+ pi-]cc" KPiPiPi.addTool(OfflineVertexFitter) KPiPiPi.ParticleCombiners.update({"": "OfflineVertexFitter"}) KPiPiPi.OfflineVertexFitter.useResonanceVertex = False KPiPiPi.DaughtersCuts = { "pi+": "(P>1000) & (MIPCHI2DV(PRIMARY) > 25.0) & (TRCHI2DOF<5) & (TRGHOSTPROB < 0.3)" } KPiPiPi.CombinationCut = "(ADAMASS('K+') < %(KMassWinMassMeas)s *MeV) & (AMAXDOCA('')< %(KMaxDOCAMassMeas)s *mm)" % config KPiPiPi.MotherCut ="(PT> %(KMinPTMassMeas)s) & (ADMASS('K+') < %(KMassWinMassMeas)s *MeV) & (BPVDIRA > %(KMinDIRAMassMeas)s)"\ "& (VFASPF(VCHI2) < %(KVtxChi2MassMeas)s) & (BPVVDCHI2 > %(KMinVDChi2MassMeas)s) & (BPVIPCHI2()< %(KMaxIpChi2MassMeas)s )"%config _stdAllLoosePions = DataOnDemand( Location="Phys/StdAllLoosePions/Particles") return Selection(name, Algorithm=KPiPiPi, RequiredSelections=[_stdAllLoosePions])
def makeDetachedJPsiLoose(name): """ loose detached JPsi selection to monitor selection, systematics from cuts, etc. prescaled Arguments: name : name of the Selection. """ from Configurables import OfflineVertexFitter DetachedJPsiLoose = CombineParticles("Combine" + name) DetachedJPsiLoose.DecayDescriptor = "J/psi(1S) -> mu+ mu-" # Set the OfflineVertexFitter to keep the 4 tracks and not the J/Psi Kstar: DetachedJPsiLoose.addTool(OfflineVertexFitter()) DetachedJPsiLoose.VertexFitters.update({"": "OfflineVertexFitter"}) DetachedJPsiLoose.OfflineVertexFitter.useResonanceVertex = False DetachedJPsiLoose.ReFitPVs = True DetachedJPsiLoose.DaughtersCuts = { "mu+" : "(TRCHI2DOF < 10 ) "\ "& (MIPCHI2DV(PRIMARY)> 9.)"} DetachedJPsiLoose.CombinationCut = "(ADAMASS('J/psi(1S)')<120*MeV) "\ "& (AMAXDOCA('')<0.5*mm)" DetachedJPsiLoose.MotherCut = "(VFASPF(VCHI2)<25) "\ "& (ADMASS('J/psi(1S)') < 120*MeV )"\ "& (BPVDIRA > 0) "\ "& (BPVVDCHI2>100)" _stdLooseMuons = DataOnDemand(Location="Phys/StdLooseMuons/Particles") return Selection(name, Algorithm=DetachedJPsiLoose, RequiredSelections=[_stdLooseMuons])
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("Combine" + name) 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 < 4 ) "\ "& (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 makePromptJPsi(name): """ Prompt variant of the detached JPsi selection for B--> JPsi X calibration and normalization channels. Selection is aligned to the Bs2MuMu selection. heavily prescaled Arguments: name : name of the Selection. """ from Configurables import OfflineVertexFitter PromptJPsi = CombineParticles("Combine" + name) PromptJPsi.DecayDescriptor = "J/psi(1S) -> mu+ mu-" # Set the OfflineVertexFitter to keep the 4 tracks and not the J/Psi Kstar: PromptJPsi.addTool(OfflineVertexFitter()) PromptJPsi.VertexFitters.update({"": "OfflineVertexFitter"}) PromptJPsi.OfflineVertexFitter.useResonanceVertex = False PromptJPsi.ReFitPVs = True PromptJPsi.DaughtersCuts = {"mu+": "(TRCHI2DOF < 4 ) "} PromptJPsi.CombinationCut = "(ADAMASS('J/psi(1S)')<100*MeV) "\ "& (AMAXDOCA('')<0.3*mm)" PromptJPsi.MotherCut = "(VFASPF(VCHI2)<15) "\ "& (ADMASS('J/psi(1S)') < 100*MeV )" _stdLooseMuons = DataOnDemand(Location="Phys/StdLooseMuons/Particles") return Selection(name, Algorithm=PromptJPsi, RequiredSelections=[_stdLooseMuons])
def makeBs2PhiKst(name, Phisel, Kstsel, BMassWin, BVCHI2, BDOCA): """ 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)" % locals() _combinationCut = "(ADAMASS('B_s0') < %(BMassWin)s *MeV) & (AMAXDOCA('')< %(BDOCA)s *mm)" % locals( ) _Bs = CombineParticles('_' + name) _Bs.DecayDescriptor = "[B_s0 -> phi(1020) K*(892)~0]cc" _Bs.CombinationCut = _combinationCut _Bs.MotherCut = _motherCuts _Bs.ReFitPVs = True _Bs.addTool(OfflineVertexFitter()) _Bs.VertexFitters.update({"": "OfflineVertexFitter"}) _Bs.OfflineVertexFitter.useResonanceVertex = False return Selection(name, Algorithm=_Bs, RequiredSelections=[Phisel, Kstsel])
def SelWDiJets(name, conf, desc, sel_W, TOS_HLT2=None): """ Create the combination of W + DiJets """ ## Create CombineParticle, with caveat on jet combining. DiJet = CombineParticles("Combine" + name) DiJet.ParticleCombiners = {"": "LoKi::VertexFitter"} DiJet.addTool(LoKi__VertexFitter, name="LoKi::VertexFitter") vfitter = getattr(DiJet, "LoKi::VertexFitter") vfitter.Jets = "" ## Apply cuts, with TOS optionally # Asking AT LEAST one of the jet to be TOSed by given trigger. ccut = "AALLSAMEBPV "\ "& ( dr_13 > %(dr_lepton_jet)s )"\ "& ( dr_23 > %(dr_lepton_jet)s )" %conf if TOS_HLT2: cut_tos = "(TOS('%s','Hlt2TriggerTisTos'))" % TOS_HLT2 cut_tosjet = '(ACHILDCUT({0}, 1) | ACHILDCUT({0}, 2))'.format(cut_tos) ccut += ('&' + cut_tosjet) DiJet.Preambulo = preambulo DiJet.DecayDescriptor = desc DiJet.DaughtersCuts = {"CELLjet": "(PT > %(min_jet_pT)s)" % conf} DiJet.CombinationCut = ccut DiJet.MotherCut = "ALL" return Selection(name, Algorithm=DiJet, RequiredSelections=[sel_W, StdJets])
def makeBs2mmWide(name): """ Bs2mumu selection object (tighter selection a la roadmap) with muon Id and wide mass window (1.2GeV) starts from Phys/StdLooseMuons Please contact Johannes Albrecht if you think of prescaling this line! Arguments: name : name of the Selection. """ from Configurables import OfflineVertexFitter Bs2MuMuWideMass = CombineParticles("Combine" + name) Bs2MuMuWideMass.DecayDescriptor = "B_s0 -> mu+ mu-" Bs2MuMuWideMass.addTool(OfflineVertexFitter()) Bs2MuMuWideMass.VertexFitters.update({"": "OfflineVertexFitter"}) Bs2MuMuWideMass.OfflineVertexFitter.useResonanceVertex = False Bs2MuMuWideMass.ReFitPVs = True Bs2MuMuWideMass.DaughtersCuts = { "mu+": "(MIPCHI2DV(PRIMARY)> 25.)&(TRCHI2DOF < 4 )" } Bs2MuMuWideMass.CombinationCut = "(ADAMASS('B_s0')<1200*MeV)"\ "& (AMAXDOCA('')<0.3*mm)" Bs2MuMuWideMass.MotherCut = "(VFASPF(VCHI2/VDOF)<9) "\ "& (ADMASS('B_s0') < 1200*MeV )"\ "& (BPVDIRA > 0) "\ "& (BPVVDCHI2> 225)"\ "& (BPVIPCHI2()< 25) " _stdLooseMuons = DataOnDemand(Location="Phys/StdLooseMuons/Particles") return Selection(name, Algorithm=Bs2MuMuWideMass, RequiredSelections=[_stdLooseMuons])
def makeBd2InflatonRho(name, SelInflatonLong, SelRho) : """ detached Bd -> Inflaton rho selection. Arguments: name : name of the Selection. """ from Configurables import OfflineVertexFitter Bd2InflatonRho = CombineParticles("Combine"+name) Bd2InflatonRho.DecayDescriptor = "B0 -> KS0 rho(770)0" Bd2InflatonRho.addTool( OfflineVertexFitter ) #Bd2InflatonRho.VertexFitters.update( { "" : "OfflineVertexFitter"} ) Bd2InflatonRho.ParticleCombiners.update( { "" : "OfflineVertexFitter"} ) Bd2InflatonRho.OfflineVertexFitter.useResonanceVertex = False Bd2InflatonRho.ReFitPVs = True Bd2InflatonRho.DaughtersCuts = { "rho(770)0" : "MIPCHI2DV(PRIMARY)> 25."} Bd2InflatonRho.CombinationCut = "(ADAMASS('B0') < 500*MeV)" Bd2InflatonRho.MotherCut = "(BPVIPCHI2()< 50) & (VFASPF(VCHI2)<100)& (D2DVVDDOT(1) > 0.3*mm)" return Selection( "Sel"+name, Algorithm = Bd2InflatonRho, RequiredSelections=[SelInflatonLong, SelRho] )
def makeDetachedJPsi(name): """ detached JPsi selection for B--> JPsi X calibration and normalization channels. Selection is aligned to the Bs2MuMu selection. Please contact Johannes Albrecht if you think of prescaling this line! Arguments: name : name of the Selection. """ from Configurables import OfflineVertexFitter DetachedJPsi = CombineParticles("Combine" + name) DetachedJPsi.DecayDescriptor = "J/psi(1S) -> mu+ mu-" # Set the OfflineVertexFitter to keep the 4 tracks and not the J/Psi Kstar: DetachedJPsi.addTool(OfflineVertexFitter()) DetachedJPsi.VertexFitters.update({"": "OfflineVertexFitter"}) DetachedJPsi.OfflineVertexFitter.useResonanceVertex = False DetachedJPsi.ReFitPVs = True DetachedJPsi.DaughtersCuts = { "mu+" : "(TRCHI2DOF < 4 ) "\ "& (MIPCHI2DV(PRIMARY)> 25.)"} DetachedJPsi.CombinationCut = "(ADAMASS('J/psi(1S)')<100*MeV) "\ "& (AMAXDOCA('')<0.3*mm)" DetachedJPsi.MotherCut = "(VFASPF(VCHI2)<9) "\ "& (ADMASS('J/psi(1S)') < 100*MeV )"\ "& (BPVDIRA > 0) "\ "& (BPVVDCHI2>169)" _stdLooseMuons = DataOnDemand(Location="Phys/StdLooseMuons/Particles") return Selection(name, Algorithm=DetachedJPsi, RequiredSelections=[_stdLooseMuons])
def makeDownstream(name): """ very very detached dimuon selection with downstream tracks """ from Configurables import OfflineVertexFitter Detached2mu = CombineParticles("Combine" + name) Detached2mu.DecayDescriptor = "KS0 -> mu+ mu-" Detached2mu.addTool(OfflineVertexFitter) #Detached2mu.VertexFitters.update( { "" : "OfflineVertexFitter"} ) Detached2mu.ParticleCombiners.update({"": "OfflineVertexFitter"}) Detached2mu.OfflineVertexFitter.useResonanceVertex = False Detached2mu.ReFitPVs = True Detached2mu.DaughtersCuts = { "mu+" : "(TRCHI2DOF < 4 ) "\ " & (MIPCHI2DV(PRIMARY)> 150)"\ "& (PT > 125*MeV) "\ "& (PIDmu > -4)"} Detached2mu.CombinationCut = " (AMAXDOCA('')<0.2*mm)" #"(ADAMASS('B_s0')<1000*MeV) "\ Detached2mu.MotherCut = "(VFASPF(VCHI2/VDOF)<12) "\ "& (M>250)"\ "& (BPVDIRA > 0) "\ "& (BPVVDCHI2>1000)"\ "& (BPVVD>200)" _stdLooseDownMuons = DataOnDemand( Location="Phys/StdLooseDownMuons/Particles") return Selection(name, Algorithm=Detached2mu, RequiredSelections=[_stdLooseDownMuons])
def makeBd2JPsiKst(name, JPsisel, Kstsel, BMassWin, BVCHI2, BDOCA, BIPCHI2): """ Create and return a Bd -> JPsi(mumu) Kstar (Kpi) Selection object. Arguments: name : name of the Selection. JPsisel : JPsi -> mu+ mu- Selection object. Kstsel : Kst -> K+pi- Selection object. BMassWin : Bd invariant mass window around PDG mass value (MeV). BVCHI2 : Maximum Bd vertex chi2 per degree of freedom. BDOCA : Maximum Bd DOCA. """ _motherCuts = " (VFASPF(VCHI2/VDOF) < %(BVCHI2)s) & (MIPCHI2DV(PRIMARY)< %(BIPCHI2)s)" % locals( ) _combinationCut = "(ADAMASS('B_s0') < %(BMassWin)s *MeV) & (AMAXDOCA('')< %(BDOCA)s *mm)" % locals( ) _Bd = CombineParticles('_' + name) _Bd.DecayDescriptor = "[B0 -> J/psi(1S) K*(892)0]cc" _Bd.CombinationCut = _combinationCut _Bd.MotherCut = _motherCuts _Bd.ReFitPVs = True _Bd.addTool(OfflineVertexFitter) # _Bd.VertexFitters.update( { "" : "OfflineVertexFitter"} ) _Bd.ParticleCombiners.update({"": "OfflineVertexFitter" }) # Fix for DaVinci v32r0 by A.Poluektov _Bd.OfflineVertexFitter.useResonanceVertex = False return Selection(name, Algorithm=_Bd, RequiredSelections=[JPsisel, Kstsel])
def makeBd2InflatonKst(name, SelInflatonLong): """ detached Bd -> Inflaton K* selection. Arguments: name : name of the Selection. """ from Configurables import OfflineVertexFitter _kstar = DataOnDemand(Location='Phys/StdLooseDetachedKst2Kpi/Particles') Bd2InflatonKst = CombineParticles("Combine" + name) Bd2InflatonKst.DecayDescriptor = "[B0 -> KS0 K*(892)0]cc" Bd2InflatonKst.addTool(OfflineVertexFitter) #Bd2InflatonKst.VertexFitters.update( { "" : "OfflineVertexFitter"} ) Bd2InflatonKst.ParticleCombiners.update({"": "OfflineVertexFitter"}) Bd2InflatonKst.OfflineVertexFitter.useResonanceVertex = False Bd2InflatonKst.ReFitPVs = True Bd2InflatonKst.DaughtersCuts = {"K*(892)0": "MIPCHI2DV(PRIMARY)> 25."} Bd2InflatonKst.CombinationCut = "(ADAMASS('B0') < 500*MeV)" Bd2InflatonKst.MotherCut = "(BPVIPCHI2()< 50) & (VFASPF(VCHI2)<100)& (D2DVVDDOT(1) > 0.3*mm)" return Selection("Sel" + name, Algorithm=Bd2InflatonKst, RequiredSelections=[SelInflatonLong, _kstar])
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("Combine" + name) Bs2ee.DecayDescriptor = "B_s0 -> e+ e-" # Set the OfflineVertexFitter to keep the 4 tracks and not the J/Psi Kstar: Bs2ee.addTool(OfflineVertexFitter()) Bs2ee.VertexFitters.update({"": "OfflineVertexFitter"}) Bs2ee.OfflineVertexFitter.useResonanceVertex = False #Bs2ee.ReFitPVs = True Bs2ee.DaughtersCuts = {"e+": "(MIPCHI2DV(PRIMARY)> 25.)&(TRCHI2DOF < 4 )"} Bs2ee.CombinationCut = "(ADAMASS('B_s0')<600*MeV)"\ "& (AMAXDOCA('')<0.3*mm)" Bs2ee.MotherCut = "(VFASPF(VCHI2/VDOF)<9) "\ "& (ADMASS('B_s0') < 600*MeV )"\ "& (BPVDIRA > 0) "\ "& (BPVVDCHI2> 225)"\ "& (BPVIPCHI2()< 25) " _stdLooseElectrons = DataOnDemand( Location="Phys/StdLooseElectrons/Particles") return Selection(name, Algorithm=Bs2ee, RequiredSelections=[_stdLooseElectrons])
def makeJetGroup(self, _name, njets, ptcut=0): JetGroup = CombineParticles("Combine" + _name) if njets == 2: JetGroup.DecayDescriptor = "H_10 -> CELLjet CELLjet" elif njets == 4: JetGroup.DecayDescriptor = "H_10 -> CELLjet CELLjet CELLjet CELLjet" elif njets == 6: JetGroup.DecayDescriptor = "H_10 -> CELLjet CELLjet CELLjet CELLjet CELLjet CELLjet" elif njets == 8: JetGroup.DecayDescriptor = "H_10 -> CELLjet CELLjet CELLjet CELLjet CELLjet CELLjet CELLjet CELLjet" else: raise ValueError JetGroup.ParticleCombiners = {"": "LoKi::VertexFitter"} JetGroup.addTool(LoKi__VertexFitter, name="LoKi::VertexFitter") vfitter = getattr(JetGroup, "LoKi::VertexFitter") vfitter.Jets = "" if ptcut == 1: JetGroup.DaughtersCuts = { "CELLjet": " (PT > %(min_jet_pT)s ) " % self._config } elif ptcut == 2: JetGroup.DaughtersCuts = { "CELLjet": " (PT > %(min_jet_pT_ExclusiveDiJet)s ) " % self._config } JetGroup.MotherCut = "ALL" requiredSelections = [self.__taggedJets] return Selection("Sel" + _name, Algorithm=JetGroup, RequiredSelections=requiredSelections)
def makeDefault(name, inputSel): """ B --> 4 mu selection should become inclusive bb-->4 mu selection ?? """ from Configurables import OfflineVertexFitter Detached4mu = CombineParticles("Combine" + name) Detached4mu.DecayDescriptor = "B_s0 -> mu+ mu- mu+ mu-" # Set the OfflineVertexFitter to keep the 4 tracks and not the J/Psi Kstar: Detached4mu.addTool(OfflineVertexFitter) Detached4mu.VertexFitters.update({"": "OfflineVertexFitter"}) Detached4mu.OfflineVertexFitter.useResonanceVertex = False Detached4mu.ReFitPVs = True Detached4mu.DaughtersCuts = { "mu+" : "(TRCHI2DOF < 2.5 ) "\ " & (MIPCHI2DV(PRIMARY)> 9.)"} Detached4mu.CombinationCut = "(ADAMASS('B_s0')<1000*MeV) "\ "& (AMAXDOCA('')<0.3*mm)" Detached4mu.MotherCut = "(VFASPF(VCHI2/VDOF)<9) "\ "& (BPVDIRA > 0) "\ "& (BPVVDCHI2>100)"\ " & (M>4366.3) & (M<6366.3)"\ "& (BPVIPCHI2()< 25) " return Selection(name, Algorithm=Detached4mu, RequiredSelections=inputSel)
def makeJetGroup(self, name, config): JetGroup = CombineParticles("Combine" + name) JetGroup.DecayDescriptor = "H_10 -> CELLjet CELLjet" JetGroup.ParticleCombiners = {"": "LoKi::VertexFitter"} JetGroup.addTool(LoKi__VertexFitter, name="LoKi::VertexFitter") vfitter = getattr(JetGroup, "LoKi::VertexFitter") vfitter.Jets = "" JetGroup.DaughtersCuts = { "CELLjet": " (PT > %(min_jet_pT)s ) " % config } JetGroup.CombinationCut = "AALLSAMEBPV " JetGroup.MotherCut = "ALL" ## TOS_HLT2 on-demand hlt = config['TOS_HLT2'] if hlt: JetGroup.MotherCut += '& (TOS("%s", "Hlt2TriggerTisTos"))' % hlt requiredSelections = [DataOnDemand(Location="Phys/StdJets/Particles")] return Selection("Sel" + name, Algorithm=JetGroup, RequiredSelections=requiredSelections)
def makeDefault(name): """ very detached JPSi selection """ from Configurables import OfflineVertexFitter Detached2mu = CombineParticles("Combine" + name) Detached2mu.DecayDescriptor = "J/psi(1S) -> mu+ mu-" Detached2mu.addTool(OfflineVertexFitter) Detached2mu.VertexFitters.update({"": "OfflineVertexFitter"}) Detached2mu.OfflineVertexFitter.useResonanceVertex = False Detached2mu.ReFitPVs = True Detached2mu.DaughtersCuts = { "mu+" : "(TRCHI2DOF < 4 ) "\ " & (MIPCHI2DV(PRIMARY)> 100)"\ "& (PT > 0.7) "} Detached2mu.CombinationCut = " (AMAXDOCA('')<0.1*mm)" #"(ADAMASS('B_s0')<1000*MeV) "\ Detached2mu.MotherCut = "(VFASPF(VCHI2/VDOF)<15) "\ "& (M>1500)"\ "& (BPVDIRA > 0) "\ "& (BPVVDCHI2>625)"\ "& (BPVVD>50)" _stdLooseMuons = DataOnDemand(Location="Phys/StdLooseMuons/Particles") return Selection(name, Algorithm=Detached2mu, RequiredSelections=[_stdLooseMuons])
from os import environ import GaudiKernel.SystemOfUnits as Units from Gaudi.Configuration import * from Configurables import CombineParticles, PhysDesktop from Configurables import LoKi__Hybrid__PlotTool as PlotTool importOptions("$DAVINCIROOT/options/DaVinciCommon.opts") ApplicationMgr().TopAlg += ["GaudiSequencer/TutorialSeq"] jpsi2mumu = CombineParticles("Jpsi2MuMu") jpsi2mumu.addTool(PhysDesktop()) jpsi2mumu.PhysDesktop.InputLocations = ["Phys/StdLooseMuons"] jpsi2mumu.DecayDescriptor = "J/psi(1S) -> mu+ mu-" jpsi2mumu.DaughtersCuts = {"mu+": "ALL", "mu-": "ALL"} jpsi2mumu.CombinationCut = "ADAMASS('J/psi(1S)')<30" jpsi2mumu.MotherCut = "(VFASPF(VCHI2/VDOF)<100)" GaudiSequencer("TutorialSeq").Members.append(jpsi2mumu) phi2kk = CombineParticles("Phi2KK") phi2kk.addTool(PhysDesktop()) phi2kk.PhysDesktop.InputLocations = ["Phys/StdLooseKaons"] phi2kk.DecayDescriptor = "phi(1020) -> K+ K-" phi2kk.CombinationCut = "ADAMASS('phi(1020)')<50" phi2kk.MotherCut = "(VFASPF(VCHI2/VDOF)<100)" GaudiSequencer("TutorialSeq").Members.append(phi2kk) bs2jpsiphi = CombineParticles("Bs2JpsiPhi") bs2jpsiphi.addTool(PhysDesktop()) bs2jpsiphi.PhysDesktop.InputLocations = ["Phys/Jpsi2MuMu", "Phys/Phi2KK"] bs2jpsiphi.DecayDescriptor = "B_s0 -> phi(1020) J/psi(1S)"