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 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("Combine" + name) Tau2PhiMu.DecayDescriptor = " [ tau+ -> phi(1020) mu+ ]cc" makePhi = CombineParticles(name + "makePhi") 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, SelPhi
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(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(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['HLT1'], HLT2=_config['HLT2'], algos=[_selection]) return _line
def makeBd(name) : """ detached Bd-->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) ## make Kstar makeKstar = CombineParticles("makeKstar") makeKstar.DecayDescriptor = "[K*(892)0 -> K+ pi-]cc" makeKstar.DaughtersCuts = {"K+": "(ISLONG) & (TRCHI2DOF < 3 ) "\ " & ( TRGHOSTPROB < 0.3 )"\ " & (MIPCHI2DV(PRIMARY)> 4.)& (PT>250*MeV)", "pi-":"(ISLONG) & (TRCHI2DOF < 3 ) "\ " & ( TRGHOSTPROB < 0.3 )"\ "& (MIPCHI2DV(PRIMARY)> 4.)& (PT>250*MeV)"} makeKstar.CombinationCut = "(ADAMASS('K*(892)0')<2000*MeV)"#huge, to allow to study JPsi K1 etc makeKstar.MotherCut = " (MIPCHI2DV(PRIMARY)> 25.)" _pions = DataOnDemand(Location='Phys/StdNoPIDsPions/Particles') _kaons = DataOnDemand(Location='Phys/StdNoPIDsKaons/Particles') SelKst = Selection( "SelKst", Algorithm= makeKstar, RequiredSelections=[_pions,_kaons] ) ## make BtoJPsiKstar PreselBd2JPsiKstCommon = CombineParticles("PreselBd2JPsiKstCommon") PreselBd2JPsiKstCommon.DecayDescriptor = "[B0 -> J/psi(1S) K*(892)0]cc" PreselBd2JPsiKstCommon.addTool( OfflineVertexFitter ) PreselBd2JPsiKstCommon.ParticleCombiners.update( { "" : "OfflineVertexFitter"} ) PreselBd2JPsiKstCommon.OfflineVertexFitter.useResonanceVertex = False PreselBd2JPsiKstCommon.ReFitPVs = True PreselBd2JPsiKstCommon.DaughtersCuts = {} PreselBd2JPsiKstCommon.CombinationCut = "(ADAMASS('B0') < 500*MeV)" PreselBd2JPsiKstCommon.MotherCut = "(BPVIPCHI2()< 25) & (VFASPF(VCHI2)<75)" return Selection( "SelBd2JPsiKstar", Algorithm = PreselBd2JPsiKstCommon, RequiredSelections=[SelDJPsi,SelKst] )
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 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 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 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 makeB2pMu(name): """ Please contact Johannes Albrecht if you think of prescaling this line! Arguments: name : name of the Selection. """ from Configurables import OfflineVertexFitter Bs2pMu = CombineParticles("Combine" + name) Bs2pMu.DecayDescriptor = "[B_s0 -> p+ mu-]cc" #Bs2pMu.addTool( OfflineVertexFitter ) #Bs2pMu.VertexFitters.update( { "" : "OfflineVertexFitter"} ) #Bs2pMu.OfflineVertexFitter.useResonanceVertex = False #Bs2pMu.ReFitPVs = True Bs2pMu.DaughtersCuts = { "mu+": "(MIPCHI2DV(PRIMARY)> 25.)&(TRCHI2DOF < 4 )", "p+": "(MIPCHI2DV(PRIMARY)> 25.)&(TRCHI2DOF < 4 )" } Bs2pMu.CombinationCut = "(ADAMASS('B_s0')<600*MeV)"\ "& (AMAXDOCA('')<0.3*mm)" Bs2pMu.MotherCut = "(VFASPF(VCHI2/VDOF)<9) "\ "& (ADMASS('B_s0') < 600*MeV )"\ "& (BPVDIRA > 0) "\ "& (BPVVDCHI2> 225)"\ "& (BPVIPCHI2()< 25) " _stdLooseMuons = DataOnDemand(Location="Phys/StdLooseMuons/Particles") _stdLooseProtons = DataOnDemand(Location="Phys/StdLooseProtons/Particles") return Selection(name, Algorithm=Bs2pMu, RequiredSelections=[_stdLooseMuons, _stdLooseProtons])
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 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 makeLambdac (localname, _RequiredSelections, config=default_config): _lambdacCP = CombineParticles(localname+"lambdacAlgorithm") _lambdacCP.DecayDescriptor = "[Lambda_c+ -> p+ pi+ K-]cc" _lambdacCP.DaughtersCuts = { "p+" : ("(TRPCHI2 > %(Protons4Lambdac_TRPCHI2)s) & " + " (PIDp > %(Protons4Lambdac_PIDp)s) & " + " (PT > %(Protons4Lambdac_PT)s) & " + " (P > %(Protons4Lambdac_minP)s) & " + " (PIDp - PIDK > %(Protons4Lambdac_PIDp-PIDK)s)" ) % config, "K-" : ("(TRPCHI2 > %(Kaon4Lambdac_TRPCHI2)s) &"+ "(PIDK > %(Kaon4Lambdac_PIDK)s) & "+ "(P > %(Kaon4Lambdac_minP)s) & "+ "(PT > %(Kaon4Lambdac_PT)s)" ) % config, "pi+" : ("(MIPCHI2DV(PRIMARY)> %(Pions4Lambdac_MINIPCHI2)s) &"+ " (TRPCHI2 > %(Pion4Lambdac_TRPCHI2)s) &"+ " (PIDK < %(Pion4Lambdac_PIDK)s) &"+ "(PT > %(Pion4Lambdac_PT)s)") % config } _lambdacCP.CombinationCut = ("(ADAMASS('Lambda_c+') < %(Lambdac_MassWindowLarge)s) & " + "(APT > %(Lambdac_MinAPT)s) & " + "(ADOCAMAX('') < %(Lambdac_MaxADOCA)s)" ) % config _lambdacCP.MotherCut = ("(VFASPF(VCHI2/VDOF) < %(Lambdac_ENDVERTEXCHI2)s) & "+ "(ADMASS('Lambda_c+') < %(Lambdac_MassWindowTight)s) & "+ "(BPVDIRA > %(Lambdac_BPVDIRA)s) & "+ "(BPVLTIME('PropertimeFitter/properTime:PUBLIC')>%(Lambdac_minTAU)s)" ) % config return Selection (name = localname + 'LcSelection', Algorithm=_lambdacCP, RequiredSelections = _RequiredSelections);
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 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 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 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 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 makeTau25Mu(name, config): """ Please contact Johannes Albrecht if you think of prescaling this line! Arguments: name : name of the Selection. """ Tau2MuMuMuMuMu = CombineParticles("Comine" + name) Tau2MuMuMuMuMu.DecayDescriptor = " [ tau+ -> mu+ mu+ mu+ mu- mu-]cc" Tau2MuMuMuMuMu.DaughtersCuts = { "mu+": " ( PT > 300 * MeV ) & ( TRGHOSTPROB < %(TrackGhostProb)s ) & ( TRCHI2DOF < 3 ) & ( BPVIPCHI2 () > 9 ) " % config } Tau2MuMuMuMuMu.CombinationCut = "(ADAMASS('tau+')<400*MeV)" Tau2MuMuMuMuMu.MotherCut = """ ( VFASPF(VCHI2) < 30 ) & ( (BPVLTIME () * c_light) > 100 * micrometer ) & ( BPVIPCHI2() < 225 ) """ _stdLooseMuons = DataOnDemand(Location="Phys/StdLooseMuons/Particles") return Selection(name, Algorithm=Tau2MuMuMuMuMu, RequiredSelections=[_stdLooseMuons])
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 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 makeDs23Pi(name): """ Please contact Johannes Albrecht if you think of prescaling this line! Arguments: name : name of the Selection. """ from Configurables import OfflineVertexFitter Ds2PiPiPi = CombineParticles("Comine" + name) Ds2PiPiPi.DecayDescriptor = " [ D_s+ -> pi+ pi+ pi- ]cc " Ds2PiPiPi.DaughtersCuts = { "pi+": " ( PT > 300 * MeV ) & ( TRCHI2DOF < 4 ) & ( BPVIPCHI2 () > 9 ) " } Ds2PiPiPi.CombinationCut = "(ADAMASS('D_s+')<80*MeV)" Ds2PiPiPi.MotherCut = """ ( VFASPF(VCHI2) < 15 ) & ( (BPVLTIME () * c_light) > 100 * micrometer ) & ( BPVIPCHI2() < 225 ) """ _stdLoosePions = DataOnDemand(Location="Phys/StdLoosePions/Particles") return Selection(name, Algorithm=Ds2PiPiPi, RequiredSelections=[_stdLoosePions])
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])
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 makeJPsi2mumu(name, MuonPT, MuonIPCHI2, JPsiPT, JPsiVCHI2): """ Create and return a JPsi -> Mu Mu Selection object. Starts from DataOnDemand 'Phys/StdLooseMuons/Particles'. Arguments: name : name of the Selection. MuonPT : Minimum transverse momentum of Mu (MeV). MuonIPCHI2 : Minimum impact parameter chi2 of Mu. JPsiPT : Minimum transverse momentum of JPsi (MeV). JPsiVCHI2 : Maximum JPsi vertex chi2 per degree of freedom. """ MuCuts = "(TRCHI2DOF < 5 )"\ "& (MIPCHI2DV(PRIMARY)> %(MuonIPCHI2)s)"\ "& (PT > %(MuonPT)s *MeV)" % locals() MotherCuts = "(VFASPF(VCHI2/VDOF)< %(JPsiVCHI2)s)"\ "& (PT > %(JPsiPT)s *MeV)"\ "& (ADMASS('J/psi(1S)') < 100*MeV )" % locals() _JPsi = CombineParticles("_" + name) _JPsi.DecayDescriptor = "J/psi(1S) -> mu+ mu-" _JPsi.DaughtersCuts = {"mu+": MuCuts} _JPsi.CombinationCut = "(ADAMASS('J/psi(1S)')<100*MeV) "\ "& (AMAXDOCA('')<0.3*mm)" _JPsi.MotherCut = MotherCuts _stdLooseMuons = DataOnDemand(Location="Phys/StdLooseMuons/Particles") return Selection(name, Algorithm=_JPsi, RequiredSelections=[_stdLooseMuons])
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 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 makeDs2PhiPi(name, config): """ Please contact Johannes Albrecht if you think of prescaling this line! Arguments: name : name of the Selection. """ Ds2PhiPi = CombineParticles("Comine" + name) Ds2PhiPi.DecayDescriptor = " [ D_s+ -> pi+ mu+ mu- ]cc " Ds2PhiPi.DaughtersCuts = { "pi+": " ( PT > 300 * MeV ) & ( TRGHOSTPROB < %(TrackGhostProb)s ) & ( TRCHI2DOF < 3 ) & ( BPVIPCHI2 () > 9 ) " % config, "mu+": " ( PT > 300 * MeV ) & ( TRGHOSTPROB < %(TrackGhostProb)s ) & ( TRCHI2DOF < 3 ) & ( BPVIPCHI2 () > 9 ) " % config } Ds2PhiPi.CombinationCut = "(ADAMASS('D_s+')<250*MeV) & in_range ( 970 * MeV , AM23 , 1070 * MeV )" Ds2PhiPi.MotherCut = """ ( VFASPF(VCHI2) < 15 ) & ( (BPVLTIME () * c_light) >100 * micrometer ) & ( BPVIPCHI2() < 225 ) """ _stdLoosePions = DataOnDemand(Location="Phys/StdLoosePions/Particles") _stdLooseMuons = DataOnDemand(Location="Phys/StdLooseMuons/Particles") return Selection(name, Algorithm=Ds2PhiPi, RequiredSelections=[_stdLooseMuons, _stdLoosePions])
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 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 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])
mergedKaons = NoPIDsParticleMaker('MergedKaons' , Particle = "kaon" , Input = "MergedEvent/Rec/ProtoP/Charged" , Output = "Phys/MergedKaons/Particles" , WriteP2PVRelations = False , InputPrimaryVertices = "Rec/Vertex/Primary" ) createEvent.Members.append(mergedPions) createEvent.Members.append(mergedKaons) _kaons = DataOnDemand(Location='/Event/Phys/MergedPions/Particles') _pions = DataOnDemand(Location='/Event/Phys/MergedKaons/Particles') combineA = CombineParticles('CombineA') combineA.DecayDescriptor = "D_s+ -> K+ K- pi+" combineA.MotherCut = "(mcMatch('D_s+ ==> K+ K- pi+', ['/Event/MergedEvent/Relations/MergedEvent/Rec/ProtoP/Charged'], '/Event/MergedEvent/MC/Particles'))" combineA.Preambulo = [ "from LoKiPhysMC.decorators import *", "from PartProp.Nodes import CC" ] combineB = CombineParticles('CombineB') combineB.DecayDescriptor = "D_s- -> K- K+ pi-" combineB.MotherCut = "(mcMatch('D_s- ==> K- K+ pi-', ['/Event/MergedEvent/Relations/MergedEvent/Rec/ProtoP/Charged'], '/Event/MergedEvent/MC/Particles'))" combineB.Preambulo = [ "from LoKiPhysMC.decorators import *", "from PartProp.Nodes import CC" ] #combineB.OutputLevel = 1 combineAB = CombineParticles('CombineAB') combineAB.DecayDescriptor = "B_s0 -> D_s- D_s+"
pion_Sel = Selection ( "pion_Sel" , Algorithm =pion_list , RequiredSelections = [ AutomaticData(Location = location) ] ) pion_Seq = SelectionSequence("pion_Seq", TopSelection = pion_Sel) from StandardParticles import StdLooseAllPhotons PhotonFilter = FilterDesktop("PhotonFilter", Code="(PT > 300.*MeV) & (CL > 0.1)") PhotonSel = Selection('PhotonSel', Algorithm=PhotonFilter, RequiredSelections=[StdLooseAllPhotons]) my_etap = CombineParticles("my_etap") my_etap.DecayDescriptor = "eta_prime -> rho(770)0 gamma" my_etap.MotherCut = "(ADMASS('eta_prime') < 100.*MeV)" # & (PT > 1500.*MeV) & (P > 4000.*MeV) " #& (VFASPF(VCHI2/VDOF) < 9.)" # "ALL" # my_etap_Sel = Selection("my_etap_Sel", Algorithm = my_etap, # RequiredSelections = [rho_Sel,StdLooseAllPhotons]) RequiredSelections = [rho_Sel,PhotonSel]) #my_etap_Seq = SelectionSequence("my_etap_Seq", TopSelection = my_etap_Sel) preambulo=[ "rho_px= CHILD (PX,1,1 ) " , "rho_py=CHILD (PY,1,1 )" , "rho_pz=CHILD (PZ,1,1 ) ", "rho_E= CHILD (E,1,1 ) " , "pi_px= CHILD (PX,2 ) " ,
def configure ( inputdata , ## the list of input files catalogs = [] , ## xml-catalogs (filled by GRID) castor = False , ## use the direct access to castor/EOS ? params = {} ) : ## configure Track <--> MC relation table import LoKiPhysMC.Track2MC_Configuration import LoKiMC.MC ## import DaVinci from Configurables import DaVinci, GaudiSequencer ## delegate the actual configurtaion to DaVinci dv = DaVinci ( DataType = '2011' , InputType = 'MDST', Lumi = True, Simulation = True, DDDBtag="MC11-20111102", CondDBtag="sim-20111111-vc-md100", HistogramFile = "mcd02kpi_tracks7_histo.root", TupleFile = "mcd02kpi_tracks7_ntuple.root", PrintFreq = 1000) from Configurables import DecayTreeTuple, FilterDesktop, TupleToolGeometry, CombineParticles from Configurables import MCDecayTreeTuple, TupleToolMCTruth, MCTupleToolHierarchy from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence, DataOnDemand from Configurables import CheckPV # First using CombineParticle to create the D0 ################################################################################ #from StandardParticles import StdAllNoPIDsPions, StdAllNoPIDsKaons _pions = DataOnDemand(Location='Phys/StdAllNoPIDsPions/Particles') _kaons = DataOnDemand(Location='Phys/StdAllNoPIDsKaons/Particles') _d2kpi = CombineParticles("d2kpi") _d2kpi.DecayDescriptor = "[D0 -> K- pi+]cc" _d2kpi.DaughtersCuts = { "K-" : "(PT > 500.0) & (0.0 < PIDK)", "pi+" : "(PT > 500.0) & (5.0 > PIDK)", "K+" : "(PT > 500.0) & (0.0 < PIDK)", "pi-" : "(PT > 500.0) & (5.0 > PIDK) " } _d2kpi.MotherCut = "(VFASPF(VCHI2/VDOF)<10)" _d2kpi.CombinationCut = "(ADAMASS('D0') < 50.0)" _d2kpi.Preambulo = [ "from LoKiPhysMC.decorators import *" , "from PartProp.Nodes import CC" ] #_d2kpi.ReFitPVs = True SelD2KPi = Selection( "SelD2KPi", Algorithm= _d2kpi, RequiredSelections=[_pions,_kaons] ) SeqD2KPi = SelectionSequence('SeqD2KPi',TopSelection = SelD2KPi) # Now the CheckPV method to filter algorithms c = CheckPV("OnePV") c.MinPVs = 1 # And a sequencer to put them together gseq = GaudiSequencer() gseq.Members = [ c, SeqD2KPi.sequence() ] ## define the input data setData ( inputdata , catalogs , castor ) ## get/create application manager gaudi = appMgr() # ## modify/update the configuration: # ## (1) create the algorithm alg = TrackFilter( 'TrackFilter' ) #seq = createSequencer() ## (2) replace the list of top level algorithm by # new list, which contains only *THIS* algorithm gaudi.setAlgorithms( [ gseq, alg ] ) return SUCCESS
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)"
from PhysSelPython.Wrappers import Selection, SelectionSequence, DataOnDemand #Truth matched commonparticles: _mainkaons = DataOnDemand(Location='Phys/StdMCKaons/Particles') _mainpions = DataOnDemand(Location='Phys/StdMCPions/Particles') # # MC matching # matchD2KKPi = "(mcMatch('D_s+ ==> K- K+ pi+'))" #matchKaons = "(mcMatch('[K+]cc'))" #matchPions = "(mcMatch('[pi+]cc'))" _maind2kkpi = CombineParticles("d2kkpiMain") _maind2kkpi.DecayDescriptor = "D_s+ -> K+ K- pi+" #_d2kkpi.DaughtersCuts = { "pi+" : matchPions, "K+" : matchKaons} _maind2kkpi.MotherCut = matchD2KKPi _maind2kkpi.Preambulo = [ "from LoKiPhysMC.decorators import *", "from PartProp.Nodes import CC" ] selD2KKPiMain = Selection( "DsPlusCandidates", Algorithm = _maind2kkpi, RequiredSelections=[_mainkaons, _mainpions]) seqD2KKPiMain = SelectionSequence('MCFilterMain',TopSelection = selD2KKPiMain) maintuple = DecayTreeTuple("out") maintuple.Decay = "[D_s+ -> K- K+ pi+]CC" maintuple.Inputs = [seqD2KKPiMain.outputLocation()]
KsLL = Selection( "Sel_KsLL", Algorithm = FilterDesktop(name = "KsLLFilter", Code = KsLLCuts ), RequiredSelections = [StdLooseKsLL]) #RequiredSelections = [DataOnDemand(Location = 'Phys/StdLooseKsLL/Particles')]) KsDD = Selection( "Sel_KsDD", Algorithm = FilterDesktop(name = "KsDDFilter", Code = KsDDCuts ), RequiredSelections = [StdLooseKsDD]) #RequiredSelections = [DataOnDemand(Location = 'Phys/StdLooseKsDD/Particles')]) Ks = MergedSelection("Ks", RequiredSelections = [KsLL, KsDD]) Phi = CombineParticles("Phi2KsKs") Phi.DecayDescriptor = 'phi(1020) -> KS0 KS0' #Cuts from the stripping line Phi.CombinationCut = "( (ACHILDCUT(CHILDCUT(ISLONG,1),1)) | (ACHILDCUT(CHILDCUT(ISLONG,1),2)) ) & (APT > %(Phi_PT_MIN)s *MeV) & (ADAMASS('phi(1020)')<%(Phi_MASS_RANGE)s +30*MeV) & (ACUTDOCACHI2(%(Phi_DOCACHI2_MAX)s,''))" %config Phi.MotherCut = "(ADMASS('phi(1020)')<%(Phi_MASS_RANGE)s*MeV) & (VFASPF(VCHI2/VDOF) < %(Phi_VCHI2NDOF_MAX)s)" %config Phi_Sel = Selection(name = "Sel_Phi2KsKs", Algorithm = Phi, RequiredSelections = [Ks])#[StdLooseKsDD,StdLooseKsLL]) Ds = CombineParticles("Ds2PhiPi") Ds.DecayDescriptor = '[D_s+ -> phi(1020) pi+]cc' Ds.DaughtersCuts = { '' : 'ALL' , 'phi(1020)' : '(ALL)' , 'pi+' : '(PT >150 *MeV) & (BPVIPCHI2() > 1.0) & ( TRCHI2DOF < 5 )& (TRGHOSTPROB<0.3)'}
from Configurables import CombineParticles, DecayTreeTuple from PhysSelPython.Wrappers import Selection, SelectionSequence, DataOnDemand # Selection for other loop _otherKaons = DataOnDemand(Location='/Event/NewEvent/Phys/OtherAllKaons/Particles') _otherPions = DataOnDemand(Location='/Event/NewEvent/Phys/OtherAllPions/Particles') _otherd2kkpi = CombineParticles("otherd2kkpi", InputPrimaryVertices="/Event/NewEvent/Rec/Vertex/Primary") _otherd2kkpi.DecayDescriptor = "D_s- -> K- K+ pi-" _otherd2kkpi.MotherCut = "(mcMatch('D_s- ==> K- K+ pi-', ['/Event/NewEvent/Relations/NewEvent/Rec/ProtoP/Charged'], '/Event/NewEvent/MC/Particles'))" _otherd2kkpi.Preambulo = [ "from LoKiPhysMC.decorators import *", "from PartProp.Nodes import CC" ] selD2KKPiOther = Selection("DsMinusCandidates", Algorithm = _otherd2kkpi, RequiredSelections=[_otherKaons, _otherPions], OutputBranch="NewEvent/Phys") #selD2KKPiOther.OutputLevel = 1 seqD2KKPiOther = SelectionSequence('MCFilterOther', TopSelection = selD2KKPiOther) othertuple = DecayTreeTuple("Ds2KKPiTuple", RootInTES='/Event/NewEvent') othertuple.Decay = "[D_s+ -> K- K+ pi+]CC" #othertuple.Inputs = [seqD2KKPi.outputLocation()] othertuple.Inputs = ['Phys/SelD2KKPiOther/Particles'] othertuple.ToolList = [] from Configurables import MCMatchObjP2MCRelator othertuple.addTupleTool('TupleToolKinematic')
# central settings # simulation = False year = "2016" magnetPolarity = "Down" ###################################################################################################### # if you are setting something wrong, it should die here... if year not in [ "2016" ]: raise RuntimeError(year + " is not a valid year") if magnetPolarity not in ["Up", "Down"]: raise RuntimeError(magnetPolarity + " is not a valid magnet polarity") ###################################################################################################### from Configurables import CombineParticles KsPiPi= CombineParticles("KsPiPi") KsPiPi.DecayDescriptor = "KS0 -> pi+ pi-" KsPiPi.CombinationCut = "ADAMASS('KS0')<100*MeV" KsPiPi.MotherCut = "(VFASPF(VCHI2/VDOF)<10)" KsPiPi.DaughtersCuts = { "pi+" : "ALL", "pi-" : "ALL" } KsPiPi.MotherCut = "(M > 400) & (M < 600) & (BPVVDCHI2 > 100.) & (VFASPF(VCHI2/VDOF) < 10)" from PhysSelPython.Wrappers import Selection from StandardParticles import StdNoPIDsDownPions, StdLoosePions LooseKsPiPi = Selection("SelLooseKsPiPi", Algorithm = KsPiPi, RequiredSelections = [StdNoPIDsDownPions ]) #RequiredSelections = [StdLoosePions]) from PhysSelPython.Wrappers import SelectionSequence SeqKsPiPi = SelectionSequence('SeqKsPiPi', TopSelection = LooseKsPiPi)
############### # Stripping filter strippingFilter = LoKi__HDRFilter( 'StripPassFilter', Code="HLT_PASS('Stripping"+line+"Decision')", Location="/Event/Strip/Phys/DecReports" ) evtPreselectors.append(strippingFilter) # Muons and kaons looseMuons = DataOnDemand(Location = 'Phys/StdLooseMuons/Particles') looseKaons = DataOnDemand(Location = 'Phys/StdLooseKaons/Particles') loosePions = DataOnDemand(Location = 'Phys/StdLoosePions/Particles') # Select Phi recoPhi = CombineParticles("Phi2KK") recoPhi.DecayDescriptor = 'phi(1020) -> K+ K-' recoPhi.DaughtersCuts = {"K+": "(ISLONG) & (TRCHI2DOF < 3 ) & (TRGHOSTPROB<0.3) & ( BPVIPCHI2 () > 9 ) & (PT>300*MeV) & (PIDK > 5)", "K-": "(ISLONG) & (TRCHI2DOF < 3 ) & (TRGHOSTPROB<0.3) & ( BPVIPCHI2 () > 9 ) & (PT>300*MeV) & (PIDK > 5)"} recoPhi.CombinationCut = "(ADAMASS('phi(1020)')<10*MeV)" recoPhi.MotherCut = " ( VFASPF(VCHI2) < 10 ) & (MIPCHI2DV(PRIMARY)> 16.)" # Very loose version for testing # recoPhi = CombineParticles("Phi2KK") # recoPhi.DecayDescriptor = 'phi(1020) -> K+ K-' # recoPhi.DaughtersCuts = {"K+": "(ISLONG) & (TRCHI2DOF < 3 ) & (TRGHOSTPROB<0.3) & ( BPVIPCHI2 () > 9 ) & (PT>300*MeV) & (PIDK > -5)", # "K-": "(ISLONG) & (TRCHI2DOF < 3 ) & (TRGHOSTPROB<0.3) & ( BPVIPCHI2 () > 9 ) & (PT>300*MeV) & (PIDK > -5)"} # recoPhi.CombinationCut = "(ADAMASS('phi(1020)')<35*MeV)" # recoPhi.MotherCut = " ( VFASPF(VCHI2) < 25 ) & (MIPCHI2DV(PRIMARY)> 4.)" phi_selection = Selection('SelPhi2KK', Algorithm = recoPhi, RequiredSelections = [ looseKaons ])