def topoSubPID(name, inputs): sub = SubstitutePID(name + 'SubPID', Code="DECTREE('X0 -> X X')") sub.MaxChi2PerDoF = -666 sub.Substitutions = {'X0 -> X X': 'B0'} sel = Selection(name + 'FinalSel', Algorithm=sub, RequiredSelections=[inputs]) filter = "INTREE(ID=='B0')" return filterSelection(name, filter, [sel])
def subPID(name,p,d,inputs): sub = SubstitutePID(name+'SubPIDBeauty2XGamma', Code="DECTREE('X0 -> X+ X-')") sub.MaxChi2PerDoF = -666 sub.Substitutions = {'X0 -> ^X+ X-' : d[0],'X0 -> X+ ^X-' : d[1], 'X0 -> X+ X-' : p} sel = Selection(name+'Beauty2XGammaSel',Algorithm=sub, RequiredSelections=inputs) filter = "INTREE(ID=='%s') & INTREE(ID=='%s') & INTREE(ID=='%s')" \ % (p,d[0],d[1]) return filterSelection(name,filter,[sel])
def makeB2DstarX(sel, uppions, config): # change B to something that doesn't fly sub = SubstitutePID('SubPID' + sel.name(), Code="DECTREE('Beauty -> Charm ...')") sub.MaxChi2PerDoF = -666 sub.Substitutions = {'Beauty -> Charm ...': 'J/psi(1S)'} subsel = Selection(sel.name() + 'DstarUPSel', Algorithm=sub, RequiredSelections=[sel]) filter = "INTREE(ID=='J/psi(1S)')" subsel = filterSelection(sel.name() + 'DstarUPFilter', filter, [subsel]) # Delta M cut on D* (preambulo is below) #dmcut = '((ISD1 & ((MD1PI-MD1) < 180)) | (ISD2 & ((MD2PI-MD2) < 180)))' #dmcut = '((MD1PI-MD1) < 180) | ((MD2PI-MD2) < 180)' dmcut = "((((IDD1==421)|(IDD1==411)) & ((MD1PI-MD1) < 180)) | (((IDD2==421)|(IDD2==411)) & ((MD2PI-MD2) < 180)))" # add UP track combConfig = {'AMAXDOCA_MAX': '0.5*mm'} comboCuts = [LoKiCuts(['AMAXDOCA'], combConfig).code(), dmcut] comboCuts = LoKiCuts.combine(comboCuts) momCuts = LoKiCuts(['VCHI2DOF', 'BPVVDCHI2', 'BPVDIRA'], config).code() #did = "((ABSID=='D+')|(ABSID=='D0'))" preambulo = [ 'PXPI = ACHILD(PX,2)', 'PYPI = ACHILD(PY,2)', 'PZPI = ACHILD(PZ,2)', 'EPI = ACHILD(E,2)', 'IDD1 = ACHILD(CHILD(ABSID,1),1)', #'ISD1 = ACHILD(CHILD(%s,1),1)' % did, 'PXD1 = ACHILD(CHILD(PX,1),1)', 'PYD1 = ACHILD(CHILD(PY,1),1)', 'PZD1 = ACHILD(CHILD(PZ,1),1)', 'ED1 = ACHILD(CHILD(E,1),1)', 'MD1 = ACHILD(CHILD(M,1),1)', 'MD1PI = sqrt((EPI+ED1)**2 - (PXPI+PXD1)**2 - (PYPI+PYD1)**2 - (PZPI+PZD1)**2)', #'ISD2 = ACHILD(CHILD(%s,2),1)' % did, 'IDD2 = ACHILD(CHILD(ABSID,2),1)', 'PXD2 = ACHILD(CHILD(PX,2),1)', 'PYD2 = ACHILD(CHILD(PY,2),1)', 'PZD2 = ACHILD(CHILD(PZ,2),1)', 'ED2 = ACHILD(CHILD(E,2),1)', 'MD2 = ACHILD(CHILD(M,2),1)', 'MD2PI = sqrt((EPI+ED2)**2 - (PXPI+PXD2)**2 - (PYPI+PYD2)**2 - (PZPI+PZD2)**2)', ] cp = CombineParticles(CombinationCut=comboCuts, MotherCut=momCuts, Preambulo=preambulo, DecayDescriptor='[B+ -> J/psi(1S) pi+]cc') return Selection('DstarUP' + sel.name(), Algorithm=cp, RequiredSelections=[uppions] + [subsel])
def filterEE(which,econf,xconf,inputs): code = "(ID=='J/psi(1S)') & (PT > %s) & (MINTREE('e+'==ABSID,PIDe) > %s)" \ % (xconf['PT_MIN'],econf['PIDe_MIN']) code += " & (MINTREE('e+'==ABSID,MIPCHI2DV(PRIMARY)) > %s)" \ % econf['MIPCHI2DV_MIN'] code += " & (MINTREE('e+'==ABSID,PT) > %s)" % econf['PT_MIN'] code += " & (MAXTREE('e+'==ABSID,TRGHP) < %s)" % econf['TRGHP_MAX'] code = LoKiCuts.combine([code,LoKiCuts(['HASVERTEX','BPVVDCHI2','VCHI2DOF'], xconf).code()]) #print "filterEE: ", code sel = Selection(which+'FilterEEDarkBosonFilter', Algorithm=FilterDesktop(Code=code), RequiredSelections=inputs) sub = SubstitutePID(which+'EESubPIDDarkBoson', Code="DECTREE('J/psi(1S) -> e+ e-')") sub.MaxChi2PerDoF = -666 sub.Substitutions = {'J/psi(1S) -> e+ e-' : 'KS0'} return Selection(which+'EESubPIDDarkBosonSel',Algorithm=sub, RequiredSelections=[sel])
def _buildAlgorithmChain(self, name, decayCombos, massLow, massHigh, inputSelection): print 'build shit!!!!' uniqueCombos = [] for nominalDecay, validDecays in decayCombos.items(): uniqueCombos.extend(validDecays) uniqueCombos = list(set(uniqueCombos)) wmSelections = {} for combo in uniqueCombos: comboName = ''.join(self._unsignDecay(combo)) functor = self._buildUnsignedWMFunctor({combo: [combo]}, massLow, massHigh) _filter = FilterDesktop("%s_WMFilter_%s" % (name, comboName), Code=functor) print '_filter', _filter wmSelections[comboName] = Selection( "%s_WMSel_%s" % (name, comboName), Algorithm=_filter, RequiredSelections=[inputSelection]) mySelections = {} for nominalDecay, validDecays in decayCombos.items(): nominalDecayName = ''.join(nominalDecay) nDaughters = len(nominalDecay) algoList = [] for validDecay in validDecays: validDecayName = ''.join(validDecay) wmSel = wmSelections[''.join(self._unsignDecay(validDecay))] _subsAlgo = SubstitutePID("%s_SubsAlg_%s" % (name, validDecayName), Code="DECTREE( 'Charm -> %s' )" % (' '.join(self.referenceDecay)), Substitutions={}) _subsAlgo.MaxChi2PerDoF = -666 mySubs = {} for i, validDaughter in enumerate(validDecay): #if validDaughter == self.referenceDecay[i]: # continue if not validDaughter in mySubs: mySubs[validDaughter] = self.referenceDecay[:] mySubs[validDaughter][i] = '^' + mySubs[validDaughter][i] for sub, descriptor in mySubs.items(): subsString = 'Charm -> ' + ' '.join(descriptor) _subsAlgo.Substitutions[subsString] = sub #print 'Combo:', 'alg =', _subsAlgo print 'subs:', _subsAlgo.Substitutions print 'code:', _subsAlgo.Code sel = Selection("%sSel_%s" % (name, validDecayName), Algorithm=_subsAlgo, RequiredSelections=[wmSel]) sel = Selection(name + 'Sel_' + validDecayName + 'Filter', Algorithm=FilterDesktop( 'DummyName', Code='(in_range(1764.84, MM, 1964.84))'), RequiredSelections=[sel]) # hi algoList.append(sel) #mySelections[validDecayName] = sel print 'algoList', algoList mySelections[nominalDecayName] = MergedSelection( "%sMSel_%s" % (name, nominalDecayName), RequiredSelections=algoList) print 'mySelections', mySelections return mySelections