From 6c1d8635f619b9ebe1faa8c383fe2dc0fd2ea07a Mon Sep 17 00:00:00 2001
From: chengw <cheng.wang@cern.ch>
Date: Mon, 17 Mar 2025 14:49:13 +0800
Subject: [PATCH] AP for run2 turbo MC XicpToPKmPip

---
 run2_MC_XicpToPKmPip/XicpToPKmPip_MC.py | 238 ++++++++++++++++++++++++
 run2_MC_XicpToPKmPip/info.yaml          |  24 +++
 2 files changed, 262 insertions(+)
 create mode 100644 run2_MC_XicpToPKmPip/XicpToPKmPip_MC.py
 create mode 100644 run2_MC_XicpToPKmPip/info.yaml

diff --git a/run2_MC_XicpToPKmPip/XicpToPKmPip_MC.py b/run2_MC_XicpToPKmPip/XicpToPKmPip_MC.py
new file mode 100644
index 0000000000..304e2348cf
--- /dev/null
+++ b/run2_MC_XicpToPKmPip/XicpToPKmPip_MC.py
@@ -0,0 +1,238 @@
+import GaudiKernel.SystemOfUnits as Units
+from GaudiKernel.SystemOfUnits import GeV, MeV, picosecond, mm, mrad
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci 
+from Configurables import CombineParticles, DecayTreeTuple
+from Configurables import TupleToolDecay, TupleToolPrimaries
+from Configurables import TupleToolGeometry, TupleToolKinematic, TupleToolPropertime, TupleToolPrimaries, TupleToolPid, TupleToolEventInfo, TupleToolTrackInfo, TupleToolRecoStats, TupleToolTrigger
+from Configurables import TupleToolTISTOS, L0TriggerTisTos, TriggerTisTos
+from Configurables import LoKi__Hybrid__TupleTool
+from Configurables import LoKi__Hybrid__TupleTool as LoKiTupleTool
+from Configurables import FilterDesktop
+from Configurables import CondDB, CheckPV, TupleToolDecayTreeFitter
+from Configurables import FilterInTrees
+
+from DecayTreeTuple.Configuration import *
+from PhysConf.Selections import CombineSelection, FilterSelection, RebuildSelection
+from PhysConf.Selections import SelectionSequence, StrippingSelection
+from PhysSelPython.Wrappers import AutomaticData, Selection, MergedSelection
+from PhysSelPython.Wrappers import SelectionSequence, DataOnDemand, TupleSelection
+
+from Configurables import TupleToolMCBackgroundInfo, TupleToolMCTruth
+from TeslaTools import TeslaTruthUtils
+
+isSimulation = DaVinci().Simulation 
+#tool list
+TupleToolList = [ 
+    "TupleToolGeometry",
+    "TupleToolKinematic",
+    "TupleToolPrimaries",
+    "TupleToolPid",
+    "TupleToolEventInfo",
+    "TupleToolTrackInfo",
+    "TupleToolBremInfo",
+    "TupleToolRecoStats",
+    "TupleToolTISTOS",
+    "TupleToolTrigger",
+    "TupleToolAngles",
+    "TupleToolPropertime",
+    "TupleToolTrackPosition",
+    "TupleToolANNPID"
+    ]
+
+#trigger list
+TriggerList = [
+    # L0
+    "L0ElectronDecision",
+    "L0HadronDecision",
+    "L0MuonDecision",
+    "L0MuonLooseDecision",
+    "L0MuonEWDecision",
+    "L0MuonHighDecision",
+    "L0PhysDecision",
+    "L0PhotonDecision",
+    "L0DiMuonDecision",
+    "L0GlobalDecision",
+    "L0ElectronHiDecision",
+    "L0DiElectronDecision",
+    "L0DiHadronDecision",
+    # HLT1
+    "Hlt1TrackAllL0Decision",
+    "Hlt1TrackPhotonDecision",
+    "Hlt1GlobalDecision",
+    "Hlt1TrackMVADecision",
+    "Hlt1TwoTrackMVADecision",
+    "Hlt1TrackMVALooseDecision",
+    "Hlt1TwoTrackMVALooseDecision",
+    "Hlt1L0AnyDecision",
+    "Hlt1TrackMVATightDecision",
+    "Hlt1TwoTrackMVATightDecision",
+
+    'Hlt1TrackMuonDecision',
+    'Hlt1TrackMuonMVADecision',
+    'Hlt1DiMuonHighMassDecision',
+    'Hlt1DiMuonLowMassDecision',
+    'Hlt1SingleMuonHighPTDecision',
+    'Hlt1DiMuonNoL0Decision',
+    'Hlt1CalibMuonAlignJpsiDecision',
+    'Hlt1DiMuonNoIPDecision',
+    'Hlt1DiMuonNoIPSSDecision',
+    'Hlt1LowMultMuonDecision',
+    'Hlt1MultiDiMuonNoIPDecision',
+    'Hlt1MultiMuonNoL0Decision',
+    'Hlt1SingleMuonHighPTNoMUIDDecision',
+    'Hlt1SingleMuonNoIPDecision',
+     # HLT2
+    'Hlt2Topo2BodyDecision',
+    'Hlt2TopoE2BodyDecision',
+    "Hlt2Topo3BodyDecision",
+    "Hlt2Topo4BodyDecision",
+    "Hlt2IncPhiDecision",
+    "Hlt2Topo.*Decision",
+    "Hlt2PhysDecision",
+   ]
+
+################################################################################
+LoKi_particle = LoKi__Hybrid__TupleTool("LoKi_particle")
+LoKi_particle.Variables = {
+   "Y"    : "Y",
+   "ETA"  : "ETA",
+   "PHI"  : "PHI",
+   "LOKI_FDCHI2"    : "BPVVDCHI2",
+   "LOKI_FDS"       : "BPVDLS",
+   "LOKI_DIRA"      : "BPVDIRA",
+   "LV01"           : "LV01",
+   "LV02"           : "LV02",
+   "DOCA"           : "DOCA(1,2)",
+   "LOKI_BPVCORRM"  : "BPVCORRM",
+   "LOKI_IPCHI2"    : "BPVIPCHI2()",
+   "LOKI_BPVLTIME"  : "BPVLTIME()"
+}
+LoKi_Xicp2PHH=LoKi__Hybrid__TupleTool("LoKi_Xicp2PHH")
+LoKi_Xicp2PHH.Variables =  {
+    'DOCACHI2_p_h1'  : 'DOCACHI2(1,2)',
+    'DOCACHI2_p_h2'  : 'DOCACHI2(1,3)',
+    'DOCACHI2_h1_h2' : 'DOCACHI2(2,3)',
+    'DOCA_p_h1'   : 'DOCA(1,2)',
+    'DOCA_p_h2'   : 'DOCA(1,3)',
+    'DOCA_h1_h2'  : 'DOCA(2,3)',
+    'MASS_p_h1'   : 'MASS(1,2)',
+    'MASS_p_h2'   : 'MASS(1,3)',
+    'MASS_h1_h2'  : 'MASS(2,3)',
+    }
+
+
+################################################################################
+line_XicpToPKmPip   = "Hlt2CharmHadXicpToPpKmPipTurbo"
+
+from PhysConf.Selections import AutomaticData
+Input_XicpToPKmPip  = AutomaticData( Location = "{0}/Particles".format(line_XicpToPKmPip))
+
+################################################################################
+from PhysConf.Selections import TupleSelection
+# The definition of the line named Hlt2CharmHadXicpToPpKmPipTurbo is [Lambda_c+ -> ^p+ ^K- ^pi+] during 2016-2018. But it is still a proper Xi_c+.
+XicpToPKmPip_decay  = '[Lambda_c+ -> ^p+ ^K- ^pi+]CC'
+
+XicpToPKmPip_branches = {
+     "Xicp" :   "^([Lambda_c+ -> p+ K- pi+]CC)",
+     "Pp"   :   "[Lambda_c+ -> ^p+ K- pi+]CC",
+     "Km"   :   "[Lambda_c+ -> p+ ^K- pi+]CC",
+     "Pip"  :   "[Lambda_c+ -> p+ K- ^pi+]CC",
+     } 
+
+Tuple_XicpToPKmPip  = TupleSelection("Tuple_XicpToPKmPip",  [ Input_XicpToPKmPip ], Decay = XicpToPKmPip_decay, Branches = XicpToPKmPip_branches,   ToolList = [] )
+################################################################################
+for dtt in [Tuple_XicpToPKmPip]:
+    # decay tree fitter (DTF)
+    dtt.addTool(TupleToolDecay, name="Xicp")
+    dtt.addTool(TupleToolDecay, name="Pp")
+    dtt.addTool(TupleToolDecay, name="Km")
+    dtt.addTool(TupleToolDecay, name="Pip")
+    
+    #LoKi VARIABLES
+    for particle in [dtt.Xicp,dtt.Pp,dtt.Km,dtt.Pip]:
+        particle.addTool(LoKi_particle)
+        particle.ToolList+=["LoKi::Hybrid::TupleTool/LoKi_particle"]
+    dtt.Xicp.addTool(LoKi_Xicp2PHH)
+    dtt.Xicp.ToolList+=["LoKi::Hybrid::TupleTool/LoKi_Xicp2PHH"]
+    #constrain: PV and Xicp
+    dtt.Xicp.addTupleTool('TupleToolDecayTreeFitter/DTF')
+    dtt.Xicp.DTF.constrainToOriginVertex = True
+    dtt.Xicp.DTF.Verbose = True
+    dtt.Xicp.DTF.daughtersToConstrain = ["Lambda_c+"]
+    dtt.Xicp.DTF.UpdateDaughters = True
+    #constrain: PV
+    dtt.Xicp.addTupleTool('TupleToolDecayTreeFitter/DTFonlyPV')
+    dtt.Xicp.DTFonlyPV.constrainToOriginVertex = True
+    dtt.Xicp.DTFonlyPV.Verbose = True
+    dtt.Xicp.DTFonlyPV.UpdateDaughters = True
+    #DTF with Momentum Scaling only
+    dtt.Xicp.addTupleTool('TupleToolDecayTreeFitter/DTFonlyMS')
+    dtt.Xicp.DTFonlyMS.Verbose = True
+    dtt.Xicp.DTFonlyMS.UpdateDaughters = True
+
+for dtt in [Tuple_XicpToPKmPip]:
+
+    dtt.TupleName = "ntp"
+    dtt.ToolList =  TupleToolList
+
+    if isSimulation:
+        dtt.ToolList += [
+            "TupleToolMCTruth",
+            "TupleToolMCBackgroundInfo"
+            ]
+        dtt.TupleToolMCTruth.ToolList += ["MCTupleToolHierarchy"]
+
+####################################### TISTOS ##################################
+    dtt.TupleToolTrigger.VerboseL0 = True
+    dtt.TupleToolTrigger.VerboseHlt1 = True
+    dtt.TupleToolTrigger.VerboseHlt2 = True
+    dtt.TupleToolTrigger.FillHlt2 = False
+    dtt.TupleToolTrigger.TriggerList = TriggerList
+
+    dtt.TupleToolTISTOS.addTool(L0TriggerTisTos())
+    dtt.TupleToolTISTOS.addTool(TriggerTisTos())
+    dtt.TupleToolTISTOS.VerboseL0 = True
+    dtt.TupleToolTISTOS.VerboseHlt1 = True
+    dtt.TupleToolTISTOS.VerboseHlt2 = True
+    dtt.TupleToolTISTOS.FillHlt2 = False
+    dtt.TupleToolTISTOS.TriggerList = TriggerList
+
+from Configurables import MCDecayTreeTuple
+MCTuple = MCDecayTreeTuple("MCTruth")
+MCTuple.Decay = "^[Lambda_c+ => ^p+ ^K- ^pi+]CC"
+MCTuple.addBranches({
+     "Xicp"     :  "^([ Lambda_c+ ==> p+ K- pi+]CC)",
+     "Pp"       :  "[ Lambda_c+ ==> ^p+ K- pi+]CC",
+     "Km"       :  "[ Lambda_c+ ==> p+ ^K- pi+]CC",
+     "Pip"      :  "[ Lambda_c+ ==> p+ K- ^pi+]CC",
+     })
+MCTuple.ToolList += [
+    "MCTupleToolKinematic"
+    ,"MCTupleToolPrimaries"
+    ,"MCTupleToolAngles"
+    ,"MCTupleToolHierarchy"
+    ,"TupleToolRecoStats"
+    ,"MCTupleToolDecayType"
+    ,"MCTupleToolPID"
+    ,"MCTupleToolPrompt"
+    ]
+
+
+################################################################################
+from PhysConf.Selections import SelectionSequence
+seq_XicpToPKmPip          = SelectionSequence('seq_XicpToPKmPip',Tuple_XicpToPKmPip).sequence()
+
+################################################################################
+DaVinci(
+    InputType       = 'MDST', 
+    Lumi            = not isSimulation, 
+    Simulation      = isSimulation,
+#    UserAlgorithms  = [seq_XicpToPKmPip,MCTuple],
+    UserAlgorithms  = [seq_XicpToPKmPip],
+    Turbo           = True,
+#    RootInTES       = "/Event/AllStreams"
+    RootInTES       = "/Event/Turbo"
+    )
+
diff --git a/run2_MC_XicpToPKmPip/info.yaml b/run2_MC_XicpToPKmPip/info.yaml
new file mode 100644
index 0000000000..b98b5487de
--- /dev/null
+++ b/run2_MC_XicpToPKmPip/info.yaml
@@ -0,0 +1,24 @@
+defaults:
+  application: "DaVinci/v44r11p6"
+  wg: Charm
+  automatically_configure: true
+  inform:
+    - cheng.wang@cern.ch
+
+{%- set datasets_XicpToPKmPip_mc = [
+  ('16','MagDown','/MC/2016/Beam6500GeV-2016-MagDown-Nu1.6-25ns-Pythia8/Sim09k/Trig0x6139160F/Reco16/Turbo03a/Stripping28r1NoPrescalingFlagged/26103092/ALLSTREAMS.MDST'),
+  ('17','MagDown','/MC/2017/Beam6500GeV-2017-MagDown-Nu1.6-25ns-Pythia8/Sim09k/Trig0x62661709/Reco17/Turbo04a-WithTurcal/Stripping29r2NoPrescalingFlagged/26103092/ALLSTREAMS.MDST'),
+  ('18','MagDown','/MC/2018/Beam6500GeV-2018-MagDown-Nu1.6-25ns-Pythia8/Sim09k/Trig0x617d18a4/Reco18/Turbo05-WithTurcal/Stripping34NoPrescalingFlagged/26103092/ALLSTREAMS.MDST'),
+  ('16','MagUp',  '/MC/2016/Beam6500GeV-2016-MagUp-Nu1.6-25ns-Pythia8/Sim09k/Trig0x6139160F/Reco16/Turbo03a/Stripping28r1NoPrescalingFlagged/26103092/ALLSTREAMS.MDST'),
+  ('17','MagUp',  '/MC/2017/Beam6500GeV-2017-MagUp-Nu1.6-25ns-Pythia8/Sim09k/Trig0x62661709/Reco17/Turbo04a-WithTurcal/Stripping29r2NoPrescalingFlagged/26103092/ALLSTREAMS.MDST'),
+  ('18','MagUp',  '/MC/2018/Beam6500GeV-2018-MagUp-Nu1.6-25ns-Pythia8/Sim09k/Trig0x617d18a4/Reco18/Turbo05-WithTurcal/Stripping34NoPrescalingFlagged/26103092/ALLSTREAMS.MDST'),
+]%}
+
+{%- for year, polarity,bk in datasets_XicpToPKmPip_mc %}
+20{{year}}_{{polarity}}_XicpToPKmPip_MC:
+  input:
+    bk_query: {{bk}}
+  output: XicpToPKmPip_MC.ROOT
+  options:
+    - XicpToPKmPip_MC.py
+{%- endfor %}
-- 
GitLab