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 %}
+
+
+