diff --git a/bujpsikst/Davinci.py b/bujpsikst/Davinci.py new file mode 100644 index 0000000000000000000000000000000000000000..fff56d094916d3568cb9ef0598219364ce77409b --- /dev/null +++ b/bujpsikst/Davinci.py @@ -0,0 +1,306 @@ +# central settings +# +simulation = True +### + + +######################################################################## +from os import environ +import GaudiKernel.SystemOfUnits as Units +from Gaudi.Configuration import * +from Configurables import (GaudiSequencer, + DecayTreeTuple, + CombineParticles, + LoKi__Hybrid__TupleTool, + DaVinci, + FilterDesktop) + +from Configurables import LoKi__Hybrid__PlotTool as PlotTool +from Configurables import LoKi__Hybrid__FilterCriterion as LoKiFilterCriterion +from DecayTreeTuple.Configuration import * + +from GaudiKernel.SystemOfUnits import * +from GaudiConfUtils.ConfigurableGenerators import CombineParticles +from PhysSelPython.Wrappers import (SelectionSequence, Selection, DataOnDemand, AutomaticData, MergedSelection) +from Configurables import LoKi__VoidFilter as Filter +from PhysConf.Filters import LoKi_Filters +LoKiTool = LoKi__Hybrid__TupleTool( 'LoKiTool') +from Configurables import TriggerTisTos +from Configurables import TupleToolTagging + + + +from Configurables import ( + DaVinci, + DecayTreeTuple, + TupleToolTrigger, + TupleToolDecay, + TupleToolPid, + TupleToolRecoStats, +) +from Configurables import DecayTreeTuple, EventTuple, TupleToolTrigger, TupleToolTISTOS,FilterDesktop, MCDecayTreeTuple, TupleToolMCTruth,TupleToolTwoParticleMatching +from Configurables import TupleToolConeIsolation +# +###################################################################################################### + +if simulation is True: + location = 'AllStreams/Phys/FullDSTDiMuonJpsi2MuMuDetachedLine/Particles'#MCçš„TESä½ç½® +if simulation is False: + location = 'Dimuon/Phys/FullDSTDiMuonJpsi2MuMuDetachedLine/Particles'#dataçš„TESä½ç½® +###################################################################################################### +# if you are setting something wrong, it should die here... +###################################################################################################### +# CUTS CUTS CUTS CUTS CUTS CUTS CUTS +#################################### +BdCombCuts = "(AM > 4800 * MeV) &"\ + "(AM < 7000 * MeV) " + +#对于é‡å»ºç²’åçš„cut,需è¦ä»¥A开头,如AM:è´¨é‡ã€AP:动é‡ç‰ +BdCuts = "(M > 4800 * MeV) & "\ + "(M < 7000 * MeV) " + + + +###################################################################################################### +### +from GaudiKernel.SystemOfUnits import MeV +from Configurables import ResolvedPi0Maker, PhotonMaker +from PhysSelPython.Wrappers import Selection, DataOnDemand, AutomaticData + +# èŽ·å– StdLooseAllPhotons +StdLooseAllPhotons = DataOnDemand(Location="Phys/StdLooseAllPhotons/Particles") + +# 使用 ResolvedPi0Maker 定义新的 StdLooseResolvedPi0 +newResolvedPi0Maker = ResolvedPi0Maker( + 'NewResolvedPi0Maker', + DecayDescriptor='Pi0', + MassWindow=200. * MeV +) +newResolvedPi0Maker.addTool(PhotonMaker) +newResolvedPi0Maker.PhotonMaker.PtCut = 200. * MeV +#newResolvedPi0Maker.PhotonMaker.Inputs = [StdLooseAllPhotons.outputLocation()] + +# 创建选择器 +newStdLooseResolvedPi0 = Selection( + "NewStdLooseResolvedPi0", + Algorithm=newResolvedPi0Maker, + RequiredSelections=[StdLooseAllPhotons] +) + + + + + +def __jpsi__(location): + """ + Get the J/psi from the stripping line. + Note the different location for data and MC + """ + return AutomaticData(Location = location) + +### +def __jpsipi0__(Jpsi,Pi0, BdCombCuts, BdCuts): + _jpsipi0 = CombineParticles() + _jpsipi0.DecayDescriptor = "[B0 -> J/psi(1S) pi0]cc" + _jpsipi0.CombinationCut = BdCombCuts + _jpsipi0.MotherCut = BdCuts + _jpsipi0Conf = _jpsipi0.configurable("Combine_BJpsipi0") + _selJpsipi0 = Selection("BJpsipi0", + Algorithm = _jpsipi0Conf, + RequiredSelections = [ Jpsi, Pi0]) + return _selJpsipi0 + +####### +Jpsi = __jpsi__(location) +Jpsipi0 = __jpsipi0__(Jpsi, newStdLooseResolvedPi0, BdCombCuts, BdCuts) +BJpsipi0Seq = SelectionSequence( 'BJpsipi0Seq', TopSelection = Jpsipi0 ) + +###################################################################################################### +BJpsiPi0 = DecayTreeTuple("BJpsiPi0Tuple") + +#input location +BJpsiPi0.Inputs = [ Jpsipi0.outputLocation() ] + +# decay descriptors +BJpsiPi0.Decay = "[B0 -> ^(J/psi(1S) -> ^mu+ ^mu-) ^(pi0 -> ^gamma ^gamma)]CC" + +# define the tools and configure them + +BJpsiPi0.ToolList = [ + "TupleToolKinematic" #è¿åŠ¨å¦å˜é‡ï¼Œå¦‚动é‡ã€è´¨é‡ç‰ + ,"TupleToolParticleStats" #统计光åæ•°ç›®:q! + ,"TupleToolRecoStats" + ,"TupleToolEventInfo" + ,"TupleToolAngles" + ,"TupleToolPid" + , "TupleToolPrimaries" + , 'TupleToolANNPID' + + ] + +# define the list of triggers that could have fired... +triggerList = [ + "L0DiMuonDecision", + "L0MuonDecision", + "Hlt1TrackMuonDecision", + "Hlt1DiMuonLowMassDecision", + "Hlt1DiMuonHighMassDecision", + "Hlt1SingleMuonHighPTDecision", + "Hlt2DiMuonDetachedJPsiDecision", + "Hlt2DiMuonDetachedHeavyDecision" ] + +# define the tools and configure them +BJpsiPi0.addTupleTool("LoKi::Hybrid::TupleTool/LoKiTool") +BJpsiPi0.LoKiTool.Variables = { + "eta" : "ETA",#计算粒åçš„ETA,并以particle_etaçš„å½¢å¼æ·»åŠ 到tupleä¸ï¼Œå¯ä»¥æŒ‡å®šå•ä½ï¼Œå¦‚:mass : M/GeVç‰ + "phi" : "PHI", + "LV01" : "LV01", + "BPVDLS" : "BPVDLS" } + + + + +# some truthmatching stuff +if simulation is True: + MCTruth=BJpsiPi0.addTupleTool("TupleToolMCTruth/MCTruth")#ä¸ºäº†æ·»åŠ MCç²’åä¿¡æ¯ã€‚规范性æ“作 + MCTruth.addTupleTool("MCTupleToolHierarchy") + MCTruth.ToolList = [ + "MCTupleToolAngles" + , "MCTupleToolHierarchy" + , "MCTupleToolKinematic" + , "MCTupleToolReconstructed" +] + +#### + +#### + +################################################################ +################################################################ +# define the branches for resolved pi0 +# for resolved pi0 +BJpsiPi0.addBranches({ # remove all "^" except where needed. + "B" : "^[B0 -> (J/psi(1S) -> mu+ mu-) ( pi0 -> gamma gamma)]CC", + "mu1" : " [B0 -> (J/psi(1S) -> mu+ ^mu-) ( pi0 -> gamma gamma)]CC", + "mu2" : " [B0 -> (J/psi(1S) -> ^mu+ mu-) ( pi0 -> gamma gamma)]CC", + "Jpsi" : " [B0 -> ^(J/psi(1S) -> mu+ mu-) ( pi0 -> gamma gamma)]CC", + "pi0": " [B0 -> (J/psi(1S) -> mu+ mu-) ^(pi0 -> gamma gamma)]CC", + "gamma0" : " [B0 -> (J/psi(1S) -> mu+ mu-) ( pi0 -> ^gamma gamma)]CC", + "gamma1" : " [B0 -> (J/psi(1S) -> mu+ mu-) ( pi0 -> gamma ^gamma)]CC" + }) + +### B tools +BJpsiPi0.B.addTupleTool("TupleToolDecayTreeFitter/DTF") +BJpsiPi0.B.DTF.constrainToOriginVertex = True +BJpsiPi0.B.DTF.Verbose = True +BJpsiPi0.B.DTF.UpdateDaughters = True +BJpsiPi0.B.DTF.daughtersToConstrain = [ 'J/psi(1S)' ] +BJpsiPi0.B.addTupleTool("TupleToolGeometry")#ç²’å的原åˆé¡¶ç‚¹/è¡°å˜é¡¶ç‚¹ç‰çš„å¡æ–¹å€¼ï¼Œé£žè¡Œè·ç¦»ç‰ã€‚ +BJpsiPi0.B.addTupleTool("TupleToolPropertime")#这个工具用于计算粒å的寿命信æ¯ï¼Œé€šå¸¸æ˜¯é€šè¿‡æµ‹é‡ä»Žäº§ç”Ÿåˆ°è¡°å˜çš„时间间隔æ¥è®¡ç®—的。 +BJpsiPi0.B.addTupleTool("TupleToolVtxIsoln")#这个工具用于评估粒å顶点的隔离度,å³ç²’å顶点周围有多少其他粒å活动,这有助于判æ–ç²’å是å¦å¯èƒ½æ˜¯ä»Žä¸€ä¸ªè¾ƒå¹²å‡€çš„è¡°å˜è¿‡ç¨‹ä¸äº§ç”Ÿã€‚ +BJpsiPi0.B.addTupleTool("TupleToolConeIsolation/TupleToolConeIsolation")#这个工具用于计算锥形隔离度 +BJpsiPi0.B.TupleToolConeIsolation.MinConeSize = 1.8 +BJpsiPi0.B.TupleToolConeIsolation.MaxConeSize = 1.8 +BJpsiPi0.B.TupleToolConeIsolation.FillComponents = True #å¡«å……æ‰€æœ‰ç»„åˆ†ä¿¡æ¯ +BJpsiPi0.B.TupleToolConeIsolation.FillNeutral = True #ä¸å¡«å……ä¸æ€§é”¥è§’ +BJpsiPi0.B.TupleToolConeIsolation.FillMaxPt = False #ä¸å¡«å……锥角最大动é‡ä¿¡æ¯ +BJpsiPi0.B.TupleToolConeIsolation.FillDeltas = True +BJpsiPi0.B.TupleToolConeIsolation.FillAsymmetry = True +BJpsiPi0.B.addTupleTool( "TupleToolTISTOS/TupleToolTISTOS") +BJpsiPi0.B.TupleToolTISTOS.TriggerList = triggerList +BJpsiPi0.B.TupleToolTISTOS.VerboseL0 = True +BJpsiPi0.B.TupleToolTISTOS.VerboseHlt1 = True +BJpsiPi0.B.TupleToolTISTOS.VerboseHlt2 = True + + +btag = BJpsiPi0.addTupleTool('TupleToolTagging') +btag.Verbose = True +btag.AddMVAFeatureInfo = False +btag.UseFTfromDST = False +from Configurables import BTaggingTool +btagtool = btag.addTool(BTaggingTool, name = 'MyBTaggingTool') +from FlavourTagging.Tunings import applyTuning as applyFTTuning +applyFTTuning(btagtool, tuning_version = 'Summer2017Optimisation_v4_Run2') +btag.TaggingToolName = btagtool.getFullName() + +BJpsiPi0.B.addTupleTool("TupleToolDecayTreeFitter/PV2") +BJpsiPi0.B.PV2.constrainToOriginVertex = True +BJpsiPi0.B.PV2.Verbose = True +BJpsiPi0.B.PV2.UpdateDaughters = True +BJpsiPi0.B.PV2.daughtersToConstrain = [ 'J/psi(1S)','pi0' ] + +BJpsiPi0.B.addTupleTool("TupleToolDecayTreeFitter/ConstOnlyPV") +BJpsiPi0.B.ConstOnlyPV.constrainToOriginVertex = True +BJpsiPi0.B.ConstOnlyPV.Verbose = True +BJpsiPi0.B.ConstOnlyPV.UpdateDaughters = True +#BJpsiPi0.B.ConstOnlyPV.daughtersToConstrain = [ 'J/psi(1S)','pi0' ] + +### Jpsi tools +BJpsiPi0.Jpsi.addTupleTool("TupleToolGeometry") +BJpsiPi0.Jpsi.addTupleTool( "TupleToolTISTOS/TupleToolTISTOS") +BJpsiPi0.Jpsi.TupleToolTISTOS.TriggerList = triggerList +BJpsiPi0.Jpsi.TupleToolTISTOS.VerboseL0 = True +BJpsiPi0.Jpsi.TupleToolTISTOS.VerboseHlt1 = True +BJpsiPi0.Jpsi.TupleToolTISTOS.VerboseHlt2 = True +BJpsiPi0.Jpsi.addTupleTool("TupleToolAngles") + +# mu1tools +BJpsiPi0.mu1.addTupleTool("TupleToolGeometry") +BJpsiPi0.mu1.addTupleTool("TupleToolPid")#ProbNNmu误判别ç‰ä¿¡æ¯ + +# mu2 tools +BJpsiPi0.mu2.addTupleTool("TupleToolGeometry") +BJpsiPi0.mu2.addTupleTool("TupleToolPid") + + +# pi0 tools +BJpsiPi0.pi0.addTupleTool("TupleToolPi0Info")#用于æå–或计算与pi0ç²’å相关的信æ¯çš„工具。 +BJpsiPi0.pi0.addTupleTool("TupleToolAngles") + +# gamma tools +BJpsiPi0.gamma0.addTupleTool("TupleToolPhotonInfo") +BJpsiPi0.gamma0.addTupleTool("TupleToolProtoPData") +BJpsiPi0.gamma0.TupleToolProtoPData.DataList += ["IsNotH", "IsNotE", "IsPhoton", "CaloNeutralSpd","CaloNeutralID"] +#TupleToolCaloHypo:通常用于处ç†å’Œåˆ†æžä¸Žé‡èƒ½å™¨ï¼ˆCalorimeter)相关的å‡è®¾ï¼ˆHypothesis)数æ®. + + +# gamma tools +BJpsiPi0.gamma1.addTupleTool("TupleToolPhotonInfo") +BJpsiPi0.gamma1.addTupleTool("TupleToolProtoPData") #Prototype Particle Data:æ„为原型粒åæ•°æ®ã€æŒ‡çš„是这些实验数æ®ä¸çš„原始或原型粒åä¿¡æ¯ã€‚ +BJpsiPi0.gamma1.TupleToolProtoPData.DataList += ["IsNotH", "IsNotE", "IsPhoton", "CaloNeutralSpd","CaloNeutralID"] +#CaloNeutralSpdã€CaloNeutralID +#Calorimeter的缩写,表示é‡èƒ½å™¨ã€Neutral":表示ä¸æ€§ç²’åã€Spd":是"Scintillating Pad Detector"的缩写,表示闪çƒåž«æŽ¢æµ‹å™¨ã€ID":是"Inner Detector"的缩写,表示内部探测器 +# 在é‡èƒ½å™¨ä¸æµ‹é‡ä¸æ€§ç²’å在探测器ä¸çš„能é‡ä¿¡æ¯ + + +################################################################ +################################################################ +Seq1 = GaudiSequencer("Seq1") +Seq1.Members.append( BJpsipi0Seq.sequence() ) +Seq1.Members.append( BJpsiPi0 ) +Seq1.ModeOR = True +Seq1.ShortCircuit = False +# ###################################################################################################### +DaVinci().MainOptions = "" +DaVinci().UserAlgorithms = [Seq1] +# ###################################################################################################### +stripFilter = LoKi_Filters ( + STRIP_Code = " HLT_PASS_RE ('StrippingFullDSTDiMuonJpsi2MuMuDetachedLineDecision') " +) +stripFilterSeq = stripFilter.sequence( "StripFilter" ) +######################################################################## +DaVinci().EvtMax = -1 +#DaVinci().DataType = year +DaVinci().PrintFreq = 1000 +DaVinci().EventPreFilters = [ stripFilterSeq ] +DaVinci().InputType = "DST" + +if simulation is True: + DaVinci().Simulation = True + DaVinci().Lumi = False + DaVinci().TupleFile = "Tuple.root" + +if simulation is False: + DaVinci().TupleFile = "Tuple.root" + + diff --git a/bujpsikst/info.yaml b/bujpsikst/info.yaml new file mode 100644 index 0000000000000000000000000000000000000000..852f9965eb937cb62e00844f5c1821d67009bdc3 --- /dev/null +++ b/bujpsikst/info.yaml @@ -0,0 +1,33 @@ +defaults: + application: DaVinci/v46r10 + wg: B2CC + automatically_configure: yes + inform: + - jiankang.zhang@cern.ch + +{%- set datasets_mc = [ + ('MC', '11', 'MagUp','bujpsikst', '/MC/2011/Beam3500GeV-2011-MagUp-Nu2-Pythia8/Sim09j-ReDecay01/Trig0x40760037/Reco14c/Stripping21r1NoPrescalingFlagged/12143401/ALLSTREAMS.DST'), + ('MC', '11', 'MagDown','bujpsikst', '/MC/2011/Beam3500GeV-2011-MagDown-Nu2-Pythia8/Sim09j-ReDecay01/Trig0x40760037/Reco14c/Stripping21r1NoPrescalingFlagged/12143401/ALLSTREAMS.DST'), + ('MC', '12', 'MagUp','bujpsikst', '/MC/2012/Beam4000GeV-2012-MagUp-Nu2.5-Pythia8/Sim09j-ReDecay01/Trig0x409f0045/Reco14c/Stripping21NoPrescalingFlagged/12143401/ALLSTREAMS.DST'), + ('MC', '12', 'MagDown','bujpsikst', '/MC/2012/Beam4000GeV-2012-MagDown-Nu2.5-Pythia8/Sim09j-ReDecay01/Trig0x409f0045/Reco14c/Stripping21NoPrescalingFlagged/12143401/ALLSTREAMS.DST'), + ('MC', '15', 'MagUp','bujpsikst', '/MC/2015/Beam6500GeV-2015-MagUp-Nu1.6-25ns-Pythia8/Sim09j-ReDecay01/Trig0x411400a2/Reco15a/Turbo02/Stripping24r2NoPrescalingFlagged/12143401/ALLSTREAMS.DST'), + ('MC', '15', 'MagDown','bujpsikst', '/MC/2015/Beam6500GeV-2015-MagDown-Nu1.6-25ns-Pythia8/Sim09j-ReDecay01/Trig0x411400a2/Reco15a/Turbo02/Stripping24r2NoPrescalingFlagged/12143401/ALLSTREAMS.DST'), + ('MC', '16', 'MagUp','bujpsikst', '/MC/2016/Beam6500GeV-2016-MagUp-Nu1.6-25ns-Pythia8/Sim09j-ReDecay01/Trig0x6138160F/Reco16/Turbo03a/Stripping28r2NoPrescalingFlagged/12143401/ALLSTREAMS.DST'), + ('MC', '16', 'MagDown','bujpsikst', '/MC/2016/Beam6500GeV-2016-MagDown-Nu1.6-25ns-Pythia8/Sim09j-ReDecay01/Trig0x6138160F/Reco16/Turbo03a/Stripping28r2NoPrescalingFlagged/12143401/ALLSTREAMS.DST'), + ('MC', '17', 'MagUp','bujpsikst', '/MC/2017/Beam6500GeV-2017-MagUp-Nu1.6-25ns-Pythia8/Sim09j-ReDecay01/Trig0x62661709/Reco17/Turbo04a-WithTurcal/Stripping29r2NoPrescalingFlagged/12143401/ALLSTREAMS.DST'), + ('MC', '17', 'MagDown','bujpsikst', '/MC/2017/Beam6500GeV-2017-MagDown-Nu1.6-25ns-Pythia8/Sim09j-ReDecay01/Trig0x62661709/Reco17/Turbo04a-WithTurcal/Stripping29r2NoPrescalingFlagged/12143401/ALLSTREAMS.DST'), + ('MC', '18', 'MagUp','bujpsikst', '/MC/2018/Beam6500GeV-2018-MagUp-Nu1.6-25ns-Pythia8/Sim09j-ReDecay01/Trig0x617d18a4/Reco18/Turbo05-WithTurcal/Stripping34NoPrescalingFlagged/12143401/ALLSTREAMS.DST'), + ('MC', '18', 'MagDown','bujpsikst', '/MC/2018/Beam6500GeV-2018-MagDown-Nu1.6-25ns-Pythia8/Sim09j-ReDecay01/Trig0x617d18a4/Reco18/Turbo05-WithTurcal/Stripping34NoPrescalingFlagged/12143401/ALLSTREAMS.DST'), + +]%} + +{%- for type, year, polarity, decay, bk in datasets_mc %} +{{type}}_{{decay}}_20{{year}}_{{polarity}}: + input: + bk_query: {{bk}} + options: Davinci.py + output: {{decay}}_{{type}}.ROOT +{%- endfor %} + + +