diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..c3403b1
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,12 @@
+# Ignore files created when compiling
+
+*.d
+*.so
+*.pcm
+*.pyc
+
+
+
+# BUT keep these files
+
+# !filetokeep.so
diff --git a/Code/EventGenerator/Gauss-Job_StandAlone.py b/Code/EventGenerator/Gauss-Job_StandAlone.py
new file mode 100755
index 0000000..657503e
--- /dev/null
+++ b/Code/EventGenerator/Gauss-Job_StandAlone.py
@@ -0,0 +1,54 @@
+#
+# Options specific for a given job
+# ie. setting of random number seed and name of output files
+#
+
+event_type = "12113100" #SigMC
+#event_type = "12143401" #RefMC
+#event_type = "12113446" #PHSP
+
+from Gauss.Configuration import *
+importOptions("$APPCONFIGOPTS/Gauss/Beam6500GeV-md100-2017-nu1.6.py")
+importOptions("$DECFILESROOT/options/"+event_type+".py")
+importOptions("$LBPYTHIA8ROOT/options/Pythia8.py")
+
+
+#--Generator phase, set random numbers
+GaussGen = GenInit("GaussGen")
+GaussGen.FirstEventNumber = 1
+GaussGen.RunNumber = 1234
+
+#--Number of events
+LHCbApp().EvtMax = 100000
+LHCbApp().DDDBtag = 'dddb-20170721-3'
+LHCbApp().CondDBtag = 'sim-20170721-2-vc-md100'
+LHCbApp().OutputLevel = WARNING
+MessageSvc().OutputLevel = WARNING
+
+#Gauss().OutputType = 'NONE'
+#Gauss().Histograms = 'NONE'
+#--Set name of output files for given job (uncomment the lines)
+# Note that if you do not set it Gauss will make a name based on event type,
+# number of events and the date
+#idFile = 'GaussTest'
+#HistogramPersistencySvc().OutputFile = idFile+'-histos.root'
+#
+#OutputStream("GaussTape").Output = "DATAFILE='PFN:%s.sim' TYP='POOL_ROOTTREE' OPT='RECREATE'"%idFile
+
+#GenMonitor = GaudiSequencer( "GenMonitor" )
+#SimMonitor = GaudiSequencer( "SimMonitor" )
+#GenMonitor.Members += [ "GaussMonitor::CheckLifeTimeHepMC/HepMCLifeTime" ]
+#SimMonitor.Members += [ "GaussMonitor::CheckLifeTimeMC/MCLifeTime" ]
+
+gtos = GenerationToSimulation()
+gtos.SkipGeant = True
+gs = GaudiSequencer("GenMonitor")
+MCTruthStream = OutputStream("MCTruthStream")
+MCTruthStream.ItemList += [ "/Event/Gen#1", "/Event/Gen/HepMCEvents#1", "/Event/MC#1", "/Event/MC/Header#1", "/Event/MC/Particles#1", "/Event/MC/Vertices#1" ]
+MCTruthStream.Output = "DATAFILE='MCTruth.sim' TYP='POOL_ROOTTREE' OPT='RECREATE'"
+gs.Members += [ SimInit(), gtos, MCTruthStream ]
+
+Gauss().Phases = ["Generator"]
+#Gauss().Phases = ["Generator","GenToMCTree"]
+Gauss().OutputType = 'NONE'
+Gauss().Histograms = 'NONE'
diff --git a/Code/EventGenerator/JobStandAloneKSpiSignalMC.py b/Code/EventGenerator/JobStandAloneKSpiSignalMC.py
new file mode 100644
index 0000000..cfa0da6
--- /dev/null
+++ b/Code/EventGenerator/JobStandAloneKSpiSignalMC.py
@@ -0,0 +1,14 @@
+#Event Type: 12115102
+from Configurables import Generation
+Generation().EventType = 12115102
+from Configurables import StandAloneDecayTool
+Generation().SampleGenerationTool = "StandAloneDecayTool";
+Generation().addTool( StandAloneDecayTool )
+Generation().StandAloneDecayTool.ProductionTool = "PythiaProduction";
+
+from Configurables import ToolSvc
+from Configurables import EvtGenDecay
+
+ToolSvc().addTool( EvtGenDecay )
+ToolSvc().EvtGenDecay.UserDecayFile ="$DECFILESROOT/dkfiles/Bu_Kstmumu,KSpi=DecProdCut.dec"
+Generation().StandAloneDecayTool.SignalPIDList = [ 521,-521 ]
diff --git a/Code/EventGenerator/JobStandAloneKSpiTightCut.py b/Code/EventGenerator/JobStandAloneKSpiTightCut.py
new file mode 100644
index 0000000..2473859
--- /dev/null
+++ b/Code/EventGenerator/JobStandAloneKSpiTightCut.py
@@ -0,0 +1,14 @@
+#Event Type: 12115178
+from Configurables import Generation
+Generation().EventType = 12115179
+from Configurables import StandAloneDecayTool
+Generation().SampleGenerationTool = "StandAloneDecayTool";
+Generation().addTool( StandAloneDecayTool )
+Generation().StandAloneDecayTool.ProductionTool = "PythiaProduction";
+
+from Configurables import ToolSvc
+from Configurables import EvtGenDecay
+
+ToolSvc().addTool( EvtGenDecay )
+ToolSvc().EvtGenDecay.UserDecayFile ="$DECFILESROOT/dkfiles/Bu_Kstmumu,KSpi=PHSP,flatq2,DecProdCut,TightCut.dec"#Bu_Kstmumu\,KSpi\=PHSP\,flatq2\,DecProdCut\,MomCut.dec
+Generation().StandAloneDecayTool.SignalPIDList = [ 521,-521 ]
diff --git a/Code/EventGenerator/JobStandAlone_KpPi0_PHSPMC.py b/Code/EventGenerator/JobStandAlone_KpPi0_PHSPMC.py
new file mode 100644
index 0000000..35d2c3d
--- /dev/null
+++ b/Code/EventGenerator/JobStandAlone_KpPi0_PHSPMC.py
@@ -0,0 +1,14 @@
+#Event Type: 12115102
+from Configurables import Generation
+Generation().EventType = 12113446
+#from Configurables import StandAloneDecayTool
+Generation().SampleGenerationTool = "StandAloneDecayTool";
+Generation().addTool( StandAloneDecayTool )
+Generation().StandAloneDecayTool.ProductionTool = "PythiaProduction";
+
+from Configurables import ToolSvc
+from Configurables import EvtGenDecay
+
+ToolSvc().addTool( EvtGenDecay )
+ToolSvc().EvtGenDecay.UserDecayFile ="$DECFILESROOT/dkfiles/Bu_Kstmumu,Kpi0=PHSP,flatq2,DecProdCut,TightCut.dec"
+Generation().StandAloneDecayTool.SignalPIDList = [ 521,-521 ]
diff --git a/Code/EventGenerator/JobStandAlone_KpPi0_ReferenceMC.py b/Code/EventGenerator/JobStandAlone_KpPi0_ReferenceMC.py
new file mode 100644
index 0000000..1d2e97f
--- /dev/null
+++ b/Code/EventGenerator/JobStandAlone_KpPi0_ReferenceMC.py
@@ -0,0 +1,14 @@
+#Event Type: 12115102
+from Configurables import Generation
+Generation().EventType = 12143401
+#from Configurables import StandAloneDecayTool
+#Generation().SampleGenerationTool = "StandAloneDecayTool";
+#Generation().addTool( StandAloneDecayTool )
+#Generation().StandAloneDecayTool.ProductionTool = "PythiaProduction";
+
+from Configurables import ToolSvc
+from Configurables import EvtGenDecay
+
+ToolSvc().addTool( EvtGenDecay )
+ToolSvc().EvtGenDecay.UserDecayFile ="$DECFILESROOT/dkfiles/Bu_JpsiKst,mm,Kpi0=DecProdCut.dec"
+#Generation().StandAloneDecayTool.SignalPIDList = [ 521,-521 ]
diff --git a/Code/EventGenerator/JobStandAlone_KpPi0_SignalMC.py b/Code/EventGenerator/JobStandAlone_KpPi0_SignalMC.py
new file mode 100644
index 0000000..fddbbb2
--- /dev/null
+++ b/Code/EventGenerator/JobStandAlone_KpPi0_SignalMC.py
@@ -0,0 +1,14 @@
+#Event Type: 12115102
+from Configurables import Generation
+Generation().EventType = 12113100
+from Configurables import StandAloneDecayTool
+Generation().SampleGenerationTool = "StandAloneDecayTool";
+Generation().addTool( StandAloneDecayTool )
+Generation().StandAloneDecayTool.ProductionTool = "PythiaProduction";
+
+from Configurables import ToolSvc
+from Configurables import EvtGenDecay
+
+ToolSvc().addTool( EvtGenDecay )
+ToolSvc().EvtGenDecay.UserDecayFile ="$DECFILESROOT/dkfiles/Bu_Kstmumu,Kpi0=DecProdCut.dec"
+Generation().StandAloneDecayTool.SignalPIDList = [ 521,-521 ]
diff --git a/Code/EventGenerator/getTupleFromGauss.py b/Code/EventGenerator/getTupleFromGauss.py
new file mode 100644
index 0000000..421f990
--- /dev/null
+++ b/Code/EventGenerator/getTupleFromGauss.py
@@ -0,0 +1,82 @@
+from Configurables import (
+ DaVinci,
+ EventSelector,
+ PrintMCTree,
+ MCDecayTreeTuple,
+ TupleToolMCTruth
+)
+from DecayTreeTuple.Configuration import *
+
+"""Configure the variables below with:
+decay: Decay you want to inspect, using 'newer' LoKi decay descriptor syntax,
+decay_heads: Particles you'd like to see the decay tree of,
+datafile: Where the file created by the Gauss generation phase is, and
+year: What year the MC is simulating.
+"""
+
+# Select correct MC sample
+RefChan = False
+PHSP = True
+
+# https://twiki.cern.ch/twiki/bin/view/LHCb/FAQ/LoKiNewDecayFinders
+decay = "[B+ => ^(K*(892)+ => ^K+ ^(pi0=> ^gamma ^gamma)) ^mu- ^mu+]CC"
+if (RefChan): decay = "[B+ => ^(K*(892)+ => ^K+ ^(pi0=> ^gamma ^gamma)) ^(J/psi(1S) => ^mu- ^mu+)]CC"
+decay_heads = ["B+", "B-"]
+
+#Path to datafile
+datafile = "/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/EvtGen/GaussDev_v49r12/MCTruth.sim"
+if (RefChan): datafile =datafile.replace(".sim","_RefChan.sim",1)
+if (PHSP): datafile =datafile.replace(".sim","_PHSP.sim",1)
+
+year = 2017
+
+# For a quick and dirty check, you don't need to edit anything below here.
+##########################################################################
+
+# Create an MC DTT containing any candidates matching the decay descriptor
+mctuple = MCDecayTreeTuple("MCDecayTreeTuple")
+mctuple.Decay = decay
+
+# Name of the .xgen file produced by Gauss
+EventSelector().Input = ["DATAFILE='{0}' TYP='POOL_ROOTTREE' Opt='READ'".format(datafile)]
+
+# Configure DaVinci
+DaVinci().TupleFile =datafile.replace(".sim","_orig.root",1)
+DaVinci().HistogramFile = "DVntuple_histo.root"
+DaVinci().Simulation = True
+DaVinci().Lumi = False
+DaVinci().DataType = str(year)
+DaVinci().UserAlgorithms = [mctuple]
+
+def doIt():
+ """
+ specific post-config action for (x)GEN-files
+ """
+ extension = "xgen"
+ ext = extension.upper()
+
+ from Configurables import DataOnDemandSvc
+ dod = DataOnDemandSvc ()
+ from copy import deepcopy
+ algs = deepcopy ( dod.AlgMap )
+ bad = set()
+ for key in algs :
+ if 0 <= key.find ( 'Rec' ) : bad.add ( key )
+ elif 0 <= key.find ( 'Raw' ) : bad.add ( key )
+ elif 0 <= key.find ( 'DAQ' ) : bad.add ( key )
+ elif 0 <= key.find ( 'Trigger' ) : bad.add ( key )
+ elif 0 <= key.find ( 'Phys' ) : bad.add ( key )
+ elif 0 <= key.find ( 'Prev/' ) : bad.add ( key )
+ elif 0 <= key.find ( 'Next/' ) : bad.add ( key )
+ elif 0 <= key.find ( '/MC/' ) and 'GEN' == ext : bad.add ( key )
+
+ for b in bad :
+ del algs[b]
+
+ dod.AlgMap = algs
+
+ from Configurables import EventClockSvc, CondDB
+ EventClockSvc ( EventTimeDecoder = "FakeEventTime" )
+ CondDB ( IgnoreHeartBeat = True )
+
+appendPostConfigAction( doIt )
diff --git a/Code/Extract_functions_with_parameters.py b/Code/Extract_functions_with_parameters.py
new file mode 100644
index 0000000..cfa328a
--- /dev/null
+++ b/Code/Extract_functions_with_parameters.py
@@ -0,0 +1,217 @@
+import sys
+import re
+#First argument is the filename
+fileName = sys.argv[1]
+
+
+def stopLoopLinesClass(line):
+ if ("public" in line): return True
+ if ("private" in line): return True
+ if ("(" in line): return True
+ if (")" in line): return True
+ if ("}" in line): return True
+ return False
+
+def FormatClasses(class_full):
+ class_full = re.split("\n",class_full)
+
+ name = class_full[0].replace("class ","")[0:-1]
+ public_vars = []
+ private_vars = []
+ functions = []
+
+ for idx,line in enumerate(class_full[1:]):
+ line = line[4:] #Remove the indent
+ if (line.startswith(" ")): continue
+ if (line.startswith("public:") or line.startswith("ic:")):
+ idx = idx+1
+ while (not stopLoopLinesClass(class_full[idx+1])):
+ public_vars.append(class_full[idx+1].lstrip())
+ idx = idx+1
+ if (line.startswith("private:") or line.startswith("te:")):
+ idx = idx+1
+ while (not stopLoopLinesClass(class_full[idx+1])):
+ private_vars.append(class_full[idx].lstrip())
+ idx = idx+1
+ if ("(" in line):
+ tmp = line
+ if (")" not in line):
+ while (")" not in class_full[idx]):
+ tmp = tmp + class_full[idx].strip()
+ idx = idx+1
+ tmp = tmp + class_full[idx].strip()
+ functions.append(tmp)
+
+ return name, public_vars, private_vars, functions
+
+
+def isPythonFile(fileName):
+ if (fileName.endswith(".py")):
+ return True
+ else:
+ return False
+
+def ReadFile(fileName): #Returns the read lines and an integer, that is true when the file if a python file
+ with open(fileName) as f:
+ lines = f.readlines()
+ return lines
+
+def AddCommentWithLink(functionName, isPython):
+ #Strip the data type from the title and add ()
+ functionTitle = functionName
+ if (not isPython): functionTitle = functionTitle[functionTitle.rfind(' '):]
+ # Now parse the name to create the link
+ functionLink = functionName
+ for symbol in [" ","::"]:
+ functionLink = functionLink.replace(symbol,"-")
+ for symbol in ["(",")","\*","*"]:
+ functionLink = functionLink.replace(symbol,"-")
+ #Print the reference as it would be used in text
+ return ("[comment]: # (["+functionTitle.strip()+"()](#" + functionLink.lower()+ "))")
+
+def ReadCpp(lines):
+ globals_list = []
+ function_list = []
+ classes_list = []
+
+
+ for idx,line in enumerate(lines):
+ if (line.startswith(" ")): continue
+ if (line.startswith("}")): continue
+ if (line.startswith("//")): continue
+ if (line.startswith("#")): continue
+ if (line.startswith("using")): continue
+ if (line.startswith("class")):
+ tmp = ""
+ while ("};" not in lines[idx]):
+ tmp = tmp + lines[idx]
+ idx = idx+1
+ tmp = tmp + lines[idx].strip()
+ classes_list.append(tmp)
+ if (line.startswith("struct")):
+ tmp = ""
+ while ("}" not in lines[idx]):
+ tmp = tmp + lines[idx]
+ idx = idx+1
+ tmp = tmp + lines[idx].strip()
+ classes_list.append(tmp)
+
+ if (line.isspace()): continue
+ if ("(" not in line): globals_list.append(line.strip())
+ elif (")" not in line):
+ tmp = ""
+ while (")" not in lines[idx]):
+ tmp = tmp + lines[idx].strip()
+ idx = idx+1
+ tmp = tmp + lines[idx].strip()
+ function_list.append(tmp)
+ else: function_list.append(line.strip())
+
+ for cl in classes_list: FormatClasses(cl)
+
+ globals = []
+ for glob in globals_list:
+ glob = glob.replace(";","")
+ for tmp in glob.split(','): globals.append(tmp.lstrip())
+
+ print("\n\n## Global variables:\n")
+ for tmp in globals: print("* "+tmp)
+
+ print("\n\n# Classes")
+
+ for cl in classes_list:
+ name, pub, priv, funcs = FormatClasses(cl)
+ print ("### "+name)
+ print ("* **Private members:**")
+ for p in priv:
+ print(" * "+ p.replace(";",""))
+ print ("* **Public members:**")
+ for p in pub:
+ print(" * "+ p.replace(";",""))
+ print ("* **Functions:**")
+ for f in funcs:
+ f = f.replace("){","")
+ f = f.replace(") {","")
+ f = f.replace("*","\*")
+ funcs = f.split("(")
+ funcs[1] = funcs[1].split(',')
+ if (len(funcs[1])>0) and (funcs[1][0].strip()!=""):
+ print(" * **"+funcs[0]+"()**\n")
+ print (AddCommentWithLink(funcs[0],False))
+ print(" * **Parameters**")
+ for params in funcs[1]:
+ print(" * "+params.lstrip())
+ print(" * **Return**")
+ elif ("~" in funcs[0]): print(" * **"+funcs[0]+"()** // destructor")
+ else: print(" * **"+funcs[0]+"()** // constructor")
+
+ print("\n\n\n# Functions")
+ functions = []
+ for funcs in function_list:
+ funcs = funcs.replace("){","")
+ funcs = funcs.replace(") {","")
+ funcs = funcs.replace("*","\*")
+ functions = funcs.split("(")
+ functions[1] = functions[1].split(',')
+ print("### "+functions[0]+"()")
+ print(AddCommentWithLink(functions[0],False)+"\n")
+ print("* **Parameters**")
+ for params in functions[1]:
+ print(" * "+params.lstrip())
+ if ("void " not in functions[0]): print("* **Return**\n")
+ else: print("\n")
+ return
+
+
+def ReadPython(lines):
+ globals_list = []
+ function_list = []
+ classes_list = []
+
+ for idx,line in enumerate(lines):
+ if (line.startswith(" ")): continue
+ if (line.startswith("#")): continue #Remove comments
+ if (line.startswith("import")): continue
+ if (line == "\n"): continue #Remove empty lines
+ if (line.startswith("def")):
+ line = line.replace(":","")
+ if (")" not in line):
+ tmp = ""
+ while (")" not in lines[idx]):
+ tmp = tmp + lines[idx].strip()
+ idx = idx+1
+ tmp = tmp + lines[idx].strip()
+ function_list.append(tmp)
+ else: function_list.append(line.strip())
+ else:
+ globals_list.append(line.strip())
+
+
+
+ print("\n\n## Global variables:\n")
+ for tmp in globals_list: print("* "+tmp)
+
+
+ print("\n\n\n# Functions")
+ functions = []
+ for funcs in function_list:
+ funcs = funcs.replace(")","")
+ funcs = funcs.replace("def ","")
+ funcs = funcs.replace("*","\*")
+ functions = funcs.split("(")
+ functions[1] = functions[1].split(',')
+ print("### "+functions[0]+"()\n")
+ print(AddCommentWithLink(functions[0],True)+"\n")
+ print("* **Parameters**")
+ for params in functions[1]:
+ print(" * "+params.lstrip())
+ print("* **Return**\n")
+ return
+
+
+##### The main run
+
+if (isPythonFile(fileName)):
+ ReadPython(ReadFile(fileName))
+else :
+ ReadCpp(ReadFile(fileName))
diff --git a/Code/Ganga/CondDB_info/11114001.out b/Code/Ganga/CondDB_info/11114001.out
new file mode 100644
index 0000000..3947c45
--- /dev/null
+++ b/Code/Ganga/CondDB_info/11114001.out
@@ -0,0 +1,13 @@
+
+('/MC/2011/Beam3500GeV-2011-MagUp-Nu2-Pythia8/Sim08e/Digi13/Trig0x40760037/Reco14a/Stripping20r1NoPrescalingFlagged/11114001/ALLSTREAMS.DST', 'dddb-20130929', 'sim-20130522-vc-mu100', 32, 506402, 38001)
+('/MC/2011/Beam3500GeV-2011-MagDown-Nu2-Pythia8/Sim08e/Digi13/Trig0x40760037/Reco14a/Stripping20r1NoPrescalingFlagged/11114001/ALLSTREAMS.DST', 'dddb-20130929', 'sim-20130522-vc-md100', 31, 525851, 38003)
+
+('/MC/2012/Beam4000GeV-2012-MagUp-Nu2.5-Pythia8/Sim08b/Digi13/Trig0x409f0045/Reco14a/Stripping20NoPrescalingFlagged/11114001/ALLSTREAMS.DST', 'Sim08-20130503-1', 'Sim08-20130503-1-vc-mu100', 19, 260000, 30535)
+('/MC/2012/Beam4000GeV-2012-MagDown-Nu2.5-Pythia8/Sim08b/Digi13/Trig0x409f0045/Reco14a/Stripping20NoPrescalingFlagged/11114001/ALLSTREAMS.DST', 'Sim08-20130503-1', 'Sim08-20130503-1-vc-md100', 18, 257748, 30541)
+
+('/MC/2015/Beam6500GeV-2015-MagDown-Nu1.6-25ns-Pythia8/Sim09c/Trig0x411400a2/Reco15a/Turbo02/Stripping24r1NoPrescalingFlagged/11114001/ALLSTREAMS.DST', 'dddb-20170721-3', 'sim-20161124-vc-md100', 204, 502704, 70002)
+('/MC/2015/Beam6500GeV-2015-MagUp-Nu1.6-25ns-Pythia8/Sim09c/Trig0x411400a2/Reco15a/Turbo02/Stripping24r1NoPrescalingFlagged/11114001/ALLSTREAMS.DST', 'dddb-20170721-3', 'sim-20161124-vc-mu100', 203, 503254, 70016)
+
+('/MC/2016/Beam6500GeV-2016-MagUp-Nu1.6-25ns-Pythia8/Sim09b/Trig0x6138160F/Reco16/Turbo03/Stripping26NoPrescalingFlagged/11114001/ALLSTREAMS.DST', 'dddb-20150724', 'sim-20161124-2-vc-mu100', 56, 707852, 56295)
+('/MC/2016/Beam6500GeV-2016-MagDown-Nu1.6-25ns-Pythia8/Sim09b/Trig0x6138160F/Reco16/Turbo03/Stripping26NoPrescalingFlagged/11114001/ALLSTREAMS.DST', 'dddb-20150724', 'sim-20161124-2-vc-md100', 52, 657410, 56297)
+
diff --git a/Code/Ganga/CondDB_info/11144001.out b/Code/Ganga/CondDB_info/11144001.out
new file mode 100644
index 0000000..c714fdc
--- /dev/null
+++ b/Code/Ganga/CondDB_info/11144001.out
@@ -0,0 +1,40 @@
+
+
+('/MC/2011/Beam3500GeV-2011-MagDown-Nu2-Pythia8/Sim08b/Digi13/Trig0x40760037/Reco14a/Stripping20r1NoPrescalingFlagged/11144001/ALLSTREAMS.DST', 'Sim08-20130503', 'Sim08-20130503-vc-md100', 31, 510250, 30572)
+('/MC/2011/Beam3500GeV-2011-MagUp-Nu2-Pythia8/Sim08b/Digi13/Trig0x40760037/Reco14a/Stripping20r1NoPrescalingFlagged/11144001/ALLSTREAMS.DST', 'Sim08-20130503', 'Sim08-20130503-vc-mu100', 32, 505999, 30578)
+
+('/MC/2011/Beam3500GeV-2011-MagUp-Nu2-Pythia8/Sim08f/Digi13/Trig0x40760037/Reco14a/Stripping20r1NoPrescalingFlagged/11144001/ALLSTREAMS.DST', 'dddb-20130929', 'sim-20130522-vc-mu100', 185, 3076566, 42096)
+('/MC/2011/Beam3500GeV-2011-MagDown-Nu2-Pythia8/Sim08f/Digi13/Trig0x40760037/Reco14a/Stripping20r1NoPrescalingFlagged/11144001/ALLSTREAMS.DST', 'dddb-20130929', 'sim-20130522-vc-md100', 185, 3081998, 42098)
+
+
+
+('/MC/2012/Beam4000GeV-2012-MagDown-Nu2.5-Pythia8/Sim08a/Digi13/Trig0x409f0045/Reco14a/Stripping20NoPrescalingFlagged/11144001/ALLSTREAMS.DST', 'Sim08-20130503-1', 'Sim08-20130503-1-vc-md100', 34, 507999, 24782)
+('/MC/2012/Beam4000GeV-2012-MagUp-Nu2.5-Pythia8/Sim08a/Digi13/Trig0x409f0045/Reco14a/Stripping20NoPrescalingFlagged/11144001/ALLSTREAMS.DST', 'Sim08-20130503-1', 'Sim08-20130503-1-vc-mu100', 33, 511997, 24784)
+
+('/MC/2012/Beam4000GeV-2012-MagDown-Nu2.5-Pythia8/Sim08c/Digi13/Trig0x409f0045/Reco14a/Stripping20NoPrescalingFlagged/11144001/ALLSTREAMS.DST', 'dddb-20130929-1', 'sim-20130522-1-vc-md100', 96, 1508496, 32285)
+('/MC/2012/Beam4000GeV-2012-MagUp-Nu2.5-Pythia8/Sim08c/Digi13/Trig0x409f0045/Reco14a/Stripping20NoPrescalingFlagged/11144001/ALLSTREAMS.DST', 'dddb-20130929-1', 'sim-20130522-1-vc-mu100', 90, 1505995, 32287)
+
+('/MC/2012/Beam4000GeV-2012-MagUp-Nu2.5-Pythia8/Sim08f/Digi13/Trig0x409f0045/Reco14a/Stripping20NoPrescalingFlagged/11144001/ALLSTREAMS.DST', 'dddb-20130929-1', 'sim-20130522-1-vc-mu100', 214, 4425822, 42092)
+('/MC/2012/Beam4000GeV-2012-MagDown-Nu2.5-Pythia8/Sim08f/Digi13/Trig0x409f0045/Reco14a/Stripping20NoPrescalingFlagged/11144001/ALLSTREAMS.DST', 'dddb-20130929-1', 'sim-20130522-1-vc-md100', 216, 4435958, 42094)
+
+
+
+('/MC/2015/Beam6500GeV-2015-MagDown-Nu1.6-25ns-Pythia8/Sim09c/Trig0x411400a2/Reco15a/Turbo02/Stripping24r1NoPrescalingFlagged/11144001/ALLSTREAMS.DST', 'dddb-20170721-3', 'sim-20161124-vc-md100', 202, 501887, 70004)
+('/MC/2015/Beam6500GeV-2015-MagUp-Nu1.6-25ns-Pythia8/Sim09c/Trig0x411400a2/Reco15a/Turbo02/Stripping24r1NoPrescalingFlagged/11144001/ALLSTREAMS.DST', 'dddb-20170721-3', 'sim-20161124-vc-mu100', 202, 502444, 70012)
+
+('/MC/2015/Beam6500GeV-2015-MagDown-Nu1.6-25ns-Pythia8/Sim09c/Trig0x411400a2/Reco15a/Turbo02/Stripping24r1NoPrescalingFlagged/11144001/ALLSTREAMS.MDST', 'dddb-20170721-3', 'sim-20161124-vc-md100', 395, 1003236, 75398)
+('/MC/2015/Beam6500GeV-2015-MagUp-Nu1.6-25ns-Pythia8/Sim09c/Trig0x411400a2/Reco15a/Turbo02/Stripping24r1NoPrescalingFlagged/11144001/ALLSTREAMS.MDST', 'dddb-20170721-3', 'sim-20161124-vc-mu100', 396, 1001066, 75400)
+
+('/MC/2015/Beam6500GeV-2015-MagUp-Nu1.6-25ns-Pythia8/Sim09c/Trig0x411400a2/Reco15a/Turbo02/Stripping24r1NoPrescalingFlagged/11144001/ALLSTREAMS.DST', 'dddb-20170721-3', 'sim-20161124-vc-mu100', 203, 504950, 76060)
+('/MC/2015/Beam6500GeV-2015-MagDown-Nu1.6-25ns-Pythia8/Sim09c/Trig0x411400a2/Reco15a/Turbo02/Stripping24r1NoPrescalingFlagged/11144001/ALLSTREAMS.DST', 'dddb-20170721-3', 'sim-20161124-vc-md100', 198, 501188, 76062)
+
+
+
+('/MC/2016/Beam6500GeV-2016-MagDown-Nu1.6-25ns-Pythia8/Sim09c/Trig0x6138160F/Reco16/Turbo03/Stripping28r1NoPrescalingFlagged/11144001/ALLSTREAMS.MDST', 'dddb-20170721-3', 'sim-20170721-2-vc-md100', 2967, 7495109, 75394)
+('/MC/2016/Beam6500GeV-2016-MagUp-Nu1.6-25ns-Pythia8/Sim09c/Trig0x6138160F/Reco16/Turbo03/Stripping28r1NoPrescalingFlagged/11144001/ALLSTREAMS.MDST', 'dddb-20170721-3', 'sim-20170721-2-vc-mu100', 3171, 8028918, 75396)
+
+('/MC/2016/Beam6500GeV-2016-MagUp-Nu1.6-25ns-Pythia8/Sim09b/Trig0x6138160F/Reco16/Turbo03/Stripping26NoPrescalingFlagged/11144001/ALLSTREAMS.DST', 'dddb-20150724', 'sim-20161124-2-vc-mu100', 56, 697263, 56291)
+('/MC/2016/Beam6500GeV-2016-MagDown-Nu1.6-25ns-Pythia8/Sim09b/Trig0x6138160F/Reco16/Turbo03/Stripping26NoPrescalingFlagged/11144001/ALLSTREAMS.DST', 'dddb-20150724', 'sim-20161124-2-vc-md100', 59, 736790, 56299)
+
+('/MC/2016/Beam6500GeV-2016-MagUp-Nu1.6-25ns-Pythia8/Sim09b/Trig0x6138160F/Reco16/Turbo03/Stripping26NoPrescalingFlagged/11144001/ALLSTREAMS.DST', 'dddb-20150724', 'sim-20161124-2-vc-mu100', 199, 500274, 62841)
+('/MC/2016/Beam6500GeV-2016-MagDown-Nu1.6-25ns-Pythia8/Sim09b/Trig0x6138160F/Reco16/Turbo03/Stripping26NoPrescalingFlagged/11144001/ALLSTREAMS.DST', 'dddb-20150724', 'sim-20161124-2-vc-md100', 206, 515280, 62849)
diff --git a/Code/Ganga/CondDB_info/12113445.out b/Code/Ganga/CondDB_info/12113445.out
new file mode 100644
index 0000000..99f7399
--- /dev/null
+++ b/Code/Ganga/CondDB_info/12113445.out
@@ -0,0 +1,11 @@
+('/MC/2016/Beam6500GeV-2016-MagDown-Nu1.6-25ns-Pythia8/Sim09c/Trig0x6138160F/Reco16/Turbo03/Stripping28Filtered/12113445/B2XMUMU.STRIP.MDST', 'dddb-20170721-3', 'sim-20170721-2-vc-md100', 8, 214587, 67137)
+('/MC/2016/Beam6500GeV-2016-MagUp-Nu1.6-25ns-Pythia8/Sim09c/Trig0x6138160F/Reco16/Turbo03/Stripping28Filtered/12113445/B2XMUMU.STRIP.MDST', 'dddb-20170721-3', 'sim-20170721-2-vc-mu100', 8, 216923, 67143)
+
+('/MC/2012/Beam4000GeV-2012-MagDown-Nu2.5-Pythia8/Sim09b/Trig0x409f0045/Reco14c/Stripping21Filtered/12113445/B2XMUMU.STRIP.DST', 'dddb-20150928', 'sim-20160321-2-vc-md100', 17, 175028, 67579)
+('/MC/2012/Beam4000GeV-2012-MagUp-Nu2.5-Pythia8/Sim09b/Trig0x409f0045/Reco14c/Stripping21Filtered/12113445/B2XMUMU.STRIP.DST', 'dddb-20150928', 'sim-20160321-2-vc-mu100', 20, 203760, 67667)
+
+('/MC/2011/Beam3500GeV-2011-MagDown-Nu2-Pythia8/Sim09b/Trig0x40760037/Reco14c/Stripping21r1Filtered/12113445/B2XMUMU.STRIP.DST', 'dddb-20160318-1', 'sim-20160614-1-vc-md100', 10, 94529, 67814)
+('/MC/2011/Beam3500GeV-2011-MagUp-Nu2-Pythia8/Sim09b/Trig0x40760037/Reco14c/Stripping21r1Filtered/12113445/B2XMUMU.STRIP.DST', 'dddb-20160318-1', 'sim-20160614-1-vc-mu100', 9, 91600, 67820)
+
+('/MC/2015/Beam6500GeV-2015-MagDown-Nu1.6-25ns-Pythia8/Sim09b/Trig0x411400a2/Reco15a/Turbo02/Stripping24Filtered/12113445/B2XMUMU.STRIP.MDST', 'dddb-20150724', 'sim-20161124-vc-md100', 7, 76712, 68400)
+('/MC/2015/Beam6500GeV-2015-MagUp-Nu1.6-25ns-Pythia8/Sim09b/Trig0x411400a2/Reco15a/Turbo02/Stripping24Filtered/12113445/B2XMUMU.STRIP.MDST', 'dddb-20150724', 'sim-20161124-vc-mu100', 6, 72037, 68403)
diff --git a/Code/Ganga/CondDB_info/12115178.out b/Code/Ganga/CondDB_info/12115178.out
new file mode 100644
index 0000000..f33e1a2
--- /dev/null
+++ b/Code/Ganga/CondDB_info/12115178.out
@@ -0,0 +1,17 @@
+('/MC/2016/Beam6500GeV-2016-MagDown-Nu1.6-25ns-Pythia8/Sim09c/Trig0x6138160F/Reco16/Turbo03/Stripping28Filtered/12115178/B2XMUMU.STRIP.MDST', 'dddb-20170721-3', 'sim-20170721-2-vc-md100', 8, 220235, 67134)
+('/MC/2016/Beam6500GeV-2016-MagUp-Nu1.6-25ns-Pythia8/Sim09c/Trig0x6138160F/Reco16/Turbo03/Stripping28Filtered/12115178/B2XMUMU.STRIP.MDST', 'dddb-20170721-3', 'sim-20170721-2-vc-mu100', 8, 220078, 67140)
+
+('/MC/2012/Beam4000GeV-2012-MagDown-Nu2.5-Pythia8/Sim09b/Trig0x409f0045/Reco14c/Stripping21Filtered/12115178/B2XMUMU.STRIP.DST', 'dddb-20150928', 'sim-20160321-2-vc-md100', 19, 193415, 67576)
+('/MC/2012/Beam4000GeV-2012-MagUp-Nu2.5-Pythia8/Sim09b/Trig0x409f0045/Reco14c/Stripping21Filtered/12115178/B2XMUMU.STRIP.DST', 'dddb-20150928', 'sim-20160321-2-vc-mu100', 13, 185240, 67664)
+
+('/MC/2011/Beam3500GeV-2011-MagDown-Nu2-Pythia8/Sim09b/Trig0x40760037/Reco14c/Stripping21r1Filtered/12115178/B2XMUMU.STRIP.DST', 'dddb-20160318-1', 'sim-20160614-1-vc-md100', 11, 106817, 67811)
+('/MC/2011/Beam3500GeV-2011-MagUp-Nu2-Pythia8/Sim09b/Trig0x40760037/Reco14c/Stripping21r1Filtered/12115178/B2XMUMU.STRIP.DST', 'dddb-20160318-1', 'sim-20160614-1-vc-mu100', 9, 101420, 67817)
+
+('/MC/2015/Beam6500GeV-2015-MagDown-Nu1.6-25ns-Pythia8/Sim09b/Trig0x411400a2/Reco15a/Turbo02/Stripping24Filtered/12115178/B2XMUMU.STRIP.MDST', 'dddb-20150724', 'sim-20161124-vc-md100', 8, 49633, 68118)
+('/MC/2015/Beam6500GeV-2015-MagUp-Nu1.6-25ns-Pythia8/Sim09b/Trig0x411400a2/Reco15a/Turbo02/Stripping24Filtered/12115178/B2XMUMU.STRIP.MDST', 'dddb-20150724', 'sim-20161124-vc-mu100', 8, 49499, 68121)
+
+
+('/MC/2012/Beam4000GeV-2012-MagUp-Nu2.5-Pythia8/Sim09c/Trig0x4097003d/Reco14c/Stripping21NoPrescalingFlagged/12115178/B2XMUMU.STRIP.DST', 'dddb-20170721-2', 'sim-20160321-2-vc-mu100', 1, 14261, 75999)
+
+('/MC/2012/Beam4000GeV-2012-MagDown-Nu2.5-Pythia8/Sim09c/Trig0x4097003d/Reco14c/Stripping21NoPrescalingFlagged/12115178/B2XMUMU.STRIP.DST', 'dddb-20170721-2', 'sim-20160321-2-vc-md100', 10, 53638, 76002)
+
diff --git a/Code/Ganga/CondDB_info/12143401.out b/Code/Ganga/CondDB_info/12143401.out
new file mode 100644
index 0000000..3a24c11
--- /dev/null
+++ b/Code/Ganga/CondDB_info/12143401.out
@@ -0,0 +1,20 @@
+('/MC/2012/Beam4000GeV-2012-MagDown-Nu2.5-Pythia8/Sim08a/Digi13/Trig0x409f0045/Reco14/Stripping20NoPrescalingFlagged/12143401/ALLSTREAMS.DST', 'Sim08-20130503-1', 'Sim08-20130503-1-vc-md100', 66, 1016495, 24334)
+('/MC/2012/Beam4000GeV-2012-MagUp-Nu2.5-Pythia8/Sim08a/Digi13/Trig0x409f0045/Reco14/Stripping20NoPrescalingFlagged/12143401/ALLSTREAMS.DST', 'Sim08-20130503-1', 'Sim08-20130503-1-vc-mu100', 68, 1011494, 24336)
+
+('/MC/2011/Beam3500GeV-2011-MagDown-Nu2-Pythia8/Sim08e/Digi13/Trig0x40760037/Reco14a/Stripping20r1NoPrescalingFlagged/12143401/ALLSTREAMS.DST', 'dddb-20130929', 'sim-20130522-vc-md100', 31, 505626, 35713)
+('/MC/2011/Beam3500GeV-2011-MagUp-Nu2-Pythia8/Sim08e/Digi13/Trig0x40760037/Reco14a/Stripping20r1NoPrescalingFlagged/12143401/ALLSTREAMS.DST', 'dddb-20130929', 'sim-20130522-vc-mu100', 30, 521811, 36008)
+
+('/MC/2012/Beam4000GeV-2012-MagDown-Nu2.5-Pythia8/Sim08e/Digi13/Trig0x409f0045/Reco14a/Stripping20NoPrescalingFlagged/12143401/ALLSTREAMS.DST', 'dddb-20130929-1', 'sim-20130522-1-vc-md100', 106, 2107119, 37896)
+('/MC/2012/Beam4000GeV-2012-MagUp-Nu2.5-Pythia8/Sim08e/Digi13/Trig0x409f0045/Reco14a/Stripping20NoPrescalingFlagged/12143401/ALLSTREAMS.DST', 'dddb-20130929-1', 'sim-20130522-1-vc-mu100', 104, 2101731, 37898)
+
+('/MC/2011/Beam3500GeV-2011-MagDown-Nu2-Pythia8/Sim08e/Digi13/Trig0x40760037/Reco14a/Stripping20r1NoPrescalingFlagged/12143401/ALLSTREAMS.DST', 'dddb-20130929', 'sim-20130522-vc-md100', 64, 1000643, 38211)
+('/MC/2011/Beam3500GeV-2011-MagUp-Nu2-Pythia8/Sim08e/Digi13/Trig0x40760037/Reco14a/Stripping20r1NoPrescalingFlagged/12143401/ALLSTREAMS.DST', 'dddb-20130929', 'sim-20130522-vc-mu100', 63, 1022157, 38213)
+
+('/MC/2012/Beam4000GeV-2012-MagUp-Nu2.5-Pythia8/Sim08g/Digi13/Trig0x409f0045/Reco14a/Stripping21NoPrescalingFlagged/12143401/ALLSTREAMS.DST', 'dddb-20130929-1', 'sim-20130522-1-vc-mu100', 28, 506406, 43277)
+('/MC/2012/Beam4000GeV-2012-MagDown-Nu2.5-Pythia8/Sim08g/Digi13/Trig0x409f0045/Reco14a/Stripping21NoPrescalingFlagged/12143401/ALLSTREAMS.DST', 'dddb-20130929-1', 'sim-20130522-1-vc-md100', 25, 519292, 43279)
+
+('/MC/2011/Beam3500GeV-2011-MagUp-Nu2-Pythia8/Sim09a/Trig0x40760037/Reco14c/Stripping21r1NoPrescalingFlagged/12143401/ALLSTREAMS.DST', 'dddb-20160318-1', 'sim-20160614-1-vc-mu100', 99, 1007920, 54086)
+('/MC/2011/Beam3500GeV-2011-MagDown-Nu2-Pythia8/Sim09a/Trig0x40760037/Reco14c/Stripping21r1NoPrescalingFlagged/12143401/ALLSTREAMS.DST', 'dddb-20160318-1', 'sim-20160614-1-vc-md100', 102, 1011831, 54094)
+
+('/MC/2012/Beam4000GeV-2012-MagUp-Nu2.5-Pythia8/Sim09a/Trig0x409f0045/Reco14c/Stripping21NoPrescalingFlagged/12143401/ALLSTREAMS.DST', 'dddb-20150928', 'sim-20160321-2-vc-mu100', 87, 1000278, 54104)
+('/MC/2012/Beam4000GeV-2012-MagDown-Nu2.5-Pythia8/Sim09a/Trig0x409f0045/Reco14c/Stripping21NoPrescalingFlagged/12143401/ALLSTREAMS.DST', 'dddb-20150928', 'sim-20160321-2-vc-md100', 81, 1003888, 54108)
diff --git a/Code/Ganga/CondDB_info/12145101.out b/Code/Ganga/CondDB_info/12145101.out
new file mode 100644
index 0000000..d401ccc
--- /dev/null
+++ b/Code/Ganga/CondDB_info/12145101.out
@@ -0,0 +1,6 @@
+('/MC/2012/Beam4000GeV-2012-MagUp-Nu2.5-Pythia8/Sim08a/Digi13/Trig0x409f0045/Reco14a/Stripping20NoPrescalingFlagged/12145101/ALLSTREAMS.DST', 'Sim08-20130503-1', 'Sim08-20130503-1-vc-mu100', 11, 132499, 29548)
+
+
+
+('/MC/2012/Beam4000GeV-2012-MagDown-Nu2.5-Pythia8/Sim08a/Digi13/Trig0x409f0045/Reco14a/Stripping20NoPrescalingFlagged/12145101/ALLSTREAMS.DST', 'Sim08-20130503-1', 'Sim08-20130503-1-vc-md100', 14, 244999, 29556)
+
diff --git a/Code/Ganga/CondDB_info/12145102.out b/Code/Ganga/CondDB_info/12145102.out
new file mode 100644
index 0000000..e69de29
diff --git a/Code/Ganga/CondDB_info/12245000.out b/Code/Ganga/CondDB_info/12245000.out
new file mode 100644
index 0000000..a1e16be
--- /dev/null
+++ b/Code/Ganga/CondDB_info/12245000.out
@@ -0,0 +1,5 @@
+('/MC/2012/Beam4000GeV-2012-MagUp-Nu2.5-Pythia8/Sim08a/Digi13/Trig0x409f0045/Reco14a/Stripping20NoPrescalingFlagged/12245000/ALLSTREAMS.DST', 'Sim08-20130503-1', 'Sim08-20130503-1-vc-mu100', 19, 265250, 26676)
+('/MC/2012/Beam4000GeV-2012-MagDown-Nu2.5-Pythia8/Sim08a/Digi13/Trig0x409f0045/Reco14a/Stripping20NoPrescalingFlagged/12245000/ALLSTREAMS.DST', 'Sim08-20130503-1', 'Sim08-20130503-1-vc-md100', 20, 250249, 26684)
+('/MC/2012/Beam4000GeV-2012-MagUp-Nu2.5-Pythia6/Sim08a/Digi13/Trig0x409f0045/Reco14a/Stripping20NoPrescalingFlagged/12245000/ALLSTREAMS.DST', 'Sim08-20130503-1', 'Sim08-20130503-1-vc-mu100', 18, 265249, 26688)
+('/MC/2012/Beam4000GeV-2012-MagDown-Nu2.5-Pythia6/Sim08a/Digi13/Trig0x409f0045/Reco14a/Stripping20NoPrescalingFlagged/12245000/ALLSTREAMS.DST', 'Sim08-20130503-1', 'Sim08-20130503-1-vc-md100', 17, 251747, 26696)
+
diff --git a/Code/Ganga/CondDB_info/12435001.out b/Code/Ganga/CondDB_info/12435001.out
new file mode 100644
index 0000000..4dc4eb1
--- /dev/null
+++ b/Code/Ganga/CondDB_info/12435001.out
@@ -0,0 +1,5 @@
+('/MC/2011/Beam3500GeV-2011-MagUp-Nu2-Pythia8/Sim08e/Digi13/Trig0x40760037/Reco14a/Stripping20r1NoPrescalingFlagged/12435001/ALLSTREAMS.DST', 'dddb-20130929', 'sim-20130522-vc-mu100', 57, 1027740, 35956)
+('/MC/2011/Beam3500GeV-2011-MagDown-Nu2-Pythia8/Sim08e/Digi13/Trig0x40760037/Reco14a/Stripping20r1NoPrescalingFlagged/12435001/ALLSTREAMS.DST', 'dddb-20130929', 'sim-20130522-vc-md100', 58, 1038809, 35964)
+
+('/MC/2012/Beam4000GeV-2012-MagUp-Nu2.5-Pythia8/Sim08e/Digi13/Trig0x409f0045/Reco14a/Stripping20NoPrescalingFlagged/12435001/ALLSTREAMS.DST', 'dddb-20130929-1', 'sim-20130522-1-vc-mu100', 117, 2008883, 35976)
+('/MC/2012/Beam4000GeV-2012-MagDown-Nu2.5-Pythia8/Sim08e/Digi13/Trig0x409f0045/Reco14a/Stripping20NoPrescalingFlagged/12435001/ALLSTREAMS.DST', 'dddb-20130929-1', 'sim-20130522-1-vc-md100', 117, 2003930, 35982)
diff --git a/Code/Ganga/CondDB_info/12442001.out b/Code/Ganga/CondDB_info/12442001.out
new file mode 100644
index 0000000..10a8cdf
--- /dev/null
+++ b/Code/Ganga/CondDB_info/12442001.out
@@ -0,0 +1,15 @@
+
+('/MC/2012/Beam4000GeV-2012-MagDown-Nu2.5-Pythia8/Sim08a/Digi13/Trig0x409f0045/Reco14a/Stripping20NoPrescalingFlagged/12442001/ALLSTREAMS.DST', 'Sim08-20130503-1', 'Sim08-20130503-1-vc-md100', 148, 2504990, 30122)
+('/MC/2012/Beam4000GeV-2012-MagUp-Nu2.5-Pythia8/Sim08a/Digi13/Trig0x409f0045/Reco14a/Stripping20NoPrescalingFlagged/12442001/ALLSTREAMS.DST', 'Sim08-20130503-1', 'Sim08-20130503-1-vc-mu100', 150, 2535488, 30124)
+
+('/MC/2011/Beam3500GeV-2011-MagDown-Nu2-Pythia8/Sim08c/Digi13/Trig0x40760037/Reco14a/Stripping20r1NoPrescalingFlagged/12442001/ALLSTREAMS.DST', 'dddb-20130929', 'sim-20130522-vc-md100', 132, 2508491, 31970)
+('/MC/2011/Beam3500GeV-2011-MagUp-Nu2-Pythia8/Sim08c/Digi13/Trig0x40760037/Reco14a/Stripping20r1NoPrescalingFlagged/12442001/ALLSTREAMS.DST', 'dddb-20130929', 'sim-20130522-vc-mu100', 132, 2514495, 31972)
+
+('/MC/Dev/Beam6500GeV-Jun2015-MagDown-Nu1.6-25ns-Pythia8/Sim09Dev03/Trig0x410700a1/Reco15/Turbo01a/Stripping23r1NoPrescalingFlagged/12442001/ALLSTREAMS.DST', 'dddb-20150724', 'sim-20150813-vc-md100', 97, 1307031, 49351)
+('/MC/Dev/Beam6500GeV-Jun2015-MagUp-Nu1.6-25ns-Pythia8/Sim09Dev03/Trig0x410700a1/Reco15/Turbo01a/Stripping23r1NoPrescalingFlagged/12442001/ALLSTREAMS.DST', 'dddb-20150724', 'sim-20150813-vc-mu100', 101, 1399448, 49359)
+
+('/MC/Dev/Beam6500GeV-Jun2015-MagDown-Nu1.6-25ns-Pythia8/Sim09Dev03/Trig0x410700a1/Reco15/Turbo01a/Stripping23r1NoPrescalingFlagged/12442001/ALLSTREAMS.MDST', 'dddb-20150724', 'sim-20150813-vc-md100', 79, 1063805, 49506)
+('/MC/Dev/Beam6500GeV-Jun2015-MagUp-Nu1.6-25ns-Pythia8/Sim09Dev03/Trig0x410700a1/Reco15/Turbo01a/Stripping23r1NoPrescalingFlagged/12442001/ALLSTREAMS.MDST', 'dddb-20150724', 'sim-20150813-vc-mu100', 81, 1121189, 49512)
+
+('/MC/2016/Beam6500GeV-2016-MagDown-Nu1.6-25ns-Pythia8/Sim09b/Trig0x6138160F/Reco16/Turbo03/Stripping26NoPrescalingFlagged/12442001/ALLSTREAMS.DST', 'dddb-20150724', 'sim-20161124-2-vc-md100', 406, 5090001, 56657)
+('/MC/2016/Beam6500GeV-2016-MagUp-Nu1.6-25ns-Pythia8/Sim09b/Trig0x6138160F/Reco16/Turbo03/Stripping26NoPrescalingFlagged/12442001/ALLSTREAMS.DST', 'dddb-20150724', 'sim-20161124-2-vc-mu100', 483, 6055765, 56663)
diff --git a/Code/Ganga/LocationList/getJobList.py b/Code/Ganga/LocationList/getJobList.py
new file mode 100644
index 0000000..f8b57c6
--- /dev/null
+++ b/Code/Ganga/LocationList/getJobList.py
@@ -0,0 +1,19 @@
+from Ganga.GPI import jobs
+def getJobList(job,sub_list=None):
+ if isinstance (job, int) :
+ job = jobs(job)
+
+ # check if job has subjobs
+ jobList = []
+ if len(job.subjobs)>0:
+ if type(sub_list) is list:
+ jobList = []
+ for sj in sub_list:
+ jobList += job.subjobs.select(sj,sj,status="completed")
+ else:
+ jobList = job.subjobs.select(status="completed")
+ else:
+ if job.status=="completed":
+ jobList = [job]
+ return job,jobList
+
diff --git a/Code/Ganga/LocationList/jobloader_GetLocationList.sh b/Code/Ganga/LocationList/jobloader_GetLocationList.sh
new file mode 100755
index 0000000..651c994
--- /dev/null
+++ b/Code/Ganga/LocationList/jobloader_GetLocationList.sh
@@ -0,0 +1,129 @@
+#!/bin/bash
+#
+# #first initialize connection to Dirac by using:
+# lhcb-proxy-init
+
+PathToGangaFolder='/afs/cern.ch/user/r/rekopecn/gangadir/workspace/rekopecn/LocalXML'
+NameTagForOutputFiles='B2Kstmumu'
+#NameTagForOutputFiles='B2KstJpsi'
+NameOfRootfileInGangaOutput=''
+
+E_NO_ARGS=65
+if [ $# -eq 5 ] # Must have five command-line args to demo script.
+then
+ channel=$1
+ job=$2
+ year=$3
+ magnet=$4
+ datatype=$5
+ echo "Collecting $NameTagForOutputFiles for $year$magnet"
+else
+ echo "Please invoke this script with one or more command-line arguments in the following format:"
+ echo "./jobloader.sh CHANNEL JOB_ID YEAR MAGNET DATATYPE"
+ exit $E_NO_ARGS
+fi
+
+if [ -e data ]
+then
+ echo "folder data/ found!"
+else
+ echo "creating folder data/"
+ mkdir data
+fi
+
+if [ -e data/$datatype ]
+then
+ echo "folder data/$datatype found!"
+else
+ echo "creating folder data/$datatype"
+ mkdir data/$datatype
+fi
+
+
+if [ -e data/$datatype/$channel ]
+then
+ echo "folder data/$datatype/$channel found!"
+else
+ echo "creating folder data/$datatype/$channel"
+ mkdir data/$datatype/$channel
+fi
+
+if [ -e data/$datatype/$channel/$year$magnet ]
+then
+ echo "folder data/$datatype/$channel/$year$magnet found!"
+else
+ echo "creating folder data/$datatype/$channel/$year$magnet"
+ mkdir data/$datatype/$channel/$year$magnet
+fi
+
+maxNumberOfSubjobs=0
+if [ "$datatype" = "data" ];
+then
+ maxNumberOfSubjobs=150
+ echo "maxNumberOfSubjobs= $maxNumberOfSubjobs"
+fi
+
+if [ "$datatype" = "MC" ];
+then
+ maxNumberOfSubjobs=25
+ echo "maxNumberOfSubjobs= $maxNumberOfSubjobs"
+fi
+
+if [ "$datatype" = "MCref" ];
+then
+ maxNumberOfSubjobs=15
+ echo "maxNumberOfSubjobs= $maxNumberOfSubjobs"
+fi
+
+if [ "$datatype" = "PHSP" ];
+then
+ maxNumberOfSubjobs=15
+ echo "maxNumberOfSubjobs= $maxNumberOfSubjobs"
+fi
+
+
+if [ "$datatype" = "MCB0" ];
+then
+ maxNumberOfSubjobs=15
+ echo "maxNumberOfSubjobs= $maxNumberOfSubjobs"
+fi
+
+
+if [ "$datatype" = "MCK1" ];
+then
+ maxNumberOfSubjobs=15
+ echo "maxNumberOfSubjobs= $maxNumberOfSubjobs"
+fi
+
+
+if [ "$datatype" = "MCInc" ];
+then
+ maxNumberOfSubjobs=15
+ echo "maxNumberOfSubjobs= $maxNumberOfSubjobs"
+fi
+
+
+echo "Collecting $NameTagForOutputFiles for $datatype and $channel, $year$magnet location ..."
+counter=0
+prefix="root->"
+apperfix=":::"
+
+while [ $counter -lt $maxNumberOfSubjobs ]
+do
+ outfile=$year$magnet\_$NameTagForOutputFiles\_$counter.root
+
+ if [ -e $PathToGangaFolder/$job/$counter/output/\_\_postprocesslocations\_\_ ]
+ then
+ while read line
+ do
+ line="${line#*$prefix}"
+ line="${line%%$apperfix*}"
+ NameOfRootfileInGangaOutput="${line##*/}"
+ echo "$datatype $channel $year $magnet $counter $line" >> "ListOfLocations.out"
+ NameOfRootfileInGangaOutput="${line##*/}"
+ done < $PathToGangaFolder/$job/$counter/output/\_\_postprocesslocations\_\_
+ #else echo "file $PathToGangaFolder/$counter/\_\_postprocesslocations\_\_ not found!"
+ fi
+ let counter=$counter+1
+done
+echo "Finished downloading $datatype/$channel/$year$magnet."
diff --git a/Code/Ganga/LocationList/load_jobs.txt b/Code/Ganga/LocationList/load_jobs.txt
new file mode 100644
index 0000000..96bc4f3
--- /dev/null
+++ b/Code/Ganga/LocationList/load_jobs.txt
@@ -0,0 +1,136 @@
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% MC %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+./jobloader_GetLocationList.sh KshortPiplus 951 2011 Down MC
+./jobloader_GetLocationList.sh KshortPiplus 952 2012 Down MC
+./jobloader_GetLocationList.sh KshortPiplus 953 2015 Down MC
+./jobloader_GetLocationList.sh KshortPiplus 954 2016 Down MC
+
+./jobloader_GetLocationList.sh KshortPiplus 955 2011 Up MC
+./jobloader_GetLocationList.sh KshortPiplus 956 2012 Up MC
+./jobloader_GetLocationList.sh KshortPiplus 957 2015 Up MC
+./jobloader_GetLocationList.sh KshortPiplus 958 2016 Up MC
+
+./jobloader_GetLocationList.sh KshortPiplus 1410 2017 Down MC
+./jobloader_GetLocationList.sh KshortPiplus 1411 2017 Up MC
+
+./jobloader_GetLocationList.sh KshortPiplus 1419 2018 Down MC
+./jobloader_GetLocationList.sh KshortPiplus 1453 2018 Up MC
+
+
+
+./jobloader_GetLocationList.sh KplusPi0 1055 2011 Down MC
+./jobloader_GetLocationList.sh KplusPi0 1056 2012 Down MC
+./jobloader_GetLocationList.sh KplusPi0 1579 2015 Down MC
+./jobloader_GetLocationList.sh KplusPi0 1575 2016 Down MC
+
+./jobloader_GetLocationList.sh KplusPi0 1057 2011 Up MC
+./jobloader_GetLocationList.sh KplusPi0 1058 2012 Up MC
+./jobloader_GetLocationList.sh KplusPi0 1578 2015 Up MC
+./jobloader_GetLocationList.sh KplusPi0 1584 2016 Up MC
+
+./jobloader_GetLocationList.sh KplusPi0 1412 2017 Down MC
+./jobloader_GetLocationList.sh KplusPi0 1413 2017 Up MC
+
+./jobloader_GetLocationList.sh KplusPi0 1563 2018 Down MC
+./jobloader_GetLocationList.sh KplusPi0 1564 2018 Up MC
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% PHSP %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+./jobloader_GetLocationList.sh KshortPiplus 1444 2011 Down PHSP
+./jobloader_GetLocationList.sh KshortPiplus 1447 2011 Up PHSP
+./jobloader_GetLocationList.sh KplusPi0 1448 2011 Down PHSP
+./jobloader_GetLocationList.sh KplusPi0 1449 2011 Up PHSP
+
+./jobloader_GetLocationList.sh KshortPiplus 1442 2012 Down PHSP
+./jobloader_GetLocationList.sh KshortPiplus 1445 2012 Up PHSP
+./jobloader_GetLocationList.sh KplusPi0 1432 2012 Down PHSP
+./jobloader_GetLocationList.sh KplusPi0 1433 2012 Up PHSP
+
+./jobloader_GetLocationList.sh KshortPiplus 1443 2013 Down PHSP
+./jobloader_GetLocationList.sh KshortPiplus 1446 2013 Up PHSP
+
+
+./jobloader_GetLocationList.sh KshortPiplus 1546 2015 Down PHSP
+./jobloader_GetLocationList.sh KshortPiplus 1547 2015 Up PHSP
+./jobloader_GetLocationList.sh KplusPi0 1548 2015 Down PHSP
+./jobloader_GetLocationList.sh KplusPi0 1549 2015 Up PHSP
+
+./jobloader_GetLocationList.sh KshortPiplus 1486 2016 Down PHSP
+./jobloader_GetLocationList.sh KshortPiplus 1489 2016 Up PHSP
+./jobloader_GetLocationList.sh KplusPi0 1493 2016 Down PHSP
+./jobloader_GetLocationList.sh KplusPi0 1496 2016 Up PHSP
+
+./jobloader_GetLocationList.sh KshortPiplus 1487 2017 Down PHSP
+./jobloader_GetLocationList.sh KshortPiplus 1490 2017 Up PHSP
+./jobloader_GetLocationList.sh KplusPi0 1494 2017 Down PHSP
+./jobloader_GetLocationList.sh KplusPi0 1497 2017 Up PHSP
+
+./jobloader_GetLocationList.sh KshortPiplus 1499 2018 Down PHSP
+./jobloader_GetLocationList.sh KshortPiplus 1500 2018 Up PHSP
+./jobloader_GetLocationList.sh KplusPi0 1495 2018 Down PHSP
+./jobloader_GetLocationList.sh KplusPi0 1498 2018 Up PHSP
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Ref MC %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+./jobloader_GetLocationList.sh KshortPiplus 1097 2011 Down MCref
+./jobloader_GetLocationList.sh KshortPiplus 1098 2012 Down MCref
+
+./jobloader_GetLocationList.sh KshortPiplus 978 2011 Up MCref
+./jobloader_GetLocationList.sh KshortPiplus 979 2012 Up MCref
+
+./jobloader_GetLocationList.sh KshortPiplus 1556 2016 Down MCref
+./jobloader_GetLocationList.sh KshortPiplus 1557 2016 Up MCref
+
+
+./jobloader_GetLocationList.sh KplusPi0 1071 2011 Down MCref
+./jobloader_GetLocationList.sh KplusPi0 1072 2012 Down MCref
+./jobloader_GetLocationList.sh KplusPi0 1511 2015 Down MCref
+./jobloader_GetLocationList.sh KplusPi0 1512 2016 Down MCref
+
+
+./jobloader_GetLocationList.sh KplusPi0 1073 2011 Up MCref
+./jobloader_GetLocationList.sh KplusPi0 1074 2012 Up MCref
+./jobloader_GetLocationList.sh KplusPi0 1513 2015 Up MCref
+./jobloader_GetLocationList.sh KplusPi0 1514 2016 Up MCref
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Data %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+./jobloader_GetLocationList.sh KplusPi0 1059 2011 Down data
+./jobloader_GetLocationList.sh KplusPi0 1060 2012 Down data
+./jobloader_GetLocationList.sh KplusPi0 1533 2015 Down data
+./jobloader_GetLocationList.sh KplusPi0 1524 2016 Down data
+./jobloader_GetLocationList.sh KplusPi0 1403 2017 Down data
+./jobloader_GetLocationList.sh KplusPi0 1552 2018 Down data
+
+./jobloader_GetLocationList.sh KplusPi0 1063 2011 Up data
+./jobloader_GetLocationList.sh KplusPi0 1064 2012 Up data
+./jobloader_GetLocationList.sh KplusPi0 1525 2015 Up data
+./jobloader_GetLocationList.sh KplusPi0 1532 2016 Up data
+./jobloader_GetLocationList.sh KplusPi0 1405 2017 Up data
+./jobloader_GetLocationList.sh KplusPi0 1553 2018 Up data
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% TMP %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+./jobloader_GetLocationList.sh KplusPi0 1579 2015 Down MC
+./jobloader_GetLocationList.sh KplusPi0 1575 2016 Down MC
+
+./jobloader_GetLocationList.sh KplusPi0 1578 2015 Up MC
+./jobloader_GetLocationList.sh KplusPi0 1584 2016 Up MC
+
+
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/.imap/2011MagDown_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/.imap/2011MagDown_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/.imap/2011MagDown_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/.imap/2011MagDown_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/.imap/2011MagDown_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/.imap/2011MagDown_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/.imap/2011MagUp_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/.imap/2011MagUp_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/.imap/2011MagUp_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/.imap/2011MagUp_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/.imap/2011MagUp_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/.imap/2011MagUp_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/.imap/2012MagDown_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/.imap/2012MagDown_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/.imap/2012MagDown_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/.imap/2012MagDown_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/.imap/2012MagDown_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/.imap/2012MagDown_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/.imap/2012MagUp_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/.imap/2012MagUp_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/.imap/2012MagUp_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/.imap/2012MagUp_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/.imap/2012MagUp_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/.imap/2012MagUp_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/.imap/2015MagDown_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/.imap/2015MagDown_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/.imap/2015MagDown_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/.imap/2015MagDown_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/.imap/2015MagDown_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/.imap/2015MagDown_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/.imap/2015MagUp_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/.imap/2015MagUp_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/.imap/2015MagUp_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/.imap/2015MagUp_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/.imap/2015MagUp_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/.imap/2015MagUp_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/.imap/2016MagDown_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/.imap/2016MagDown_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/.imap/2016MagDown_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/.imap/2016MagDown_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/.imap/2016MagDown_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/.imap/2016MagDown_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/.imap/2016MagUp_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/.imap/2016MagUp_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/.imap/2016MagUp_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/.imap/2016MagUp_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/.imap/2016MagUp_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/.imap/2016MagUp_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/2011MagDown_Kplus.py b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/2011MagDown_Kplus.py
new file mode 100644
index 0000000..dc0d18b
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/2011MagDown_Kplus.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = True
+year = "2011"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "B0toKstJpsi"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "B0toKstJpsi_2011MagDown.root"
+dv.CondDBtag = "sim-20130522-vc-md100"
+dv.DDDBtag = "dddb-20130929"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/2011MagDown_Kshort.py b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/2011MagDown_Kshort.py
new file mode 100644
index 0000000..822d12a
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/2011MagDown_Kshort.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = True
+year = "2011"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "B0toKstJpsi"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "B0toKstJpsi_2011MagDown.root"
+dv.CondDBtag = "sim-20130522-vc-md100"
+dv.DDDBtag = "dddb-20130929"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/2011MagUp_Kplus.py b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/2011MagUp_Kplus.py
new file mode 100644
index 0000000..e8be853
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/2011MagUp_Kplus.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = False
+year = "2011"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "B0toKstJpsi"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "B0toKstJpsi_2011MagUp.root"
+dv.CondDBtag = "sim-20130522-vc-mu100"
+dv.DDDBtag = "dddb-20130929"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/2011MagUp_Kshort.py b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/2011MagUp_Kshort.py
new file mode 100644
index 0000000..482adac
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/2011MagUp_Kshort.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = False
+year = "2011"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "B0toKstJpsi"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "B0toKstJpsi_2011MagUp.root"
+dv.CondDBtag = "sim-20130522-vc-mu100"
+dv.DDDBtag = "dddb-20130929"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/2012MagDown_Kplus.py b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/2012MagDown_Kplus.py
new file mode 100644
index 0000000..54e4c62
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/2012MagDown_Kplus.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = True
+year = "2012"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "B0toKstJpsi"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "B0toKstJpsi_2012MagDown.root"
+dv.CondDBtag = "sim-20130522-1-vc-md100"
+dv.DDDBtag = "dddb-20130929-1"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/2012MagDown_Kshort.py b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/2012MagDown_Kshort.py
new file mode 100644
index 0000000..c7152b4
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/2012MagDown_Kshort.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = True
+year = "2012"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "B0toKstJpsi"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "B0toKstJpsi_2012MagDown.root"
+dv.CondDBtag = "sim-20130522-1-vc-md100"
+dv.DDDBtag = "dddb-20130929-1"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/2012MagUp_Kplus.py b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/2012MagUp_Kplus.py
new file mode 100644
index 0000000..f739e00
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/2012MagUp_Kplus.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = False
+year = "2012"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "B0toKstJpsi"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "B0toKstJpsi_2012MagUp.root"
+dv.CondDBtag = "sim-20130522-1-vc-mu100"
+dv.DDDBtag = "dddb-20130929-1"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/2012MagUp_Kshort.py b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/2012MagUp_Kshort.py
new file mode 100644
index 0000000..90718bb
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/2012MagUp_Kshort.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = False
+year = "2012"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "B0toKstJpsi"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "B0toKstJpsi_2012MagUp.root"
+dv.CondDBtag = "sim-20130522-1-vc-mu100"
+dv.DDDBtag = "dddb-20130929-1"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/2015MagDown_Kplus.py b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/2015MagDown_Kplus.py
new file mode 100644
index 0000000..f1836e8
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/2015MagDown_Kplus.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = True
+data = False
+down = True
+year = "2015"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "B0toKstJpsi"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "B0toKstJpsi_2015MagDown.root"
+dv.CondDBtag = "sim-20161124-vc-md100"
+dv.DDDBtag = "dddb-20170721-3"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/2015MagDown_Kshort.py b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/2015MagDown_Kshort.py
new file mode 100644
index 0000000..8d1f445
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/2015MagDown_Kshort.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = True
+data = False
+down = True
+year = "2015"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "B0toKstJpsi"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "B0toKstJpsi_2015MagDown.root"
+dv.CondDBtag = "sim-20161124-vc-md100"
+dv.DDDBtag = "dddb-20170721-3"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/2015MagUp_Kplus.py b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/2015MagUp_Kplus.py
new file mode 100644
index 0000000..ac8d7fe
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/2015MagUp_Kplus.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = True
+data = False
+down = False
+year = "2015"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "B0toKstJpsi"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "B0toKstJpsi_2015MagUp.root"
+dv.CondDBtag = "sim-20161124-vc-mu100"
+dv.DDDBtag = "dddb-20170721-3"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/2015MagUp_Kshort.py b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/2015MagUp_Kshort.py
new file mode 100644
index 0000000..cdbe4c2
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/2015MagUp_Kshort.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = True
+data = False
+down = False
+year = "2015"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "B0toKstJpsi"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "B0toKstJpsi_2015MagUp.root"
+dv.CondDBtag = "sim-20161124-vc-mu100"
+dv.DDDBtag = "dddb-20170721-3"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/2016MagDown_Kplus.py b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/2016MagDown_Kplus.py
new file mode 100644
index 0000000..994cdc7
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/2016MagDown_Kplus.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = True
+data = False
+down = True
+year = "2016"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "B0toKstJpsi"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "B0toKstJpsi_2016MagDown.root"
+dv.CondDBtag = "sim-20170721-2-vc-md100"
+dv.DDDBtag = "dddb-20170721-3"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/2016MagDown_Kshort.py b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/2016MagDown_Kshort.py
new file mode 100644
index 0000000..ea42db2
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/2016MagDown_Kshort.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = True
+data = False
+down = True
+year = "2016"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "B0toKstJpsi"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "B0toKstJpsi_2016MagDown.root"
+dv.CondDBtag = "sim-20170721-2-vc-md100"
+dv.DDDBtag = "dddb-20170721-3"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/2016MagUp_Kplus.py b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/2016MagUp_Kplus.py
new file mode 100644
index 0000000..72f6f45
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/2016MagUp_Kplus.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = True
+data = False
+down = False
+year = "2016"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "B0toKstJpsi"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "B0toKstJpsi_2016MagUp.root"
+dv.CondDBtag = "sim-20170721-2-vc-mu100"
+dv.DDDBtag = "dddb-20170721-3"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/2016MagUp_Kshort.py b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/2016MagUp_Kshort.py
new file mode 100644
index 0000000..b9a454e
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/B0toKstJpsi/2016MagUp_Kshort.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = True
+data = False
+down = False
+year = "2016"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "B0toKstJpsi"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "B0toKstJpsi_2016MagUp.root"
+dv.CondDBtag = "sim-20170721-2-vc-mu100"
+dv.DDDBtag = "dddb-20170721-3"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/.imap/2011MagDown_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/.imap/2011MagDown_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/.imap/2011MagDown_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/.imap/2011MagDown_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/.imap/2011MagDown_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/.imap/2011MagDown_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/.imap/2011MagUp_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/.imap/2011MagUp_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/.imap/2011MagUp_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/.imap/2011MagUp_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/.imap/2011MagUp_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/.imap/2011MagUp_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/.imap/2012MagDown_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/.imap/2012MagDown_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/.imap/2012MagDown_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/.imap/2012MagDown_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/.imap/2012MagDown_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/.imap/2012MagDown_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/.imap/2012MagUp_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/.imap/2012MagUp_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/.imap/2012MagUp_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/.imap/2012MagUp_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/.imap/2012MagUp_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/.imap/2012MagUp_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/.imap/2015MagDown_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/.imap/2015MagDown_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/.imap/2015MagDown_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/.imap/2015MagDown_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/.imap/2015MagDown_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/.imap/2015MagDown_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/.imap/2015MagUp_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/.imap/2015MagUp_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/.imap/2015MagUp_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/.imap/2015MagUp_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/.imap/2015MagUp_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/.imap/2015MagUp_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/.imap/2016MagDown_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/.imap/2016MagDown_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/.imap/2016MagDown_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/.imap/2016MagDown_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/.imap/2016MagDown_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/.imap/2016MagDown_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/.imap/2016MagUp_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/.imap/2016MagUp_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/.imap/2016MagUp_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/.imap/2016MagUp_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/.imap/2016MagUp_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/.imap/2016MagUp_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/2011MagDown_Kplus.py b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/2011MagDown_Kplus.py
new file mode 100644
index 0000000..7a7317e
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/2011MagDown_Kplus.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = True
+year = "2011"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "B0toKstMuMu"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "B0toKstMuMu_2011MagDown.root"
+dv.CondDBtag = "sim-20130522-vc-md100"
+dv.DDDBtag = "dddb-20130929"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/2011MagDown_Kshort.py b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/2011MagDown_Kshort.py
new file mode 100644
index 0000000..34aa5e1
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/2011MagDown_Kshort.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = True
+year = "2011"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "B0toKstMuMu"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "B0toKstMuMu_2011MagDown.root"
+dv.CondDBtag = "sim-20130522-vc-md100"
+dv.DDDBtag = "dddb-20130929"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/2011MagUp_Kplus.py b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/2011MagUp_Kplus.py
new file mode 100644
index 0000000..2484381
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/2011MagUp_Kplus.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = False
+year = "2011"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "B0toKstMuMu"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "B0toKstMuMu_2011MagUp.root"
+dv.CondDBtag = "sim-20130522-vc-mu100"
+dv.DDDBtag = "dddb-20130929"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/2011MagUp_Kshort.py b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/2011MagUp_Kshort.py
new file mode 100644
index 0000000..5ff34a8
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/2011MagUp_Kshort.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = False
+year = "2011"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "B0toKstMuMu"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "B0toKstMuMu_2011MagUp.root"
+dv.CondDBtag = "sim-20130522-vc-mu100"
+dv.DDDBtag = "dddb-20130929"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/2012MagDown_Kplus.py b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/2012MagDown_Kplus.py
new file mode 100644
index 0000000..a9064bb
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/2012MagDown_Kplus.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = True
+year = "2012"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "B0toKstMuMu"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "B0toKstMuMu_2012MagDown.root"
+dv.CondDBtag = "Sim08-20130503-1-vc-md100"
+dv.DDDBtag = "Sim08-20130503-1"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/2012MagDown_Kshort.py b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/2012MagDown_Kshort.py
new file mode 100644
index 0000000..3a430fd
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/2012MagDown_Kshort.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = True
+year = "2012"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "B0toKstMuMu"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "B0toKstMuMu_2012MagDown.root"
+dv.CondDBtag = "Sim08-20130503-1-vc-md100"
+dv.DDDBtag = "Sim08-20130503-1"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/2012MagUp_Kplus.py b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/2012MagUp_Kplus.py
new file mode 100644
index 0000000..5777158
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/2012MagUp_Kplus.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = False
+year = "2012"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "B0toKstMuMu"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "B0toKstMuMu_2012MagUp.root"
+dv.CondDBtag = "Sim08-20130503-1-vc-mu100"
+dv.DDDBtag = "Sim08-20130503-1"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/2012MagUp_Kshort.py b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/2012MagUp_Kshort.py
new file mode 100644
index 0000000..950cdeb
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/2012MagUp_Kshort.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = False
+year = "2012"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "B0toKstMuMu"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "B0toKstMuMu_2012MagUp.root"
+dv.CondDBtag = "Sim08-20130503-1-vc-mu100"
+dv.DDDBtag = "Sim08-20130503-1"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/2015MagDown_Kplus.py b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/2015MagDown_Kplus.py
new file mode 100644
index 0000000..94ac88e
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/2015MagDown_Kplus.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = True
+year = "2015"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "B0toKstMuMu"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "B0toKstMuMu_2015MagDown.root"
+dv.CondDBtag = "sim-20161124-vc-md100"
+dv.DDDBtag = "dddb-20170721-3"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/2015MagDown_Kshort.py b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/2015MagDown_Kshort.py
new file mode 100644
index 0000000..d105064
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/2015MagDown_Kshort.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = True
+year = "2015"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "B0toKstMuMu"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "B0toKstMuMu_2015MagDown.root"
+dv.CondDBtag = "sim-20161124-vc-md100"
+dv.DDDBtag = "dddb-20170721-3"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/2015MagUp_Kplus.py b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/2015MagUp_Kplus.py
new file mode 100644
index 0000000..ab414db
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/2015MagUp_Kplus.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = False
+year = "2015"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "B0toKstMuMu"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "B0toKstMuMu_2015MagUp.root"
+dv.CondDBtag = "sim-20161124-vc-mu100"
+dv.DDDBtag = "dddb-20170721-3"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/2015MagUp_Kshort.py b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/2015MagUp_Kshort.py
new file mode 100644
index 0000000..4db7a90
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/2015MagUp_Kshort.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = False
+year = "2015"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "B0toKstMuMu"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "B0toKstMuMu_2015MagUp.root"
+dv.CondDBtag = "sim-20161124-vc-mu100"
+dv.DDDBtag = "dddb-20170721-3"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/2016MagDown_Kplus.py b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/2016MagDown_Kplus.py
new file mode 100644
index 0000000..6df624a
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/2016MagDown_Kplus.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = True
+year = "2016"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "B0toKstMuMu"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "B0toKstMuMu_2016MagDown.root"
+dv.CondDBtag = "sim-20161124-2-vc-md100"
+dv.DDDBtag = "dddb-20150724"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/2016MagDown_Kshort.py b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/2016MagDown_Kshort.py
new file mode 100644
index 0000000..0cabb0c
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/2016MagDown_Kshort.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = True
+year = "2016"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "B0toKstMuMu"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "B0toKstMuMu_2016MagDown.root"
+dv.CondDBtag = "sim-20161124-2-vc-md100"
+dv.DDDBtag = "dddb-20150724"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/2016MagUp_Kplus.py b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/2016MagUp_Kplus.py
new file mode 100644
index 0000000..682f81e
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/2016MagUp_Kplus.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = False
+year = "2016"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "B0toKstMuMu"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "B0toKstMuMu_2016MagUp.root"
+dv.CondDBtag = "sim-20161124-2-vc-mu100"
+dv.DDDBtag = "dddb-20150724"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/2016MagUp_Kshort.py b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/2016MagUp_Kshort.py
new file mode 100644
index 0000000..bb112fa
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/B0toKstMuMu/2016MagUp_Kshort.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = False
+year = "2016"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "B0toKstMuMu"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "B0toKstMuMu_2016MagUp.root"
+dv.CondDBtag = "sim-20161124-2-vc-mu100"
+dv.DDDBtag = "dddb-20150724"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BasicOptfile.py b/Code/Ganga/OptionFiles/Backgrounds/BasicOptfile.py
new file mode 100755
index 0000000..3246fde
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/BasicOptfile.py
@@ -0,0 +1,344 @@
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoK1Jpsi/.imap/2012MagDown_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/BtoK1Jpsi/.imap/2012MagDown_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/BtoK1Jpsi/.imap/2012MagDown_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoK1Jpsi/.imap/2012MagDown_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/BtoK1Jpsi/.imap/2012MagDown_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/BtoK1Jpsi/.imap/2012MagDown_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoK1Jpsi/.imap/2012MagUp_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/BtoK1Jpsi/.imap/2012MagUp_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/BtoK1Jpsi/.imap/2012MagUp_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoK1Jpsi/.imap/2012MagUp_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/BtoK1Jpsi/.imap/2012MagUp_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/BtoK1Jpsi/.imap/2012MagUp_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoK1Jpsi/2012MagDown_Kplus.py b/Code/Ganga/OptionFiles/Backgrounds/BtoK1Jpsi/2012MagDown_Kplus.py
new file mode 100644
index 0000000..79b70d3
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/BtoK1Jpsi/2012MagDown_Kplus.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = True
+year = "2012"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "BtoK1Jpsi"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "BtoK1Jpsi_2012MagDown.root"
+dv.CondDBtag = "Sim08-20130503-1-vc-md100"
+dv.DDDBtag = "Sim08-20130503-1"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoK1Jpsi/2012MagDown_Kshort.py b/Code/Ganga/OptionFiles/Backgrounds/BtoK1Jpsi/2012MagDown_Kshort.py
new file mode 100644
index 0000000..ba7b2b0
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/BtoK1Jpsi/2012MagDown_Kshort.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = True
+year = "2012"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "BtoK1Jpsi"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "BtoK1Jpsi_2012MagDown.root"
+dv.CondDBtag = "Sim08-20130503-1-vc-md100"
+dv.DDDBtag = "Sim08-20130503-1"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoK1Jpsi/2012MagUp_Kplus.py b/Code/Ganga/OptionFiles/Backgrounds/BtoK1Jpsi/2012MagUp_Kplus.py
new file mode 100644
index 0000000..e577e46
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/BtoK1Jpsi/2012MagUp_Kplus.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = False
+year = "2012"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "BtoK1Jpsi"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "BtoK1Jpsi_2012MagUp.root"
+dv.CondDBtag = "Sim08-20130503-1-vc-mu100"
+dv.DDDBtag = "Sim08-20130503-1"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoK1Jpsi/2012MagUp_Kshort.py b/Code/Ganga/OptionFiles/Backgrounds/BtoK1Jpsi/2012MagUp_Kshort.py
new file mode 100644
index 0000000..7a957d5
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/BtoK1Jpsi/2012MagUp_Kshort.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = False
+year = "2012"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "BtoK1Jpsi"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "BtoK1Jpsi_2012MagUp.root"
+dv.CondDBtag = "Sim08-20130503-1-vc-mu100"
+dv.DDDBtag = "Sim08-20130503-1"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoK1MuMu/.imap/2011MagDown_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/BtoK1MuMu/.imap/2011MagDown_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/BtoK1MuMu/.imap/2011MagDown_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoK1MuMu/.imap/2011MagDown_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/BtoK1MuMu/.imap/2011MagDown_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/BtoK1MuMu/.imap/2011MagDown_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoK1MuMu/.imap/2011MagUp_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/BtoK1MuMu/.imap/2011MagUp_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/BtoK1MuMu/.imap/2011MagUp_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoK1MuMu/.imap/2011MagUp_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/BtoK1MuMu/.imap/2011MagUp_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/BtoK1MuMu/.imap/2011MagUp_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoK1MuMu/.imap/2012MagDown_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/BtoK1MuMu/.imap/2012MagDown_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/BtoK1MuMu/.imap/2012MagDown_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoK1MuMu/.imap/2012MagDown_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/BtoK1MuMu/.imap/2012MagDown_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/BtoK1MuMu/.imap/2012MagDown_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoK1MuMu/.imap/2012MagUp_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/BtoK1MuMu/.imap/2012MagUp_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/BtoK1MuMu/.imap/2012MagUp_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoK1MuMu/.imap/2012MagUp_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/BtoK1MuMu/.imap/2012MagUp_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/BtoK1MuMu/.imap/2012MagUp_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoK1MuMu/2011MagDown_Kplus.py b/Code/Ganga/OptionFiles/Backgrounds/BtoK1MuMu/2011MagDown_Kplus.py
new file mode 100644
index 0000000..69ea4d3
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/BtoK1MuMu/2011MagDown_Kplus.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = True
+year = "2011"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "BtoK1MuMu"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "BtoK1MuMu_2011MagDown.root"
+dv.CondDBtag = "sim-20130522-vc-md100"
+dv.DDDBtag = "dddb-20130929"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoK1MuMu/2011MagDown_Kshort.py b/Code/Ganga/OptionFiles/Backgrounds/BtoK1MuMu/2011MagDown_Kshort.py
new file mode 100644
index 0000000..7f86dd4
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/BtoK1MuMu/2011MagDown_Kshort.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = True
+year = "2011"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "BtoK1MuMu"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "BtoK1MuMu_2011MagDown.root"
+dv.CondDBtag = "sim-20130522-vc-md100"
+dv.DDDBtag = "dddb-20130929"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoK1MuMu/2011MagUp_Kplus.py b/Code/Ganga/OptionFiles/Backgrounds/BtoK1MuMu/2011MagUp_Kplus.py
new file mode 100644
index 0000000..bc66f18
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/BtoK1MuMu/2011MagUp_Kplus.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = False
+year = "2011"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "BtoK1MuMu"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "BtoK1MuMu_2011MagUp.root"
+dv.CondDBtag = "sim-20130522-vc-mu100"
+dv.DDDBtag = "dddb-20130929"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoK1MuMu/2011MagUp_Kshort.py b/Code/Ganga/OptionFiles/Backgrounds/BtoK1MuMu/2011MagUp_Kshort.py
new file mode 100644
index 0000000..0beb484
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/BtoK1MuMu/2011MagUp_Kshort.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = False
+year = "2011"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "BtoK1MuMu"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "BtoK1MuMu_2011MagUp.root"
+dv.CondDBtag = "sim-20130522-vc-mu100"
+dv.DDDBtag = "dddb-20130929"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoK1MuMu/2012MagDown_Kplus.py b/Code/Ganga/OptionFiles/Backgrounds/BtoK1MuMu/2012MagDown_Kplus.py
new file mode 100644
index 0000000..8a40ad8
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/BtoK1MuMu/2012MagDown_Kplus.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = True
+year = "2012"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "BtoK1MuMu"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "BtoK1MuMu_2012MagDown.root"
+dv.CondDBtag = "sim-20130522-1-vc-md100"
+dv.DDDBtag = "dddb-20130929-1"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoK1MuMu/2012MagDown_Kshort.py b/Code/Ganga/OptionFiles/Backgrounds/BtoK1MuMu/2012MagDown_Kshort.py
new file mode 100644
index 0000000..f9a6754
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/BtoK1MuMu/2012MagDown_Kshort.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = True
+year = "2012"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "BtoK1MuMu"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "BtoK1MuMu_2012MagDown.root"
+dv.CondDBtag = "sim-20130522-1-vc-md100"
+dv.DDDBtag = "dddb-20130929-1"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoK1MuMu/2012MagUp_Kplus.py b/Code/Ganga/OptionFiles/Backgrounds/BtoK1MuMu/2012MagUp_Kplus.py
new file mode 100644
index 0000000..3a90ea1
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/BtoK1MuMu/2012MagUp_Kplus.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = False
+year = "2012"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "BtoK1MuMu"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "BtoK1MuMu_2012MagUp.root"
+dv.CondDBtag = "sim-20130522-1-vc-mu100"
+dv.DDDBtag = "dddb-20130929-1"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoK1MuMu/2012MagUp_Kshort.py b/Code/Ganga/OptionFiles/Backgrounds/BtoK1MuMu/2012MagUp_Kshort.py
new file mode 100644
index 0000000..b1bfb5a
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/BtoK1MuMu/2012MagUp_Kshort.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = False
+year = "2012"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "BtoK1MuMu"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "BtoK1MuMu_2012MagUp.root"
+dv.CondDBtag = "sim-20130522-1-vc-mu100"
+dv.DDDBtag = "dddb-20130929-1"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoKstJpsi/.imap/2011MagDown_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/BtoKstJpsi/.imap/2011MagDown_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/BtoKstJpsi/.imap/2011MagDown_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoKstJpsi/.imap/2011MagDown_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/BtoKstJpsi/.imap/2011MagDown_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/BtoKstJpsi/.imap/2011MagDown_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoKstJpsi/.imap/2011MagUp_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/BtoKstJpsi/.imap/2011MagUp_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/BtoKstJpsi/.imap/2011MagUp_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoKstJpsi/.imap/2011MagUp_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/BtoKstJpsi/.imap/2011MagUp_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/BtoKstJpsi/.imap/2011MagUp_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoKstJpsi/.imap/2012MagDown_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/BtoKstJpsi/.imap/2012MagDown_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/BtoKstJpsi/.imap/2012MagDown_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoKstJpsi/.imap/2012MagDown_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/BtoKstJpsi/.imap/2012MagDown_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/BtoKstJpsi/.imap/2012MagDown_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoKstJpsi/.imap/2012MagUp_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/BtoKstJpsi/.imap/2012MagUp_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/BtoKstJpsi/.imap/2012MagUp_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoKstJpsi/.imap/2012MagUp_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/BtoKstJpsi/.imap/2012MagUp_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/BtoKstJpsi/.imap/2012MagUp_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoKstJpsi/2011MagDown_Kplus.py b/Code/Ganga/OptionFiles/Backgrounds/BtoKstJpsi/2011MagDown_Kplus.py
new file mode 100644
index 0000000..4467880
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/BtoKstJpsi/2011MagDown_Kplus.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = True
+year = "2011"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "BtoKstJpsi"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "BtoKstJpsi_2011MagDown.root"
+dv.CondDBtag = "sim-20160614-1-vc-md100"
+dv.DDDBtag = "dddb-20160318-1"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoKstJpsi/2011MagDown_Kshort.py b/Code/Ganga/OptionFiles/Backgrounds/BtoKstJpsi/2011MagDown_Kshort.py
new file mode 100644
index 0000000..c771106
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/BtoKstJpsi/2011MagDown_Kshort.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = True
+year = "2011"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "BtoKstJpsi"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "BtoKstJpsi_2011MagDown.root"
+dv.CondDBtag = "sim-20160614-1-vc-md100"
+dv.DDDBtag = "dddb-20160318-1"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoKstJpsi/2011MagUp_Kplus.py b/Code/Ganga/OptionFiles/Backgrounds/BtoKstJpsi/2011MagUp_Kplus.py
new file mode 100644
index 0000000..9374754
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/BtoKstJpsi/2011MagUp_Kplus.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = False
+year = "2011"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "BtoKstJpsi"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "BtoKstJpsi_2011MagUp.root"
+dv.CondDBtag = "sim-20160614-1-vc-mu100"
+dv.DDDBtag = "dddb-20160318-1"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoKstJpsi/2011MagUp_Kshort.py b/Code/Ganga/OptionFiles/Backgrounds/BtoKstJpsi/2011MagUp_Kshort.py
new file mode 100644
index 0000000..6a54859
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/BtoKstJpsi/2011MagUp_Kshort.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = False
+year = "2011"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "BtoKstJpsi"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "BtoKstJpsi_2011MagUp.root"
+dv.CondDBtag = "sim-20160614-1-vc-mu100"
+dv.DDDBtag = "dddb-20160318-1"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoKstJpsi/2012MagDown_Kplus.py b/Code/Ganga/OptionFiles/Backgrounds/BtoKstJpsi/2012MagDown_Kplus.py
new file mode 100644
index 0000000..7da2e85
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/BtoKstJpsi/2012MagDown_Kplus.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = True
+year = "2012"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "BtoKstJpsi"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "BtoKstJpsi_2012MagDown.root"
+dv.CondDBtag = "sim-20160321-2-vc-md100"
+dv.DDDBtag = "dddb-20150928"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoKstJpsi/2012MagDown_Kshort.py b/Code/Ganga/OptionFiles/Backgrounds/BtoKstJpsi/2012MagDown_Kshort.py
new file mode 100644
index 0000000..f62351b
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/BtoKstJpsi/2012MagDown_Kshort.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = True
+year = "2012"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "BtoKstJpsi"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "BtoKstJpsi_2012MagDown.root"
+dv.CondDBtag = "sim-20160321-2-vc-md100"
+dv.DDDBtag = "dddb-20150928"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoKstJpsi/2012MagUp_Kplus.py b/Code/Ganga/OptionFiles/Backgrounds/BtoKstJpsi/2012MagUp_Kplus.py
new file mode 100644
index 0000000..583ce60
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/BtoKstJpsi/2012MagUp_Kplus.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = False
+year = "2012"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "BtoKstJpsi"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "BtoKstJpsi_2012MagUp.root"
+dv.CondDBtag = "sim-20160321-2-vc-mu100"
+dv.DDDBtag = "dddb-20150928"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoKstJpsi/2012MagUp_Kshort.py b/Code/Ganga/OptionFiles/Backgrounds/BtoKstJpsi/2012MagUp_Kshort.py
new file mode 100644
index 0000000..ed46286
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/BtoKstJpsi/2012MagUp_Kshort.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = False
+year = "2012"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "BtoKstJpsi"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "BtoKstJpsi_2012MagUp.root"
+dv.CondDBtag = "sim-20160321-2-vc-mu100"
+dv.DDDBtag = "dddb-20150928"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/.imap/2011MagDown_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/.imap/2011MagDown_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/.imap/2011MagDown_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/.imap/2011MagDown_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/.imap/2011MagDown_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/.imap/2011MagDown_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/.imap/2011MagUp_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/.imap/2011MagUp_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/.imap/2011MagUp_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/.imap/2011MagUp_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/.imap/2011MagUp_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/.imap/2011MagUp_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/.imap/2012MagDown_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/.imap/2012MagDown_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/.imap/2012MagDown_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/.imap/2012MagDown_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/.imap/2012MagDown_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/.imap/2012MagDown_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/.imap/2012MagUp_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/.imap/2012MagUp_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/.imap/2012MagUp_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/.imap/2012MagUp_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/.imap/2012MagUp_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/.imap/2012MagUp_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/.imap/2015MagDown_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/.imap/2015MagDown_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/.imap/2015MagDown_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/.imap/2015MagDown_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/.imap/2015MagDown_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/.imap/2015MagDown_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/.imap/2015MagUp_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/.imap/2015MagUp_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/.imap/2015MagUp_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/.imap/2015MagUp_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/.imap/2015MagUp_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/.imap/2015MagUp_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/.imap/2016MagDown_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/.imap/2016MagDown_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/.imap/2016MagDown_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/.imap/2016MagDown_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/.imap/2016MagDown_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/.imap/2016MagDown_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/.imap/2016MagUp_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/.imap/2016MagUp_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/.imap/2016MagUp_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/.imap/2016MagUp_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/.imap/2016MagUp_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/.imap/2016MagUp_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/2011MagDown_Kplus.py b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/2011MagDown_Kplus.py
new file mode 100644
index 0000000..38d8374
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/2011MagDown_Kplus.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = True
+year = "2011"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "BtoKstMuMu"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "BtoKstMuMu_2011MagDown.root"
+dv.CondDBtag = "sim-20160614-1-vc-md100"
+dv.DDDBtag = "dddb-20160318-1"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/2011MagDown_Kshort.py b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/2011MagDown_Kshort.py
new file mode 100644
index 0000000..7436f3e
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/2011MagDown_Kshort.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = True
+year = "2011"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "BtoKstMuMu"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "BtoKstMuMu_2011MagDown.root"
+dv.CondDBtag = "sim-20160614-1-vc-md100"
+dv.DDDBtag = "dddb-20160318-1"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/2011MagUp_Kplus.py b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/2011MagUp_Kplus.py
new file mode 100644
index 0000000..e0c6042
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/2011MagUp_Kplus.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = False
+year = "2011"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "BtoKstMuMu"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "BtoKstMuMu_2011MagUp.root"
+dv.CondDBtag = "sim-20160614-1-vc-mu100"
+dv.DDDBtag = "dddb-20160318-1"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/2011MagUp_Kshort.py b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/2011MagUp_Kshort.py
new file mode 100644
index 0000000..7e12fc1
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/2011MagUp_Kshort.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = False
+year = "2011"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "BtoKstMuMu"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "BtoKstMuMu_2011MagUp.root"
+dv.CondDBtag = "sim-20160614-1-vc-mu100"
+dv.DDDBtag = "dddb-20160318-1"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/2012MagDown_Kplus.py b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/2012MagDown_Kplus.py
new file mode 100644
index 0000000..891e1dc
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/2012MagDown_Kplus.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = True
+year = "2012"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "BtoKstMuMu"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "BtoKstMuMu_2012MagDown.root"
+dv.CondDBtag = "sim-20160321-2-vc-md100"
+dv.DDDBtag = "dddb-20150928"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/2012MagDown_Kshort.py b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/2012MagDown_Kshort.py
new file mode 100644
index 0000000..21245e1
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/2012MagDown_Kshort.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = True
+year = "2012"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "BtoKstMuMu"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "BtoKstMuMu_2012MagDown.root"
+dv.CondDBtag = "sim-20160321-2-vc-md100"
+dv.DDDBtag = "dddb-20150928"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/2012MagUp_Kplus.py b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/2012MagUp_Kplus.py
new file mode 100644
index 0000000..8b8d0e0
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/2012MagUp_Kplus.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = False
+year = "2012"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "BtoKstMuMu"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "BtoKstMuMu_2012MagUp.root"
+dv.CondDBtag = "sim-20160321-2-vc-mu100"
+dv.DDDBtag = "dddb-20150928"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/2012MagUp_Kshort.py b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/2012MagUp_Kshort.py
new file mode 100644
index 0000000..c792341
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/2012MagUp_Kshort.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = False
+year = "2012"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "BtoKstMuMu"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "BtoKstMuMu_2012MagUp.root"
+dv.CondDBtag = "sim-20160321-2-vc-mu100"
+dv.DDDBtag = "dddb-20150928"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/2015MagDown_Kplus.py b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/2015MagDown_Kplus.py
new file mode 100644
index 0000000..3ae1197
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/2015MagDown_Kplus.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = True
+data = False
+down = True
+year = "2015"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "BtoKstMuMu"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "BtoKstMuMu_2015MagDown.root"
+dv.CondDBtag = "sim-20161124-vc-md100"
+dv.DDDBtag = "dddb-20150724"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/2015MagDown_Kshort.py b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/2015MagDown_Kshort.py
new file mode 100644
index 0000000..7ac443e
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/2015MagDown_Kshort.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = True
+data = False
+down = True
+year = "2015"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "BtoKstMuMu"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "BtoKstMuMu_2015MagDown.root"
+dv.CondDBtag = "sim-20161124-vc-md100"
+dv.DDDBtag = "dddb-20150724"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/2015MagUp_Kplus.py b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/2015MagUp_Kplus.py
new file mode 100644
index 0000000..467dba9
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/2015MagUp_Kplus.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = True
+data = False
+down = False
+year = "2015"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "BtoKstMuMu"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "BtoKstMuMu_2015MagUp.root"
+dv.CondDBtag = "sim-20161124-vc-mu100"
+dv.DDDBtag = "dddb-20150724"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/2015MagUp_Kshort.py b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/2015MagUp_Kshort.py
new file mode 100644
index 0000000..c03fb3b
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/2015MagUp_Kshort.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = True
+data = False
+down = False
+year = "2015"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "BtoKstMuMu"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "BtoKstMuMu_2015MagUp.root"
+dv.CondDBtag = "sim-20161124-vc-mu100"
+dv.DDDBtag = "dddb-20150724"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/2016MagDown_Kplus.py b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/2016MagDown_Kplus.py
new file mode 100644
index 0000000..93ca28d
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/2016MagDown_Kplus.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = True
+data = False
+down = True
+year = "2016"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "BtoKstMuMu"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "BtoKstMuMu_2016MagDown.root"
+dv.CondDBtag = "sim-20161124-vc-md100"
+dv.DDDBtag = "dddb-20170721-3"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/2016MagDown_Kshort.py b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/2016MagDown_Kshort.py
new file mode 100644
index 0000000..be81004
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/2016MagDown_Kshort.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = True
+data = False
+down = True
+year = "2016"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "BtoKstMuMu"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "BtoKstMuMu_2016MagDown.root"
+dv.CondDBtag = "sim-20161124-vc-md100"
+dv.DDDBtag = "dddb-20170721-3"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/2016MagUp_Kplus.py b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/2016MagUp_Kplus.py
new file mode 100644
index 0000000..4311d72
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/2016MagUp_Kplus.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = True
+data = False
+down = False
+year = "2016"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "BtoKstMuMu"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "BtoKstMuMu_2016MagUp.root"
+dv.CondDBtag = "sim-20161124-vc-mu100"
+dv.DDDBtag = "dddb-20170721-3"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/2016MagUp_Kshort.py b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/2016MagUp_Kshort.py
new file mode 100644
index 0000000..9a0bfe4
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/BtoKstMuMu/2016MagUp_Kshort.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = True
+data = False
+down = False
+year = "2016"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "BtoKstMuMu"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "BtoKstMuMu_2016MagUp.root"
+dv.CondDBtag = "sim-20161124-vc-mu100"
+dv.DDDBtag = "dddb-20170721-3"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/.imap/2011MagDown_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/.imap/2011MagDown_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/.imap/2011MagDown_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/.imap/2011MagDown_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/.imap/2011MagDown_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/.imap/2011MagDown_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/.imap/2011MagUp_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/.imap/2011MagUp_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/.imap/2011MagUp_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/.imap/2011MagUp_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/.imap/2011MagUp_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/.imap/2011MagUp_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/.imap/2012MagDown_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/.imap/2012MagDown_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/.imap/2012MagDown_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/.imap/2012MagDown_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/.imap/2012MagDown_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/.imap/2012MagDown_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/.imap/2012MagUp_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/.imap/2012MagUp_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/.imap/2012MagUp_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/.imap/2012MagUp_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/.imap/2012MagUp_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/.imap/2012MagUp_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/.imap/2015MagDown_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/.imap/2015MagDown_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/.imap/2015MagDown_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/.imap/2015MagDown_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/.imap/2015MagDown_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/.imap/2015MagDown_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/.imap/2015MagUp_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/.imap/2015MagUp_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/.imap/2015MagUp_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/.imap/2015MagUp_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/.imap/2015MagUp_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/.imap/2015MagUp_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/.imap/2016MagDown_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/.imap/2016MagDown_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/.imap/2016MagDown_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/.imap/2016MagDown_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/.imap/2016MagDown_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/.imap/2016MagDown_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/.imap/2016MagUp_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/.imap/2016MagUp_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/.imap/2016MagUp_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/.imap/2016MagUp_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/.imap/2016MagUp_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/.imap/2016MagUp_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/2011MagDown_Kplus.py b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/2011MagDown_Kplus.py
new file mode 100644
index 0000000..10d1244
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/2011MagDown_Kplus.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = True
+year = "2011"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "BtoXJpsi"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "BtoXJpsi_2011MagDown.root"
+dv.CondDBtag = "sim-20130522-vc-md100"
+dv.DDDBtag = "dddb-20130929"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/2011MagDown_Kshort.py b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/2011MagDown_Kshort.py
new file mode 100644
index 0000000..91d4a1d
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/2011MagDown_Kshort.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = True
+year = "2011"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "BtoXJpsi"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "BtoXJpsi_2011MagDown.root"
+dv.CondDBtag = "sim-20130522-vc-md100"
+dv.DDDBtag = "dddb-20130929"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/2011MagUp_Kplus.py b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/2011MagUp_Kplus.py
new file mode 100644
index 0000000..ee29922
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/2011MagUp_Kplus.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = False
+year = "2011"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "BtoXJpsi"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "BtoXJpsi_2011MagUp.root"
+dv.CondDBtag = "sim-20130522-vc-mu100"
+dv.DDDBtag = "dddb-20130929"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/2011MagUp_Kshort.py b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/2011MagUp_Kshort.py
new file mode 100644
index 0000000..6a69ce6
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/2011MagUp_Kshort.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = False
+year = "2011"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "BtoXJpsi"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "BtoXJpsi_2011MagUp.root"
+dv.CondDBtag = "sim-20130522-vc-mu100"
+dv.DDDBtag = "dddb-20130929"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/2012MagDown_Kplus.py b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/2012MagDown_Kplus.py
new file mode 100644
index 0000000..1bf0f31
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/2012MagDown_Kplus.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = True
+year = "2012"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "BtoXJpsi"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "BtoXJpsi_2012MagDown.root"
+dv.CondDBtag = "Sim08-20130503-1-vc-md100"
+dv.DDDBtag = "Sim08-20130503-1"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/2012MagDown_Kshort.py b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/2012MagDown_Kshort.py
new file mode 100644
index 0000000..a854edb
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/2012MagDown_Kshort.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = True
+year = "2012"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "BtoXJpsi"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "BtoXJpsi_2012MagDown.root"
+dv.CondDBtag = "Sim08-20130503-1-vc-md100"
+dv.DDDBtag = "Sim08-20130503-1"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/2012MagUp_Kplus.py b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/2012MagUp_Kplus.py
new file mode 100644
index 0000000..03c3874
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/2012MagUp_Kplus.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = False
+year = "2012"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "BtoXJpsi"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "BtoXJpsi_2012MagUp.root"
+dv.CondDBtag = "Sim08-20130503-1-vc-mu100"
+dv.DDDBtag = "Sim08-20130503-1"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/2012MagUp_Kshort.py b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/2012MagUp_Kshort.py
new file mode 100644
index 0000000..36e5f25
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/2012MagUp_Kshort.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = False
+year = "2012"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "BtoXJpsi"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "BtoXJpsi_2012MagUp.root"
+dv.CondDBtag = "Sim08-20130503-1-vc-mu100"
+dv.DDDBtag = "Sim08-20130503-1"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/2015MagDown_Kplus.py b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/2015MagDown_Kplus.py
new file mode 100644
index 0000000..503fe60
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/2015MagDown_Kplus.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = True
+data = False
+down = True
+year = "2015"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "BtoXJpsi"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "BtoXJpsi_2015MagDown.root"
+dv.CondDBtag = "sim-20150813-vc-md100"
+dv.DDDBtag = "dddb-20150724"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/2015MagDown_Kshort.py b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/2015MagDown_Kshort.py
new file mode 100644
index 0000000..603cb23
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/2015MagDown_Kshort.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = True
+data = False
+down = True
+year = "2015"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "BtoXJpsi"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "BtoXJpsi_2015MagDown.root"
+dv.CondDBtag = "sim-20150813-vc-md100"
+dv.DDDBtag = "dddb-20150724"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/2015MagUp_Kplus.py b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/2015MagUp_Kplus.py
new file mode 100644
index 0000000..e57f71f
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/2015MagUp_Kplus.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = True
+data = False
+down = False
+year = "2015"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "BtoXJpsi"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "BtoXJpsi_2015MagUp.root"
+dv.CondDBtag = "sim-20150813-vc-mu100"
+dv.DDDBtag = "dddb-20150724"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/2015MagUp_Kshort.py b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/2015MagUp_Kshort.py
new file mode 100644
index 0000000..5291efa
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/2015MagUp_Kshort.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = True
+data = False
+down = False
+year = "2015"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "BtoXJpsi"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "BtoXJpsi_2015MagUp.root"
+dv.CondDBtag = "sim-20150813-vc-mu100"
+dv.DDDBtag = "dddb-20150724"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/2016MagDown_Kplus.py b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/2016MagDown_Kplus.py
new file mode 100644
index 0000000..e81310f
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/2016MagDown_Kplus.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = True
+year = "2016"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "BtoXJpsi"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "BtoXJpsi_2016MagDown.root"
+dv.CondDBtag = "sim-20161124-2-vc-md100"
+dv.DDDBtag = "dddb-20150724"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/2016MagDown_Kshort.py b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/2016MagDown_Kshort.py
new file mode 100644
index 0000000..f0f59dd
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/2016MagDown_Kshort.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = True
+year = "2016"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "BtoXJpsi"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "BtoXJpsi_2016MagDown.root"
+dv.CondDBtag = "sim-20161124-2-vc-md100"
+dv.DDDBtag = "dddb-20150724"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/2016MagUp_Kplus.py b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/2016MagUp_Kplus.py
new file mode 100644
index 0000000..b56bda1
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/2016MagUp_Kplus.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = False
+year = "2016"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "BtoXJpsi"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "BtoXJpsi_2016MagUp.root"
+dv.CondDBtag = "sim-20161124-2-vc-mu100"
+dv.DDDBtag = "dddb-20150724"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/2016MagUp_Kshort.py b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/2016MagUp_Kshort.py
new file mode 100644
index 0000000..3237279
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/BtoXJpsi/2016MagUp_Kshort.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = False
+year = "2016"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+channel = "BtoXJpsi"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "BtoXJpsi_2016MagUp.root"
+dv.CondDBtag = "sim-20161124-2-vc-mu100"
+dv.DDDBtag = "dddb-20150724"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/PHSP/.imap/2011MagDown_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/PHSP/.imap/2011MagDown_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/PHSP/.imap/2011MagDown_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/PHSP/.imap/2011MagDown_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/PHSP/.imap/2011MagDown_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/PHSP/.imap/2011MagDown_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/PHSP/.imap/2011MagUp_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/PHSP/.imap/2011MagUp_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/PHSP/.imap/2011MagUp_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/PHSP/.imap/2011MagUp_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/PHSP/.imap/2011MagUp_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/PHSP/.imap/2011MagUp_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/PHSP/.imap/2012MagDown_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/PHSP/.imap/2012MagDown_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/PHSP/.imap/2012MagDown_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/PHSP/.imap/2012MagDown_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/PHSP/.imap/2012MagDown_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/PHSP/.imap/2012MagDown_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/PHSP/.imap/2012MagUp_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/PHSP/.imap/2012MagUp_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/PHSP/.imap/2012MagUp_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/PHSP/.imap/2012MagUp_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/PHSP/.imap/2012MagUp_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/PHSP/.imap/2012MagUp_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/PHSP/.imap/2015MagDown_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/PHSP/.imap/2015MagDown_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/PHSP/.imap/2015MagDown_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/PHSP/.imap/2015MagDown_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/PHSP/.imap/2015MagDown_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/PHSP/.imap/2015MagDown_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/PHSP/.imap/2015MagUp_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/PHSP/.imap/2015MagUp_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/PHSP/.imap/2015MagUp_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/PHSP/.imap/2015MagUp_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/PHSP/.imap/2015MagUp_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/PHSP/.imap/2015MagUp_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/PHSP/.imap/2016MagDown_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/PHSP/.imap/2016MagDown_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/PHSP/.imap/2016MagDown_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/PHSP/.imap/2016MagDown_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/PHSP/.imap/2016MagDown_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/PHSP/.imap/2016MagDown_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/PHSP/.imap/2016MagUp_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/PHSP/.imap/2016MagUp_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/PHSP/.imap/2016MagUp_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/PHSP/.imap/2016MagUp_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/Backgrounds/PHSP/.imap/2016MagUp_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/Backgrounds/PHSP/.imap/2016MagUp_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/Backgrounds/PHSP/2011MagDown_Kplus.py b/Code/Ganga/OptionFiles/Backgrounds/PHSP/2011MagDown_Kplus.py
new file mode 100644
index 0000000..d3a027b
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/PHSP/2011MagDown_Kplus.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = True
+year = "2011"
+stream = "B2XMuMu.Strip"
+line = "B2XMuMu_Line"
+
+channel = "PHSP"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "PHSP_2011MagDown.root"
+dv.CondDBtag = "sim-20160614-1-vc-md100"
+dv.DDDBtag = "dddb-20160318-1"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/PHSP/2011MagDown_Kshort.py b/Code/Ganga/OptionFiles/Backgrounds/PHSP/2011MagDown_Kshort.py
new file mode 100644
index 0000000..6d4eb07b
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/PHSP/2011MagDown_Kshort.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = True
+year = "2011"
+stream = "B2XMuMu.Strip"
+line = "B2XMuMu_Line"
+
+channel = "PHSP"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "PHSP_2011MagDown.root"
+dv.CondDBtag = "sim-20160614-1-vc-md100"
+dv.DDDBtag = "dddb-20160318-1"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/PHSP/2011MagUp_Kplus.py b/Code/Ganga/OptionFiles/Backgrounds/PHSP/2011MagUp_Kplus.py
new file mode 100644
index 0000000..a294454
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/PHSP/2011MagUp_Kplus.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = False
+year = "2011"
+stream = "B2XMuMu.Strip"
+line = "B2XMuMu_Line"
+
+channel = "PHSP"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "PHSP_2011MagUp.root"
+dv.CondDBtag = "sim-20160614-1-vc-mu100"
+dv.DDDBtag = "dddb-20160318-1"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/PHSP/2011MagUp_Kshort.py b/Code/Ganga/OptionFiles/Backgrounds/PHSP/2011MagUp_Kshort.py
new file mode 100644
index 0000000..c75d346
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/PHSP/2011MagUp_Kshort.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = False
+year = "2011"
+stream = "B2XMuMu.Strip"
+line = "B2XMuMu_Line"
+
+channel = "PHSP"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "PHSP_2011MagUp.root"
+dv.CondDBtag = "sim-20160614-1-vc-mu100"
+dv.DDDBtag = "dddb-20160318-1"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/PHSP/2012MagDown_Kplus.py b/Code/Ganga/OptionFiles/Backgrounds/PHSP/2012MagDown_Kplus.py
new file mode 100644
index 0000000..09a3577
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/PHSP/2012MagDown_Kplus.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = True
+year = "2012"
+stream = "B2XMuMu.Strip"
+line = "B2XMuMu_Line"
+
+channel = "PHSP"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "PHSP_2012MagDown.root"
+dv.CondDBtag = "sim-20160321-2-vc-md100"
+dv.DDDBtag = "dddb-20150928"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/PHSP/2012MagDown_Kshort.py b/Code/Ganga/OptionFiles/Backgrounds/PHSP/2012MagDown_Kshort.py
new file mode 100644
index 0000000..c2a458d
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/PHSP/2012MagDown_Kshort.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = True
+year = "2012"
+stream = "B2XMuMu.Strip"
+line = "B2XMuMu_Line"
+
+channel = "PHSP"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "PHSP_2012MagDown.root"
+dv.CondDBtag = "sim-20160321-2-vc-md100"
+dv.DDDBtag = "dddb-20150928"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/PHSP/2012MagUp_Kplus.py b/Code/Ganga/OptionFiles/Backgrounds/PHSP/2012MagUp_Kplus.py
new file mode 100644
index 0000000..222ee2f
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/PHSP/2012MagUp_Kplus.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = False
+year = "2012"
+stream = "B2XMuMu.Strip"
+line = "B2XMuMu_Line"
+
+channel = "PHSP"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "PHSP_2012MagUp.root"
+dv.CondDBtag = "sim-20160321-2-vc-mu100"
+dv.DDDBtag = "dddb-20150928"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/PHSP/2012MagUp_Kshort.py b/Code/Ganga/OptionFiles/Backgrounds/PHSP/2012MagUp_Kshort.py
new file mode 100644
index 0000000..5f9e024
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/PHSP/2012MagUp_Kshort.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = False
+data = False
+down = False
+year = "2012"
+stream = "B2XMuMu.Strip"
+line = "B2XMuMu_Line"
+
+channel = "PHSP"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "PHSP_2012MagUp.root"
+dv.CondDBtag = "sim-20160321-2-vc-mu100"
+dv.DDDBtag = "dddb-20150928"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/PHSP/2015MagDown_Kplus.py b/Code/Ganga/OptionFiles/Backgrounds/PHSP/2015MagDown_Kplus.py
new file mode 100644
index 0000000..2cdca52
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/PHSP/2015MagDown_Kplus.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = True
+data = False
+down = True
+year = "2015"
+stream = "B2XMuMu.Strip"
+line = "B2XMuMu_Line"
+
+channel = "PHSP"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "PHSP_2015MagDown.root"
+dv.CondDBtag = "sim-20161124-vc-md100"
+dv.DDDBtag = "dddb-20150724"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/PHSP/2015MagDown_Kshort.py b/Code/Ganga/OptionFiles/Backgrounds/PHSP/2015MagDown_Kshort.py
new file mode 100644
index 0000000..b7d1c91
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/PHSP/2015MagDown_Kshort.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = True
+data = False
+down = True
+year = "2015"
+stream = "B2XMuMu.Strip"
+line = "B2XMuMu_Line"
+
+channel = "PHSP"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "PHSP_2015MagDown.root"
+dv.CondDBtag = "sim-20161124-vc-md100"
+dv.DDDBtag = "dddb-20150724"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/PHSP/2015MagUp_Kplus.py b/Code/Ganga/OptionFiles/Backgrounds/PHSP/2015MagUp_Kplus.py
new file mode 100644
index 0000000..78e7434
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/PHSP/2015MagUp_Kplus.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = True
+data = False
+down = False
+year = "2015"
+stream = "B2XMuMu.Strip"
+line = "B2XMuMu_Line"
+
+channel = "PHSP"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "PHSP_2015MagUp.root"
+dv.CondDBtag = "sim-20161124-vc-mu100"
+dv.DDDBtag = "dddb-20150724"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/PHSP/2015MagUp_Kshort.py b/Code/Ganga/OptionFiles/Backgrounds/PHSP/2015MagUp_Kshort.py
new file mode 100644
index 0000000..038bcef
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/PHSP/2015MagUp_Kshort.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = True
+data = False
+down = False
+year = "2015"
+stream = "B2XMuMu.Strip"
+line = "B2XMuMu_Line"
+
+channel = "PHSP"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "PHSP_2015MagUp.root"
+dv.CondDBtag = "sim-20161124-vc-mu100"
+dv.DDDBtag = "dddb-20150724"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/PHSP/2016MagDown_Kplus.py b/Code/Ganga/OptionFiles/Backgrounds/PHSP/2016MagDown_Kplus.py
new file mode 100644
index 0000000..52d45e8
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/PHSP/2016MagDown_Kplus.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = True
+data = False
+down = True
+year = "2016"
+stream = "B2XMuMu.Strip"
+line = "B2XMuMu_Line"
+
+channel = "PHSP"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "PHSP_2016MagDown.root"
+dv.CondDBtag = "sim-20170721-2-vc-md100"
+dv.DDDBtag = "dddb-20170721-3"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/PHSP/2016MagDown_Kshort.py b/Code/Ganga/OptionFiles/Backgrounds/PHSP/2016MagDown_Kshort.py
new file mode 100644
index 0000000..09d0c4e
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/PHSP/2016MagDown_Kshort.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = True
+data = False
+down = True
+year = "2016"
+stream = "B2XMuMu.Strip"
+line = "B2XMuMu_Line"
+
+channel = "PHSP"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "PHSP_2016MagDown.root"
+dv.CondDBtag = "sim-20170721-2-vc-md100"
+dv.DDDBtag = "dddb-20170721-3"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/PHSP/2016MagUp_Kplus.py b/Code/Ganga/OptionFiles/Backgrounds/PHSP/2016MagUp_Kplus.py
new file mode 100644
index 0000000..fd6a202
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/PHSP/2016MagUp_Kplus.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = True
+data = False
+down = False
+year = "2016"
+stream = "B2XMuMu.Strip"
+line = "B2XMuMu_Line"
+
+channel = "PHSP"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "PHSP_2016MagUp.root"
+dv.CondDBtag = "sim-20170721-2-vc-mu100"
+dv.DDDBtag = "dddb-20170721-3"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/PHSP/2016MagUp_Kshort.py b/Code/Ganga/OptionFiles/Backgrounds/PHSP/2016MagUp_Kshort.py
new file mode 100644
index 0000000..8f23370
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/PHSP/2016MagUp_Kshort.py
@@ -0,0 +1,363 @@
+############# Global settings
+runFilters = False
+MDST = True
+data = False
+down = False
+year = "2016"
+stream = "B2XMuMu.Strip"
+line = "B2XMuMu_Line"
+
+channel = "PHSP"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+from Configurables import FilterDesktop, GaudiSequencer
+from Configurables import CombineParticles
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+
+#---------- Debugging tools----------#
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+#MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+ if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
+ from Configurables import Calo2MCTool
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
+ b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not( MDST ):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+ConeIsoInfo = 'ConeIsoInfo'
+VtxIsoInfo = 'VtxIsoInfo'
+if (not Run1 and not MDST):
+ if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
+ ConeIsoInfo = 'ConeIsoInfoBDT'
+ ConeIsoInfo = 'VtxIsoInfoBDT'
+
+
+if ( MDST ) :
+ for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+#trigger config
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+#dv.SkipEvents = 0
+dv.PrintFreq = 1000
+dv.EvtMax = -1
+dv.TupleFile = "PHSP_2016MagUp.root"
+dv.CondDBtag = "sim-20170721-2-vc-mu100"
+dv.DDDBtag = "dddb-20170721-3"
diff --git a/Code/Ganga/OptionFiles/Backgrounds/ScriptForScripts.py b/Code/Ganga/OptionFiles/Backgrounds/ScriptForScripts.py
new file mode 100644
index 0000000..b3af812
--- /dev/null
+++ b/Code/Ganga/OptionFiles/Backgrounds/ScriptForScripts.py
@@ -0,0 +1,221 @@
+#!/usr/bin/env python
+import os
+
+
+channel_list = ['Kplus',
+ 'Kshort'
+ ]
+
+decay_list = ['BtoKstMuMu',
+ 'BtoKstJpsi',
+ 'PHSP',
+ 'BtoXJpsi',
+ 'B0toKstMuMu',
+ 'B0toKstJpsi',
+ 'BtoK1MuMu',
+ 'BtoK1Jpsi'
+ ]
+
+
+polarity_list = ['MagDown',
+ 'MagUp']
+
+decay_year_dict = {'BtoKstMuMu' : ['2011','2012','2015','2016'],
+ 'BtoKstJpsi' : ['2011','2012'],
+ 'PHSP' : ['2011','2012','2015','2016'],
+ 'BtoXJpsi' : ['2011','2012','2015','2016'],
+ 'B0toKstMuMu': ['2011','2012','2015','2016'],
+ 'B0toKstJpsi': ['2011','2012','2015','2016'],
+ 'BtoK1MuMu' : ['2011','2012'],
+ 'BtoK1Jpsi' : ['2012']
+ }
+
+decay_mdst_file_dict = {'BtoKstMuMu' : {'2011': 'False',
+ '2012': 'False',
+ '2015': 'True',
+ '2016': 'True'
+ },
+ 'BtoKstJpsi' : {'2011': 'False',
+ '2012': 'False'
+ },
+ 'PHSP' : {'2011': 'False',
+ '2012': 'False',
+ '2015': 'True',
+ '2016': 'True'
+ },
+ 'BtoXJpsi' : {'2011': 'False',
+ '2012': 'False',
+ '2015': 'True',
+ '2016': 'False'
+ },
+ 'B0toKstMuMu': {'2011': 'False',
+ '2012': 'False',
+ '2015': 'False',
+ '2016': 'False'
+ },
+ 'B0toKstJpsi': {'2011': 'False',
+ '2012': 'False',
+ '2015': 'True',
+ '2016': 'True'
+ },
+ 'BtoK1MuMu' : {'2011': 'False',
+ '2012': 'False'
+ },
+ 'BtoK1Jpsi' : {'2012': 'False'
+ }
+ }
+
+decay_line_dict = {'BtoKstMuMu' : "B2XMuMu_Line",
+ 'BtoKstJpsi' : "B2XMuMu_Line",
+ 'PHSP' : "B2XMuMu_Line",
+ 'BtoXJpsi' : "B2XMuMu_Line",
+ 'B0toKstMuMu': "B2XMuMu_Line",
+ 'B0toKstJpsi': "B2XMuMu_Line",
+ 'BtoK1MuMu' : "B2XMuMu_Line",
+ 'BtoK1Jpsi' : "B2XMuMu_Line"
+ }
+
+decay_stream_dict = {'BtoKstMuMu' : "AllStreams",
+ 'BtoKstJpsi' : "AllStreams",
+ 'PHSP' : "B2XMuMu.Strip",
+ 'BtoXJpsi' : "AllStreams",
+ 'B0toKstMuMu': "AllStreams",
+ 'B0toKstJpsi': "AllStreams",
+ 'BtoK1MuMu' : "AllStreams",
+ 'BtoK1Jpsi' : "AllStreams"
+ }
+
+polarity_CondB_dict = {'MagDown' : 'md100',
+ 'MagUp' : 'mu100'
+ }
+#tags from vanyas amazing script
+# export PATH=$PATH:/afs/cern.ch/user/i/ibelyaev/public/scripts
+#lhcb-proxy-init
+#get_bookkeeping_info 10000027
+
+decay_CondDB_dict = { 'BtoKstMuMu' : {'2011': 'sim-20160614-1-vc-',
+ '2012': 'sim-20160321-2-vc-',
+ '2015': 'sim-20161124-vc-',
+ '2016': 'sim-20161124-vc-',
+ },
+ 'BtoKstJpsi' : {'2011': 'sim-20160614-1-vc-',
+ '2012': 'sim-20160321-2-vc-'
+ },
+ 'PHSP' : {'2011': 'sim-20160614-1-vc-',
+ '2012': 'sim-20160321-2-vc-',
+ '2015': 'sim-20161124-vc-',
+ '2016': 'sim-20170721-2-vc-'
+ },
+ 'BtoXJpsi' : {'2011': 'sim-20130522-vc-',
+ '2012': 'Sim08-20130503-1-vc-',
+ '2015': 'sim-20150813-vc-',
+ '2016': 'sim-20161124-2-vc-'
+ },
+ 'B0toKstMuMu': {'2011': 'sim-20130522-vc-',
+ '2012': 'Sim08-20130503-1-vc-',
+ '2015': 'sim-20161124-vc-',
+ '2016': 'sim-20161124-2-vc-'
+ },
+ 'B0toKstJpsi': {'2011': 'sim-20130522-vc-',
+ '2012': 'sim-20130522-1-vc-',
+ '2015': 'sim-20161124-vc-',
+ '2016': 'sim-20170721-2-vc-'
+ },
+ 'BtoK1MuMu' : {'2011': 'sim-20130522-vc-',
+ '2012': 'sim-20130522-1-vc-',
+ },
+ 'BtoK1Jpsi' : {'2012': 'Sim08-20130503-1-vc-'
+ }
+ }
+
+decay_DDDB_dict = { 'BtoKstMuMu' : {'2011': 'dddb-20160318-1',
+ '2012': 'dddb-20150928',
+ '2015': 'dddb-20150724',
+ '2016': 'dddb-20170721-3'
+ },
+ 'BtoKstJpsi' : {'2011': 'dddb-20160318-1',
+ '2012': 'dddb-20150928'
+ },
+ 'PHSP' :{'2011': 'dddb-20160318-1',
+ '2012': 'dddb-20150928',
+ '2015': 'dddb-20150724',
+ '2016': 'dddb-20170721-3'
+ },
+ 'BtoXJpsi' : {'2011': 'dddb-20130929',
+ '2012': 'Sim08-20130503-1',
+ '2015': 'dddb-20150724',
+ '2016': 'dddb-20150724'
+ },
+ 'B0toKstMuMu': {'2011': 'dddb-20130929',
+ '2012': 'Sim08-20130503-1',
+ '2015': 'dddb-20170721-3',
+ '2016': 'dddb-20150724'
+ },
+ 'B0toKstJpsi': {'2011': 'dddb-20130929',
+ '2012': 'dddb-20130929-1',
+ '2015': 'dddb-20170721-3',
+ '2016': 'dddb-20170721-3'
+ },
+ 'BtoK1MuMu' : {'2011': 'dddb-20130929',
+ '2012': 'dddb-20130929-1',
+ },
+ 'BtoK1Jpsi' : {'2012': 'Sim08-20130503-1'
+ }
+ }
+
+for channel in channel_list:
+ for decay in decay_list:
+ for year in decay_year_dict[decay]:
+ for polarity in polarity_list:
+ script_opts = { "DATA_TYPE":"MC",
+ "CHAN": channel,
+ "YEAR":year,
+ "POL": polarity,
+ "DEC": decay,
+ "MDST": decay_mdst_file_dict[decay][year],
+ "LINE": decay_line_dict[decay],
+ "STREAM":decay_stream_dict[decay],
+ "CONDB":decay_CondDB_dict[decay][year],
+ "CONDB_POL":polarity_CondB_dict[polarity],
+ "DDDBtag":decay_DDDB_dict[decay][year]
+ }
+
+ #lfn_file = "../LFN_files/%(DEC)s_%(YEAR)s%(POL)s.py" % script_opts
+ #xml_file = "../xml_files/catalog_%(DEC)s_%(YEAR)s%(POL)s.xml" % script_opts
+ #if not os.path.exists( "./%(DEC)s/" %script_opts):
+ # os.makedirs( "./%(DEC)s/" %script_opts)
+ #if not os.path.exists( "../local_tests_output/%(DEC)s/" %script_opts):
+ # os.makedirs( "../local_tests_output/%(DEC)s/" %script_opts)
+ opt_file = "./%(DEC)s/%(YEAR)s%(POL)s_%(CHAN)s.py" %script_opts
+ f1 = open(opt_file, 'w')
+ f1.write( '############# Global settings\n' )
+ f1.write( 'runFilters = False\n' )
+ f1.write( 'MDST = %(MDST)s\n' % script_opts)
+ f1.write( 'data = False\n' )
+ f1.write( 'down = %s\n' % (polarity == 'MagDown'))
+ f1.write( 'year = "%(YEAR)s"\n' % script_opts)
+ f1.write( 'stream = "%(STREAM)s"\n' % script_opts)
+ f1.write( 'line = "%(LINE)s"\n\n' % script_opts)
+ f1.write( 'channel = "%s"\n\n' % decay)
+ f1.write( '#subdecay chains\n' )
+ f1.write( 'KShortPiPlus = %s\n' % (channel == 'Kshort') )
+ f1.write( 'KplusPi0Merged = False\n' )
+ f1.write( 'KplusPi0Resolved = %s\n' % (channel == 'Kplus'))
+
+ # f_lfns = open('../../LFN_files/%(DEC)s_%(YEAR)s%(POL)s.py'%script_opts)
+ # for line in f_lfns.readlines():
+ # f1.write(line)
+ # f1.write("from Gaudi.Configuration import FileCatalog\n")
+ # f1.write("""FileCatalog().Catalogs +=['xmlcatalog_file:/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v41r2/tuplecreation/xml_files/catalog_%(DEC)s_%(YEAR)s%(POL)s.xml']\n""" % script_opts)
+ #f_lfns.close()
+
+ f = open('./BasicOptfile.py')
+ for line in f.readlines():
+ f1.write(line)
+ f.close()
+
+ f1.write( """dv.EvtMax = -1\n""" )
+ f1.write( """dv.TupleFile = "%(DEC)s_%(YEAR)s%(POL)s.root"\n""" % script_opts )
+ f1.write( """dv.CondDBtag = "%(CONDB)s%(CONDB_POL)s"\n""" % script_opts )
+ f1.write( """dv.DDDBtag = "%(DDDBtag)s"\n""" % script_opts )
+ f1.close()
diff --git a/Code/Ganga/OptionFiles/BasicOptfile.py b/Code/Ganga/OptionFiles/BasicOptfile.py
new file mode 100755
index 0000000..70b02eb
--- /dev/null
+++ b/Code/Ganga/OptionFiles/BasicOptfile.py
@@ -0,0 +1,446 @@
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20191004", "dddb-20190206-3"],
+ "2016": ["cond-20191004-1", "dddb-20190206-3"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/BasicOptfile_local_minimal_MC_test.py b/Code/Ganga/OptionFiles/BasicOptfile_local_minimal_MC_test.py
new file mode 100755
index 0000000..dd4d015
--- /dev/null
+++ b/Code/Ganga/OptionFiles/BasicOptfile_local_minimal_MC_test.py
@@ -0,0 +1,514 @@
+
+
+from GaudiConf import IOHelper
+#MC
+
+IOHelper('ROOT').inputFiles([
+ '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v38r1p3/00038003_00000002_1.allstreams.dst']) #MC 11 B0 down
+
+
+############# Global settings
+runFilters = False
+reference = False
+phsp = False
+data = False
+down = True
+year = "2011"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+MCB0 = True
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+if (MCB0):
+ MDST = False
+ print "\n[INFO]\tUsing DST as input.\n"
+else:
+ if( not data and Run1 ):
+ MDST = False
+ print "\n[INFO]\tUsing DST as input.\n"
+ else:
+ print "\n[INFO]\tUsing MDST as input.\n"
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+#LoKiToolb2KstmumuTuple = LoKi__Hybrid__TupleTool( 'LoKiTool')
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+# this is needed to emulate Stripping 21 on Stripping 20
+#if MCB0 is True:
+#from Configurables import PhysConf
+#PhysConf().CaloReProcessing = True
+
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (BTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiTool")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ # "ETA" : "RELINFO('/Event/Dimuon" + stream + "/Phys/B2XMuMu_Line/ETA', 'ETA', -1.)"
+ # "PHI" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'PHI', -1.)",
+ # 'DOCA1' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'DOCA(1,2)', -1.)",
+ "CONEANGLE" : "RELINFO('/Event/Dimuon" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+##Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+##DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+if (data):
+ if(year == "2011"): #'2011'
+ dv.CondDBtag = "cond-20150409-1"
+ dv.DDDBtag = "dddb-20150928"
+ elif(year == "2012"): #'2012'
+ dv.CondDBtag = "cond-20150409-1"
+ dv.DDDBtag = "dddb-20150928"
+ elif(year == "2015"): #'2015'
+ dv.CondDBtag = "cond-20150828"
+ dv.DDDBtag = "dddb-20150724"
+ else: #'2016'
+ dv.CondDBtag = "cond-20161004"
+ dv.DDDBtag = "dddb-20150724"
+
+else: #MC
+ if(KShortPiPlus):
+ if(year == "2011"): #'2011'
+ if (down):
+ dv.CondDBtag = "sim-20160614-1-vc-md100"#"sim-20111111-vc-md100
+ dv.DDDBtag = "dddb-20160318-1"#"MC11-20111102"
+ if (reference):
+ dv.CondDBtag = "sim-20160614-1-vc-md100"#"sim-20111111-vc-md100"
+ dv.DDDBtag = "dddb-20160318-1"#"MC11-20111102"
+ else: #'up'
+ dv.CondDBtag = "sim-20160614-1-vc-mu100"#"sim-20111111-vc-mu100"
+ dv.DDDBtag = "dddb-20160318-1"#"MC11-20111102"
+ if (reference):
+ dv.CondDBtag = "sim-20160614-1-vc-mu100"#"sim-20111111-vc-mu100"
+ dv.DDDBtag = "dddb-20160318-1"#"MC11-20111102"
+ elif(year == "2012"): #'2012'
+ if (down):
+ dv.CondDBtag = "sim-20160321-2-vc-md100"#"Sim08-20130503-1-vc-md100"
+ dv.DDDBtag = "dddb-20150928"#"Sim08-20130503-1"
+ if (reference):
+ dv.CondDBtag = "sim-20160321-2-vc-md100"#"sim-20141210-1-vc-md100"
+ dv.DDDBtag = "dddb-20150928"#"MC11-20111102"
+ else: #'up'
+ dv.CondDBtag = "sim-20160321-2-vc-mu100"#"Sim08-20130503-1-vc-mu100"
+ dv.DDDBtag = "dddb-20150928"#"Sim08-20130503-1"
+ if (reference):
+ dv.CondDBtag = "sim-20160321-2-vc-mu100"#"sim-20141210-1-vc-mu100"
+ dv.DDDBtag = "dddb-20150928"#"MC11-20111102"
+ elif(year == "2015"): #'2015'
+ if (down):
+ dv.CondDBtag = "sim-20161124-vc-md100"
+ dv.DDDBtag = "dddb-20150724"
+ if (reference):
+ dv.CondDBtag = ""
+ dv.DDDBtag = ""
+ else: #'up'
+ dv.CondDBtag = "sim-20161124-vc-mu100"
+ dv.DDDBtag = "dddb-20150724"
+ if (reference):
+ dv.CondDBtag = ""
+ dv.DDDBtag = ""
+ else: #'2016'
+ if (down):
+ dv.CondDBtag = "sim-20170721-2-vc-md100"
+ dv.DDDBtag = "dddb-20170721-3"
+ if (reference):
+ dv.CondDBtag = ""
+ dv.DDDBtag = ""
+ else: #'up'
+ dv.CondDBtag = "sim-20170721-2-vc-mu100"
+ dv.DDDBtag = "dddb-20170721-3"
+ if (reference):
+ dv.CondDBtag = ""
+ dv.DDDBtag = ""
+
+
+ if(KplusPi0Resolved):
+ if(year == "2011"): #'2011'
+ if (down):
+ dv.CondDBtag = "sim-20160614-1-vc-md100"#"sim-20111111-vc-md100
+ dv.DDDBtag = "dddb-20160318-1"#"Sim08-20130503-1"
+ if (reference):
+ dv.CondDBtag = "sim-20160614-1-vc-md100"#"sim-20111111-vc-md100"
+ dv.DDDBtag = "dddb-20160318-1"#"MC11-20111102"
+ if (MCB0):
+ dv.CondDBtag = ""
+ dv.DDDBtag = ""
+ else: #'up'
+ dv.CondDBtag = "sim-20160614-1-vc-mu100"#"sim-20111111-vc-mu100
+ dv.DDDBtag = "dddb-20160318-1"#"Sim08-20130503-1"
+ if (reference):
+ dv.CondDBtag = "sim-20160614-1-vc-mu100"#"sim-20111111-vc-mu100"
+ dv.DDDBtag = "dddb-20160318-1"#"MC11-20111102"
+ if (MCB0):
+ dv.CondDBtag = ""
+ dv.DDDBtag = ""
+ elif(year == "2012"): #'2012'
+ if (down):
+ dv.CondDBtag = "sim-20160321-2-vc-md100"#"Sim08-20130503-1-vc-md100"
+ dv.DDDBtag = "dddb-20150928"#"Sim08-20130503-1"
+ if (reference):
+ dv.CondDBtag = "sim-20160321-2-vc-md100"#"sim-20141210-1-vc-md100"
+ dv.DDDBtag = "dddb-20150928"#"MC11-20111102"
+ if (MCB0):
+ dv.CondDBtag = ""
+ dv.DDDBtag = ""
+ else: #'up'
+ dv.CondDBtag = "sim-20160321-2-vc-mu100"#"Sim08-20130503-1-vc-mu100"
+ dv.DDDBtag = "dddb-20150928"#"Sim08-20130503-1"
+ if (reference):
+ dv.CondDBtag = "sim-20160321-2-vc-mu100"#"sim-20141210-1-vc-mu100"
+ dv.DDDBtag = "dddb-20150928"#"MC11-20111102"
+ if (MCB0):
+ dv.CondDBtag = ""
+ dv.DDDBtag = ""
+ elif(year == "2015"): #'2015'
+ if (down):
+ dv.CondDBtag = "sim-20161124-vc-md100"
+ dv.DDDBtag = "dddb-20150724"
+ if (reference):
+ dv.CondDBtag = ""
+ dv.DDDBtag = ""
+ else: #'up'
+ dv.CondDBtag = "sim-20161124-vc-mu100"
+ dv.DDDBtag = "dddb-20150724"
+ if (reference):
+ dv.CondDBtag = ""
+ dv.DDDBtag = ""
+ else: #'2016'
+ if (down):
+ dv.CondDBtag = "sim-20170721-2-vc-md100"
+ dv.DDDBtag = "dddb-20170721-3"
+ if (reference):
+ dv.CondDBtag = ""
+ dv.DDDBtag = ""
+ else: #'up'
+ dv.CondDBtag = "sim-20170721-2-vc-mu100"
+ dv.DDDBtag = "dddb-20170721-3"
+ if (reference):
+ dv.CondDBtag = ""
+ dv.DDDBtag = ""
diff --git a/Code/Ganga/OptionFiles/BasicOptfile_local_test.py b/Code/Ganga/OptionFiles/BasicOptfile_local_test.py
new file mode 100755
index 0000000..d467d6e
--- /dev/null
+++ b/Code/Ganga/OptionFiles/BasicOptfile_local_test.py
@@ -0,0 +1,677 @@
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#### testing if it solves the problem
+#from PhysConf.Selections import CheckPVSelection, ValidBPVSelection
+
+### testing delete me later ###
+
+############# Global settings
+runFilters = False
+reference = False
+phsp = False
+BkgStudy = False
+data = False
+down = True
+year = "2018"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+#MC/2016/12113100/Beam6500GeV-2016-MagUp-Nu1.6-25ns-Pythia8/Sim09c/Trig0x6138160F/Reco16/Turbo03/Stripping28NoPrescalingFlagged/ALLSTREAMS.MDST
+
+from GaudiConf import IOHelper
+#MC
+#if (KplusPi0Resolved):
+#IOHelper('ROOT').inputFiles(['/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev/tuplecreation/optfiles/00065610_00000010_7.AllStreams.mdst']) #MC 16 up pi0
+#IOHelper('ROOT').inputFiles(['/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev/tuplecreation/optfiles/00054096_00000047_2.AllStreams.dst']) #MC 11 down pi0 VERTEX ERROR evt. 210
+#IOHelper('ROOT').inputFiles(['/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev/tuplecreation/optfiles/00066811_00000018_5.AllStreams.dst']) #MC 11 down pi0
+ #IOHelper('ROOT').inputFiles(['/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev/tuplecreation/optfiles/00054094_00000004_2.AllStreams.dst']) #MCref 2011 down
+
+#if (KShortPiPlus):
+#IOHelper('ROOT').inputFiles(['/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev/tuplecreation/optfiles/00065608_00000023_7.AllStreams.mdst']) #MC 16 up pi+
+ #IOHelper('ROOT').inputFiles(['/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev/tuplecreation/optfiles/00054096_00000012_2.AllStreams.dst']) #MC 2011 DOWN
+ #IOHelper('ROOT').inputFiles(['/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev/tuplecreation/optfiles/00054084_00000020_2.dst']) #MCref 2011 UP IOHelper('ROOT').inputFiles(['/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev/tuplecreation/optfiles/ 00050877_00002436_1.leptonic.mdst']) #Data 11 up
+
+#data
+if (down): pol_str = "Down"
+else: pol_str = "Up"
+
+#MC
+IOHelper('ROOT').inputFiles(['/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v41r2/tuplecreation/test_files/00105371_00000017_7.AllStreams.dst']) #MC Kplus 18 down
+#IOHelper('ROOT').inputFiles(['/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v41r2/tuplecreation/test_files/MC'+year+'Mag'+pol_str+'_Kshort.dst'])
+#IOHelper('ROOT').inputFiles(['/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev/tuplecreation/optfiles/00049592_00000602_1.leptonic.mdst']) #Data 15 down
+
+#PHSP
+#IOHelper('ROOT').inputFiles(['/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev/tuplecreation/optfiles/00067811_00000002_1.b2xmumu.strip.dst']) #phsp 11 Down K0 pi+
+#IOHelper('ROOT').inputFiles(['/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev/tuplecreation/optfiles/00067814_00000001_1.b2xmumu.strip.dst']) #phsp 11 Down K+ pi0
+
+
+###############################
+
+#MessageSvc().OutputLevel = VERBOSE
+#MessageSvc().OutputLevel = DEBUG
+MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
+
+###############################
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+#DST or MDST?
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = 100000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu"+year+"Mag"+pol_str+".root"
+
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+if (data):
+ if(year == "2011"): #'2011'
+ dv.CondDBtag = "cond-20150409-1"
+ dv.DDDBtag = "dddb-20150928"
+ elif(year == "2012"): #'2012'
+ dv.CondDBtag = "cond-20150409-1"
+ dv.DDDBtag = "dddb-20150928"
+ elif(year == "2015"): #'2015'
+ dv.CondDBtag = "cond-20150828"
+ dv.DDDBtag = "dddb-20150724"
+ elif(year == "2016"):
+ dv.CondDBtag = "cond-20161004"
+ dv.DDDBtag = "dddb-20150724"
+ elif(year == "2017"):
+ dv.CondDBtag = "cond-20170724"
+ dv.DDDBtag = "dddb-20170721-3"
+ else: # year=="2018"
+ dv.CondDBtag = "cond-20180202"
+ dv.DDDBtag = "dddb-20171030-3"
+
+
+else: #MC
+ if(KShortPiPlus):
+ if(year == "2011"): #'2011'
+ if (down):
+ dv.CondDBtag = "sim-20160614-1-vc-md100"#"sim-20111111-vc-md100
+ dv.DDDBtag = "dddb-20160318-1"#"MC11-20111102"
+ if (reference):
+ dv.CondDBtag = "sim-20160614-1-vc-md100"#"sim-20111111-vc-md100"
+ dv.DDDBtag = "dddb-20160318-1"#"MC11-20111102"
+ if (phsp):
+ dv.CondDBtag = "sim-20160614-1-vc-md100"
+ dv.DDDBtag = "dddb-20170721-1"
+ else: #'up'
+ dv.CondDBtag = "sim-20160614-1-vc-mu100"#"sim-20111111-vc-mu100"
+ dv.DDDBtag = "dddb-20160318-1"#"MC11-20111102"
+ if (reference):
+ dv.CondDBtag = "sim-20160614-1-vc-mu100"#"sim-20111111-vc-mu100"
+ dv.DDDBtag = "dddb-20160318-1"#"MC11-20111102"
+ if (phsp):
+ dv.CondDBtag = "sim-20160614-1-vc-mu100"
+ dv.DDDBtag = "dddb-20170721-1"
+ elif(year == "2012"): #'2012'
+ if (down):
+ dv.CondDBtag = "sim-20160321-2-vc-md100"#"Sim08-20130503-1-vc-md100"
+ dv.DDDBtag = "dddb-20150928"#"Sim08-20130503-1"
+ if (reference):
+ dv.CondDBtag = "sim-20160321-2-vc-md100"#"sim-20141210-1-vc-md100"
+ dv.DDDBtag = "dddb-20150928"#"MC11-20111102"
+ if (phsp):
+ dv.CondDBtag = "sim-20160321-2-vc-md100"
+ dv.DDDBtag = "dddb-20170721-2"
+ else: #'up'
+ dv.CondDBtag = "sim-20160321-2-vc-mu100"#"Sim08-20130503-1-vc-mu100"
+ dv.DDDBtag = "dddb-20150928"#"Sim08-20130503-1"
+ if (reference):
+ dv.CondDBtag = "sim-20160321-2-vc-mu100"#"sim-20141210-1-vc-mu100"
+ dv.DDDBtag = "dddb-20150928"#"MC11-20111102"
+ if (phsp):
+ dv.CondDBtag = "sim-20160321-2-vc-mu100"
+ dv.DDDBtag = "dddb-20170721-2"
+ elif(year == "2015"): #'2015'
+ if (down):
+ dv.CondDBtag = "sim-20161124-vc-md100"
+ dv.DDDBtag = "dddb-20150724"
+ if (reference):
+ dv.CondDBtag = ""
+ dv.DDDBtag = ""
+ if (phsp):
+ dv.CondDBtag = "sim-20161124-vc-md100"
+ dv.DDDBtag = "dddb-20170721-3"
+ else: #'up'
+ dv.CondDBtag = "sim-20161124-vc-mu100"
+ dv.DDDBtag = "dddb-20150724"
+ if (reference):
+ dv.CondDBtag = ""
+ dv.DDDBtag = ""
+ if (phsp):
+ dv.CondDBtag = "sim-20161124-vc-mu100"
+ dv.DDDBtag = "dddb-20170721-3"
+ elif(year == "2016"): #'2016'
+ if (down):
+ dv.CondDBtag = "sim-20170721-2-vc-md100"
+ dv.DDDBtag = "dddb-20170721-3"
+ if (reference):
+ dv.CondDBtag = "sim-20170721-2-vc-mu100"
+ dv.DDDBtag = "dddb-20170721-3"
+ if (phsp):
+ dv.CondDBtag = "sim-20170721-2-vc-md100"
+ dv.DDDBtag = "dddb-20170721-3"
+ else: #'up'
+ dv.CondDBtag = "sim-20170721-2-vc-mu100"
+ dv.DDDBtag = "dddb-20170721-3"
+ if (reference):
+ dv.CondDBtag = "sim-20170721-2-vc-mu100"
+ dv.DDDBtag = "dddb-20170721-3"
+ if (phsp):
+ dv.CondDBtag = "sim-20170721-2-vc-mu100"
+ dv.DDDBtag = "dddb-20170721-3"
+ elif(year == "2017"): #'2017'
+ if (down):
+ dv.CondDBtag = "sim-20180411-vc-md100"
+ dv.DDDBtag = "dddb-20170721-3"
+ if (reference):
+ dv.CondDBtag = ""
+ dv.DDDBtag = ""
+ if (phsp):
+ dv.CondDBtag = "sim-20180411-vc-md100"
+ dv.DDDBtag = "dddb-20170721-3"
+ else: #'up'
+ dv.CondDBtag = "sim-20180411-vc-mu100"
+ dv.DDDBtag = "dddb-20170721-3"
+ if (reference):
+ dv.CondDBtag = ""
+ if (phsp):
+ dv.CondDBtag = "sim-20180411-vc-mu100"
+ dv.DDDBtag = "dddb-20170721-3"
+ else: #'2018' #Preparation for 2018
+ if (down):
+ dv.CondDBtag = ""
+ dv.DDDBtag = ""
+ if (reference):
+ dv.CondDBtag = ""
+ dv.DDDBtag = ""
+ if (phsp):
+ dv.CondDBtag = "sim-20190128-vc-md100"
+ dv.DDDBtag = "dddb-20170721-3"
+ else: #'up'
+ dv.CondDBtag = ""
+ dv.DDDBtag = ""
+ if (reference):
+ dv.CondDBtag = ""
+ dv.DDDBtag = ""
+ if (phsp):
+ dv.CondDBtag = "sim-20190128-vc-mu100"
+ dv.DDDBtag = "dddb-20170721-3"
+ if(KplusPi0Resolved):
+ if(year == "2011"): #'2011'
+ if (down):
+ dv.CondDBtag = "sim-20160614-1-vc-md100"#"sim-20111111-vc-md100
+ dv.DDDBtag = "dddb-20160318-1"#"Sim08-20130503-1"
+ if (reference):
+ dv.CondDBtag = "sim-20160614-1-vc-md100"#"sim-20111111-vc-md100"
+ dv.DDDBtag = "dddb-20160318-1"#"MC11-20111102"
+ if (phsp):
+ dv.CondDBtag = "sim-20160614-1-vc-md100"
+ dv.DDDBtag = "dddb-20170721-1"
+ else: #'up'
+ dv.CondDBtag = "sim-20160614-1-vc-mu100"#"sim-20111111-vc-mu100
+ dv.DDDBtag = "dddb-20160318-1"#"Sim08-20130503-1"
+ if (reference):
+ dv.CondDBtag = "sim-20160614-1-vc-mu100"#"sim-20111111-vc-mu100"
+ dv.DDDBtag = "dddb-20160318-1"#"MC11-20111102"
+ if (phsp):
+ dv.CondDBtag = "sim-20160614-1-vc-mu100"
+ dv.DDDBtag = "dddb-20170721-1"
+ elif(year == "2012"): #'2012'
+ if (down):
+ dv.CondDBtag = "sim-20160321-2-vc-md100"#"Sim08-20130503-1-vc-md100"
+ dv.DDDBtag = "dddb-20150928"#"Sim08-20130503-1"
+ if (reference):
+ dv.CondDBtag = "sim-20160321-2-vc-md100"#"sim-20141210-1-vc-md100"
+ dv.DDDBtag = "dddb-20150928"#"MC11-20111102"
+ if (phsp):
+ dv.CondDBtag = "sim-20160321-2-vc-md100"
+ dv.DDDBtag = "dddb-20170721-2"
+ else: #'up'
+ dv.CondDBtag = "sim-20160321-2-vc-mu100"#"Sim08-20130503-1-vc-mu100"
+ dv.DDDBtag = "dddb-20150928"#"Sim08-20130503-1"
+ if (reference):
+ dv.CondDBtag = "sim-20160321-2-vc-mu100"#"sim-20141210-1-vc-mu100"
+ dv.DDDBtag = "dddb-20150928"#"MC11-20111102"
+ if (phsp):
+ dv.CondDBtag = "sim-20160321-2-vc-mu100"
+ dv.DDDBtag = "dddb-20170721-2"
+ elif(year == "2015"): #'2015'
+ if (down):
+ dv.CondDBtag = "sim-20161124-vc-md100"
+ dv.DDDBtag = "dddb-20150724"
+ if (reference):
+ dv.CondDBtag = "sim-20161124-vc-md100"
+ dv.DDDBtag = "dddb-20170721-3"
+ if (phsp):
+ dv.CondDBtag = "sim-20161124-vc-md100"
+ dv.DDDBtag = "dddb-20170721-3"
+ else: #'up'
+ dv.CondDBtag = "sim-20161124-vc-mu100"
+ dv.DDDBtag = "dddb-20150724"
+ if (reference):
+ dv.CondDBtag = "sim-20161124-vc-mu100"
+ dv.DDDBtag = "dddb-20170721-3"
+ if (phsp):
+ dv.CondDBtag = "sim-20161124-vc-mu100"
+ dv.DDDBtag = "dddb-20170721-3"
+ elif(year == "2016"): #'2016'
+ if (down):
+ dv.CondDBtag = "sim-20170721-2-vc-md100"
+ dv.DDDBtag = "dddb-20170721-3"
+ if (reference):
+ dv.CondDBtag = "sim-20170721-2-vc-md100"
+ dv.DDDBtag = "dddb-20170721-3"
+ if (phsp):
+ dv.CondDBtag = "sim-20170721-2-vc-md100"
+ dv.DDDBtag = "dddb-20170721-3"
+ else: #'up'
+ dv.CondDBtag = "sim-20170721-2-vc-mu100"
+ dv.DDDBtag = "dddb-20170721-3"
+ if (reference):
+ dv.CondDBtag = "sim-20170721-2-vc-mu100"
+ dv.DDDBtag = "dddb-20170721-3"
+ if (phsp):
+ dv.CondDBtag = "sim-20170721-2-vc-mu100"
+ dv.DDDBtag = "dddb-20170721-3"
+ elif(year == "2017"): #'2017'
+ if (down):
+ dv.CondDBtag = "sim-20180411-vc-md100"
+ dv.DDDBtag = "dddb-20170721-3"
+ if (reference):
+ dv.CondDBtag = ""
+ dv.DDDBtag = ""
+ if (phsp):
+ dv.CondDBtag = "sim-20180411-vc-md100"
+ dv.DDDBtag = "dddb-20170721-3"
+ else: #'up'
+ dv.CondDBtag = "sim-20180411-vc-mu100"
+ dv.DDDBtag = "dddb-20170721-3"
+ if (reference):
+ dv.CondDBtag = ""
+ dv.DDDBtag = ""
+ if (phsp):
+ dv.CondDBtag = "sim-20180411-vc-mu100"
+ dv.DDDBtag = "dddb-20170721-3"
+ else: #'2018' #Preparation for 2018
+ if (down):
+ dv.CondDBtag = "sim-20190430-vc-md100"
+ dv.DDDBtag = "dddb-20170721-3"
+ if (reference):
+ dv.CondDBtag = ""
+ dv.DDDBtag = ""
+ if (phsp):
+ dv.CondDBtag = "sim-20190128-vc-md100"
+ dv.DDDBtag = "dddb-20170721-3"
+ else: #'up'
+ dv.CondDBtag = "sim-20190430-vc-md100"
+ dv.DDDBtag = "dddb-20170721-3"
+ if (reference):
+ dv.CondDBtag = ""
+ dv.DDDBtag = ""
+ if (phsp):
+ dv.CondDBtag = "sim-20190128-vc-mu100"
+ dv.DDDBtag = "dddb-20170721-3"
diff --git a/Code/Ganga/OptionFiles/MC/BkgStudy/2011Down_MC_Kplus.py b/Code/Ganga/OptionFiles/MC/BkgStudy/2011Down_MC_Kplus.py
new file mode 100644
index 0000000..b444f66
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/BkgStudy/2011Down_MC_Kplus.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = False
+BkgStudy = True
+data = False
+down = True
+year = "2011"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/BkgStudy/2011Up_MC_Kplus.py b/Code/Ganga/OptionFiles/MC/BkgStudy/2011Up_MC_Kplus.py
new file mode 100644
index 0000000..1ac25a5
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/BkgStudy/2011Up_MC_Kplus.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = False
+BkgStudy = True
+data = False
+down = False
+year = "2011"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/BkgStudy/2012Down_MC_Kplus.py b/Code/Ganga/OptionFiles/MC/BkgStudy/2012Down_MC_Kplus.py
new file mode 100644
index 0000000..8010e71
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/BkgStudy/2012Down_MC_Kplus.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = False
+BkgStudy = True
+data = False
+down = True
+year = "2012"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/BkgStudy/2012Up_MC_Kplus.py b/Code/Ganga/OptionFiles/MC/BkgStudy/2012Up_MC_Kplus.py
new file mode 100644
index 0000000..f5ae83c
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/BkgStudy/2012Up_MC_Kplus.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = False
+BkgStudy = True
+data = False
+down = False
+year = "2012"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/BkgStudy/2015Down_MC_Kplus.py b/Code/Ganga/OptionFiles/MC/BkgStudy/2015Down_MC_Kplus.py
new file mode 100644
index 0000000..092f520
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/BkgStudy/2015Down_MC_Kplus.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = False
+BkgStudy = True
+data = False
+down = True
+year = "2015"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/BkgStudy/2015Up_MC_Kplus.py b/Code/Ganga/OptionFiles/MC/BkgStudy/2015Up_MC_Kplus.py
new file mode 100644
index 0000000..5a73db1
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/BkgStudy/2015Up_MC_Kplus.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = False
+BkgStudy = True
+data = False
+down = False
+year = "2015"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/BkgStudy/2016Down_MC_Kplus.py b/Code/Ganga/OptionFiles/MC/BkgStudy/2016Down_MC_Kplus.py
new file mode 100644
index 0000000..5ce8e2d
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/BkgStudy/2016Down_MC_Kplus.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = False
+BkgStudy = True
+data = False
+down = True
+year = "2016"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/BkgStudy/2016Up_MC_Kplus.py b/Code/Ganga/OptionFiles/MC/BkgStudy/2016Up_MC_Kplus.py
new file mode 100644
index 0000000..a9d59fb
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/BkgStudy/2016Up_MC_Kplus.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = False
+BkgStudy = True
+data = False
+down = False
+year = "2016"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/BkgStudy/2017Down_MC_Kplus.py b/Code/Ganga/OptionFiles/MC/BkgStudy/2017Down_MC_Kplus.py
new file mode 100644
index 0000000..0a55c90
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/BkgStudy/2017Down_MC_Kplus.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = False
+BkgStudy = True
+data = False
+down = True
+year = "2017"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/BkgStudy/2017Up_MC_Kplus.py b/Code/Ganga/OptionFiles/MC/BkgStudy/2017Up_MC_Kplus.py
new file mode 100644
index 0000000..5638f5f
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/BkgStudy/2017Up_MC_Kplus.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = False
+BkgStudy = True
+data = False
+down = False
+year = "2017"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/BkgStudy/2018Down_MC_Kplus.py b/Code/Ganga/OptionFiles/MC/BkgStudy/2018Down_MC_Kplus.py
new file mode 100644
index 0000000..66b1922
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/BkgStudy/2018Down_MC_Kplus.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = False
+BkgStudy = True
+data = False
+down = True
+year = "2018"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/BkgStudy/2018Up_MC_Kplus.py b/Code/Ganga/OptionFiles/MC/BkgStudy/2018Up_MC_Kplus.py
new file mode 100644
index 0000000..20d657d
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/BkgStudy/2018Up_MC_Kplus.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = False
+BkgStudy = True
+data = False
+down = False
+year = "2018"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/KstJpsi/2011Down_MC_Kplus.py b/Code/Ganga/OptionFiles/MC/KstJpsi/2011Down_MC_Kplus.py
new file mode 100644
index 0000000..dd94ce1
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/KstJpsi/2011Down_MC_Kplus.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = True
+phsp = False
+BkgStudy = False
+data = False
+down = True
+year = "2011"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/KstJpsi/2011Down_MC_Kshort.py b/Code/Ganga/OptionFiles/MC/KstJpsi/2011Down_MC_Kshort.py
new file mode 100644
index 0000000..13e36d5
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/KstJpsi/2011Down_MC_Kshort.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = True
+phsp = False
+BkgStudy = False
+data = False
+down = True
+year = "2011"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/KstJpsi/2011Up_MC_Kplus.py b/Code/Ganga/OptionFiles/MC/KstJpsi/2011Up_MC_Kplus.py
new file mode 100644
index 0000000..d84a3c3
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/KstJpsi/2011Up_MC_Kplus.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = True
+phsp = False
+BkgStudy = False
+data = False
+down = False
+year = "2011"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/KstJpsi/2011Up_MC_Kshort.py b/Code/Ganga/OptionFiles/MC/KstJpsi/2011Up_MC_Kshort.py
new file mode 100644
index 0000000..74cdfc1
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/KstJpsi/2011Up_MC_Kshort.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = True
+phsp = False
+BkgStudy = False
+data = False
+down = False
+year = "2011"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/KstJpsi/2012Down_MC_Kplus.py b/Code/Ganga/OptionFiles/MC/KstJpsi/2012Down_MC_Kplus.py
new file mode 100644
index 0000000..9ffbd72
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/KstJpsi/2012Down_MC_Kplus.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = True
+phsp = False
+BkgStudy = False
+data = False
+down = True
+year = "2012"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/KstJpsi/2012Down_MC_Kshort.py b/Code/Ganga/OptionFiles/MC/KstJpsi/2012Down_MC_Kshort.py
new file mode 100644
index 0000000..2283754
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/KstJpsi/2012Down_MC_Kshort.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = True
+phsp = False
+BkgStudy = False
+data = False
+down = True
+year = "2012"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/KstJpsi/2012Up_MC_Kplus.py b/Code/Ganga/OptionFiles/MC/KstJpsi/2012Up_MC_Kplus.py
new file mode 100644
index 0000000..faf56f6
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/KstJpsi/2012Up_MC_Kplus.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = True
+phsp = False
+BkgStudy = False
+data = False
+down = False
+year = "2012"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/KstJpsi/2012Up_MC_Kshort.py b/Code/Ganga/OptionFiles/MC/KstJpsi/2012Up_MC_Kshort.py
new file mode 100644
index 0000000..26d3c3d
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/KstJpsi/2012Up_MC_Kshort.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = True
+phsp = False
+BkgStudy = False
+data = False
+down = False
+year = "2012"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/KstJpsi/2015Down_MC_Kplus.py b/Code/Ganga/OptionFiles/MC/KstJpsi/2015Down_MC_Kplus.py
new file mode 100644
index 0000000..5925e56
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/KstJpsi/2015Down_MC_Kplus.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = True
+phsp = False
+BkgStudy = False
+data = False
+down = True
+year = "2015"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/KstJpsi/2015Down_MC_Kshort.py b/Code/Ganga/OptionFiles/MC/KstJpsi/2015Down_MC_Kshort.py
new file mode 100644
index 0000000..58f281b
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/KstJpsi/2015Down_MC_Kshort.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = True
+phsp = False
+BkgStudy = False
+data = False
+down = True
+year = "2015"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/KstJpsi/2015Up_MC_Kplus.py b/Code/Ganga/OptionFiles/MC/KstJpsi/2015Up_MC_Kplus.py
new file mode 100644
index 0000000..954e53d
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/KstJpsi/2015Up_MC_Kplus.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = True
+phsp = False
+BkgStudy = False
+data = False
+down = False
+year = "2015"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/KstJpsi/2015Up_MC_Kshort.py b/Code/Ganga/OptionFiles/MC/KstJpsi/2015Up_MC_Kshort.py
new file mode 100644
index 0000000..15a61a3
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/KstJpsi/2015Up_MC_Kshort.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = True
+phsp = False
+BkgStudy = False
+data = False
+down = False
+year = "2015"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/KstJpsi/2016Down_MC_Kplus.py b/Code/Ganga/OptionFiles/MC/KstJpsi/2016Down_MC_Kplus.py
new file mode 100644
index 0000000..59c9949
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/KstJpsi/2016Down_MC_Kplus.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = True
+phsp = False
+BkgStudy = False
+data = False
+down = True
+year = "2016"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/KstJpsi/2016Down_MC_Kshort.py b/Code/Ganga/OptionFiles/MC/KstJpsi/2016Down_MC_Kshort.py
new file mode 100644
index 0000000..094f15d
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/KstJpsi/2016Down_MC_Kshort.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = True
+phsp = False
+BkgStudy = False
+data = False
+down = True
+year = "2016"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/KstJpsi/2016Up_MC_Kplus.py b/Code/Ganga/OptionFiles/MC/KstJpsi/2016Up_MC_Kplus.py
new file mode 100644
index 0000000..1c3a707
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/KstJpsi/2016Up_MC_Kplus.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = True
+phsp = False
+BkgStudy = False
+data = False
+down = False
+year = "2016"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/KstJpsi/2016Up_MC_Kshort.py b/Code/Ganga/OptionFiles/MC/KstJpsi/2016Up_MC_Kshort.py
new file mode 100644
index 0000000..f79e2b3
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/KstJpsi/2016Up_MC_Kshort.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = True
+phsp = False
+BkgStudy = False
+data = False
+down = False
+year = "2016"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/KstJpsi/2017Down_MC_Kplus.py b/Code/Ganga/OptionFiles/MC/KstJpsi/2017Down_MC_Kplus.py
new file mode 100644
index 0000000..4d12698
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/KstJpsi/2017Down_MC_Kplus.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = True
+phsp = False
+BkgStudy = False
+data = False
+down = True
+year = "2017"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/KstJpsi/2017Down_MC_Kshort.py b/Code/Ganga/OptionFiles/MC/KstJpsi/2017Down_MC_Kshort.py
new file mode 100644
index 0000000..ad56700
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/KstJpsi/2017Down_MC_Kshort.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = True
+phsp = False
+BkgStudy = False
+data = False
+down = True
+year = "2017"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/KstJpsi/2017Up_MC_Kplus.py b/Code/Ganga/OptionFiles/MC/KstJpsi/2017Up_MC_Kplus.py
new file mode 100644
index 0000000..f239d65
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/KstJpsi/2017Up_MC_Kplus.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = True
+phsp = False
+BkgStudy = False
+data = False
+down = False
+year = "2017"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/KstJpsi/2017Up_MC_Kshort.py b/Code/Ganga/OptionFiles/MC/KstJpsi/2017Up_MC_Kshort.py
new file mode 100644
index 0000000..642ccfb
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/KstJpsi/2017Up_MC_Kshort.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = True
+phsp = False
+BkgStudy = False
+data = False
+down = False
+year = "2017"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/KstJpsi/2018Down_MC_Kplus.py b/Code/Ganga/OptionFiles/MC/KstJpsi/2018Down_MC_Kplus.py
new file mode 100644
index 0000000..77a0b66
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/KstJpsi/2018Down_MC_Kplus.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = True
+phsp = False
+BkgStudy = False
+data = False
+down = True
+year = "2018"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/KstJpsi/2018Down_MC_Kshort.py b/Code/Ganga/OptionFiles/MC/KstJpsi/2018Down_MC_Kshort.py
new file mode 100644
index 0000000..0b91bbc
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/KstJpsi/2018Down_MC_Kshort.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = True
+phsp = False
+BkgStudy = False
+data = False
+down = True
+year = "2018"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/KstJpsi/2018Up_MC_Kplus.py b/Code/Ganga/OptionFiles/MC/KstJpsi/2018Up_MC_Kplus.py
new file mode 100644
index 0000000..9841307
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/KstJpsi/2018Up_MC_Kplus.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = True
+phsp = False
+BkgStudy = False
+data = False
+down = False
+year = "2018"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/KstJpsi/2018Up_MC_Kshort.py b/Code/Ganga/OptionFiles/MC/KstJpsi/2018Up_MC_Kshort.py
new file mode 100644
index 0000000..118512a
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/KstJpsi/2018Up_MC_Kshort.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = True
+phsp = False
+BkgStudy = False
+data = False
+down = False
+year = "2018"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/KstMuMu/2011Down_MC_Kplus.py b/Code/Ganga/OptionFiles/MC/KstMuMu/2011Down_MC_Kplus.py
new file mode 100644
index 0000000..e61ae82
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/KstMuMu/2011Down_MC_Kplus.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = False
+BkgStudy = False
+data = False
+down = True
+year = "2011"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/KstMuMu/2011Down_MC_Kshort.py b/Code/Ganga/OptionFiles/MC/KstMuMu/2011Down_MC_Kshort.py
new file mode 100644
index 0000000..875b964
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/KstMuMu/2011Down_MC_Kshort.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = False
+BkgStudy = False
+data = False
+down = True
+year = "2011"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/KstMuMu/2011Up_MC_Kplus.py b/Code/Ganga/OptionFiles/MC/KstMuMu/2011Up_MC_Kplus.py
new file mode 100644
index 0000000..c0f1283
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/KstMuMu/2011Up_MC_Kplus.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = False
+BkgStudy = False
+data = False
+down = False
+year = "2011"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/KstMuMu/2011Up_MC_Kshort.py b/Code/Ganga/OptionFiles/MC/KstMuMu/2011Up_MC_Kshort.py
new file mode 100644
index 0000000..8d8db79
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/KstMuMu/2011Up_MC_Kshort.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = False
+BkgStudy = False
+data = False
+down = False
+year = "2011"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/KstMuMu/2012Down_MC_Kplus.py b/Code/Ganga/OptionFiles/MC/KstMuMu/2012Down_MC_Kplus.py
new file mode 100644
index 0000000..74f205c
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/KstMuMu/2012Down_MC_Kplus.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = False
+BkgStudy = False
+data = False
+down = True
+year = "2012"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/KstMuMu/2012Down_MC_Kshort.py b/Code/Ganga/OptionFiles/MC/KstMuMu/2012Down_MC_Kshort.py
new file mode 100644
index 0000000..14802b8
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/KstMuMu/2012Down_MC_Kshort.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = False
+BkgStudy = False
+data = False
+down = True
+year = "2012"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/KstMuMu/2012Up_MC_Kplus.py b/Code/Ganga/OptionFiles/MC/KstMuMu/2012Up_MC_Kplus.py
new file mode 100644
index 0000000..d86189f
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/KstMuMu/2012Up_MC_Kplus.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = False
+BkgStudy = False
+data = False
+down = False
+year = "2012"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/KstMuMu/2012Up_MC_Kshort.py b/Code/Ganga/OptionFiles/MC/KstMuMu/2012Up_MC_Kshort.py
new file mode 100644
index 0000000..aaf6ea9
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/KstMuMu/2012Up_MC_Kshort.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = False
+BkgStudy = False
+data = False
+down = False
+year = "2012"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/KstMuMu/2015Down_MC_Kplus.py b/Code/Ganga/OptionFiles/MC/KstMuMu/2015Down_MC_Kplus.py
new file mode 100644
index 0000000..b969ea7
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/KstMuMu/2015Down_MC_Kplus.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = False
+BkgStudy = False
+data = False
+down = True
+year = "2015"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/KstMuMu/2015Down_MC_Kshort.py b/Code/Ganga/OptionFiles/MC/KstMuMu/2015Down_MC_Kshort.py
new file mode 100644
index 0000000..96cc384
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/KstMuMu/2015Down_MC_Kshort.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = False
+BkgStudy = False
+data = False
+down = True
+year = "2015"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/KstMuMu/2015Up_MC_Kplus.py b/Code/Ganga/OptionFiles/MC/KstMuMu/2015Up_MC_Kplus.py
new file mode 100644
index 0000000..2dba50a
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/KstMuMu/2015Up_MC_Kplus.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = False
+BkgStudy = False
+data = False
+down = False
+year = "2015"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/KstMuMu/2015Up_MC_Kshort.py b/Code/Ganga/OptionFiles/MC/KstMuMu/2015Up_MC_Kshort.py
new file mode 100644
index 0000000..8747af7
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/KstMuMu/2015Up_MC_Kshort.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = False
+BkgStudy = False
+data = False
+down = False
+year = "2015"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/KstMuMu/2016Down_MC_Kplus.py b/Code/Ganga/OptionFiles/MC/KstMuMu/2016Down_MC_Kplus.py
new file mode 100644
index 0000000..9f43eb0
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/KstMuMu/2016Down_MC_Kplus.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = False
+BkgStudy = False
+data = False
+down = True
+year = "2016"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/KstMuMu/2016Down_MC_Kshort.py b/Code/Ganga/OptionFiles/MC/KstMuMu/2016Down_MC_Kshort.py
new file mode 100644
index 0000000..add3f1a
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/KstMuMu/2016Down_MC_Kshort.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = False
+BkgStudy = False
+data = False
+down = True
+year = "2016"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/KstMuMu/2016Up_MC_Kplus.py b/Code/Ganga/OptionFiles/MC/KstMuMu/2016Up_MC_Kplus.py
new file mode 100644
index 0000000..a09588c
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/KstMuMu/2016Up_MC_Kplus.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = False
+BkgStudy = False
+data = False
+down = False
+year = "2016"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/KstMuMu/2016Up_MC_Kshort.py b/Code/Ganga/OptionFiles/MC/KstMuMu/2016Up_MC_Kshort.py
new file mode 100644
index 0000000..d76bf01
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/KstMuMu/2016Up_MC_Kshort.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = False
+BkgStudy = False
+data = False
+down = False
+year = "2016"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/KstMuMu/2017Down_MC_Kplus.py b/Code/Ganga/OptionFiles/MC/KstMuMu/2017Down_MC_Kplus.py
new file mode 100644
index 0000000..45e796a
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/KstMuMu/2017Down_MC_Kplus.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = False
+BkgStudy = False
+data = False
+down = True
+year = "2017"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/KstMuMu/2017Down_MC_Kshort.py b/Code/Ganga/OptionFiles/MC/KstMuMu/2017Down_MC_Kshort.py
new file mode 100644
index 0000000..a6ef708
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/KstMuMu/2017Down_MC_Kshort.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = False
+BkgStudy = False
+data = False
+down = True
+year = "2017"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/KstMuMu/2017Up_MC_Kplus.py b/Code/Ganga/OptionFiles/MC/KstMuMu/2017Up_MC_Kplus.py
new file mode 100644
index 0000000..c4c5d16
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/KstMuMu/2017Up_MC_Kplus.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = False
+BkgStudy = False
+data = False
+down = False
+year = "2017"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/KstMuMu/2017Up_MC_Kshort.py b/Code/Ganga/OptionFiles/MC/KstMuMu/2017Up_MC_Kshort.py
new file mode 100644
index 0000000..8927d17
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/KstMuMu/2017Up_MC_Kshort.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = False
+BkgStudy = False
+data = False
+down = False
+year = "2017"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/KstMuMu/2018Down_MC_Kplus.py b/Code/Ganga/OptionFiles/MC/KstMuMu/2018Down_MC_Kplus.py
new file mode 100644
index 0000000..100a310
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/KstMuMu/2018Down_MC_Kplus.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = False
+BkgStudy = False
+data = False
+down = True
+year = "2018"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/KstMuMu/2018Down_MC_Kshort.py b/Code/Ganga/OptionFiles/MC/KstMuMu/2018Down_MC_Kshort.py
new file mode 100644
index 0000000..c32fcec
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/KstMuMu/2018Down_MC_Kshort.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = False
+BkgStudy = False
+data = False
+down = True
+year = "2018"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/KstMuMu/2018Up_MC_Kplus.py b/Code/Ganga/OptionFiles/MC/KstMuMu/2018Up_MC_Kplus.py
new file mode 100644
index 0000000..16ff7ef
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/KstMuMu/2018Up_MC_Kplus.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = False
+BkgStudy = False
+data = False
+down = False
+year = "2018"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/MC/KstMuMu/2018Up_MC_Kshort.py b/Code/Ganga/OptionFiles/MC/KstMuMu/2018Up_MC_Kshort.py
new file mode 100644
index 0000000..ebbf10a
--- /dev/null
+++ b/Code/Ganga/OptionFiles/MC/KstMuMu/2018Up_MC_Kshort.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = False
+BkgStudy = False
+data = False
+down = False
+year = "2018"
+stream = "AllStreams"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/PHSP/.imap/2011Down_PHSP_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/PHSP/.imap/2011Down_PHSP_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/PHSP/.imap/2011Down_PHSP_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/PHSP/.imap/2011Down_PHSP_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/PHSP/.imap/2011Down_PHSP_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/PHSP/.imap/2011Down_PHSP_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/PHSP/.imap/2011Up_PHSP_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/PHSP/.imap/2011Up_PHSP_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/PHSP/.imap/2011Up_PHSP_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/PHSP/.imap/2011Up_PHSP_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/PHSP/.imap/2011Up_PHSP_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/PHSP/.imap/2011Up_PHSP_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/PHSP/.imap/2012Down_PHSP_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/PHSP/.imap/2012Down_PHSP_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/PHSP/.imap/2012Down_PHSP_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/PHSP/.imap/2012Down_PHSP_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/PHSP/.imap/2012Down_PHSP_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/PHSP/.imap/2012Down_PHSP_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/PHSP/.imap/2012Up_PHSP_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/PHSP/.imap/2012Up_PHSP_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/PHSP/.imap/2012Up_PHSP_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/PHSP/.imap/2012Up_PHSP_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/PHSP/.imap/2012Up_PHSP_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/PHSP/.imap/2012Up_PHSP_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/PHSP/.imap/2015Down_PHSP_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/PHSP/.imap/2015Down_PHSP_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/PHSP/.imap/2015Down_PHSP_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/PHSP/.imap/2015Down_PHSP_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/PHSP/.imap/2015Down_PHSP_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/PHSP/.imap/2015Down_PHSP_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/PHSP/.imap/2015Up_PHSP_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/PHSP/.imap/2015Up_PHSP_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/PHSP/.imap/2015Up_PHSP_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/PHSP/.imap/2015Up_PHSP_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/PHSP/.imap/2015Up_PHSP_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/PHSP/.imap/2015Up_PHSP_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/PHSP/.imap/2016Down_PHSP_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/PHSP/.imap/2016Down_PHSP_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/PHSP/.imap/2016Down_PHSP_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/PHSP/.imap/2016Down_PHSP_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/PHSP/.imap/2016Down_PHSP_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/PHSP/.imap/2016Down_PHSP_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/PHSP/.imap/2016Up_PHSP_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/PHSP/.imap/2016Up_PHSP_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/PHSP/.imap/2016Up_PHSP_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/PHSP/.imap/2016Up_PHSP_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/PHSP/.imap/2016Up_PHSP_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/PHSP/.imap/2016Up_PHSP_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/PHSP/.imap/2017Down_PHSP_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/PHSP/.imap/2017Down_PHSP_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/PHSP/.imap/2017Down_PHSP_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/PHSP/.imap/2017Down_PHSP_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/PHSP/.imap/2017Down_PHSP_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/PHSP/.imap/2017Down_PHSP_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/PHSP/.imap/2017Up_PHSP_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/PHSP/.imap/2017Up_PHSP_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/PHSP/.imap/2017Up_PHSP_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/PHSP/.imap/2017Up_PHSP_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/PHSP/.imap/2017Up_PHSP_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/PHSP/.imap/2017Up_PHSP_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/PHSP/.imap/2018Down_PHSP_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/PHSP/.imap/2018Down_PHSP_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/PHSP/.imap/2018Down_PHSP_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/PHSP/.imap/2018Down_PHSP_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/PHSP/.imap/2018Down_PHSP_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/PHSP/.imap/2018Down_PHSP_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/PHSP/.imap/2018Up_PHSP_Kplus.py/dovecot.index.log b/Code/Ganga/OptionFiles/PHSP/.imap/2018Up_PHSP_Kplus.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/PHSP/.imap/2018Up_PHSP_Kplus.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/PHSP/.imap/2018Up_PHSP_Kshort.py/dovecot.index.log b/Code/Ganga/OptionFiles/PHSP/.imap/2018Up_PHSP_Kshort.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/PHSP/.imap/2018Up_PHSP_Kshort.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/PHSP/2011Down_PHSP_Kplus.py b/Code/Ganga/OptionFiles/PHSP/2011Down_PHSP_Kplus.py
new file mode 100644
index 0000000..3bcdbea
--- /dev/null
+++ b/Code/Ganga/OptionFiles/PHSP/2011Down_PHSP_Kplus.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = True
+BkgStudy = False
+data = False
+down = True
+year = "2011"
+stream = "B2XMuMu.Strip"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/PHSP/2011Down_PHSP_Kshort.py b/Code/Ganga/OptionFiles/PHSP/2011Down_PHSP_Kshort.py
new file mode 100644
index 0000000..d0e118b
--- /dev/null
+++ b/Code/Ganga/OptionFiles/PHSP/2011Down_PHSP_Kshort.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = True
+BkgStudy = False
+data = False
+down = True
+year = "2011"
+stream = "B2XMuMu.Strip"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/PHSP/2011Up_PHSP_Kplus.py b/Code/Ganga/OptionFiles/PHSP/2011Up_PHSP_Kplus.py
new file mode 100644
index 0000000..99ae694
--- /dev/null
+++ b/Code/Ganga/OptionFiles/PHSP/2011Up_PHSP_Kplus.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = True
+BkgStudy = False
+data = False
+down = False
+year = "2011"
+stream = "B2XMuMu.Strip"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/PHSP/2011Up_PHSP_Kshort.py b/Code/Ganga/OptionFiles/PHSP/2011Up_PHSP_Kshort.py
new file mode 100644
index 0000000..e8f5300
--- /dev/null
+++ b/Code/Ganga/OptionFiles/PHSP/2011Up_PHSP_Kshort.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = True
+BkgStudy = False
+data = False
+down = False
+year = "2011"
+stream = "B2XMuMu.Strip"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/PHSP/2012Down_PHSP_Kplus.py b/Code/Ganga/OptionFiles/PHSP/2012Down_PHSP_Kplus.py
new file mode 100644
index 0000000..45c85bf
--- /dev/null
+++ b/Code/Ganga/OptionFiles/PHSP/2012Down_PHSP_Kplus.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = True
+BkgStudy = False
+data = False
+down = True
+year = "2012"
+stream = "B2XMuMu.Strip"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/PHSP/2012Down_PHSP_Kshort.py b/Code/Ganga/OptionFiles/PHSP/2012Down_PHSP_Kshort.py
new file mode 100644
index 0000000..0feabcb
--- /dev/null
+++ b/Code/Ganga/OptionFiles/PHSP/2012Down_PHSP_Kshort.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = True
+BkgStudy = False
+data = False
+down = True
+year = "2012"
+stream = "B2XMuMu.Strip"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/PHSP/2012Up_PHSP_Kplus.py b/Code/Ganga/OptionFiles/PHSP/2012Up_PHSP_Kplus.py
new file mode 100644
index 0000000..90ee143
--- /dev/null
+++ b/Code/Ganga/OptionFiles/PHSP/2012Up_PHSP_Kplus.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = True
+BkgStudy = False
+data = False
+down = False
+year = "2012"
+stream = "B2XMuMu.Strip"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/PHSP/2012Up_PHSP_Kshort.py b/Code/Ganga/OptionFiles/PHSP/2012Up_PHSP_Kshort.py
new file mode 100644
index 0000000..c6f4634
--- /dev/null
+++ b/Code/Ganga/OptionFiles/PHSP/2012Up_PHSP_Kshort.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = True
+BkgStudy = False
+data = False
+down = False
+year = "2012"
+stream = "B2XMuMu.Strip"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/PHSP/2015Down_PHSP_Kplus.py b/Code/Ganga/OptionFiles/PHSP/2015Down_PHSP_Kplus.py
new file mode 100644
index 0000000..3674272
--- /dev/null
+++ b/Code/Ganga/OptionFiles/PHSP/2015Down_PHSP_Kplus.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = True
+BkgStudy = False
+data = False
+down = True
+year = "2015"
+stream = "B2XMuMu.Strip"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/PHSP/2015Down_PHSP_Kshort.py b/Code/Ganga/OptionFiles/PHSP/2015Down_PHSP_Kshort.py
new file mode 100644
index 0000000..0a4bc55
--- /dev/null
+++ b/Code/Ganga/OptionFiles/PHSP/2015Down_PHSP_Kshort.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = True
+BkgStudy = False
+data = False
+down = True
+year = "2015"
+stream = "B2XMuMu.Strip"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/PHSP/2015Up_PHSP_Kplus.py b/Code/Ganga/OptionFiles/PHSP/2015Up_PHSP_Kplus.py
new file mode 100644
index 0000000..747aaa1
--- /dev/null
+++ b/Code/Ganga/OptionFiles/PHSP/2015Up_PHSP_Kplus.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = True
+BkgStudy = False
+data = False
+down = False
+year = "2015"
+stream = "B2XMuMu.Strip"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/PHSP/2015Up_PHSP_Kshort.py b/Code/Ganga/OptionFiles/PHSP/2015Up_PHSP_Kshort.py
new file mode 100644
index 0000000..f283451
--- /dev/null
+++ b/Code/Ganga/OptionFiles/PHSP/2015Up_PHSP_Kshort.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = True
+BkgStudy = False
+data = False
+down = False
+year = "2015"
+stream = "B2XMuMu.Strip"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/PHSP/2016Down_PHSP_Kplus.py b/Code/Ganga/OptionFiles/PHSP/2016Down_PHSP_Kplus.py
new file mode 100644
index 0000000..e3d484a
--- /dev/null
+++ b/Code/Ganga/OptionFiles/PHSP/2016Down_PHSP_Kplus.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = True
+BkgStudy = False
+data = False
+down = True
+year = "2016"
+stream = "B2XMuMu.Strip"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/PHSP/2016Down_PHSP_Kshort.py b/Code/Ganga/OptionFiles/PHSP/2016Down_PHSP_Kshort.py
new file mode 100644
index 0000000..4ff4a7d
--- /dev/null
+++ b/Code/Ganga/OptionFiles/PHSP/2016Down_PHSP_Kshort.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = True
+BkgStudy = False
+data = False
+down = True
+year = "2016"
+stream = "B2XMuMu.Strip"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/PHSP/2016Up_PHSP_Kplus.py b/Code/Ganga/OptionFiles/PHSP/2016Up_PHSP_Kplus.py
new file mode 100644
index 0000000..fe615d7
--- /dev/null
+++ b/Code/Ganga/OptionFiles/PHSP/2016Up_PHSP_Kplus.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = True
+BkgStudy = False
+data = False
+down = False
+year = "2016"
+stream = "B2XMuMu.Strip"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/PHSP/2016Up_PHSP_Kshort.py b/Code/Ganga/OptionFiles/PHSP/2016Up_PHSP_Kshort.py
new file mode 100644
index 0000000..8a400af
--- /dev/null
+++ b/Code/Ganga/OptionFiles/PHSP/2016Up_PHSP_Kshort.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = True
+BkgStudy = False
+data = False
+down = False
+year = "2016"
+stream = "B2XMuMu.Strip"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/PHSP/2017Down_PHSP_Kplus.py b/Code/Ganga/OptionFiles/PHSP/2017Down_PHSP_Kplus.py
new file mode 100644
index 0000000..03c2132
--- /dev/null
+++ b/Code/Ganga/OptionFiles/PHSP/2017Down_PHSP_Kplus.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = True
+BkgStudy = False
+data = False
+down = True
+year = "2017"
+stream = "B2XMuMu.Strip"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/PHSP/2017Down_PHSP_Kshort.py b/Code/Ganga/OptionFiles/PHSP/2017Down_PHSP_Kshort.py
new file mode 100644
index 0000000..eba0b6a
--- /dev/null
+++ b/Code/Ganga/OptionFiles/PHSP/2017Down_PHSP_Kshort.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = True
+BkgStudy = False
+data = False
+down = True
+year = "2017"
+stream = "B2XMuMu.Strip"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/PHSP/2017Up_PHSP_Kplus.py b/Code/Ganga/OptionFiles/PHSP/2017Up_PHSP_Kplus.py
new file mode 100644
index 0000000..2474f22
--- /dev/null
+++ b/Code/Ganga/OptionFiles/PHSP/2017Up_PHSP_Kplus.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = True
+BkgStudy = False
+data = False
+down = False
+year = "2017"
+stream = "B2XMuMu.Strip"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/PHSP/2017Up_PHSP_Kshort.py b/Code/Ganga/OptionFiles/PHSP/2017Up_PHSP_Kshort.py
new file mode 100644
index 0000000..f145cd0
--- /dev/null
+++ b/Code/Ganga/OptionFiles/PHSP/2017Up_PHSP_Kshort.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = True
+BkgStudy = False
+data = False
+down = False
+year = "2017"
+stream = "B2XMuMu.Strip"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/PHSP/2018Down_PHSP_Kplus.py b/Code/Ganga/OptionFiles/PHSP/2018Down_PHSP_Kplus.py
new file mode 100644
index 0000000..86cd3c0
--- /dev/null
+++ b/Code/Ganga/OptionFiles/PHSP/2018Down_PHSP_Kplus.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = True
+BkgStudy = False
+data = False
+down = True
+year = "2018"
+stream = "B2XMuMu.Strip"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/PHSP/2018Down_PHSP_Kshort.py b/Code/Ganga/OptionFiles/PHSP/2018Down_PHSP_Kshort.py
new file mode 100644
index 0000000..95c1aa5
--- /dev/null
+++ b/Code/Ganga/OptionFiles/PHSP/2018Down_PHSP_Kshort.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = True
+BkgStudy = False
+data = False
+down = True
+year = "2018"
+stream = "B2XMuMu.Strip"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/PHSP/2018Up_PHSP_Kplus.py b/Code/Ganga/OptionFiles/PHSP/2018Up_PHSP_Kplus.py
new file mode 100644
index 0000000..102baee
--- /dev/null
+++ b/Code/Ganga/OptionFiles/PHSP/2018Up_PHSP_Kplus.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = True
+BkgStudy = False
+data = False
+down = False
+year = "2018"
+stream = "B2XMuMu.Strip"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = False
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/PHSP/2018Up_PHSP_Kshort.py b/Code/Ganga/OptionFiles/PHSP/2018Up_PHSP_Kshort.py
new file mode 100644
index 0000000..a258b5f
--- /dev/null
+++ b/Code/Ganga/OptionFiles/PHSP/2018Up_PHSP_Kshort.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = True
+BkgStudy = False
+data = False
+down = False
+year = "2018"
+stream = "B2XMuMu.Strip"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = False
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/ScriptForScripts.py b/Code/Ganga/OptionFiles/ScriptForScripts.py
new file mode 100644
index 0000000..d3b9899
--- /dev/null
+++ b/Code/Ganga/OptionFiles/ScriptForScripts.py
@@ -0,0 +1,85 @@
+#!/usr/bin/env python
+
+
+ReferenceList = [{'string':"KstJpsi", 'bool': True},
+ {'string':"KstMuMu", 'bool': False}]
+
+DataDict = {'name':"data",
+ 'data':True,
+ 'reference':[{'string':"", 'bool': False}],
+ 'phsp': 'False',
+ 'BkgStudy': 'False',
+ 'stream': "Leptonic",
+ 'line': "B2XMuMu_Line",
+ 'channel': [{'string':"", 'boolKshort': 'True', 'boolKplus': 'True'}]
+ }
+
+MCDict = {'name':"MC",
+ 'data':False,
+ 'reference':ReferenceList,
+ 'phsp': 'False',
+ 'BkgStudy': 'False',
+ 'stream': "AllStreams",
+ 'line': "B2XMuMu_Line",
+ 'channel': [{'string':"_Kshort", 'boolKshort': 'True', 'boolKplus': 'False'},
+ {'string':"_Kplus", 'boolKshort': 'False', 'boolKplus': 'True'}]
+ }
+
+PHSPDict = {'name':"PHSP",
+ 'data':False,
+ 'reference':[{'string':"", 'bool': False}],
+ 'phsp': 'True',
+ 'BkgStudy': 'False',
+ 'stream': "B2XMuMu.Strip",
+ 'line': "B2XMuMu_Line",
+ 'channel': [{'string':"_Kshort", 'boolKshort': 'True', 'boolKplus': 'False'},
+ {'string':"_Kplus", 'boolKshort': 'False', 'boolKplus': 'True'}]
+ }
+
+BkgDict = {'name':"MC",
+ 'data':False,
+ 'reference':[{'string':"BkgStudy", 'bool': False}],
+ 'phsp': 'False',
+ 'BkgStudy': 'True',
+ 'stream': "AllStreams",
+ 'line': "B2XMuMu_Line",
+ 'channel': [{'string':"_Kplus", 'boolKshort': 'False', 'boolKplus': 'True'}]
+ }
+
+DataTypeList = [DataDict,MCDict,PHSPDict,BkgDict]
+
+PolarityList = [{'string':"Down", 'bool': True},
+ {'string':"Up", 'bool': False}]
+
+YearList = ['2011','2012','2015','2016','2017','2018']
+
+
+
+
+for Type in DataTypeList:
+ for Year in YearList:
+ for Polarity in PolarityList:
+ for Ref in Type['reference']:
+ for Channel in Type['channel']:
+ ScriptName = "./optfiles/%s/%s/%s%s_%s%s.py" % (Type['name'],Ref['string'],Year, Polarity['string'],Type['name'],Channel['string'])
+ f1 = open(ScriptName, 'w')
+ f1.write( '############# Global settings\n' )
+ f1.write( 'runFilters = False\n' )
+ f1.write( 'reference = %s\n' % Ref['bool'] )
+ f1.write( 'phsp = %s\n' % Type['phsp'] )
+ f1.write( 'BkgStudy = %s\n' % Type['BkgStudy'] )
+ f1.write( 'data = %s\n' % Type['data'] )
+ f1.write( 'down = %s\n' % Polarity['bool'] )
+ f1.write( 'year = "%s"\n'%Year )
+ f1.write( 'stream = "%s"\n' % Type['stream'] )
+ f1.write( 'line = "%s"\n\n'% Type['line'] )
+ f1.write( '#subdecay chains\n' )
+ f1.write( 'KShortPiPlus = %s\n' % Channel['boolKshort'] )
+ f1.write( 'KplusPi0Merged = False\n') #% Channel['boolKplus'] )
+ f1.write( 'KplusPi0Resolved = %s\n\n\n'% Channel['boolKplus'] )
+
+ f = open('./optfiles/BasicOptfile.py')
+ for line in f.readlines():
+ f1.write(line)
+ f.close()
+ f1.close()
diff --git a/Code/Ganga/OptionFiles/data/.imap/2011Down_data.py/dovecot.index.log b/Code/Ganga/OptionFiles/data/.imap/2011Down_data.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/data/.imap/2011Down_data.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/data/.imap/2011Up_data.py/dovecot.index.log b/Code/Ganga/OptionFiles/data/.imap/2011Up_data.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/data/.imap/2011Up_data.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/data/.imap/2012Down_data.py/dovecot.index.log b/Code/Ganga/OptionFiles/data/.imap/2012Down_data.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/data/.imap/2012Down_data.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/data/.imap/2012Up_data.py/dovecot.index.log b/Code/Ganga/OptionFiles/data/.imap/2012Up_data.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/data/.imap/2012Up_data.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/data/.imap/2015Down_data.py/dovecot.index.log b/Code/Ganga/OptionFiles/data/.imap/2015Down_data.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/data/.imap/2015Down_data.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/data/.imap/2015Up_data.py/dovecot.index.log b/Code/Ganga/OptionFiles/data/.imap/2015Up_data.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/data/.imap/2015Up_data.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/data/.imap/2016Down_data.py/dovecot.index.log b/Code/Ganga/OptionFiles/data/.imap/2016Down_data.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/data/.imap/2016Down_data.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/data/.imap/2016Up_data.py/dovecot.index.log b/Code/Ganga/OptionFiles/data/.imap/2016Up_data.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/data/.imap/2016Up_data.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/data/.imap/2017Down_data.py/dovecot.index.log b/Code/Ganga/OptionFiles/data/.imap/2017Down_data.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/data/.imap/2017Down_data.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/data/.imap/2017Up_data.py/dovecot.index.log b/Code/Ganga/OptionFiles/data/.imap/2017Up_data.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/data/.imap/2017Up_data.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/data/.imap/2018Down_data.py/dovecot.index.log b/Code/Ganga/OptionFiles/data/.imap/2018Down_data.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/data/.imap/2018Down_data.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/data/.imap/2018Up_data.py/dovecot.index.log b/Code/Ganga/OptionFiles/data/.imap/2018Up_data.py/dovecot.index.log
new file mode 100644
index 0000000..c041f78
Binary files /dev/null and b/Code/Ganga/OptionFiles/data/.imap/2018Up_data.py/dovecot.index.log differ
diff --git a/Code/Ganga/OptionFiles/data/2011Down_data.py b/Code/Ganga/OptionFiles/data/2011Down_data.py
new file mode 100644
index 0000000..9b0479e
--- /dev/null
+++ b/Code/Ganga/OptionFiles/data/2011Down_data.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = False
+BkgStudy = False
+data = True
+down = True
+year = "2011"
+stream = "Leptonic"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/data/2011Up_data.py b/Code/Ganga/OptionFiles/data/2011Up_data.py
new file mode 100644
index 0000000..53cf5ef
--- /dev/null
+++ b/Code/Ganga/OptionFiles/data/2011Up_data.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = False
+BkgStudy = False
+data = True
+down = False
+year = "2011"
+stream = "Leptonic"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/data/2012Down_data.py b/Code/Ganga/OptionFiles/data/2012Down_data.py
new file mode 100644
index 0000000..04c5fd4
--- /dev/null
+++ b/Code/Ganga/OptionFiles/data/2012Down_data.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = False
+BkgStudy = False
+data = True
+down = True
+year = "2012"
+stream = "Leptonic"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/data/2012Up_data.py b/Code/Ganga/OptionFiles/data/2012Up_data.py
new file mode 100644
index 0000000..035fa0c
--- /dev/null
+++ b/Code/Ganga/OptionFiles/data/2012Up_data.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = False
+BkgStudy = False
+data = True
+down = False
+year = "2012"
+stream = "Leptonic"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/data/2015Down_data.py b/Code/Ganga/OptionFiles/data/2015Down_data.py
new file mode 100644
index 0000000..f4128e6
--- /dev/null
+++ b/Code/Ganga/OptionFiles/data/2015Down_data.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = False
+BkgStudy = False
+data = True
+down = True
+year = "2015"
+stream = "Leptonic"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/data/2015Up_data.py b/Code/Ganga/OptionFiles/data/2015Up_data.py
new file mode 100644
index 0000000..72cb667
--- /dev/null
+++ b/Code/Ganga/OptionFiles/data/2015Up_data.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = False
+BkgStudy = False
+data = True
+down = False
+year = "2015"
+stream = "Leptonic"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/data/2016Down_data.py b/Code/Ganga/OptionFiles/data/2016Down_data.py
new file mode 100644
index 0000000..c89493d
--- /dev/null
+++ b/Code/Ganga/OptionFiles/data/2016Down_data.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = False
+BkgStudy = False
+data = True
+down = True
+year = "2016"
+stream = "Leptonic"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/data/2016Up_data.py b/Code/Ganga/OptionFiles/data/2016Up_data.py
new file mode 100644
index 0000000..26d8f20
--- /dev/null
+++ b/Code/Ganga/OptionFiles/data/2016Up_data.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = False
+BkgStudy = False
+data = True
+down = False
+year = "2016"
+stream = "Leptonic"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/data/2017Down_data.py b/Code/Ganga/OptionFiles/data/2017Down_data.py
new file mode 100644
index 0000000..bdce9af
--- /dev/null
+++ b/Code/Ganga/OptionFiles/data/2017Down_data.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = False
+BkgStudy = False
+data = True
+down = True
+year = "2017"
+stream = "Leptonic"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/data/2017Up_data.py b/Code/Ganga/OptionFiles/data/2017Up_data.py
new file mode 100644
index 0000000..446b5ec
--- /dev/null
+++ b/Code/Ganga/OptionFiles/data/2017Up_data.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = False
+BkgStudy = False
+data = True
+down = False
+year = "2017"
+stream = "Leptonic"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/data/2018Down_data.py b/Code/Ganga/OptionFiles/data/2018Down_data.py
new file mode 100644
index 0000000..829d325
--- /dev/null
+++ b/Code/Ganga/OptionFiles/data/2018Down_data.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = False
+BkgStudy = False
+data = True
+down = True
+year = "2018"
+stream = "Leptonic"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/OptionFiles/data/2018Up_data.py b/Code/Ganga/OptionFiles/data/2018Up_data.py
new file mode 100644
index 0000000..b91b2fc
--- /dev/null
+++ b/Code/Ganga/OptionFiles/data/2018Up_data.py
@@ -0,0 +1,463 @@
+############# Global settings
+runFilters = False
+reference = False
+phsp = False
+BkgStudy = False
+data = True
+down = False
+year = "2018"
+stream = "Leptonic"
+line = "B2XMuMu_Line"
+
+#subdecay chains
+KShortPiPlus = True
+KplusPi0Merged = False
+KplusPi0Resolved = True
+
+
+from Gaudi.Configuration import *
+
+from Configurables import DaVinci
+
+from Configurables import FilterDesktop
+
+from Configurables import CombineParticles
+
+from Configurables import GaudiSequencer
+
+from Configurables import TupleToolP2VV, MCTupleToolP2VV
+
+#Run1 or Run2
+Run1 = True
+MDST = True
+if (year == "2011" or year == "2012"):
+ Run1 = True
+elif (year == "2015" or year == "2016" or year == "2017" or year == "2018"):
+ Run1 = False
+else:
+ print "[WARNING]\tWrong year input!\n"
+
+#DST or MDST? #This is a horrible piece of code but oh well
+if (BkgStudy):
+ MDST = False
+else:
+ if( not data and Run1 ):
+ MDST = False
+if (not KShortPiPlus):
+ if (year == "2015" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+ if (year == "2016" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (year == "2018" and (not data) and (not phsp) and (not reference)):
+ MDST = False
+
+if (reference and Run1 == False and not KShortPiPlus):
+ MDST = False
+
+
+if (MDST):
+ print "\n[INFO]\tUsing MDST as input.\n"
+else:
+ print "\n[INFO]\tUsing DST as input.\n"
+
+
+#MC Truthmatching fix for run 1 (obsolete)
+#if (not data and Run1):
+ # from Configurables import PhysConf
+ # PhysConf().CaloReProcessing=True
+
+#triggerlines
+if (Run1):
+ print "[INFO]\tTriggerlines for Run 1 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackAllL0Decision",
+ "Hlt1TrackAllL0TightDecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2CharmHadD2HHHHDecision",
+ "Hlt2CharmHadD2HHHHWideMassDecision",
+ "Hlt2IncPhiDecision",
+ "Hlt2ExpressDs2PhiPiDecision",
+ "Hlt2Topo2BodySimpleDecision",
+ "Hlt2Topo3BodySimpleDecision",
+ "Hlt2Topo2BodyBBDTDecision",
+ "Hlt2Topo3BodyBBDTDecision",
+ "Hlt2TopoMu2BodyBBDTDecision",
+ "Hlt2TopoMu3BodyBBDTDecision",
+ "Hlt2TopoE2BodyBBDTDecision",
+ "Hlt2TopoE3BodyBBDTDecision",
+ "Hlt2RadiativeTopoTrackTOSDecision",
+ "Hlt2RadiativeTopoPhotonL0Decision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+else:
+ print "[INFO]\tTriggerlines for Run 2 added!\n"
+ triggerlines = [
+
+ #l0
+ "L0HadronDecision",
+ "L0MuonDecision",
+ "L0DiMuonDecision",
+ #"L0GlobalDecision",
+
+ #hlt1
+ "Hlt1TrackMuonDecision",
+ "Hlt1DiMuonHighMassDecision",
+ "Hlt1DiMuonLowMassDecision",
+ "Hlt1TrackMVADecision",
+ "Hlt1TwoTrackMVADecision",
+ "Hlt1L0AnyDecision",
+ "Hlt1MBNoBiasDecision",
+ "Hlt1GlobalDecision",
+
+ #hlt2
+ "Hlt2Topo2BodyDecision",
+ "Hlt2Topo3BodyDecision",
+ "Hlt2TopoMu2BodyDecision",
+ "Hlt2TopoMu3BodyDecision",
+ "Hlt2TopoMuMu2BodyDecision",
+ "Hlt2TopoMuMu3BodyDecision",
+ "Hlt2SingleMuonDecision",
+ "Hlt2SingleMuonHighPTDecision",
+ "Hlt2SingleMuonLowPTDecision",
+ "Hlt2DiMuonDetachedDecision",
+ "Hlt2DiMuonDetachedHeavyDecision"]
+
+############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
+#from Configurables import LoKi__HDRFilter as StripFilter
+#stripFilter = StripFilter( "stripPassFilter",\
+# Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
+# Location= "/Event/Strip/Phys/DecReports")
+
+############# DecayTreeTuple
+from DecayTreeTuple.Configuration import *
+from Configurables import TupleToolTISTOS
+from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
+from Configurables import PrintDecayTree, PrintDecayTreeTool
+
+############# MCDecayTreeTuple
+from Configurables import MCDecayTreeTuple
+from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
+ #Fix Truthmatching
+from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
+
+##subpid stuff
+#from Configurables import SubPIDMMFilter
+from Configurables import SubstitutePID ,BTaggingTool
+from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
+from Configurables import LoKi__Hybrid__TupleTool
+
+
+##########################################
+###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
+##########################################
+ ### AND/OR ###
+##########################################################
+###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
+##########################################################
+
+#This is probably a very stupid idea but python should be okay with it
+b2KstmumuTupleList= []
+
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
+b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if (MDST):
+ b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
+ b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
+ else:
+ b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
+
+#decay descriptor
+b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[0].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
+b2KstmumuTupleList[1].addBranches({
+ "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
+ "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
+ "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
+ "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
+ "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
+ })
+
+
+#add tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ b2KstmumuTuple.ToolList = ["TupleToolKinematic",
+ "TupleToolPrimaries",
+ "TupleToolEventInfo",
+ "TupleToolTrackInfo",
+ "TupleToolRecoStats",
+ "TupleToolAngles",
+ "TupleToolPid",
+ "TupleToolPhotonInfo"]
+
+ #add MCtools
+ if not (data):
+ b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
+ b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
+ b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
+ "TupleToolMCBackgroundInfo"]
+ #Adding Angle Calculator
+ b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
+ b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
+ b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
+ b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
+
+
+#add tools to branches
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
+
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
+ b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
+ if (year != "2018" and year !="2015"): b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
+
+
+for b2KstmumuTuple in b2KstmumuTupleList:
+
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.B_plus.Geo.Verbose = True
+ b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
+
+ #Adding Angle Calculator
+ TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
+ TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
+ b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
+ b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
+
+ b2KstmumuTuple.K_star_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.K_star_plus.Geo.Verbose = True
+ b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.J_psi.Geo.Verbose = True
+ b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_minus.Geo.Verbose = True
+ b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTuple.mu_plus.Geo.Verbose = True
+
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].K_short.Geo.Verbose = True
+ b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
+
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
+ b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
+
+### DST isolation info tools ###
+for b2KstmumuTuple in b2KstmumuTupleList:
+ if not(MDST):
+ b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
+ b2KstmumuTuple.TrackIso.Verbose = True
+ b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
+
+ b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
+
+ #decay tree fitter (DTF)
+ b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
+ b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
+ b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
+ b2KstmumuTuple.B_plus.DTF.Verbose = True
+
+#Add mass constraints
+if (KShortPiPlus):
+ b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
+if (KplusPi0Resolved):
+ b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
+
+#LoKi tools
+for b2KstmumuTuple in b2KstmumuTupleList:
+ LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
+ LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
+ "PHI" : "PHI" ,
+ "DOCA1" : "DOCA(1,2)" ,
+ "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEANGLE', -1.)",
+ "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEMULT', -1.)",
+ 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPTASYM', -1.)",
+ 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPT', -1.)",
+ 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEP', -1.)",
+ 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEPASYM', -1.)",
+ 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAETA', -1.)",
+ 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/ConeIsoInfo', 'CONEDELTAPHI', -1.)",
+ 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISONUMVTX', -1.)",
+ 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2ONETRACK', -1.)",
+ 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSONETRACK', -1.)",
+ 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2TWOTRACK', -1.)",
+ 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/VtxIsoInfo', 'VTXISODCHI2MASSTWOTRACK', -1.)"
+ };
+
+ #trigger config
+ b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
+ b2KstmumuTT.TriggerList = triggerlines
+ b2KstmumuTT.FillL0 = True
+ b2KstmumuTT.FillHlt1 = True
+ b2KstmumuTT.FillHlt2 = True
+ b2KstmumuTT.Verbose = True
+ b2KstmumuTT.VerboseL0 = True
+ b2KstmumuTT.VerboseHlt1 = True
+ b2KstmumuTT.VerboseHlt2 = True
+
+###########################
+## Main sequence
+###########################
+
+b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
+if (KShortPiPlus):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
+if (KplusPi0Resolved):
+ b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
+b2KstmumuSeq.ModeOR = True
+b2KstmumuSeq.ShortCircuit = False
+
+
+###########################
+## DaVinci configurations
+###########################
+
+dv = DaVinci()
+
+#dv.EventPreFilters = [stripFilter]
+dv.UserAlgorithms += [b2KstmumuSeq]
+
+if(MDST):
+ dv.InputType = "MDST"
+else:
+ dv.InputType = "DST"
+
+
+dv.RootInTES = "/Event/{0}".format(stream)
+dv.DataType = year
+dv.Simulation = not data
+dv.Lumi = True
+#dv.VerboseMessages = True
+
+dv.EvtMax = -1 #10000 #100000 #100000
+dv.PrintFreq = 1000
+dv.TupleFile = "b2Kstmumu.root"
+
+#This should have been a dictionary, big time, but oh well :)
+#tags from http://lhcb-release-area.web.cern.ch/LHCb-release-area/DOC/dbase/conddb/release_notes.html
+
+DBtags_data = {
+ "2011": ["cond-20150409-1", "dddb-20150928"],
+ "2012": ["cond-20150409-1", "dddb-20150928"],
+ "2015": ["cond-20150828", "dddb-20150724"],
+ "2016": ["cond-20161004", "dddb-20150724"],
+ "2017": ["cond-20170724", "dddb-20170721-3"],
+ "2018": ["cond-20180202", "dddb-20171030-3"]
+}
+
+DBtags_Kplus_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3" ],
+ "2016": ["20170721-2", "20170721-3" ],
+ "2017": ["20180411", "20170721-3" ],
+ "2018": ["20190430", "20170721-3" ]
+}
+
+DBtags_Kplus_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kplus_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+DBtags_Kshort_sigMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["20161124", "20150724" ],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_refMC = {
+ "2011": ["20160614-1", "20160318-1"],
+ "2012": ["20160321-2", "20150928" ],
+ "2015": ["", ""],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["", ""],
+ "2018": ["", ""]
+}
+
+DBtags_Kshort_PHSP = {
+ "2011": ["20160614-1", "20170721-1"],
+ "2012": ["20160321-2", "20170721-2"],
+ "2015": ["20161124", "20170721-3"],
+ "2016": ["20170721-2", "20170721-3"],
+ "2017": ["20180411", "20170721-3"],
+ "2018": ["20190128", "20170721-3"]
+}
+
+polarity_tag = "-vc-md100" if(down) else "-vc-mu100"
+
+used_dict = {}
+if (data):
+ dv.CondDBtag = DBtags_data[year][0]
+ dv.DDDBtag = DBtags_data[year][1]
+else:
+ if (KplusPi0Resolved):
+ if (reference): used_dict = DBtags_Kplus_refMC
+ elif (phsp): used_dict = DBtags_Kplus_PHSP
+ else: used_dict = DBtags_Kplus_sigMC
+ if (KShortPiPlus):
+ if (reference): used_dict = DBtags_Kshort_refMC
+ elif (phsp): used_dict = DBtags_Kshort_PHSP
+ else: used_dict = DBtags_Kshort_sigMC
+
+ dv.CondDBtag = "sim-"+used_dict[year][0]+polarity_tag
+ dv.DDDBtag = "dddb-"+used_dict[year][1]
+
+
diff --git a/Code/Ganga/RunningGanga/B2KstMuMu_submitGanga_MC.py b/Code/Ganga/RunningGanga/B2KstMuMu_submitGanga_MC.py
new file mode 100644
index 0000000..eef5568
--- /dev/null
+++ b/Code/Ganga/RunningGanga/B2KstMuMu_submitGanga_MC.py
@@ -0,0 +1,102 @@
+ #setting up DaVinci directory
+DV = GaudiExec()
+#DV.directory = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v38r1p3/'
+
+for decay in ["Kplus"]:#,"Kplus"]:#,"Kshort"]:
+ for polarity in ["Up"]:
+ decay_number = 0
+ sim_version = "Sim09a"
+ dst = "DST"
+ platform = "x86_64-slc6-gcc62-opt"
+ if (decay=="Kplus"): decay_number = 12113100
+ if (decay=="Kshort"): decay_number = 12115102
+ for yr in ["2016"]:
+ E = 0
+ nu = ""
+ trigger = ""
+ stripping = ""
+ reco = ""
+ if (yr=="2011"):
+ E = 3500
+ nu = "2"
+ trigger = "0x40760037"
+ stripping = "21r1"
+ reco = "Reco14c"
+ sim_version = "Sim09a"
+ DV.directory = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v38r1p3/'
+ DV.platform = "x86_64-slc6-gcc49-opt"
+ elif (yr=="2012"):
+ E = 4000
+ nu = "2.5"
+ trigger = "0x409f0045"
+ stripping = "21"
+ reco = "Reco14c"
+ sim_version = "Sim09a"
+ DV.directory = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v38r1p3/'
+ DV.platform = "x86_64-slc6-gcc49-opt"
+ elif (yr=="2015"):
+ E = 6500
+ nu = "1.6-25ns"
+ trigger = "0x411400a2"
+ stripping = "24"
+ reco = "Reco15a/Turbo02"
+ sim_version = "Sim09i"
+ dst = "DST"
+ DV.directory = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v44r3/'
+ DV.platform = "x86_64-centos7-gcc62-opt
+ elif (yr=="2016"):
+ E = 6500
+ nu = "1.6-25ns"
+ trigger = "0x6139160F"
+ stripping = "28r2"
+ reco = "Reco16/Turbo03a"
+ sim_version = "Sim09i"
+ dst = "DST"
+ DV.directory = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v44r3/'
+ DV.platform = "x86_64-centos7-gcc62-opt"
+ elif (yr=="2017"):
+ E = 6500
+ nu = "1.6-25ns"
+ trigger = "0x62661709"
+ stripping = "29r2"
+ reco = "Reco17/Turbo04a-WithTurcal"
+ sim_version = "Sim09e"
+ dst = "MDST"
+ DV.directory = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v44r3/'
+ DV.platform = "x86_64-centos7-gcc62-opt"
+ elif (yr=="2018"):
+ E = 6500
+ nu = "1.6-25ns"
+ trigger = "0x617d18a4"
+ if (decay=="Kplus"):stripping = "34r0p1"
+ else: stripping = "34"
+ reco = "Reco18/Turbo05-WithTurcal"
+ if (decay=="Kplus"):sim_version = "Sim09h"
+ else: sim_version = "Sim09f"
+ dst = "DST"
+ DV.directory = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v44r3/'
+ DV.platform = "x86_64-centos7-gcc62-opt"
+
+ script_opts = {"YEAR":yr,"POL":polarity,"DATA_TYPE":"MC","ENERGY":E,"NU":nu,"TRIG":trigger,"STRIP":stripping,"CHAN":decay, "NUM":decay_number, "RECO":reco, "SIM": sim_version, "DST":dst}
+ script_1 ='/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v41r2/tuplecreation/optfiles/%(DATA_TYPE)s/KstMuMu/%(YEAR)s%(POL)s_%(DATA_TYPE)s_%(CHAN)s.py'% script_opts
+ # script_basic = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v41r2/tuplecreation/optfiles/BasicOptfile.py'
+ optsfile = [script_1]
+ PATH = "/MC/%(YEAR)s/Beam%(ENERGY)sGeV-%(YEAR)s-Mag%(POL)s-Nu%(NU)s-Pythia8/%(SIM)s/Trig%(TRIG)s/%(RECO)s/Stripping%(STRIP)sNoPrescalingFlagged/%(NUM)s/ALLSTREAMS.%(DST)s" % script_opts
+ print ('Using data: ', PATH)
+
+ DV.options = optsfile
+ #DV.prepare()
+ j = Job(
+ name = 'MC%(YEAR)s%(POL)s%(CHAN)s' % script_opts,
+ application = DV,
+ #splitter = SplitByFiles(filesPerJob = 100),
+ #Needed to ignore missing files for pi0 2011 down, one dst is missing
+ splitter = SplitByFiles(filesPerJob = 100,ignoremissing = False),
+ inputdata = BKQuery(path=PATH).getDataset(),
+ outputfiles = [DiracFile(namePattern='*.root')],
+ do_auto_resubmit = True,
+ backend = Dirac()
+ )
+ #queues.add(j.submit) #Slightly faster submitting
+ j.submit()
+
diff --git a/Code/Ganga/RunningGanga/B2KstMuMu_submitGanga_MC_bkg.py b/Code/Ganga/RunningGanga/B2KstMuMu_submitGanga_MC_bkg.py
new file mode 100644
index 0000000..a0be312
--- /dev/null
+++ b/Code/Ganga/RunningGanga/B2KstMuMu_submitGanga_MC_bkg.py
@@ -0,0 +1,248 @@
+ #setting up DaVinci directory
+DV = GaudiExec()
+#DV.directory = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v38r1p3/'
+#DONT FORGET THE BUILD PATH!
+
+channel_list = ['Kplus'
+ 'Kshort'
+ ]
+
+decay_list = [ #'BtoKstMuMu',
+ 'BtoKstJpsi'
+ #'PHSP',
+# 'BtoXJpsi',
+# 'B0toKstMuMu',
+ #'B0toKstJpsi',
+# 'BtoK1MuMu',
+# 'BtoK1Jpsi'
+ ]
+
+polarity_list = [
+ 'MagDown',
+ 'MagUp']
+
+decay_no_dict = {
+ 'BtoKstMuMu' : {'Kplus': 12113100,
+ 'Kshort': 12115102},
+ 'BtoKstJpsi' : {'Kplus': 12143401,
+ 'Kshort': 12145102},
+ 'PHSP' : {'Kplus': 12113445,
+ 'Kshort': 12115178},
+ 'BtoXJpsi' : {'Kplus': 12442001,
+ 'Kshort': 12442001},
+ 'B0toKstMuMu': {'Kplus': 11114001,
+ 'Kshort': 11114001},
+ 'B0toKstJpsi': {'Kplus': 11144001,
+ 'Kshort': 11144001},
+ 'BtoK1MuMu' : {'Kplus': 12435001,
+ 'Kshort': 12435001},
+ 'BtoK1Jpsi' : {'Kplus': 12145101,
+ 'Kshort': 12145101}
+ }
+
+decay_year_dict = { 'BtoKstMuMu' : ['2011','2012','2015','2016'],
+ #'BtoKstJpsi' : ['2011','2012'],
+ 'BtoKstJpsi' : ['2012'], #In the case of the second trigger settings
+ 'PHSP' : ['2011','2012','2015','2016'],
+ 'BtoXJpsi' : ['2011','2012','2016'],
+ 'B0toKstMuMu': ['2011','2012','2015','2016'],
+# 'B0toKstJpsi': ['2011','2012','2015','2016'],
+ 'B0toKstJpsi': ['2015','2016'],
+ 'BtoK1MuMu' : ['2011','2012'],
+ 'BtoK1Jpsi' : ['2012']
+ }
+
+year_E_dict = { '2011': '3500GeV',
+ '2012': '4000GeV',
+ '2015': '6500GeV',
+ '2016': '6500GeV'
+ }
+
+year_nu_dict = { '2011': '2',
+ '2012': '2.5',
+ '2015': '1.6-25ns',
+ '2016': '1.6-25ns'
+ }
+
+year_trigg_dict = { '2011': 'Trig0x40760037',
+ #'2012': 'Trig0x409f0045', TODO! two different trigger settings! for BtoKstJpsi
+ '2012': 'Trig0x4097003d'
+ '2015': 'Trig0x411400a2',
+ '2016': 'Trig0x6138160F'
+ }
+
+decay_simVer_dict = { 'BtoKstMuMu' : {'2011': 'Sim09b',
+ '2012': 'Sim09a',
+ '2015': 'Sim09b',
+ '2016': 'Sim09c',
+ },
+ 'BtoKstJpsi' : {'2011': 'Sim09a',
+ #'2012': 'Sim09a' Change according to the trigger settings!
+ '2012': 'Sim09c'
+ },
+ 'PHSP' : {'2011': 'Sim09b',
+ '2012': 'Sim09b',
+ '2015': 'Sim09b',
+ '2016': 'Sim09c'
+ },
+ 'BtoXJpsi' : {'2011': 'Sim08c/Digi13',
+ '2012': 'Sim08a/Digi13',
+ '2016': 'Sim09b'
+ },
+ 'B0toKstMuMu': {'2011': 'Sim08e/Digi13',
+ '2012': 'Sim08b/Digi13',
+ '2015': 'Sim09c',
+ '2016': 'Sim09b'
+ },
+ 'B0toKstJpsi': {'2011': 'Sim08f/Digi13',
+ '2012': 'Sim08f/Digi13',
+ '2015': 'Sim09c',
+ '2016': 'Sim09c'
+ },
+ 'BtoK1MuMu' : {'2011': 'Sim08e/Digi13',
+ '2012': 'Sim08e/Digi13',
+ },
+ 'BtoK1Jpsi' : {'2012': 'Sim08a/Digi13'
+ }
+ }
+
+decay_strip_dict = { 'BtoKstMuMu' : {'2011': 'Reco14c/Stripping21r1NoPrescalingFlagged',
+ '2012': 'Reco14c/Stripping21NoPrescalingFlagged',
+ '2015': 'Reco15a/Turbo02/Stripping24NoPrescalingFlagged',
+ '2016': 'Reco16/Turbo03/Stripping28NoPrescalingFlagged',
+ },
+ 'BtoKstJpsi' : {'2011': 'Reco14c/Stripping21r1NoPrescalingFlagged',
+ '2012': 'Reco14c/Stripping21NoPrescalingFlagged',
+ },
+ 'PHSP' : {'2011': 'Reco14c/Stripping21r1Filtered',
+ '2012': 'Reco14c/Stripping21Filtered',
+ '2015': 'Reco15a/Turbo02/Stripping24Filtered',
+ '2016': 'Reco16/Turbo03/Stripping28Filtered'
+ },
+ 'BtoXJpsi' : {'2011': 'Reco14a/Stripping20r1NoPrescalingFlagged',
+ '2012': 'Reco14a/Stripping20NoPrescalingFlagged',
+ '2016': 'Reco16/Turbo03/Stripping26NoPrescalingFlagged'
+ },
+ 'B0toKstMuMu': {'2011': 'Reco14a/Stripping20r1NoPrescalingFlagged',
+ '2012': 'Reco14a/Stripping20NoPrescalingFlagged',
+ '2015': 'Reco15a/Turbo02/Stripping24r1NoPrescalingFlagged',
+ '2016': 'Reco16/Turbo03/Stripping26NoPrescalingFlagged'
+ },
+ 'B0toKstJpsi': {'2011': 'Reco14a/Stripping20r1NoPrescalingFlagged',
+ '2012': 'Reco14a/Stripping20NoPrescalingFlagged',
+ '2015': 'Reco15a/Turbo02/Stripping24r1NoPrescalingFlagged',
+ '2016': 'Reco16/Turbo03/Stripping28r1NoPrescalingFlagged'
+ },
+ 'BtoK1MuMu' : {'2011': 'Reco14a/Stripping20r1NoPrescalingFlagged',
+ '2012': 'Reco14a/Stripping20NoPrescalingFlagged',
+ },
+ 'BtoK1Jpsi' : {'2012': 'Reco14a/Stripping20NoPrescalingFlagged'
+ }
+ }
+
+decay_file_dict = { 'BtoKstMuMu' : {'2011': 'ALLSTREAMS.DST',
+ '2012': 'ALLSTREAMS.DST',
+ '2015': 'ALLSTREAMS.MDST',
+ '2016': 'ALLSTREAMS.MDST',
+ },
+ 'BtoKstJpsi' : {'2011': 'ALLSTREAMS.DST',
+ '2012': 'ALLSTREAMS.DST'
+ },
+ 'PHSP' : {'2011': 'B2XMUMU.STRIP.DST',
+ '2012': 'B2XMUMU.STRIP.DST',
+ '2015': 'B2XMUMU.STRIP.MDST',
+ '2016': 'B2XMUMU.STRIP.MDST'
+ },
+ 'BtoXJpsi' : {'2011': 'ALLSTREAMS.DST',
+ '2012': 'ALLSTREAMS.DST',
+ '2016': 'ALLSTREAMS.DST'
+ },
+ 'B0toKstMuMu': {'2011': 'ALLSTREAMS.DST',
+ '2012': 'ALLSTREAMS.DST',
+ '2015': 'ALLSTREAMS.DST',
+ '2016': 'ALLSTREAMS.DST'
+ },
+ 'B0toKstJpsi': {'2011': 'ALLSTREAMS.DST',
+ '2012': 'ALLSTREAMS.DST',
+ '2015': 'ALLSTREAMS.MDST',
+ '2016': 'ALLSTREAMS.MDST'
+ },
+ 'BtoK1MuMu' : {'2011': 'ALLSTREAMS.DST',
+ '2012': 'ALLSTREAMS.DST',
+ },
+ 'BtoK1Jpsi' : {'2012': 'ALLSTREAMS.DST'
+ }
+ }
+
+decay_DV_dict = { 'BtoKstMuMu' : {'2011': 'DaVinciDev_v38r1p3',
+ '2012': 'DaVinciDev_v38r1p3',
+ '2015': 'DaVinciDev_v41r2',
+ '2016': 'DaVinciDev_v41r2',
+ },
+ 'BtoKstJpsi' : {'2011': 'DaVinciDev_v38r1p3',
+ '2012': 'DaVinciDev_v38r1p3'
+ },
+ 'PHSP' : {'2011': 'DaVinciDev_v38r1p3',
+ '2012': 'DaVinciDev_v38r1p3',
+ '2015': 'DaVinciDev_v41r2',
+ '2016': 'DaVinciDev_v41r2'
+ },
+ 'BtoXJpsi' : {'2011': 'DaVinciDev_v38r1p3',
+ '2012': 'DaVinciDev_v38r1p3',
+ '2016': 'DaVinciDev_v41r2'
+ },
+ 'B0toKstMuMu': {'2011': 'DaVinciDev_v38r1p3',
+ '2012': 'DaVinciDev_v38r1p3',
+ '2015': 'DaVinciDev_v41r2',
+ '2016': 'DaVinciDev_v41r2'
+ },
+ 'B0toKstJpsi': {'2011': 'DaVinciDev_v38r1p3',
+ '2012': 'DaVinciDev_v38r1p3',
+ '2015': 'DaVinciDev_v41r2',
+ '2016': 'DaVinciDev_v41r2'
+ },
+ 'BtoK1MuMu' : {'2011': 'DaVinciDev_v38r1p3',
+ '2012': 'DaVinciDev_v38r1p3',
+ },
+ 'BtoK1Jpsi' : {'2012': 'DaVinciDev_v38r1p3'
+ }
+ }
+
+for channel in channel_list:
+ for decay in decay_list:
+ for year in decay_year_dict[decay]:
+ for polarity in polarity_list:
+ script_opts = { "DATA_TYPE":"MC",
+ "CHAN": channel,
+ "YEAR":year,
+ "POL":polarity,
+ "ENERGY":year_E_dict[year],
+ "NU":year_nu_dict[year],
+ "SIM": decay_simVer_dict[decay][year],
+ "TRIG":year_trigg_dict[year],
+ "STRIP":decay_strip_dict[decay][year],
+ "NUM":decay_no_dict[decay][channel],
+ "FILE":decay_file_dict[decay][year],
+ "DEC":decay,
+ "DV": decay_DV_dict[decay][year]
+ }
+ PATH = "/%(DATA_TYPE)s/%(YEAR)s/Beam%(ENERGY)s-%(YEAR)s-%(POL)s-Nu%(NU)s-Pythia8/%(SIM)s/%(TRIG)s/%(STRIP)s/%(NUM)s/%(FILE)s" % script_opts
+ print PATH
+ print '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/%(DV)s/' % script_opts
+ DV.directory = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/%(DV)s/' % script_opts
+
+ opt_path ='/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v41r2/tuplecreation/background_tests/optfiles/%(DEC)s/%(YEAR)s%(POL)s_%(CHAN)s.py'% script_opts
+ # script_basic = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v41r2/tuplecreation/optfiles/BasicOptfile.py'
+ optsfile = [opt_path]
+ DV.options = optsfile
+
+ j = Job(
+ name = 'MC%(DEC)s%(CHAN)s%(YEAR)s%(POL)s' % script_opts,
+ application = DV,
+ splitter = SplitByFiles(filesPerJob = 25,ignoremissing = False),
+ inputdata = BKQuery(path=PATH).getDataset(),
+ outputfiles = [DiracFile(namePattern='*.root')],
+ do_auto_resubmit = True,
+ backend = Dirac()
+ )
+ j.submit()
diff --git a/Code/Ganga/RunningGanga/B2KstMuMu_submitGanga_MCref.py b/Code/Ganga/RunningGanga/B2KstMuMu_submitGanga_MCref.py
new file mode 100644
index 0000000..c353012
--- /dev/null
+++ b/Code/Ganga/RunningGanga/B2KstMuMu_submitGanga_MCref.py
@@ -0,0 +1,74 @@
+ #setting up DaVinci directory
+DV = GaudiExec()
+
+
+for decay in ["Kplus"]:
+ decay_number = 0
+ sim_version = "Sim09a"
+ dst = "DST"
+ if (decay=="Kplus"): decay_number = 12143401
+ if (decay=="Kshort"): decay_number = 12145102
+ for polarity in ["Down","Up"]:
+ for yr in ["2015","2016"]:
+ E = 0
+ nu = ""
+ trigger = ""
+ stripping = ""
+ reco = ""
+ if (yr=="2011"):
+ E = 3500
+ nu = "2"
+ trigger = "0x40760037"
+ stripping = "21r1"
+ reco = "Reco14c"
+ DV.directory = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v38r1p3/'
+ elif (yr=="2012"):
+ E = 4000
+ nu = "2.5"
+ trigger = "0x409f0045"
+ stripping = "21"
+ reco = "Reco14c"
+ DV.directory = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v38r1p3/'
+ elif (yr=="2015"): #OnlyKplus
+ E = 6500
+ nu = "1.6-25ns"
+ trigger = "0x411400a2"
+ stripping = "24r1"
+ reco = "Reco15a/Turbo02"
+ sim_version = "Sim09e"
+ dst = "DST"
+ DV.directory = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v44r3/'
+ DV.platform = "x86_64-centos7-gcc62-opt"
+ elif (yr=="2016"): #OnlyKplus
+ E = 6500
+ nu = "1.6-25ns"
+ trigger = "0x6139160F"
+ stripping = "28r1"
+ reco = "Reco16/Turbo03"
+ sim_version = "Sim09e"
+ dst = "DST"
+ DV.directory = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v44r3/'
+ DV.platform = "x86_64-centos7-gcc62-opt"
+
+ script_opts = {"YEAR":yr,"POL":polarity,"DATA_TYPE":"MC","ENERGY":E,"NU":nu,"TRIG":trigger,"STRIP":stripping,"CHAN":decay, "NUM":decay_number, "RECO":reco, "SIM": sim_version, "DST":dst}
+ script_1 ='/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v41r2/tuplecreation/optfiles/%(DATA_TYPE)s/KstJpsi/%(YEAR)s%(POL)s_%(DATA_TYPE)s_%(CHAN)s.py'% script_opts
+ print ('Using optsfile: ',script_1)
+ # script_basic = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v41r2/tuplecreation/optfiles/BasicOptfile.py'
+ optsfile = [script_1]
+ PATH = "/MC/%(YEAR)s/Beam%(ENERGY)sGeV-%(YEAR)s-Mag%(POL)s-Nu%(NU)s-Pythia8/%(SIM)s/Trig%(TRIG)s/%(RECO)s/Stripping%(STRIP)sNoPrescalingFlagged/%(NUM)s/ALLSTREAMS.%(DST)s" % script_opts
+ print ('Using data: ', PATH)
+
+
+ DV.options = optsfile
+
+ j = Job(
+ name ='RefMC%(YEAR)s%(POL)s%(CHAN)s' % script_opts,
+ application = DV,
+ splitter = SplitByFiles(filesPerJob = 100),
+ inputdata = BKQuery(path=PATH).getDataset(),
+ outputfiles = [DiracFile(namePattern='*.root')],
+ do_auto_resubmit = True,
+ backend = Dirac()
+ )
+ j.submit()
+
diff --git a/Code/Ganga/RunningGanga/B2KstMuMu_submitGanga_PHSP.py b/Code/Ganga/RunningGanga/B2KstMuMu_submitGanga_PHSP.py
new file mode 100644
index 0000000..bc4baa7
--- /dev/null
+++ b/Code/Ganga/RunningGanga/B2KstMuMu_submitGanga_PHSP.py
@@ -0,0 +1,115 @@
+ #setting up DaVinci directory
+DV = GaudiExec()
+
+
+for decay in ["Kplus"]:
+ for polarity in ["Down","Up"]:
+ decay_number = 0
+ sim_version = "Sim09h"
+ dst = "DST"
+ merge = "Merge14/"
+ if (decay=="Kplus"): decay_number = 12113446 #12113445
+ if (decay=="Kshort"): decay_number = 12115179 #12115178
+ if (decay=="Kplus"): year_list = ["2015"]#"2016","2017","2018"]#["2011"]
+ if (decay=="Kshort"): year_list = ["2015"]#"2016","2017","2018"]# ["2012","2012spec","2011"]
+ for yr in year_list:
+ pythia_ver = 8
+ E = 0
+ nu = ""
+ trigger = ""
+ stripping = ""
+ reco = ""
+ if (yr=="2011"):
+ E = 3500
+ nu = "2"
+ trigger = "0x40760037"
+ stripping = "21r1p1"
+ reco = "Reco14c"
+ sim_version = "Sim09f"
+ DV.directory = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v38r1p3/'
+ DV.platform = "x86_64-slc6-gcc49-opt"
+ elif (yr=="2012"):
+ E = 4000
+ nu = "2.5"
+ trigger = "0x409f0045"
+ stripping = "21r0p1"
+ reco = "Reco14c"
+ sim_version = "Sim09f"
+ DV.directory = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v38r1p3/'
+ DV.platform = "x86_64-slc6-gcc49-opt"
+ elif (yr=="2012spec"):
+ yr = "2012"
+ E = 4000
+ nu = "2.5"
+ trigger = "0x4097003d" #Only for Kshort!
+ stripping = "21r0p1"
+ reco = "Reco14c"
+ sim_version = "Sim09f"
+ DV.directory = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v38r1p3/'
+ DV.platform = "x86_64-slc6-gcc49-opt"
+ elif (yr=="2015"):
+ E = 6500
+ nu = "1.6-25ns"
+ trigger = "0x411400a2"
+ stripping = "24r1"
+ reco = "Reco15a/Turbo02"
+ sim_version = "Sim09h"
+ dst = "MDST"
+ pythia_ver = 6
+ merge = ""
+ DV.directory = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v44r3/'
+ DV.platform = "x86_64-centos7-gcc62-opt"
+ elif (yr=="2016"):
+ E = 6500
+ nu = "1.6-25ns"
+ trigger = "0x6139160F"
+ stripping = "28r1"
+ reco = "Reco16/Turbo03"
+ sim_version = "Sim09f"
+ dst = "MDST"
+ DV.directory = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v44r3/'
+ DV.platform = "x86_64-centos7-gcc62-opt"
+ elif (yr=="2017"):
+ E = 6500
+ nu = "1.6-25ns"
+ trigger = "0x62661709"
+ stripping = "29r2"
+ reco = "Reco17/Turbo04a-WithTurcal"
+ sim_version = "Sim09f"
+ dst = "MDST"
+ DV.directory = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v44r3/'
+ DV.platform = "x86_64-centos7-gcc62-opt"
+ elif (yr=="2018"):
+ E = 6500
+ nu = "1.6-25ns"
+ trigger = "0x617d18a4"
+ stripping = "34"
+ reco = "Reco18/Turbo05-WithTurcal"
+ sim_version = "Sim09f"
+ dst = "MDST"
+ DV.directory = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v44r3/'
+ DV.platform = "x86_64-centos7-gcc62-opt"
+
+ script_opts = {"YEAR":yr,"POL":polarity,"DATA_TYPE":"PHSP","ENERGY":E,"PYTHIA":pythia_ver,"NU":nu,"TRIG":trigger,"STRIP":stripping,"CHAN":decay, "NUM":decay_number, "RECO":reco, "SIM": sim_version, "DST":dst, "MERGE": merge }
+ script_1 ='/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v41r2/tuplecreation/optfiles/%(DATA_TYPE)s/%(YEAR)s%(POL)s_%(DATA_TYPE)s_%(CHAN)s.py'% script_opts
+ # script_basic = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v41r2/tuplecreation/optfiles/BasicOptfile.py'
+ optsfile = [script_1]
+ print ('Using optsfile: ',script_1)
+
+ PATH = "/MC/%(YEAR)s/Beam%(ENERGY)sGeV-%(YEAR)s-Mag%(POL)s-Nu%(NU)s-Pythia%(PYTHIA)s/%(SIM)s/Trig%(TRIG)s/%(RECO)s/Stripping%(STRIP)sFiltered/%(MERGE)s%(NUM)s/B2XMUMU.STRIP.%(DST)s" % script_opts
+ print ('Using data: ', PATH)
+
+ DV.options = optsfile
+
+ j = Job(
+ name = 'PHSP%(YEAR)s%(POL)s%(CHAN)s' % script_opts,
+ application = DV,
+ splitter = SplitByFiles(filesPerJob = 100,ignoremissing = True),
+ inputdata = BKQuery(path=PATH).getDataset(),
+ outputfiles = [DiracFile(namePattern='*.root')],
+ do_auto_resubmit = True,
+ backend = Dirac()
+ )
+ j.backend.settings['BannedSites'] = ['LCG.RAL.uk']
+ j.submit()
+
diff --git a/Code/Ganga/RunningGanga/B2KstMuMu_submitGanga_data.py b/Code/Ganga/RunningGanga/B2KstMuMu_submitGanga_data.py
new file mode 100644
index 0000000..da6d24e
--- /dev/null
+++ b/Code/Ganga/RunningGanga/B2KstMuMu_submitGanga_data.py
@@ -0,0 +1,68 @@
+
+#setting up DaVinci directory
+DV = GaudiExec()
+
+for polarity in ["Down","Up"]:
+ for yr in ["15","16"]:
+ E = 0
+ nu = 0
+ trigger = 0
+ if (yr=="11"):
+ E = 3500
+ nu = 2
+ reco="14"
+ stripping = "21r1p2"
+ DV.directory = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v38r1p3/'
+ elif (yr=="12"):
+ E = 4000
+ reco="14"
+ stripping = "21r0p1a"
+ DV.directory = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v38r1p3/'
+ elif (yr=="15"):
+ E = 6500
+ reco="15a"
+ stripping = "24r2"
+ DV.directory = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v44r3/'
+ DV.platform = "x86_64-centos7-gcc62-opt"
+ elif (yr=="16"):
+ E = 6500
+ reco="16"
+ stripping = "28r2"
+ DV.directory = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v44r3/'
+ DV.platform = "x86_64-centos7-gcc62-opt"
+ elif (yr=="17"):
+ E = 6500
+ reco="17"
+ stripping = "29r2"
+ DV.directory = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v44r3/'
+ DV.platform = "x86_64-centos7-gcc62-opt"
+ elif (yr=="18"):
+ E = 6500
+ reco="18"
+ stripping = "34r0p1"
+ DV.directory = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v44r3/'
+ DV.platform = "x86_64-centos7-gcc62-opt"
+
+ script_opts = {"YEAR":yr,"POL":polarity,"DATA_TYPE":"data","ENERGY":E,"RECO":reco,"STRIP":stripping}
+ script_1 ='/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v41r2/tuplecreation/optfiles/%(DATA_TYPE)s/20%(YEAR)s%(POL)s_%(DATA_TYPE)s.py'% script_opts
+ # script_basic = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v41r2/tuplecreation/optfiles/BasicOptfile.py'%(YEAR)s%(POL)s_%(DATA_TYPE)s_%(CHAN)s
+ print ('Using optsfile: ',script_1)
+ optsfile = [script_1]
+
+ PATH ="/LHCb/Collision%(YEAR)s/Beam%(ENERGY)sGeV-VeloClosed-Mag%(POL)s/Real Data/Reco%(RECO)s/Stripping%(STRIP)s/90000000/LEPTONIC.MDST" % script_opts
+ print ('Using data: ', PATH)
+
+ DV.options = optsfile
+
+ j = Job(
+ name = '%(YEAR)s%(POL)s' % script_opts,
+ application = DV,
+ splitter = SplitByFiles(filesPerJob = 50,ignoremissing = True),
+ inputdata = BKQuery(path=PATH).getDataset(),
+ outputfiles = [DiracFile(namePattern='*.root')],
+ do_auto_resubmit = False,
+ backend = Dirac(),
+ )
+ #j.backend.settings['Destination'] = ['LCG.CERN.cern']
+ j.backend.settings['BannedSites'] = ['LCG.RAL.uk']
+ j.submit()
diff --git a/Code/Ganga/RunningGanga/run_local_tests_all_backgrounds.sh b/Code/Ganga/RunningGanga/run_local_tests_all_backgrounds.sh
new file mode 100755
index 0000000..daec7df
--- /dev/null
+++ b/Code/Ganga/RunningGanga/run_local_tests_all_backgrounds.sh
@@ -0,0 +1,183 @@
+#!/bin/bash
+
+# first set up proper enviroment with
+# LbLogin -c x86_64-slc6-gcc49-opt
+
+echoWrongChannel(){
+ echo "Wrong decay channel!"
+ echo "Options are BtoKstMuMu, BtoKstJpsi, PHSP, BtoXJpsi, B0toKstMuMu, B0toKstJpsi, BtoK1MuMu or BtoK1Jpsi"
+}
+
+
+containsChannel() { #Check if list contains a word
+ channel=$1
+ declare -a DecayList=("BtoKstMuMu" "BtoKstJpsi" "PHSP" "BtoXJpsi" "B0toKstMuMu" "B0toKstJpsi" "BtoK1MuMu" "BtoK1Jpsi");
+ arrLen=${#DecayList[@]}
+ #echo lenght: $arrLen
+ flag=0
+ for (( i=0; i<${arrLen}; i++ ));
+ do
+ if [[ "$channel" = "${DecayList[$i]}" ]]; then
+ flag=1
+ break;
+ fi
+ done
+ #echo $flag
+
+}
+
+
+containsAllYears() { #Check if list contains a word
+ channel=$1
+ declare -a AllAvailableSamplesList=("BtoKstMuMu" "PHSP" "BtoXJpsi" "B0toKstMuMu" "B0toKstJpsi");
+ arrLen=${#AllAvailableSamplesList[@]}
+ #echo lenght: $arrLen
+ flag=0
+ for (( i=0; i<${arrLen}; i++ ));
+ do
+ if [[ "$channel" = "${AllAvailableSamplesList[$i]}" ]]; then
+ flag=1
+ break;
+ fi
+ done
+ #echo $flag
+
+}
+
+#declare BtoKstMuMu = ('2011' '2012' '2015' '2016'),
+#declare BtoKstJpsi = ('2011' '2012'),
+#declare PHSP = ('2011' '2012' '2015' '2016'),
+#declare BtoXJpsi = ('2011' '2012' '2016'),
+#declare B0toKstMuMu = ('2011' '2012' '2015' '2016'),
+#declare B0toKstJpsi = ('2011' '2012' '2015' '2016'),
+#declare BtoK1MuMu = ('2011' '2012'),
+#declare BtoK1Jpsi = ('2012')
+
+#CHECKING THE TUPLES: DecayTree->Draw("pi_zero_resolved_M", "pi_zero_resolved_TRUEID==22 && pi_zero_resolved_MC_MOTHER_ID == 111 && pi_zero_resolved_MC_GD_MOTHER_ID == 323 && pi_zero_resolved_MC_GD_GD_MOTHER_ID == 521")
+defPath=/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu
+mainPath=${defPath}/DaVinciDev_v41r2/tuplecreation
+logPath=${mainPath}/background_tests/log_files/
+buildFolder=build.x86_64-slc6-gcc49-opt
+
+cd ${defPath}/DaVinciDev_v41r2/
+#make configure
+#make install
+cd ${buildFolder}
+
+E_NO_ARGS=65
+if [ $# -eq 3 ]; then
+ channel=$1
+ containsChannel $channel
+ if [ "$flag" = 1 ]; then
+ year=$2
+ magnet=$3
+ cd ${defPath}/DaVinciDev_v41r2/
+ #cd ${defPath}/DaVinciDev_v38r1p3/build.x86_64-slc6-gcc49-opt
+ ./run gaudirun.py ${mainPath}/background_tests/optfiles/$channel/$year$magnet.py | tee ${logPath}${channel}_${year}${magnet}.txt
+ else
+ echoWrongChannel
+ fi
+elif [ $# -eq 2 ]; then
+ doTest=$1
+ if [ "$doTest" = "test" ]; then
+ echo "##########################"
+ echo "# #"
+ echo "# TEST #"
+ echo "# #"
+ echo "##########################"
+ channel=$2
+ containsChannel $channel
+ if [ $? ]; then
+ if [ "$channel" = "BtoKstMuMu" ] ; then
+
+ cd ${defPath}/DaVinciDev_v38r1p3/build.x86_64-slc6-gcc49-opt
+ ./run gaudirun.py ${mainPath}/background_tests/optfiles/$channel/2011MagDown.py | tee ${logPath}${channel}_2011MagDown.txt
+ ./run gaudirun.py ${mainPath}/background_tests/optfiles/$channel/2012MagDown.py | tee ${logPath}${channel}_2012MagDown.txt
+
+ cd ${defPath}/DaVinciDev_v41r2/build.x86_64-slc6-gcc49-opt
+ ./run gaudirun.py ${mainPath}/background_tests/optfiles/$channel/2015MagDown.py | tee ${logPath}${channel}_2015MagDown.txt
+ ./run gaudirun.py ${mainPath}/background_tests/optfiles/$channel/2016MagDown.py | tee ${logPath}${channel}_2016MagDown.txt
+ elif [ "$channel" = "BtoXJpsi" ] ; then
+
+ #cd ${defPath}/DaVinciDev_v38r1p3/build.x86_64-slc6-gcc49-opt
+ #./run gaudirun.py ${mainPath}/background_tests/optfiles/$channel/2011MagDown.py | tee ${logPath}${channel}_2011MagDown.txt
+ #./run gaudirun.py ${mainPath}/background_tests/optfiles/$channel/2012MagDown.py | tee ${logPath}${channel}_2012MagDown.txt
+
+ cd ${defPath}/DaVinciDev_v41r2
+ #./run gaudirun.py ${mainPath}/background_tests/optfiles/$channel/2015MagDown.py | tee ${logPath}${channel}_2015MagDown.txt
+ ./run gaudirun.py ${mainPath}/background_tests/optfiles/$channel/2016MagDown.py | tee ${logPath}${channel}_2016MagDown.txt
+ elif [ "$channel" = "PHSP" ] || [ "$channel" = "B0toKstMuMu" ] || [ "$channel" = "B0toKstJpsi" ]; then
+
+ cd ${defPath}/DaVinciDev_v38r1p3/build.x86_64-slc6-gcc49-opt
+ ./run gaudirun.py ${mainPath}/background_tests/optfiles/$channel/2011MagDown.py | tee ${logPath}${channel}_2011MagDown.txt
+ ./run gaudirun.py ${mainPath}/background_tests/optfiles/$channel/2012MagDown.py | tee ${logPath}${channel}_2012MagDown.txt
+
+ cd ${defPath}/DaVinciDev_v41r2/build.x86_64-slc6-gcc49-opt
+ ./run gaudirun.py ${mainPath}/background_tests/optfiles/$channel/2015MagDown.py | tee ${logPath}${channel}_2015MagDown.txt
+ ./run gaudirun.py ${mainPath}/background_tests/optfiles/$channel/2016MagDown.py | tee ${logPath}${channel}_2016MagDown.txt
+
+ elif [ "$channel" = "BtoKstJpsi" ] || [ "$channel" = "BtoK1MuMu" ]; then
+ ./run gaudirun.py ${mainPath}/background_tests/optfiles/$channel/2011MagDown.py | tee ${logPath}${channel}_2011MagDown.txt
+ ./run gaudirun.py ${mainPath}/background_tests/optfiles/$channel/2012MagDown.py | tee ${logPath}${channel}_2012MagDown.txt
+
+ elif [ "$channel" = "BtoK1Jpsi" ]; then
+ ./run gaudirun.py ${mainPath}/background_tests/optfiles/$channel/2012MagDown.py | tee ${logPath}${channel}_2012MagDown.txt
+ else
+ echo "Wrong decay channel!"
+ echo "Options are BtoKstMuMu, BtoKstJpsi, PHSP, BtoXJpsi, B0toKstMuMu, B0toKstJpsi, BtoK1MuMu or BtoK1Jpsi"
+ fi
+ else
+ echoWrongChannel
+ fi
+ fi
+elif [ $# -eq 1 ]; then
+ channel=$1
+ containsChannel $channel
+ if [ "$flag" = 1 ]; then
+ containsAllYears $channel #check if to be run on all years
+ if [ "$flag" = 1 ] ; then
+ cd ${defPath}/DaVinciDev_v38r1p3/build.x86_64-slc6-gcc49-opt
+ ./run gaudirun.py ${mainPath}/background_tests/optfiles/$channel/2011MagDown.py | tee ${logPath}${channel}_2011MagDown.txt
+ ./run gaudirun.py ${mainPath}/background_tests/optfiles/$channel/2011MagUp.py | tee ${logPath}${channel}_2011MagUp.txt
+ ./run gaudirun.py ${mainPath}/background_tests/optfiles/$channel/2012MagDown.py | tee ${logPath}${channel}_2012MagDown.txt
+ ./run gaudirun.py ${mainPath}/background_tests/optfiles/$channel/2012MagUp.py | tee ${logPath}${channel}_2012MagUp.txt
+
+ cd ${defPath}/DaVinciDev_v41r2/build.x86_64-slc6-gcc49-opt
+ ./run gaudirun.py ${mainPath}/background_tests/optfiles/$channel/2015MagDown.py | tee ${logPath}${channel}_2015MagDown.txt
+ ./run gaudirun.py ${mainPath}/background_tests/optfiles/$channel/2015MagUp.py | tee ${logPath}${channel}_2015MagUp.txt
+ ./run gaudirun.py ${mainPath}/background_tests/optfiles/$channel/2016MagDown.py | tee ${logPath}${channel}_2016MagDown.txt
+ ./run gaudirun.py ${mainPath}/background_tests/optfiles/$channel/2016MagUp.py | tee ${logPath}${channel}_2016MagUp.txt
+ elif [ "$channel" = "BtoKstJpsi" ] || [ "$channel" = "BtoK1MuMu" ]; then
+ cd ${defPath}/DaVinciDev_v38r1p3/build.x86_64-slc6-gcc49-opt
+ ./run gaudirun.py ${mainPath}/background_tests/optfiles/$channel/2011MagDown.py | tee ${logPath}${channel}_2011MagDown.txt
+ ./run gaudirun.py ${mainPath}/background_tests/optfiles/$channel/2011MagUp.py | tee ${logPath}${channel}_2011MagUp.txt
+ ./run gaudirun.py ${mainPath}/background_tests/optfiles/$channel/2012MagDown.py | tee ${logPath}${channel}_2012MagDown.txt
+ ./run gaudirun.py ${mainPath}/background_tests/optfiles/$channel/2012MagUp.py | tee ${logPath}${channel}_2012MagUp.txt
+ elif [ "$channel" = "BtoK1Jpsi" ]; then
+ cd ${defPath}/DaVinciDev_v38r1p3/build.x86_64-slc6-gcc49-opt
+ ./run gaudirun.py ${mainPath}/background_tests/optfiles/$channel/2012MagDown.py | tee ${logPath}${channel}_2012MagDown.txt
+ ./run gaudirun.py ${mainPath}/background_tests/optfiles/$channel/2012MagUp.py | tee ${logPath}${channel}_2012MagUp.txt
+ fi
+ else
+ echoWrongChannel
+ fi
+
+else
+ echo
+ echo
+ echo "For testing run with 2 arguments: ./run_local_tests_all.sh test channel"
+ echo
+ echo
+ echo "Please run with either 3 arguments:"
+ echo " channel year magnet"
+ echo
+ echo "or with only 1 argument: channel"
+ echo
+ echo "Example: bash ./run_local_tests_all.sh BtoKstMuMu 2011 MagDown"
+ echo
+ echo
+ echo "--------- exiting ---------"
+ echo
+ exit $E_NO_ARGS
+
+fi
diff --git a/Code/Ganga/SimulationDetails/PHSP_2011Down.txt b/Code/Ganga/SimulationDetails/PHSP_2011Down.txt
new file mode 100644
index 0000000..5b829f8
--- /dev/null
+++ b/Code/Ganga/SimulationDetails/PHSP_2011Down.txt
@@ -0,0 +1,80 @@
+ID: 54027
+Name: RD - Stripping filtered - Sim09f 2011 - MD - B+->K*+mumu
+Type: Simulation
+State: Done
+Priority: 1b
+Author: nskidmor WG: RD
+Event type:
+Number of events:
+Starting Date: 2019-03-27
+Finalization Date: 2019-04-21
+Fast Simulation Type: None
+Retention Rate: 0.035
+
+Simulation Conditions: Beam3500GeV-2011-MagDown-Nu2-Pythia8
+Beam: beta*~3m, zpv=0.5mm, xAngle=-0.520mrad and yAngle=0 Beam energy: 3500 GeV Generator: Pythia8 G4 settings: specified in sim step
+Magnetic field: -1 Detector: 2011, Velo Closed around offset beam Luminosity: pp collisions nu = 2, no spillover
+
+Processing Pass: Sim09f/Trig0x40760037/Reco14c/Stripping21r1p1Filtered/Merge14
+MC Version: 2011
+Step 1 Sim09f - 2011 - MD - Pythia8(138341/Sim09f) : Gauss-v49r12
+System config: x86_64-slc6-gcc48-opt MC TCK:
+Options: $APPCONFIGOPTS/Gauss/Sim08-Beam3500GeV-md100-2011-nu2.py;$APPCONFIGOPTS/Gauss/DataType-2011.py;$APPCONFIGOPTS/Gauss/RICHRandomHits.py;$APPCONFIGOPTS/Gauss/NoPacking.py;$DECFILESROOT/options/@{eventType}.py;$LBPYTHIA8ROOT/options/Pythia8_7TeV.py;$APPCONFIGOPTS/Gauss/G4PL_FTFP_BERT_EmNoCuts.py Options format: Multicore: N
+DDDB: dddb-20170721-1 Condition DB: sim-20160614-1-vc-md100 DQTag:
+Extra: AppConfig.v3r359;Gen/DecFiles.v30r29 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: Output file types: SIM
+
+Step 2 Digi14c for 2011 (to use w Sim09)(133531/Digi14c) : Boole-v30r3
+System config: x86_64-slc6-gcc49-opt MC TCK:
+Options: $APPCONFIGOPTS/Boole/Default.py;$APPCONFIGOPTS/Boole/DataType-2011.py;$APPCONFIGOPTS/Boole/NoPacking.py;$APPCONFIGOPTS/Boole/Boole-SetOdinRndTrigger.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r342 Runtime projects:
+Visible: N Usable:Yes
+Input file types: SIM Output file types: DIGI
+
+Step 3 L0 emulation - TCK 0037(137556/L0Trig0x0037) : Moore-v24r4
+System config: MC TCK:
+Options: $APPCONFIGOPTS/L0App/L0AppSimProduction.py;$APPCONFIGOPTS/L0App/L0AppTCK-0x0037.py;$APPCONFIGOPTS/L0App/DataType-2011.py Options format: l0app Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r369 Runtime projects:
+Visible: N Usable:Yes
+Input file types: DIGI Output file types: DIGI
+
+Step 4 TCK-0x40760037 Flagged for Simulation 2011(137557/Trig0x40760037) : Moore-v12r8g4
+System config: x86_64-slc5-gcc43-opt MC TCK:
+Options: $APPCONFIGOPTS/Moore/MooreSimProductionForSeparateL0AppStep.py;$APPCONFIGOPTS/Conditions/TCK-0x40760037.py;$APPCONFIGOPTS/Moore/DataType-2011.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r369 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DIGI Output file types: DIGI
+
+Step 5 Reco14c for MC - 2011 - to be used with Sim09(133994/Reco14c) : Brunel-v43r2p13
+System config: x86_64-slc5-gcc46-opt MC TCK:
+Options: $APPCONFIGOPTS/Brunel/DataType-2011.py;$APPCONFIGOPTS/Brunel/MC-WithTruth.py;$APPCONFIGOPTS/Brunel/Sim09-Run1.py;$APPCONFIGOPTS/Persistency/DST-multipleTCK-2011.py;$APPCONFIGOPTS/Persistency/Compression-ZLIB-1.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r366 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DIGI Output file types: DST
+
+Step 6 Stripping21r1p1Filtered DST for RDWG (B+->K*+mumu) - Sim09(138182/Stripping21r1p1Filtered) : DaVinci-v39r1p1
+System config: x86_64-slc6-gcc48-opt MC TCK:
+Options: $RDCONFIGOPTS/FilterB2XMuMu-S21r1p1-fulldst-allDecays.py;$APPCONFIGOPTS/DaVinci/DV-RedoCaloPID-Stripping21.py;$APPCONFIGOPTS/DaVinci/DataType-2011.py;$APPCONFIGOPTS/DaVinci/InputType-DST.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: WG/RDConfig.v1r78;AppConfig.v3r378 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DST Output file types: B2XMUMU.STRIP.DST
+
+Step 7 Merge for B+ -> K*+ mu mu RD Filtered Productions - DST(138386/Merge14) : DaVinci-v50r2
+System config: x86_64-slc6-gcc7-opt MC TCK:
+Options: $APPCONFIGOPTS/Merging/DVMergeDST.py;$APPCONFIGOPTS/DaVinci/DataType-2017.py;$APPCONFIGOPTS/Merging/WriteFSR.py;$APPCONFIGOPTS/Merging/MergeFSR.py;$APPCONFIGOPTS/Persistency/Compression-LZMA-4.py;$APPCONFIGOPTS/DaVinci/Simulation.py Options format: Merge Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag: fromPreviousStep
+Extra: AppConfig.v3r378 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: B2XMUMU.STRIP.DST Output file types: B2XMUMU.STRIP.DST
+
+
+Inform also: david.gerick@cern.ch
+
+Comments
+https://its.cern.ch/jira/browse/LHCBGAUSS-1601
diff --git a/Code/Ganga/SimulationDetails/PHSP_2012Down.txt b/Code/Ganga/SimulationDetails/PHSP_2012Down.txt
new file mode 100644
index 0000000..c390307
--- /dev/null
+++ b/Code/Ganga/SimulationDetails/PHSP_2012Down.txt
@@ -0,0 +1,80 @@
+ID: 54029
+Name: RD - Stripping filtered - Sim09f 2012 - MD - B+->K*+mumu
+Type: Simulation
+State: Done
+Priority: 1a
+Author: nskidmor WG: RD
+Event type:
+Number of events:
+Starting Date: 2019-03-27
+Finalization Date: 2019-04-21
+Fast Simulation Type: None
+Retention Rate: 0.035
+
+Simulation Conditions: Beam4000GeV-2012-MagDown-Nu2.5-Pythia8
+Beam: beta*~3m, zpv=25.7mm, xAngle=-0.236mrad and yAngle=0.100mrad Beam energy: 4000 GeV Generator: Pythia8 G4 settings: specified in sim step
+Magnetic field: -1 Detector: 2012, Velo Closed around offset beam Luminosity: pp collisions nu = 2.5, no spillover
+
+Processing Pass: Sim09f/Trig0x409f0045/Reco14c/Stripping21r0p1Filtered/Merge14
+MC Version: 2012
+Step 1 Sim09f - 2012 - MD - Pythia8(138339/Sim09f) : Gauss-v49r12
+System config: x86_64-slc6-gcc48-opt MC TCK:
+Options: $APPCONFIGOPTS/Gauss/Sim08-Beam4000GeV-md100-2012-nu2.5.py;$APPCONFIGOPTS/Gauss/DataType-2012.py;$APPCONFIGOPTS/Gauss/RICHRandomHits.py;$APPCONFIGOPTS/Gauss/NoPacking.py;$DECFILESROOT/options/@{eventType}.py;$LBPYTHIA8ROOT/options/Pythia8.py;$APPCONFIGOPTS/Gauss/G4PL_FTFP_BERT_EmNoCuts.py Options format: Multicore: N
+DDDB: dddb-20170721-2 Condition DB: sim-20160321-2-vc-md100 DQTag:
+Extra: AppConfig.v3r359;Gen/DecFiles.v30r29 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: Output file types: SIM
+
+Step 2 Digi14c for 2012 (to use w Sim09)(133532/Digi14c) : Boole-v30r3
+System config: x86_64-slc6-gcc49-opt MC TCK:
+Options: $APPCONFIGOPTS/Boole/Default.py;$APPCONFIGOPTS/Boole/DataType-2012.py;$APPCONFIGOPTS/Boole/NoPacking.py;$APPCONFIGOPTS/Boole/Boole-SetOdinRndTrigger.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r342 Runtime projects:
+Visible: N Usable:Yes
+Input file types: SIM Output file types: DIGI
+
+Step 3 L0 emulation - TCK 0045(137561/L0Trig0x0045) : Moore-v24r4
+System config: NULL MC TCK:
+Options: $APPCONFIGOPTS/L0App/L0AppSimProduction.py;$APPCONFIGOPTS/L0App/L0AppTCK-0x0045.py;$APPCONFIGOPTS/L0App/DataType-2012.py Options format: l0app Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r200 Runtime projects:
+Visible: N Usable:Yes
+Input file types: DIGI Output file types: DIGI
+
+Step 4 TCK-0x409f0045 Flagged for Simulation 2012 (L0 separate step)(137562/Trig0x409f0045) : Moore-v14r8p1g1
+System config: MC TCK:
+Options: $APPCONFIGOPTS/Moore/MooreSimProductionForSeparateL0AppStep.py;$APPCONFIGOPTS/Conditions/TCK-0x409f0045.py;$APPCONFIGOPTS/Moore/DataType-2012.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r369 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DIGI Output file types: DIGI
+
+Step 5 Reco14c for MC - 2012 - to be used with Sim09(133995/Reco14c) : Brunel-v43r2p13
+System config: x86_64-slc5-gcc46-opt MC TCK:
+Options: $APPCONFIGOPTS/Brunel/DataType-2012.py;$APPCONFIGOPTS/Brunel/MC-WithTruth.py;$APPCONFIGOPTS/Brunel/Sim09-Run1.py;$APPCONFIGOPTS/Persistency/DST-multipleTCK-2012.py;$APPCONFIGOPTS/Persistency/Compression-ZLIB-1.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r366 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DIGI Output file types: DST
+
+Step 6 Stripping21r0p1Filtered DST for RDWG (B+->K*+mumu) - Sim09(138183/Stripping21r0p1Filtered) : DaVinci-v39r1p1
+System config: x86_64-slc6-gcc48-opt MC TCK:
+Options: $RDCONFIGOPTS/FilterB2XMuMu-S21r0p1-fulldst-allDecays.py;$APPCONFIGOPTS/DaVinci/DV-RedoCaloPID-Stripping21.py;$APPCONFIGOPTS/DaVinci/DataType-2012.py;$APPCONFIGOPTS/DaVinci/InputType-DST.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: WG/RDConfig.v1r78;AppConfig.v3r378 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DST Output file types: B2XMUMU.STRIP.DST
+
+Step 7 Merge for B+ -> K*+ mu mu RD Filtered Productions - DST(138386/Merge14) : DaVinci-v50r2
+System config: x86_64-slc6-gcc7-opt MC TCK:
+Options: $APPCONFIGOPTS/Merging/DVMergeDST.py;$APPCONFIGOPTS/DaVinci/DataType-2017.py;$APPCONFIGOPTS/Merging/WriteFSR.py;$APPCONFIGOPTS/Merging/MergeFSR.py;$APPCONFIGOPTS/Persistency/Compression-LZMA-4.py;$APPCONFIGOPTS/DaVinci/Simulation.py Options format: Merge Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag: fromPreviousStep
+Extra: AppConfig.v3r378 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: B2XMUMU.STRIP.DST Output file types: B2XMUMU.STRIP.DST
+
+
+Inform also: david.gerick@cern.ch
+
+Comments
+https://its.cern.ch/jira/browse/LHCBGAUSS-1601
diff --git a/Code/Ganga/SimulationDetails/PHSP_2015Down.txt b/Code/Ganga/SimulationDetails/PHSP_2015Down.txt
new file mode 100644
index 0000000..a11838d
--- /dev/null
+++ b/Code/Ganga/SimulationDetails/PHSP_2015Down.txt
@@ -0,0 +1,88 @@
+ID: 58730
+Name: Filtered MC RD Sim09h 2015 - MD - Pythia6 (Gerick)
+Type: Simulation
+State: Done
+Priority: 1a
+Author: nskidmor WG: RD
+Event type:
+Number of events:
+Starting Date: 2019-08-09
+Finalization Date: 2019-09-20
+Fast Simulation Type: None
+Retention Rate: 0.035
+
+Simulation Conditions: Beam6500GeV-2015-MagDown-Nu1.6-25ns-Pythia6
+Beam: beta*~3m, zpv=8.64mm, xAngle=-0.395mrad and yAngle=0 Beam energy: 6500 GeV Generator: Pythia6 G4 settings: specified in sim step
+Magnetic field: -1 Detector: 2015, Velo closed around average x=0.788mm and y=0.091mm Luminosity: pp collisions nu = 1.6, 25ns spillover
+
+Processing Pass: Sim09h/Trig0x411400a2/Reco15a/Turbo02/Stripping24r1Filtered
+MC Version: 2015
+Step 1 Sim09h - 2015 Nominal - MD - Nu1.6 (Lumi 4 at 25ns) - 25ns spillover - Pythia6(139163/Sim09h) : Gauss-v49r14
+System config: x86_64-slc6-gcc48-opt MC TCK:
+Options: $APPCONFIGOPTS/Gauss/Beam6500GeV-md100-2015-nu1.6.py;$APPCONFIGOPTS/Gauss/EnableSpillover-25ns.py;$APPCONFIGOPTS/Gauss/DataType-2015.py;$APPCONFIGOPTS/Gauss/RICHRandomHits.py;$DECFILESROOT/options/@{eventType}.py;$LBPYTHIAROOT/options/Pythia.py;$APPCONFIGOPTS/Gauss/G4PL_FTFP_BERT_EmNoCuts.py Options format: Multicore: N
+DDDB: dddb-20170721-3 Condition DB: sim-20161124-vc-md100 DQTag:
+Extra: AppConfig.v3r383;Gen/DecFiles.v30r32 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: Output file types: SIM
+
+Step 2 Digi14c for 2015 - 25ns spillover(137780/Digi14c) : Boole-v30r4
+System config: x86_64-slc6-gcc49-opt MC TCK:
+Options: $APPCONFIGOPTS/Boole/Default.py;$APPCONFIGOPTS/Boole/EnableSpillover.py;$APPCONFIGOPTS/Boole/DataType-2015.py;$APPCONFIGOPTS/Boole/Boole-SetOdinRndTrigger.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r374 Runtime projects:
+Visible: N Usable:Yes
+Input file types: SIM Output file types: DIGI
+
+Step 3 L0 emulation for 2015 - TCK 0x00a2(129526/L0Trig0x00a2) : Moore-v24r2
+System config: x86_64-slc6-gcc48-opt MC TCK:
+Options: $APPCONFIGOPTS/L0App/L0AppSimProduction.py;$APPCONFIGOPTS/L0App/L0AppTCK-0x00a2.py;$APPCONFIGOPTS/L0App/ForceLUTVersionV8.py;$APPCONFIGOPTS/L0App/DataType-2015.py;$APPCONFIGOPTS/Persistency/Compression-ZLIB-1.py Options format: l0app Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r268 Runtime projects:
+Visible: N Usable:Yes
+Input file types: DIGI(N) Output file types: DIGI(N)
+
+Step 4 TCK-0x411400a2 Flagged for 2015(129527/Trig0x411400a2) : Moore-v24r2
+System config: x86_64-slc6-gcc48-opt MC TCK:
+Options: $APPCONFIGOPTS/Moore/MooreSimProductionForSeparateL0AppStep2015.py;$APPCONFIGOPTS/Conditions/TCK-0x411400a2.py;$APPCONFIGOPTS/Moore/DataType-2015.py;$APPCONFIGOPTS/Persistency/Compression-ZLIB-1.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r268 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DIGI(N) Output file types: DIGI(N)
+
+Step 5 Reco15a for MC 2015(138372/Reco15a) : Brunel-v48r3
+System config: x86_64-slc6-gcc49-opt MC TCK:
+Options: $APPCONFIGOPTS/Brunel/DataType-2015.py;$APPCONFIGOPTS/Brunel/MC-WithTruth.py;$APPCONFIGOPTS/Persistency/Compression-ZLIB-1.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r376;Det/SQLDDDB.v7r10 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DIGI Output file types: DST
+
+Step 6 Turbo lines (MC), Turbo 2015 reprocessing(129522/Turbo02) : DaVinci-v40r1p3
+System config: x86_64-slc6-gcc48-opt MC TCK:
+Options: $APPCONFIGOPTS/Turbo/Tesla_AllHlt2Lines_v10r0_0x00fa0051.py;$APPCONFIGOPTS/Turbo/Tesla_Simulation_2015_PVHLT2.py Options format: Tesla Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r232;TurboStreamProd.v2r0 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DST(N) Output file types: DST(N)
+
+Step 7 Stripping24r1Filtered mDST for RDWG (Gerick) (139365/Stripping24r1Filtered) : DaVinci-v38r1p7
+System config: x86_64-slc6-gcc49-opt MC TCK:
+Options: $RDCONFIGOPTS/FilterB2XMuMu-S24r1-mdst.py;$APPCONFIGOPTS/DaVinci/DataType-2015.py;APPCONFIGOPTS/DaVinci/InputType-DST.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r384;WG/RDConfig.v1r78 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DST Output file types: B2XMUMU.STRIP.MDST
+
+Step 8 Merge for RD Filtered Productions (Gerick) - DST(139366/Merge14) : DaVinci-v45r0
+System config: x86_64-slc6-gcc8-opt MC TCK:
+Options: $APPCONFIGOPTS/Merging/DVMergeDST.py;$APPCONFIGOPTS/DaVinci/DataType-2015.py;$APPCONFIGOPTS/Merging/WriteFSR.py;$APPCONFIGOPTS/Merging/MergeFSR.py;$APPCONFIGOPTS/Persistency/Compression-LZMA-4.py;$APPCONFIGOPTS/DaVinci/Simulation.py Options format: Merge Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag: fromPreviousStep
+Extra: AppConfig.v3r384 Runtime projects:
+Visible: N Usable:Yes
+Input file types: B2XMUMU.STRIP.MDST Output file types: B2XMUMU.STRIP.MDST
+
+
+Inform also: david.gerick@cern.ch
+
+Comments
+https://its.cern.ch/jira/browse/LHCBGAUSS-1601
diff --git a/Code/Ganga/SimulationDetails/PHSP_2016Down.txt b/Code/Ganga/SimulationDetails/PHSP_2016Down.txt
new file mode 100644
index 0000000..df65897
--- /dev/null
+++ b/Code/Ganga/SimulationDetails/PHSP_2016Down.txt
@@ -0,0 +1,96 @@
+ID: 54035
+Name: RD - Stripping filtered - Sim09f 2016 - MD - B+->K*+mumu
+Type: Simulation
+State: Done
+Priority: 1a
+Author: nskidmor WG: RD
+Event type:
+Number of events:
+Starting Date: 2019-04-24
+Finalization Date: 2019-05-24
+Fast Simulation Type: None
+Retention Rate: 0.035
+
+Simulation Conditions: Beam6500GeV-2016-MagDown-Nu1.6-25ns-Pythia8
+Beam: beta*~3m, zpv=-3.1mm, xAngle=-0.395mrad and yAngle=0 Beam energy: 6500 GeV Generator: Pythia8 G4 settings: specified in sim step
+Magnetic field: -1 Detector: 2016, Velo closed around average x=0.84mm and y=-0.18mm Luminosity: pp collisions nu = 1.6, 25ns spillover
+
+Processing Pass: Sim09f/Trig0x6139160F/Reco16/Turbo03/Stripping28r1Filtered/Merge14
+MC Version: 2016
+Step 1 Sim09f - 2016 - MD - Nu1.6 (Lumi 4 at 25ns) - 25ns spillover - Pythia8(138335/Sim09f) : Gauss-v49r12
+System config: x86_64-slc6-gcc48-opt MC TCK:
+Options: $APPCONFIGOPTS/Gauss/Beam6500GeV-md100-2016-nu1.6.py;$APPCONFIGOPTS/Gauss/EnableSpillover-25ns.py;$APPCONFIGOPTS/Gauss/DataType-2016.py;$APPCONFIGOPTS/Gauss/RICHRandomHits.py;$DECFILESROOT/options/@{eventType}.py;$LBPYTHIA8ROOT/options/Pythia8.py;$APPCONFIGOPTS/Gauss/G4PL_FTFP_BERT_EmNoCuts.py Options format: Multicore: N
+DDDB: dddb-20170721-3 Condition DB: sim-20170721-2-vc-md100 DQTag:
+Extra: AppConfig.v3r359;Gen/DecFiles.v30r29 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: Output file types: SIM
+
+Step 2 Digi14c for 2015 - 25ns spillover(133533/Digi14c) : Boole-v30r3
+System config: x86_64-slc6-gcc49-opt MC TCK:
+Options: $APPCONFIGOPTS/Boole/Default.py;$APPCONFIGOPTS/Boole/EnableSpillover.py;$APPCONFIGOPTS/Boole/DataType-2015.py;$APPCONFIGOPTS/Boole/Boole-SetOdinRndTrigger.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r338 Runtime projects:
+Visible: N Usable:Yes
+Input file types: SIM Output file types: DIGI
+
+Step 3 L0 emulation for 2016 - TCK 0x160F - DIGI(130088/L0Trig0x160F) : Moore-v25r4
+System config: x86_64-slc6-gcc48-opt MC TCK:
+Options: $APPCONFIGOPTS/L0App/L0AppSimProduction.py;$APPCONFIGOPTS/L0App/L0AppTCK-0x160F.py;$APPCONFIGOPTS/L0App/ForceLUTVersionV8.py;$APPCONFIGOPTS/L0App/DataType-2016.py;$APPCONFIGOPTS/Persistency/Compression-ZLIB-1.py Options format: l0app Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r297 Runtime projects:
+Visible: N Usable:Yes
+Input file types: DIGI(N) Output file types: DIGI(N)
+
+Step 4 TCK-0x5138160F (HLT1) Flagged for 2016 - DIGI(130089/Trig0x5138160F) : Moore-v25r4
+System config: x86_64-slc6-gcc48-opt MC TCK:
+Options: $APPCONFIGOPTS/Moore/MooreSimProductionForSeparateL0AppStep2015.py;$APPCONFIGOPTS/Conditions/TCK-0x5138160F.py;$APPCONFIGOPTS/Moore/DataType-2016.py;$APPCONFIGOPTS/Persistency/Compression-ZLIB-1.py;$APPCONFIGOPTS/Moore/MooreSimProductionHlt1.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r297 Runtime projects:
+Visible: N Usable:Yes
+Input file types: DIGI(N) Output file types: DIGI(N)
+
+Step 5 TCK-0x6139160F (HLT2) Flagged for 2016 - DIGI(133524/Trig0x6139160F) : Moore-v25r4
+System config: x86_64-slc6-gcc48-opt MC TCK:
+Options: $APPCONFIGOPTS/Moore/MooreSimProductionForSeparateL0AppStep2015.py;$APPCONFIGOPTS/Conditions/TCK-0x6139160F.py;$APPCONFIGOPTS/Moore/DataType-2016.py;$APPCONFIGOPTS/Persistency/Compression-ZLIB-1.py;$APPCONFIGOPTS/Moore/MooreSimProductionHlt2.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r355 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DIGI Output file types: DIGI
+
+Step 6 Reco16 for MC 2016(138374/Reco16) : Brunel-v50r5
+System config: x86_64-slc6-gcc49-opt MC TCK:
+Options: $APPCONFIGOPTS/Brunel/DataType-2016.py;$APPCONFIGOPTS/Brunel/MC-WithTruth.py;$APPCONFIGOPTS/Brunel/SplitRawEventOutput.4.3.py;$APPCONFIGOPTS/Persistency/Compression-ZLIB-1.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r376;Det/SQLDDDB.v7r10 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DIGI Output file types: DST
+
+Step 7 Turbo lines (MC), Turbo 2016 - Stripping28 - uDST(131791/Turbo03) : DaVinci-v41r4p3
+System config: x86_64-slc6-gcc48-opt MC TCK:
+Options: $APPCONFIGOPTS/Turbo/Tesla_2016_LinesFromStreams_MC.py;$APPCONFIGOPTS/Turbo/Tesla_PR_Truth_2016.py;$APPCONFIGOPTS/Turbo/Tesla_Simulation_2016.py;$APPCONFIGOPTS/Turbo/Tesla_FilterMC.py Options format: Tesla Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r322;TurboStreamProd.v4r1p4 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DST Output file types: DST
+
+Step 8 Stripping28r1Filtered mDST for RDWG (B+->K*mumu) - Sim09(138662/Stripping28r1Filtered) : DaVinci-v41r4p5
+System config: x86_64-slc6-gcc49-opt MC TCK:
+Options: $RDCONFIGOPTS/FilterB2XMuMu-S28r1-mdst.py;$APPCONFIGOPTS/DaVinci/DataType-2016.py;$APPCONFIGOPTS/DaVinci/InputType-DST.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: WG/RDConfig.v1r78;AppConfig.v3r378 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DST Output file types: B2XMUMU.STRIP.MDST
+
+Step 9 Merge for B+->K*+mumu RD Filtered Productions - mDST(138385/Merge14) : DaVinci-v50r2
+System config: x86_64-slc6-gcc7-opt MC TCK:
+Options: $APPCONFIGOPTS/Merging/DVMergeDST.py;$APPCONFIGOPTS/DaVinci/DataType-2017.py;$APPCONFIGOPTS/Merging/WriteFSR.py;$APPCONFIGOPTS/Merging/MergeFSR.py;$APPCONFIGOPTS/Persistency/Compression-LZMA-4.py;$APPCONFIGOPTS/DaVinci/Simulation.py Options format: Merge Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag: fromPreviousStep
+Extra: AppConfig.v3r378 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: B2XMUMU.STRIP.MDST Output file types: B2XMUMU.STRIP.MDST
+
+
+Inform also: david.gerick@cern.ch
+
+Comments
+https://its.cern.ch/jira/browse/LHCBGAUSS-1601
diff --git a/Code/Ganga/SimulationDetails/PHSP_2017Down.txt b/Code/Ganga/SimulationDetails/PHSP_2017Down.txt
new file mode 100644
index 0000000..450165d
--- /dev/null
+++ b/Code/Ganga/SimulationDetails/PHSP_2017Down.txt
@@ -0,0 +1,96 @@
+ID: 54037
+Name: RD - Stripping filtered - Sim09f 2017 - MD - B+->K*+mumu
+Type: Simulation
+State: Done
+Priority: 1a
+Author: nskidmor WG: RD
+Event type:
+Number of events:
+Starting Date: 2019-04-24
+Finalization Date: 2019-05-24
+Fast Simulation Type: None
+Retention Rate: 0.035
+
+Simulation Conditions: Beam6500GeV-2017-MagDown-Nu1.6-25ns-Pythia8
+Beam: beta*~3m, zpv=-1.36mm, xAngle=-0.395mrad and yAngle=0 Beam energy: 6500 GeV Generator: Pythia8 G4 settings: specified in sim step
+Magnetic field: -1 Detector: 2017, Velo closed around average x=0.81mm and y=-0.10mm Luminosity: pp collisions nu = 1.6, 25ns spillover
+
+Processing Pass: Sim09f/Trig0x62661709/Reco17/Turbo04a-WithTurcal/Stripping29r2Filtered/Merge14
+MC Version: 2017
+Step 1 Sim09f - 2017 - MD - Nu1.6 (Lumi 4 at 25ns) - 25ns spillover - Pythia8(138333/Sim09f) : Gauss-v49r12
+System config: x86_64-slc6-gcc48-opt MC TCK:
+Options: $APPCONFIGOPTS/Gauss/Beam6500GeV-md100-2017-nu1.6.py;$APPCONFIGOPTS/Gauss/EnableSpillover-25ns.py;$APPCONFIGOPTS/Gauss/DataType-2016.py;$APPCONFIGOPTS/Gauss/RICHRandomHits.py;$DECFILESROOT/options/@{eventType}.py;$LBPYTHIA8ROOT/options/Pythia8.py;$APPCONFIGOPTS/Gauss/G4PL_FTFP_BERT_EmNoCuts.py Options format: Multicore: N
+DDDB: dddb-20170721-3 Condition DB: sim-20180411-vc-md100 DQTag:
+Extra: AppConfig.v3r372;Gen/DecFiles.v30r29 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: Output file types: SIM
+
+Step 2 Digi14c for 2015 - 25ns spillover(133533/Digi14c) : Boole-v30r3
+System config: x86_64-slc6-gcc49-opt MC TCK:
+Options: $APPCONFIGOPTS/Boole/Default.py;$APPCONFIGOPTS/Boole/EnableSpillover.py;$APPCONFIGOPTS/Boole/DataType-2015.py;$APPCONFIGOPTS/Boole/Boole-SetOdinRndTrigger.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r338 Runtime projects:
+Visible: N Usable:Yes
+Input file types: SIM Output file types: DIGI
+
+Step 3 L0 emulation for 2017 - TCK 0x1709 - DIGI(133514/L0Trig0x1709) : Moore-v26r6p1
+System config: x86_64-slc6-gcc62-opt MC TCK:
+Options: $APPCONFIGOPTS/L0App/L0AppSimProduction.py;$APPCONFIGOPTS/L0App/L0AppTCK-0x1709.py;$APPCONFIGOPTS/L0App/ForceLUTVersionV8.py;$APPCONFIGOPTS/L0App/DataType-2017.py Options format: l0app Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r356 Runtime projects:
+Visible: N Usable:Yes
+Input file types: DIGI Output file types: DIGI
+
+Step 4 TCK-0x51611709 (HLT1) Flagged for 2017 - DIGI(133515/Trig0x51611709) : Moore-v26r6p1
+System config: x86_64-slc6-gcc62-opt MC TCK:
+Options: $APPCONFIGOPTS/Moore/MooreSimProductionForSeparateL0AppStep2015.py;$APPCONFIGOPTS/Conditions/TCK-0x51611709.py;$APPCONFIGOPTS/Moore/DataType-2017.py;$APPCONFIGOPTS/Moore/MooreSimProductionHlt1.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r356 Runtime projects:
+Visible: N Usable:Yes
+Input file types: DIGI Output file types: DIGI
+
+Step 5 TCK-0x62661709 (HLT2) Flagged for 2017 - DIGI(137501/Trig0x62661709) : Moore-v26r6p1
+System config: x86_64-slc6-gcc62-opt MC TCK:
+Options: $APPCONFIGOPTS/Moore/MooreSimProductionForSeparateL0AppStep2015.py;$APPCONFIGOPTS/Conditions/TCK-0x62661709.py;$APPCONFIGOPTS/Moore/DataType-2017.py;$APPCONFIGOPTS/Moore/MooreSimProductionHlt2.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r369 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DIGI Output file types: DIGI
+
+Step 6 Reco17 for MC 2017(138326/Reco17) : Brunel-v52r6p1
+System config: x86_64-slc6-gcc62-opt MC TCK:
+Options: $APPCONFIGOPTS/Brunel/DataType-2017.py;$APPCONFIGOPTS/Brunel/MC-WithTruth.py;$APPCONFIGOPTS/Brunel/SplitRawEventOutput.4.3.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r338;Det/SQLDDDB.v7r10 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DIGI Output file types: DST
+
+Step 7 Turbo lines (MC) including TurCal, Turbo 2017 - uDST(137693/Turbo04a-WithTurcal) : DaVinci-v42r8p3
+System config: x86_64-slc6-gcc62-opt MC TCK:
+Options: $APPCONFIGOPTS/Turbo/Tesla_2017_LinesFromStreamsAndTurCal_MC.py;$APPCONFIGOPTS/Turbo/Tesla_Simulation_2017.py;$APPCONFIGOPTS/Turbo/Tesla_FilterMC.py Options format: Tesla Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r372;TurboStreamProd.v4r2p7 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DST Output file types: DST
+
+Step 8 Stripping29r2Filtered mDST for RDWG (B+->K*mumu) - Sim09(138187/Stripping29r2Filtered) : DaVinci-v42r8p1
+System config: x86_64-slc6-gcc49-opt MC TCK:
+Options: $RDCONFIGOPTS/FilterB2XMuMu-S29r2-mdst.py;$APPCONFIGOPTS/DaVinci/DataType-2017.py;APPCONFIGOPTS/DaVinci/InputType-DST.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r378;WG/RDConfig.v1r78 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DST Output file types: B2XMUMU.STRIP.MDST
+
+Step 9 Merge for B+->K*+mumu RD Filtered Productions - mDST(138385/Merge14) : DaVinci-v50r2
+System config: x86_64-slc6-gcc7-opt MC TCK:
+Options: $APPCONFIGOPTS/Merging/DVMergeDST.py;$APPCONFIGOPTS/DaVinci/DataType-2017.py;$APPCONFIGOPTS/Merging/WriteFSR.py;$APPCONFIGOPTS/Merging/MergeFSR.py;$APPCONFIGOPTS/Persistency/Compression-LZMA-4.py;$APPCONFIGOPTS/DaVinci/Simulation.py Options format: Merge Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag: fromPreviousStep
+Extra: AppConfig.v3r378 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: B2XMUMU.STRIP.MDST Output file types: B2XMUMU.STRIP.MDST
+
+
+Inform also: david.gerick@cern.ch
+
+Comments
+https://its.cern.ch/jira/browse/LHCBGAUSS-1601
diff --git a/Code/Ganga/SimulationDetails/PHSP_2018Down.txt b/Code/Ganga/SimulationDetails/PHSP_2018Down.txt
new file mode 100644
index 0000000..dba3c43
--- /dev/null
+++ b/Code/Ganga/SimulationDetails/PHSP_2018Down.txt
@@ -0,0 +1,96 @@
+ID: 54039
+Name: RD - Stripping filtered - Sim09f 2018 - MD - B+->K*+mumu
+Type: Simulation
+State: Done
+Priority: 1b
+Author: nskidmor WG: RD
+Event type:
+Number of events:
+Starting Date: 2019-04-24
+Finalization Date: 2019-05-24
+Fast Simulation Type: None
+Retention Rate: 0.035
+
+Simulation Conditions: Beam6500GeV-2018-MagDown-Nu1.6-25ns-Pythia8
+Beam: beta*~3m, zpv=1.48mm, xAngle=-0.395mrad and yAngle=0 Beam energy: 6500 GeV Generator: Pythia8 G4 settings: specified in sim step
+Magnetic field: -1 Detector: 2017, Velo closed around average x=0.846mm and y=0.109mm Luminosity: pp collisions nu = 1.6, 25ns spillover
+
+Processing Pass: Sim09f/Trig0x617d18a4/Reco18/Turbo05-WithTurcal/Stripping34Filtered/Merge14
+MC Version: 2018
+Step 1 Sim09f - 2018 - MD - Nu1.6 (Lumi 4 at 25ns) - 25ns spillover - Pythia8(138331/Sim09f) : Gauss-v49r12
+System config: x86_64-slc6-gcc48-opt MC TCK:
+Options: $APPCONFIGOPTS/Gauss/Beam6500GeV-md100-2018-nu1.6.py;$APPCONFIGOPTS/Gauss/EnableSpillover-25ns.py;$APPCONFIGOPTS/Gauss/DataType-2017.py;$APPCONFIGOPTS/Gauss/RICHRandomHits.py;$DECFILESROOT/options/@{eventType}.py;$LBPYTHIA8ROOT/options/Pythia8.py;$APPCONFIGOPTS/Gauss/G4PL_FTFP_BERT_EmNoCuts.py Options format: Multicore: N
+DDDB: dddb-20170721-3 Condition DB: sim-20190128-vc-md100 DQTag:
+Extra: AppConfig.v3r375;Gen/DecFiles.v30r29 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: Output file types: SIM
+
+Step 2 Digi14c for 2015 - 25ns spillover(137780/Digi14c) : Boole-v30r4
+System config: x86_64-slc6-gcc49-opt MC TCK:
+Options: $APPCONFIGOPTS/Boole/Default.py;$APPCONFIGOPTS/Boole/EnableSpillover.py;$APPCONFIGOPTS/Boole/DataType-2015.py;$APPCONFIGOPTS/Boole/Boole-SetOdinRndTrigger.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r374 Runtime projects:
+Visible: N Usable:Yes
+Input file types: SIM Output file types: DIGI
+
+Step 3 L0 emulation for 2018 - TCK 0x18a4 - DIGI(138052/L0Trig0x18a4) : Moore-v28r3p1
+System config: x86_64-slc6-gcc62-opt MC TCK:
+Options: $APPCONFIGOPTS/L0App/L0AppSimProduction.py;$APPCONFIGOPTS/L0App/L0AppTCK-0x18a4.py;$APPCONFIGOPTS/L0App/ForceLUTVersionV8.py;$APPCONFIGOPTS/L0App/DataType-2017.py Options format: l0app Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r374 Runtime projects:
+Visible: N Usable:Yes
+Input file types: DIGI Output file types: DIGI
+
+Step 4 TCK-0x517a18a4 (HLT1) Flagged for 2018 - DIGI(137782/Trig0x517a18a4) : Moore-v28r3p1
+System config: x86_64-slc6-gcc62-opt MC TCK:
+Options: $APPCONFIGOPTS/Moore/MooreSimProductionForSeparateL0AppStep2015.py;$APPCONFIGOPTS/Conditions/TCK-0x517a18a4.py;$APPCONFIGOPTS/Moore/DataType-2017.py;$APPCONFIGOPTS/Moore/MooreSimProductionHlt1.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r374 Runtime projects:
+Visible: N Usable:Yes
+Input file types: DIGI Output file types: DIGI
+
+Step 5 TCK-0x0x617d18a4 (HLT2) Flagged for 2018 - DIGI(137783/Trig0x617d18a4) : Moore-v28r3p1
+System config: x86_64-slc6-gcc62-opt MC TCK:
+Options: $APPCONFIGOPTS/Moore/MooreSimProductionForSeparateL0AppStep2015.py;$APPCONFIGOPTS/Conditions/TCK-0x617d18a4.py;$APPCONFIGOPTS/Moore/DataType-2017.py;$APPCONFIGOPTS/Moore/MooreSimProductionHlt2.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r374 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DIGI Output file types: DIGI
+
+Step 6 Reco18 for MC 2018 - DST(138325/Reco18) : Brunel-v54r1
+System config: x86_64-slc6-gcc62-opt MC TCK:
+Options: $APPCONFIGOPTS/Brunel/DataType-2018.py;$APPCONFIGOPTS/Brunel/MC-WithTruth.py;$APPCONFIGOPTS/Brunel/SplitRawEventOutput.4.3.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r374;Det/SQLDDDB.v7r10 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DIGI Output file types: DST
+
+Step 7 Turbo lines (MC) including TurCal, Turbo 2018 - uDST(137696/Turbo05-WithTurcal) : DaVinci-v44r7
+System config: MC TCK:
+Options: $APPCONFIGOPTS/Turbo/Tesla_2018_LinesFromStreamsAndTurCal_MC.py;$APPCONFIGOPTS/Turbo/Tesla_Simulation_2018.py;$APPCONFIGOPTS/Turbo/Tesla_FilterMC.py Options format: Tesla Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r374;TurboStreamProd.v4r2p10 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DST Output file types: DST
+
+Step 8 Stripping34Filtered mDST for RDWG (B+->K*mumu) - Sim09(138188/Stripping34Filtered) : DaVinci-v44r7
+System config: x86_64-slc6-gcc62-opt MC TCK:
+Options: $RDCONFIGOPTS/FilterB2XMuMu-S34-mdst.py;$APPCONFIGOPTS/DaVinci/DataType-2018.py;APPCONFIGOPTS/DaVinci/InputType-DST.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r378;WG/RDConfig.v1r78 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DST Output file types: B2XMUMU.STRIP.MDST
+
+Step 9 Merge for B+->K*+mumu RD Filtered Productions - mDST(138385/Merge14) : DaVinci-v50r2
+System config: x86_64-slc6-gcc7-opt MC TCK:
+Options: $APPCONFIGOPTS/Merging/DVMergeDST.py;$APPCONFIGOPTS/DaVinci/DataType-2017.py;$APPCONFIGOPTS/Merging/WriteFSR.py;$APPCONFIGOPTS/Merging/MergeFSR.py;$APPCONFIGOPTS/Persistency/Compression-LZMA-4.py;$APPCONFIGOPTS/DaVinci/Simulation.py Options format: Merge Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag: fromPreviousStep
+Extra: AppConfig.v3r378 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: B2XMUMU.STRIP.MDST Output file types: B2XMUMU.STRIP.MDST
+
+
+Inform also: david.gerick@cern.ch
+
+Comments
+https://its.cern.ch/jira/browse/LHCBGAUSS-1601
diff --git a/Code/Ganga/SimulationDetails/RefMC_2011Down.txt b/Code/Ganga/SimulationDetails/RefMC_2011Down.txt
new file mode 100644
index 0000000..9af2cf1
--- /dev/null
+++ b/Code/Ganga/SimulationDetails/RefMC_2011Down.txt
@@ -0,0 +1,96 @@
+ID: 32667
+Name: RDWG - Sim09a 2011 - MD - Gerick
+Type: Simulation
+State: Done
+Priority: 2a
+Author: dloh WG: RD
+Event type:
+Number of events:
+Starting Date:
+Finalization Date:
+Fast Simulation Type: None
+Retention Rate: 1
+
+Simulation Conditions: Beam3500GeV-2011-MagDown-Nu2-Pythia8
+Beam: beta*~3m, zpv=0.5mm, xAngle=-0.520mrad and yAngle=0 Beam energy: 3500 GeV Generator: Pythia8 G4 settings: specified in sim step
+Magnetic field: -1 Detector: 2011, Velo Closed around offset beam Luminosity: pp collisions nu = 2, no spillover
+
+Processing Pass: Sim09a/Trig0x40760037/Reco14c/Stripping21r1NoPrescalingFlagged
+MC Version: 2011
+Step 1 Sim09a - 2011 - MD - Pythia8(130026/Sim09a) : Gauss-v49r1
+System config: x86_64-slc6-gcc48-opt MC TCK:
+Options: $APPCONFIGOPTS/Gauss/Sim08-Beam3500GeV-md100-2011-nu2.py;$APPCONFIGOPTS/Gauss/DataType-2011.py;$APPCONFIGOPTS/Gauss/RICHRandomHits.py;$APPCONFIGOPTS/Gauss/NoPacking.py;$DECFILESROOT/options/@{eventType}.py;$LBPYTHIA8ROOT/options/Pythia8_7TeV.py;$APPCONFIGOPTS/Gauss/G4PL_FTFP_BERT_EmNoCuts.py;$APPCONFIGOPTS/Persistency/Compression-ZLIB-1.py Options format: Multicore: N
+DDDB: dddb-20160318-1 Condition DB: sim-20160614-1-vc-md100 DQTag:
+Extra: AppConfig.v3r277;DecFiles.v29r6 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: Output file types: SIM(N)
+
+Step 2 Digi14a for 2011 (to use w Sim09)(129272/Digi14a) : Boole-v30r1
+System config: x86_64-slc6-gcc48-opt MC TCK:
+Options: $APPCONFIGOPTS/Boole/Default.py;$APPCONFIGOPTS/Boole/DataType-2011.py;$APPCONFIGOPTS/Boole/NoPacking.py;$APPCONFIGOPTS/Boole/Boole-SetOdinRndTrigger.py;$APPCONFIGOPTS/Persistency/Compression-ZLIB-1.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r266 Runtime projects:
+Visible: N Usable:Yes
+Input file types: SIM(N) Output file types: DIGI(N)
+
+Step 3 L0 emulation - TCK 0037(129524/L0Trig0x0037) : Moore-v20r4
+System config: MC TCK:
+Options: $APPCONFIGOPTS/L0App/L0AppSimProduction.py;$APPCONFIGOPTS/L0App/L0AppTCK-0x0037.py;$APPCONFIGOPTS/L0App/DataType-2011.py Options format: l0app Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r268 Runtime projects:
+Visible: N Usable:Yes
+Input file types: DIGI(N) Output file types: DIGI(N)
+
+Step 4 TCK-0x40760037 Flagged for Simulation 2011(129525/Trig0x40760037) : Moore-v12r8g3
+System config: x86_64-slc5-gcc43-opt MC TCK:
+Options: $APPCONFIGOPTS/Moore/MooreSimProductionForSeparateL0AppStep.py;$APPCONFIGOPTS/Conditions/TCK-0x40760037.py;$APPCONFIGOPTS/Moore/DataType-2011.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r268 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DIGI(N) Output file types: DIGI(N)
+
+Step 5 Reco14c for MC - 2011 - to be used with Sim09(129275/Reco14c) : Brunel-v43r2p11
+System config: x86_64-slc5-gcc46-opt MC TCK:
+Options: $APPCONFIGOPTS/Brunel/DataType-2011.py;$APPCONFIGOPTS/Brunel/MC-WithTruth.py;$APPCONFIGOPTS/Brunel/Sim09-Run1.py;$APPCONFIGOPTS/Persistency/DST-multipleTCK-2011.py;$APPCONFIGOPTS/Persistency/Compression-ZLIB-1.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r262 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DIGI(N) Output file types: DST(N)
+
+Step 6 Stripping21r1-NoPrescalingFlagged for Sim09(129276/Stripping21r1NoPrescalingFlagged) : DaVinci-v36r1p3
+System config: x86_64-slc6-gcc48-opt MC TCK:
+Options: $APPCONFIGOPTS/DaVinci/DV-Stripping21r1-Stripping-MC-NoPrescaling.py;$APPCONFIGOPTS/DaVinci/DV-RedoCaloPID-Stripping21.py;$APPCONFIGOPTS/DaVinci/DataType-2011.py;$APPCONFIGOPTS/DaVinci/InputType-DST.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r263 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DST(N) Output file types: ALLSTREAMS.DST(Y)
+
+
+Inform also: david.gerick@cern.ch
+
+Comments
+Comment by gcorti on Jun 09, 2016:
+Model for 2011 average nominal conditions over the whole year - Magnet DOWN
+
+This model has the whole processing chain for data: L0, HLT, Reco, Stripping.
+
+It has the most representative TCK as recommened by the trigger, Reco14c, and Stripping 21r1
+
+The output is DST in this first version.
+
+To use the incremental Stripping21r0p1 with DST output replace the last step with stepID = 129454
+
+Comment by kreps on Jul 07, 2016:
+Update with DecFiles v29r2
+
+Comment by kreps on Jul 21, 2016:
+Updated to DecFiles v29r3
+
+Comment by kreps on Aug 11, 2016:
+Updated to DecFiles v29r4
+
+Comment by kreps on Aug 23, 2016:
+Updated to DecFiles v29r5
+
+Comment by kreps on Sep 16, 2016:
+Updated to DecFiles v29r6
diff --git a/Code/Ganga/SimulationDetails/RefMC_2012Down.txt b/Code/Ganga/SimulationDetails/RefMC_2012Down.txt
new file mode 100644
index 0000000..28412d3
--- /dev/null
+++ b/Code/Ganga/SimulationDetails/RefMC_2012Down.txt
@@ -0,0 +1,105 @@
+ID: 32669
+Name: RDWG - Sim09a 2012 - MD - Gerick
+Type: Simulation
+State: Done
+Priority: 2a
+Author: dloh WG: RD
+Event type:
+Number of events:
+Starting Date:
+Finalization Date:
+Fast Simulation Type: None
+Retention Rate: 1
+
+Simulation Conditions: Beam4000GeV-2012-MagDown-Nu2.5-Pythia8
+Beam: beta*~3m, zpv=25.7mm, xAngle=-0.236mrad and yAngle=0.100mrad Beam energy: 4000 GeV Generator: Pythia8 G4 settings: specified in sim step
+Magnetic field: -1 Detector: 2012, Velo Closed around offset beam Luminosity: pp collisions nu = 2.5, no spillover
+
+Processing Pass: Sim09a/Trig0x409f0045/Reco14c/Stripping21NoPrescalingFlagged
+MC Version: 2012
+Step 1 Sim09a - 2012 - MD - Pythia8(130024/Sim09a) : Gauss-v49r1
+System config: x86_64-slc6-gcc48-opt MC TCK:
+Options: $APPCONFIGOPTS/Gauss/Sim08-Beam4000GeV-md100-2012-nu2.5.py;$APPCONFIGOPTS/Gauss/DataType-2012.py;$APPCONFIGOPTS/Gauss/RICHRandomHits.py;$APPCONFIGOPTS/Gauss/NoPacking.py;$DECFILESROOT/options/@{eventType}.py;$LBPYTHIA8ROOT/options/Pythia8.py;$APPCONFIGOPTS/Gauss/G4PL_FTFP_BERT_EmNoCuts.py;$APPCONFIGOPTS/Persistency/Compression-ZLIB-1.py Options format: Multicore: N
+DDDB: dddb-20150928 Condition DB: sim-20160321-2-vc-md100 DQTag:
+Extra: AppConfig.v3r277;DecFiles.v29r6 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: Output file types: SIM(N)
+
+Step 2 Digi14a for 2012 (to use w Sim09)(129462/Digi14a) : Boole-v30r1
+System config: x86_64-slc6-gcc48-opt MC TCK:
+Options: $APPCONFIGOPTS/Boole/Default.py;$APPCONFIGOPTS/Boole/DataType-2012.py;$APPCONFIGOPTS/Boole/NoPacking.py;$APPCONFIGOPTS/Boole/Boole-SetOdinRndTrigger.py;$APPCONFIGOPTS/Persistency/Compression-ZLIB-1.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r266 Runtime projects:
+Visible: N Usable:Yes
+Input file types: SIM(N) Output file types: DIGI(N)
+
+Step 3 L0 emulation - TCK 0045(125934/L0Trig0x0045) : Moore-v20r4
+System config: NULL MC TCK:
+Options: $APPCONFIGOPTS/L0App/L0AppSimProduction.py;$APPCONFIGOPTS/L0App/L0AppTCK-0x0045.py;$APPCONFIGOPTS/L0App/DataType-2012.py Options format: l0app Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r200 Runtime projects:
+Visible: N Usable:Yes
+Input file types: DIGI(N) Output file types: DIGI(N)
+
+Step 4 TCK-0x409f0045 Flagged for Simulation 2012 (L0 separate step)(128579/Trig0x409f0045) : Moore-v14r8p1
+System config: MC TCK:
+Options: $APPCONFIGOPTS/Moore/MooreSimProductionForSeparateL0AppStep.py;$APPCONFIGOPTS/Conditions/TCK-0x409f0045.py;$APPCONFIGOPTS/Moore/DataType-2012.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r241 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DIGI(N) Output file types: DIGI(N)
+
+Step 5 Reco14c for MC - 2012 - to be used with Sim09(128808/Reco14c) : Brunel-v43r2p11
+System config: x86_64-slc5-gcc46-opt MC TCK:
+Options: $APPCONFIGOPTS/Brunel/DataType-2012.py;$APPCONFIGOPTS/Brunel/MC-WithTruth.py;$APPCONFIGOPTS/Brunel/Sim09-Run1.py;$APPCONFIGOPTS/Persistency/DST-multipleTCK-2012.py;$APPCONFIGOPTS/Persistency/Compression-ZLIB-1.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r246 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DIGI(N) Output file types: DST(N)
+
+Step 6 Stripping21-NoPrescalingFlagged for Sim09 (I/O DST)(129669/Stripping21NoPrescalingFlagged) : DaVinci-v36r1p3
+System config: x86_64-slc6-gcc48-opt MC TCK:
+Options: $APPCONFIGOPTS/DaVinci/DV-Stripping21-Stripping-MC-NoPrescaling.py;$APPCONFIGOPTS/DaVinci/DV-RedoCaloPID-Stripping21.py;$APPCONFIGOPTS/DaVinci/DataType-2012.py;$APPCONFIGOPTS/DaVinci/InputType-DST.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r277 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DST(N) Output file types: ALLSTREAMS.DST(Y)
+
+
+Inform also: david.gerick@cern.ch
+
+Comments
+Model for 2012 data taking conditions, Reco14c and Stripping21 - Magnet DOWN
+
+Model for 2012 average nominal conditions over the whole year
+
+This model has the whole processing chain for data: L0, HLT, Reco, Stripping.
+
+It has the most representative TCK as recommened by the trigger, Reco14, and Stripping 21
+
+The output is DST in this first version.
+
+To use the incremental Stripping21r0p1 with DST output replace the last step with stepID = 129453
+
+Comment by kreps on Jun 15, 2016:
+Updated to DecFiles v29r1
+
+Comment by kreps on Jul 07, 2016:
+Updated to DecFiles v29r2
+
+Comment by gcorti on Jul 19, 2016:
+To produce LDST output you need to replace the last two steps:
+- use stepID = 129051 for Reco14c
+- use stepID = 129052 for Stripping21
+
+Comment by kreps on Jul 21, 2016:
+Updated to DecFiles v29r3
+
+Comment by kreps on Aug 11, 2016:
+Updated to DecFiles v29r4
+
+Comment by kreps on Aug 23, 2016:
+Updated to DecFiles v29r5
+
+Comment by kreps on Sep 16, 2016:
+Updated to DecFiles v29r6
diff --git a/Code/Ganga/SimulationDetails/RefMC_2015Down.txt b/Code/Ganga/SimulationDetails/RefMC_2015Down.txt
new file mode 100644
index 0000000..875f72f
--- /dev/null
+++ b/Code/Ganga/SimulationDetails/RefMC_2015Down.txt
@@ -0,0 +1,139 @@
+ID: 51692
+Name: B2CC - Sim09e - Bu_JpsiKst -2015 - MD - Pythia8
+Type: Simulation
+State: Done
+Priority: 1a
+Author: pmackowi WG: B2CC
+Event type:
+Number of events:
+Starting Date: 2019-03-01
+Finalization Date: 2019-04-01
+Fast Simulation Type: None
+Retention Rate: 1
+
+Simulation Conditions: Beam6500GeV-2015-MagDown-Nu1.6-25ns-Pythia8
+Beam: beta*~3m, zpv=8.64mm, xAngle=-0.395mrad and yAngle=0 Beam energy: 6500 GeV Generator: Pythia8 G4 settings: specified in sim step
+Magnetic field: -1 Detector: 2015, Velo closed around average x=0.788mm and y=0.091mm Luminosity: pp collisions nu = 1.6, 25ns spillover
+
+Processing Pass: Sim09e/Trig0x411400a2/Reco15a/Turbo02/Stripping24r1NoPrescalingFlagged
+MC Version: 2015
+Step 1 Sim09e - 2015 Nominal - MD - Nu1.6 (Lumi 4 at 25ns) - 25ns spillover - Pythia8(137736/Sim09e) : Gauss-v49r11
+System config: x86_64-slc6-gcc48-opt MC TCK:
+Options: $APPCONFIGOPTS/Gauss/Beam6500GeV-md100-2015-nu1.6.py;$APPCONFIGOPTS/Gauss/EnableSpillover-25ns.py;$APPCONFIGOPTS/Gauss/DataType-2015.py;$APPCONFIGOPTS/Gauss/RICHRandomHits.py;$DECFILESROOT/options/@{eventType}.py;$LBPYTHIA8ROOT/options/Pythia8.py;$APPCONFIGOPTS/Gauss/G4PL_FTFP_BERT_EmNoCuts.py Options format: Multicore: N
+DDDB: dddb-20170721-3 Condition DB: sim-20161124-vc-md100 DQTag:
+Extra: AppConfig.v3r359;DecFiles.v30r26 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: Output file types: SIM
+
+Step 2 Digi14c for 2015 - 25ns spillover(133533/Digi14c) : Boole-v30r3
+System config: x86_64-slc6-gcc49-opt MC TCK:
+Options: $APPCONFIGOPTS/Boole/Default.py;$APPCONFIGOPTS/Boole/EnableSpillover.py;$APPCONFIGOPTS/Boole/DataType-2015.py;$APPCONFIGOPTS/Boole/Boole-SetOdinRndTrigger.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r338 Runtime projects:
+Visible: N Usable:Yes
+Input file types: SIM Output file types: DIGI
+
+Step 3 L0 emulation for 2015 - TCK 0x00a2(129526/L0Trig0x00a2) : Moore-v24r2
+System config: x86_64-slc6-gcc48-opt MC TCK:
+Options: $APPCONFIGOPTS/L0App/L0AppSimProduction.py;$APPCONFIGOPTS/L0App/L0AppTCK-0x00a2.py;$APPCONFIGOPTS/L0App/ForceLUTVersionV8.py;$APPCONFIGOPTS/L0App/DataType-2015.py;$APPCONFIGOPTS/Persistency/Compression-ZLIB-1.py Options format: l0app Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r268 Runtime projects:
+Visible: N Usable:Yes
+Input file types: DIGI(N) Output file types: DIGI(N)
+
+Step 4 TCK-0x411400a2 Flagged for 2015(129527/Trig0x411400a2) : Moore-v24r2
+System config: x86_64-slc6-gcc48-opt MC TCK:
+Options: $APPCONFIGOPTS/Moore/MooreSimProductionForSeparateL0AppStep2015.py;$APPCONFIGOPTS/Conditions/TCK-0x411400a2.py;$APPCONFIGOPTS/Moore/DataType-2015.py;$APPCONFIGOPTS/Persistency/Compression-ZLIB-1.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r268 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DIGI(N) Output file types: DIGI(N)
+
+Step 5 Reco15a for MC 2015(130611/Reco15a) : Brunel-v48r2p1
+System config: x86_64-slc6-gcc48-opt MC TCK:
+Options: $APPCONFIGOPTS/Brunel/DataType-2015.py;$APPCONFIGOPTS/Brunel/MC-WithTruth.py;$APPCONFIGOPTS/Persistency/Compression-ZLIB-1.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r277;SQLDDDB.v7r10 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DIGI(N) Output file types: DST(N)
+
+Step 6 Turbo lines (MC), Turbo 2015 reprocessing(129522/Turbo02) : DaVinci-v40r1p3
+System config: x86_64-slc6-gcc48-opt MC TCK:
+Options: $APPCONFIGOPTS/Turbo/Tesla_AllHlt2Lines_v10r0_0x00fa0051.py;$APPCONFIGOPTS/Turbo/Tesla_Simulation_2015_PVHLT2.py Options format: Tesla Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r232;TurboStreamProd.v2r0 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DST(N) Output file types: DST(N)
+
+Step 7 Stripping24r1-NoPrescalingFlagged for Sim09 - pp at 13 TeV (DST)(132857/Stripping24r1NoPrescalingFlagged) : DaVinci-v38r1p6
+System config: x86_64-slc6-gcc49-opt MC TCK:
+Options: $APPCONFIGOPTS/DaVinci/DV-Stripping24r1-Stripping-MC-NoPrescaling-DST.py;$APPCONFIGOPTS/DaVinci/DataType-2015.py;$APPCONFIGOPTS/DaVinci/InputType-DST.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r343 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DST Output file types: ALLSTREAMS.DST
+
+
+Inform also: chefdevi@lapp.in2p3.fr
+
+Comments
+Model for 2015 average nominal conditions at 25ns - Magnet DOWN
+This model has the whole processing chain for data: L0, HLT, Reco, Turbo, Stripping.
+It has the most representative TCK as recommended by the trigger, Reco15a, Turbo02 reprocessing and Stripping24.
+
+************************************************************
+Default output is microDST. For DST or LDST output, see LHCBGAUSS-1184
+************************************************************
+
+Comment by kreps on Sep 01, 2017:
+Update to DecFiles v30r2
+
+Comment by kreps on Sep 15, 2017:
+Update to DecFiles v30r3
+
+Comment by kreps on Oct 10, 2017:
+Update to DecFiles v30r4
+
+Comment by kreps on Oct 27, 2017:
+Update to DecFiles v30r5
+
+Comment by kreps on Nov 10, 2017:
+Update to DecFiles v30r6
+
+Comment by kreps on Dec 02, 2017: Update to DecFiles v30r7
+
+Comment by kreps on Dec 20, 2017: Update to DecFiles v30r8
+
+Comment by kreps on Jan 20, 2018: Update to DecFiles v30r9
+
+Comment by kreps on Feb 03, 2018: Update to DecFiles v30r10
+
+Comment by kreps on Feb 15, 2018: Update to DecFiles v30r11
+
+Comment by kreps on Mar 01, 2018: Update to DecFiles v30r12
+
+Comment by kreps on Mar 15, 2018: Update to DecFiles v30r13
+
+Update to DecFiles v30r14
+
+Comment by kreps on Apr 10, 2018: Update to DecFiles v30r15
+
+Comment by kreps on Apr 30, 2018: Update to DecFiles 30r16 and Boole v30r3
+
+Comment by kreps on May 23, 2018: Update to DecFiles 30r17, AppConfig v3r359 and Gauss v49r10 (and change to Sim09d)
+
+Comment by kreps on Jun 08, 2018: Update to DecFiles v30r18
+
+Comment by kreps on Jul 10, 2018: Update to DecFiles v30r19
+
+Comment by kreps on Jul 19, 2018: Update to DecFiles v30r20
+
+Comment by kreps on Aug 09, 2018: Update to DecFiles v30r21
+
+Comment by kreps on Sep 03, 2018: Update to DecFiles v30r23
+
+Comment by kreps on Oct 16, 2018: Update to DecFiles v30r24
+
+Comment by kreps on Nov 02, 2018: Update to DecFiles v30r25 and Gauss v49r11 (and change to Sim09e)
+
+Comment by kreps on Dec 11, 2018: Update to DecFiles v30r26
diff --git a/Code/Ganga/SimulationDetails/RefMC_2016Down.txt b/Code/Ganga/SimulationDetails/RefMC_2016Down.txt
new file mode 100644
index 0000000..65aeecf
--- /dev/null
+++ b/Code/Ganga/SimulationDetails/RefMC_2016Down.txt
@@ -0,0 +1,151 @@
+ID: 51712
+Name: B2CC - Sim09e - Bu_JpsiKst -2016 - MD - Pythia8
+Type: Simulation
+State: Done
+Priority: 1a
+Author: pmackowi WG: B2CC
+Event type:
+Number of events:
+Starting Date: 2019-03-01
+Finalization Date: 2019-04-01
+Fast Simulation Type: None
+Retention Rate: 1
+
+Simulation Conditions: Beam6500GeV-2016-MagDown-Nu1.6-25ns-Pythia8
+Beam: beta*~3m, zpv=-3.1mm, xAngle=-0.395mrad and yAngle=0 Beam energy: 6500 GeV Generator: Pythia8 G4 settings: specified in sim step
+Magnetic field: -1 Detector: 2016, Velo closed around average x=0.84mm and y=-0.18mm Luminosity: pp collisions nu = 1.6, 25ns spillover
+
+Processing Pass: Sim09e/Trig0x6139160F/Reco16/Turbo03/Stripping28r1NoPrescalingFlagged
+MC Version: 2016
+Step 1 Sim09e - 2016 - MD - Nu1.6 (Lumi 4 at 25ns) - 25ns spillover - Pythia8(137734/Sim09e) : Gauss-v49r11
+System config: x86_64-slc6-gcc48-opt MC TCK:
+Options: $APPCONFIGOPTS/Gauss/Beam6500GeV-md100-2016-nu1.6.py;$APPCONFIGOPTS/Gauss/EnableSpillover-25ns.py;$APPCONFIGOPTS/Gauss/DataType-2016.py;$APPCONFIGOPTS/Gauss/RICHRandomHits.py;$DECFILESROOT/options/@{eventType}.py;$LBPYTHIA8ROOT/options/Pythia8.py;$APPCONFIGOPTS/Gauss/G4PL_FTFP_BERT_EmNoCuts.py Options format: Multicore: N
+DDDB: dddb-20170721-3 Condition DB: sim-20170721-2-vc-md100 DQTag:
+Extra: AppConfig.v3r359;DecFiles.v30r26 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: Output file types: SIM
+
+Step 2 Digi14c for 2015 - 25ns spillover(133533/Digi14c) : Boole-v30r3
+System config: x86_64-slc6-gcc49-opt MC TCK:
+Options: $APPCONFIGOPTS/Boole/Default.py;$APPCONFIGOPTS/Boole/EnableSpillover.py;$APPCONFIGOPTS/Boole/DataType-2015.py;$APPCONFIGOPTS/Boole/Boole-SetOdinRndTrigger.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r338 Runtime projects:
+Visible: N Usable:Yes
+Input file types: SIM Output file types: DIGI
+
+Step 3 L0 emulation for 2016 - TCK 0x160F - DIGI(130088/L0Trig0x160F) : Moore-v25r4
+System config: x86_64-slc6-gcc48-opt MC TCK:
+Options: $APPCONFIGOPTS/L0App/L0AppSimProduction.py;$APPCONFIGOPTS/L0App/L0AppTCK-0x160F.py;$APPCONFIGOPTS/L0App/ForceLUTVersionV8.py;$APPCONFIGOPTS/L0App/DataType-2016.py;$APPCONFIGOPTS/Persistency/Compression-ZLIB-1.py Options format: l0app Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r297 Runtime projects:
+Visible: N Usable:Yes
+Input file types: DIGI(N) Output file types: DIGI(N)
+
+Step 4 TCK-0x5138160F (HLT1) Flagged for 2016 - DIGI(130089/Trig0x5138160F) : Moore-v25r4
+System config: x86_64-slc6-gcc48-opt MC TCK:
+Options: $APPCONFIGOPTS/Moore/MooreSimProductionForSeparateL0AppStep2015.py;$APPCONFIGOPTS/Conditions/TCK-0x5138160F.py;$APPCONFIGOPTS/Moore/DataType-2016.py;$APPCONFIGOPTS/Persistency/Compression-ZLIB-1.py;$APPCONFIGOPTS/Moore/MooreSimProductionHlt1.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r297 Runtime projects:
+Visible: N Usable:Yes
+Input file types: DIGI(N) Output file types: DIGI(N)
+
+Step 5 TCK-0x6139160F (HLT2) Flagged for 2016 - DIGI(133524/Trig0x6139160F) : Moore-v25r4
+System config: x86_64-slc6-gcc48-opt MC TCK:
+Options: $APPCONFIGOPTS/Moore/MooreSimProductionForSeparateL0AppStep2015.py;$APPCONFIGOPTS/Conditions/TCK-0x6139160F.py;$APPCONFIGOPTS/Moore/DataType-2016.py;$APPCONFIGOPTS/Persistency/Compression-ZLIB-1.py;$APPCONFIGOPTS/Moore/MooreSimProductionHlt2.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r355 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DIGI Output file types: DIGI
+
+Step 6 Reco16 for MC 2016(133720/Reco16) : Brunel-v50r4
+System config: x86_64-slc6-gcc62-opt MC TCK:
+Options: $APPCONFIGOPTS/Brunel/DataType-2016.py;$APPCONFIGOPTS/Brunel/MC-WithTruth.py;$APPCONFIGOPTS/Brunel/SplitRawEventOutput.4.3.py;$APPCONFIGOPTS/Persistency/Compression-ZLIB-1.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r314;SQLDDDB.v7r10 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DIGI Output file types: DST
+
+Step 7 Turbo lines (MC), Turbo 2016 - Stripping28 - DST(131792/Turbo03) : DaVinci-v41r4p3
+System config: x86_64-slc6-gcc48-opt MC TCK:
+Options: $APPCONFIGOPTS/Turbo/Tesla_2016_LinesFromStreams_MC.py;$APPCONFIGOPTS/Turbo/Tesla_PR_Truth_2016.py;$APPCONFIGOPTS/Turbo/Tesla_Simulation_2016.py Options format: Tesla Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r322;TurboStreamProd.v4r1p4 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DST Output file types: DST
+
+Step 8 Stripping28r1-NoPrescalingFlagged for Sim09 - pp at 13 TeV - DST(132983/Stripping28r1NoPrescalingFlagged) : DaVinci-v41r4p4
+System config: x86_64-slc6-gcc49-opt MC TCK:
+Options: $APPCONFIGOPTS/DaVinci/DV-Stripping28r1-Stripping-MC-NoPrescaling-DST.py;$APPCONFIGOPTS/DaVinci/DataType-2016.py;$APPCONFIGOPTS/DaVinci/InputType-DST.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r348;TMVAWeights.v1r9 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DST Output file types: ALLSTREAMS.DST
+
+
+Inform also: chefdevi@lapp.in2p3.fr
+
+Comments
+Model for 2016 average nominal conditions at 25ns - Magnet DOWN
+This model has the whole processing chain for data: L0, HLT1, HLT2, Reco, Turbo, Stripping.
+It has the most representative TCK as recommended by the trigger, Reco16, Turbo03 reprocessing and Stripping28.
+
+************************************************************
+Default output is microDST. For DST or LDST output, see LHCBGAUSS-1183
+************************************************************
+
+Comment by kreps on Sep 01, 2017:
+Update to DecFiles v30r2
+
+Comment by kreps on Sep 15, 2017:
+Update to DecFiles v30r3
+
+Comment by kreps on Oct 10, 2017:
+Update to DecFiles v30r4
+
+Comment by kreps on Oct 27, 2017:
+Update to DecFiles v30r5
+
+Comment by kreps on Nov 10, 2017:
+Update to DecFiles v30r6
+
+Comment by kreps on Dec 02, 2017: Update to DecFiles v30r7
+
+Comment by kreps on Dec 20, 2017: Update to DecFiles v30r8
+
+Comment by kreps on Jan 20, 2018: Update to DecFiles v30r9
+
+Comment by kreps on Feb 03, 2018: Update to DecFiles v30r10
+
+Comment by kreps on Feb 15, 2018: Update to DecFiles v30r11
+
+Comment by kreps on Mar 01, 2018: Update to DecFiles v30r12
+
+Comment by kreps on Mar 15, 2018: Update to DecFiles v30r13
+
+Update to DecFiles v30r14
+
+Comment by kreps on Apr 10, 2018: Update to DecFiles v30r15
+
+Comment by kreps on Apr 17, 2018: Update HLT2 step with correct processing path.
+
+Comment by kreps on Apr 30, 2018: Update to DecFiles 30r16 and Boole v30r3
+
+Comment by kreps on May 23, 2018: Update to DecFiles 30r17, AppConfig v3r359 and Gauss v49r10 (and change to Sim09d)
+
+Comment by kreps on Jun 08, 2018: Update to DecFiles v30r18
+
+Comment by kreps on Jun 08, 2018: Update to Brunel v50r4
+
+Comment by kreps on Jul 10, 2018: Update to DecFiles v30r19
+
+Comment by kreps on Jul 19, 2018: Update to DecFiles v30r20
+
+Comment by kreps on Aug 08, 2018: Update to DecFiles v30r21
+
+Comment by kreps on Sep 03, 2018: Update to DecFiles v30r23
+
+Comment by kreps on Oct 16, 2018: Update to DecFiles v30r24
+
+Comment by kreps on Nov 02, 2018: Update to DecFiles v30r25 and Gauss v49r11 (and change to Sim09e)
+
+Comment by kreps on Dec 11, 2018: Update to DecFiles v30r26
diff --git a/Code/Ganga/SimulationDetails/SigMC_2011Down.txt b/Code/Ganga/SimulationDetails/SigMC_2011Down.txt
new file mode 100644
index 0000000..9af2cf1
--- /dev/null
+++ b/Code/Ganga/SimulationDetails/SigMC_2011Down.txt
@@ -0,0 +1,96 @@
+ID: 32667
+Name: RDWG - Sim09a 2011 - MD - Gerick
+Type: Simulation
+State: Done
+Priority: 2a
+Author: dloh WG: RD
+Event type:
+Number of events:
+Starting Date:
+Finalization Date:
+Fast Simulation Type: None
+Retention Rate: 1
+
+Simulation Conditions: Beam3500GeV-2011-MagDown-Nu2-Pythia8
+Beam: beta*~3m, zpv=0.5mm, xAngle=-0.520mrad and yAngle=0 Beam energy: 3500 GeV Generator: Pythia8 G4 settings: specified in sim step
+Magnetic field: -1 Detector: 2011, Velo Closed around offset beam Luminosity: pp collisions nu = 2, no spillover
+
+Processing Pass: Sim09a/Trig0x40760037/Reco14c/Stripping21r1NoPrescalingFlagged
+MC Version: 2011
+Step 1 Sim09a - 2011 - MD - Pythia8(130026/Sim09a) : Gauss-v49r1
+System config: x86_64-slc6-gcc48-opt MC TCK:
+Options: $APPCONFIGOPTS/Gauss/Sim08-Beam3500GeV-md100-2011-nu2.py;$APPCONFIGOPTS/Gauss/DataType-2011.py;$APPCONFIGOPTS/Gauss/RICHRandomHits.py;$APPCONFIGOPTS/Gauss/NoPacking.py;$DECFILESROOT/options/@{eventType}.py;$LBPYTHIA8ROOT/options/Pythia8_7TeV.py;$APPCONFIGOPTS/Gauss/G4PL_FTFP_BERT_EmNoCuts.py;$APPCONFIGOPTS/Persistency/Compression-ZLIB-1.py Options format: Multicore: N
+DDDB: dddb-20160318-1 Condition DB: sim-20160614-1-vc-md100 DQTag:
+Extra: AppConfig.v3r277;DecFiles.v29r6 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: Output file types: SIM(N)
+
+Step 2 Digi14a for 2011 (to use w Sim09)(129272/Digi14a) : Boole-v30r1
+System config: x86_64-slc6-gcc48-opt MC TCK:
+Options: $APPCONFIGOPTS/Boole/Default.py;$APPCONFIGOPTS/Boole/DataType-2011.py;$APPCONFIGOPTS/Boole/NoPacking.py;$APPCONFIGOPTS/Boole/Boole-SetOdinRndTrigger.py;$APPCONFIGOPTS/Persistency/Compression-ZLIB-1.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r266 Runtime projects:
+Visible: N Usable:Yes
+Input file types: SIM(N) Output file types: DIGI(N)
+
+Step 3 L0 emulation - TCK 0037(129524/L0Trig0x0037) : Moore-v20r4
+System config: MC TCK:
+Options: $APPCONFIGOPTS/L0App/L0AppSimProduction.py;$APPCONFIGOPTS/L0App/L0AppTCK-0x0037.py;$APPCONFIGOPTS/L0App/DataType-2011.py Options format: l0app Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r268 Runtime projects:
+Visible: N Usable:Yes
+Input file types: DIGI(N) Output file types: DIGI(N)
+
+Step 4 TCK-0x40760037 Flagged for Simulation 2011(129525/Trig0x40760037) : Moore-v12r8g3
+System config: x86_64-slc5-gcc43-opt MC TCK:
+Options: $APPCONFIGOPTS/Moore/MooreSimProductionForSeparateL0AppStep.py;$APPCONFIGOPTS/Conditions/TCK-0x40760037.py;$APPCONFIGOPTS/Moore/DataType-2011.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r268 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DIGI(N) Output file types: DIGI(N)
+
+Step 5 Reco14c for MC - 2011 - to be used with Sim09(129275/Reco14c) : Brunel-v43r2p11
+System config: x86_64-slc5-gcc46-opt MC TCK:
+Options: $APPCONFIGOPTS/Brunel/DataType-2011.py;$APPCONFIGOPTS/Brunel/MC-WithTruth.py;$APPCONFIGOPTS/Brunel/Sim09-Run1.py;$APPCONFIGOPTS/Persistency/DST-multipleTCK-2011.py;$APPCONFIGOPTS/Persistency/Compression-ZLIB-1.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r262 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DIGI(N) Output file types: DST(N)
+
+Step 6 Stripping21r1-NoPrescalingFlagged for Sim09(129276/Stripping21r1NoPrescalingFlagged) : DaVinci-v36r1p3
+System config: x86_64-slc6-gcc48-opt MC TCK:
+Options: $APPCONFIGOPTS/DaVinci/DV-Stripping21r1-Stripping-MC-NoPrescaling.py;$APPCONFIGOPTS/DaVinci/DV-RedoCaloPID-Stripping21.py;$APPCONFIGOPTS/DaVinci/DataType-2011.py;$APPCONFIGOPTS/DaVinci/InputType-DST.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r263 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DST(N) Output file types: ALLSTREAMS.DST(Y)
+
+
+Inform also: david.gerick@cern.ch
+
+Comments
+Comment by gcorti on Jun 09, 2016:
+Model for 2011 average nominal conditions over the whole year - Magnet DOWN
+
+This model has the whole processing chain for data: L0, HLT, Reco, Stripping.
+
+It has the most representative TCK as recommened by the trigger, Reco14c, and Stripping 21r1
+
+The output is DST in this first version.
+
+To use the incremental Stripping21r0p1 with DST output replace the last step with stepID = 129454
+
+Comment by kreps on Jul 07, 2016:
+Update with DecFiles v29r2
+
+Comment by kreps on Jul 21, 2016:
+Updated to DecFiles v29r3
+
+Comment by kreps on Aug 11, 2016:
+Updated to DecFiles v29r4
+
+Comment by kreps on Aug 23, 2016:
+Updated to DecFiles v29r5
+
+Comment by kreps on Sep 16, 2016:
+Updated to DecFiles v29r6
diff --git a/Code/Ganga/SimulationDetails/SigMC_2012Down.txt b/Code/Ganga/SimulationDetails/SigMC_2012Down.txt
new file mode 100644
index 0000000..28412d3
--- /dev/null
+++ b/Code/Ganga/SimulationDetails/SigMC_2012Down.txt
@@ -0,0 +1,105 @@
+ID: 32669
+Name: RDWG - Sim09a 2012 - MD - Gerick
+Type: Simulation
+State: Done
+Priority: 2a
+Author: dloh WG: RD
+Event type:
+Number of events:
+Starting Date:
+Finalization Date:
+Fast Simulation Type: None
+Retention Rate: 1
+
+Simulation Conditions: Beam4000GeV-2012-MagDown-Nu2.5-Pythia8
+Beam: beta*~3m, zpv=25.7mm, xAngle=-0.236mrad and yAngle=0.100mrad Beam energy: 4000 GeV Generator: Pythia8 G4 settings: specified in sim step
+Magnetic field: -1 Detector: 2012, Velo Closed around offset beam Luminosity: pp collisions nu = 2.5, no spillover
+
+Processing Pass: Sim09a/Trig0x409f0045/Reco14c/Stripping21NoPrescalingFlagged
+MC Version: 2012
+Step 1 Sim09a - 2012 - MD - Pythia8(130024/Sim09a) : Gauss-v49r1
+System config: x86_64-slc6-gcc48-opt MC TCK:
+Options: $APPCONFIGOPTS/Gauss/Sim08-Beam4000GeV-md100-2012-nu2.5.py;$APPCONFIGOPTS/Gauss/DataType-2012.py;$APPCONFIGOPTS/Gauss/RICHRandomHits.py;$APPCONFIGOPTS/Gauss/NoPacking.py;$DECFILESROOT/options/@{eventType}.py;$LBPYTHIA8ROOT/options/Pythia8.py;$APPCONFIGOPTS/Gauss/G4PL_FTFP_BERT_EmNoCuts.py;$APPCONFIGOPTS/Persistency/Compression-ZLIB-1.py Options format: Multicore: N
+DDDB: dddb-20150928 Condition DB: sim-20160321-2-vc-md100 DQTag:
+Extra: AppConfig.v3r277;DecFiles.v29r6 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: Output file types: SIM(N)
+
+Step 2 Digi14a for 2012 (to use w Sim09)(129462/Digi14a) : Boole-v30r1
+System config: x86_64-slc6-gcc48-opt MC TCK:
+Options: $APPCONFIGOPTS/Boole/Default.py;$APPCONFIGOPTS/Boole/DataType-2012.py;$APPCONFIGOPTS/Boole/NoPacking.py;$APPCONFIGOPTS/Boole/Boole-SetOdinRndTrigger.py;$APPCONFIGOPTS/Persistency/Compression-ZLIB-1.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r266 Runtime projects:
+Visible: N Usable:Yes
+Input file types: SIM(N) Output file types: DIGI(N)
+
+Step 3 L0 emulation - TCK 0045(125934/L0Trig0x0045) : Moore-v20r4
+System config: NULL MC TCK:
+Options: $APPCONFIGOPTS/L0App/L0AppSimProduction.py;$APPCONFIGOPTS/L0App/L0AppTCK-0x0045.py;$APPCONFIGOPTS/L0App/DataType-2012.py Options format: l0app Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r200 Runtime projects:
+Visible: N Usable:Yes
+Input file types: DIGI(N) Output file types: DIGI(N)
+
+Step 4 TCK-0x409f0045 Flagged for Simulation 2012 (L0 separate step)(128579/Trig0x409f0045) : Moore-v14r8p1
+System config: MC TCK:
+Options: $APPCONFIGOPTS/Moore/MooreSimProductionForSeparateL0AppStep.py;$APPCONFIGOPTS/Conditions/TCK-0x409f0045.py;$APPCONFIGOPTS/Moore/DataType-2012.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r241 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DIGI(N) Output file types: DIGI(N)
+
+Step 5 Reco14c for MC - 2012 - to be used with Sim09(128808/Reco14c) : Brunel-v43r2p11
+System config: x86_64-slc5-gcc46-opt MC TCK:
+Options: $APPCONFIGOPTS/Brunel/DataType-2012.py;$APPCONFIGOPTS/Brunel/MC-WithTruth.py;$APPCONFIGOPTS/Brunel/Sim09-Run1.py;$APPCONFIGOPTS/Persistency/DST-multipleTCK-2012.py;$APPCONFIGOPTS/Persistency/Compression-ZLIB-1.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r246 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DIGI(N) Output file types: DST(N)
+
+Step 6 Stripping21-NoPrescalingFlagged for Sim09 (I/O DST)(129669/Stripping21NoPrescalingFlagged) : DaVinci-v36r1p3
+System config: x86_64-slc6-gcc48-opt MC TCK:
+Options: $APPCONFIGOPTS/DaVinci/DV-Stripping21-Stripping-MC-NoPrescaling.py;$APPCONFIGOPTS/DaVinci/DV-RedoCaloPID-Stripping21.py;$APPCONFIGOPTS/DaVinci/DataType-2012.py;$APPCONFIGOPTS/DaVinci/InputType-DST.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r277 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DST(N) Output file types: ALLSTREAMS.DST(Y)
+
+
+Inform also: david.gerick@cern.ch
+
+Comments
+Model for 2012 data taking conditions, Reco14c and Stripping21 - Magnet DOWN
+
+Model for 2012 average nominal conditions over the whole year
+
+This model has the whole processing chain for data: L0, HLT, Reco, Stripping.
+
+It has the most representative TCK as recommened by the trigger, Reco14, and Stripping 21
+
+The output is DST in this first version.
+
+To use the incremental Stripping21r0p1 with DST output replace the last step with stepID = 129453
+
+Comment by kreps on Jun 15, 2016:
+Updated to DecFiles v29r1
+
+Comment by kreps on Jul 07, 2016:
+Updated to DecFiles v29r2
+
+Comment by gcorti on Jul 19, 2016:
+To produce LDST output you need to replace the last two steps:
+- use stepID = 129051 for Reco14c
+- use stepID = 129052 for Stripping21
+
+Comment by kreps on Jul 21, 2016:
+Updated to DecFiles v29r3
+
+Comment by kreps on Aug 11, 2016:
+Updated to DecFiles v29r4
+
+Comment by kreps on Aug 23, 2016:
+Updated to DecFiles v29r5
+
+Comment by kreps on Sep 16, 2016:
+Updated to DecFiles v29r6
diff --git a/Code/Ganga/SimulationDetails/SigMC_2015Down.txt b/Code/Ganga/SimulationDetails/SigMC_2015Down.txt
new file mode 100644
index 0000000..faf6734
--- /dev/null
+++ b/Code/Ganga/SimulationDetails/SigMC_2015Down.txt
@@ -0,0 +1,150 @@
+ID: 39571
+Name: RDWG - Sim09b 2015 - MD - David
+Type: Simulation
+State: Done
+Priority: 1b
+Author: dloh WG: RD
+Event type:
+Number of events:
+Starting Date:
+Finalization Date:
+Fast Simulation Type: None
+Retention Rate: 1
+
+Simulation Conditions: Beam6500GeV-2015-MagDown-Nu1.6-25ns-Pythia8
+Beam: beta*~3m, zpv=8.64mm, xAngle=-0.395mrad and yAngle=0 Beam energy: 6500 GeV Generator: Pythia8 G4 settings: specified in sim step
+Magnetic field: -1 Detector: 2015, Velo closed around average x=0.788mm and y=0.091mm Luminosity: pp collisions nu = 1.6, 25ns spillover
+
+Processing Pass: Sim09b/Trig0x411400a2/Reco15a/Turbo02/Stripping24NoPrescalingFlagged
+MC Version: 2015
+Step 1 Sim09b - 2015 Nominal - MD - Nu1.6 (Lumi 4 at 25ns) - 25ns spillover - Pythia8(131149/Sim09b) : Gauss-v49r7
+System config: x86_64-slc6-gcc48-opt MC TCK:
+Options: $APPCONFIGOPTS/Gauss/Beam6500GeV-md100-2015-nu1.6.py;$APPCONFIGOPTS/Gauss/EnableSpillover-25ns.py;$APPCONFIGOPTS/Gauss/DataType-2015.py;$APPCONFIGOPTS/Gauss/RICHRandomHits.py;$DECFILESROOT/options/@{eventType}.py;$LBPYTHIA8ROOT/options/Pythia8.py;$APPCONFIGOPTS/Gauss/G4PL_FTFP_BERT_EmNoCuts.py;$APPCONFIGOPTS/Persistency/Compression-ZLIB-1.py Options format: Multicore: N
+DDDB: dddb-20150724 Condition DB: sim-20161124-vc-md100 DQTag:
+Extra: AppConfig.v3r304;DecFiles.v29r21 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: Output file types: SIM(N)
+
+Step 2 Digi14b for 2015 - 25ns spillover(130262/Digi14b) : Boole-v30r2
+System config: x86_64-slc6-gcc49-opt MC TCK:
+Options: $APPCONFIGOPTS/Boole/Default.py;$APPCONFIGOPTS/Boole/EnableSpillover.py;$APPCONFIGOPTS/Boole/DataType-2015.py;$APPCONFIGOPTS/Boole/Boole-SetOdinRndTrigger.py;$APPCONFIGOPTS/Persistency/Compression-ZLIB-1.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r304 Runtime projects:
+Visible: N Usable:Yes
+Input file types: SIM(N) Output file types: DIGI(N)
+
+Step 3 L0 emulation for 2015 - TCK 0x00a2(129526/L0Trig0x00a2) : Moore-v24r2
+System config: x86_64-slc6-gcc48-opt MC TCK:
+Options: $APPCONFIGOPTS/L0App/L0AppSimProduction.py;$APPCONFIGOPTS/L0App/L0AppTCK-0x00a2.py;$APPCONFIGOPTS/L0App/ForceLUTVersionV8.py;$APPCONFIGOPTS/L0App/DataType-2015.py;$APPCONFIGOPTS/Persistency/Compression-ZLIB-1.py Options format: l0app Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r268 Runtime projects:
+Visible: N Usable:Yes
+Input file types: DIGI(N) Output file types: DIGI(N)
+
+Step 4 TCK-0x411400a2 Flagged for 2015(129527/Trig0x411400a2) : Moore-v24r2
+System config: x86_64-slc6-gcc48-opt MC TCK:
+Options: $APPCONFIGOPTS/Moore/MooreSimProductionForSeparateL0AppStep2015.py;$APPCONFIGOPTS/Conditions/TCK-0x411400a2.py;$APPCONFIGOPTS/Moore/DataType-2015.py;$APPCONFIGOPTS/Persistency/Compression-ZLIB-1.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r268 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DIGI(N) Output file types: DIGI(N)
+
+Step 5 Reco15a for MC 2015(130611/Reco15a) : Brunel-v48r2p1
+System config: x86_64-slc6-gcc48-opt MC TCK:
+Options: $APPCONFIGOPTS/Brunel/DataType-2015.py;$APPCONFIGOPTS/Brunel/MC-WithTruth.py;$APPCONFIGOPTS/Persistency/Compression-ZLIB-1.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r277;SQLDDDB.v7r10 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DIGI(N) Output file types: DST(N)
+
+Step 6 Turbo lines (MC), Turbo 2015 reprocessing(129522/Turbo02) : DaVinci-v40r1p3
+System config: x86_64-slc6-gcc48-opt MC TCK:
+Options: $APPCONFIGOPTS/Turbo/Tesla_AllHlt2Lines_v10r0_0x00fa0051.py;$APPCONFIGOPTS/Turbo/Tesla_Simulation_2015_PVHLT2.py Options format: Tesla Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r232;TurboStreamProd.v2r0 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DST(N) Output file types: DST(N)
+
+Step 7 Stripping24-NoPrescalingFlagged for Sim09 - pp at 13 TeV (muDST)(129665/Stripping24NoPrescalingFlagged) : DaVinci-v38r1p1
+System config: x86_64-slc6-gcc48-opt MC TCK:
+Options: $APPCONFIGOPTS/DaVinci/DV-Stripping24-Stripping-MC-NoPrescaling.py;$APPCONFIGOPTS/DaVinci/DV-Stripping-MC-muDST.py;$APPCONFIGOPTS/DaVinci/DataType-2015.py;$APPCONFIGOPTS/DaVinci/InputType-DST.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r277 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DST(N) Output file types: ALLSTREAMS.MDST(Y)
+
+
+Inform also: david.gerick@cern.ch
+
+Comments
+Model for 2015 average nominal conditions at 25ns - from Sep. to Dec. - Magnet DOWN
+
+This model has the whole processing chain for data: L0, HLT, Reco, Turbo, Stripping.
+
+It has the most representative TCK as recommened by the trigger, Reco15a, Turbo02 reproccessing and Stripping 24.
+
+The output is microDST:
+in case of DST output you need to change the last step with stepID = 129267
+
+Comment by kreps on Jun 15, 2016:
+Updated to DecFiles v29r1
+
+Comment by kreps on Jul 07, 2016:
+Updated to DecFiles v29r2
+
+Comment by kreps on Jul 21, 2016:
+Updated to DecFiles v29r3
+
+Comment by kreps on Aug 11, 2016:
+Updated to DecFiles v29r4
+
+Comment by kreps on Aug 23, 2016:
+Updated to DecFiles v29r5
+
+Comment by kreps on Sep 16, 2016:
+Updated to DecFiles v29r6
+
+Comment by kreps on Oct 07, 2016:
+Updated to DecFiles v29r7
+
+Comment by kreps on Oct 21, 2016:
+Update to DecFiles v29r8 and Gauss v49r4
+
+Comment by kreps on Nov 11, 2016:
+Update to DecFiles v29r9
+
+Comment by rcenci on Dec 01, 2016:
+Updated to Sim09b: Gauss v45r5, Decfiles v29r10, Digi14b
+
+Comment by kreps on Dec 21, 2016:
+Updated to Gauss v49r6, DecFiles v29r11
+
+Comment by kreps on Jan 17, 2017:
+Update to DecFiles v29r12
+
+Comment by kreps on Jan 31, 2017:
+Update to DecFiles v29r13
+
+Comment by kreps on Feb 08, 2017:
+Update to DecFiles v29r14
+
+Comment by kreps on Feb 22, 2017:
+Update to DecFiles v29r15
+
+Comment by kreps on Mar 08, 2017:
+Update to DecFiles v29r16
+
+Comment by kreps on Mar 24, 2017:
+Update to DecFiles v29r17
+
+Comment by kreps on Apr 06, 2017:
+Update to DecFiles v29r18
+
+Comment by kreps on Apr 28, 2017:
+Update to DecFiles v29r19
+
+Comment by kreps on May 10, 2017:
+Update to DecFiles v29r20
+
+Comment by kreps on May 23, 2017:
+Update to DecFiles v29r21
diff --git a/Code/Ganga/SimulationDetails/SigMC_2016Down.txt b/Code/Ganga/SimulationDetails/SigMC_2016Down.txt
new file mode 100644
index 0000000..0fde11a
--- /dev/null
+++ b/Code/Ganga/SimulationDetails/SigMC_2016Down.txt
@@ -0,0 +1,94 @@
+ID: 41308
+Name: PPGOK_2017-05-25 38975 2a RDWG - Sim09b 2016 - MD - David
+Type: Simulation
+State: Done
+Priority: 1b
+Author: dloh WG: RD
+Event type:
+Number of events:
+Starting Date:
+Finalization Date:
+Fast Simulation Type: None
+Retention Rate: 1
+
+Simulation Conditions: Beam6500GeV-2016-MagDown-Nu1.6-25ns-Pythia8
+Beam: beta*~3m, zpv=-3.1mm, xAngle=-0.395mrad and yAngle=0 Beam energy: 6500 GeV Generator: Pythia8 G4 settings: specified in sim step
+Magnetic field: -1 Detector: 2016, Velo closed around average x=0.84mm and y=-0.18mm Luminosity: pp collisions nu = 1.6, 25ns spillover
+
+Processing Pass: Sim09c/Trig0x6138160F/Reco16/Turbo03/Stripping28NoPrescalingFlagged
+MC Version: 2016
+Step 1 Sim09c - 2016 - MD - Nu1.6 (Lumi 4 at 25ns) - 25ns spillover - Pythia8(131974/Sim09c) : Gauss-v49r8
+System config: x86_64-slc6-gcc48-opt MC TCK:
+Options: $APPCONFIGOPTS/Gauss/Beam6500GeV-md100-2016-nu1.6.py;$APPCONFIGOPTS/Gauss/EnableSpillover-25ns.py;$APPCONFIGOPTS/Gauss/DataType-2016.py;$APPCONFIGOPTS/Gauss/RICHRandomHits.py;$DECFILESROOT/options/@{eventType}.py;$LBPYTHIA8ROOT/options/Pythia8.py;$APPCONFIGOPTS/Gauss/G4PL_FTFP_BERT_EmNoCuts.py Options format: Multicore: N
+DDDB: dddb-20170721-3 Condition DB: sim-20170721-2-vc-md100 DQTag:
+Extra: AppConfig.v3r335;DecFiles.v30r1 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: Output file types: SIM
+
+Step 2 Digi14b for 2015 - 25ns spillover(130262/Digi14b) : Boole-v30r2
+System config: x86_64-slc6-gcc49-opt MC TCK:
+Options: $APPCONFIGOPTS/Boole/Default.py;$APPCONFIGOPTS/Boole/EnableSpillover.py;$APPCONFIGOPTS/Boole/DataType-2015.py;$APPCONFIGOPTS/Boole/Boole-SetOdinRndTrigger.py;$APPCONFIGOPTS/Persistency/Compression-ZLIB-1.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r304 Runtime projects:
+Visible: N Usable:Yes
+Input file types: SIM(N) Output file types: DIGI(N)
+
+Step 3 L0 emulation for 2016 - TCK 0x160F - DIGI(130088/L0Trig0x160F) : Moore-v25r4
+System config: x86_64-slc6-gcc48-opt MC TCK:
+Options: $APPCONFIGOPTS/L0App/L0AppSimProduction.py;$APPCONFIGOPTS/L0App/L0AppTCK-0x160F.py;$APPCONFIGOPTS/L0App/ForceLUTVersionV8.py;$APPCONFIGOPTS/L0App/DataType-2016.py;$APPCONFIGOPTS/Persistency/Compression-ZLIB-1.py Options format: l0app Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r297 Runtime projects:
+Visible: N Usable:Yes
+Input file types: DIGI(N) Output file types: DIGI(N)
+
+Step 4 TCK-0x5138160F (HLT1) Flagged for 2016 - DIGI(130089/Trig0x5138160F) : Moore-v25r4
+System config: x86_64-slc6-gcc48-opt MC TCK:
+Options: $APPCONFIGOPTS/Moore/MooreSimProductionForSeparateL0AppStep2015.py;$APPCONFIGOPTS/Conditions/TCK-0x5138160F.py;$APPCONFIGOPTS/Moore/DataType-2016.py;$APPCONFIGOPTS/Persistency/Compression-ZLIB-1.py;$APPCONFIGOPTS/Moore/MooreSimProductionHlt1.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r297 Runtime projects:
+Visible: N Usable:Yes
+Input file types: DIGI(N) Output file types: DIGI(N)
+
+Step 5 TCK-0x6139160F (HLT2) Flagged for 2016 - DIGI(130090/Trig0x6138160F) : Moore-v25r4
+System config: x86_64-slc6-gcc48-opt MC TCK:
+Options: $APPCONFIGOPTS/Moore/MooreSimProductionForSeparateL0AppStep2015.py;$APPCONFIGOPTS/Conditions/TCK-0x6139160F.py;$APPCONFIGOPTS/Moore/DataType-2016.py;$APPCONFIGOPTS/Persistency/Compression-ZLIB-1.py;$APPCONFIGOPTS/Moore/MooreSimProductionHlt2.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r297 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DIGI(N) Output file types: DIGI(N)
+
+Step 6 Reco16 for MC 2016(130615/Reco16) : Brunel-v50r2
+System config: x86_64-slc6-gcc49-opt MC TCK:
+Options: $APPCONFIGOPTS/Brunel/DataType-2016.py;$APPCONFIGOPTS/Brunel/MC-WithTruth.py;$APPCONFIGOPTS/Brunel/SplitRawEventOutput.4.3.py;$APPCONFIGOPTS/Persistency/Compression-ZLIB-1.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r314;SQLDDDB.v7r10 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DIGI Output file types: DST
+
+Step 7 Turbo lines (MC), Turbo 2016 - Stripping28 - uDST(131791/Turbo03) : DaVinci-v41r4p3
+System config: x86_64-slc6-gcc48-opt MC TCK:
+Options: $APPCONFIGOPTS/Turbo/Tesla_2016_LinesFromStreams_MC.py;$APPCONFIGOPTS/Turbo/Tesla_PR_Truth_2016.py;$APPCONFIGOPTS/Turbo/Tesla_Simulation_2016.py;$APPCONFIGOPTS/Turbo/Tesla_FilterMC.py Options format: Tesla Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r322;TurboStreamProd.v4r1p4 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DST Output file types: DST
+
+Step 8 Stripping28-NoPrescalingFlagged for Sim09 - pp at 13 TeV (muDST)(131990/Stripping28NoPrescalingFlagged) : DaVinci-v41r4p3
+System config: x86_64-slc6-gcc49-opt MC TCK:
+Options: $APPCONFIGOPTS/DaVinci/DV-Stripping28-Stripping-MC-NoPrescaling-DST.py;$APPCONFIGOPTS/DaVinci/DataType-2016.py;APPCONFIGOPTS/DaVinci/InputType-DST.py;$APPCONFIGOPTS/DaVinci/DV-Stripping-MC-muDST.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r316;TMVAWeights.v1r8 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DST Output file types: ALLSTREAMS.MDST
+
+
+Inform also: david.gerick@cern.ch
+
+Comments
+Model for 2016 average nominal conditions at 25ns - Magnet DOWN
+This model has the whole processing chain for data: L0, HLT1, HLT2, Reco, Turbo, Stripping.
+It has the most representative TCK as recommened by the trigger, Reco16, Turbo03 reproccessing and Stripping28.
+
+************************************************************
+Default output is microDST. For DST or LDST output, see LHCBGAUSS-1183
+************************************************************
diff --git a/Code/Ganga/SimulationDetails/SigMC_2017Down.txt b/Code/Ganga/SimulationDetails/SigMC_2017Down.txt
new file mode 100644
index 0000000..f2d6083
--- /dev/null
+++ b/Code/Ganga/SimulationDetails/SigMC_2017Down.txt
@@ -0,0 +1,96 @@
+ID: 51390
+Name: RDWG - Sim09e Model for 2017 - MD - Pythia8 - B+ -> K*+ mu mu
+Type: Simulation
+State: Done
+Priority: 1a
+Author: liferrei WG: RD
+Event type:
+Number of events:
+Starting Date: 2018-12-21
+Finalization Date: 2019-01-21
+Fast Simulation Type: None
+Retention Rate: 1
+
+Simulation Conditions: Beam6500GeV-2017-MagDown-Nu1.6-25ns-Pythia8
+Beam: beta*~3m, zpv=-1.36mm, xAngle=-0.395mrad and yAngle=0 Beam energy: 6500 GeV Generator: Pythia8 G4 settings: specified in sim step
+Magnetic field: -1 Detector: 2017, Velo closed around average x=0.81mm and y=-0.10mm Luminosity: pp collisions nu = 1.6, 25ns spillover
+
+Processing Pass: Sim09e/Trig0x62661709/Reco17/Turbo04a-WithTurcal/Stripping29r2NoPrescalingFlagged
+MC Version: 2017
+Step 1 Sim09e - 2017 - MD - Nu1.6 (Lumi 4 at 25ns) - 25ns spillover - Pythia8(137732/Sim09e) : Gauss-v49r11
+System config: x86_64-slc6-gcc48-opt MC TCK:
+Options: $APPCONFIGOPTS/Gauss/Beam6500GeV-md100-2017-nu1.6.py;$APPCONFIGOPTS/Gauss/EnableSpillover-25ns.py;$APPCONFIGOPTS/Gauss/DataType-2016.py;$APPCONFIGOPTS/Gauss/RICHRandomHits.py;$DECFILESROOT/options/@{eventType}.py;$LBPYTHIA8ROOT/options/Pythia8.py;$APPCONFIGOPTS/Gauss/G4PL_FTFP_BERT_EmNoCuts.py Options format: Multicore: N
+DDDB: dddb-20170721-3 Condition DB: sim-20180411-vc-md100 DQTag:
+Extra: AppConfig.v3r372;DecFiles.v30r26 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: Output file types: SIM
+
+Step 2 Digi14c for 2015 - 25ns spillover(133533/Digi14c) : Boole-v30r3
+System config: x86_64-slc6-gcc49-opt MC TCK:
+Options: $APPCONFIGOPTS/Boole/Default.py;$APPCONFIGOPTS/Boole/EnableSpillover.py;$APPCONFIGOPTS/Boole/DataType-2015.py;$APPCONFIGOPTS/Boole/Boole-SetOdinRndTrigger.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r338 Runtime projects:
+Visible: N Usable:Yes
+Input file types: SIM Output file types: DIGI
+
+Step 3 L0 emulation for 2017 - TCK 0x1709 - DIGI(133514/L0Trig0x1709) : Moore-v26r6p1
+System config: x86_64-slc6-gcc62-opt MC TCK:
+Options: $APPCONFIGOPTS/L0App/L0AppSimProduction.py;$APPCONFIGOPTS/L0App/L0AppTCK-0x1709.py;$APPCONFIGOPTS/L0App/ForceLUTVersionV8.py;$APPCONFIGOPTS/L0App/DataType-2017.py Options format: l0app Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r356 Runtime projects:
+Visible: N Usable:Yes
+Input file types: DIGI Output file types: DIGI
+
+Step 4 TCK-0x51611709 (HLT1) Flagged for 2017 - DIGI(133515/Trig0x51611709) : Moore-v26r6p1
+System config: x86_64-slc6-gcc62-opt MC TCK:
+Options: $APPCONFIGOPTS/Moore/MooreSimProductionForSeparateL0AppStep2015.py;$APPCONFIGOPTS/Conditions/TCK-0x51611709.py;$APPCONFIGOPTS/Moore/DataType-2017.py;$APPCONFIGOPTS/Moore/MooreSimProductionHlt1.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r356 Runtime projects:
+Visible: N Usable:Yes
+Input file types: DIGI Output file types: DIGI
+
+Step 5 TCK-0x62661709 (HLT2) Flagged for 2017 - DIGI(137501/Trig0x62661709) : Moore-v26r6p1
+System config: x86_64-slc6-gcc62-opt MC TCK:
+Options: $APPCONFIGOPTS/Moore/MooreSimProductionForSeparateL0AppStep2015.py;$APPCONFIGOPTS/Conditions/TCK-0x62661709.py;$APPCONFIGOPTS/Moore/DataType-2017.py;$APPCONFIGOPTS/Moore/MooreSimProductionHlt2.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r369 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DIGI Output file types: DIGI
+
+Step 6 Reco17 for MC 2017(132254/Reco17) : Brunel-v52r6p1
+System config: x86_64-slc6-gcc62-opt MC TCK:
+Options: $APPCONFIGOPTS/Brunel/DataType-2017.py;$APPCONFIGOPTS/Brunel/MC-WithTruth.py;$APPCONFIGOPTS/Brunel/SplitRawEventOutput.4.3.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r338;SQLDDDB.v7r10 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DIGI Output file types: DST
+
+Step 7 Turbo lines (MC) including TurCal, Turbo 2017 - uDST(137693/Turbo04a-WithTurcal) : DaVinci-v42r8p3
+System config: x86_64-slc6-gcc62-opt MC TCK:
+Options: $APPCONFIGOPTS/Turbo/Tesla_2017_LinesFromStreamsAndTurCal_MC.py;$APPCONFIGOPTS/Turbo/Tesla_Simulation_2017.py;$APPCONFIGOPTS/Turbo/Tesla_FilterMC.py Options format: Tesla Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r372;TurboStreamProd.v4r2p7 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DST Output file types: DST
+
+Step 8 Stripping29r2-NoPrescalingFlagged for Sim09 - pp at 13 TeV - uDST(133517/Stripping29r2NoPrescalingFlagged) : DaVinci-v42r7p3
+System config: MC TCK:
+Options: $APPCONFIGOPTS/DaVinci/DV-Stripping29r2-Stripping-MC-NoPrescaling-DST.py;$APPCONFIGOPTS/DaVinci/DataType-2017.py;APPCONFIGOPTS/DaVinci/InputType-DST.py;$APPCONFIGOPTS/DaVinci/DV-Stripping-MC-muDST.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r356;TMVAWeights.v1r9 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DST Output file types: ALLSTREAMS.MDST
+
+
+Inform also: david.gerick@cern.ch
+
+Comments
+Model for 2017 average nominal conditions at 25ns - Magnet DOWN
+This model has the whole processing chain for data: L0, HLT1, HLT2, Reco, Turbo, Stripping.
+It has the most representative TCK as recommended by the trigger, Reco17, Turbo04 reprocessing and Stripping29.
+
+************************************************************
+Default output is microDST. For DST or LDST output, see LHCBGAUSS-1190
+************************************************************
+
+Comment by kreps on Dec 11, 2018: Update to DecFiles v30r26
diff --git a/Code/Ganga/SimulationDetails/SigMC_2018Down.txt b/Code/Ganga/SimulationDetails/SigMC_2018Down.txt
new file mode 100644
index 0000000..a2673b0
--- /dev/null
+++ b/Code/Ganga/SimulationDetails/SigMC_2018Down.txt
@@ -0,0 +1,122 @@
+ID: 65466
+Name: RDWG - Sim09h Model for 2018 - MD - Pythia8 - B+ -> Kst+ (K+ pi0) mu mu
+Type: Simulation
+State: Done
+Priority: 1a
+Author: liferrei WG: RD
+Event type: 12113100 Bu_Kstmumu,Kpi0=DecProdCut
+Number of events: 1150000
+Starting Date: 2020-03-21
+Finalization Date: 2020-04-21
+Fast Simulation Type: None
+Retention Rate: 1
+
+Simulation Conditions: Beam6500GeV-2018-MagDown-Nu1.6-25ns-Pythia8
+Beam: beta*~3m, zpv=1.48mm, xAngle=-0.395mrad and yAngle=0 Beam energy: 6500 GeV Generator: Pythia8 G4 settings: specified in sim step
+Magnetic field: -1 Detector: 2018, Velo closed around average x=0.846mm and y=0.109mm Luminosity: pp collisions nu = 1.6, 25ns spillover
+
+Processing Pass: Sim09h/Trig0x617d18a4/Reco18/Turbo05-WithTurcal/Stripping34r0p1NoPrescalingFlagged
+MC Version: 2018
+Step 1 Sim09h - 2018 - MD - Nu1.6 (Lumi 4 at 25ns) - 25ns spillover - Pythia8(141207/Sim09h) : Gauss-v49r15p1
+System config: x86_64-slc6-gcc48-opt MC TCK:
+Options: $APPCONFIGOPTS/Gauss/Beam6500GeV-md100-2018-nu1.6.py;$APPCONFIGOPTS/Gauss/EnableSpillover-25ns.py;$APPCONFIGOPTS/Gauss/DataType-2017.py;$APPCONFIGOPTS/Gauss/RICHRandomHits.py;$DECFILESROOT/options/@{eventType}.py;$LBPYTHIA8ROOT/options/Pythia8.py;$APPCONFIGOPTS/Gauss/G4PL_FTFP_BERT_EmNoCuts.py Options format: Multicore: N
+DDDB: dddb-20170721-3 Condition DB: sim-20190430-vc-md100 DQTag:
+Extra: AppConfig.v3r394;Gen/DecFiles.v30r43 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: Output file types: SIM
+
+Step 2 Digi14c for 2015 - 25ns spillover(137780/Digi14c) : Boole-v30r4
+System config: x86_64-slc6-gcc49-opt MC TCK:
+Options: $APPCONFIGOPTS/Boole/Default.py;$APPCONFIGOPTS/Boole/EnableSpillover.py;$APPCONFIGOPTS/Boole/DataType-2015.py;$APPCONFIGOPTS/Boole/Boole-SetOdinRndTrigger.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r374 Runtime projects:
+Visible: N Usable:Yes
+Input file types: SIM Output file types: DIGI
+
+Step 3 L0 emulation for 2018 - TCK 0x18a4 - DIGI(138052/L0Trig0x18a4) : Moore-v28r3p1
+System config: x86_64-slc6-gcc62-opt MC TCK:
+Options: $APPCONFIGOPTS/L0App/L0AppSimProduction.py;$APPCONFIGOPTS/L0App/L0AppTCK-0x18a4.py;$APPCONFIGOPTS/L0App/ForceLUTVersionV8.py;$APPCONFIGOPTS/L0App/DataType-2017.py Options format: l0app Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r374 Runtime projects:
+Visible: N Usable:Yes
+Input file types: DIGI Output file types: DIGI
+
+Step 4 TCK-0x517a18a4 (HLT1) Flagged for 2018 - DIGI(137782/Trig0x517a18a4) : Moore-v28r3p1
+System config: x86_64-slc6-gcc62-opt MC TCK:
+Options: $APPCONFIGOPTS/Moore/MooreSimProductionForSeparateL0AppStep2015.py;$APPCONFIGOPTS/Conditions/TCK-0x517a18a4.py;$APPCONFIGOPTS/Moore/DataType-2017.py;$APPCONFIGOPTS/Moore/MooreSimProductionHlt1.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r374 Runtime projects:
+Visible: N Usable:Yes
+Input file types: DIGI Output file types: DIGI
+
+Step 5 TCK-0x0x617d18a4 (HLT2) Flagged for 2018 - DIGI(137783/Trig0x617d18a4) : Moore-v28r3p1
+System config: x86_64-slc6-gcc62-opt MC TCK:
+Options: $APPCONFIGOPTS/Moore/MooreSimProductionForSeparateL0AppStep2015.py;$APPCONFIGOPTS/Conditions/TCK-0x617d18a4.py;$APPCONFIGOPTS/Moore/DataType-2017.py;$APPCONFIGOPTS/Moore/MooreSimProductionHlt2.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r374 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DIGI Output file types: DIGI
+
+Step 6 Reco18 for MC 2018 - DST(138796/Reco18) : Brunel-v54r2
+System config: x86_64-slc6-gcc62-opt MC TCK:
+Options: $APPCONFIGOPTS/Brunel/DataType-2018.py;$APPCONFIGOPTS/Brunel/MC-WithTruth.py;$APPCONFIGOPTS/Brunel/SplitRawEventOutput.4.3.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r374;Det/SQLDDDB.v7r10 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DIGI Output file types: DST
+
+Step 7 Turbo lines (MC) including TurCal, Turbo 2018 - DST(137695/Turbo05-WithTurcal) : DaVinci-v44r7
+System config: x86_64-slc6-gcc62-opt MC TCK:
+Options: $APPCONFIGOPTS/Turbo/Tesla_2018_LinesFromStreamsAndTurCal_MC.py;$APPCONFIGOPTS/Turbo/Tesla_Simulation_2018.py Options format: Tesla Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r374;TurboStreamProd.v4r2p10 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DST Output file types: DST
+
+Step 8 Stripping34r0p1-NoPrescalingFlagged for Sim09 - pp at 13 TeV - DST(139703/Stripping34r0p1NoPrescalingFlagged) : DaVinci-v44r10p2
+System config: MC TCK:
+Options: $APPCONFIGOPTS/DaVinci/DV-Stripping34r0p1-Stripping-MC-NoPrescaling-DST.py;$APPCONFIGOPTS/DaVinci/DataType-2018.py;APPCONFIGOPTS/DaVinci/InputType-DST.py Options format: Multicore: N
+DDDB: fromPreviousStep Condition DB: fromPreviousStep DQTag:
+Extra: AppConfig.v3r389;TMVAWeights.v1r12 Runtime projects:
+Visible: Y Usable:Yes
+Input file types: DST Output file types: ALLSTREAMS.DST
+
+
+Inform also: david.gerick@cern.ch
+
+Comments
+Model for 2018 average nominal conditions at 25ns - Magnet DOWN
+This model has the whole processing chain for data: L0, HLT1, HLT2, Reco, Turbo, Stripping.
+It has the most representative TCK as recommended by the trigger, Reco18, Turbo05 reprocessing and Stripping34.
+
+************************************************************
+Default output is microDST. For DST or LDST output, see LHCBGAUSS-1532
+************************************************************
+
+Comment by kreps on Feb 20, 2019: Update to DecFiles v30r28
+
+Update to DecFiles v30r29
+
+Comment by kreps on May 23, 2019: Update to DecFiles v30r30, Gauss v49r13 (Sim09g), Brunel v54r2 and new SIMCOND tag (ECAL thresholds)
+
+Comment by kreps on Jul 08, 2019: Update to DecFiles v30r32 and Gauss v49r14 (Sim09h)
+
+Comment by kreps on Jul 25, 2019: Update to DecFiles v30r33
+
+Comment by kreps on Aug 07, 2019: Update to DecFiles v30r34
+
+Comment by kreps on Aug 22, 2019: Update to DecFiles v30r35
+
+Comment by kreps on Sep 16, 2019: Update to DecFiles v30r36
+
+Comment by kreps on Oct 29, 2019: Update to DecFiles v30r38
+
+Comment by kreps on Nov 14, 2019: Update to DecFiles v30r39
+
+Comment by kreps on Dec 02, 2019: Update to DecFiles v30r40
+
+Comment by admorris on Dec 17 2019: Update to DecFiles v30r41
+
+Comment by admorris on Feb 05, 2020: Update to DecFiles v30r42
+
+Comment by admorris on Mar 03, 2020: Update to DecFiles v30r43
diff --git a/Code/Ganga/UsefulScripts/GetEfficiency/get_MC_eff.py b/Code/Ganga/UsefulScripts/GetEfficiency/get_MC_eff.py
new file mode 100644
index 0000000..240c8f3
--- /dev/null
+++ b/Code/Ganga/UsefulScripts/GetEfficiency/get_MC_eff.py
@@ -0,0 +1,82 @@
+
+
+import os
+
+def get_path(decay = "Kplus", year = "2012", polarity = "Down"):
+ sim_version = "Sim09a"
+ dst = "DST"
+ E = 0
+ nu = ""
+ trigger = ""
+ stripping = ""
+ reco = ""
+
+ if (decay=="Kplus"): decay_number = 12113100
+ if (decay=="Kshort"): decay_number = 12115102
+
+ if (year=="2011"):
+ E = 3500
+ nu = "2"
+ trigger = "0x40760037"
+ stripping = "21r1"
+ reco = "Reco14c"
+ sim_version = "Sim09a"
+ elif (year=="2012"):
+ E = 4000
+ nu = "2.5"
+ trigger = "0x409f0045"
+ stripping = "21"
+ reco = "Reco14c"
+ sim_version = "Sim09a"
+ elif (year=="2015"):
+ E = 6500
+ nu = "1.6-25ns"
+ trigger = "0x411400a2"
+ stripping = "24"
+ reco = "Reco15a/Turbo02"
+ sim_version = "Sim09b"
+ dst = "MDST"
+ elif (year=="2016"):
+ E = 6500
+ nu = "1.6-25ns"
+ trigger = "0x6138160F"
+ stripping = "28"
+ reco = "Reco16/Turbo03"
+ sim_version = "Sim09c"
+ dst = "MDST"
+ elif (year=="2017"):
+ E = 6500
+ nu = "1.6-25ns"
+ trigger = "0x62661709"
+ stripping = "29r2"
+ reco = "Reco17/Turbo04a-WithTurcal"
+ sim_version = "Sim09e"
+ dst = "MDST"
+ elif (year=="2018"):
+ E = 6500
+ nu = "1.6-25ns"
+ trigger = "0x617d18a4"
+ stripping = "34"
+ reco = "Reco18/Turbo05-WithTurcal"
+ sim_version = "Sim09f"
+ dst = "DST"
+
+ script_opts = {"YEAR":year,"POL":polarity,"DATA_TYPE":"MC","ENERGY":E,"NU":nu,"TRIG":trigger,"STRIP":stripping,"CHAN":decay, "NUM":decay_number, "RECO":reco, "SIM": sim_version, "DST":dst}
+ PATH = "/MC/%(YEAR)s/Beam%(ENERGY)sGeV-%(YEAR)s-Mag%(POL)s-Nu%(NU)s-Pythia8/%(SIM)s/Trig%(TRIG)s/%(RECO)s/Stripping%(STRIP)sNoPrescalingFlagged/%(NUM)s/ALLSTREAMS.%(DST)s" % script_opts
+ return PATH
+
+def get_eff(decay = "Kplus", year = "2012", polarity = "Down"):
+ command = "lb-run LHCbDirac/prod dirac-bookkeeping-rejection-stats -B " + str(get_path(decay,year,polarity))
+ print command
+ os.system(command)
+
+
+if __name__ == '__main__':
+ get_eff()
+
+#def get_BKK_path(decay,year,polarity):
+# for dic in path_dict_list:
+# print dic
+# if (dic.get("year")==year) and (dic.get("decay")==decay) and (dic.get("pol")==polarity):
+# print dic
+# return dic.get("PATH")
diff --git a/Code/Ganga/UsefulScripts/GetEfficiency/get_MCref_eff.py b/Code/Ganga/UsefulScripts/GetEfficiency/get_MCref_eff.py
new file mode 100644
index 0000000..3c6558a
--- /dev/null
+++ b/Code/Ganga/UsefulScripts/GetEfficiency/get_MCref_eff.py
@@ -0,0 +1,56 @@
+import os
+
+def get_path(decay = "Kplus", year = "2012", polarity = "Down"):
+ sim_version = "Sim09a"
+ dst = "DST"
+ E = 0
+ nu = ""
+ trigger = ""
+ stripping = ""
+ reco = ""
+
+ if (decay=="Kplus"): decay_number = 12143401
+ if (decay=="Kshort"): decay_number = 12145102
+
+ if (year=="2011"):
+ E = 3500
+ nu = 2
+ trigger = "0x40760037"
+ stripping = "21r1"
+ reco = "Reco14c"
+ elif (year=="2012"):
+ E = 4000
+ nu = 2.5
+ trigger = "0x409f0045"
+ stripping = "21"
+ reco = "Reco14c"
+ elif (year=="2015"):
+ E = 6500
+ nu = "1.6-25ns"
+ trigger = "0x411400a2"
+ stripping = "24"
+ reco = "Reco15a/Turbo02"
+ sim_version = "Sim09b"
+ dst = "MDST"
+ elif (year=="2016"):
+ E = 6500
+ nu ="1.6-25ns"
+ trigger = "0x409f0045"
+ stripping = "28"
+ reco = "Reco15a/Turbo02"
+ sim_version = "Sim09c"
+ dst = "MDST"
+
+ script_opts = {"YEAR":year,"POL":polarity,"DATA_TYPE":"MC","ENERGY":E,"NU":nu,"TRIG":trigger,"STRIP":stripping,"CHAN":decay, "NUM":decay_number, "RECO":reco, "SIM": sim_version, "DST":dst}
+ PATH = "/MC/%(YEAR)s/Beam%(ENERGY)sGeV-%(YEAR)s-Mag%(POL)s-Nu%(NU)s-Pythia8/%(SIM)s/Trig%(TRIG)s/%(RECO)s/Stripping%(STRIP)sNoPrescalingFlagged/%(NUM)s/ALLSTREAMS.%(DST)s" % script_opts
+
+ return PATH
+
+def get_eff(decay = "Kplus", year = "2012", polarity = "Down"):
+ command = "lb-run LHCbDirac/prod dirac-bookkeeping-rejection-stats -B " + str(get_path(decay,year,polarity))
+ print command
+ os.system(command)
+
+
+if __name__ == '__main__':
+ get_eff()
diff --git a/Code/Ganga/UsefulScripts/GetEfficiency/get_PHSP_eff.py b/Code/Ganga/UsefulScripts/GetEfficiency/get_PHSP_eff.py
new file mode 100644
index 0000000..c1e24d5
--- /dev/null
+++ b/Code/Ganga/UsefulScripts/GetEfficiency/get_PHSP_eff.py
@@ -0,0 +1,69 @@
+
+
+import os
+
+def get_path(decay = "Kplus", year = "2012", polarity = "Down"):
+ sim_version = "Sim09a"
+ dst = "DST"
+ E = 0
+ nu = ""
+ trigger = ""
+ stripping = ""
+ reco = ""
+
+ if (decay=="Kplus"): decay_number = 12113446 #12113445
+ if (decay=="Kshort"): decay_number = 12115179 #12115178
+ if (decay=="Kplus"): year_list = ["2011","2012","2015","2016"]
+
+ if (year=="2011"):
+ E = 3500
+ nu = "2"
+ trigger = "0x40760037"
+ stripping = "21r1p1"
+ reco = "Reco14c"
+ sim_version = "Sim09f"
+ elif (year=="2012"):
+ E = 4000
+ nu = "2.5"
+ trigger = "0x409f0045"
+ stripping = "21r0p1"
+ reco = "Reco14c"
+ sim_version = "Sim09f"
+ elif (year=="2012spec"):
+ year = "2012"
+ E = 4000
+ nu = "2.5"
+ trigger = "0x4097003d" #Only for Kshort!
+ stripping = "21r0p1"
+ reco = "Reco14c"
+ sim_version = "Sim09f"
+ elif (year=="2015"):
+ E = 6500
+ nu = "1.6-25ns"
+ trigger = "0x411400a2"
+ stripping = "24"
+ reco = "Reco15a/Turbo02"
+ sim_version = "Sim09b"
+ dst = "MDST"
+ elif (year=="2016"):
+ E = 6500
+ nu = "1.6-25ns"
+ trigger = "0x6138160F"
+ stripping = "28"
+ reco = "Reco16/Turbo03"
+ sim_version = "Sim09c"
+ dst = "MDST"
+
+ script_opts = {"YEAR":year,"POL":polarity,"DATA_TYPE":"PHSP","ENERGY":E,"NU":nu,"TRIG":trigger,"STRIP":stripping,"CHAN":decay, "NUM":decay_number, "RECO":reco, "SIM": sim_version, "DST":dst }
+ PATH = "/MC/%(YEAR)s/Beam%(ENERGY)sGeV-%(YEAR)s-Mag%(POL)s-Nu%(NU)s-Pythia8/%(SIM)s/Trig%(TRIG)s/%(RECO)s/Stripping%(STRIP)sFiltered/Merge14/%(NUM)s/B2XMUMU.STRIP.%(DST)s" % script_opts
+
+ return PATH
+
+def get_eff(decay = "Kplus", year = "2012", polarity = "Down"):
+ command = "lb-run LHCbDirac/prod dirac-bookkeeping-rejection-stats -B " + str(get_path(decay,year,polarity))
+ print command
+ os.system(command)
+
+
+if __name__ == '__main__':
+ get_eff()
diff --git a/Code/Ganga/UsefulScripts/PrintBKKPaths/print_BKK_paths_MC.py b/Code/Ganga/UsefulScripts/PrintBKKPaths/print_BKK_paths_MC.py
new file mode 100644
index 0000000..28452a7
--- /dev/null
+++ b/Code/Ganga/UsefulScripts/PrintBKKPaths/print_BKK_paths_MC.py
@@ -0,0 +1,100 @@
+#path_dict_list = []
+
+
+for decay in ["Kshort","Kplus"]:
+ print "============================" + decay + "============================"
+ for polarity in ["Down","Up"]:
+ decay_number = 0
+ sim_version = "Sim09a"
+ dst = "DST"
+ platform = "x86_64-slc6-gcc62-opt"
+ if (decay=="Kplus"): decay_number = 12113100
+ if (decay=="Kshort"): decay_number = 12115102
+ for yr in ["2011","2012","2015","2016","2017","2018"]:
+ E = 0
+ nu = ""
+ trigger = ""
+ stripping = ""
+ reco = ""
+ if (yr=="2011"):
+ E = 3500
+ nu = "2"
+ trigger = "0x40760037"
+ stripping = "21r1"
+ reco = "Reco14c"
+ sim_version = "Sim09a"
+ directory = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v38r1p3/'
+ platform = "x86_64-slc6-gcc49-opt"
+ elif (yr=="2012"):
+ E = 4000
+ nu = "2.5"
+ trigger = "0x409f0045"
+ stripping = "21"
+ reco = "Reco14c"
+ sim_version = "Sim09a"
+ directory = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v38r1p3/'
+ platform = "x86_64-slc6-gcc49-opt"
+ elif (yr=="2015"):
+ E = 6500
+ nu = "1.6-25ns"
+ trigger = "0x411400a2"
+ stripping = "24"
+ reco = "Reco15a/Turbo02"
+ sim_version = "Sim09b"
+ dst = "MDST"
+ directory = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v41r2/'
+ platform = "x86_64-slc6-gcc49-opt"
+ elif (yr=="2016"):
+ E = 6500
+ nu = "1.6-25ns"
+ trigger = "0x6138160F"
+ stripping = "28"
+ reco = "Reco16/Turbo03"
+ sim_version = "Sim09c"
+ dst = "MDST"
+ directory = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v41r2/'
+ platform = "x86_64-slc6-gcc49-opt"
+ elif (yr=="2017"):
+ E = 6500
+ nu = "1.6-25ns"
+ trigger = "0x62661709"
+ stripping = "29r2"
+ reco = "Reco17/Turbo04a-WithTurcal"
+ sim_version = "Sim09e"
+ dst = "MDST"
+ directory = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v44r3/'
+ platform = "x86_64-centos7-gcc62-opt"
+ elif (yr=="2018"):
+ E = 6500
+ nu = "1.6-25ns"
+ trigger = "0x617d18a4"
+ stripping = "34"
+ reco = "Reco18/Turbo05-WithTurcal"
+ sim_version = "Sim09f"
+ dst = "DST"
+ directory = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v44r3/'
+ platform = "x86_64-centos7-gcc62-opt"
+
+ script_opts = {"YEAR":yr,"POL":polarity,"DATA_TYPE":"MC","ENERGY":E,"NU":nu,"TRIG":trigger,"STRIP":stripping,"CHAN":decay, "NUM":decay_number, "RECO":reco, "SIM": sim_version, "DST":dst}
+ script_1 ='/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v41r2/tuplecreation/optfiles/%(DATA_TYPE)s/KstMuMu/%(YEAR)s%(POL)s_%(DATA_TYPE)s_%(CHAN)s.py'% script_opts
+ # script_basic = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v41r2/tuplecreation/optfiles/BasicOptfile.py'
+ optsfile = [script_1]
+ PATH = "/MC/%(YEAR)s/Beam%(ENERGY)sGeV-%(YEAR)s-Mag%(POL)s-Nu%(NU)s-Pythia8/%(SIM)s/Trig%(TRIG)s/%(RECO)s/Stripping%(STRIP)sNoPrescalingFlagged/%(NUM)s/ALLSTREAMS.%(DST)s" % script_opts
+ print 'Using data: ', PATH
+ #tmp_dict = {"decay": decay,
+ # "year": yr,
+ # "pol" :polarity,
+ # "path": PATH}
+ #path_dict_list.append(tmp_dict)
+
+ #print 'Using script: ', script_1
+ #print 'Using DV version: ', directory, platform
+
+
+#def get_BKK_path(decay,year,polarity):
+# for dic in path_dict_list:
+# print dic
+# if (dic.get("year")==year) and (dic.get("decay")==decay) and (dic.get("pol")==polarity):
+# print dic
+# return dic.get("PATH")
+
diff --git a/Code/Ganga/UsefulScripts/PrintBKKPaths/print_BKK_paths_MCref.py b/Code/Ganga/UsefulScripts/PrintBKKPaths/print_BKK_paths_MCref.py
new file mode 100644
index 0000000..c308ac1
--- /dev/null
+++ b/Code/Ganga/UsefulScripts/PrintBKKPaths/print_BKK_paths_MCref.py
@@ -0,0 +1,58 @@
+
+for decay in ["Kplus"]:#,"Kshort"]:
+ print ("============================" + decay + "============================")
+ decay_number = 0
+ sim_version = "Sim09a"
+ dst = "DST"
+ if (decay=="Kplus"): decay_number = 12143401
+ if (decay=="Kshort"): decay_number = 12145102
+ for polarity in ["Down","Up"]:
+ for yr in ["2011","2012","2015","2016"]:
+ E = 0
+ nu = 0
+ trigger = ""
+ stripping = ""
+ reco = ""
+ if (yr=="2011"):
+ E = 3500
+ nu = 2
+ trigger = "0x40760037"
+ stripping = "21r1"
+ reco = "Reco14c"
+ directory = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v38r1p3/'
+ elif (yr=="2012"):
+ E = 4000
+ nu = 2.5
+ trigger = "0x409f0045"
+ stripping = "21"
+ reco = "Reco14c"
+ directory = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v38r1p3/'
+ elif (yr=="2015"):
+ E = 6500
+ nu = "1.6-25ns"
+ trigger = "0x411400a2"
+ stripping = "24"
+ reco = "Reco15a/Turbo02"
+ sim_version = "Sim09b"
+ dst = "MDST"
+ directory = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v41r2/'
+ elif (yr=="2016"):
+ E = 6500
+ nu ="1.6-25ns"
+ trigger = "0x409f0045"
+ stripping = "28"
+ reco = "Reco15a/Turbo02"
+ sim_version = "Sim09c"
+ dst = "MDST"
+ directory = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v41r2/'
+
+ script_opts = {"YEAR":yr,"POL":polarity,"DATA_TYPE":"MC","ENERGY":E,"NU":nu,"TRIG":trigger,"STRIP":stripping,"CHAN":decay, "NUM":decay_number, "RECO":reco, "SIM": sim_version, "DST":dst}
+ script_1 ='/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v41r2/tuplecreation/optfiles/%(DATA_TYPE)s/KstJpsi/%(YEAR)s%(POL)s_%(DATA_TYPE)s_%(CHAN)s.py'% script_opts
+ # script_basic = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v41r2/tuplecreation/optfiles/BasicOptfile.py'
+ optsfile = [script_1]
+ PATH = "/MC/%(YEAR)s/Beam%(ENERGY)sGeV-%(YEAR)s-Mag%(POL)s-Nu%(NU)s-Pythia8/%(SIM)s/Trig%(TRIG)s/%(RECO)s/Stripping%(STRIP)sNoPrescalingFlagged/%(NUM)s/ALLSTREAMS.%(DST)s" % script_opts
+
+ print ('Using data: ', PATH)
+ #print 'Using script: ', script_1
+ #print 'Using DV version: ', directory, platform
+
diff --git a/Code/Ganga/UsefulScripts/PrintBKKPaths/print_BKK_paths_PHSP.py b/Code/Ganga/UsefulScripts/PrintBKKPaths/print_BKK_paths_PHSP.py
new file mode 100644
index 0000000..d6802d8
--- /dev/null
+++ b/Code/Ganga/UsefulScripts/PrintBKKPaths/print_BKK_paths_PHSP.py
@@ -0,0 +1,106 @@
+
+#export PATH=$PATH:/afs/cern.ch/user/i/ibelyaev/public/scripts
+#lhcb-proxy-init
+#get_bookkeeping_info 12115179
+
+
+for decay in ["Kshort","Kplus"]:
+ print "============================" + decay + "============================"
+ for polarity in ["Down","Up"]:
+ decay_number = 0
+ sim_version = "Sim09b"
+ dst = "DST"
+ if (decay=="Kplus"): decay_number = 12113446 #12113445
+ if (decay=="Kshort"): decay_number = 12115179 #12115178
+ if (decay=="Kplus"): year_list = ["2011","2012","2015","2016","2017","2018"]
+ if (decay=="Kshort"): year_list = ["2012","2012spec","2011","2015","2016","2017","2018"]
+ directory = ""
+ platform = ""
+ for yr in year_list:
+ E = 0
+ nu = ""
+ trigger = ""
+ stripping = ""
+ reco = ""
+ if (yr=="2011"):
+ E = 3500
+ nu = "2"
+ trigger = "0x40760037"
+ stripping = "21r1p1"
+ reco = "Reco14c"
+ sim_version = "Sim09f"
+ directory = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v38r1p3/'
+ platform = "x86_64-slc6-gcc49-opt"
+ elif (yr=="2012"):
+ E = 4000
+ nu = "2.5"
+ trigger = "0x409f0045"
+ stripping = "21r0p1"
+ reco = "Reco14c"
+ sim_version = "Sim09f"
+ directory = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v38r1p3/'
+ platform = "x86_64-slc6-gcc49-opt"
+ elif (yr=="2012spec"):
+ yr = "2012"
+ E = 4000
+ nu = "2.5"
+ trigger = "0x4097003d" #Only for Kshort!
+ stripping = "21r0p1"
+ reco = "Reco14c"
+ sim_version = "Sim09f"
+ directory = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v38r1p3/'
+ platform = "x86_64-slc6-gcc49-opt"
+ elif (yr=="2015"):
+ E = 6500
+ nu = "1.6-25ns"
+ trigger = "0x6139160F"
+ stripping = "24r1"
+ reco = "Reco15a/Turbo02"
+ sim_version = "Sim09f"
+ dst = "MDST"
+ directory = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v41r2/'
+ platform = "x86_64-slc6-gcc62-opt"
+ elif (yr=="2016"):
+ E = 6500
+ nu = "1.6-25ns"
+ trigger = "0x6139160F"
+ stripping = "28r1"
+ reco = "Reco16/Turbo03"
+ sim_version = "Sim09f"
+ dst = "MDST"
+ irectory = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v41r2/'
+ platform = "x86_64-slc6-gcc62-opt"
+ elif (yr=="2017"):
+ E = 6500
+ nu = "1.6-25ns"
+ trigger = "0x62661709"
+ stripping = "29r2"
+ reco = "Reco17/Turbo04a-WithTurcal"
+ sim_version = "Sim09f"
+ dst = "MDST"
+ directory = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v41r2/'
+ platform = "x86_64-slc6-gcc62-opt"
+ elif (yr=="2018"):
+ E = 6500
+ nu = "1.6-25ns"
+ trigger = "0x617d18a4"
+ stripping = "34"
+ reco = "Reco18/Turbo05-WithTurcal"
+ sim_version = "Sim09f"
+ dst = "MDST"
+ directory = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v41r2/'
+ platform = "x86_64-slc6-gcc62-opt"
+
+ script_opts = {"YEAR":yr,"POL":polarity,"DATA_TYPE":"PHSP","ENERGY":E,"NU":nu,"TRIG":trigger,"STRIP":stripping,"CHAN":decay, "NUM":decay_number, "RECO":reco, "SIM": sim_version, "DST":dst }
+ script_1 ='/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v41r2/tuplecreation/optfiles/%(DATA_TYPE)s/%(YEAR)s%(POL)s_%(DATA_TYPE)s_%(CHAN)s.py'% script_opts
+# script_basic = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v41r2/tuplecreation/optfiles/BasicOptfile.py'
+ optsfile = [script_1]
+
+ PATH = "/MC/%(YEAR)s/Beam%(ENERGY)sGeV-%(YEAR)s-Mag%(POL)s-Nu%(NU)s-Pythia8/%(SIM)s/Trig%(TRIG)s/%(RECO)s/Stripping%(STRIP)sFiltered/Merge14/%(NUM)s/B2XMUMU.STRIP.%(DST)s" % script_opts
+
+
+ print 'Using data: ', PATH
+ #print 'Using optsfile: ',script_1
+ #print 'Using DV version: ', directory, platform
+
+
diff --git a/Code/Ganga/UsefulScripts/PrintBKKPaths/print_BKK_paths_data.py b/Code/Ganga/UsefulScripts/PrintBKKPaths/print_BKK_paths_data.py
new file mode 100644
index 0000000..acfe846
--- /dev/null
+++ b/Code/Ganga/UsefulScripts/PrintBKKPaths/print_BKK_paths_data.py
@@ -0,0 +1,50 @@
+
+
+for polarity in ["Down","Up"]:
+ for yr in ["11","12","15","16","17","18"]:
+ E = 0
+ nu = 0
+ trigger = 0
+ if (yr=="11"):
+ E = 3500
+ nu = 2
+ reco="14"
+ stripping = "21r1p1a"
+ directory = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v38r1p3/'
+ elif (yr=="12"):
+ E = 4000
+ reco="14"
+ stripping = "21r0p1a"
+ directory = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v38r1p3/'
+ elif (yr=="15"):
+ E = 6500
+ reco="15a"
+ stripping = "24"
+ directory = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v41r2/'
+ elif (yr=="16"):
+ E = 6500
+ reco="16"
+ stripping = "28"
+ directory = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v41r2/'
+ elif (yr=="17"):
+ E = 6500
+ reco="17"
+ stripping = "29r2"
+ directory = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v44r3/'
+ elif (yr=="18"):
+ E = 6500
+ reco="18"
+ stripping = "34"
+ directory = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v44r3/'
+
+ script_opts = {"YEAR":yr,"POL":polarity,"DATA_TYPE":"data","ENERGY":E,"RECO":reco,"STRIP":stripping}
+ script_1 ='/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v41r2/tuplecreation/optfiles/%(DATA_TYPE)s/20%(YEAR)s%(POL)s_%(DATA_TYPE)s.py'% script_opts
+ # script_basic = '/afs/cern.ch/work/r/rekopecn/public/B_2_KstarMuMu/DaVinciDev_v41r2/tuplecreation/optfiles/BasicOptfile.py'%(YEAR)s%(POL)s_%(DATA_TYPE)s_%(CHAN)s
+
+ optsfile = [script_1]
+
+ PATH ="/LHCb/Collision%(YEAR)s/Beam%(ENERGY)sGeV-VeloClosed-Mag%(POL)s/Real Data/Reco%(RECO)s/Stripping%(STRIP)s/90000000/LEPTONIC.MDST" % script_opts
+ print 'Using data: ', PATH
+ #print 'Using script: ', script_1
+ #print 'Using DV version: ', directory, platform
+
diff --git a/Code/Ganga/UsefulScripts/getLFNs.py b/Code/Ganga/UsefulScripts/getLFNs.py
new file mode 100644
index 0000000..d9faf21
--- /dev/null
+++ b/Code/Ganga/UsefulScripts/getLFNs.py
@@ -0,0 +1,378 @@
+
+import subprocess
+from subprocess import Popen, PIPE
+
+
+decay_number_dict = {
+ "SigMC" : {
+ "2011": {
+ "E": "3500",
+ "nu": "2",
+ "trigger": "0x40760037",
+ "stripping": "21r1",
+ "reco": "Reco14c",
+ "simVer": "Sim09a",
+ "dst": "DST",
+ "merge": ""
+ },
+ "2012": {
+ "E": "4000",
+ "nu": "2.5",
+ "trigger": "0x409f0045",
+ "stripping": "21",
+ "reco": "Reco14c",
+ "simVer": "Sim09a",
+ "dst": "DST",
+ "merge": ""
+ },
+ "2015": {
+ "E": "6500",
+ "nu": "1.6-25ns",
+ "trigger": "0x411400a2",
+ "stripping": "24r2",
+ "reco": "Reco15a/Turbo02",
+ "simVer": "Sim09i",
+ "dst": "DST",
+ "merge": ""
+ },
+ "2016": {
+ "E": "6500",
+ "nu": "1.6-25ns",
+ "trigger": "0x6139160F",
+ "stripping": "28r2",
+ "reco": "Reco16/Turbo03a",
+ "simVer": "Sim09i",
+ "dst": "DST",
+ "merge": ""
+ },
+ "2017": {
+ "E": "6500",
+ "nu": "1.6-25ns",
+ "trigger": "0x62661709",
+ "stripping": "29r2",
+ "reco": "Reco17/Turbo04a-WithTurcal",
+ "simVer": "Sim09e",
+ "dst": "MDST",
+ "merge": ""
+ },
+ "2018": {
+ "E": "6500",
+ "nu": "1.6-25ns",
+ "trigger": "0x617d18a4",
+ "stripping": "34r0p1", #34 for 12115102
+ "reco": "Reco18/Turbo05-WithTurcal",
+ "simVer": "Sim09h", #Sim09f for 12115102
+ "dst": "DST",
+ "merge": ""
+ },
+ "general":{
+ "dec_ID": "12113100", #same for 12115102
+ "filter": "NoPrescalingFlagged",
+ "stream": "ALLSTREAMS",
+ "pythiaVer": "8"
+ }
+ },
+ "RefMC" : {
+ "2011": {
+ "E": "3500",
+ "nu": "2",
+ "trigger": "0x40760037",
+ "stripping": "21r1",
+ "reco": "Reco14c",
+ "simVer": "Sim09a",
+ "dst": "DST",
+ "merge": ""
+ },
+ "2012": {
+ "E": "4000",
+ "nu": "2.5",
+ "trigger": "0x409f0045",
+ "stripping": "21",
+ "reco": "Reco14c",
+ "simVer": "Sim09a",
+ "dst": "DST",
+ "merge": ""
+ },
+ "2015": {
+ "E": "6500",
+ "nu": "1.6-25ns",
+ "trigger": "0x411400a2",
+ "stripping": "24r1",
+ "reco": "Reco15a/Turbo02",
+ "simVer": "Sim09e",
+ "dst": "DST",
+ "merge": ""
+ },
+ "2016": {
+ "E": "6500",
+ "nu": "1.6-25ns",
+ "trigger": "0x6139160F",
+ "stripping": "28r1",
+ "reco": "Reco16/Turbo03",
+ "simVer": "Sim09e",
+ "dst": "DST",
+ "merge": ""
+ },
+ "general":{
+ "dec_ID": "12143401", #same for 12145102
+ "filter": "NoPrescalingFlagged",
+ "stream": "ALLSTREAMS",
+ "pythiaVer": "8"
+ }
+ },
+ "PHSP" : { #same for 12115179
+ "2011": {
+ "E": "3500",
+ "nu": "2",
+ "trigger": "0x40760037",
+ "stripping": "21r1p1",
+ "reco": "Reco14c",
+ "simVer": "Sim09f",
+ "dst": "DST",
+ "merge": "Merge14/",
+ "pythiaVer": "8"
+ },
+ "2012": {
+ "E": "4000",
+ "nu": "2.5",
+ "trigger": "0x409f0045",
+ "stripping": "21r0p1",
+ "reco": "Reco14c",
+ "simVer": "Sim09f",
+ "dst": "DST",
+ "merge": "Merge14/",
+ "pythiaVer": "8"
+ },
+ "2015": {
+ "E": "6500",
+ "nu": "1.6-25ns",
+ "trigger": "0x411400a2",
+ "stripping": "24r1",
+ "reco": "Reco15a/Turbo02",
+ "simVer": "Sim09h",
+ "dst": "MDST",
+ "merge": "",
+ "pythiaVer": "6"
+ },
+ "2016": {
+ "E": "6500",
+ "nu": "1.6-25ns",
+ "trigger": "0x6139160F",
+ "stripping": "28r1",
+ "reco": "Reco16/Turbo03",
+ "simVer": "Sim09f",
+ "dst": "MDST",
+ "merge": "Merge14/",
+ "pythiaVer": "8"
+ },
+ "2017": {
+ "E": "6500",
+ "nu": "1.6-25ns",
+ "trigger": "0x62661709",
+ "stripping": "29r2",
+ "reco": "Reco17/Turbo04a-WithTurcal",
+ "simVer": "Sim09f",
+ "dst": "MDST",
+ "merge": "Merge14/",
+ "pythiaVer": "8"
+ },
+ "2018": {
+ "E": "6500",
+ "nu": "1.6-25ns",
+ "trigger": "0x617d18a4",
+ "stripping": "34",
+ "reco": "Reco18/Turbo05-WithTurcal",
+ "simVer": "Sim09f",
+ "dst": "MDST",
+ "merge": "Merge14/",
+ "pythiaVer": "8"
+ },
+ "general":{
+ "dec_ID": "12113446", #same for 12115179
+ "filter": "Filtered",
+ "stream": "B2XMUMU.STRIP"
+ }
+ },
+ "data" : {
+
+ "11": {
+ "E": "3500",
+ "nu": "2",
+ "trigger": "",
+ "stripping": "21r1",
+ "reco": "Reco14",
+ "dst": "MDST"
+ },
+ "12": {
+ "E": "4000",
+ "nu": "2.5",
+ "trigger": "",
+ "stripping": "21r0p1a",
+ "reco": "Reco14",
+ "dst": "MDST"
+ },
+ "15": {
+ "E": "6500",
+ "nu": "1.6-25ns",
+ "trigger": "",
+ "stripping": "24r2",
+ "reco": "Reco15a",
+ "dst": "MDST"
+ },
+ "16": {
+ "E": "6500",
+ "nu": "1.6-25ns",
+ "trigger": "",
+ "stripping": "28r2",
+ "reco": "Reco16",
+ "dst": "MDST"
+ },
+ "17": {
+ "E": "6500",
+ "nu": "1.6-25ns",
+ "trigger": "",
+ "stripping": "29r2",
+ "reco": "Reco17",
+ "dst": "MDST"
+ },
+ "18": {
+ "E": "6500",
+ "nu": "1.6-25ns",
+ "trigger": "",
+ "stripping": "34r0p1", #34 for 12115102
+ "reco": "Reco18",
+ "dst": "MDST"
+ },
+ "general":{
+ "dec_ID": "90000000",
+ "filter": "NoPrescalingFlagged",
+ "stream": "ALLSTREAMS",
+ "pythiaVer": "8",
+ "merge": "",
+ "simVer": "",
+ "trigger": ""
+
+ }
+
+ }
+}
+
+year_dict ={"SigMC": ["2011", "2012","2015", "2016", "2017", "2018"],
+ "RefMC": ["2011", "2012","2015", "2016"],
+ "PHSP": ["2011", "2012","2015", "2016", "2017", "2018"],
+ "data": ["11", "12","15", "16", "17", "18"]
+ }
+
+def getPath(year, pol, sample):
+ tmp_dict = dict(decay_number_dict[sample][year])
+ gen_dict = dict(decay_number_dict[sample]["general"])
+ tmp_dict.update(gen_dict)
+
+ tmp_dict["year"] = year
+ tmp_dict["pol"] = pol
+ if (sample == "data"): #data
+ PATH ="/LHCb/Collision%(year)s/Beam%(E)sGeV-VeloClosed-Mag%(pol)s/Real Data/%(reco)s/Stripping%(stripping)s/%(dec_ID)s/LEPTONIC.%(dst)s" % tmp_dict
+ else: #MC
+ PATH = "/MC/%(year)s/Beam%(E)sGeV-%(year)s-Mag%(pol)s-Nu%(nu)s-Pythia%(pythiaVer)s/%(simVer)s/Trig%(trigger)s/%(reco)s/Stripping%(stripping)s%(filter)s/%(merge)s%(dec_ID)s/%(stream)s.%(dst)s" % tmp_dict
+ print PATH
+
+ OUTFILE = "%(dec_ID)s_%(year)s%(pol)s.py" % tmp_dict
+ #print 'LFN output file: ', OUTFILE
+
+ return PATH, OUTFILE
+
+
+def getLFNs(nFiles,BKKpath):
+
+ #Call Dirac
+ dirac_command = subprocess.Popen('lb-run LHCbDIRAC dirac-bookkeeping-get-files --BKQuery \"{0}\"'.format(BKKpath), shell=True, stdout=subprocess.PIPE)
+ #Read in Dirac output
+ stdout = dirac_command.communicate()[0]
+ #Split the output per line
+ stdout = stdout.split('\n')
+
+ #Create an empty list
+ LFNlist= []
+
+ #Check how many files are required
+ if (nFiles == -1): max_file = len(stdout)-2
+ else: max_file = min(nFiles+3,len(stdout)-2)
+
+ #First 3 entries are junk from LHCbDIRAC dirac-bookkeeping-get-files
+ for i in range(3, max_file+1):
+ tmpLFN = [stdout[i].split(' ')][0]
+ tmpLFN = tmpLFN[0]
+ LFNlist.append(tmpLFN)
+
+ return LFNlist
+
+def writeLFNs(nFiles, year, pol, sample):
+
+ #Get the paths
+ BKKpath, LFNfile = getPath(year,pol, sample)
+
+ #Get the LFNs from the paths
+ lfn_list = getLFNs(nFiles,BKKpath)
+
+ #Open the lfn target file and write all the lfns into it
+ address_file = open(LFNfile,'w')
+ address_file.write("""from Gaudi.Configuration import *\n""")
+ address_file.write("""from GaudiConf import IOHelper\n""")
+ address_file.write("""IOHelper('ROOT').inputFiles([\n""")
+ for lfn in lfn_list:
+ address_file.write("""'LFN:""" + lfn + """'\n""")
+ address_file.write("""], clear=True)\n""")
+ return
+
+def getProductionID(year, pol, sample):
+ #Exctract the production ID from LFN
+ path = getPath(year,pol,sample)
+ lfn = getLFNs(1,path[0])[0]
+ lfn_split = lfn.split('/')
+ return lfn_split[5]
+
+def printAllProductionIDs(sample):
+ for year in year_dict[sample]:
+ print "Production ID for", sample, "year", year, "\t", getProductionID(year,"Down",sample)
+ return
+
+
+def get_eff(year, pol, sample):
+ import os
+ command = "lb-run LHCbDirac/prod dirac-bookkeeping-rejection-stats -B " + str(getPath(year,pol, sample)[0])
+ print command
+ os.system(command)
+
+
+def get_tags(year, pol, sample):
+ import os
+ #command = "lb-run LHCbDirac/prod dirac-bookkeeping-production-information " + str(getProductionID(year,pol, sample)) + " | grep CONDDB"
+ #print command
+ #os.system(command)
+
+ command = "lb-run LHCbDirac/prod dirac-bookkeeping-production-information " + str(getProductionID(year,pol, sample)) + " | grep DDB"
+ #print command2
+ os.system(command)
+
+
+#getPath("2011","Down", "SigMC")
+#getPath("2012","Down", "SigMC")
+#getPath("2015","Down", "SigMC")
+getPath("2016","Down", "SigMC")
+#getPath("2017","Down", "SigMC")
+#getPath("2018","Down", "SigMC")
+
+#getPath("2011","Down", "RefMC")
+#getPath("2012","Down", "RefMC")
+#getPath("2015","Down", "RefMC")
+#getPath("2016","Down", "RefMC")
+
+#getPath("2011","Down", "PHSP")
+#getPath("2012","Down", "PHSP")
+#getPath("2015","Down", "PHSP")
+#getPath("2016","Down", "PHSP")
+#getPath("2017","Down", "PHSP")
+#getPath("2018","Down", "PHSP")
+#printAllProductionIDs("RefMC")
+#printAllProductionIDs("PHSP")
+
diff --git a/Code/Ganga/decFiles/Bu_JpsiKpi0,mm=DecProdCut.dec b/Code/Ganga/decFiles/Bu_JpsiKpi0,mm=DecProdCut.dec
new file mode 100644
index 0000000..369d70e
--- /dev/null
+++ b/Code/Ganga/decFiles/Bu_JpsiKpi0,mm=DecProdCut.dec
@@ -0,0 +1,38 @@
+# EventType: 12143410
+#
+# Descriptor: [B+ -> (J/psi(1S) -> mu+ mu-) K+ (pi0 -> gamma gamma)]cc
+#
+# NickName: Bu_JpsiKpi0,mm=DecProdCut
+#
+# Cuts: DaughtersInLHCb
+#
+# Documentation: DaughtersInLHCb
+# EndDocumentation
+#
+# CPUTime: 1 min
+# PhysicsWG: B2Ch
+# Tested: Yes
+# Responsible: Michal Kreps
+# Email: michal.kreps@cern.ch
+# Date: 20160714
+#
+Alias MyJ/psi J/psi
+ChargeConj MyJ/psi MyJ/psi
+Alias Mypi0 pi0
+ChargeConj Mypi0 Mypi0
+#
+Decay B+sig
+ 1.000 MyJ/psi K+ Mypi0 PHSP;
+Enddecay
+CDecay B-sig
+#
+Decay MyJ/psi
+ 1.000 mu+ mu- PHOTOS VLL;
+Enddecay
+#
+Decay Mypi0
+ 1.0 gamma gamma PHSP;
+Enddecay
+#
+End
+
diff --git a/Code/Ganga/decFiles/Bu_JpsiKst,mm,Kpi0=DecProdCut.dec b/Code/Ganga/decFiles/Bu_JpsiKst,mm,Kpi0=DecProdCut.dec
new file mode 100644
index 0000000..1187b74
--- /dev/null
+++ b/Code/Ganga/decFiles/Bu_JpsiKst,mm,Kpi0=DecProdCut.dec
@@ -0,0 +1,42 @@
+# EventType: 12143401
+#
+# Descriptor: [B+ -> (J/psi(1S) -> mu+ mu- {,gamma} {,gamma}) (K*(892)+ -> K+ pi0) ]cc
+#
+# NickName: Bu_JpsiKst,mm,Kpi0=DecProdCut
+#
+# Cuts: DaughtersInLHCb
+#
+# Documentation: Includes Radiative Mode, No CP violation
+# EndDocumentation
+#
+# PhysicsWG: RD
+# Tested: Yes
+# Responsible: Ailsa Sparkes
+# Email: patrickowen22@gmail.com
+# Date: 20111013
+#
+
+Alias MyJ/psi J/psi
+Alias MyK*+ K*+
+Alias MyK*- K*-
+ChargeConj MyK*+ MyK*-
+ChargeConj MyJ/psi MyJ/psi
+#
+Decay B+sig
+ 1.000 MyJ/psi MyK*+ SVV_HELAMP PKHplus PKphHplus PKHzero PKphHzero PKHminus PKphHminus;
+Enddecay
+Decay B-sig
+ 1.000 MyJ/psi MyK*- SVV_HELAMP PKHplus PKphHplus PKHzero PKphHzero PKHminus PKphHminus;
+Enddecay
+#
+Decay MyJ/psi
+ 1.000 mu+ mu- PHOTOS VLL;
+Enddecay
+#
+Decay MyK*+
+ 1.000 K+ pi0 PHSP;
+Enddecay
+CDecay MyK*-
+#
+End
+
diff --git a/Code/Ganga/decFiles/Bu_JpsiKst,mm,Kpi0=TightCut.dec b/Code/Ganga/decFiles/Bu_JpsiKst,mm,Kpi0=TightCut.dec
new file mode 100644
index 0000000..1ca4f2e
--- /dev/null
+++ b/Code/Ganga/decFiles/Bu_JpsiKst,mm,Kpi0=TightCut.dec
@@ -0,0 +1,69 @@
+# EventType: 12143402
+#
+# Descriptor: [B+ -> (J/psi(1S) -> mu+ mu-) (K*(892)+ -> K+ pi0) ]cc
+#
+# NickName: Bu_JpsiKst,mm,Kpi0=TightCut
+#
+# Cuts: LoKi::GenCutTool/TightCut
+#
+# InsertPythonCode:
+# #
+# from Configurables import LoKi__GenCutTool
+# gen = Generation()
+# gen.SignalRepeatedHadronization.addTool ( LoKi__GenCutTool , 'TightCut' )
+# #
+# tightCut = gen.SignalRepeatedHadronization.TightCut
+# tightCut.Decay = '[ B+ => ^( J/psi(1S) => ^mu+ ^mu-) (K*(892)+ => ^K+ (pi0 -> ^gamma ^gamma))]CC'
+# tightCut.Cuts = {
+# 'gamma' : ' goodGamma ' ,
+# '[mu+]cc' : ' goodMuon ' ,
+# '[K+]cc' : ' goodKaon ' ,
+# 'J/psi(1S)' : ' goodPsi ' }
+# tightCut.Preambulo += [
+# 'inAcc = in_range ( 0.005 , GTHETA , 0.400 ) ' ,
+# 'inEcalX = abs ( GPX / GPZ ) < 4.5 / 12.5 ' ,
+# 'inEcalY = abs ( GPY / GPZ ) < 3.5 / 12.5 ' ,
+# 'goodMuon = ( GPT > 500 * MeV ) & ( GP > 6 * GeV ) & inAcc ' ,
+# 'goodKaon = ( GPT > 150 * MeV ) & inAcc ' ,
+# 'goodGamma = ( 0 < GPZ ) & ( 150 * MeV < GPT ) & inEcalX & inEcalY ' ,
+# 'goodPsi = ( GPT > 500 * MeV ) & in_range ( 1.8 , GY , 4.5 ) ' ]
+#
+# EndInsertPythonCode
+#
+# Documentation:
+# Tight generator level cuts applied for all final state particles,
+# which increases the statistics with the factor of ~3.
+# EndDocumentation
+#
+# PhysicsWG: B2Ch
+# Tested: Yes
+# Responsible: Max Chefdeville
+# Email: chefdevi@lapp.in2p3.fr
+# Date: 20200428
+#
+## CPUTime: < 1 min
+#
+Alias MyJ/psi J/psi
+Alias MyK*+ K*+
+Alias MyK*- K*-
+ChargeConj MyK*+ MyK*-
+ChargeConj MyJ/psi MyJ/psi
+#
+Decay B+sig
+ 1.000 MyJ/psi MyK*+ SVV_HELAMP PKHplus PKphHplus PKHzero PKphHzero PKHminus PKphHminus;
+Enddecay
+Decay B-sig
+ 1.000 MyJ/psi MyK*- SVV_HELAMP PKHplus PKphHplus PKHzero PKphHzero PKHminus PKphHminus;
+Enddecay
+#
+Decay MyJ/psi
+ 1.000 mu+ mu- PHOTOS VLL;
+Enddecay
+#
+Decay MyK*+
+ 1.000 K+ pi0 PHSP;
+Enddecay
+CDecay MyK*-
+#
+End
+
diff --git a/Code/Ganga/decFiles/Bu_JpsiKst,mm,pipipi=DecProdCut.dec b/Code/Ganga/decFiles/Bu_JpsiKst,mm,pipipi=DecProdCut.dec
new file mode 100644
index 0000000..7184cf8
--- /dev/null
+++ b/Code/Ganga/decFiles/Bu_JpsiKst,mm,pipipi=DecProdCut.dec
@@ -0,0 +1,53 @@
+# EventType: 12145102
+#
+# Descriptor: [B+ -> (J/psi(1S) -> mu+ mu-) (K*+ -> (K0S -> pi+ pi-) pi+)]cc
+#
+# NickName: Bu_JpsiKst,mm,pipipi=DecProdCut
+#
+# Cuts: DaughtersInLHCb
+#
+# Documentation: J/psi forced into mu+ mu-, K*+ -> K*+ forced into Ks0 pi+, Ks0 forced into pi+ pi-
+# EndDocumentation
+#
+# PhysicsWG: RD
+# Tested: Yes
+# Responsible: David Gerick
+# Email: david.gerick@cern.ch
+# Date: 20160704
+# CPUTime: <1min
+#
+Define PKHplus 0.159
+Define PKHzero 0.775
+Define PKHminus 0.612
+Define PKphHplus 1.563
+Define PKphHzero 0.0
+Define PKphHminus 2.712
+#
+Alias MyJ/psi J/psi
+Alias MyK*+ K*+
+Alias MyK*- K*-
+Alias MyKs K_S0
+ChargeConj MyK*+ MyK*-
+ChargeConj MyJ/psi MyJ/psi
+ChargeConj MyKs MyKs
+#
+Decay B+sig
+1.000 MyJ/psi MyK*+ SVV_HELAMP PKHplus PKphHplus PKHzero PKphHzero PKHminus PKphHminus;
+Enddecay
+Decay B-sig
+1.000 MyJ/psi MyK*- SVV_HELAMP PKHminus PKphHminus PKHzero PKphHzero PKHplus PKphHplus;
+Enddecay
+#
+Decay MyJ/psi
+1.000 mu+ mu- PHOTOS VLL;
+Enddecay
+#
+Decay MyK*+
+1.000 MyKs pi+ VSS;
+Enddecay
+CDecay MyK*-
+Decay MyKs
+ 1.000 pi+ pi- PHSP;
+Enddecay
+#
+End
diff --git a/Code/Ganga/decFiles/Bu_KstPhi,KsPi+K+K-=DecProdCut.dec b/Code/Ganga/decFiles/Bu_KstPhi,KsPi+K+K-=DecProdCut.dec
new file mode 100644
index 0000000..7f7939f
--- /dev/null
+++ b/Code/Ganga/decFiles/Bu_KstPhi,KsPi+K+K-=DecProdCut.dec
@@ -0,0 +1,45 @@
+# EventType: 12100004
+# NickName: Bu_KstPhi,KsPi+K+K-=DecProdCut
+# Descriptor: [B+-> (K*+ -> Ks pi+) (phi -> K+ K-)]cc
+#
+# Documentation: K* forced into Ks pi, Daughters in LHCb Acceptance
+# EndDocumentation
+#
+# PhysicsWG: BnoC
+#
+# Cuts: DaughtersInLHCb
+#
+# Responsible: Luigi Li Gioi
+# Email: luigi.li.gioi@cern.ch
+#
+# Tested: Yes
+# Date: 20111020
+#
+Alias MyKst+ K*+
+Alias MyKst- K*-
+ChargeConj MyKst+ MyKst-
+Alias MyKs K_S0
+ChargeConj MyKs MyKs
+Alias Myphi phi
+ChargeConj Myphi Myphi
+#
+Decay B+sig
+ 1.000 Myphi MyKst+ SVV_HELAMP 1.0 0.0 1.7 0.0 1.0 0.0;
+Enddecay
+CDecay B-sig
+#
+Decay Myphi
+ 1.000 K+ K- VSS;
+Enddecay
+#
+Decay MyKst+
+ 1.000 MyKs pi+ VSS;
+Enddecay
+CDecay MyKst-
+#
+Decay MyKs
+ 1.000 pi+ pi- PHSP;
+Enddecay
+#
+End
+#
diff --git a/Code/Ganga/decFiles/Bu_Kstmumu,KSpi=DecProdCut.dec b/Code/Ganga/decFiles/Bu_Kstmumu,KSpi=DecProdCut.dec
new file mode 100644
index 0000000..67988d6
--- /dev/null
+++ b/Code/Ganga/decFiles/Bu_Kstmumu,KSpi=DecProdCut.dec
@@ -0,0 +1,41 @@
+# $Id: Bu_Kstmumu,KSpi=DecProdCut.dec 129164 2011-09-18 12:38:47Z robbep $
+#
+# EventType: 12115102
+#
+# Descriptor: [B+ -> mu+ mu- (K*+ -> K0S pi+)]cc
+#
+# NickName: Bu_Kstmumu,KSpi=DecProdCut
+#
+# Cuts: DaughtersInLHCb
+#
+# Documentation: K*+ forced into Ks0 pi+, Ks0 forced into pi+ pi-
+# EndDocumentation
+#
+# PhysicsWG: RD
+# Tested: Yes
+# Responsible: Patrick Owen
+# Email: patrickowen22@gmail.com
+# Date: 20110921
+#
+Alias MyKst+ K*+
+Alias MyKst- K*-
+ChargeConj MyKst+ MyKst-
+Alias MyKs K_S0
+ChargeConj MyKs MyKs
+#
+Decay B+sig
+ 1.000 MyKst+ mu+ mu- BTOSLLBALL;
+Enddecay
+CDecay B-sig
+#
+Decay MyKst+
+ 1.000 MyKs pi+ VSS;
+Enddecay
+CDecay MyKst-
+#
+Decay MyKs
+ 1.000 pi+ pi- PHSP;
+Enddecay
+#
+End
+#
diff --git a/Code/Ganga/decFiles/Bu_Kstmumu,Kpi0=DecProdCut.dec b/Code/Ganga/decFiles/Bu_Kstmumu,Kpi0=DecProdCut.dec
new file mode 100644
index 0000000..f528d43
--- /dev/null
+++ b/Code/Ganga/decFiles/Bu_Kstmumu,Kpi0=DecProdCut.dec
@@ -0,0 +1,35 @@
+# $Id: Bu_Kstmumu,Kpi0=DecProdCut.dec 129164 2011-09-18 12:38:47Z robbep $
+#
+# EventType: 12113100
+#
+# Descriptor: [B+ -> mu+ mu- (K*+ -> K+ pi0)]cc
+#
+# NickName: Bu_Kstmumu,Kpi0=DecProdCut
+#
+# Cuts: DaughtersInLHCb
+#
+# Documentation: Kst+ forced to K+ pi0
+# EndDocumentation
+#
+# PhysicsWG: RD
+# Tested: Yes
+# Responsible: Patrick Owen
+# Email: patrickowen22@gmail.com
+# Date: 20110921
+#
+Alias MyKst+ K*+
+Alias MyKst- K*-
+ChargeConj MyKst+ MyKst-
+#
+Decay B+sig
+ 1.000 MyKst+ mu+ mu- BTOSLLBALL;
+Enddecay
+CDecay B-sig
+#
+Decay MyKst+
+ 1.000 K+ pi0 VSS;
+Enddecay
+CDecay MyKst-
+#
+End
+#
diff --git a/Code/Ganga/lfnFiles/B0toKstJpsi_2011MagDown.py b/Code/Ganga/lfnFiles/B0toKstJpsi_2011MagDown.py
new file mode 100644
index 0000000..229cb4d
--- /dev/null
+++ b/Code/Ganga/lfnFiles/B0toKstJpsi_2011MagDown.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00042098/0000/00042098_00000001_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00042098/0000/00042098_00000002_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00042098/0000/00042098_00000003_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00042098/0000/00042098_00000004_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00042098/0000/00042098_00000005_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00042098/0000/00042098_00000006_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00042098/0000/00042098_00000007_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00042098/0000/00042098_00000008_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00042098/0000/00042098_00000009_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00042098/0000/00042098_00000011_2.AllStreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/B0toKstJpsi_2011MagDown_Kplus.py b/Code/Ganga/lfnFiles/B0toKstJpsi_2011MagDown_Kplus.py
new file mode 100644
index 0000000..229cb4d
--- /dev/null
+++ b/Code/Ganga/lfnFiles/B0toKstJpsi_2011MagDown_Kplus.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00042098/0000/00042098_00000001_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00042098/0000/00042098_00000002_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00042098/0000/00042098_00000003_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00042098/0000/00042098_00000004_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00042098/0000/00042098_00000005_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00042098/0000/00042098_00000006_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00042098/0000/00042098_00000007_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00042098/0000/00042098_00000008_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00042098/0000/00042098_00000009_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00042098/0000/00042098_00000011_2.AllStreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/B0toKstJpsi_2011MagUp.py b/Code/Ganga/lfnFiles/B0toKstJpsi_2011MagUp.py
new file mode 100644
index 0000000..6e52489
--- /dev/null
+++ b/Code/Ganga/lfnFiles/B0toKstJpsi_2011MagUp.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00042096/0000/00042096_00000001_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00042096/0000/00042096_00000002_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00042096/0000/00042096_00000003_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00042096/0000/00042096_00000004_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00042096/0000/00042096_00000005_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00042096/0000/00042096_00000006_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00042096/0000/00042096_00000007_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00042096/0000/00042096_00000008_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00042096/0000/00042096_00000009_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00042096/0000/00042096_00000011_2.AllStreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/B0toKstJpsi_2011MagUp_Kplus.py b/Code/Ganga/lfnFiles/B0toKstJpsi_2011MagUp_Kplus.py
new file mode 100644
index 0000000..6e52489
--- /dev/null
+++ b/Code/Ganga/lfnFiles/B0toKstJpsi_2011MagUp_Kplus.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00042096/0000/00042096_00000001_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00042096/0000/00042096_00000002_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00042096/0000/00042096_00000003_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00042096/0000/00042096_00000004_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00042096/0000/00042096_00000005_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00042096/0000/00042096_00000006_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00042096/0000/00042096_00000007_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00042096/0000/00042096_00000008_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00042096/0000/00042096_00000009_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00042096/0000/00042096_00000011_2.AllStreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/B0toKstJpsi_2012MagDown.py b/Code/Ganga/lfnFiles/B0toKstJpsi_2012MagDown.py
new file mode 100644
index 0000000..6d0a7e2
--- /dev/null
+++ b/Code/Ganga/lfnFiles/B0toKstJpsi_2012MagDown.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00042094/0000/00042094_00000001_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00042094/0000/00042094_00000002_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00042094/0000/00042094_00000003_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00042094/0000/00042094_00000004_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00042094/0000/00042094_00000005_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00042094/0000/00042094_00000006_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00042094/0000/00042094_00000007_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00042094/0000/00042094_00000008_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00042094/0000/00042094_00000009_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00042094/0000/00042094_00000012_2.AllStreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/B0toKstJpsi_2012MagDown_Kplus.py b/Code/Ganga/lfnFiles/B0toKstJpsi_2012MagDown_Kplus.py
new file mode 100644
index 0000000..6d0a7e2
--- /dev/null
+++ b/Code/Ganga/lfnFiles/B0toKstJpsi_2012MagDown_Kplus.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00042094/0000/00042094_00000001_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00042094/0000/00042094_00000002_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00042094/0000/00042094_00000003_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00042094/0000/00042094_00000004_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00042094/0000/00042094_00000005_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00042094/0000/00042094_00000006_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00042094/0000/00042094_00000007_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00042094/0000/00042094_00000008_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00042094/0000/00042094_00000009_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00042094/0000/00042094_00000012_2.AllStreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/B0toKstJpsi_2012MagUp.py b/Code/Ganga/lfnFiles/B0toKstJpsi_2012MagUp.py
new file mode 100644
index 0000000..339b004
--- /dev/null
+++ b/Code/Ganga/lfnFiles/B0toKstJpsi_2012MagUp.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00042092/0000/00042092_00000001_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00042092/0000/00042092_00000002_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00042092/0000/00042092_00000003_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00042092/0000/00042092_00000004_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00042092/0000/00042092_00000005_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00042092/0000/00042092_00000006_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00042092/0000/00042092_00000007_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00042092/0000/00042092_00000008_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00042092/0000/00042092_00000009_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00042092/0000/00042092_00000011_2.AllStreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/B0toKstJpsi_2012MagUp_Kplus.py b/Code/Ganga/lfnFiles/B0toKstJpsi_2012MagUp_Kplus.py
new file mode 100644
index 0000000..339b004
--- /dev/null
+++ b/Code/Ganga/lfnFiles/B0toKstJpsi_2012MagUp_Kplus.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00042092/0000/00042092_00000001_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00042092/0000/00042092_00000002_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00042092/0000/00042092_00000003_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00042092/0000/00042092_00000004_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00042092/0000/00042092_00000005_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00042092/0000/00042092_00000006_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00042092/0000/00042092_00000007_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00042092/0000/00042092_00000008_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00042092/0000/00042092_00000009_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00042092/0000/00042092_00000011_2.AllStreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/B0toKstJpsi_2015MagDown.py b/Code/Ganga/lfnFiles/B0toKstJpsi_2015MagDown.py
new file mode 100644
index 0000000..a8d2ea9
--- /dev/null
+++ b/Code/Ganga/lfnFiles/B0toKstJpsi_2015MagDown.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00075398/0000/00075398_00000001_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00075398/0000/00075398_00000002_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00075398/0000/00075398_00000003_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00075398/0000/00075398_00000004_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00075398/0000/00075398_00000005_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00075398/0000/00075398_00000006_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00075398/0000/00075398_00000007_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00075398/0000/00075398_00000008_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00075398/0000/00075398_00000009_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00075398/0000/00075398_00000012_6.AllStreams.mdst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/B0toKstJpsi_2015MagDown_Kplus.py b/Code/Ganga/lfnFiles/B0toKstJpsi_2015MagDown_Kplus.py
new file mode 100644
index 0000000..a8d2ea9
--- /dev/null
+++ b/Code/Ganga/lfnFiles/B0toKstJpsi_2015MagDown_Kplus.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00075398/0000/00075398_00000001_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00075398/0000/00075398_00000002_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00075398/0000/00075398_00000003_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00075398/0000/00075398_00000004_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00075398/0000/00075398_00000005_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00075398/0000/00075398_00000006_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00075398/0000/00075398_00000007_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00075398/0000/00075398_00000008_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00075398/0000/00075398_00000009_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00075398/0000/00075398_00000012_6.AllStreams.mdst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/B0toKstJpsi_2015MagUp.py b/Code/Ganga/lfnFiles/B0toKstJpsi_2015MagUp.py
new file mode 100644
index 0000000..bc8f6b7
--- /dev/null
+++ b/Code/Ganga/lfnFiles/B0toKstJpsi_2015MagUp.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00075400/0000/00075400_00000001_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00075400/0000/00075400_00000002_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00075400/0000/00075400_00000003_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00075400/0000/00075400_00000004_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00075400/0000/00075400_00000005_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00075400/0000/00075400_00000007_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00075400/0000/00075400_00000008_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00075400/0000/00075400_00000009_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00075400/0000/00075400_00000010_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00075400/0000/00075400_00000012_6.AllStreams.mdst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/B0toKstJpsi_2015MagUp_Kplus.py b/Code/Ganga/lfnFiles/B0toKstJpsi_2015MagUp_Kplus.py
new file mode 100644
index 0000000..bc8f6b7
--- /dev/null
+++ b/Code/Ganga/lfnFiles/B0toKstJpsi_2015MagUp_Kplus.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00075400/0000/00075400_00000001_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00075400/0000/00075400_00000002_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00075400/0000/00075400_00000003_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00075400/0000/00075400_00000004_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00075400/0000/00075400_00000005_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00075400/0000/00075400_00000007_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00075400/0000/00075400_00000008_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00075400/0000/00075400_00000009_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00075400/0000/00075400_00000010_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00075400/0000/00075400_00000012_6.AllStreams.mdst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/B0toKstJpsi_2016MagDown.py b/Code/Ganga/lfnFiles/B0toKstJpsi_2016MagDown.py
new file mode 100644
index 0000000..5ceba66
--- /dev/null
+++ b/Code/Ganga/lfnFiles/B0toKstJpsi_2016MagDown.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00075394/0000/00075394_00000001_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00075394/0000/00075394_00000002_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00075394/0000/00075394_00000003_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00075394/0000/00075394_00000004_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00075394/0000/00075394_00000005_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00075394/0000/00075394_00000006_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00075394/0000/00075394_00000007_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00075394/0000/00075394_00000008_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00075394/0000/00075394_00000009_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00075394/0000/00075394_00000011_7.AllStreams.mdst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/B0toKstJpsi_2016MagDown_Kplus.py b/Code/Ganga/lfnFiles/B0toKstJpsi_2016MagDown_Kplus.py
new file mode 100644
index 0000000..5ceba66
--- /dev/null
+++ b/Code/Ganga/lfnFiles/B0toKstJpsi_2016MagDown_Kplus.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00075394/0000/00075394_00000001_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00075394/0000/00075394_00000002_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00075394/0000/00075394_00000003_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00075394/0000/00075394_00000004_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00075394/0000/00075394_00000005_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00075394/0000/00075394_00000006_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00075394/0000/00075394_00000007_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00075394/0000/00075394_00000008_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00075394/0000/00075394_00000009_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00075394/0000/00075394_00000011_7.AllStreams.mdst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/B0toKstJpsi_2016MagUp.py b/Code/Ganga/lfnFiles/B0toKstJpsi_2016MagUp.py
new file mode 100644
index 0000000..bf44049
--- /dev/null
+++ b/Code/Ganga/lfnFiles/B0toKstJpsi_2016MagUp.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00075396/0000/00075396_00000001_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00075396/0000/00075396_00000002_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00075396/0000/00075396_00000003_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00075396/0000/00075396_00000004_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00075396/0000/00075396_00000005_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00075396/0000/00075396_00000006_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00075396/0000/00075396_00000007_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00075396/0000/00075396_00000008_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00075396/0000/00075396_00000009_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00075396/0000/00075396_00000011_7.AllStreams.mdst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/B0toKstJpsi_2016MagUp_Kplus.py b/Code/Ganga/lfnFiles/B0toKstJpsi_2016MagUp_Kplus.py
new file mode 100644
index 0000000..bf44049
--- /dev/null
+++ b/Code/Ganga/lfnFiles/B0toKstJpsi_2016MagUp_Kplus.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00075396/0000/00075396_00000001_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00075396/0000/00075396_00000002_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00075396/0000/00075396_00000003_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00075396/0000/00075396_00000004_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00075396/0000/00075396_00000005_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00075396/0000/00075396_00000006_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00075396/0000/00075396_00000007_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00075396/0000/00075396_00000008_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00075396/0000/00075396_00000009_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00075396/0000/00075396_00000011_7.AllStreams.mdst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/B0toKstMuMu_2011MagDown.py b/Code/Ganga/lfnFiles/B0toKstMuMu_2011MagDown.py
new file mode 100644
index 0000000..eefeccb
--- /dev/null
+++ b/Code/Ganga/lfnFiles/B0toKstMuMu_2011MagDown.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00038003/0000/00038003_00000001_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00038003/0000/00038003_00000002_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00038003/0000/00038003_00000003_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00038003/0000/00038003_00000004_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00038003/0000/00038003_00000005_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00038003/0000/00038003_00000006_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00038003/0000/00038003_00000007_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00038003/0000/00038003_00000008_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00038003/0000/00038003_00000009_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00038003/0000/00038003_00000011_1.allstreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/B0toKstMuMu_2011MagDown_Kplus.py b/Code/Ganga/lfnFiles/B0toKstMuMu_2011MagDown_Kplus.py
new file mode 100644
index 0000000..eefeccb
--- /dev/null
+++ b/Code/Ganga/lfnFiles/B0toKstMuMu_2011MagDown_Kplus.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00038003/0000/00038003_00000001_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00038003/0000/00038003_00000002_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00038003/0000/00038003_00000003_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00038003/0000/00038003_00000004_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00038003/0000/00038003_00000005_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00038003/0000/00038003_00000006_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00038003/0000/00038003_00000007_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00038003/0000/00038003_00000008_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00038003/0000/00038003_00000009_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00038003/0000/00038003_00000011_1.allstreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/B0toKstMuMu_2011MagUp.py b/Code/Ganga/lfnFiles/B0toKstMuMu_2011MagUp.py
new file mode 100644
index 0000000..af4b94a
--- /dev/null
+++ b/Code/Ganga/lfnFiles/B0toKstMuMu_2011MagUp.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00038001/0000/00038001_00000001_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00038001/0000/00038001_00000002_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00038001/0000/00038001_00000003_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00038001/0000/00038001_00000004_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00038001/0000/00038001_00000005_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00038001/0000/00038001_00000006_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00038001/0000/00038001_00000007_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00038001/0000/00038001_00000008_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00038001/0000/00038001_00000009_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00038001/0000/00038001_00000011_1.allstreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/B0toKstMuMu_2011MagUp_Kplus.py b/Code/Ganga/lfnFiles/B0toKstMuMu_2011MagUp_Kplus.py
new file mode 100644
index 0000000..af4b94a
--- /dev/null
+++ b/Code/Ganga/lfnFiles/B0toKstMuMu_2011MagUp_Kplus.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00038001/0000/00038001_00000001_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00038001/0000/00038001_00000002_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00038001/0000/00038001_00000003_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00038001/0000/00038001_00000004_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00038001/0000/00038001_00000005_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00038001/0000/00038001_00000006_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00038001/0000/00038001_00000007_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00038001/0000/00038001_00000008_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00038001/0000/00038001_00000009_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00038001/0000/00038001_00000011_1.allstreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/B0toKstMuMu_2012MagDown.py b/Code/Ganga/lfnFiles/B0toKstMuMu_2012MagDown.py
new file mode 100644
index 0000000..6de9ef4
--- /dev/null
+++ b/Code/Ganga/lfnFiles/B0toKstMuMu_2012MagDown.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030541/0000/00030541_00000001_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030541/0000/00030541_00000002_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030541/0000/00030541_00000003_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030541/0000/00030541_00000004_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030541/0000/00030541_00000005_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030541/0000/00030541_00000006_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030541/0000/00030541_00000007_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030541/0000/00030541_00000008_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030541/0000/00030541_00000009_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030541/0000/00030541_00000011_1.allstreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/B0toKstMuMu_2012MagDown_Kplus.py b/Code/Ganga/lfnFiles/B0toKstMuMu_2012MagDown_Kplus.py
new file mode 100644
index 0000000..6de9ef4
--- /dev/null
+++ b/Code/Ganga/lfnFiles/B0toKstMuMu_2012MagDown_Kplus.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030541/0000/00030541_00000001_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030541/0000/00030541_00000002_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030541/0000/00030541_00000003_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030541/0000/00030541_00000004_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030541/0000/00030541_00000005_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030541/0000/00030541_00000006_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030541/0000/00030541_00000007_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030541/0000/00030541_00000008_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030541/0000/00030541_00000009_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030541/0000/00030541_00000011_1.allstreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/B0toKstMuMu_2012MagUp.py b/Code/Ganga/lfnFiles/B0toKstMuMu_2012MagUp.py
new file mode 100644
index 0000000..9c00634
--- /dev/null
+++ b/Code/Ganga/lfnFiles/B0toKstMuMu_2012MagUp.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030535/0000/00030535_00000001_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030535/0000/00030535_00000002_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030535/0000/00030535_00000003_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030535/0000/00030535_00000004_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030535/0000/00030535_00000005_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030535/0000/00030535_00000006_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030535/0000/00030535_00000007_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030535/0000/00030535_00000008_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030535/0000/00030535_00000009_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030535/0000/00030535_00000011_1.allstreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/B0toKstMuMu_2012MagUp_Kplus.py b/Code/Ganga/lfnFiles/B0toKstMuMu_2012MagUp_Kplus.py
new file mode 100644
index 0000000..9c00634
--- /dev/null
+++ b/Code/Ganga/lfnFiles/B0toKstMuMu_2012MagUp_Kplus.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030535/0000/00030535_00000001_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030535/0000/00030535_00000002_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030535/0000/00030535_00000003_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030535/0000/00030535_00000004_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030535/0000/00030535_00000005_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030535/0000/00030535_00000006_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030535/0000/00030535_00000007_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030535/0000/00030535_00000008_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030535/0000/00030535_00000009_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030535/0000/00030535_00000011_1.allstreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/B0toKstMuMu_2015MagDown.py b/Code/Ganga/lfnFiles/B0toKstMuMu_2015MagDown.py
new file mode 100644
index 0000000..fd6932e
--- /dev/null
+++ b/Code/Ganga/lfnFiles/B0toKstMuMu_2015MagDown.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2015/ALLSTREAMS.DST/00070002/0000/00070002_00000001_6.AllStreams.dst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.DST/00070002/0000/00070002_00000002_6.AllStreams.dst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.DST/00070002/0000/00070002_00000003_6.AllStreams.dst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.DST/00070002/0000/00070002_00000004_6.AllStreams.dst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.DST/00070002/0000/00070002_00000005_6.AllStreams.dst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.DST/00070002/0000/00070002_00000006_6.AllStreams.dst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.DST/00070002/0000/00070002_00000007_6.AllStreams.dst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.DST/00070002/0000/00070002_00000008_6.AllStreams.dst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.DST/00070002/0000/00070002_00000009_6.AllStreams.dst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.DST/00070002/0000/00070002_00000011_6.AllStreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/B0toKstMuMu_2015MagDown_Kplus.py b/Code/Ganga/lfnFiles/B0toKstMuMu_2015MagDown_Kplus.py
new file mode 100644
index 0000000..fd6932e
--- /dev/null
+++ b/Code/Ganga/lfnFiles/B0toKstMuMu_2015MagDown_Kplus.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2015/ALLSTREAMS.DST/00070002/0000/00070002_00000001_6.AllStreams.dst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.DST/00070002/0000/00070002_00000002_6.AllStreams.dst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.DST/00070002/0000/00070002_00000003_6.AllStreams.dst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.DST/00070002/0000/00070002_00000004_6.AllStreams.dst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.DST/00070002/0000/00070002_00000005_6.AllStreams.dst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.DST/00070002/0000/00070002_00000006_6.AllStreams.dst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.DST/00070002/0000/00070002_00000007_6.AllStreams.dst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.DST/00070002/0000/00070002_00000008_6.AllStreams.dst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.DST/00070002/0000/00070002_00000009_6.AllStreams.dst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.DST/00070002/0000/00070002_00000011_6.AllStreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/B0toKstMuMu_2015MagUp.py b/Code/Ganga/lfnFiles/B0toKstMuMu_2015MagUp.py
new file mode 100644
index 0000000..937d18a
--- /dev/null
+++ b/Code/Ganga/lfnFiles/B0toKstMuMu_2015MagUp.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2015/ALLSTREAMS.DST/00070016/0000/00070016_00000001_6.AllStreams.dst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.DST/00070016/0000/00070016_00000002_6.AllStreams.dst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.DST/00070016/0000/00070016_00000003_6.AllStreams.dst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.DST/00070016/0000/00070016_00000004_6.AllStreams.dst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.DST/00070016/0000/00070016_00000005_6.AllStreams.dst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.DST/00070016/0000/00070016_00000006_6.AllStreams.dst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.DST/00070016/0000/00070016_00000007_6.AllStreams.dst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.DST/00070016/0000/00070016_00000008_6.AllStreams.dst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.DST/00070016/0000/00070016_00000009_6.AllStreams.dst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.DST/00070016/0000/00070016_00000011_6.AllStreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/B0toKstMuMu_2015MagUp_Kplus.py b/Code/Ganga/lfnFiles/B0toKstMuMu_2015MagUp_Kplus.py
new file mode 100644
index 0000000..937d18a
--- /dev/null
+++ b/Code/Ganga/lfnFiles/B0toKstMuMu_2015MagUp_Kplus.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2015/ALLSTREAMS.DST/00070016/0000/00070016_00000001_6.AllStreams.dst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.DST/00070016/0000/00070016_00000002_6.AllStreams.dst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.DST/00070016/0000/00070016_00000003_6.AllStreams.dst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.DST/00070016/0000/00070016_00000004_6.AllStreams.dst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.DST/00070016/0000/00070016_00000005_6.AllStreams.dst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.DST/00070016/0000/00070016_00000006_6.AllStreams.dst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.DST/00070016/0000/00070016_00000007_6.AllStreams.dst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.DST/00070016/0000/00070016_00000008_6.AllStreams.dst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.DST/00070016/0000/00070016_00000009_6.AllStreams.dst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.DST/00070016/0000/00070016_00000011_6.AllStreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/B0toKstMuMu_2016MagDown.py b/Code/Ganga/lfnFiles/B0toKstMuMu_2016MagDown.py
new file mode 100644
index 0000000..905995b
--- /dev/null
+++ b/Code/Ganga/lfnFiles/B0toKstMuMu_2016MagDown.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056297/0000/00056297_00000004_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056297/0000/00056297_00000005_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056297/0000/00056297_00000007_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056297/0000/00056297_00000009_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056297/0000/00056297_00000011_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056297/0000/00056297_00000013_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056297/0000/00056297_00000014_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056297/0000/00056297_00000016_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056297/0000/00056297_00000017_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056297/0000/00056297_00000019_3.AllStreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/B0toKstMuMu_2016MagDown_Kplus.py b/Code/Ganga/lfnFiles/B0toKstMuMu_2016MagDown_Kplus.py
new file mode 100644
index 0000000..905995b
--- /dev/null
+++ b/Code/Ganga/lfnFiles/B0toKstMuMu_2016MagDown_Kplus.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056297/0000/00056297_00000004_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056297/0000/00056297_00000005_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056297/0000/00056297_00000007_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056297/0000/00056297_00000009_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056297/0000/00056297_00000011_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056297/0000/00056297_00000013_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056297/0000/00056297_00000014_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056297/0000/00056297_00000016_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056297/0000/00056297_00000017_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056297/0000/00056297_00000019_3.AllStreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/B0toKstMuMu_2016MagUp.py b/Code/Ganga/lfnFiles/B0toKstMuMu_2016MagUp.py
new file mode 100644
index 0000000..abf9da9
--- /dev/null
+++ b/Code/Ganga/lfnFiles/B0toKstMuMu_2016MagUp.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056295/0000/00056295_00000001_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056295/0000/00056295_00000002_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056295/0000/00056295_00000005_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056295/0000/00056295_00000007_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056295/0000/00056295_00000008_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056295/0000/00056295_00000009_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056295/0000/00056295_00000011_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056295/0000/00056295_00000012_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056295/0000/00056295_00000015_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056295/0000/00056295_00000018_3.AllStreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/B0toKstMuMu_2016MagUp_Kplus.py b/Code/Ganga/lfnFiles/B0toKstMuMu_2016MagUp_Kplus.py
new file mode 100644
index 0000000..abf9da9
--- /dev/null
+++ b/Code/Ganga/lfnFiles/B0toKstMuMu_2016MagUp_Kplus.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056295/0000/00056295_00000001_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056295/0000/00056295_00000002_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056295/0000/00056295_00000005_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056295/0000/00056295_00000007_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056295/0000/00056295_00000008_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056295/0000/00056295_00000009_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056295/0000/00056295_00000011_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056295/0000/00056295_00000012_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056295/0000/00056295_00000015_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056295/0000/00056295_00000018_3.AllStreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoK1Jpsi_2012MagDown.py b/Code/Ganga/lfnFiles/BtoK1Jpsi_2012MagDown.py
new file mode 100644
index 0000000..e722cf6
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoK1Jpsi_2012MagDown.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00029556/0000/00029556_00000001_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00029556/0000/00029556_00000002_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00029556/0000/00029556_00000003_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00029556/0000/00029556_00000004_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00029556/0000/00029556_00000005_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00029556/0000/00029556_00000006_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00029556/0000/00029556_00000007_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00029556/0000/00029556_00000008_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00029556/0000/00029556_00000009_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00029556/0000/00029556_00000011_1.allstreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoK1Jpsi_2012MagDown_Kplus.py b/Code/Ganga/lfnFiles/BtoK1Jpsi_2012MagDown_Kplus.py
new file mode 100644
index 0000000..631622a
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoK1Jpsi_2012MagDown_Kplus.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00026684/0000/00026684_00000001_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00026684/0000/00026684_00000002_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00026684/0000/00026684_00000003_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00026684/0000/00026684_00000004_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00026684/0000/00026684_00000005_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00026684/0000/00026684_00000006_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00026684/0000/00026684_00000007_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00026684/0000/00026684_00000008_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00026684/0000/00026684_00000009_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00026684/0000/00026684_00000012_1.allstreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoK1Jpsi_2012MagUp.py b/Code/Ganga/lfnFiles/BtoK1Jpsi_2012MagUp.py
new file mode 100644
index 0000000..99e69ff
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoK1Jpsi_2012MagUp.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00029548/0000/00029548_00000001_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00029548/0000/00029548_00000002_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00029548/0000/00029548_00000003_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00029548/0000/00029548_00000004_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00029548/0000/00029548_00000005_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00029548/0000/00029548_00000006_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00029548/0000/00029548_00000007_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00029548/0000/00029548_00000008_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00029548/0000/00029548_00000009_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00029548/0000/00029548_00000013_1.allstreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoK1Jpsi_2012MagUp_Kplus.py b/Code/Ganga/lfnFiles/BtoK1Jpsi_2012MagUp_Kplus.py
new file mode 100644
index 0000000..cab415e
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoK1Jpsi_2012MagUp_Kplus.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00026676/0000/00026676_00000001_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00026676/0000/00026676_00000002_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00026676/0000/00026676_00000003_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00026676/0000/00026676_00000004_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00026676/0000/00026676_00000005_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00026676/0000/00026676_00000006_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00026676/0000/00026676_00000007_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00026676/0000/00026676_00000008_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00026676/0000/00026676_00000009_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00026676/0000/00026676_00000011_1.allstreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoK1MuMu_2011MagDown.py b/Code/Ganga/lfnFiles/BtoK1MuMu_2011MagDown.py
new file mode 100644
index 0000000..eb548f3
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoK1MuMu_2011MagDown.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00035964/0000/00035964_00000001_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00035964/0000/00035964_00000002_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00035964/0000/00035964_00000003_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00035964/0000/00035964_00000004_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00035964/0000/00035964_00000005_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00035964/0000/00035964_00000006_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00035964/0000/00035964_00000007_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00035964/0000/00035964_00000008_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00035964/0000/00035964_00000009_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00035964/0000/00035964_00000011_1.allstreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoK1MuMu_2011MagUp.py b/Code/Ganga/lfnFiles/BtoK1MuMu_2011MagUp.py
new file mode 100644
index 0000000..c787af7
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoK1MuMu_2011MagUp.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00035956/0000/00035956_00000001_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00035956/0000/00035956_00000002_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00035956/0000/00035956_00000003_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00035956/0000/00035956_00000004_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00035956/0000/00035956_00000005_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00035956/0000/00035956_00000006_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00035956/0000/00035956_00000007_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00035956/0000/00035956_00000009_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00035956/0000/00035956_00000010_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00035956/0000/00035956_00000012_1.allstreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoK1MuMu_2012MagDown.py b/Code/Ganga/lfnFiles/BtoK1MuMu_2012MagDown.py
new file mode 100644
index 0000000..34c99d2
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoK1MuMu_2012MagDown.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00035982/0000/00035982_00000001_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00035982/0000/00035982_00000002_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00035982/0000/00035982_00000003_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00035982/0000/00035982_00000004_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00035982/0000/00035982_00000005_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00035982/0000/00035982_00000006_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00035982/0000/00035982_00000007_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00035982/0000/00035982_00000008_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00035982/0000/00035982_00000009_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00035982/0000/00035982_00000011_1.allstreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoK1MuMu_2012MagUp.py b/Code/Ganga/lfnFiles/BtoK1MuMu_2012MagUp.py
new file mode 100644
index 0000000..8aab008
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoK1MuMu_2012MagUp.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00035976/0000/00035976_00000001_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00035976/0000/00035976_00000002_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00035976/0000/00035976_00000004_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00035976/0000/00035976_00000005_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00035976/0000/00035976_00000006_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00035976/0000/00035976_00000007_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00035976/0000/00035976_00000008_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00035976/0000/00035976_00000009_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00035976/0000/00035976_00000010_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00035976/0000/00035976_00000012_1.allstreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoKstJpsi_2011MagDown.py b/Code/Ganga/lfnFiles/BtoKstJpsi_2011MagDown.py
new file mode 100644
index 0000000..b51528c
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoKstJpsi_2011MagDown.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054094/0000/00054094_00000002_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054094/0000/00054094_00000003_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054094/0000/00054094_00000004_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054094/0000/00054094_00000005_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054094/0000/00054094_00000006_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054094/0000/00054094_00000007_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054094/0000/00054094_00000008_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054094/0000/00054094_00000009_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054094/0000/00054094_00000010_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054094/0000/00054094_00000012_2.AllStreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoKstJpsi_2011MagDown_Kplus.py b/Code/Ganga/lfnFiles/BtoKstJpsi_2011MagDown_Kplus.py
new file mode 100644
index 0000000..b51528c
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoKstJpsi_2011MagDown_Kplus.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054094/0000/00054094_00000002_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054094/0000/00054094_00000003_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054094/0000/00054094_00000004_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054094/0000/00054094_00000005_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054094/0000/00054094_00000006_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054094/0000/00054094_00000007_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054094/0000/00054094_00000008_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054094/0000/00054094_00000009_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054094/0000/00054094_00000010_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054094/0000/00054094_00000012_2.AllStreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoKstJpsi_2011MagDown_Kshort.py b/Code/Ganga/lfnFiles/BtoKstJpsi_2011MagDown_Kshort.py
new file mode 100644
index 0000000..2178662
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoKstJpsi_2011MagDown_Kshort.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054092/0000/00054092_00000001_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054092/0000/00054092_00000002_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054092/0000/00054092_00000003_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054092/0000/00054092_00000004_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054092/0000/00054092_00000005_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054092/0000/00054092_00000006_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054092/0000/00054092_00000007_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054092/0000/00054092_00000008_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054092/0000/00054092_00000009_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054092/0000/00054092_00000011_2.AllStreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoKstJpsi_2011MagUp.py b/Code/Ganga/lfnFiles/BtoKstJpsi_2011MagUp.py
new file mode 100644
index 0000000..16bdb16
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoKstJpsi_2011MagUp.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054086/0000/00054086_00000001_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054086/0000/00054086_00000002_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054086/0000/00054086_00000003_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054086/0000/00054086_00000004_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054086/0000/00054086_00000005_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054086/0000/00054086_00000006_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054086/0000/00054086_00000007_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054086/0000/00054086_00000008_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054086/0000/00054086_00000009_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054086/0000/00054086_00000011_2.AllStreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoKstJpsi_2011MagUp_Kplus.py b/Code/Ganga/lfnFiles/BtoKstJpsi_2011MagUp_Kplus.py
new file mode 100644
index 0000000..16bdb16
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoKstJpsi_2011MagUp_Kplus.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054086/0000/00054086_00000001_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054086/0000/00054086_00000002_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054086/0000/00054086_00000003_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054086/0000/00054086_00000004_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054086/0000/00054086_00000005_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054086/0000/00054086_00000006_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054086/0000/00054086_00000007_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054086/0000/00054086_00000008_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054086/0000/00054086_00000009_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054086/0000/00054086_00000011_2.AllStreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoKstJpsi_2011MagUp_Kshort.py b/Code/Ganga/lfnFiles/BtoKstJpsi_2011MagUp_Kshort.py
new file mode 100644
index 0000000..b885837
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoKstJpsi_2011MagUp_Kshort.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054084/0000/00054084_00000001_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054084/0000/00054084_00000003_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054084/0000/00054084_00000004_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054084/0000/00054084_00000005_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054084/0000/00054084_00000006_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054084/0000/00054084_00000007_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054084/0000/00054084_00000008_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054084/0000/00054084_00000009_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054084/0000/00054084_00000010_2.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00054084/0000/00054084_00000012_2.AllStreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoKstJpsi_2012MagDown.py b/Code/Ganga/lfnFiles/BtoKstJpsi_2012MagDown.py
new file mode 100644
index 0000000..94694f4
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoKstJpsi_2012MagDown.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054108/0000/00054108_00000001_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054108/0000/00054108_00000002_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054108/0000/00054108_00000004_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054108/0000/00054108_00000005_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054108/0000/00054108_00000006_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054108/0000/00054108_00000007_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054108/0000/00054108_00000008_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054108/0000/00054108_00000009_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054108/0000/00054108_00000010_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054108/0000/00054108_00000012_2.AllStreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoKstJpsi_2012MagDown_Kplus.py b/Code/Ganga/lfnFiles/BtoKstJpsi_2012MagDown_Kplus.py
new file mode 100644
index 0000000..94694f4
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoKstJpsi_2012MagDown_Kplus.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054108/0000/00054108_00000001_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054108/0000/00054108_00000002_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054108/0000/00054108_00000004_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054108/0000/00054108_00000005_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054108/0000/00054108_00000006_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054108/0000/00054108_00000007_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054108/0000/00054108_00000008_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054108/0000/00054108_00000009_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054108/0000/00054108_00000010_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054108/0000/00054108_00000012_2.AllStreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoKstJpsi_2012MagDown_Kshort.py b/Code/Ganga/lfnFiles/BtoKstJpsi_2012MagDown_Kshort.py
new file mode 100644
index 0000000..2732ae4
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoKstJpsi_2012MagDown_Kshort.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054110/0000/00054110_00000002_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054110/0000/00054110_00000003_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054110/0000/00054110_00000004_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054110/0000/00054110_00000005_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054110/0000/00054110_00000007_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054110/0000/00054110_00000008_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054110/0000/00054110_00000009_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054110/0000/00054110_00000010_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054110/0000/00054110_00000011_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054110/0000/00054110_00000013_2.AllStreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoKstJpsi_2012MagUp.py b/Code/Ganga/lfnFiles/BtoKstJpsi_2012MagUp.py
new file mode 100644
index 0000000..385d0b3
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoKstJpsi_2012MagUp.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054104/0000/00054104_00000001_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054104/0000/00054104_00000002_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054104/0000/00054104_00000003_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054104/0000/00054104_00000004_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054104/0000/00054104_00000005_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054104/0000/00054104_00000006_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054104/0000/00054104_00000007_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054104/0000/00054104_00000008_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054104/0000/00054104_00000009_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054104/0000/00054104_00000011_2.AllStreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoKstJpsi_2012MagUp_Kplus.py b/Code/Ganga/lfnFiles/BtoKstJpsi_2012MagUp_Kplus.py
new file mode 100644
index 0000000..385d0b3
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoKstJpsi_2012MagUp_Kplus.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054104/0000/00054104_00000001_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054104/0000/00054104_00000002_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054104/0000/00054104_00000003_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054104/0000/00054104_00000004_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054104/0000/00054104_00000005_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054104/0000/00054104_00000006_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054104/0000/00054104_00000007_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054104/0000/00054104_00000008_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054104/0000/00054104_00000009_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054104/0000/00054104_00000011_2.AllStreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoKstJpsi_2012MagUp_Kshort.py b/Code/Ganga/lfnFiles/BtoKstJpsi_2012MagUp_Kshort.py
new file mode 100644
index 0000000..d25350b
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoKstJpsi_2012MagUp_Kshort.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054102/0000/00054102_00000002_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054102/0000/00054102_00000003_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054102/0000/00054102_00000004_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054102/0000/00054102_00000005_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054102/0000/00054102_00000006_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054102/0000/00054102_00000007_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054102/0000/00054102_00000008_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054102/0000/00054102_00000009_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054102/0000/00054102_00000010_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054102/0000/00054102_00000012_2.AllStreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoKstMuMu_2011MagDown.py b/Code/Ganga/lfnFiles/BtoKstMuMu_2011MagDown.py
new file mode 100644
index 0000000..58433da
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoKstMuMu_2011MagDown.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00066811/0000/00066811_00000001_5.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00066811/0000/00066811_00000002_5.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00066811/0000/00066811_00000003_5.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00066811/0000/00066811_00000004_5.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00066811/0000/00066811_00000005_5.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00066811/0000/00066811_00000006_5.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00066811/0000/00066811_00000007_5.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00066811/0000/00066811_00000008_5.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00066811/0000/00066811_00000009_5.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00066811/0000/00066811_00000011_5.AllStreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoKstMuMu_2011MagDown_Kplus.py b/Code/Ganga/lfnFiles/BtoKstMuMu_2011MagDown_Kplus.py
new file mode 100644
index 0000000..58433da
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoKstMuMu_2011MagDown_Kplus.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00066811/0000/00066811_00000001_5.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00066811/0000/00066811_00000002_5.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00066811/0000/00066811_00000003_5.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00066811/0000/00066811_00000004_5.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00066811/0000/00066811_00000005_5.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00066811/0000/00066811_00000006_5.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00066811/0000/00066811_00000007_5.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00066811/0000/00066811_00000008_5.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00066811/0000/00066811_00000009_5.AllStreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00066811/0000/00066811_00000011_5.AllStreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoKstMuMu_2011MagDown_Kshort.py b/Code/Ganga/lfnFiles/BtoKstMuMu_2011MagDown_Kshort.py
new file mode 100644
index 0000000..ff66196
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoKstMuMu_2011MagDown_Kshort.py
@@ -0,0 +1,5 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoKstMuMu_2011MagUp.py b/Code/Ganga/lfnFiles/BtoKstMuMu_2011MagUp.py
new file mode 100644
index 0000000..ff66196
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoKstMuMu_2011MagUp.py
@@ -0,0 +1,5 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoKstMuMu_2011MagUp_Kplus.py b/Code/Ganga/lfnFiles/BtoKstMuMu_2011MagUp_Kplus.py
new file mode 100644
index 0000000..ff66196
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoKstMuMu_2011MagUp_Kplus.py
@@ -0,0 +1,5 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoKstMuMu_2011MagUp_Kshort.py b/Code/Ganga/lfnFiles/BtoKstMuMu_2011MagUp_Kshort.py
new file mode 100644
index 0000000..ff66196
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoKstMuMu_2011MagUp_Kshort.py
@@ -0,0 +1,5 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoKstMuMu_2012MagDown.py b/Code/Ganga/lfnFiles/BtoKstMuMu_2012MagDown.py
new file mode 100644
index 0000000..936fd24
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoKstMuMu_2012MagDown.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054112/0000/00054112_00000001_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054112/0000/00054112_00000002_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054112/0000/00054112_00000003_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054112/0000/00054112_00000004_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054112/0000/00054112_00000005_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054112/0000/00054112_00000007_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054112/0000/00054112_00000008_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054112/0000/00054112_00000009_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054112/0000/00054112_00000010_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054112/0000/00054112_00000012_2.AllStreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoKstMuMu_2012MagDown_Kplus.py b/Code/Ganga/lfnFiles/BtoKstMuMu_2012MagDown_Kplus.py
new file mode 100644
index 0000000..936fd24
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoKstMuMu_2012MagDown_Kplus.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054112/0000/00054112_00000001_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054112/0000/00054112_00000002_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054112/0000/00054112_00000003_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054112/0000/00054112_00000004_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054112/0000/00054112_00000005_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054112/0000/00054112_00000007_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054112/0000/00054112_00000008_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054112/0000/00054112_00000009_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054112/0000/00054112_00000010_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054112/0000/00054112_00000012_2.AllStreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoKstMuMu_2012MagDown_Kshort.py b/Code/Ganga/lfnFiles/BtoKstMuMu_2012MagDown_Kshort.py
new file mode 100644
index 0000000..954b7ee
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoKstMuMu_2012MagDown_Kshort.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054106/0000/00054106_00000001_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054106/0000/00054106_00000002_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054106/0000/00054106_00000004_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054106/0000/00054106_00000005_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054106/0000/00054106_00000006_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054106/0000/00054106_00000007_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054106/0000/00054106_00000008_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054106/0000/00054106_00000010_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054106/0000/00054106_00000011_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054106/0000/00054106_00000013_2.AllStreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoKstMuMu_2012MagUp.py b/Code/Ganga/lfnFiles/BtoKstMuMu_2012MagUp.py
new file mode 100644
index 0000000..70ea2cf
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoKstMuMu_2012MagUp.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054100/0000/00054100_00000001_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054100/0000/00054100_00000002_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054100/0000/00054100_00000003_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054100/0000/00054100_00000004_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054100/0000/00054100_00000006_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054100/0000/00054100_00000007_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054100/0000/00054100_00000008_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054100/0000/00054100_00000009_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054100/0000/00054100_00000010_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054100/0000/00054100_00000012_2.AllStreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoKstMuMu_2012MagUp_Kplus.py b/Code/Ganga/lfnFiles/BtoKstMuMu_2012MagUp_Kplus.py
new file mode 100644
index 0000000..70ea2cf
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoKstMuMu_2012MagUp_Kplus.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054100/0000/00054100_00000001_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054100/0000/00054100_00000002_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054100/0000/00054100_00000003_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054100/0000/00054100_00000004_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054100/0000/00054100_00000006_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054100/0000/00054100_00000007_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054100/0000/00054100_00000008_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054100/0000/00054100_00000009_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054100/0000/00054100_00000010_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054100/0000/00054100_00000012_2.AllStreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoKstMuMu_2012MagUp_Kshort.py b/Code/Ganga/lfnFiles/BtoKstMuMu_2012MagUp_Kshort.py
new file mode 100644
index 0000000..0f78d4c
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoKstMuMu_2012MagUp_Kshort.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054098/0000/00054098_00000001_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054098/0000/00054098_00000003_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054098/0000/00054098_00000004_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054098/0000/00054098_00000006_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054098/0000/00054098_00000007_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054098/0000/00054098_00000011_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054098/0000/00054098_00000012_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054098/0000/00054098_00000013_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054098/0000/00054098_00000014_2.AllStreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00054098/0000/00054098_00000016_2.AllStreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoKstMuMu_2015MagDown.py b/Code/Ganga/lfnFiles/BtoKstMuMu_2015MagDown.py
new file mode 100644
index 0000000..448ef94
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoKstMuMu_2015MagDown.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00064958/0000/00064958_00000001_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00064958/0000/00064958_00000002_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00064958/0000/00064958_00000003_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00064958/0000/00064958_00000004_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00064958/0000/00064958_00000005_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00064958/0000/00064958_00000007_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00064958/0000/00064958_00000008_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00064958/0000/00064958_00000009_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00064958/0000/00064958_00000010_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00064958/0000/00064958_00000012_6.AllStreams.mdst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoKstMuMu_2015MagDown_Kplus.py b/Code/Ganga/lfnFiles/BtoKstMuMu_2015MagDown_Kplus.py
new file mode 100644
index 0000000..448ef94
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoKstMuMu_2015MagDown_Kplus.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00064958/0000/00064958_00000001_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00064958/0000/00064958_00000002_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00064958/0000/00064958_00000003_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00064958/0000/00064958_00000004_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00064958/0000/00064958_00000005_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00064958/0000/00064958_00000007_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00064958/0000/00064958_00000008_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00064958/0000/00064958_00000009_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00064958/0000/00064958_00000010_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00064958/0000/00064958_00000012_6.AllStreams.mdst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoKstMuMu_2015MagDown_Kshort.py b/Code/Ganga/lfnFiles/BtoKstMuMu_2015MagDown_Kshort.py
new file mode 100644
index 0000000..de1b39b
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoKstMuMu_2015MagDown_Kshort.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00064956/0000/00064956_00000001_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00064956/0000/00064956_00000002_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00064956/0000/00064956_00000003_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00064956/0000/00064956_00000004_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00064956/0000/00064956_00000005_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00064956/0000/00064956_00000006_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00064956/0000/00064956_00000007_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00064956/0000/00064956_00000009_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00064956/0000/00064956_00000010_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00064956/0000/00064956_00000012_6.AllStreams.mdst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoKstMuMu_2015MagUp.py b/Code/Ganga/lfnFiles/BtoKstMuMu_2015MagUp.py
new file mode 100644
index 0000000..c07fd6a
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoKstMuMu_2015MagUp.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00065364/0000/00065364_00000001_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00065364/0000/00065364_00000002_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00065364/0000/00065364_00000003_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00065364/0000/00065364_00000004_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00065364/0000/00065364_00000005_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00065364/0000/00065364_00000006_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00065364/0000/00065364_00000008_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00065364/0000/00065364_00000009_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00065364/0000/00065364_00000010_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00065364/0000/00065364_00000012_6.AllStreams.mdst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoKstMuMu_2015MagUp_Kplus.py b/Code/Ganga/lfnFiles/BtoKstMuMu_2015MagUp_Kplus.py
new file mode 100644
index 0000000..c07fd6a
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoKstMuMu_2015MagUp_Kplus.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00065364/0000/00065364_00000001_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00065364/0000/00065364_00000002_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00065364/0000/00065364_00000003_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00065364/0000/00065364_00000004_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00065364/0000/00065364_00000005_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00065364/0000/00065364_00000006_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00065364/0000/00065364_00000008_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00065364/0000/00065364_00000009_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00065364/0000/00065364_00000010_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00065364/0000/00065364_00000012_6.AllStreams.mdst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoKstMuMu_2015MagUp_Kshort.py b/Code/Ganga/lfnFiles/BtoKstMuMu_2015MagUp_Kshort.py
new file mode 100644
index 0000000..93e7a0e
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoKstMuMu_2015MagUp_Kshort.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00065366/0000/00065366_00000001_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00065366/0000/00065366_00000002_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00065366/0000/00065366_00000003_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00065366/0000/00065366_00000004_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00065366/0000/00065366_00000005_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00065366/0000/00065366_00000006_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00065366/0000/00065366_00000007_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00065366/0000/00065366_00000008_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00065366/0000/00065366_00000009_6.AllStreams.mdst',
+'LFN:/lhcb/MC/2015/ALLSTREAMS.MDST/00065366/0000/00065366_00000011_6.AllStreams.mdst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoKstMuMu_2016MagDown.py b/Code/Ganga/lfnFiles/BtoKstMuMu_2016MagDown.py
new file mode 100644
index 0000000..cf5f437
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoKstMuMu_2016MagDown.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065612/0000/00065612_00000001_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065612/0000/00065612_00000002_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065612/0000/00065612_00000003_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065612/0000/00065612_00000004_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065612/0000/00065612_00000005_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065612/0000/00065612_00000006_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065612/0000/00065612_00000007_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065612/0000/00065612_00000008_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065612/0000/00065612_00000009_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065612/0000/00065612_00000012_7.AllStreams.mdst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoKstMuMu_2016MagDown_Kplus.py b/Code/Ganga/lfnFiles/BtoKstMuMu_2016MagDown_Kplus.py
new file mode 100644
index 0000000..cf5f437
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoKstMuMu_2016MagDown_Kplus.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065612/0000/00065612_00000001_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065612/0000/00065612_00000002_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065612/0000/00065612_00000003_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065612/0000/00065612_00000004_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065612/0000/00065612_00000005_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065612/0000/00065612_00000006_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065612/0000/00065612_00000007_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065612/0000/00065612_00000008_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065612/0000/00065612_00000009_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065612/0000/00065612_00000012_7.AllStreams.mdst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoKstMuMu_2016MagDown_Kshort.py b/Code/Ganga/lfnFiles/BtoKstMuMu_2016MagDown_Kshort.py
new file mode 100644
index 0000000..a8b91fc
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoKstMuMu_2016MagDown_Kshort.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065614/0000/00065614_00000001_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065614/0000/00065614_00000002_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065614/0000/00065614_00000003_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065614/0000/00065614_00000004_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065614/0000/00065614_00000005_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065614/0000/00065614_00000006_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065614/0000/00065614_00000007_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065614/0000/00065614_00000008_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065614/0000/00065614_00000009_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065614/0000/00065614_00000011_7.AllStreams.mdst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoKstMuMu_2016MagUp.py b/Code/Ganga/lfnFiles/BtoKstMuMu_2016MagUp.py
new file mode 100644
index 0000000..33e0d20
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoKstMuMu_2016MagUp.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065610/0000/00065610_00000001_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065610/0000/00065610_00000002_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065610/0000/00065610_00000003_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065610/0000/00065610_00000005_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065610/0000/00065610_00000006_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065610/0000/00065610_00000007_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065610/0000/00065610_00000008_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065610/0000/00065610_00000009_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065610/0000/00065610_00000010_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065610/0000/00065610_00000013_7.AllStreams.mdst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoKstMuMu_2016MagUp_Kplus.py b/Code/Ganga/lfnFiles/BtoKstMuMu_2016MagUp_Kplus.py
new file mode 100644
index 0000000..33e0d20
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoKstMuMu_2016MagUp_Kplus.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065610/0000/00065610_00000001_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065610/0000/00065610_00000002_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065610/0000/00065610_00000003_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065610/0000/00065610_00000005_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065610/0000/00065610_00000006_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065610/0000/00065610_00000007_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065610/0000/00065610_00000008_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065610/0000/00065610_00000009_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065610/0000/00065610_00000010_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065610/0000/00065610_00000013_7.AllStreams.mdst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoKstMuMu_2016MagUp_Kshort.py b/Code/Ganga/lfnFiles/BtoKstMuMu_2016MagUp_Kshort.py
new file mode 100644
index 0000000..ff7dc86
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoKstMuMu_2016MagUp_Kshort.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065608/0000/00065608_00000001_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065608/0000/00065608_00000002_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065608/0000/00065608_00000003_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065608/0000/00065608_00000004_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065608/0000/00065608_00000005_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065608/0000/00065608_00000006_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065608/0000/00065608_00000007_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065608/0000/00065608_00000009_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065608/0000/00065608_00000012_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.MDST/00065608/0000/00065608_00000015_7.AllStreams.mdst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoKstMuMu_2017MagDown_Kplus.py b/Code/Ganga/lfnFiles/BtoKstMuMu_2017MagDown_Kplus.py
new file mode 100644
index 0000000..acad8e1
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoKstMuMu_2017MagDown_Kplus.py
@@ -0,0 +1,34 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084053/0000/00084053_00000001_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084053/0000/00084053_00000002_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084053/0000/00084053_00000003_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084053/0000/00084053_00000004_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084053/0000/00084053_00000006_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084053/0000/00084053_00000007_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084053/0000/00084053_00000008_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084053/0000/00084053_00000009_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084053/0000/00084053_00000010_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084053/0000/00084053_00000011_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084053/0000/00084053_00000012_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084053/0000/00084053_00000013_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084053/0000/00084053_00000014_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084053/0000/00084053_00000015_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084053/0000/00084053_00000016_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084053/0000/00084053_00000017_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084053/0000/00084053_00000018_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084053/0000/00084053_00000019_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084053/0000/00084053_00000020_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084053/0000/00084053_00000021_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084053/0000/00084053_00000022_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084053/0000/00084053_00000023_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084053/0000/00084053_00000024_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084053/0000/00084053_00000025_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084053/0000/00084053_00000027_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084053/0000/00084053_00000029_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084053/0000/00084053_00000030_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084053/0000/00084053_00000031_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084053/0000/00084053_00000032_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084053/0000/00084053_00000034_7.AllStreams.mdst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoKstMuMu_2017MagDown_Kshort.py b/Code/Ganga/lfnFiles/BtoKstMuMu_2017MagDown_Kshort.py
new file mode 100644
index 0000000..7499ec6
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoKstMuMu_2017MagDown_Kshort.py
@@ -0,0 +1,35 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084051/0000/00084051_00000294_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084051/0000/00084051_00000001_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084051/0000/00084051_00000002_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084051/0000/00084051_00000003_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084051/0000/00084051_00000004_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084051/0000/00084051_00000005_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084051/0000/00084051_00000006_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084051/0000/00084051_00000007_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084051/0000/00084051_00000008_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084051/0000/00084051_00000009_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084051/0000/00084051_00000010_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084051/0000/00084051_00000011_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084051/0000/00084051_00000012_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084051/0000/00084051_00000013_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084051/0000/00084051_00000014_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084051/0000/00084051_00000015_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084051/0000/00084051_00000017_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084051/0000/00084051_00000018_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084051/0000/00084051_00000019_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084051/0000/00084051_00000020_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084051/0000/00084051_00000021_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084051/0000/00084051_00000023_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084051/0000/00084051_00000024_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084051/0000/00084051_00000025_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084051/0000/00084051_00000026_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084051/0000/00084051_00000027_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084051/0000/00084051_00000028_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084051/0000/00084051_00000029_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084051/0000/00084051_00000030_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084051/0000/00084051_00000031_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084051/0000/00084051_00000033_7.AllStreams.mdst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoKstMuMu_2017MagUp_Kplus.py b/Code/Ganga/lfnFiles/BtoKstMuMu_2017MagUp_Kplus.py
new file mode 100644
index 0000000..519eebc
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoKstMuMu_2017MagUp_Kplus.py
@@ -0,0 +1,34 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084049/0000/00084049_00000001_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084049/0000/00084049_00000002_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084049/0000/00084049_00000003_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084049/0000/00084049_00000004_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084049/0000/00084049_00000005_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084049/0000/00084049_00000006_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084049/0000/00084049_00000007_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084049/0000/00084049_00000008_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084049/0000/00084049_00000010_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084049/0000/00084049_00000011_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084049/0000/00084049_00000012_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084049/0000/00084049_00000013_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084049/0000/00084049_00000014_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084049/0000/00084049_00000016_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084049/0000/00084049_00000017_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084049/0000/00084049_00000018_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084049/0000/00084049_00000019_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084049/0000/00084049_00000021_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084049/0000/00084049_00000022_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084049/0000/00084049_00000023_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084049/0000/00084049_00000024_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084049/0000/00084049_00000025_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084049/0000/00084049_00000026_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084049/0000/00084049_00000027_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084049/0000/00084049_00000028_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084049/0000/00084049_00000029_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084049/0000/00084049_00000030_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084049/0000/00084049_00000031_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084049/0000/00084049_00000032_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084049/0000/00084049_00000034_7.AllStreams.mdst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoKstMuMu_2017MagUp_Kshort.py b/Code/Ganga/lfnFiles/BtoKstMuMu_2017MagUp_Kshort.py
new file mode 100644
index 0000000..defe1ce
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoKstMuMu_2017MagUp_Kshort.py
@@ -0,0 +1,34 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084047/0000/00084047_00000001_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084047/0000/00084047_00000002_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084047/0000/00084047_00000003_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084047/0000/00084047_00000004_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084047/0000/00084047_00000005_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084047/0000/00084047_00000006_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084047/0000/00084047_00000008_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084047/0000/00084047_00000009_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084047/0000/00084047_00000010_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084047/0000/00084047_00000011_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084047/0000/00084047_00000012_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084047/0000/00084047_00000013_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084047/0000/00084047_00000014_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084047/0000/00084047_00000016_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084047/0000/00084047_00000017_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084047/0000/00084047_00000018_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084047/0000/00084047_00000019_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084047/0000/00084047_00000020_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084047/0000/00084047_00000021_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084047/0000/00084047_00000022_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084047/0000/00084047_00000023_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084047/0000/00084047_00000024_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084047/0000/00084047_00000025_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084047/0000/00084047_00000027_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084047/0000/00084047_00000028_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084047/0000/00084047_00000029_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084047/0000/00084047_00000030_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084047/0000/00084047_00000031_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084047/0000/00084047_00000032_7.AllStreams.mdst',
+'LFN:/lhcb/MC/2017/ALLSTREAMS.MDST/00084047/0000/00084047_00000035_7.AllStreams.mdst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoXJpsi_2011MagDown.py b/Code/Ganga/lfnFiles/BtoXJpsi_2011MagDown.py
new file mode 100644
index 0000000..5260838
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoXJpsi_2011MagDown.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00031970/0000/00031970_00000001_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00031970/0000/00031970_00000002_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00031970/0000/00031970_00000003_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00031970/0000/00031970_00000004_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00031970/0000/00031970_00000005_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00031970/0000/00031970_00000006_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00031970/0000/00031970_00000007_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00031970/0000/00031970_00000008_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00031970/0000/00031970_00000009_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00031970/0000/00031970_00000011_1.allstreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoXJpsi_2011MagDown_Kplus.py b/Code/Ganga/lfnFiles/BtoXJpsi_2011MagDown_Kplus.py
new file mode 100644
index 0000000..5260838
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoXJpsi_2011MagDown_Kplus.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00031970/0000/00031970_00000001_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00031970/0000/00031970_00000002_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00031970/0000/00031970_00000003_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00031970/0000/00031970_00000004_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00031970/0000/00031970_00000005_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00031970/0000/00031970_00000006_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00031970/0000/00031970_00000007_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00031970/0000/00031970_00000008_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00031970/0000/00031970_00000009_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00031970/0000/00031970_00000011_1.allstreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoXJpsi_2011MagUp.py b/Code/Ganga/lfnFiles/BtoXJpsi_2011MagUp.py
new file mode 100644
index 0000000..a789426
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoXJpsi_2011MagUp.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00031972/0000/00031972_00000001_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00031972/0000/00031972_00000002_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00031972/0000/00031972_00000003_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00031972/0000/00031972_00000004_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00031972/0000/00031972_00000005_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00031972/0000/00031972_00000006_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00031972/0000/00031972_00000007_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00031972/0000/00031972_00000008_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00031972/0000/00031972_00000009_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00031972/0000/00031972_00000011_1.allstreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoXJpsi_2011MagUp_Kplus.py b/Code/Ganga/lfnFiles/BtoXJpsi_2011MagUp_Kplus.py
new file mode 100644
index 0000000..a789426
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoXJpsi_2011MagUp_Kplus.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00031972/0000/00031972_00000001_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00031972/0000/00031972_00000002_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00031972/0000/00031972_00000003_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00031972/0000/00031972_00000004_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00031972/0000/00031972_00000005_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00031972/0000/00031972_00000006_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00031972/0000/00031972_00000007_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00031972/0000/00031972_00000008_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00031972/0000/00031972_00000009_1.allstreams.dst',
+'LFN:/lhcb/MC/2011/ALLSTREAMS.DST/00031972/0000/00031972_00000011_1.allstreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoXJpsi_2012MagDown.py b/Code/Ganga/lfnFiles/BtoXJpsi_2012MagDown.py
new file mode 100644
index 0000000..9547604
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoXJpsi_2012MagDown.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030122/0000/00030122_00000001_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030122/0000/00030122_00000002_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030122/0000/00030122_00000003_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030122/0000/00030122_00000004_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030122/0000/00030122_00000005_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030122/0000/00030122_00000006_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030122/0000/00030122_00000007_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030122/0000/00030122_00000008_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030122/0000/00030122_00000009_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030122/0000/00030122_00000011_1.allstreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoXJpsi_2012MagDown_Kplus.py b/Code/Ganga/lfnFiles/BtoXJpsi_2012MagDown_Kplus.py
new file mode 100644
index 0000000..9547604
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoXJpsi_2012MagDown_Kplus.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030122/0000/00030122_00000001_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030122/0000/00030122_00000002_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030122/0000/00030122_00000003_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030122/0000/00030122_00000004_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030122/0000/00030122_00000005_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030122/0000/00030122_00000006_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030122/0000/00030122_00000007_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030122/0000/00030122_00000008_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030122/0000/00030122_00000009_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030122/0000/00030122_00000011_1.allstreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoXJpsi_2012MagUp.py b/Code/Ganga/lfnFiles/BtoXJpsi_2012MagUp.py
new file mode 100644
index 0000000..889ba40
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoXJpsi_2012MagUp.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030124/0000/00030124_00000001_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030124/0000/00030124_00000002_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030124/0000/00030124_00000003_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030124/0000/00030124_00000004_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030124/0000/00030124_00000005_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030124/0000/00030124_00000006_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030124/0000/00030124_00000007_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030124/0000/00030124_00000008_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030124/0000/00030124_00000009_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030124/0000/00030124_00000011_1.allstreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoXJpsi_2012MagUp_Kplus.py b/Code/Ganga/lfnFiles/BtoXJpsi_2012MagUp_Kplus.py
new file mode 100644
index 0000000..889ba40
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoXJpsi_2012MagUp_Kplus.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030124/0000/00030124_00000001_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030124/0000/00030124_00000002_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030124/0000/00030124_00000003_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030124/0000/00030124_00000004_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030124/0000/00030124_00000005_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030124/0000/00030124_00000006_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030124/0000/00030124_00000007_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030124/0000/00030124_00000008_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030124/0000/00030124_00000009_1.allstreams.dst',
+'LFN:/lhcb/MC/2012/ALLSTREAMS.DST/00030124/0000/00030124_00000011_1.allstreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoXJpsi_2015MagDown_Kplus.py b/Code/Ganga/lfnFiles/BtoXJpsi_2015MagDown_Kplus.py
new file mode 100644
index 0000000..0adb99a
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoXJpsi_2015MagDown_Kplus.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/Dev/ALLSTREAMS.MDST/00049506/0000/00049506_00000001_3.AllStreams.mdst',
+'LFN:/lhcb/MC/Dev/ALLSTREAMS.MDST/00049506/0000/00049506_00000002_3.AllStreams.mdst',
+'LFN:/lhcb/MC/Dev/ALLSTREAMS.MDST/00049506/0000/00049506_00000003_3.AllStreams.mdst',
+'LFN:/lhcb/MC/Dev/ALLSTREAMS.MDST/00049506/0000/00049506_00000004_3.AllStreams.mdst',
+'LFN:/lhcb/MC/Dev/ALLSTREAMS.MDST/00049506/0000/00049506_00000005_3.AllStreams.mdst',
+'LFN:/lhcb/MC/Dev/ALLSTREAMS.MDST/00049506/0000/00049506_00000006_3.AllStreams.mdst',
+'LFN:/lhcb/MC/Dev/ALLSTREAMS.MDST/00049506/0000/00049506_00000007_3.AllStreams.mdst',
+'LFN:/lhcb/MC/Dev/ALLSTREAMS.MDST/00049506/0000/00049506_00000008_3.AllStreams.mdst',
+'LFN:/lhcb/MC/Dev/ALLSTREAMS.MDST/00049506/0000/00049506_00000009_3.AllStreams.mdst',
+'LFN:/lhcb/MC/Dev/ALLSTREAMS.MDST/00049506/0000/00049506_00000011_3.AllStreams.mdst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoXJpsi_2015MagUp_Kplus.py b/Code/Ganga/lfnFiles/BtoXJpsi_2015MagUp_Kplus.py
new file mode 100644
index 0000000..87b3b17
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoXJpsi_2015MagUp_Kplus.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/Dev/ALLSTREAMS.MDST/00049512/0000/00049512_00000002_3.AllStreams.mdst',
+'LFN:/lhcb/MC/Dev/ALLSTREAMS.MDST/00049512/0000/00049512_00000003_3.AllStreams.mdst',
+'LFN:/lhcb/MC/Dev/ALLSTREAMS.MDST/00049512/0000/00049512_00000004_3.AllStreams.mdst',
+'LFN:/lhcb/MC/Dev/ALLSTREAMS.MDST/00049512/0000/00049512_00000005_3.AllStreams.mdst',
+'LFN:/lhcb/MC/Dev/ALLSTREAMS.MDST/00049512/0000/00049512_00000006_3.AllStreams.mdst',
+'LFN:/lhcb/MC/Dev/ALLSTREAMS.MDST/00049512/0000/00049512_00000008_3.AllStreams.mdst',
+'LFN:/lhcb/MC/Dev/ALLSTREAMS.MDST/00049512/0000/00049512_00000009_3.AllStreams.mdst',
+'LFN:/lhcb/MC/Dev/ALLSTREAMS.MDST/00049512/0000/00049512_00000010_3.AllStreams.mdst',
+'LFN:/lhcb/MC/Dev/ALLSTREAMS.MDST/00049512/0000/00049512_00000011_3.AllStreams.mdst',
+'LFN:/lhcb/MC/Dev/ALLSTREAMS.MDST/00049512/0000/00049512_00000013_3.AllStreams.mdst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoXJpsi_2016MagDown.py b/Code/Ganga/lfnFiles/BtoXJpsi_2016MagDown.py
new file mode 100644
index 0000000..47e7904
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoXJpsi_2016MagDown.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056657/0000/00056657_00000001_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056657/0000/00056657_00000002_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056657/0000/00056657_00000003_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056657/0000/00056657_00000004_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056657/0000/00056657_00000005_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056657/0000/00056657_00000006_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056657/0000/00056657_00000007_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056657/0000/00056657_00000008_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056657/0000/00056657_00000009_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056657/0000/00056657_00000011_3.AllStreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoXJpsi_2016MagDown_Kplus.py b/Code/Ganga/lfnFiles/BtoXJpsi_2016MagDown_Kplus.py
new file mode 100644
index 0000000..47e7904
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoXJpsi_2016MagDown_Kplus.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056657/0000/00056657_00000001_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056657/0000/00056657_00000002_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056657/0000/00056657_00000003_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056657/0000/00056657_00000004_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056657/0000/00056657_00000005_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056657/0000/00056657_00000006_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056657/0000/00056657_00000007_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056657/0000/00056657_00000008_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056657/0000/00056657_00000009_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056657/0000/00056657_00000011_3.AllStreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoXJpsi_2016MagUp.py b/Code/Ganga/lfnFiles/BtoXJpsi_2016MagUp.py
new file mode 100644
index 0000000..66686f0
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoXJpsi_2016MagUp.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056663/0000/00056663_00000001_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056663/0000/00056663_00000002_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056663/0000/00056663_00000003_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056663/0000/00056663_00000004_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056663/0000/00056663_00000005_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056663/0000/00056663_00000006_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056663/0000/00056663_00000007_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056663/0000/00056663_00000008_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056663/0000/00056663_00000009_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056663/0000/00056663_00000011_3.AllStreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/BtoXJpsi_2016MagUp_Kplus.py b/Code/Ganga/lfnFiles/BtoXJpsi_2016MagUp_Kplus.py
new file mode 100644
index 0000000..66686f0
--- /dev/null
+++ b/Code/Ganga/lfnFiles/BtoXJpsi_2016MagUp_Kplus.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056663/0000/00056663_00000001_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056663/0000/00056663_00000002_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056663/0000/00056663_00000003_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056663/0000/00056663_00000004_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056663/0000/00056663_00000005_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056663/0000/00056663_00000006_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056663/0000/00056663_00000007_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056663/0000/00056663_00000008_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056663/0000/00056663_00000009_3.AllStreams.dst',
+'LFN:/lhcb/MC/2016/ALLSTREAMS.DST/00056663/0000/00056663_00000011_3.AllStreams.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/PHSP_2011MagDown.py b/Code/Ganga/lfnFiles/PHSP_2011MagDown.py
new file mode 100644
index 0000000..354be7b
--- /dev/null
+++ b/Code/Ganga/lfnFiles/PHSP_2011MagDown.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2011/B2XMUMU.STRIP.DST/00067814/0000/00067814_00000001_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2011/B2XMUMU.STRIP.DST/00067814/0000/00067814_00000002_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2011/B2XMUMU.STRIP.DST/00067814/0000/00067814_00000003_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2011/B2XMUMU.STRIP.DST/00067814/0000/00067814_00000004_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2011/B2XMUMU.STRIP.DST/00067814/0000/00067814_00000005_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2011/B2XMUMU.STRIP.DST/00067814/0000/00067814_00000006_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2011/B2XMUMU.STRIP.DST/00067814/0000/00067814_00000007_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2011/B2XMUMU.STRIP.DST/00067814/0000/00067814_00000008_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2011/B2XMUMU.STRIP.DST/00067814/0000/00067814_00000009_1.b2xmumu.strip.dst',
+'LFN:'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/PHSP_2011MagDown_Kplus.py b/Code/Ganga/lfnFiles/PHSP_2011MagDown_Kplus.py
new file mode 100644
index 0000000..354be7b
--- /dev/null
+++ b/Code/Ganga/lfnFiles/PHSP_2011MagDown_Kplus.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2011/B2XMUMU.STRIP.DST/00067814/0000/00067814_00000001_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2011/B2XMUMU.STRIP.DST/00067814/0000/00067814_00000002_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2011/B2XMUMU.STRIP.DST/00067814/0000/00067814_00000003_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2011/B2XMUMU.STRIP.DST/00067814/0000/00067814_00000004_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2011/B2XMUMU.STRIP.DST/00067814/0000/00067814_00000005_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2011/B2XMUMU.STRIP.DST/00067814/0000/00067814_00000006_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2011/B2XMUMU.STRIP.DST/00067814/0000/00067814_00000007_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2011/B2XMUMU.STRIP.DST/00067814/0000/00067814_00000008_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2011/B2XMUMU.STRIP.DST/00067814/0000/00067814_00000009_1.b2xmumu.strip.dst',
+'LFN:'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/PHSP_2011MagDown_Kshort.py b/Code/Ganga/lfnFiles/PHSP_2011MagDown_Kshort.py
new file mode 100644
index 0000000..1437adf
--- /dev/null
+++ b/Code/Ganga/lfnFiles/PHSP_2011MagDown_Kshort.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2011/B2XMUMU.STRIP.DST/00067811/0000/00067811_00000001_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2011/B2XMUMU.STRIP.DST/00067811/0000/00067811_00000002_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2011/B2XMUMU.STRIP.DST/00067811/0000/00067811_00000003_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2011/B2XMUMU.STRIP.DST/00067811/0000/00067811_00000004_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2011/B2XMUMU.STRIP.DST/00067811/0000/00067811_00000005_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2011/B2XMUMU.STRIP.DST/00067811/0000/00067811_00000006_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2011/B2XMUMU.STRIP.DST/00067811/0000/00067811_00000007_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2011/B2XMUMU.STRIP.DST/00067811/0000/00067811_00000008_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2011/B2XMUMU.STRIP.DST/00067811/0000/00067811_00000009_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2011/B2XMUMU.STRIP.DST/00067811/0000/00067811_00000011_1.b2xmumu.strip.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/PHSP_2011MagUp.py b/Code/Ganga/lfnFiles/PHSP_2011MagUp.py
new file mode 100644
index 0000000..8d6063f
--- /dev/null
+++ b/Code/Ganga/lfnFiles/PHSP_2011MagUp.py
@@ -0,0 +1,13 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2011/B2XMUMU.STRIP.DST/00067820/0000/00067820_00000001_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2011/B2XMUMU.STRIP.DST/00067820/0000/00067820_00000002_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2011/B2XMUMU.STRIP.DST/00067820/0000/00067820_00000003_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2011/B2XMUMU.STRIP.DST/00067820/0000/00067820_00000004_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2011/B2XMUMU.STRIP.DST/00067820/0000/00067820_00000005_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2011/B2XMUMU.STRIP.DST/00067820/0000/00067820_00000006_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2011/B2XMUMU.STRIP.DST/00067820/0000/00067820_00000007_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2011/B2XMUMU.STRIP.DST/00067820/0000/00067820_00000008_1.b2xmumu.strip.dst',
+'LFN:'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/PHSP_2011MagUp_Kplus.py b/Code/Ganga/lfnFiles/PHSP_2011MagUp_Kplus.py
new file mode 100644
index 0000000..8d6063f
--- /dev/null
+++ b/Code/Ganga/lfnFiles/PHSP_2011MagUp_Kplus.py
@@ -0,0 +1,13 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2011/B2XMUMU.STRIP.DST/00067820/0000/00067820_00000001_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2011/B2XMUMU.STRIP.DST/00067820/0000/00067820_00000002_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2011/B2XMUMU.STRIP.DST/00067820/0000/00067820_00000003_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2011/B2XMUMU.STRIP.DST/00067820/0000/00067820_00000004_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2011/B2XMUMU.STRIP.DST/00067820/0000/00067820_00000005_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2011/B2XMUMU.STRIP.DST/00067820/0000/00067820_00000006_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2011/B2XMUMU.STRIP.DST/00067820/0000/00067820_00000007_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2011/B2XMUMU.STRIP.DST/00067820/0000/00067820_00000008_1.b2xmumu.strip.dst',
+'LFN:'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/PHSP_2011MagUp_Kshort.py b/Code/Ganga/lfnFiles/PHSP_2011MagUp_Kshort.py
new file mode 100644
index 0000000..b990d12
--- /dev/null
+++ b/Code/Ganga/lfnFiles/PHSP_2011MagUp_Kshort.py
@@ -0,0 +1,13 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2011/B2XMUMU.STRIP.DST/00067817/0000/00067817_00000001_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2011/B2XMUMU.STRIP.DST/00067817/0000/00067817_00000002_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2011/B2XMUMU.STRIP.DST/00067817/0000/00067817_00000003_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2011/B2XMUMU.STRIP.DST/00067817/0000/00067817_00000004_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2011/B2XMUMU.STRIP.DST/00067817/0000/00067817_00000005_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2011/B2XMUMU.STRIP.DST/00067817/0000/00067817_00000006_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2011/B2XMUMU.STRIP.DST/00067817/0000/00067817_00000007_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2011/B2XMUMU.STRIP.DST/00067817/0000/00067817_00000008_1.b2xmumu.strip.dst',
+'LFN:'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/PHSP_2012MagDown.py b/Code/Ganga/lfnFiles/PHSP_2012MagDown.py
new file mode 100644
index 0000000..20e6d3a
--- /dev/null
+++ b/Code/Ganga/lfnFiles/PHSP_2012MagDown.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2012/B2XMUMU.STRIP.DST/00067579/0000/00067579_00000001_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2012/B2XMUMU.STRIP.DST/00067579/0000/00067579_00000002_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2012/B2XMUMU.STRIP.DST/00067579/0000/00067579_00000003_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2012/B2XMUMU.STRIP.DST/00067579/0000/00067579_00000004_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2012/B2XMUMU.STRIP.DST/00067579/0000/00067579_00000005_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2012/B2XMUMU.STRIP.DST/00067579/0000/00067579_00000006_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2012/B2XMUMU.STRIP.DST/00067579/0000/00067579_00000007_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2012/B2XMUMU.STRIP.DST/00067579/0000/00067579_00000008_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2012/B2XMUMU.STRIP.DST/00067579/0000/00067579_00000009_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2012/B2XMUMU.STRIP.DST/00067579/0000/00067579_00000011_1.b2xmumu.strip.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/PHSP_2012MagDown_Kplus.py b/Code/Ganga/lfnFiles/PHSP_2012MagDown_Kplus.py
new file mode 100644
index 0000000..20e6d3a
--- /dev/null
+++ b/Code/Ganga/lfnFiles/PHSP_2012MagDown_Kplus.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2012/B2XMUMU.STRIP.DST/00067579/0000/00067579_00000001_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2012/B2XMUMU.STRIP.DST/00067579/0000/00067579_00000002_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2012/B2XMUMU.STRIP.DST/00067579/0000/00067579_00000003_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2012/B2XMUMU.STRIP.DST/00067579/0000/00067579_00000004_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2012/B2XMUMU.STRIP.DST/00067579/0000/00067579_00000005_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2012/B2XMUMU.STRIP.DST/00067579/0000/00067579_00000006_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2012/B2XMUMU.STRIP.DST/00067579/0000/00067579_00000007_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2012/B2XMUMU.STRIP.DST/00067579/0000/00067579_00000008_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2012/B2XMUMU.STRIP.DST/00067579/0000/00067579_00000009_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2012/B2XMUMU.STRIP.DST/00067579/0000/00067579_00000011_1.b2xmumu.strip.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/PHSP_2012MagDown_Kshort.py b/Code/Ganga/lfnFiles/PHSP_2012MagDown_Kshort.py
new file mode 100644
index 0000000..9b5b31a
--- /dev/null
+++ b/Code/Ganga/lfnFiles/PHSP_2012MagDown_Kshort.py
@@ -0,0 +1,13 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+#'LFN:/lhcb/MC/2012/B2XMUMU.STRIP.DST/00076002/0000/00076002_00000001_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2012/B2XMUMU.STRIP.DST/00076002/0000/00076002_00000002_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2012/B2XMUMU.STRIP.DST/00076002/0000/00076002_00000003_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2012/B2XMUMU.STRIP.DST/00076002/0000/00076002_00000004_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2012/B2XMUMU.STRIP.DST/00076002/0000/00076002_00000005_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2012/B2XMUMU.STRIP.DST/00076002/0000/00076002_00000006_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2012/B2XMUMU.STRIP.DST/00076002/0000/00076002_00000007_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2012/B2XMUMU.STRIP.DST/00076002/0000/00076002_00000008_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2012/B2XMUMU.STRIP.DST/00076002/0000/00076002_00000009_1.b2xmumu.strip.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/PHSP_2012MagUp.py b/Code/Ganga/lfnFiles/PHSP_2012MagUp.py
new file mode 100644
index 0000000..2661db8
--- /dev/null
+++ b/Code/Ganga/lfnFiles/PHSP_2012MagUp.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2012/B2XMUMU.STRIP.DST/00067667/0000/00067667_00000001_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2012/B2XMUMU.STRIP.DST/00067667/0000/00067667_00000002_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2012/B2XMUMU.STRIP.DST/00067667/0000/00067667_00000003_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2012/B2XMUMU.STRIP.DST/00067667/0000/00067667_00000004_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2012/B2XMUMU.STRIP.DST/00067667/0000/00067667_00000005_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2012/B2XMUMU.STRIP.DST/00067667/0000/00067667_00000006_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2012/B2XMUMU.STRIP.DST/00067667/0000/00067667_00000007_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2012/B2XMUMU.STRIP.DST/00067667/0000/00067667_00000008_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2012/B2XMUMU.STRIP.DST/00067667/0000/00067667_00000009_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2012/B2XMUMU.STRIP.DST/00067667/0000/00067667_00000011_1.b2xmumu.strip.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/PHSP_2012MagUp_Kplus.py b/Code/Ganga/lfnFiles/PHSP_2012MagUp_Kplus.py
new file mode 100644
index 0000000..2661db8
--- /dev/null
+++ b/Code/Ganga/lfnFiles/PHSP_2012MagUp_Kplus.py
@@ -0,0 +1,14 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2012/B2XMUMU.STRIP.DST/00067667/0000/00067667_00000001_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2012/B2XMUMU.STRIP.DST/00067667/0000/00067667_00000002_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2012/B2XMUMU.STRIP.DST/00067667/0000/00067667_00000003_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2012/B2XMUMU.STRIP.DST/00067667/0000/00067667_00000004_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2012/B2XMUMU.STRIP.DST/00067667/0000/00067667_00000005_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2012/B2XMUMU.STRIP.DST/00067667/0000/00067667_00000006_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2012/B2XMUMU.STRIP.DST/00067667/0000/00067667_00000007_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2012/B2XMUMU.STRIP.DST/00067667/0000/00067667_00000008_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2012/B2XMUMU.STRIP.DST/00067667/0000/00067667_00000009_1.b2xmumu.strip.dst',
+'LFN:/lhcb/MC/2012/B2XMUMU.STRIP.DST/00067667/0000/00067667_00000011_1.b2xmumu.strip.dst'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/PHSP_2012MagUp_Kshort.py b/Code/Ganga/lfnFiles/PHSP_2012MagUp_Kshort.py
new file mode 100644
index 0000000..ff66196
--- /dev/null
+++ b/Code/Ganga/lfnFiles/PHSP_2012MagUp_Kshort.py
@@ -0,0 +1,5 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/PHSP_2015MagDown.py b/Code/Ganga/lfnFiles/PHSP_2015MagDown.py
new file mode 100644
index 0000000..d74bc20
--- /dev/null
+++ b/Code/Ganga/lfnFiles/PHSP_2015MagDown.py
@@ -0,0 +1,11 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2015/B2XMUMU.STRIP.MDST/00068400/0000/00068400_00000015_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2015/B2XMUMU.STRIP.MDST/00068400/0000/00068400_00000016_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2015/B2XMUMU.STRIP.MDST/00068400/0000/00068400_00000017_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2015/B2XMUMU.STRIP.MDST/00068400/0000/00068400_00000018_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2015/B2XMUMU.STRIP.MDST/00068400/0000/00068400_00000019_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2015/B2XMUMU.STRIP.MDST/00068400/0000/00068400_00000020_1.b2xmumu.strip.mdst',
+'LFN:'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/PHSP_2015MagDown_Kplus.py b/Code/Ganga/lfnFiles/PHSP_2015MagDown_Kplus.py
new file mode 100644
index 0000000..d74bc20
--- /dev/null
+++ b/Code/Ganga/lfnFiles/PHSP_2015MagDown_Kplus.py
@@ -0,0 +1,11 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2015/B2XMUMU.STRIP.MDST/00068400/0000/00068400_00000015_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2015/B2XMUMU.STRIP.MDST/00068400/0000/00068400_00000016_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2015/B2XMUMU.STRIP.MDST/00068400/0000/00068400_00000017_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2015/B2XMUMU.STRIP.MDST/00068400/0000/00068400_00000018_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2015/B2XMUMU.STRIP.MDST/00068400/0000/00068400_00000019_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2015/B2XMUMU.STRIP.MDST/00068400/0000/00068400_00000020_1.b2xmumu.strip.mdst',
+'LFN:'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/PHSP_2015MagDown_Kshort.py b/Code/Ganga/lfnFiles/PHSP_2015MagDown_Kshort.py
new file mode 100644
index 0000000..9079ebd
--- /dev/null
+++ b/Code/Ganga/lfnFiles/PHSP_2015MagDown_Kshort.py
@@ -0,0 +1,12 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2015/B2XMUMU.STRIP.MDST/00068118/0000/00068118_00000009_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2015/B2XMUMU.STRIP.MDST/00068118/0000/00068118_00000010_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2015/B2XMUMU.STRIP.MDST/00068118/0000/00068118_00000011_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2015/B2XMUMU.STRIP.MDST/00068118/0000/00068118_00000012_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2015/B2XMUMU.STRIP.MDST/00068118/0000/00068118_00000013_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2015/B2XMUMU.STRIP.MDST/00068118/0000/00068118_00000014_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2015/B2XMUMU.STRIP.MDST/00068118/0000/00068118_00000015_1.b2xmumu.strip.mdst',
+'LFN:'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/PHSP_2015MagUp.py b/Code/Ganga/lfnFiles/PHSP_2015MagUp.py
new file mode 100644
index 0000000..147643f
--- /dev/null
+++ b/Code/Ganga/lfnFiles/PHSP_2015MagUp.py
@@ -0,0 +1,10 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2015/B2XMUMU.STRIP.MDST/00068403/0000/00068403_00000015_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2015/B2XMUMU.STRIP.MDST/00068403/0000/00068403_00000017_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2015/B2XMUMU.STRIP.MDST/00068403/0000/00068403_00000018_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2015/B2XMUMU.STRIP.MDST/00068403/0000/00068403_00000019_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2015/B2XMUMU.STRIP.MDST/00068403/0000/00068403_00000020_1.b2xmumu.strip.mdst',
+'LFN:'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/PHSP_2015MagUp_Kplus.py b/Code/Ganga/lfnFiles/PHSP_2015MagUp_Kplus.py
new file mode 100644
index 0000000..147643f
--- /dev/null
+++ b/Code/Ganga/lfnFiles/PHSP_2015MagUp_Kplus.py
@@ -0,0 +1,10 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2015/B2XMUMU.STRIP.MDST/00068403/0000/00068403_00000015_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2015/B2XMUMU.STRIP.MDST/00068403/0000/00068403_00000017_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2015/B2XMUMU.STRIP.MDST/00068403/0000/00068403_00000018_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2015/B2XMUMU.STRIP.MDST/00068403/0000/00068403_00000019_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2015/B2XMUMU.STRIP.MDST/00068403/0000/00068403_00000020_1.b2xmumu.strip.mdst',
+'LFN:'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/PHSP_2015MagUp_Kshort.py b/Code/Ganga/lfnFiles/PHSP_2015MagUp_Kshort.py
new file mode 100644
index 0000000..31d53c4
--- /dev/null
+++ b/Code/Ganga/lfnFiles/PHSP_2015MagUp_Kshort.py
@@ -0,0 +1,12 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2015/B2XMUMU.STRIP.MDST/00068121/0000/00068121_00000009_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2015/B2XMUMU.STRIP.MDST/00068121/0000/00068121_00000010_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2015/B2XMUMU.STRIP.MDST/00068121/0000/00068121_00000011_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2015/B2XMUMU.STRIP.MDST/00068121/0000/00068121_00000012_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2015/B2XMUMU.STRIP.MDST/00068121/0000/00068121_00000013_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2015/B2XMUMU.STRIP.MDST/00068121/0000/00068121_00000014_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2015/B2XMUMU.STRIP.MDST/00068121/0000/00068121_00000015_1.b2xmumu.strip.mdst',
+'LFN:'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/PHSP_2016MagDown.py b/Code/Ganga/lfnFiles/PHSP_2016MagDown.py
new file mode 100644
index 0000000..7d10a29
--- /dev/null
+++ b/Code/Ganga/lfnFiles/PHSP_2016MagDown.py
@@ -0,0 +1,12 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2016/B2XMUMU.STRIP.MDST/00067137/0000/00067137_00000001_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2016/B2XMUMU.STRIP.MDST/00067137/0000/00067137_00000002_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2016/B2XMUMU.STRIP.MDST/00067137/0000/00067137_00000003_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2016/B2XMUMU.STRIP.MDST/00067137/0000/00067137_00000004_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2016/B2XMUMU.STRIP.MDST/00067137/0000/00067137_00000005_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2016/B2XMUMU.STRIP.MDST/00067137/0000/00067137_00000006_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2016/B2XMUMU.STRIP.MDST/00067137/0000/00067137_00000007_1.b2xmumu.strip.mdst',
+'LFN:'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/PHSP_2016MagDown_Kplus.py b/Code/Ganga/lfnFiles/PHSP_2016MagDown_Kplus.py
new file mode 100644
index 0000000..7d10a29
--- /dev/null
+++ b/Code/Ganga/lfnFiles/PHSP_2016MagDown_Kplus.py
@@ -0,0 +1,12 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2016/B2XMUMU.STRIP.MDST/00067137/0000/00067137_00000001_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2016/B2XMUMU.STRIP.MDST/00067137/0000/00067137_00000002_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2016/B2XMUMU.STRIP.MDST/00067137/0000/00067137_00000003_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2016/B2XMUMU.STRIP.MDST/00067137/0000/00067137_00000004_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2016/B2XMUMU.STRIP.MDST/00067137/0000/00067137_00000005_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2016/B2XMUMU.STRIP.MDST/00067137/0000/00067137_00000006_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2016/B2XMUMU.STRIP.MDST/00067137/0000/00067137_00000007_1.b2xmumu.strip.mdst',
+'LFN:'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/PHSP_2016MagDown_Kshort.py b/Code/Ganga/lfnFiles/PHSP_2016MagDown_Kshort.py
new file mode 100644
index 0000000..7a69167
--- /dev/null
+++ b/Code/Ganga/lfnFiles/PHSP_2016MagDown_Kshort.py
@@ -0,0 +1,12 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2016/B2XMUMU.STRIP.MDST/00067134/0000/00067134_00000001_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2016/B2XMUMU.STRIP.MDST/00067134/0000/00067134_00000002_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2016/B2XMUMU.STRIP.MDST/00067134/0000/00067134_00000003_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2016/B2XMUMU.STRIP.MDST/00067134/0000/00067134_00000004_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2016/B2XMUMU.STRIP.MDST/00067134/0000/00067134_00000005_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2016/B2XMUMU.STRIP.MDST/00067134/0000/00067134_00000006_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2016/B2XMUMU.STRIP.MDST/00067134/0000/00067134_00000007_1.b2xmumu.strip.mdst',
+'LFN:'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/PHSP_2016MagUp.py b/Code/Ganga/lfnFiles/PHSP_2016MagUp.py
new file mode 100644
index 0000000..0fb7b0a
--- /dev/null
+++ b/Code/Ganga/lfnFiles/PHSP_2016MagUp.py
@@ -0,0 +1,12 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2016/B2XMUMU.STRIP.MDST/00067143/0000/00067143_00000001_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2016/B2XMUMU.STRIP.MDST/00067143/0000/00067143_00000002_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2016/B2XMUMU.STRIP.MDST/00067143/0000/00067143_00000003_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2016/B2XMUMU.STRIP.MDST/00067143/0000/00067143_00000004_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2016/B2XMUMU.STRIP.MDST/00067143/0000/00067143_00000005_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2016/B2XMUMU.STRIP.MDST/00067143/0000/00067143_00000006_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2016/B2XMUMU.STRIP.MDST/00067143/0000/00067143_00000007_1.b2xmumu.strip.mdst',
+'LFN:'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/PHSP_2016MagUp_Kplus.py b/Code/Ganga/lfnFiles/PHSP_2016MagUp_Kplus.py
new file mode 100644
index 0000000..0fb7b0a
--- /dev/null
+++ b/Code/Ganga/lfnFiles/PHSP_2016MagUp_Kplus.py
@@ -0,0 +1,12 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2016/B2XMUMU.STRIP.MDST/00067143/0000/00067143_00000001_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2016/B2XMUMU.STRIP.MDST/00067143/0000/00067143_00000002_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2016/B2XMUMU.STRIP.MDST/00067143/0000/00067143_00000003_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2016/B2XMUMU.STRIP.MDST/00067143/0000/00067143_00000004_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2016/B2XMUMU.STRIP.MDST/00067143/0000/00067143_00000005_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2016/B2XMUMU.STRIP.MDST/00067143/0000/00067143_00000006_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2016/B2XMUMU.STRIP.MDST/00067143/0000/00067143_00000007_1.b2xmumu.strip.mdst',
+'LFN:'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/PHSP_2016MagUp_Kshort.py b/Code/Ganga/lfnFiles/PHSP_2016MagUp_Kshort.py
new file mode 100644
index 0000000..d51b40c
--- /dev/null
+++ b/Code/Ganga/lfnFiles/PHSP_2016MagUp_Kshort.py
@@ -0,0 +1,12 @@
+from Gaudi.Configuration import *
+from GaudiConf import IOHelper
+IOHelper('ROOT').inputFiles([
+'LFN:/lhcb/MC/2016/B2XMUMU.STRIP.MDST/00067140/0000/00067140_00000001_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2016/B2XMUMU.STRIP.MDST/00067140/0000/00067140_00000002_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2016/B2XMUMU.STRIP.MDST/00067140/0000/00067140_00000003_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2016/B2XMUMU.STRIP.MDST/00067140/0000/00067140_00000004_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2016/B2XMUMU.STRIP.MDST/00067140/0000/00067140_00000005_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2016/B2XMUMU.STRIP.MDST/00067140/0000/00067140_00000006_1.b2xmumu.strip.mdst',
+'LFN:/lhcb/MC/2016/B2XMUMU.STRIP.MDST/00067140/0000/00067140_00000007_1.b2xmumu.strip.mdst',
+'LFN:'
+], clear=True)
diff --git a/Code/Ganga/lfnFiles/get_LFNs.py b/Code/Ganga/lfnFiles/get_LFNs.py
new file mode 100755
index 0000000..8c42e1d
--- /dev/null
+++ b/Code/Ganga/lfnFiles/get_LFNs.py
@@ -0,0 +1,254 @@
+#
+# Get LFN files from BKKquery
+# Generate xml files from BKKquery
+#
+#
+max_LFNs = 30 #define how many lfns are included in the xml file
+
+channel_list = ['Kplus',
+ 'Kshort'
+ ]
+
+decay_list = [ 'BtoKstMuMu',
+ #'BtoKstJpsi',
+ #'PHSP'
+ #'BtoXJpsi'
+ #'B0toKstMuMu',
+ #'B0toKstJpsi',
+ #'BtoK1MuMu',
+ #'BtoK1Jpsi'
+ ]
+
+polarity_list = ['MagDown',
+ 'MagUp']
+
+decay_no_dict = {
+ 'BtoKstMuMu' : {'Kplus': 12113100,
+ 'Kshort': 12115102},
+ 'BtoKstJpsi' : {'Kplus': 12143401,
+ 'Kshort': 12145102},
+ 'PHSP' : {'Kplus': 12113445,
+ 'Kshort': 12115178},
+ 'BtoXJpsi' : {'Kplus': 12442001,
+ 'Kshort': 12442001},
+ 'B0toKstMuMu': {'Kplus': 11114001,
+ 'Kshort': 11114001},
+ 'B0toKstJpsi': {'Kplus': 11144001,
+ 'Kshort': 11144001},
+ #'BtoK1MuMu' : {'Kplus': 12435001, # it's B+ to JpsiKst everything
+ # 'Kshort': 12435001},
+ 'BtoK1Jpsi' : {'Kplus': 12245000,
+ 'Kshort': 12245000}
+ }
+
+
+decay_year_dict = { 'BtoKstMuMu' : ['2017'],#['2011','2012','2015','2016','2017'],
+ 'BtoKstJpsi' : ['2011','2012'],
+ 'PHSP' : ['2012'],
+# 'PHSP' : ['2011','2012','2015','2016'],
+ 'BtoXJpsi' : ['2011','2012','2016'],
+ 'B0toKstMuMu': ['2011','2012','2015','2016'],
+ 'B0toKstJpsi': ['2011','2012','2015','2016'],
+ 'BtoK1MuMu' : ['2011','2012'],
+ 'BtoK1Jpsi' : ['2012']
+ }
+
+year_E_dict = { '2011': '3500GeV',
+ '2012': '4000GeV',
+ '2015': '6500GeV',
+ '2016': '6500GeV',
+ '2017': '6500GeV'
+ }
+
+year_nu_dict = { '2011': '2',
+ '2012': '2.5',
+ '2015': '1.6-25ns',
+ '2016': '1.6-25ns',
+ '2017': '1.6-25ns'
+ }
+
+year_trigg_dict = { '2011': 'Trig0x40760037',
+ #'2012': 'Trig0x409f0045', #TODO! two different trigger settings! for PHSP
+ '2012': 'Trig0x4097003d', #Seccond trigger settings for PHSP
+ '2015': 'Trig0x411400a2',
+ '2016': 'Trig0x6138160F',
+ '2017': 'Trig0x62661709'
+ }
+
+decay_simVer_dict = { 'BtoKstMuMu' : {'2011': 'Sim09b',
+ '2012': 'Sim09a',
+ '2015': 'Sim09b',
+ '2016': 'Sim09c',
+ '2017': 'Sim09e'
+ },
+ 'BtoKstJpsi' : {'2011': 'Sim09a',
+ '2012': 'Sim09a'
+ },
+ 'PHSP' : {'2011': 'Sim09b',
+ #'2012': 'Sim09b',
+ '2012': 'Sim09c',
+ '2015': 'Sim09b',
+ '2016': 'Sim09c'
+ },
+ 'BtoXJpsi' : {'2011': 'Sim08c/Digi13',
+ '2012': 'Sim08a/Digi13',
+ '2016': 'Sim09b'
+ },
+ 'B0toKstMuMu': {'2011': 'Sim08e/Digi13',
+ '2012': 'Sim08b/Digi13',
+ '2015': 'Sim09c',
+ '2016': 'Sim09b'
+ },
+ 'B0toKstJpsi': {'2011': 'Sim08f/Digi13',
+ '2012': 'Sim08f/Digi13',
+ '2015': 'Sim09c',
+ '2016': 'Sim09c'
+ },
+ 'BtoK1MuMu' : {'2011': 'Sim08e/Digi13',
+ '2012': 'Sim08e/Digi13',
+ },
+ 'BtoK1Jpsi' : {'2012': 'Sim08a/Digi13'
+ }
+ }
+
+decay_strip_dict = { 'BtoKstMuMu' : {'2011': 'Reco14c/Stripping21r1NoPrescalingFlagged',
+ '2012': 'Reco14c/Stripping21NoPrescalingFlagged',
+ '2015': 'Reco15a/Turbo02/Stripping24NoPrescalingFlagged',
+ '2016': 'Reco16/Turbo03/Stripping28NoPrescalingFlagged',
+ '2017': 'Reco17/Turbo04a-WithTurcal/Stripping29r2NoPrescalingFlagged',
+ },
+ 'BtoKstJpsi' : {'2011': 'Reco14c/Stripping21r1NoPrescalingFlagged',
+ '2012': 'Reco14c/Stripping21NoPrescalingFlagged',
+ },
+ 'PHSP' : {'2011': 'Reco14c/Stripping21r1Filtered',
+ #'2012': 'Reco14c/Stripping21Filtered',
+ '2012': 'Reco14c/Stripping21NoPrescalingFlagged', #Seccond trigger settings for PHSP
+ '2015': 'Reco15a/Turbo02/Stripping24Filtered',
+ '2016': 'Reco16/Turbo03/Stripping28Filtered'
+ },
+ 'BtoXJpsi' : {'2011': 'Reco14a/Stripping20r1NoPrescalingFlagged',
+ '2012': 'Reco14a/Stripping20NoPrescalingFlagged',
+ '2016': 'Reco16/Turbo03/Stripping26NoPrescalingFlagged'
+ },
+ 'B0toKstMuMu': {'2011': 'Reco14a/Stripping20r1NoPrescalingFlagged',
+ '2012': 'Reco14a/Stripping20NoPrescalingFlagged',
+ '2015': 'Reco15a/Turbo02/Stripping24r1NoPrescalingFlagged',
+ '2016': 'Reco16/Turbo03/Stripping26NoPrescalingFlagged'
+ },
+ 'B0toKstJpsi': {'2011': 'Reco14a/Stripping20r1NoPrescalingFlagged',
+ '2012': 'Reco14a/Stripping20NoPrescalingFlagged',
+ '2015': 'Reco15a/Turbo02/Stripping24r1NoPrescalingFlagged', #todo
+ '2016': 'Reco16/Turbo03/Stripping28r1NoPrescalingFlagged'
+ },
+ 'BtoK1MuMu' : {'2011': 'Reco14a/Stripping20r1NoPrescalingFlagged',
+ '2012': 'Reco14a/Stripping20NoPrescalingFlagged',
+ },
+ 'BtoK1Jpsi' : {'2012': 'Reco14a/Stripping20NoPrescalingFlagged'
+ }
+ }
+
+decay_file_dict = { 'BtoKstMuMu' : {'2011': 'ALLSTREAMS.DST',
+ '2012': 'ALLSTREAMS.DST',
+ '2015': 'ALLSTREAMS.MDST',
+ '2016': 'ALLSTREAMS.MDST',
+ '2017': 'ALLSTREAMS.MDST'
+ },
+ 'BtoKstJpsi' : {'2011': 'ALLSTREAMS.DST',
+ '2012': 'ALLSTREAMS.DST'
+ },
+ 'PHSP' : {'2011': 'B2XMUMU.STRIP.DST',
+ '2012': 'B2XMUMU.STRIP.DST',
+ '2015': 'B2XMUMU.STRIP.MDST',
+ '2016': 'B2XMUMU.STRIP.MDST'
+ },
+ 'BtoXJpsi' : {'2011': 'ALLSTREAMS.DST',
+ '2012': 'ALLSTREAMS.DST',
+ '2016': 'ALLSTREAMS.DST'
+ },
+ 'B0toKstMuMu': {'2011': 'ALLSTREAMS.DST',
+ '2012': 'ALLSTREAMS.DST',
+ '2015': 'ALLSTREAMS.DST',
+ '2016': 'ALLSTREAMS.DST'
+ },
+ 'B0toKstJpsi': {'2011': 'ALLSTREAMS.DST',
+ '2012': 'ALLSTREAMS.DST',
+ '2015': 'ALLSTREAMS.MDST',
+ '2016': 'ALLSTREAMS.MDST'
+ },
+ 'BtoK1MuMu' : {'2011': 'ALLSTREAMS.DST',
+ '2012': 'ALLSTREAMS.DST',
+ },
+ 'BtoK1Jpsi' : {'2012': 'ALLSTREAMS.DST'
+ }
+ }
+
+path_list_dict = {}
+path_list = []
+
+for channel in channel_list:
+ for decay in decay_list:
+ for polarity in polarity_list:
+ for year in decay_year_dict[decay]:
+ script_opts = { "DATA_TYPE":"MC",
+ "CHAN": channel,
+ "YEAR":year,
+ "POL":polarity,
+ "ENERGY":year_E_dict[year],
+ "NU":year_nu_dict[year],
+ "SIM": decay_simVer_dict[decay][year],
+ "TRIG":year_trigg_dict[year],
+ "STRIP":decay_strip_dict[decay][year],
+ "NUM":decay_no_dict[decay][channel],
+ "FILE":decay_file_dict[decay][year],
+ "DEC":decay
+ }
+ PATH = "/%(DATA_TYPE)s/%(YEAR)s/Beam%(ENERGY)s-%(YEAR)s-%(POL)s-Nu%(NU)s-Pythia8/%(SIM)s/%(TRIG)s/%(STRIP)s/%(NUM)s/%(FILE)s" % script_opts
+ path_list += [PATH]
+ outFile = "%(DEC)s_%(YEAR)s%(POL)s_%(CHAN)s" % script_opts
+ path_list_dict.update({PATH: outFile})
+
+get_xml_files = False #God knows why the second popen.subprocess doesn't work
+
+if ('BtoXJpsi' in decay_list):
+ PATH = "/MC/Dev/Beam6500GeV-Jun2015-MagDown-Nu1.6-25ns-Pythia8/Sim09Dev03/Trig0x410700a1/Reco15/Turbo01a/Stripping23r1NoPrescalingFlagged/12442001/ALLSTREAMS.MDST"
+ path_list += [PATH]
+ path_list_dict.update({PATH: 'BtoXJpsi_2015MagDown.py'})
+
+ PATH = "/MC/Dev/Beam6500GeV-Jun2015-MagUp-Nu1.6-25ns-Pythia8/Sim09Dev03/Trig0x410700a1/Reco15/Turbo01a/Stripping23r1NoPrescalingFlagged/12442001/ALLSTREAMS.MDST"
+ path_list += [PATH]
+ path_list_dict.update({PATH: 'BtoXJpsi_2015MagUp.py'})
+
+import subprocess
+from subprocess import Popen, PIPE
+
+if __name__ == '__main__':
+ from subprocess import call
+ from sys import argv
+ '''
+ if (not get_xml_files):
+ for f in path_list:
+ address_file = open(path_list_dict[f]+'.py','w')
+ address_file.write("""from Gaudi.Configuration import *\n""")
+ address_file.write("""from GaudiConf import IOHelper\n""")
+ address_file.write("""IOHelper('ROOT').inputFiles([\n""")
+ print('Getting file {0}.'.format(f))
+ dirac_command = subprocess.Popen('lb-run LHCbDIRAC dirac-bookkeeping-get-files --BKQuery {0}'.format(f), shell=True, stdout=subprocess.PIPE)
+ stdout = dirac_command.communicate()[0]
+ stdout = stdout.split('\n')
+ #Loop only first 10 files (or less, if there are less LFNs)
+ #First 3 entries are junk from LHCbDIRAC dirac-bookkeeping-get-files
+ max_file = min(max_LFNs+3,len(stdout)-2)
+ for i in range(3, max_file-1):
+ stdout_tmp = [stdout[i].split(' ')][0]
+ address_file.write("""'LFN:""" + stdout_tmp[0] + """',\n""")
+ stdout_tmp = [stdout[max_file].split(' ')][0]
+ address_file.write("""'LFN:""" + stdout_tmp[0] + """'\n""")
+ address_file.write("""], clear=True)\n""")
+ else:
+ print "You have to manually uncomment... "
+ '''
+ for f in path_list:
+ command = 'lb-run LHCbDIRAC dirac-bookkeeping-genXMLCatalog --Options=' + path_list_dict[f]+'.py --Catalog=../xml_files/catalog_'+path_list_dict[f]+'.xml'
+ print command
+ xml_command = subprocess.check_call(command, shell=True)
+
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2011MagDown.py b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2011MagDown.py
new file mode 100644
index 0000000..9db2e76
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2011MagDown.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_B0toKstJpsi_2011MagDown.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2011MagDown.xml b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2011MagDown.xml
new file mode 100644
index 0000000..0a069cd
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2011MagDown.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2011MagDown_Kplus.py b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2011MagDown_Kplus.py
new file mode 100644
index 0000000..f05e599
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2011MagDown_Kplus.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_B0toKstJpsi_2011MagDown_Kplus.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2011MagDown_Kplus.xml b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2011MagDown_Kplus.xml
new file mode 100644
index 0000000..e7c4cbb
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2011MagDown_Kplus.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2011MagUp.py b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2011MagUp.py
new file mode 100644
index 0000000..27e81cb
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2011MagUp.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_B0toKstJpsi_2011MagUp.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2011MagUp.xml b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2011MagUp.xml
new file mode 100644
index 0000000..5fb340d
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2011MagUp.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2011MagUp_Kplus.py b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2011MagUp_Kplus.py
new file mode 100644
index 0000000..ead2af9
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2011MagUp_Kplus.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_B0toKstJpsi_2011MagUp_Kplus.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2011MagUp_Kplus.xml b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2011MagUp_Kplus.xml
new file mode 100644
index 0000000..68c6dc0
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2011MagUp_Kplus.xml
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2012MagDown.py b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2012MagDown.py
new file mode 100644
index 0000000..13806ca
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2012MagDown.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_B0toKstJpsi_2012MagDown.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2012MagDown.xml b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2012MagDown.xml
new file mode 100644
index 0000000..fe55f05
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2012MagDown.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2012MagDown_Kplus.py b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2012MagDown_Kplus.py
new file mode 100644
index 0000000..a4df615
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2012MagDown_Kplus.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_B0toKstJpsi_2012MagDown_Kplus.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2012MagDown_Kplus.xml b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2012MagDown_Kplus.xml
new file mode 100644
index 0000000..06b65b1
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2012MagDown_Kplus.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2012MagUp.py b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2012MagUp.py
new file mode 100644
index 0000000..c86ffad
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2012MagUp.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_B0toKstJpsi_2012MagUp.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2012MagUp.xml b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2012MagUp.xml
new file mode 100644
index 0000000..becee66
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2012MagUp.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2012MagUp_Kplus.py b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2012MagUp_Kplus.py
new file mode 100644
index 0000000..10c80a7
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2012MagUp_Kplus.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_B0toKstJpsi_2012MagUp_Kplus.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2012MagUp_Kplus.xml b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2012MagUp_Kplus.xml
new file mode 100644
index 0000000..64d5392
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2012MagUp_Kplus.xml
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2015MagDown.py b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2015MagDown.py
new file mode 100644
index 0000000..37081f2
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2015MagDown.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_B0toKstJpsi_2015MagDown.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2015MagDown.xml b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2015MagDown.xml
new file mode 100644
index 0000000..b635ebf
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2015MagDown.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2015MagDown_Kplus.py b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2015MagDown_Kplus.py
new file mode 100644
index 0000000..0bc6a5d
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2015MagDown_Kplus.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_B0toKstJpsi_2015MagDown_Kplus.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2015MagDown_Kplus.xml b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2015MagDown_Kplus.xml
new file mode 100644
index 0000000..7292ae6
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2015MagDown_Kplus.xml
@@ -0,0 +1,95 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2015MagUp.py b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2015MagUp.py
new file mode 100644
index 0000000..895a558
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2015MagUp.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_B0toKstJpsi_2015MagUp.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2015MagUp.xml b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2015MagUp.xml
new file mode 100644
index 0000000..8246191
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2015MagUp.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2015MagUp_Kplus.py b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2015MagUp_Kplus.py
new file mode 100644
index 0000000..ae7b127
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2015MagUp_Kplus.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_B0toKstJpsi_2015MagUp_Kplus.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2015MagUp_Kplus.xml b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2015MagUp_Kplus.xml
new file mode 100644
index 0000000..5900cad
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2015MagUp_Kplus.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2016MagDown.py b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2016MagDown.py
new file mode 100644
index 0000000..9d47eaa
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2016MagDown.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_B0toKstJpsi_2016MagDown.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2016MagDown.xml b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2016MagDown.xml
new file mode 100644
index 0000000..f89d8eb
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2016MagDown.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2016MagDown_Kplus.py b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2016MagDown_Kplus.py
new file mode 100644
index 0000000..51454d4
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2016MagDown_Kplus.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_B0toKstJpsi_2016MagDown_Kplus.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2016MagDown_Kplus.xml b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2016MagDown_Kplus.xml
new file mode 100644
index 0000000..9cdd8de
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2016MagDown_Kplus.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2016MagUp.py b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2016MagUp.py
new file mode 100644
index 0000000..e363e92
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2016MagUp.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_B0toKstJpsi_2016MagUp.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2016MagUp.xml b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2016MagUp.xml
new file mode 100644
index 0000000..cc11102
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2016MagUp.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2016MagUp_Kplus.py b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2016MagUp_Kplus.py
new file mode 100644
index 0000000..713fed9
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2016MagUp_Kplus.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_B0toKstJpsi_2016MagUp_Kplus.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2016MagUp_Kplus.xml b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2016MagUp_Kplus.xml
new file mode 100644
index 0000000..264d944
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstJpsi_2016MagUp_Kplus.xml
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2011MagDown.py b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2011MagDown.py
new file mode 100644
index 0000000..f74bb8f
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2011MagDown.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_B0toKstMuMu_2011MagDown.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2011MagDown.xml b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2011MagDown.xml
new file mode 100644
index 0000000..f428a8f
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2011MagDown.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2011MagDown_Kplus.py b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2011MagDown_Kplus.py
new file mode 100644
index 0000000..c6da37d
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2011MagDown_Kplus.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_B0toKstMuMu_2011MagDown_Kplus.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2011MagDown_Kplus.xml b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2011MagDown_Kplus.xml
new file mode 100644
index 0000000..5855439
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2011MagDown_Kplus.xml
@@ -0,0 +1,93 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2011MagUp.py b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2011MagUp.py
new file mode 100644
index 0000000..a510ab2
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2011MagUp.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_B0toKstMuMu_2011MagUp.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2011MagUp.xml b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2011MagUp.xml
new file mode 100644
index 0000000..53873c7
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2011MagUp.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2011MagUp_Kplus.py b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2011MagUp_Kplus.py
new file mode 100644
index 0000000..f52318e
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2011MagUp_Kplus.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_B0toKstMuMu_2011MagUp_Kplus.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2011MagUp_Kplus.xml b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2011MagUp_Kplus.xml
new file mode 100644
index 0000000..66bbf26
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2011MagUp_Kplus.xml
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2012MagDown.py b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2012MagDown.py
new file mode 100644
index 0000000..dcf8965
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2012MagDown.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_B0toKstMuMu_2012MagDown.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2012MagDown.xml b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2012MagDown.xml
new file mode 100644
index 0000000..7a347aa
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2012MagDown.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2012MagDown_Kplus.py b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2012MagDown_Kplus.py
new file mode 100644
index 0000000..362d278
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2012MagDown_Kplus.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_B0toKstMuMu_2012MagDown_Kplus.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2012MagDown_Kplus.xml b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2012MagDown_Kplus.xml
new file mode 100644
index 0000000..b7db8e8
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2012MagDown_Kplus.xml
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2012MagUp.py b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2012MagUp.py
new file mode 100644
index 0000000..14f65b9
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2012MagUp.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_B0toKstMuMu_2012MagUp.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2012MagUp.xml b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2012MagUp.xml
new file mode 100644
index 0000000..d7bf701
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2012MagUp.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2012MagUp_Kplus.py b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2012MagUp_Kplus.py
new file mode 100644
index 0000000..0b38519
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2012MagUp_Kplus.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_B0toKstMuMu_2012MagUp_Kplus.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2012MagUp_Kplus.xml b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2012MagUp_Kplus.xml
new file mode 100644
index 0000000..6148ce7
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2012MagUp_Kplus.xml
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2015MagDown.py b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2015MagDown.py
new file mode 100644
index 0000000..176a769
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2015MagDown.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_B0toKstMuMu_2015MagDown.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2015MagDown.xml b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2015MagDown.xml
new file mode 100644
index 0000000..0102aa1
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2015MagDown.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2015MagDown_Kplus.py b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2015MagDown_Kplus.py
new file mode 100644
index 0000000..974dcc4
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2015MagDown_Kplus.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_B0toKstMuMu_2015MagDown_Kplus.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2015MagDown_Kplus.xml b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2015MagDown_Kplus.xml
new file mode 100644
index 0000000..8321030
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2015MagDown_Kplus.xml
@@ -0,0 +1,94 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2015MagUp.py b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2015MagUp.py
new file mode 100644
index 0000000..fbedaac
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2015MagUp.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_B0toKstMuMu_2015MagUp.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2015MagUp.xml b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2015MagUp.xml
new file mode 100644
index 0000000..376c3d1
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2015MagUp.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2015MagUp_Kplus.py b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2015MagUp_Kplus.py
new file mode 100644
index 0000000..ccd0697
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2015MagUp_Kplus.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_B0toKstMuMu_2015MagUp_Kplus.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2015MagUp_Kplus.xml b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2015MagUp_Kplus.xml
new file mode 100644
index 0000000..10c98e3
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2015MagUp_Kplus.xml
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2016MagDown.py b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2016MagDown.py
new file mode 100644
index 0000000..1c6ad35
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2016MagDown.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_B0toKstMuMu_2016MagDown.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2016MagDown.xml b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2016MagDown.xml
new file mode 100644
index 0000000..e1767c5
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2016MagDown.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2016MagDown_Kplus.py b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2016MagDown_Kplus.py
new file mode 100644
index 0000000..1c91c09
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2016MagDown_Kplus.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_B0toKstMuMu_2016MagDown_Kplus.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2016MagDown_Kplus.xml b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2016MagDown_Kplus.xml
new file mode 100644
index 0000000..c4a7a7a
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2016MagDown_Kplus.xml
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2016MagUp.py b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2016MagUp.py
new file mode 100644
index 0000000..a68dec5
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2016MagUp.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_B0toKstMuMu_2016MagUp.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2016MagUp.xml b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2016MagUp.xml
new file mode 100644
index 0000000..1d47e51
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2016MagUp.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2016MagUp_Kplus.py b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2016MagUp_Kplus.py
new file mode 100644
index 0000000..e26666a
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2016MagUp_Kplus.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_B0toKstMuMu_2016MagUp_Kplus.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2016MagUp_Kplus.xml b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2016MagUp_Kplus.xml
new file mode 100644
index 0000000..9871de6
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_B0toKstMuMu_2016MagUp_Kplus.xml
@@ -0,0 +1,91 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_BtoK1Jpsi_2012MagDown.py b/Code/Ganga/xmlFiles/catalog_BtoK1Jpsi_2012MagDown.py
new file mode 100644
index 0000000..a8799f8
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoK1Jpsi_2012MagDown.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_BtoK1Jpsi_2012MagDown.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_BtoK1Jpsi_2012MagDown.xml b/Code/Ganga/xmlFiles/catalog_BtoK1Jpsi_2012MagDown.xml
new file mode 100644
index 0000000..fa5ab0b
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoK1Jpsi_2012MagDown.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_BtoK1Jpsi_2012MagDown_Kplus.py b/Code/Ganga/xmlFiles/catalog_BtoK1Jpsi_2012MagDown_Kplus.py
new file mode 100644
index 0000000..2993e3d
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoK1Jpsi_2012MagDown_Kplus.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_BtoK1Jpsi_2012MagDown_Kplus.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_BtoK1Jpsi_2012MagDown_Kplus.xml b/Code/Ganga/xmlFiles/catalog_BtoK1Jpsi_2012MagDown_Kplus.xml
new file mode 100644
index 0000000..4254833
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoK1Jpsi_2012MagDown_Kplus.xml
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_BtoK1Jpsi_2012MagUp.py b/Code/Ganga/xmlFiles/catalog_BtoK1Jpsi_2012MagUp.py
new file mode 100644
index 0000000..2aab312
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoK1Jpsi_2012MagUp.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_BtoK1Jpsi_2012MagUp.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_BtoK1Jpsi_2012MagUp.xml b/Code/Ganga/xmlFiles/catalog_BtoK1Jpsi_2012MagUp.xml
new file mode 100644
index 0000000..8b93c44
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoK1Jpsi_2012MagUp.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_BtoK1Jpsi_2012MagUp_Kplus.py b/Code/Ganga/xmlFiles/catalog_BtoK1Jpsi_2012MagUp_Kplus.py
new file mode 100644
index 0000000..40caeec
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoK1Jpsi_2012MagUp_Kplus.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_BtoK1Jpsi_2012MagUp_Kplus.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_BtoK1Jpsi_2012MagUp_Kplus.xml b/Code/Ganga/xmlFiles/catalog_BtoK1Jpsi_2012MagUp_Kplus.xml
new file mode 100644
index 0000000..f5b0ad9
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoK1Jpsi_2012MagUp_Kplus.xml
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_BtoK1MuMu_2011MagDown.py b/Code/Ganga/xmlFiles/catalog_BtoK1MuMu_2011MagDown.py
new file mode 100644
index 0000000..3758515
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoK1MuMu_2011MagDown.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_BtoK1MuMu_2011MagDown.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_BtoK1MuMu_2011MagDown.xml b/Code/Ganga/xmlFiles/catalog_BtoK1MuMu_2011MagDown.xml
new file mode 100644
index 0000000..3b9cb3e
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoK1MuMu_2011MagDown.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_BtoK1MuMu_2011MagUp.py b/Code/Ganga/xmlFiles/catalog_BtoK1MuMu_2011MagUp.py
new file mode 100644
index 0000000..97f4c3d
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoK1MuMu_2011MagUp.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_BtoK1MuMu_2011MagUp.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_BtoK1MuMu_2011MagUp.xml b/Code/Ganga/xmlFiles/catalog_BtoK1MuMu_2011MagUp.xml
new file mode 100644
index 0000000..2861bd4
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoK1MuMu_2011MagUp.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_BtoK1MuMu_2012MagDown.py b/Code/Ganga/xmlFiles/catalog_BtoK1MuMu_2012MagDown.py
new file mode 100644
index 0000000..39b7008
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoK1MuMu_2012MagDown.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_BtoK1MuMu_2012MagDown.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_BtoK1MuMu_2012MagDown.xml b/Code/Ganga/xmlFiles/catalog_BtoK1MuMu_2012MagDown.xml
new file mode 100644
index 0000000..60df96e
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoK1MuMu_2012MagDown.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_BtoK1MuMu_2012MagUp.py b/Code/Ganga/xmlFiles/catalog_BtoK1MuMu_2012MagUp.py
new file mode 100644
index 0000000..6265742
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoK1MuMu_2012MagUp.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_BtoK1MuMu_2012MagUp.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_BtoK1MuMu_2012MagUp.xml b/Code/Ganga/xmlFiles/catalog_BtoK1MuMu_2012MagUp.xml
new file mode 100644
index 0000000..cc69987
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoK1MuMu_2012MagUp.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_BtoKstJpsi_2011MagDown.py b/Code/Ganga/xmlFiles/catalog_BtoKstJpsi_2011MagDown.py
new file mode 100644
index 0000000..6806a30
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoKstJpsi_2011MagDown.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_BtoKstJpsi_2011MagDown.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_BtoKstJpsi_2011MagDown.xml b/Code/Ganga/xmlFiles/catalog_BtoKstJpsi_2011MagDown.xml
new file mode 100644
index 0000000..9ca198a
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoKstJpsi_2011MagDown.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_BtoKstJpsi_2011MagDown_Kplus.py b/Code/Ganga/xmlFiles/catalog_BtoKstJpsi_2011MagDown_Kplus.py
new file mode 100644
index 0000000..1998cc0
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoKstJpsi_2011MagDown_Kplus.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_BtoKstJpsi_2011MagDown_Kplus.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_BtoKstJpsi_2011MagDown_Kplus.xml b/Code/Ganga/xmlFiles/catalog_BtoKstJpsi_2011MagDown_Kplus.xml
new file mode 100644
index 0000000..179845c
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoKstJpsi_2011MagDown_Kplus.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_BtoKstJpsi_2011MagUp.py b/Code/Ganga/xmlFiles/catalog_BtoKstJpsi_2011MagUp.py
new file mode 100644
index 0000000..6a585c8
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoKstJpsi_2011MagUp.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_BtoKstJpsi_2011MagUp.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_BtoKstJpsi_2011MagUp.xml b/Code/Ganga/xmlFiles/catalog_BtoKstJpsi_2011MagUp.xml
new file mode 100644
index 0000000..17cf8d9
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoKstJpsi_2011MagUp.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_BtoKstJpsi_2011MagUp_Kplus.py b/Code/Ganga/xmlFiles/catalog_BtoKstJpsi_2011MagUp_Kplus.py
new file mode 100644
index 0000000..1926c99
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoKstJpsi_2011MagUp_Kplus.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_BtoKstJpsi_2011MagUp_Kplus.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_BtoKstJpsi_2011MagUp_Kplus.xml b/Code/Ganga/xmlFiles/catalog_BtoKstJpsi_2011MagUp_Kplus.xml
new file mode 100644
index 0000000..1bafe02
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoKstJpsi_2011MagUp_Kplus.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_BtoKstJpsi_2012MagDown.py b/Code/Ganga/xmlFiles/catalog_BtoKstJpsi_2012MagDown.py
new file mode 100644
index 0000000..b397fce
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoKstJpsi_2012MagDown.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_BtoKstJpsi_2012MagDown.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_BtoKstJpsi_2012MagDown.xml b/Code/Ganga/xmlFiles/catalog_BtoKstJpsi_2012MagDown.xml
new file mode 100644
index 0000000..54fbab3
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoKstJpsi_2012MagDown.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_BtoKstJpsi_2012MagDown_Kplus.py b/Code/Ganga/xmlFiles/catalog_BtoKstJpsi_2012MagDown_Kplus.py
new file mode 100644
index 0000000..51a74cb
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoKstJpsi_2012MagDown_Kplus.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_BtoKstJpsi_2012MagDown_Kplus.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_BtoKstJpsi_2012MagDown_Kplus.xml b/Code/Ganga/xmlFiles/catalog_BtoKstJpsi_2012MagDown_Kplus.xml
new file mode 100644
index 0000000..f5580ee
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoKstJpsi_2012MagDown_Kplus.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_BtoKstJpsi_2012MagUp.py b/Code/Ganga/xmlFiles/catalog_BtoKstJpsi_2012MagUp.py
new file mode 100644
index 0000000..cf7eb33
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoKstJpsi_2012MagUp.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_BtoKstJpsi_2012MagUp.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_BtoKstJpsi_2012MagUp.xml b/Code/Ganga/xmlFiles/catalog_BtoKstJpsi_2012MagUp.xml
new file mode 100644
index 0000000..9089076
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoKstJpsi_2012MagUp.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_BtoKstJpsi_2012MagUp_Kplus.py b/Code/Ganga/xmlFiles/catalog_BtoKstJpsi_2012MagUp_Kplus.py
new file mode 100644
index 0000000..4b3465e
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoKstJpsi_2012MagUp_Kplus.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_BtoKstJpsi_2012MagUp_Kplus.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_BtoKstJpsi_2012MagUp_Kplus.xml b/Code/Ganga/xmlFiles/catalog_BtoKstJpsi_2012MagUp_Kplus.xml
new file mode 100644
index 0000000..a5e5e12
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoKstJpsi_2012MagUp_Kplus.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2011MagDown.py b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2011MagDown.py
new file mode 100644
index 0000000..3d79ebd
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2011MagDown.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_BtoKstMuMu_2011MagDown.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2011MagDown.xml b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2011MagDown.xml
new file mode 100644
index 0000000..deea6e3
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2011MagDown.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2011MagDown_Kplus.py b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2011MagDown_Kplus.py
new file mode 100644
index 0000000..e5c907f
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2011MagDown_Kplus.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_BtoKstMuMu_2011MagDown_Kplus.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2011MagDown_Kplus.xml b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2011MagDown_Kplus.xml
new file mode 100644
index 0000000..6d2f963
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2011MagDown_Kplus.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2012MagDown.py b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2012MagDown.py
new file mode 100644
index 0000000..fe38f5e
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2012MagDown.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_BtoKstMuMu_2012MagDown.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2012MagDown.xml b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2012MagDown.xml
new file mode 100644
index 0000000..10c8791
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2012MagDown.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2012MagDown_Kplus.py b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2012MagDown_Kplus.py
new file mode 100644
index 0000000..b6beb7a
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2012MagDown_Kplus.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_BtoKstMuMu_2012MagDown_Kplus.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2012MagDown_Kplus.xml b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2012MagDown_Kplus.xml
new file mode 100644
index 0000000..dcfdb25
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2012MagDown_Kplus.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2012MagUp.py b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2012MagUp.py
new file mode 100644
index 0000000..59990c6
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2012MagUp.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_BtoKstMuMu_2012MagUp.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2012MagUp.xml b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2012MagUp.xml
new file mode 100644
index 0000000..dcd2af4
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2012MagUp.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2012MagUp_Kplus.py b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2012MagUp_Kplus.py
new file mode 100644
index 0000000..048323c
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2012MagUp_Kplus.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_BtoKstMuMu_2012MagUp_Kplus.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2012MagUp_Kplus.xml b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2012MagUp_Kplus.xml
new file mode 100644
index 0000000..6a39979
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2012MagUp_Kplus.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2015MagDown.py b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2015MagDown.py
new file mode 100644
index 0000000..ce4f405
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2015MagDown.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_BtoKstMuMu_2015MagDown.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2015MagDown.xml b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2015MagDown.xml
new file mode 100644
index 0000000..f9ebff6
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2015MagDown.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2015MagDown_Kplus.py b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2015MagDown_Kplus.py
new file mode 100644
index 0000000..478ece4
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2015MagDown_Kplus.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_BtoKstMuMu_2015MagDown_Kplus.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2015MagDown_Kplus.xml b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2015MagDown_Kplus.xml
new file mode 100644
index 0000000..abde4b9
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2015MagDown_Kplus.xml
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2015MagUp.py b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2015MagUp.py
new file mode 100644
index 0000000..b231f8e
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2015MagUp.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_BtoKstMuMu_2015MagUp.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2015MagUp.xml b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2015MagUp.xml
new file mode 100644
index 0000000..373ed0a
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2015MagUp.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2015MagUp_Kplus.py b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2015MagUp_Kplus.py
new file mode 100644
index 0000000..98a6d58
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2015MagUp_Kplus.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_BtoKstMuMu_2015MagUp_Kplus.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2015MagUp_Kplus.xml b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2015MagUp_Kplus.xml
new file mode 100644
index 0000000..c05603a
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2015MagUp_Kplus.xml
@@ -0,0 +1,95 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2016MagDown.py b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2016MagDown.py
new file mode 100644
index 0000000..312b9e0
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2016MagDown.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_BtoKstMuMu_2016MagDown.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2016MagDown.xml b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2016MagDown.xml
new file mode 100644
index 0000000..e5447f3
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2016MagDown.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2016MagDown_Kplus.py b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2016MagDown_Kplus.py
new file mode 100644
index 0000000..cf966c7
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2016MagDown_Kplus.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_BtoKstMuMu_2016MagDown_Kplus.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2016MagDown_Kplus.xml b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2016MagDown_Kplus.xml
new file mode 100644
index 0000000..2c1e97a
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2016MagDown_Kplus.xml
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2016MagUp.py b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2016MagUp.py
new file mode 100644
index 0000000..386eb25
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2016MagUp.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_BtoKstMuMu_2016MagUp.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2016MagUp.xml b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2016MagUp.xml
new file mode 100644
index 0000000..bb9af5a
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2016MagUp.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2016MagUp_Kplus.py b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2016MagUp_Kplus.py
new file mode 100644
index 0000000..aff7c3c
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2016MagUp_Kplus.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_BtoKstMuMu_2016MagUp_Kplus.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2016MagUp_Kplus.xml b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2016MagUp_Kplus.xml
new file mode 100644
index 0000000..6effc21
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2016MagUp_Kplus.xml
@@ -0,0 +1,92 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2017MagDown_Kplus.py b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2017MagDown_Kplus.py
new file mode 100644
index 0000000..8d34439
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2017MagDown_Kplus.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_BtoKstMuMu_2017MagDown_Kplus.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2017MagDown_Kplus.xml b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2017MagDown_Kplus.xml
new file mode 100644
index 0000000..57f6a09
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2017MagDown_Kplus.xml
@@ -0,0 +1,247 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2017MagDown_Kshort.py b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2017MagDown_Kshort.py
new file mode 100644
index 0000000..69d51f8
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2017MagDown_Kshort.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_BtoKstMuMu_2017MagDown_Kshort.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2017MagDown_Kshort.xml b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2017MagDown_Kshort.xml
new file mode 100644
index 0000000..fdfd815
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2017MagDown_Kshort.xml
@@ -0,0 +1,255 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2017MagUp_Kplus.py b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2017MagUp_Kplus.py
new file mode 100644
index 0000000..47f7cf3
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2017MagUp_Kplus.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_BtoKstMuMu_2017MagUp_Kplus.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2017MagUp_Kplus.xml b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2017MagUp_Kplus.xml
new file mode 100644
index 0000000..0faa390
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2017MagUp_Kplus.xml
@@ -0,0 +1,247 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2017MagUp_Kshort.py b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2017MagUp_Kshort.py
new file mode 100644
index 0000000..cc85461
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2017MagUp_Kshort.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_BtoKstMuMu_2017MagUp_Kshort.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2017MagUp_Kshort.xml b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2017MagUp_Kshort.xml
new file mode 100644
index 0000000..e70aef9
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoKstMuMu_2017MagUp_Kshort.xml
@@ -0,0 +1,247 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2011MagDown.py b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2011MagDown.py
new file mode 100644
index 0000000..4a7fe35
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2011MagDown.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_BtoXJpsi_2011MagDown.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2011MagDown.xml b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2011MagDown.xml
new file mode 100644
index 0000000..9de24ac
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2011MagDown.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2011MagDown_Kplus.py b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2011MagDown_Kplus.py
new file mode 100644
index 0000000..74f14ae
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2011MagDown_Kplus.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_BtoXJpsi_2011MagDown_Kplus.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2011MagDown_Kplus.xml b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2011MagDown_Kplus.xml
new file mode 100644
index 0000000..c88c118
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2011MagDown_Kplus.xml
@@ -0,0 +1,95 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2011MagUp.py b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2011MagUp.py
new file mode 100644
index 0000000..d3c4417
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2011MagUp.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_BtoXJpsi_2011MagUp.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2011MagUp.xml b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2011MagUp.xml
new file mode 100644
index 0000000..b38d3b5
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2011MagUp.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2011MagUp_Kplus.py b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2011MagUp_Kplus.py
new file mode 100644
index 0000000..a11d4af
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2011MagUp_Kplus.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_BtoXJpsi_2011MagUp_Kplus.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2011MagUp_Kplus.xml b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2011MagUp_Kplus.xml
new file mode 100644
index 0000000..1f2d8fa
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2011MagUp_Kplus.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2012MagDown.py b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2012MagDown.py
new file mode 100644
index 0000000..c41c43b
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2012MagDown.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_BtoXJpsi_2012MagDown.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2012MagDown.xml b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2012MagDown.xml
new file mode 100644
index 0000000..a2c81e5
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2012MagDown.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2012MagDown_Kplus.py b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2012MagDown_Kplus.py
new file mode 100644
index 0000000..c017611
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2012MagDown_Kplus.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_BtoXJpsi_2012MagDown_Kplus.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2012MagDown_Kplus.xml b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2012MagDown_Kplus.xml
new file mode 100644
index 0000000..a76ce93
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2012MagDown_Kplus.xml
@@ -0,0 +1,94 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2012MagUp.py b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2012MagUp.py
new file mode 100644
index 0000000..9c4c66b
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2012MagUp.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_BtoXJpsi_2012MagUp.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2012MagUp.xml b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2012MagUp.xml
new file mode 100644
index 0000000..0d36013
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2012MagUp.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2012MagUp_Kplus.py b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2012MagUp_Kplus.py
new file mode 100644
index 0000000..e886917
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2012MagUp_Kplus.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_BtoXJpsi_2012MagUp_Kplus.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2012MagUp_Kplus.xml b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2012MagUp_Kplus.xml
new file mode 100644
index 0000000..66ef5a2
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2012MagUp_Kplus.xml
@@ -0,0 +1,95 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2015MagDown.py b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2015MagDown.py
new file mode 100644
index 0000000..da1ebc3
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2015MagDown.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_BtoXJpsi_2015MagDown.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2015MagDown.xml b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2015MagDown.xml
new file mode 100644
index 0000000..b08dcc0
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2015MagDown.xml
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2015MagUp.py b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2015MagUp.py
new file mode 100644
index 0000000..6d4eb076
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2015MagUp.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_BtoXJpsi_2015MagUp.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2015MagUp.xml b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2015MagUp.xml
new file mode 100644
index 0000000..3d1ee65
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2015MagUp.xml
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2016MagDown.py b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2016MagDown.py
new file mode 100644
index 0000000..c34172f
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2016MagDown.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_BtoXJpsi_2016MagDown.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2016MagDown.xml b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2016MagDown.xml
new file mode 100644
index 0000000..fccb7bc
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2016MagDown.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2016MagDown_Kplus.py b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2016MagDown_Kplus.py
new file mode 100644
index 0000000..f58c0e5
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2016MagDown_Kplus.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_BtoXJpsi_2016MagDown_Kplus.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2016MagDown_Kplus.xml b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2016MagDown_Kplus.xml
new file mode 100644
index 0000000..fccb7bc
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2016MagDown_Kplus.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2016MagUp.py b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2016MagUp.py
new file mode 100644
index 0000000..d06e6aa
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2016MagUp.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_BtoXJpsi_2016MagUp.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2016MagUp.xml b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2016MagUp.xml
new file mode 100644
index 0000000..9727d8c
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2016MagUp.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2016MagUp_Kplus.py b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2016MagUp_Kplus.py
new file mode 100644
index 0000000..7048017
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2016MagUp_Kplus.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_BtoXJpsi_2016MagUp_Kplus.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2016MagUp_Kplus.xml b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2016MagUp_Kplus.xml
new file mode 100644
index 0000000..ad980f2
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_BtoXJpsi_2016MagUp_Kplus.xml
@@ -0,0 +1,95 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_PHSP_2011MagDown.py b/Code/Ganga/xmlFiles/catalog_PHSP_2011MagDown.py
new file mode 100644
index 0000000..3d3e782
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_PHSP_2011MagDown.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_PHSP_2011MagDown.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_PHSP_2011MagDown.xml b/Code/Ganga/xmlFiles/catalog_PHSP_2011MagDown.xml
new file mode 100644
index 0000000..157d3d1
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_PHSP_2011MagDown.xml
@@ -0,0 +1,88 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_PHSP_2011MagDown_Kplus.py b/Code/Ganga/xmlFiles/catalog_PHSP_2011MagDown_Kplus.py
new file mode 100644
index 0000000..b872872
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_PHSP_2011MagDown_Kplus.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_PHSP_2011MagDown_Kplus.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_PHSP_2011MagDown_Kplus.xml b/Code/Ganga/xmlFiles/catalog_PHSP_2011MagDown_Kplus.xml
new file mode 100644
index 0000000..1f88b07
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_PHSP_2011MagDown_Kplus.xml
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_PHSP_2011MagDown_Kshort.py b/Code/Ganga/xmlFiles/catalog_PHSP_2011MagDown_Kshort.py
new file mode 100644
index 0000000..dc4bb99
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_PHSP_2011MagDown_Kshort.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_PHSP_2011MagDown_Kshort.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_PHSP_2011MagDown_Kshort.xml b/Code/Ganga/xmlFiles/catalog_PHSP_2011MagDown_Kshort.xml
new file mode 100644
index 0000000..5e86e2c
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_PHSP_2011MagDown_Kshort.xml
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_PHSP_2011MagUp.py b/Code/Ganga/xmlFiles/catalog_PHSP_2011MagUp.py
new file mode 100644
index 0000000..ffc45ab
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_PHSP_2011MagUp.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_PHSP_2011MagUp.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_PHSP_2011MagUp.xml b/Code/Ganga/xmlFiles/catalog_PHSP_2011MagUp.xml
new file mode 100644
index 0000000..8bdcf8e
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_PHSP_2011MagUp.xml
@@ -0,0 +1,79 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_PHSP_2011MagUp_Kplus.py b/Code/Ganga/xmlFiles/catalog_PHSP_2011MagUp_Kplus.py
new file mode 100644
index 0000000..91c7cd2
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_PHSP_2011MagUp_Kplus.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_PHSP_2011MagUp_Kplus.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_PHSP_2011MagUp_Kplus.xml b/Code/Ganga/xmlFiles/catalog_PHSP_2011MagUp_Kplus.xml
new file mode 100644
index 0000000..ca0d3a2
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_PHSP_2011MagUp_Kplus.xml
@@ -0,0 +1,79 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_PHSP_2011MagUp_Kshort.py b/Code/Ganga/xmlFiles/catalog_PHSP_2011MagUp_Kshort.py
new file mode 100644
index 0000000..e4b9ace
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_PHSP_2011MagUp_Kshort.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_PHSP_2011MagUp_Kshort.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_PHSP_2011MagUp_Kshort.xml b/Code/Ganga/xmlFiles/catalog_PHSP_2011MagUp_Kshort.xml
new file mode 100644
index 0000000..55b2c1f
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_PHSP_2011MagUp_Kshort.xml
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_PHSP_2012MagDown.py b/Code/Ganga/xmlFiles/catalog_PHSP_2012MagDown.py
new file mode 100644
index 0000000..107fe27
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_PHSP_2012MagDown.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_PHSP_2012MagDown.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_PHSP_2012MagDown.xml b/Code/Ganga/xmlFiles/catalog_PHSP_2012MagDown.xml
new file mode 100644
index 0000000..e554b95
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_PHSP_2012MagDown.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_PHSP_2012MagDown_Kplus.py b/Code/Ganga/xmlFiles/catalog_PHSP_2012MagDown_Kplus.py
new file mode 100644
index 0000000..e4ea252
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_PHSP_2012MagDown_Kplus.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_PHSP_2012MagDown_Kplus.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_PHSP_2012MagDown_Kplus.xml b/Code/Ganga/xmlFiles/catalog_PHSP_2012MagDown_Kplus.xml
new file mode 100644
index 0000000..491de88
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_PHSP_2012MagDown_Kplus.xml
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_PHSP_2012MagDown_Kshort.py b/Code/Ganga/xmlFiles/catalog_PHSP_2012MagDown_Kshort.py
new file mode 100644
index 0000000..ac6274f
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_PHSP_2012MagDown_Kshort.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_PHSP_2012MagDown_Kshort.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_PHSP_2012MagDown_Kshort.xml b/Code/Ganga/xmlFiles/catalog_PHSP_2012MagDown_Kshort.xml
new file mode 100644
index 0000000..df4cbb7
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_PHSP_2012MagDown_Kshort.xml
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_PHSP_2012MagUp.py b/Code/Ganga/xmlFiles/catalog_PHSP_2012MagUp.py
new file mode 100644
index 0000000..4c69354
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_PHSP_2012MagUp.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_PHSP_2012MagUp.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_PHSP_2012MagUp.xml b/Code/Ganga/xmlFiles/catalog_PHSP_2012MagUp.xml
new file mode 100644
index 0000000..d68421c
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_PHSP_2012MagUp.xml
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_PHSP_2012MagUp_Kplus.py b/Code/Ganga/xmlFiles/catalog_PHSP_2012MagUp_Kplus.py
new file mode 100644
index 0000000..20dab79
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_PHSP_2012MagUp_Kplus.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_PHSP_2012MagUp_Kplus.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_PHSP_2012MagUp_Kplus.xml b/Code/Ganga/xmlFiles/catalog_PHSP_2012MagUp_Kplus.xml
new file mode 100644
index 0000000..4637b77
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_PHSP_2012MagUp_Kplus.xml
@@ -0,0 +1,94 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_PHSP_2015MagDown.py b/Code/Ganga/xmlFiles/catalog_PHSP_2015MagDown.py
new file mode 100644
index 0000000..780f6ad
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_PHSP_2015MagDown.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_PHSP_2015MagDown.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_PHSP_2015MagDown.xml b/Code/Ganga/xmlFiles/catalog_PHSP_2015MagDown.xml
new file mode 100644
index 0000000..7b30a32
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_PHSP_2015MagDown.xml
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_PHSP_2015MagDown_Kplus.py b/Code/Ganga/xmlFiles/catalog_PHSP_2015MagDown_Kplus.py
new file mode 100644
index 0000000..307808d
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_PHSP_2015MagDown_Kplus.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_PHSP_2015MagDown_Kplus.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_PHSP_2015MagDown_Kplus.xml b/Code/Ganga/xmlFiles/catalog_PHSP_2015MagDown_Kplus.xml
new file mode 100644
index 0000000..6d6de6a
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_PHSP_2015MagDown_Kplus.xml
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_PHSP_2015MagDown_Kshort.py b/Code/Ganga/xmlFiles/catalog_PHSP_2015MagDown_Kshort.py
new file mode 100644
index 0000000..224f24d
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_PHSP_2015MagDown_Kshort.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_PHSP_2015MagDown_Kshort.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_PHSP_2015MagDown_Kshort.xml b/Code/Ganga/xmlFiles/catalog_PHSP_2015MagDown_Kshort.xml
new file mode 100644
index 0000000..5538279
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_PHSP_2015MagDown_Kshort.xml
@@ -0,0 +1,70 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_PHSP_2015MagUp.py b/Code/Ganga/xmlFiles/catalog_PHSP_2015MagUp.py
new file mode 100644
index 0000000..51645c5
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_PHSP_2015MagUp.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_PHSP_2015MagUp.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_PHSP_2015MagUp.xml b/Code/Ganga/xmlFiles/catalog_PHSP_2015MagUp.xml
new file mode 100644
index 0000000..04c1b87
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_PHSP_2015MagUp.xml
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_PHSP_2015MagUp_Kplus.py b/Code/Ganga/xmlFiles/catalog_PHSP_2015MagUp_Kplus.py
new file mode 100644
index 0000000..9705a30
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_PHSP_2015MagUp_Kplus.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_PHSP_2015MagUp_Kplus.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_PHSP_2015MagUp_Kplus.xml b/Code/Ganga/xmlFiles/catalog_PHSP_2015MagUp_Kplus.xml
new file mode 100644
index 0000000..57f3551
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_PHSP_2015MagUp_Kplus.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_PHSP_2016MagDown.py b/Code/Ganga/xmlFiles/catalog_PHSP_2016MagDown.py
new file mode 100644
index 0000000..978cc13
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_PHSP_2016MagDown.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_PHSP_2016MagDown.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_PHSP_2016MagDown.xml b/Code/Ganga/xmlFiles/catalog_PHSP_2016MagDown.xml
new file mode 100644
index 0000000..c25eaaf
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_PHSP_2016MagDown.xml
@@ -0,0 +1,70 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_PHSP_2016MagDown_Kplus.py b/Code/Ganga/xmlFiles/catalog_PHSP_2016MagDown_Kplus.py
new file mode 100644
index 0000000..99da45b
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_PHSP_2016MagDown_Kplus.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_PHSP_2016MagDown_Kplus.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_PHSP_2016MagDown_Kplus.xml b/Code/Ganga/xmlFiles/catalog_PHSP_2016MagDown_Kplus.xml
new file mode 100644
index 0000000..504d992
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_PHSP_2016MagDown_Kplus.xml
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_PHSP_2016MagDown_Kshort.py b/Code/Ganga/xmlFiles/catalog_PHSP_2016MagDown_Kshort.py
new file mode 100644
index 0000000..d09744a
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_PHSP_2016MagDown_Kshort.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_PHSP_2016MagDown_Kshort.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_PHSP_2016MagDown_Kshort.xml b/Code/Ganga/xmlFiles/catalog_PHSP_2016MagDown_Kshort.xml
new file mode 100644
index 0000000..f1932ff
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_PHSP_2016MagDown_Kshort.xml
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_PHSP_2016MagUp.py b/Code/Ganga/xmlFiles/catalog_PHSP_2016MagUp.py
new file mode 100644
index 0000000..af40f29
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_PHSP_2016MagUp.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_PHSP_2016MagUp.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_PHSP_2016MagUp.xml b/Code/Ganga/xmlFiles/catalog_PHSP_2016MagUp.xml
new file mode 100644
index 0000000..d43db77
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_PHSP_2016MagUp.xml
@@ -0,0 +1,70 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Ganga/xmlFiles/catalog_PHSP_2016MagUp_Kplus.py b/Code/Ganga/xmlFiles/catalog_PHSP_2016MagUp_Kplus.py
new file mode 100644
index 0000000..fe7fe38
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_PHSP_2016MagUp_Kplus.py
@@ -0,0 +1 @@
+FileCatalog().Catalogs = [ 'xmlcatalog_file:../xml_files/catalog_PHSP_2016MagUp_Kplus.xml' ]
diff --git a/Code/Ganga/xmlFiles/catalog_PHSP_2016MagUp_Kplus.xml b/Code/Ganga/xmlFiles/catalog_PHSP_2016MagUp_Kplus.xml
new file mode 100644
index 0000000..faefe8c
--- /dev/null
+++ b/Code/Ganga/xmlFiles/catalog_PHSP_2016MagUp_Kplus.xml
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Scripts/Backgrounds/BackgroundCheck.cc b/Code/Scripts/Backgrounds/BackgroundCheck.cc
new file mode 100644
index 0000000..fa34465
--- /dev/null
+++ b/Code/Scripts/Backgrounds/BackgroundCheck.cc
@@ -0,0 +1,248 @@
+#include "../GlobalFunctions.hh"
+#include "../HeidelbergFitter/LHCbStyle.h"
+
+using namespace std;
+using namespace RooFit ;
+
+//define mass regions:
+const UInt_t N = 2;
+//const Double_t low[N] = {5170., 5330., 5500.};
+//const Double_t high[N] = {5230., 5500., 5700.};
+const Double_t low[N] = {5170., 5350.};
+const Double_t high[N] = {5210., 5700.};
+
+std::vectorvalues[3][N];
+std::vectorerrors[3][N];
+
+std::string angles_latex[3] = {"cos(#Theta_{L})", "cos(#Theta_{K})", "#phi"};
+std::string angles_names[3] = {"ctl", "ctk", "phi"};
+
+Int_t BkgCheck(Int_t Run = 1, std::string DDLL = "DD") {
+
+ if(Run != 1 && Run != 2 && Run != 12){
+ std::cout << "[ERROR]\t\tInvalid Run number given: " << Run << ". Exit program!" << std::endl;
+ return 0;
+ }
+
+ const bool ScanChebyMaxOrder = false;
+ const bool IncludeChebyFit = false;
+ const UInt_t MaxOrderChebyPol = 3;
+
+ gStyle -> SetOptStat(0);
+ LHCbStyle();
+ gROOT->SetBatch(kTRUE);
+ TH1::SetDefaultSumw2(kTRUE);
+ //load tree from FCNC file
+ TChain * tree = new TChain("Events");
+ tree->Add(Form("%s/data/*Run%i%s_FCNC.root",path_to_data.c_str(),Run, KshortChannel && SplitDDandLL ? ("_"+DDLL).c_str() : ""));
+
+ if(tree->GetEntries() == 0){
+ std::cout << "No entries found in file!" << std::endl;
+ return 0;
+ }
+
+ //assign values to angles and mass
+ double angles[3], m;
+ tree->SetBranchAddress("m" , &m);
+ tree->SetBranchAddress("costhetal" , &angles[0]);
+ tree->SetBranchAddress("costhetak" , &angles[1]);
+ tree->SetBranchAddress("phi" , &angles[2]);
+
+ std::vector h[3];
+ const UInt_t nBins = 10;
+
+ //create histograms
+ for(UInt_t a = 0; a < 3; a++){
+ for(UInt_t n = 0; n < N; n++){
+ values[a][n].clear();
+ errors[a][n].clear();
+ TH1D* hist = new TH1D((angles_names[a]+"_"+std::to_string(low[n])+"-"+std::to_string(high[n])+"_MeV").c_str(),
+ Form("%.1f-%.1f MeV;%s;norm. Events", low[n], high[n], angles_latex[a].c_str()),
+ nBins, a == 2 ? -TMath::Pi() : -1., a == 2 ? +TMath::Pi() : +1.);
+ h[a].push_back(hist);
+ }
+ }
+
+ //fill all histograms with events, according to mass bin
+ for(UInt_t e = 0; e < tree->GetEntries(); e++){
+ tree->GetEntry(e);
+ for(UInt_t n = 0; n < N; n++){
+ if(m > low[n] && m <= high[n]){
+ for(UInt_t a = 0; a < 3; a++){
+ h[a].at(n)->Fill(angles[a]);
+ }
+ continue;
+ }
+ }
+ }
+
+ //put event numbers into hist names
+ for(UInt_t a = 0; a < 3; a++){
+ for(UInt_t n = 0; n < N; n++){
+ h[a].at(n)->SetTitle(Form("%s (%.0f Events)", h[a].at(n)->GetTitle(), h[a].at(n)->Integral()));
+ }
+ }
+
+ //make .eps plots:
+ TCanvas * c = new TCanvas();
+ c->cd();
+ for(UInt_t a = 0; a < 3; a++){
+ std::vector ff;
+ c->Clear();
+ for(UInt_t n = 0; n < N; n++){
+ h[a].at(n)->Scale(1./h[a].at(n)->Integral()*nBins);
+ h[a].at(n)->GetYaxis()->SetRangeUser(0, 2.5);///nBins);
+ h[a].at(n)->SetLineColor(n+1);
+ h[a].at(n)->SetMarkerStyle(n+20);
+ h[a].at(n)->SetMarkerColor(n+1);
+ h[a].at(n)->SetFillStyle(n == 1 ? 3345 : (n == 2 ? 3354 : 1));
+ h[a].at(n)->SetFillColor(n+1);
+ h[a].at(n)->Draw(n == 0 ? "PE3" : "PE3SAME");
+
+ //Fit Chebyshev polynomials to histograms:
+/*
+ std::string fitformular = "[0]*cheb0";
+ for(UInt_t ch = 1; ch <= MaxOrderChebyPol; ch++){
+// fitformular.append(TString::Format(" + [%d]*cheb%d", ch, ch));
+ fitformular = TString::Format("cheb%d", ch, ch);
+ }
+ TF1 * f = new TF1(("f_"+angles_names[a]+"_"+std::to_string(n)).c_str(),fitformular.c_str(), a == 2 ? -TMath::Pi() : -1., a == 2 ? +TMath::Pi() : +1.);
+ f->SetLineColor(n+1);
+ for(UInt_t ch = 0; ch <= MaxOrderChebyPol; ch++){
+ f->SetParameter(ch, 0.8);
+ }
+ h[a].at(n)->Fit(f, "R+");
+ ff.push_back(f);
+*/
+
+ UInt_t cheb = 1;
+ if(ScanChebyMaxOrder){
+ while(cheb <= MaxOrderChebyPol){
+ TF1 * f = new TF1(("f_"+angles_names[a]+"_"+std::to_string(n)).c_str(), TString::Format("cheb%d", cheb), a == 2 ? -TMath::Pi() : -1., a == 2 ? +TMath::Pi() : +1.);
+ f->FixParameter(0, 1.);
+ h[a].at(n)->Fit(f, "RQ");
+ if(TMath::Abs(f->GetParameter(cheb)) < TMath::Abs(f->GetParError(cheb))){
+ cheb--;
+ break;
+ }
+ cheb++;
+ }
+ }
+ else{
+ cheb = MaxOrderChebyPol;
+ }
+
+ //fit Chebyshev with according max order:
+ if(IncludeChebyFit){
+ TF1 * f = new TF1(("f_"+angles_names[a]+"_"+std::to_string(n)).c_str(), TString::Format("cheb%d", cheb), a == 2 ? -TMath::Pi() : -1., a == 2 ? +TMath::Pi() : +1.);
+ f->SetLineColor(n+1);
+ f->FixParameter(0, 1.);
+ h[a].at(n)->Fit(f, "RQ+");
+ for(UInt_t i = 0; i < cheb; i++){
+ values[a][n].push_back(f->GetParameter(i));
+ errors[a][n].push_back(f->GetParError(i));
+ }
+ ff.push_back(f);
+ h[a].at(n)->GetListOfFunctions()->Clear();
+ h[a].at(n)->SetTitle(Form("%s (Cheby %d)", h[a].at(n)->GetTitle(), cheb));
+ }
+ }
+ c->BuildLegend(0.25, 0.75, 0.75, 0.92);
+ for(UInt_t i = 0; i < ff.size(); i++)
+ ff.at(i)->Draw("SAME");
+ c->SaveAs((angles_names[a]+"_bkg_Run"+std::to_string(Run)+(KshortChannel && SplitDDandLL ? "_"+DDLL : "")+".eps").c_str());
+ }
+ delete c;
+ for(UInt_t a = 0; a < 3; a++){
+ for(UInt_t n = 0; n < N; n++){
+ delete h[a].at(n);
+ }
+ }
+ return 1;
+}
+
+Int_t BackgroundCheck(){
+
+ if(BkgCheck(1, "DD") == 0){
+ return 0;
+ }
+ std::cout << "/=====================\\" << std::endl;
+ std::cout << "| Results Run 1, DD: |" << std::endl;
+ std::cout << "\\=====================/" << std::endl;
+ for(UInt_t a = 0; a < 3; a++){
+ std::cout << ">> " << angles_names[a] << " <<" << std::endl;
+ for(UInt_t v = 0; v < values[a][0].size(); v++){
+ double ave_value = 0.0, ave_error = 0.0;
+ for(UInt_t n = 0; n < N; n++){
+ assert(values[a][n].size() == values[a][0].size());
+ ave_value += values[a][n].at(v) / N;
+ ave_error += TMath::Power(errors[a][n].at(v), 2);
+ }
+ ave_error = TMath::Sqrt(ave_error)/N;
+ std::cout << "cheb" << v << ":\t" << ave_value << " +/- " << ave_error << std::endl;
+ }
+ }
+ if(BkgCheck(2, "DD") == 0){
+ return 0;
+ }
+ std::cout << "/=====================\\" << std::endl;
+ std::cout << "| Results Run 2, DD: |" << std::endl;
+ std::cout << "\\=====================/" << std::endl;
+ for(UInt_t a = 0; a < 3; a++){
+ std::cout << ">> " << angles_names[a] << " <<" << std::endl;
+ for(UInt_t v = 0; v < values[a][0].size(); v++){
+ double ave_value = 0.0, ave_error = 0.0;
+ for(UInt_t n = 0; n < N; n++){
+ assert(values[a][n].size() == values[a][0].size());
+ ave_value += values[a][n].at(v) / N;
+ ave_error += TMath::Power(errors[a][n].at(v), 2);
+ }
+ ave_error = TMath::Sqrt(ave_error)/N;
+ std::cout << "cheb" << v << ":\t" << ave_value << " +/- " << ave_error << std::endl;
+ }
+ }
+
+ if(KshortChannel && SplitDDandLL){
+ if(BkgCheck(1, "LL") == 0){
+ return 0;
+ }
+ std::cout << "/=====================\\" << std::endl;
+ std::cout << "| Results Run 1, LL: |" << std::endl;
+ std::cout << "\\=====================/" << std::endl;
+ for(UInt_t a = 0; a < 3; a++){
+ std::cout << ">> " << angles_names[a] << " <<" << std::endl;
+ for(UInt_t v = 0; v < values[a][0].size(); v++){
+ double ave_value = 0.0, ave_error = 0.0;
+ for(UInt_t n = 0; n < N; n++){
+ assert(values[a][n].size() == values[a][0].size());
+ ave_value += values[a][n].at(v) / N;
+ ave_error += TMath::Power(errors[a][n].at(v), 2);
+ }
+ ave_error = TMath::Sqrt(ave_error)/N;
+ std::cout << "cheb" << v << ":\t" << ave_value << " +/- " << ave_error << std::endl;
+ }
+ }
+ if(BkgCheck(2, "LL") == 0){
+ return 0;
+ }
+ std::cout << "/=====================\\" << std::endl;
+ std::cout << "| Results Run 2, LL: |" << std::endl;
+ std::cout << "\\=====================/" << std::endl;
+ for(UInt_t a = 0; a < 3; a++){
+ std::cout << ">> " << angles_names[a] << " <<" << std::endl;
+ for(UInt_t v = 0; v < values[a][0].size(); v++){
+ double ave_value = 0.0, ave_error = 0.0;
+ for(UInt_t n = 0; n < N; n++){
+ assert(values[a][n].size() == values[a][0].size());
+ ave_value += values[a][n].at(v) / N;
+ ave_error += TMath::Power(errors[a][n].at(v), 2);
+ }
+ ave_error = TMath::Sqrt(ave_error)/N;
+ std::cout << "cheb" << v << ":\t" << ave_value << " +/- " << ave_error << std::endl;
+ }
+ }
+ }
+ return 1;
+}
+
+
diff --git a/Code/Scripts/Backgrounds/CompareBackgroundSamples.cc b/Code/Scripts/Backgrounds/CompareBackgroundSamples.cc
new file mode 100755
index 0000000..f3cfe31
--- /dev/null
+++ b/Code/Scripts/Backgrounds/CompareBackgroundSamples.cc
@@ -0,0 +1,646 @@
+#include "../GlobalFunctions.hh"
+
+
+using namespace std;
+using namespace RooFit ;
+
+
+class factor{
+private:
+public:
+ string Channel;
+ bool MagUp;
+ Int_t year;
+ Int_t nEvents;
+ Double_t OtherScale;
+
+ factor(){
+ Channel = "";
+ MagUp = false;
+ nEvents = 0;
+ OtherScale = 1.0;
+ } //empty constructor
+
+ factor(string Channel_tmp, bool MagUp_tmp, Int_t year_tmp, Int_t nEvents_tmp); //default constructor with no other scales
+ factor(string Channel_tmp, bool MagUp_tmp, Int_t year, Int_t nEvents_tmp, Double_t OtherScale_tmp); //default constructor
+ ~factor(); //destuctor
+};
+
+factor::factor(string Channel_tmp, bool MagUp_tmp, Int_t year_tmp, Int_t nEvents_tmp){
+ Channel = Channel_tmp;
+ MagUp = MagUp_tmp;
+ year = year_tmp;
+ nEvents = nEvents_tmp;
+ OtherScale = 1.0;
+ return;
+}
+
+factor::factor(string Channel_tmp, bool MagUp_tmp, Int_t year_tmp, Int_t nEvents_tmp, Double_t OtherScale_tmp){
+ Channel = Channel_tmp;
+ MagUp = MagUp_tmp;
+ year = year_tmp;
+ nEvents = nEvents_tmp;
+ OtherScale = OtherScale_tmp;
+ return;
+}
+
+factor::~factor(){
+ Channel = "";
+ MagUp = false;
+ year = 0;
+ nEvents = 0;
+ OtherScale = 1.0;
+ return;
+}
+
+class oneChannelFactors{ //factors just for one channel, including the lenght, for easier handling
+private:
+public:
+ string Channel = "";
+ vector factorsVec;
+ int VecSize = 0;
+ oneChannelFactors(){
+ Channel = "";
+ VecSize = 0;
+ factorsVec.clear();
+ } //empty constructor
+ oneChannelFactors(vector factorsVec_tmp); //default constructor
+ ~oneChannelFactors(); //destuctor
+};
+
+oneChannelFactors::~oneChannelFactors(){
+ factorsVec.empty();
+ Channel = "";
+ VecSize = 0;
+}
+
+oneChannelFactors::oneChannelFactors(vector factorsVec_tmp){
+ Channel = factorsVec_tmp.at(0).Channel; //todo, check if they are all the same
+ factorsVec = factorsVec_tmp;
+ VecSize = factorsVec_tmp.size();
+ return;
+}
+
+class allFactors{
+private:
+public:
+ vector factorsChannelVec;
+ int NoChannels = 0;
+
+ allFactors(){
+ NoChannels = 0;
+ factorsChannelVec.clear();
+ } //empty constructor
+ allFactors(int Run, bool RefChan); //default constructor
+ ~allFactors(); //destuctor
+};
+
+allFactors::allFactors(int Run, bool RefChan){
+
+ oneChannelFactors one_channel_factors_tmp;
+ factor factor_tmp;
+ vector factorsVec_tmp;
+
+
+ if (!RefChan){
+ //--------------------------------------------------------------------
+ // KplusPi0
+ //--------------------------------------------------------------------
+ //Run I
+ if (Run == 1){
+ factor_tmp = factor("KplusPi0", false, 2011, 507551 );
+ factorsVec_tmp.push_back(factor_tmp);
+ factor_tmp = factor("KplusPi0", true, 2011, 502787 );
+ factorsVec_tmp.push_back(factor_tmp);
+ factor_tmp = factor("KplusPi0", false, 2012, 514015 );
+ factorsVec_tmp.push_back(factor_tmp);
+ factor_tmp = factor("KplusPi0", true, 2012, 500458 );
+ factorsVec_tmp.push_back(factor_tmp);
+ }
+
+ // Run II
+ if (Run == 2){
+ factor_tmp = factor("KplusPi0", false, 2015, 500320 );
+ factorsVec_tmp.push_back(factor_tmp);
+ factor_tmp = factor("KplusPi0", true, 2015, 507272 );
+ factorsVec_tmp.push_back(factor_tmp);
+ factor_tmp = factor("KplusPi0", false, 2016, 999419 );
+ factorsVec_tmp.push_back(factor_tmp);
+ factor_tmp = factor("KplusPi0", true, 2016, 1000151 );
+ factorsVec_tmp.push_back(factor_tmp);
+ }
+
+ one_channel_factors_tmp = oneChannelFactors(factorsVec_tmp);
+ factorsChannelVec.push_back(one_channel_factors_tmp);
+ factorsVec_tmp.clear();
+
+ //--------------------------------------------------------------------
+ // B0toKstMuMu
+ //--------------------------------------------------------------------
+
+ //Run I
+ if (Run == 1){
+ factor_tmp = factor("B0toKstMuMu", false, 2011, 525851, 1.5 );
+ factorsVec_tmp.push_back(factor_tmp);
+ factor_tmp = factor("B0toKstMuMu", true, 2011, 506402, 1.5 );
+ factorsVec_tmp.push_back(factor_tmp);
+ factor_tmp = factor("B0toKstMuMu", false, 2012, 257748, 1.5 );
+ factorsVec_tmp.push_back(factor_tmp);
+ factor_tmp = factor("B0toKstMuMu", true, 2012, 260000, 1.5 );
+ factorsVec_tmp.push_back(factor_tmp);
+ }
+
+ // Run II
+ if (Run == 2){
+ factor_tmp = factor("B0toKstMuMu", false, 2015, 502704, 1.5* 13.0/(13.0-4.0) );
+ factorsVec_tmp.push_back(factor_tmp);
+ factor_tmp = factor("B0toKstMuMu", true, 2015, 503254, 1.5* 12.0/(12.0-1.0) );
+ factorsVec_tmp.push_back(factor_tmp);
+ factor_tmp = factor("B0toKstMuMu", false, 2016, 657410, 1.5* 5.0/(5.0-4.0) );
+ factorsVec_tmp.push_back(factor_tmp);
+ factor_tmp = factor("B0toKstMuMu", true, 2016, 707852, 1.5* 5.0/(5.0-1.0) );
+ factorsVec_tmp.push_back(factor_tmp);
+ }
+
+ one_channel_factors_tmp = oneChannelFactors(factorsVec_tmp);
+ factorsChannelVec.push_back(one_channel_factors_tmp);
+ factorsVec_tmp.clear();
+ }
+ else{
+ //--------------------------------------------------------------------
+ // RefKplusPi0
+ //--------------------------------------------------------------------
+
+ //Run I
+ if (Run == 1){
+ factor_tmp = factor("RefKplusPi0", false, 2011, 1011831 );
+ factorsVec_tmp.push_back(factor_tmp);
+ factor_tmp = factor("RefKplusPi0", true, 2011, 1007920 );
+ factorsVec_tmp.push_back(factor_tmp);
+ factor_tmp = factor("RefKplusPi0", false, 2012, 1003888 );
+ factorsVec_tmp.push_back(factor_tmp);
+ factor_tmp = factor("RefKplusPi0", true, 2012, 1000278 );
+ factorsVec_tmp.push_back(factor_tmp);
+ }
+
+ // Run II
+ if (Run == 2){
+ factor_tmp = factor("RefKplusPi0", false, 2015, -1 );
+ factorsVec_tmp.push_back(factor_tmp);
+ factor_tmp = factor("RefKplusPi0", true, 2015, -1 );
+ factorsVec_tmp.push_back(factor_tmp);
+ factor_tmp = factor("RefKplusPi0", false, 2016, -1 );
+ factorsVec_tmp.push_back(factor_tmp);
+ factor_tmp = factor("RefKplusPi0", true, 2016, -1 );
+ factorsVec_tmp.push_back(factor_tmp);
+ }
+
+ one_channel_factors_tmp = oneChannelFactors(factorsVec_tmp);
+ factorsChannelVec.push_back(one_channel_factors_tmp);
+ factorsVec_tmp.clear();
+
+
+ //--------------------------------------------------------------------
+ // B0toKstJpsi
+ //--------------------------------------------------------------------
+
+ //Run I
+ if (Run == 1){
+ factor_tmp = factor("B0toKstJpsi", false, 2011, 3081998, 1.5 );
+ factorsVec_tmp.push_back(factor_tmp);
+ factor_tmp = factor("B0toKstJpsi", true, 2011, 3076566, 1.5 * 13.0/(13.0-1.0) );
+ factorsVec_tmp.push_back(factor_tmp);
+ factor_tmp = factor("B0toKstJpsi", false, 2012, 4435958, 1.5 * 15.0/(15.0-1.0) );
+ factorsVec_tmp.push_back(factor_tmp);
+ factor_tmp = factor("B0toKstJpsi", true, 2012, 4425822, 1.5 );
+ factorsVec_tmp.push_back(factor_tmp);
+ }
+
+ // Run II
+ if (Run == 2){
+ factor_tmp = factor("B0toKstJpsi", false, 2015, 874037 , 1.5 );
+ factorsVec_tmp.push_back(factor_tmp);
+ factor_tmp = factor("B0toKstJpsi", true, 2015, 502444 , 1.5 );
+ factorsVec_tmp.push_back(factor_tmp);
+ factor_tmp = factor("B0toKstJpsi", false, 2016, 5033743 , 1.5*125.0/(125.0-2.0) );
+ factorsVec_tmp.push_back(factor_tmp);
+ factor_tmp = factor("B0toKstJpsi", true, 2016, 4991624 , 1.5*133.0/(133.0-2.0) );
+ factorsVec_tmp.push_back(factor_tmp);
+ }
+
+ one_channel_factors_tmp = oneChannelFactors(factorsVec_tmp);
+ factorsChannelVec.push_back(one_channel_factors_tmp);
+ factorsVec_tmp.clear();
+
+ //--------------------------------------------------------------------
+ // BtoXJpsi
+ //--------------------------------------------------------------------
+
+ //Run I
+
+ if (Run == 1){
+ factor_tmp = factor("BtoXJpsi", false, 2011, -1);//2508491);
+ factorsVec_tmp.push_back(factor_tmp);
+ factor_tmp = factor("BtoXJpsi", true, 2011,-1);// 2514495);
+ factorsVec_tmp.push_back(factor_tmp);
+ factor_tmp = factor("BtoXJpsi", false, 2012, -1);//2504990);
+ factorsVec_tmp.push_back(factor_tmp);
+ factor_tmp = factor("BtoXJpsi", true, 2012,-1);// 2535488);
+ factorsVec_tmp.push_back(factor_tmp);
+ }
+
+ // Run II
+ if (Run == 2){
+ factor_tmp = factor("BtoXJpsi", false, 2015, -1);
+ factorsVec_tmp.push_back(factor_tmp);
+ factor_tmp = factor("BtoXJpsi", true, 2015, -1 );
+ factorsVec_tmp.push_back(factor_tmp);
+ factor_tmp = factor("BtoXJpsi", false, 2016, 5090001 );
+ factorsVec_tmp.push_back(factor_tmp);
+ factor_tmp = factor("BtoXJpsi", true, 2016, 6055765 );
+ factorsVec_tmp.push_back(factor_tmp);
+ }
+
+ one_channel_factors_tmp = oneChannelFactors(factorsVec_tmp);
+ factorsChannelVec.push_back(one_channel_factors_tmp);
+ factorsVec_tmp.clear();
+
+
+ //--------------------------------------------------------------------
+ // BtoK1MuMu
+ //--------------------------------------------------------------------
+ /*
+ //Run I
+ if (Run == 1){
+ factor_tmp = factor("BtoK1MuMu", false, 2011, 1038809 );
+ factorsVec_tmp.push_back(factor_tmp);
+ factor_tmp = factor("BtoK1MuMu", true, 2011, 1027740 );
+ factorsVec_tmp.push_back(factor_tmp);
+ factor_tmp = factor("BtoK1MuMu", false, 2012, 2003930 );
+ factorsVec_tmp.push_back(factor_tmp);
+ factor_tmp = factor("BtoK1MuMu", true, 2012, 2008883 );
+ factorsVec_tmp.push_back(factor_tmp);
+ }
+
+ // Run II
+ if (Run == 2){
+ factor_tmp = factor("BtoK1MuMu", false, 2015, -1 );
+ factorsVec_tmp.push_back(factor_tmp);
+ factor_tmp = factor("BtoK1MuMu", true, 2015, -1 );
+ factorsVec_tmp.push_back(factor_tmp);
+ factor_tmp = factor("BtoK1MuMu", false, 2016, -1 );
+ factorsVec_tmp.push_back(factor_tmp);
+ factor_tmp = factor("BtoK1MuMu", true, 2016, -1 );
+ factorsVec_tmp.push_back(factor_tmp);
+ }
+
+ one_channel_factors_tmp = oneChannelFactors(factorsVec_tmp);
+ factorsChannelVec.push_back(one_channel_factors_tmp);
+ factorsVec_tmp.clear();
+ */
+
+ //--------------------------------------------------------------------
+ // BtoK1Jpsi
+ //--------------------------------------------------------------------
+
+ //Run I
+ if (Run == 1){
+ factor_tmp = factor("BtoK1Jpsi", false, 2011, -1 );
+ factorsVec_tmp.push_back(factor_tmp);
+ factor_tmp = factor("BtoK1Jpsi", true, 2011, -1 );
+ factorsVec_tmp.push_back(factor_tmp);
+ factor_tmp = factor("BtoK1Jpsi", false, 2012, 250249, 2.0 );
+ factorsVec_tmp.push_back(factor_tmp);
+ factor_tmp = factor("BtoK1Jpsi", true, 2012, 265250, 2.0 );
+ factorsVec_tmp.push_back(factor_tmp);
+ }
+
+ // Run II
+ if (Run == 2){
+ factor_tmp = factor("BtoK1Jpsi", false, 2015, -1 );
+ factorsVec_tmp.push_back(factor_tmp);
+ factor_tmp = factor("BtoK1Jpsi", true, 2015, -1 );
+ factorsVec_tmp.push_back(factor_tmp);
+ factor_tmp = factor("BtoK1Jpsi", false, 2016, -1 );
+ factorsVec_tmp.push_back(factor_tmp);
+ factor_tmp = factor("BtoK1Jpsi", true, 2016, -1 );
+ factorsVec_tmp.push_back(factor_tmp);
+ }
+
+ one_channel_factors_tmp = oneChannelFactors(factorsVec_tmp);
+ factorsChannelVec.push_back(one_channel_factors_tmp);
+ factorsVec_tmp.clear();
+
+ }
+ //--------------------------------------------------------------------
+ // PHSP
+ //--------------------------------------------------------------------
+
+ /*
+ //Run I
+ if (Run == 1){
+ factor_tmp = factor("PHSP", false, 2011, 94529 );
+ factorsVec_tmp.push_back(factor_tmp);
+ factor_tmp = factor("PHSP", true, 2011, 91600 );
+ factorsVec_tmp.push_back(factor_tmp);
+ factor_tmp = factor("PHSP", false, 2012, 175028 );
+ factorsVec_tmp.push_back(factor_tmp);
+ factor_tmp = factor("PHSP", true, 2012, 203760 );
+ factorsVec_tmp.push_back(factor_tmp);
+ }
+
+ // Run II
+ if (Run == 2){
+ factor_tmp = factor("PHSP", false, 2015, 76712 );
+ factorsVec_tmp.push_back(factor_tmp);
+ factor_tmp = factor("PHSP", true, 2015, 72037 );
+ factorsVec_tmp.push_back(factor_tmp);
+ factor_tmp = factor("PHSP", false, 2016, 214587 );
+ factorsVec_tmp.push_back(factor_tmp);
+ factor_tmp = factor("PHSP", true, 2016, 216923 );
+ factorsVec_tmp.push_back(factor_tmp);
+ }
+
+ one_channel_factors_tmp = oneChannelFactors(factorsVec_tmp);
+ factorsChannelVec.push_back(one_channel_factors_tmp);
+ factorsVec_tmp.clear();
+ */
+
+ NoChannels = factorsChannelVec.size();
+
+}
+
+allFactors::~allFactors(){
+ factorsChannelVec.empty();
+ NoChannels = 0;
+}
+
+//void allFactors::print(){ //TODO
+ /*
+ cout << "[INFO]\t\tUsing " << NoVariables << " variables." << endl;
+ cout << "[INFO]\t\tBranchName \t\t LaTeXName \t\t Unit \t\t DataType" << endl;
+ for (vector::iterator tracksIter1 = AllVariables.begin(); tracksIter1 !=AllVariables.end();++tracksIter1){
+ cout<< "[INFO]\t\t" << (*tracksIter1).ReaderName << "\t\t" << (*tracksIter1).LaTeXName << "\t\t" << (*tracksIter1).Unit << "\t\t" << (*tracksIter1).DataType << endl;
+ }
+ */
+//}
+
+oneChannelFactors SignalFactors(int Run =1){
+
+ factor factorSig;
+ vector factorsSigVec;
+
+
+ //--------------------------------------------------------------------
+ // KplusPi0
+ //--------------------------------------------------------------------
+
+ //Run I
+ if (Run ==1){
+ factorSig = factor("KplusPi0", false, 2011, 507551 );
+ factorsSigVec.push_back(factorSig);
+ factorSig = factor("KplusPi0", true, 2011, 502787 );
+ factorsSigVec.push_back(factorSig);
+ factorSig = factor("KplusPi0", false, 2012, 514015 );
+ factorsSigVec.push_back(factorSig);
+ factorSig = factor("KplusPi0", true, 2012, 500458 );
+ factorsSigVec.push_back(factorSig);
+ }
+ // Run II
+ else{
+ factorSig = factor("KplusPi0", false, 2015, 500320 );
+ factorsSigVec.push_back(factorSig);
+ factorSig = factor("KplusPi0", true, 2015, 507272 );
+ factorsSigVec.push_back(factorSig);
+ factorSig = factor("KplusPi0", false, 2016, 999419 );
+ factorsSigVec.push_back(factorSig);
+ factorSig = factor("KplusPi0", true, 2016, 1000151 );
+ factorsSigVec.push_back(factorSig);
+ }
+ return oneChannelFactors(factorsSigVec);
+
+
+}
+
+oneChannelFactors SignalRefFactors(int Run =1){
+
+ factor factorSig;
+ vector factorsSigVec;
+
+
+ //--------------------------------------------------------------------
+ // RefKplusPi0
+ //--------------------------------------------------------------------
+
+ //Run I
+ if (Run ==1){
+ factorSig = factor("RefKplusPi0", false, 2011, 1011831 );
+ factorsSigVec.push_back(factorSig);
+ factorSig = factor("RefKplusPi0", true, 2011, 1007920 );
+ factorsSigVec.push_back(factorSig);
+ factorSig = factor("RefKplusPi0", false, 2012, 1003888 );
+ factorsSigVec.push_back(factorSig);
+ factorSig = factor("RefKplusPi0", true, 2012, 1000278 );
+ factorsSigVec.push_back(factorSig);
+
+ }
+ // Run II
+ else{
+ factorSig = factor("RefKplusPi0", false, 2015, -1 );
+ factorsSigVec.push_back(factorSig);
+ factorSig = factor("RefKplusPi0", true, 2015, -1 );
+ factorsSigVec.push_back(factorSig);
+ factorSig = factor("RefKplusPi0", false, 2016, -1 );
+ factorsSigVec.push_back(factorSig);
+ factorSig = factor("RefKplusPi0", true, 2016, -1 );
+ factorsSigVec.push_back(factorSig);
+ }
+ return oneChannelFactors(factorsSigVec);
+
+}
+
+string HistName(string channel, int year, bool MagUp, bool preselected, bool TM){
+ if (preselected) return channel + "_KGammaGammaMuMu_mass_after_preselection_" + (TM ? "TM_" : "") + to_string(year) + (MagUp ? "MagUp" : "MagDown");
+ else return channel + "_KGammaGammaMuMu_mass_before_preselection_" + (TM ? "TM_" : "") + to_string(year) + (MagUp ? "MagUp" : "MagDown");
+}
+
+void designCanvas(TCanvas* canvas){
+ canvas->SetRightMargin(0.04);
+ canvas->SetTopMargin(0.04);
+ canvas->SetLeftMargin(0.12);
+ canvas->SetBottomMargin(0.12);
+ return;
+
+}
+
+void designPlots(TH1F *hist, int color){
+ hist->SetLineWidth(2);
+ hist->SetLineColor(color);
+ hist->GetYaxis()->SetTitleOffset(1.7);
+ hist->GetXaxis()->SetTitleOffset(1.0);
+ hist->SetTitle("");
+}
+
+
+//the function to loop over all events and merge them into one file; apply cut-based selection while merging
+int PlotMasses(int Run =1, bool RefChan=true, bool TruthMatched = false, bool Stripped = false) {
+
+ if (!Kst2Kpluspi0Resolved){
+ cout << "Only applicable for KplusPi0 channel! Fix GlobalFunctions.hh" << endl;
+ return 0;
+ }
+
+ if (Stripped && TruthMatched){
+ cout << "[ERROR]\t Stripped data cannot be truthmatched, setting TruthMatched to false" << endl;
+ TruthMatched = false;
+ }
+ TFile *tmpFile = 0;
+ // TFile *outputFile = new TFile(Form("%s/data/MC/tmp%s.root",path_to_output_KplusPizero.c_str(), (smallSample ? "_small":"")),"RECREATE");
+ TFile *outputFile = new TFile(Form("%s/data/MC/pi0Resolved_background_histos%s.root",path_to_output_KplusPizero.c_str(), (smallSample ? "_small":"")),"RECREATE");
+
+ //std::vector StrippedMasses;
+ //std::vector PreselectedMasses;
+
+ TH1F *tmp = new TH1F("tmp" , "tmp", 100, cut_B_plus_M_low, cut_B_plus_M_high);
+
+ //tmp variables
+ string decay = "";
+ string year_str = "";
+
+ //Data
+ allFactors ChannelFactors = allFactors(Run, RefChan); //the boolean is just to differentiate it form the defaul constructor
+ factor fac = factor();
+ oneChannelFactors SigFac = SignalFactors(Run);
+ oneChannelFactors SigRefFac = SignalRefFactors(Run);
+ Double_t scaling_factor = 0.0;
+ TTree * treeMC, *treeMCold;
+ //if (TruthMatched) treeMC = new TTree("DecayTreeTruthMatched");
+ //else treeMC = new TTree("DecayTree");
+
+ TCanvas* CanvasPreselectedVec[2][2]; //Create 8 canvases for each year and polarity
+ TPaveText *legend[2][2];
+ //This would be so much nicer in python...
+
+ gStyle->SetOptStat(0);
+
+
+ for (int c = 0; c < 2; c++){
+ CanvasPreselectedVec[0][c] = new TCanvas(Form("cPD%i", (Run==1) ? 2011+c : 2015+c), "", 10,10,600,600);
+ CanvasPreselectedVec[1][c] = new TCanvas(Form("cPU%i",(Run==1) ? 2011+c : 2015+c), "", 10,10,600,600);
+ designCanvas(CanvasPreselectedVec[0][c]);
+ designCanvas(CanvasPreselectedVec[1][c]);
+ CanvasPreselectedVec[0][c]->SetName( Form("BkgPresel_%idown", (Run==1) ? 2011+c : 2015+c) );
+ CanvasPreselectedVec[1][c]->SetName( Form("BkgPresel_%iup", (Run==1) ? 2011+c : 2015+c) );
+
+ legend[0][c] =new TPaveText ( 0.68 , ( RefChan ? 0.7 : 0.8), 0.93, 0.93, "NDC");
+ legend[0][c]->SetFillColor(kWhite);
+ legend[1][c] =new TPaveText ( 0.68 , ( RefChan ? 0.7 : 0.8), 0.93, 0.93, "NDC");
+ legend[1][c]->SetFillColor(kWhite);
+
+ }
+
+ //I'm pretty sure there is a nicer way to do that, but 9 mod year-2009 gets 1,0,3,2
+
+ oneChannelFactors facIter;
+ //for (auto i : ChannelFactors.factorsChannelVec){ //Loop over decay channels
+ for (int ch = 0; ch < ChannelFactors.NoChannels; ch++){ //Loop over decay channels: better to have a number for colors and saving the histograms
+ facIter = ChannelFactors.factorsChannelVec.at(ch);
+ decay = facIter.Channel;
+ cout << decay << endl;
+ //cout << ChannelFactors.NoChannels << endl;
+
+ for (int pos = 0; pos < facIter.VecSize; pos++ ){ //Loop over years and polarities in given decay channel
+ //get the mass histograms
+ fac = facIter.factorsVec.at(pos);
+ year_str = to_string(fac.year);
+ if (fac.nEvents == -1) continue;
+
+ if (TruthMatched){
+ tmpFile = new TFile(Form("%s/data/MC/%s/%s%s/%s%s_pi0Resolved%s.root",path_to_output_KplusPizero.c_str(),
+ fac.Channel.c_str(), year_str.c_str(), fac.MagUp ? "up" : "down", year_str.c_str(),fac.MagUp ? "up" : "down",(smallSample ? "_small":"")));
+ if (TruthMatched) treeMCold = (TTree *)tmpFile->Get("DecayTreeTruthMatched");
+ else treeMCold = (TTree *)tmpFile->Get("DecayTree");
+ treeMCold->SetBranchStatus("*",0);
+ treeMCold->SetBranchStatus("B_plus_DTF_M",1);
+ outputFile->cd();
+ treeMC = treeMCold->CloneTree();
+ treeMC->Draw(Form("B_plus_DTF_M>>tmp%i",pos), Form("B_plus_DTF_M>%f && B_plus_DTF_M<%f", cut_B_plus_M_low, cut_B_plus_M_high) );
+ tmp = (TH1F *)gDirectory->Get(Form("tmp%i",pos));
+
+ }
+ else{
+ tmpFile = new TFile(Form("%s/data/MC/%s/%s%s/%s%s_pi0Resolved_histos%s.root",path_to_output_KplusPizero.c_str(),
+ fac.Channel.c_str(), year_str.c_str(), fac.MagUp ? "up" : "down", year_str.c_str(),fac.MagUp ? "up" : "down",(smallSample ? "_small":"")),"READ");
+ if (Stripped) tmp = (TH1F *) tmpFile->Get("h_KGammaGammaMuMu_mass_before_preselection")->Clone();
+ else tmp = (TH1F *) tmpFile->Get("h_KGammaGammaMuMu_mass_after_preselection")->Clone();
+ }
+
+ //Calcualte the needed scale
+ if (RefChan) scaling_factor = double((SigRefFac.factorsVec.at(pos)).nEvents)/double(fac.nEvents);
+ else scaling_factor = double((SigFac.factorsVec.at(pos)).nEvents)/double(fac.nEvents);
+ scaling_factor = scaling_factor*fac.OtherScale;
+
+ cout << fac.year << (fac.MagUp ? "up " : "down") << "\t Scaling factor: " << scaling_factor << endl;
+ tmp->Scale(scaling_factor);
+
+ cout << "\t\tIntegral: " << tmp->Integral() << endl;
+ //Save the scaled histograms
+ outputFile->cd();
+ tmp ->SetName(HistName(fac.Channel,fac.year,fac.MagUp,0,TruthMatched).c_str());
+ tmp ->SetTitle(HistName(fac.Channel,fac.year,fac.MagUp,0,TruthMatched).c_str());
+ designPlots(tmp,ch+1);
+ tmp->Write(HistName(fac.Channel,fac.year,fac.MagUp,0,TruthMatched).c_str());
+ CanvasPreselectedVec[int(fac.MagUp)][fac.year-((Run==1) ? 2011 : 2015)]->cd(); //boolean is dangerous there but f* it
+ legend[int(fac.MagUp)][fac.year-((Run==1) ? 2011 : 2015)]->AddText(decay.c_str());
+ ((TText*)legend[int(fac.MagUp)][fac.year-((Run==1) ? 2011 : 2015)]->GetListOfLines()->Last())->SetTextColor(ch+1);
+ if ( fac.Channel == "KplusPi0" || fac.Channel == "RefKplusPi0" ){
+ tmp->DrawCopy();
+ }
+ else{
+ tmp->DrawCopy("same");
+ }
+ CanvasPreselectedVec[int(fac.MagUp)][fac.year-((Run==1) ? 2011 : 2015)]->Modified();
+ CanvasPreselectedVec[int(fac.MagUp)][fac.year-((Run==1) ? 2011 : 2015)]->Update();
+ //CanvasPreselectedVec[int(fac.MagUp)][fac.year-((Run==1) ? 2011 : 2015)]->Write();
+
+ tmpFile->Close();
+ }
+ }
+
+ cout << "Drawing legend " << endl;
+ //Draw legends
+
+ for (int c = 0; c < 2; c++){
+ CanvasPreselectedVec[0][c]->cd();
+ legend[0][c]->Draw();
+ CanvasPreselectedVec[1][c]->cd();
+ legend[1][c]->Draw();
+ }
+
+
+ cout << "Saving histos " << endl;
+ for (int c = 0; c < 2; c++){
+ CanvasPreselectedVec[0][c]->SaveAs( Form("%s/data/MC/BackgroundComparisons/BkgSamples_%s_%idown%s%s.pdf",path_to_output_KplusPizero.c_str(),
+ (Stripped ? "Stripped" : "Preselected"), (Run==1) ? 2011+c : 2015+c, RefChan ? "_Ref" : "", TruthMatched ? "_TM" : "") ,"jpg");
+ CanvasPreselectedVec[1][c]->SaveAs( Form("%s/data/MC/BackgroundComparisons/BkgSamples_%s_%iup%s%s.pdf", path_to_output_KplusPizero.c_str(),
+ (Stripped ? "Stripped" : "Preselected"), (Run==1) ? 2011+c : 2015+c, RefChan ? "_Ref" : "", TruthMatched ? "_TM" : "") ,"jpg");
+ }
+
+ CanvasPreselectedVec[int(fac.MagUp)][fac.year-((Run==1) ? 2011 : 2015)]->Write();
+
+ outputFile->Close();
+
+
+ return 1;
+
+}
+
+int PlotAllMasses(){
+ if (PlotMasses(1,0,0,0) == 0) return 0;
+ if (PlotMasses(1,0,0,1) == 0) return 0;
+ if (PlotMasses(1,1,0,0) == 0) return 0;
+ if (PlotMasses(1,1,0,1) == 0) return 0;
+ if (PlotMasses(2,0,0,0) == 0) return 0;
+ if (PlotMasses(2,0,0,1) == 0) return 0;
+ return 1;
+}
diff --git a/Code/Scripts/Backgrounds/DoubleMisIDtest.cc b/Code/Scripts/Backgrounds/DoubleMisIDtest.cc
new file mode 100755
index 0000000..5614a07
--- /dev/null
+++ b/Code/Scripts/Backgrounds/DoubleMisIDtest.cc
@@ -0,0 +1,281 @@
+//efficiency check of double misID filter in B+->Kst+mumu
+//david gerick
+
+
+#include "GlobalFunctions.hh"
+
+using namespace std;
+using namespace RooFit ;
+
+//////////////////////////////////////////////////////////////////////
+/// DoubleMisIDcheck()
+/// fake the double-misID of pi+ and mu+ and see how many would pass the double-misID filter from the preselection
+///
+///
+///
+
+int checkDoubleMisIDvetoEff(std::string year = "2011", std::string magnet = "down", bool PreSelAndTM = true) {
+
+ TChain* tree = 0;
+
+ //Kst2Kpluspi0 case
+ if(Kst2Kpluspi0Resolved || Kst2Kpluspi0Merged){
+ std::cout << "[ERROR]\t\tNo double misID possible in pi0 channel!" << std::endl;
+ return 0;
+ }
+
+ //Kst2Kspiplus case
+ if(Kst2Kspiplus){
+ if(PreSelAndTM){
+ tree=new TChain("DecayTreeTruthMatched");
+ tree->Add(GetInputFile(year,magnet,true,true,true,false,false).c_str());
+ }
+ else{
+ tree=new TChain("b2KstKs0pimumu_Tuple/DecayTree");
+ tree->Add(GetInputFile(year,magnet,false,true,true,false,false).c_str());
+ }
+ }
+
+ int N = tree->GetEntries();
+ cout << "Old files contain " << N << " events" << endl;
+
+ if(N == 0){
+ std::cout << "[ERROR]\t\tTree has no entries. Exit!" << std::endl;
+ return 0;
+ }
+
+ //Disable all branches
+ tree->SetBranchStatus("*",0);
+
+ tree->SetBranchStatus( "*PX", 1 );
+ tree->SetBranchStatus( "*PY", 1);
+ tree->SetBranchStatus( "*PZ", 1);
+ tree->SetBranchStatus( "*PE", 1);
+
+ //define variables
+ TLorentzVector LorVec_B_plus;
+ TLorentzVector LorVec_K_star_plus;
+ TLorentzVector LorVec_K_short;
+ TLorentzVector LorVec_pi_plus;
+ TLorentzVector LorVec_KS_pi_plus;
+ TLorentzVector LorVec_KS_pi_minus;
+ TLorentzVector LorVec_mu_minus;
+ TLorentzVector LorVec_mu_plus;
+
+ //potentially misIDed particles:
+ TLorentzVector LorVec_pi_plus_MisIDed;
+ TLorentzVector LorVec_mu_plus_MisIDed;
+ TLorentzVector LorVec_B_plus_From_DoubleMisIDed;
+ TLorentzVector LorVec_Jpsi_From_DoubleMisIDed;
+ TLorentzVector LorVec_K_star_plus_From_DoubleMisIDed;
+
+ //recombined particles:
+ TLorentzVector LorVec_DiMuon;
+ TLorentzVector LorVec_KaonPion;
+ TLorentzVector LorVec_ReconB;
+ TLorentzVector LorVec_KshortMuMu;
+
+ ///B+
+ Double_t B_plus_PX = 0.;
+ Double_t B_plus_PY = 0.;
+ Double_t B_plus_PZ = 0.;
+ Double_t B_plus_PE = 0.;
+
+ ///K*+
+ Double_t K_star_plus_PX = 0.;
+ Double_t K_star_plus_PY = 0.;
+ Double_t K_star_plus_PZ = 0.;
+ Double_t K_star_plus_PE = 0.;
+
+ ///Kshort
+ Double_t K_short_PX = 0.;
+ Double_t K_short_PY = 0.;
+ Double_t K_short_PZ = 0.;
+ Double_t K_short_PE = 0.;
+
+ ///pi+ (KS)
+ Double_t Ks_pi_plus_PX = 0.;
+ Double_t Ks_pi_plus_PY = 0.;
+ Double_t Ks_pi_plus_PZ = 0.;
+ Double_t Ks_pi_plus_PE = 0.;
+
+ Float_t f_Ks_pi_plus_PX_DTF[100];
+ Float_t f_Ks_pi_plus_PY_DTF[100];
+ Float_t f_Ks_pi_plus_PZ_DTF[100];
+ Float_t f_Ks_pi_plus_PE_DTF[100];
+
+ ///pi- (KS)
+ Double_t Ks_pi_minus_PX = 0.;
+ Double_t Ks_pi_minus_PY = 0.;
+ Double_t Ks_pi_minus_PZ = 0.;
+ Double_t Ks_pi_minus_PE = 0.;
+
+ Float_t f_Ks_pi_minus_PX_DTF[100];
+ Float_t f_Ks_pi_minus_PY_DTF[100];
+ Float_t f_Ks_pi_minus_PZ_DTF[100];
+ Float_t f_Ks_pi_minus_PE_DTF[100];
+
+ ///pi+
+ Double_t pi_plus_PX = 0.;
+ Double_t pi_plus_PY = 0.;
+ Double_t pi_plus_PZ = 0.;
+ Double_t pi_plus_PE = 0.;
+
+ Float_t f_pi_plus_PX_DTF[100];
+ Float_t f_pi_plus_PY_DTF[100];
+ Float_t f_pi_plus_PZ_DTF[100];
+ Float_t f_pi_plus_PE_DTF[100];
+
+ ///mu-
+ Double_t mu_minus_PX = 0.;
+ Double_t mu_minus_PY = 0.;
+ Double_t mu_minus_PZ = 0.;
+ Double_t mu_minus_PE = 0.;
+
+ Float_t f_mu_minus_PX_DTF[100];
+ Float_t f_mu_minus_PY_DTF[100];
+ Float_t f_mu_minus_PZ_DTF[100];
+ Float_t f_mu_minus_PE_DTF[100];
+
+ ///mu+
+ Double_t mu_plus_PX = 0.;
+ Double_t mu_plus_PY = 0.;
+ Double_t mu_plus_PZ = 0.;
+ Double_t mu_plus_PE = 0.;
+
+ Float_t f_mu_plus_PX_DTF[100];
+ Float_t f_mu_plus_PY_DTF[100];
+ Float_t f_mu_plus_PZ_DTF[100];
+ Float_t f_mu_plus_PE_DTF[100];
+
+ ///////////////////////////////////////
+ /// LINK VARIABLES TO BRANCHES
+ ///////////////////////////////////////
+
+
+ //particle masses and momenta
+ tree -> SetBranchAddress( "B_plus_PX" , &B_plus_PX );
+ tree -> SetBranchAddress( "B_plus_PY" , &B_plus_PY );
+ tree -> SetBranchAddress( "B_plus_PZ" , &B_plus_PZ );
+ tree -> SetBranchAddress( "B_plus_PE" , &B_plus_PE );
+
+ tree -> SetBranchAddress( "K_star_plus_PX" , &K_star_plus_PX );
+ tree -> SetBranchAddress( "K_star_plus_PY" , &K_star_plus_PY );
+ tree -> SetBranchAddress( "K_star_plus_PZ" , &K_star_plus_PZ );
+ tree -> SetBranchAddress( "K_star_plus_PE" , &K_star_plus_PE );
+
+ tree -> SetBranchAddress( "K_short_PX" , &K_short_PX );
+ tree -> SetBranchAddress( "K_short_PY" , &K_short_PY );
+ tree -> SetBranchAddress( "K_short_PZ" , &K_short_PZ );
+ tree -> SetBranchAddress( "K_short_PE" , &K_short_PE );
+
+ tree -> SetBranchAddress( "pi_plus_PX" , &pi_plus_PX );
+ tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_piplus_PX" , &f_pi_plus_PX_DTF );
+ tree -> SetBranchAddress( "pi_plus_PY" , &pi_plus_PY );
+ tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_piplus_PY" , &f_pi_plus_PY_DTF );
+ tree -> SetBranchAddress( "pi_plus_PZ" , &pi_plus_PZ );
+ tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_piplus_PZ" , &f_pi_plus_PZ_DTF );
+ tree -> SetBranchAddress( "pi_plus_PE" , &pi_plus_PE );
+ tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_piplus_PE" , &f_pi_plus_PE_DTF );
+
+ tree -> SetBranchAddress( "Ks_pi_minus_PX" , &Ks_pi_minus_PX );
+ tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_KS0_piplus_PX" , &f_Ks_pi_minus_PX_DTF );
+ tree -> SetBranchAddress( "Ks_pi_minus_PY" , &Ks_pi_minus_PY );
+ tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_KS0_piplus_PY" , &f_Ks_pi_minus_PY_DTF );
+ tree -> SetBranchAddress( "Ks_pi_minus_PZ" , &Ks_pi_minus_PZ );
+ tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_KS0_piplus_PZ" , &f_Ks_pi_minus_PZ_DTF );
+ tree -> SetBranchAddress( "Ks_pi_minus_PE" , &Ks_pi_minus_PE );
+ tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_KS0_piplus_PE" , &f_Ks_pi_minus_PE_DTF );
+
+ tree -> SetBranchAddress( "Ks_pi_plus_PX" , &Ks_pi_plus_PX );
+ tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_KS0_piplus_0_PX" , &f_Ks_pi_plus_PX_DTF );
+ tree -> SetBranchAddress( "Ks_pi_plus_PY" , &Ks_pi_plus_PY );
+ tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_KS0_piplus_0_PY" , &f_Ks_pi_plus_PY_DTF );
+ tree -> SetBranchAddress( "Ks_pi_plus_PZ" , &Ks_pi_plus_PZ );
+ tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_KS0_piplus_0_PZ" , &f_Ks_pi_plus_PZ_DTF );
+ tree -> SetBranchAddress( "Ks_pi_plus_PE" , &Ks_pi_plus_PE );
+ tree -> SetBranchAddress( "B_plus_DTF_Kst_892_plus_KS0_piplus_0_PE" , &f_Ks_pi_plus_PE_DTF );
+
+ tree -> SetBranchAddress( "mu_minus_PX" , &mu_minus_PX );
+ tree -> SetBranchAddress( "B_plus_DTF_J_psi_1S_muminus_0_PX" , &f_mu_minus_PX_DTF );
+ tree -> SetBranchAddress( "mu_minus_PY" , &mu_minus_PY );
+ tree -> SetBranchAddress( "B_plus_DTF_J_psi_1S_muminus_0_PY" , &f_mu_minus_PY_DTF );
+ tree -> SetBranchAddress( "mu_minus_PZ" , &mu_minus_PZ );
+ tree -> SetBranchAddress( "B_plus_DTF_J_psi_1S_muminus_0_PZ" , &f_mu_minus_PZ_DTF );
+ tree -> SetBranchAddress( "mu_minus_PE" , &mu_minus_PE );
+ tree -> SetBranchAddress( "B_plus_DTF_J_psi_1S_muminus_0_PE" , &f_mu_minus_PE_DTF );
+
+ tree -> SetBranchAddress( "mu_plus_PX" , &mu_plus_PX );
+ tree -> SetBranchAddress( "B_plus_DTF_J_psi_1S_muminus_PX" , &f_mu_plus_PX_DTF );
+ tree -> SetBranchAddress( "mu_plus_PY" , &mu_plus_PY );
+ tree -> SetBranchAddress( "B_plus_DTF_J_psi_1S_muminus_PY" , &f_mu_plus_PY_DTF );
+ tree -> SetBranchAddress( "mu_plus_PZ" , &mu_plus_PZ );
+ tree -> SetBranchAddress( "B_plus_DTF_J_psi_1S_muminus_PZ" , &f_mu_plus_PZ_DTF );
+ tree -> SetBranchAddress( "mu_plus_PE" , &mu_plus_PE );
+ tree -> SetBranchAddress( "B_plus_DTF_J_psi_1S_muminus_PE" , &f_mu_plus_PE_DTF );
+
+ int n_DoubleMisID = 0;
+
+ bool IsBplus = true;
+
+ ///////////////////////////////////////////////////////////////////////////
+ ///
+ /// loop over events
+ ///
+ ///////////////////////////////////////////////////////////////////////////
+
+ for(int i=0; i< N; i++){
+
+ //output the different counters!
+ if ((0ul == (i % 10000ul) || i + 1 == N) && i != 0)
+ cout << "Read event " << i << "/" << N << std::endl;
+ tree->GetEntry(i);
+
+ //define the Lorentz vectors
+ if(UseDTF){ //start useDTF for LorentzVectors
+ LorVec_mu_minus.SetPxPyPzE (f_mu_minus_PX_DTF[0], f_mu_minus_PY_DTF[0], f_mu_minus_PZ_DTF[0], f_mu_minus_PE_DTF[0]);
+ LorVec_mu_plus.SetPxPyPzE (f_mu_plus_PX_DTF[0], f_mu_plus_PY_DTF[0], f_mu_plus_PZ_DTF[0], f_mu_plus_PE_DTF[0]);
+ LorVec_pi_plus.SetPxPyPzE (f_pi_plus_PX_DTF[0], f_pi_plus_PY_DTF[0], f_pi_plus_PZ_DTF[0], f_pi_plus_PE_DTF[0]);
+ LorVec_KS_pi_plus.SetPxPyPzE (f_Ks_pi_plus_PX_DTF[0], f_Ks_pi_plus_PY_DTF[0], f_Ks_pi_plus_PZ_DTF[0], f_Ks_pi_plus_PE_DTF[0]);
+ LorVec_KS_pi_minus.SetPxPyPzE (f_Ks_pi_minus_PX_DTF[0], f_Ks_pi_minus_PY_DTF[0], f_Ks_pi_minus_PZ_DTF[0], f_Ks_pi_minus_PE_DTF[0]);
+ LorVec_pi_plus_MisIDed.SetXYZM (f_pi_plus_PX_DTF[0], f_pi_plus_PY_DTF[0], f_pi_plus_PZ_DTF[0], PDGMASS.MU);
+ LorVec_mu_plus_MisIDed.SetXYZM (f_mu_plus_PX_DTF[0], f_mu_plus_PY_DTF[0], f_mu_plus_PZ_DTF[0], PDGMASS.PI_PLUS);
+ LorVec_K_short = LorVec_KS_pi_plus + LorVec_KS_pi_minus;
+ }
+ else{
+ std::cout << "[ERROR]\tTest not implemented for non-DTF variables" << std::endl;
+ return 0;
+ }
+
+ LorVec_DiMuon = LorVec_mu_minus + LorVec_mu_plus;
+ LorVec_KaonPion = LorVec_K_short + LorVec_pi_plus;
+
+ LorVec_K_star_plus = LorVec_KaonPion;
+ LorVec_ReconB = LorVec_DiMuon + LorVec_K_star_plus;
+
+ //double misIDed
+ if(Kst2Kspiplus){
+ LorVec_K_star_plus_From_DoubleMisIDed = LorVec_K_short + LorVec_mu_plus_MisIDed;
+ LorVec_Jpsi_From_DoubleMisIDed = LorVec_pi_plus_MisIDed + LorVec_mu_minus;
+ LorVec_B_plus_From_DoubleMisIDed = LorVec_Jpsi_From_DoubleMisIDed + LorVec_K_star_plus_From_DoubleMisIDed;
+ }
+
+ //remove double mis-identified events:
+ if(Kst2Kspiplus){
+ if(TMath::Abs(LorVec_Jpsi_From_DoubleMisIDed.M() - PDGMASS.J_PSI) > 50 && TMath::Abs(LorVec_K_star_plus_From_DoubleMisIDed.M() - PDGMASS.K_STAR_PLUS) > 30)
+ if(TMath::Abs(LorVec_K_star_plus_From_DoubleMisIDed.M() - PDGMASS.K_STAR_PLUS) < 100)
+ if( LorVec_Jpsi_From_DoubleMisIDed.M2() > 0.1e6
+ && (LorVec_Jpsi_From_DoubleMisIDed.M2() < 0.98e6 || LorVec_Jpsi_From_DoubleMisIDed.M2() > 1.1e6)
+ && (LorVec_Jpsi_From_DoubleMisIDed.M2() < 8.68e6 || LorVec_Jpsi_From_DoubleMisIDed.M2() > 10.09e6)
+ && (LorVec_Jpsi_From_DoubleMisIDed.M2() < 12.9e6 || LorVec_Jpsi_From_DoubleMisIDed.M2() > 14.4e6)
+ && LorVec_Jpsi_From_DoubleMisIDed.M2() < 19.0e6)
+ n_DoubleMisID++;
+ continue;
+ }
+ }
+
+ std::cout << "[INFO]\t\tThe double-misID veto was passed by " << n_DoubleMisID << " events. Out of " << N << ". Making the vetoes efficiency = " << 1. * n_DoubleMisID / N << std::endl;
+
+ return 1;
+}
+
diff --git a/Code/Scripts/Backgrounds/IncSamplePlot.cpp b/Code/Scripts/Backgrounds/IncSamplePlot.cpp
new file mode 100644
index 0000000..01cdc98
--- /dev/null
+++ b/Code/Scripts/Backgrounds/IncSamplePlot.cpp
@@ -0,0 +1,836 @@
+
+#include "../GlobalFunctions.hh"
+
+//////////////////////////////////////////////////////////////////////
+/// OptimizePreSelection()
+/// loops over all .root-files created by Preselection() defined in BDTSelection.cc.
+/// More kinematic, PID and some more cuts are applied and saved in a new file.
+///
+
+
+THStack *stack(vector histos){
+ THStack *tmp = new THStack("IncMC","IncMC");
+ for(unsigned int h = 0; h < histos.size(); h++){
+ histos.at(h)->SetFillColor(2+h);
+ tmp->Add(histos.at(h));
+ }
+ return tmp;
+
+}
+
+int plotIncSample(std::string year = "2012", std::string magnet = "down") {
+
+ bool ReferenceChannel = true;
+
+ TFile* input = 0;
+ TFile* histos = 0;
+ TTree *tree;
+ // Kst2Kpluspi0Resolved case
+
+ if(Kst2Kpluspi0Resolved){
+ input = TFile::Open(Form("%s/data/MC/BtoXJpsi/%s%s/%s%s_pi0Resolved%s.root",path_to_output_KplusPizero.c_str(), year.c_str(),magnet.c_str(),year.c_str(),magnet.c_str(),(smallSample ? "_small":"") ));
+ histos = TFile::Open(Form("%s/data/MC/BtoXJpsi/%s%s/%s%s_pi0Resolved_histos%s.root",path_to_output_KplusPizero.c_str(), year.c_str(),magnet.c_str(),year.c_str(),magnet.c_str(),(smallSample ? "_small":"") ));
+ }
+ // Kst2Kpluspi0Merged case
+ if(Kst2Kpluspi0Merged){
+ //TODO
+ }
+ // Kst2Kspiplus case
+ if(Kst2Kspiplus){
+ //TODO
+ }
+
+
+ input->cd();
+ cout << "In input" << endl;
+ tree = (TTree*)input->Get("DecayTree");
+
+ cout << "Tree has " << tree->GetEntries() << " entries" << endl;
+ tree->SetBranchStatus("*",1);
+
+ Double_t B_plus_M_DTF;
+ //assign variables to TRUEID
+ Int_t B_plus_TRUEID;
+ Int_t K_star_plus_TRUEID;
+ Int_t K_plus_TRUEID;
+ Int_t K_short_TRUEID;
+ Int_t Ks_pi_plus_TRUEID;
+ Int_t Ks_pi_minus_TRUEID;
+ Int_t pi_plus_TRUEID;
+ Int_t pi_zero_TRUEID;
+ Int_t mu_plus_TRUEID;
+ Int_t mu_minus_TRUEID;
+ Int_t J_psi_TRUEID;
+ Int_t gamma1_TRUEID;
+ Int_t gamma2_TRUEID;
+
+ //assign variables to TRUE_MOTHER_ID
+ Int_t B_plus_MOTHER_ID;
+ Int_t K_star_plus_MOTHER_ID;
+ Int_t K_plus_MOTHER_ID;
+ Int_t K_short_MOTHER_ID;
+ Int_t Ks_pi_plus_MOTHER_ID;
+ Int_t Ks_pi_minus_MOTHER_ID;
+ Int_t pi_plus_MOTHER_ID;
+ Int_t pi_zero_MOTHER_ID;
+ Int_t mu_plus_MOTHER_ID;
+ Int_t mu_minus_MOTHER_ID;
+ Int_t J_psi_MOTHER_ID;
+ Int_t gamma1_MOTHER_ID;
+ Int_t gamma2_MOTHER_ID;
+
+ //assign variables to TRUE_GD_MOTHER_ID
+ Int_t K_plus_GD_MOTHER_ID;
+ Int_t K_plus_GD_GD_MOTHER_ID;
+ Int_t K_short_GD_MOTHER_ID;
+ Int_t Ks_pi_plus_GD_MOTHER_ID;
+ Int_t Ks_pi_minus_GD_MOTHER_ID;
+ Int_t pi_plus_GD_MOTHER_ID;
+ Int_t pi_zero_GD_MOTHER_ID;
+ Int_t mu_plus_GD_MOTHER_ID;
+ Int_t mu_minus_GD_MOTHER_ID;
+ Int_t gamma1_GD_MOTHER_ID;
+ Int_t gamma2_GD_MOTHER_ID;
+
+ //assign variables to TRUE_GD_MOTHER_ID
+ Int_t Ks_pi_plus_GD_GD_MOTHER_ID;
+ Int_t Ks_pi_minus_GD_GD_MOTHER_ID;
+ Int_t gamma1_GD_GD_MOTHER_ID;
+ Int_t gamma2_GD_GD_MOTHER_ID;
+ Int_t pi_zero_merged_MC_GD_GD_MOTHER_ID;
+
+
+ //link variables to branches
+ tree -> SetBranchAddress( "B_plus_M_DTF" , &B_plus_M_DTF );
+
+ tree -> SetBranchAddress( "B_plus_TRUEID" , &B_plus_TRUEID );
+ tree -> SetBranchAddress( "K_star_plus_TRUEID" , &K_star_plus_TRUEID );
+ tree -> SetBranchAddress( "mu_plus_TRUEID" , &mu_plus_TRUEID );
+ tree -> SetBranchAddress( "mu_minus_TRUEID" , &mu_minus_TRUEID );
+
+ tree -> SetBranchAddress( "B_plus_MC_MOTHER_ID" , &B_plus_MOTHER_ID );
+ tree -> SetBranchAddress( "K_star_plus_MC_MOTHER_ID" , &K_star_plus_MOTHER_ID );
+ tree -> SetBranchAddress( "mu_plus_MC_MOTHER_ID" , &mu_plus_MOTHER_ID );
+ tree -> SetBranchAddress( "mu_minus_MC_MOTHER_ID" , &mu_minus_MOTHER_ID );
+ tree -> SetBranchAddress( "mu_plus_MC_GD_MOTHER_ID" , &mu_plus_GD_MOTHER_ID );
+ tree -> SetBranchAddress( "mu_minus_MC_GD_MOTHER_ID" , &mu_minus_GD_MOTHER_ID );
+
+
+ if(Kst2Kpluspi0Resolved){
+ tree -> SetBranchAddress( "K_plus_TRUEID" , &K_plus_TRUEID );
+ tree -> SetBranchAddress( "pi_zero_resolved_TRUEID" , &pi_zero_TRUEID );
+ tree -> SetBranchAddress( "gamma1_TRUEID" , &gamma1_TRUEID );
+ tree -> SetBranchAddress( "gamma2_TRUEID" , &gamma2_TRUEID );
+
+ tree -> SetBranchAddress( "K_plus_MC_MOTHER_ID" , &K_plus_MOTHER_ID );
+ tree -> SetBranchAddress( "pi_zero_resolved_MC_MOTHER_ID" , &pi_zero_MOTHER_ID );
+ tree -> SetBranchAddress( "gamma1_MC_MOTHER_ID" , &gamma1_MOTHER_ID );
+ tree -> SetBranchAddress( "gamma2_MC_MOTHER_ID" , &gamma2_MOTHER_ID );
+
+ tree -> SetBranchAddress( "K_plus_MC_GD_MOTHER_ID" , &K_plus_GD_MOTHER_ID );
+ tree -> SetBranchAddress( "K_plus_MC_GD_GD_MOTHER_ID" , &K_plus_GD_GD_MOTHER_ID );
+ tree -> SetBranchAddress( "pi_zero_resolved_MC_GD_MOTHER_ID" , &pi_zero_GD_MOTHER_ID );
+ tree -> SetBranchAddress( "gamma1_MC_GD_MOTHER_ID" , &gamma1_GD_MOTHER_ID );
+ tree -> SetBranchAddress( "gamma2_MC_GD_MOTHER_ID" , &gamma2_GD_MOTHER_ID );
+
+ tree -> SetBranchAddress( "gamma1_MC_GD_GD_MOTHER_ID" , &gamma1_GD_GD_MOTHER_ID );
+ tree -> SetBranchAddress( "gamma2_MC_GD_GD_MOTHER_ID" , &gamma2_GD_GD_MOTHER_ID );
+ }
+
+ if(Kst2Kpluspi0Merged){
+ tree -> SetBranchAddress( "K_plus_TRUEID" , &K_plus_TRUEID );
+ tree -> SetBranchAddress( "pi_zero_merged_TRUEID" , &pi_zero_TRUEID );
+
+ tree -> SetBranchAddress( "K_plus_MC_MOTHER_ID" , &K_plus_MOTHER_ID );
+ tree -> SetBranchAddress( "pi_zero_merged_MC_MOTHER_ID" , &pi_zero_MOTHER_ID );
+
+ tree -> SetBranchAddress( "K_plus_MC_GD_MOTHER_ID" , &K_plus_GD_MOTHER_ID );
+ tree -> SetBranchAddress( "pi_zero_merged_MC_GD_MOTHER_ID" , &pi_zero_GD_MOTHER_ID );
+
+ tree -> SetBranchAddress( "pi_zero_merged_MC_GD_GD_MOTHER_ID" , &pi_zero_merged_MC_GD_GD_MOTHER_ID );
+ }
+
+ if(Kst2Kspiplus){
+ tree -> SetBranchAddress( "K_short_TRUEID" , &K_short_TRUEID );
+ tree -> SetBranchAddress( "pi_plus_TRUEID" , &pi_plus_TRUEID );
+ tree -> SetBranchAddress( "Ks_pi_plus_TRUEID" , &Ks_pi_plus_TRUEID );
+ tree -> SetBranchAddress( "Ks_pi_minus_TRUEID" , &Ks_pi_minus_TRUEID );
+ tree -> SetBranchAddress( "K_short_MC_MOTHER_ID" , &K_short_MOTHER_ID );
+ tree -> SetBranchAddress( "pi_plus_MC_MOTHER_ID" , &pi_plus_MOTHER_ID );
+ tree -> SetBranchAddress( "Ks_pi_plus_MC_MOTHER_ID" , &Ks_pi_plus_MOTHER_ID );
+ tree -> SetBranchAddress( "Ks_pi_minus_MC_MOTHER_ID" , &Ks_pi_minus_MOTHER_ID );
+
+ tree -> SetBranchAddress( "K_short_MC_GD_MOTHER_ID" , &K_short_GD_MOTHER_ID );
+ tree -> SetBranchAddress( "pi_plus_MC_GD_MOTHER_ID" , &pi_plus_GD_MOTHER_ID );
+ tree -> SetBranchAddress( "Ks_pi_plus_MC_GD_MOTHER_ID" , &Ks_pi_plus_GD_MOTHER_ID );
+ tree -> SetBranchAddress( "Ks_pi_minus_MC_GD_MOTHER_ID" , &Ks_pi_minus_GD_MOTHER_ID );
+
+ tree -> SetBranchAddress( "Ks_pi_plus_MC_GD_GD_MOTHER_ID" , &Ks_pi_plus_GD_GD_MOTHER_ID );
+ tree -> SetBranchAddress( "Ks_pi_minus_MC_GD_GD_MOTHER_ID" , &Ks_pi_minus_GD_GD_MOTHER_ID );
+ }
+
+ tree -> SetBranchAddress( "J_psi_TRUEID" , &J_psi_TRUEID );
+ tree -> SetBranchAddress( "J_psi_MC_MOTHER_ID" , &J_psi_MOTHER_ID );
+
+ //counter
+ Int_t B_plus_VETO = 0;
+ Int_t K_star_plus_VETO = 0;
+ Int_t K_plus_VETO = 0;
+ Int_t K_short_VETO = 0;
+ Int_t Ks_pi_plus_VETO = 0;
+ Int_t Ks_pi_minus_VETO = 0;
+ Int_t pi_plus_VETO = 0;
+ Int_t pi_zero_VETO = 0;
+ Int_t mu_plus_VETO = 0;
+ Int_t mu_minus_VETO = 0;
+ Int_t J_psi_VETO = 0;
+ Int_t gamma1_VETO = 0;
+ Int_t gamma2_VETO = 0;
+
+ Int_t MOTHER_ID_VETO = 0;
+ Int_t GD_MOTHER_ID_VETO = 0;
+ Int_t GD_GD_MOTHER_ID_VETO = 0;
+
+ Int_t TRUE_events = 0;
+
+ //count the numbers of Kshort daughters, which are pi_zeros
+ Int_t Kshort_pi_zero_daughters = 0;
+
+ //count muons, mis-IDed as pions
+ Int_t ReconstructedPionsWhichAreMuons = 0;
+
+
+ //======================================
+ //Get histos of all possible backgrounds
+ //======================================
+
+
+ //control plots for pi0
+ Double_t pi_zero_resolved_M = 0.0;
+ if (Kst2Kpluspi0Resolved)
+ tree -> SetBranchAddress( "pi_zero_resolved_M" , &pi_zero_resolved_M );
+
+ TH1 * h_pi0_resolved_mass= new TH1D("h_pi0_resolved_mass" , "m_{#pi_{0}} resolved", 100, 75, 175);
+ h_pi0_resolved_mass->GetXaxis()->SetTitle("m_{pi_{0}} resolved [MeV]");
+ h_pi0_resolved_mass->GetYaxis()->SetTitle("Counts / 1MeV");
+
+ TH1 * h_pi0_mismatched_mass= new TH1D("h_pi0_mismatched_mass" , "m_{#pi_{0}} IDed as gamma", 100, 75, 175);
+ h_pi0_mismatched_mass->GetXaxis()->SetTitle("m_{pi_{0}}[MeV] MisIDed");
+ h_pi0_mismatched_mass->GetYaxis()->SetTitle("Counts / 1MeV");
+
+
+ TH1 * h_B_plus_TRUEID = new TH1D("h_B_plus_TRUEID", "B^{+} TRUEID", 100000, -1, 99999);
+ TH1 * h_K_star_plus_TRUEID = new TH1D("h_K_star_plus_TRUEID", "K^{*+} TRUEID", 100000, -1, 99999);
+ TH1 * h_K_plus_TRUEID = new TH1D("h_K_plus_TRUEID", "K^{+} TRUEID", 100000, -1, 99999);
+ TH1 * h_pi_zero_TRUEID = new TH1D("h_pi_zero_TRUEID", "#pi^{0} TRUEID", 100000, -1, 99999);
+
+ TH1 * h_B_plus_TRUEID_rm = new TH1D("h_B_plus_TRUEID_rm", "B^{+} TRUEID", 100000, -1, 99999);
+ TH1 * h_K_star_plus_TRUEID_rm= new TH1D("h_K_star_plus_TRUEID_rm", "K^{*+} TRUEID", 100000, -1, 99999);
+ TH1 * h_K_plus_TRUEID_rm = new TH1D("h_K_plus_TRUEID_rm", "K^{+} TRUEID", 100000, -1, 99999);
+ TH1 * h_pi_zero_TRUEID_rm = new TH1D("h_pi_zero_TRUEID_rm", "#pi^{0} TRUEID", 100000, -1, 99999);
+
+
+ TH1 * h_B_plus_K1 = new TH1D("h_B_plus_K1", "h_B_plus_K1", 100, cut_B_plus_M_low, cut_B_plus_M_high);
+ TH1 * h_B_plus_Kst = new TH1D("h_B_plus_Kst", "h_B_plus_Kst", 100, cut_B_plus_M_low, cut_B_plus_M_high);
+ TH1 * h_B_plus_Kpl = new TH1D("h_B_plus_Kpl", "h_B_plus_Kpl", 100, cut_B_plus_M_low, cut_B_plus_M_high);
+
+
+ vector Cuts;
+ string tmp_string = "";
+ int nBins = 75;
+ TH1 * h_BplusMass_tot= new TH1D("h_BplusMass_tot" , "h_BplusMass_tot", nBins ,cut_B_plus_M_low, cut_B_plus_M_high);
+ h_BplusMass_tot->GetXaxis()->SetTitle("B^{+} mass [MeV]");
+
+ //======================================
+ // Define trees for all channels
+ //======================================
+ TTree *tree_correct = tree->CloneTree(0);
+ tree_correct->SetName("tree_correct");
+ TH1 * h_BplusMass_correct = new TH1D("h_BplusMass_correct" , "h_BplusMass_correct", nBins ,cut_B_plus_M_low, cut_B_plus_M_high);
+ h_BplusMass_correct->GetXaxis()->SetTitle("B^{+} mass [MeV]");
+
+ TTree *tree_K1_1270 = tree->CloneTree(0);
+ tree_K1_1270->SetName("tree_K1_1270");
+ TH1 * h_BplusMass_K1_1270 = new TH1D("h_BplusMass_K1_1270" , "h_BplusMass_K1_1270", nBins ,cut_B_plus_M_low, cut_B_plus_M_high);
+ h_BplusMass_K1_1270->GetXaxis()->SetTitle("B^{+} mass [MeV]");
+
+ TTree *tree_K1_1410 = tree->CloneTree(0);
+ tree_K1_1410->SetName("tree_K1_1410");
+ TH1 * h_BplusMass_K1_1410 = new TH1D("h_BplusMass_K1_1410" , "h_BplusMass_K1_1410", nBins ,cut_B_plus_M_low, cut_B_plus_M_high);
+ h_BplusMass_K1_1410->GetXaxis()->SetTitle("B^{+} mass [MeV]");
+
+ TTree *tree_K1_1400 = tree->CloneTree(0);
+ tree_K1_1400->SetName("tree_K1_1400");
+ TH1 * h_BplusMass_K1_1400 = new TH1D("h_BplusMass_K1_1400" , "h_BplusMass_K1_1400", nBins ,cut_B_plus_M_low, cut_B_plus_M_high);
+ h_BplusMass_K1_1400->GetXaxis()->SetTitle("B^{+} mass [MeV]");
+
+ TTree *tree_K_plus= tree->CloneTree(0);
+ tree_K_plus->SetName("tree_K_plus");
+ TH1 * h_BplusMass_K_plus = new TH1D("h_BplusMass_K_plus" , "h_BplusMass_K_plus", nBins ,cut_B_plus_M_low, cut_B_plus_M_high);
+ h_BplusMass_K_plus->GetXaxis()->SetTitle("B^{+} mass [MeV]");
+
+ TTree *tree_K_plus_misID= tree->CloneTree(0);
+ tree_K_plus_misID->SetName("tree_K_plus_misID");
+ TH1 * h_BplusMass_K_plus_misID = new TH1D("h_BplusMass_K_plus_misID" , "h_BplusMass_K_plus_misID", nBins ,cut_B_plus_M_low, cut_B_plus_M_high);
+ h_BplusMass_K_plus_misID->GetXaxis()->SetTitle("B^{+} mass [MeV]");
+
+ TTree *tree_B_star= tree->CloneTree(0);
+ tree_B_star->SetName("tree_B_star");
+ TH1 * h_BplusMass_B_star = new TH1D("h_BplusMass_B_star" , "h_BplusMass_B_star", nBins ,cut_B_plus_M_low, cut_B_plus_M_high);
+ h_BplusMass_B_star->GetXaxis()->SetTitle("B^{+} mass [MeV]");
+
+ TTree *tree_Kstar_misID= tree->CloneTree(0);
+ tree_Kstar_misID->SetName("tree_Kstar_misID");
+ TH1 * h_BplusMass_Kstar_misID = new TH1D("h_BplusMass_Kstar_misID" , "h_BplusMass_Kstar_misID", nBins ,cut_B_plus_M_low, cut_B_plus_M_high);
+ h_BplusMass_Kstar_misID->GetXaxis()->SetTitle("B^{+} mass [MeV]");
+
+ TTree *tree_bquark= tree->CloneTree(0);
+ tree_bquark->SetName("tree_bquark");
+ TH1 * h_BplusMass_bquark = new TH1D("h_BplusMass_bquark" , "h_BplusMass_bquark", nBins ,cut_B_plus_M_low, cut_B_plus_M_high);
+ h_BplusMass_bquark->GetXaxis()->SetTitle("B^{+} mass [MeV]");
+
+ TTree *tree_combinatorics= tree->CloneTree(0);
+ tree_combinatorics->SetName("tree_combinatorics");
+ TH1 * h_BplusMass_combinatorics = new TH1D("h_BplusMass_combinatorics" , "h_BplusMass_combinatorics", nBins ,cut_B_plus_M_low, cut_B_plus_M_high);
+ h_BplusMass_combinatorics->GetXaxis()->SetTitle("B^{+} mass [MeV]");
+
+
+ TTree *tree_others = tree->CloneTree(0);
+ tree_others->SetName("tree_others");
+ TH1 * h_BplusMass_others = new TH1D("h_BplusMass_others" , "h_BplusMass_others", nBins ,cut_B_plus_M_low, cut_B_plus_M_high);
+ h_BplusMass_others->GetXaxis()->SetTitle("B^{+} mass [MeV]");
+
+
+ TH1 * h_BplusMass_JpsiVETO = new TH1D("h_BplusMass_JpsiVETO" , "h_BplusMass_JpsiVETO", nBins ,cut_B_plus_M_low, cut_B_plus_M_high);
+ h_BplusMass_JpsiVETO->GetXaxis()->SetTitle("B^{+} mass [MeV]");
+
+ TH1 * h_BplusMass_GDVETO = new TH1D("h_BplusMass_GDVETO" , "h_BplusMass_GDVETO", nBins ,cut_B_plus_M_low, cut_B_plus_M_high);
+ h_BplusMass_GDVETO->GetXaxis()->SetTitle("B^{+} mass [MeV]");
+
+ //======================================
+ //check all particles for correct TRUEID
+ //======================================
+
+ //MC loop
+ cout << "Tree has " << tree->GetEntries() << " entries" << endl;
+ int nEvents = tree->GetEntries();
+ std::cout << "Truth matching of " << nEvents << " INC MC events for " << year << magnet << "!" << std::endl;
+ for(int i = 0; i < nEvents; i++){
+ if(i%2000==0 && i != 0)std::cout << "Loading MC event " << i << " / " << nEvents << std::endl;
+ bool flag_other = true;
+
+ //others
+ tree->GetEntry(i);
+ h_BplusMass_tot->Fill(B_plus_M_DTF);
+ //remove nonsense from B and Jpsi
+ if(TMath::Abs(B_plus_TRUEID) != TRUEID.B_PLUS && TMath::Abs(B_plus_TRUEID) != 0 && TMath::Abs(B_plus_TRUEID) != 5){
+ B_plus_VETO++;
+ h_B_plus_TRUEID_rm->Fill(B_plus_TRUEID);
+ continue;
+ }
+ if(ReferenceChannel){
+ if(TMath::Abs(J_psi_TRUEID) != TRUEID.J_PSI){
+ J_psi_VETO++;
+ h_BplusMass_JpsiVETO->Fill(B_plus_M_DTF);
+ continue;
+ }
+ if(TMath::Abs(mu_plus_MOTHER_ID) != TRUEID.J_PSI){
+ MOTHER_ID_VETO++;
+ h_BplusMass_others->Fill(B_plus_M_DTF);
+ continue;
+ }
+ if(TMath::Abs(mu_minus_MOTHER_ID) != TRUEID.J_PSI){
+ MOTHER_ID_VETO++;
+ h_BplusMass_others->Fill(B_plus_M_DTF);
+ continue;
+ }
+ if(TMath::Abs(mu_plus_GD_MOTHER_ID) != TRUEID.B_PLUS){
+ GD_MOTHER_ID_VETO++;
+ h_BplusMass_GDVETO->Fill(B_plus_M_DTF);
+ continue;
+ }
+ if(TMath::Abs(mu_minus_GD_MOTHER_ID) != TRUEID.B_PLUS){
+ GD_MOTHER_ID_VETO++;
+ h_BplusMass_GDVETO->Fill(B_plus_M_DTF);
+ continue;
+ }
+ }
+ else{
+ if(TMath::Abs(J_psi_TRUEID) == TRUEID.J_PSI){
+ J_psi_VETO++;
+ h_BplusMass_JpsiVETO->Fill(B_plus_M_DTF);
+ continue;
+ }
+ if(TMath::Abs(mu_plus_MOTHER_ID) != TRUEID.B_PLUS){
+ MOTHER_ID_VETO++;
+ h_BplusMass_others->Fill(B_plus_M_DTF);
+ continue;
+ }
+ if(TMath::Abs(mu_minus_MOTHER_ID) != TRUEID.B_PLUS){
+ MOTHER_ID_VETO++;
+ h_BplusMass_others->Fill(B_plus_M_DTF);
+ continue;
+ }
+ }
+
+
+
+ //correct tree
+ if (TMath::Abs(K_star_plus_TRUEID) == TRUEID.K_STAR_PLUS)
+ if(TMath::Abs(K_plus_TRUEID) == TRUEID.K_PLUS){ //Paticle IDs
+ if(TMath::Abs(K_star_plus_MOTHER_ID) == TRUEID.B_PLUS)
+ if(TMath::Abs(K_plus_MOTHER_ID) == TRUEID.K_STAR_PLUS){ //Mother IDs
+ if(TMath::Abs(K_plus_GD_MOTHER_ID) == TRUEID.B_PLUS){//Grandmother IDs
+ tree_correct->Fill();
+ h_BplusMass_correct->Fill(B_plus_M_DTF);
+ continue;
+ }
+ }
+ }
+
+
+
+
+ //K1 tree
+ if (TMath::Abs(K_star_plus_TRUEID) == TRUEID.K_ONE_PLUS || TMath::Abs(K_star_plus_TRUEID) == 0 || TMath::Abs(K_star_plus_TRUEID) == TRUEID.B_PLUS )
+ if(TMath::Abs(K_plus_TRUEID) == TRUEID.K_STAR_PLUS || TMath::Abs(K_plus_TRUEID) == TRUEID.K_PLUS){ //Paticle IDs
+ if(TMath::Abs(K_star_plus_MOTHER_ID) == TRUEID.B_PLUS || TMath::Abs(K_star_plus_MOTHER_ID) == TRUEID.K_ONE_PLUS || TMath::Abs(K_star_plus_MOTHER_ID) == 0)
+ if(TMath::Abs(K_plus_MOTHER_ID) == TRUEID.K_STAR_PLUS || TMath::Abs(K_plus_MOTHER_ID) == TRUEID.K_ONE_PLUS){ //Mother IDs
+ if(TMath::Abs(K_plus_GD_MOTHER_ID) == TRUEID.B_PLUS || TMath::Abs(K_plus_GD_MOTHER_ID) == TRUEID.K_ONE_PLUS){//Grandmother IDs
+ tree_K1_1270->Fill();
+ h_BplusMass_K1_1270->Fill(B_plus_M_DTF);
+ continue;
+ }
+ }
+ }
+
+ //K1 1400 tree
+ if (TMath::Abs(K_star_plus_TRUEID) == TRUEID.K_ONE_PLUS_1400 || TMath::Abs(K_star_plus_TRUEID) == 0|| TMath::Abs(K_star_plus_TRUEID) == TRUEID.B_PLUS )
+ if(TMath::Abs(K_plus_TRUEID) == TRUEID.K_STAR_PLUS || TMath::Abs(K_plus_TRUEID) == TRUEID.K_PLUS){ //Paticle ID
+ if(TMath::Abs(K_star_plus_MOTHER_ID) == TRUEID.B_PLUS || TMath::Abs(K_star_plus_MOTHER_ID) == TRUEID.K_ONE_PLUS_1400)
+ if(TMath::Abs(K_plus_MOTHER_ID) == TRUEID.K_STAR_PLUS || TMath::Abs(K_plus_MOTHER_ID) == TRUEID.K_ONE_PLUS_1400){ //Mother IDs
+ if(TMath::Abs(K_plus_GD_MOTHER_ID) == TRUEID.B_PLUS || TMath::Abs(K_plus_GD_MOTHER_ID) == TRUEID.K_ONE_PLUS_1400){//Grandmother IDs
+ tree_K1_1400->Fill();
+ h_BplusMass_K1_1410->Fill(B_plus_M_DTF);
+ tree_others->Fill();
+ h_BplusMass_others->Fill(B_plus_M_DTF);
+ continue;
+ }
+ }
+ }
+ //K1 1410 tree
+ if (TMath::Abs(K_star_plus_TRUEID) == TRUEID.K_ONE_PLUS_1410 || TMath::Abs(K_star_plus_TRUEID) == 0 )
+ if(TMath::Abs(K_plus_TRUEID) == TRUEID.K_PLUS){ //Paticle IDs
+ if(TMath::Abs(K_star_plus_MOTHER_ID) == TRUEID.B_PLUS || TMath::Abs(K_star_plus_MOTHER_ID) == 0 || TMath::Abs(K_star_plus_MOTHER_ID) == TRUEID.K_ONE_PLUS_1410)
+ if(TMath::Abs(K_plus_MOTHER_ID) == TRUEID.K_STAR_PLUS || TMath::Abs(K_plus_MOTHER_ID) == TRUEID.K_ONE_PLUS_1410){ //Mother IDs
+ if(TMath::Abs(K_plus_GD_MOTHER_ID) == 0 || TMath::Abs(K_plus_GD_MOTHER_ID) == TRUEID.K_ONE_PLUS_1410){//Grandmother IDs
+ tree_K1_1410->Fill();
+ h_BplusMass_K1_1410->Fill(B_plus_M_DTF);
+ tree_others->Fill();
+ h_BplusMass_others->Fill(B_plus_M_DTF);
+ continue;
+ }
+ }
+
+ }
+ //K1 1270 tree 2.0
+ if (TMath::Abs(K_star_plus_TRUEID) == TRUEID.K_STAR_PLUS)
+ if(TMath::Abs(K_plus_TRUEID) == TRUEID.K_PLUS){ //Paticle IDs
+ if(TMath::Abs(K_star_plus_MOTHER_ID) == TRUEID.K_ONE_PLUS)
+ if(TMath::Abs(K_plus_MOTHER_ID) == TRUEID.K_STAR_PLUS){ //Mother IDs
+ if(TMath::Abs(K_plus_GD_MOTHER_ID) == TRUEID.K_ONE_PLUS){//Grandmother IDs
+ tree_K1_1270->Fill();
+ h_BplusMass_K1_1270->Fill(B_plus_M_DTF);
+ continue;
+ }
+ }
+ }
+
+
+ //tree_K_plus_misID tree
+ if (TMath::Abs(K_star_plus_TRUEID) == TRUEID.K_ONE_PLUS || TMath::Abs(K_star_plus_TRUEID) == TRUEID.K_STAR_PLUS|| TMath::Abs(K_star_plus_TRUEID) == 0 )
+ if(TMath::Abs(K_plus_TRUEID) == TRUEID.PI_PLUS){ //Paticle IDs
+ if(TMath::Abs(K_star_plus_MOTHER_ID) == TRUEID.B_PLUS || TMath::Abs(K_star_plus_MOTHER_ID) == TRUEID.K_ONE_PLUS)
+ if(TMath::Abs(K_plus_MOTHER_ID) == TRUEID.K_STAR_PLUS || TMath::Abs(K_plus_MOTHER_ID) == TRUEID.K_ONE_PLUS){ //Mother IDs
+ if(TMath::Abs(K_plus_GD_MOTHER_ID) == TRUEID.B_PLUS || TMath::Abs(K_plus_GD_MOTHER_ID) == TRUEID.K_ONE_PLUS){//Grandmother IDs
+ tree_K_plus_misID->Fill();
+ h_BplusMass_K_plus_misID->Fill(B_plus_M_DTF);
+ tree_others->Fill();
+ h_BplusMass_others->Fill(B_plus_M_DTF);
+ continue;
+ }
+ }
+ }
+ //tree_K_plus_misID tree 2.0 (K+->pi+)
+ if (TMath::Abs(K_star_plus_TRUEID) == TRUEID.K_STAR_PLUS)
+ if(TMath::Abs(K_plus_TRUEID) == TRUEID.PI_PLUS){ //Paticle IDs
+ if(TMath::Abs(K_star_plus_MOTHER_ID) == TRUEID.B_PLUS)
+ if(TMath::Abs(K_plus_MOTHER_ID) == TRUEID.K_PLUS){ //Mother IDs
+ if(TMath::Abs(K_plus_GD_MOTHER_ID) == TRUEID.K_STAR_PLUS)
+ if (TMath::Abs(K_plus_GD_GD_MOTHER_ID) == TRUEID.B_PLUS){//Grandmother IDs
+ tree_K_plus_misID->Fill();
+ h_BplusMass_K_plus_misID->Fill(B_plus_M_DTF);
+ tree_others->Fill();
+ h_BplusMass_others->Fill(B_plus_M_DTF);
+ continue;
+ }
+ }
+ }
+
+ //Kplus tree
+ if (TMath::Abs(K_star_plus_TRUEID) == TRUEID.K_PLUS || TMath::Abs(K_star_plus_TRUEID) == 0)
+ if(TMath::Abs(K_plus_TRUEID) == TRUEID.K_PLUS){ //Paticle IDs
+ if(TMath::Abs(K_plus_MOTHER_ID) == TRUEID.B_PLUS){ //Mother IDs
+ if(TMath::Abs(K_plus_GD_MOTHER_ID) == 0){//Grandmother IDs
+ tree_K_plus->Fill();
+ h_BplusMass_K_plus->Fill(B_plus_M_DTF);
+ tree_others->Fill();
+ h_BplusMass_others->Fill(B_plus_M_DTF);
+ continue;
+ }
+ }
+ }
+
+
+ //K star misID tree
+ if (TMath::Abs(K_star_plus_TRUEID) == TRUEID.K_PLUS)
+ if(TMath::Abs(K_plus_TRUEID) == TRUEID.K_PLUS){ //Paticle IDs
+ if(TMath::Abs(K_star_plus_MOTHER_ID) == TRUEID.K_STAR_PLUS)
+ if(TMath::Abs(K_plus_MOTHER_ID) == TRUEID.K_STAR_PLUS){ //Mother IDs
+ if(TMath::Abs(K_plus_GD_MOTHER_ID) == TRUEID.B_PLUS){//Grandmother IDs
+ tree_Kstar_misID->Fill();
+ h_BplusMass_Kstar_misID->Fill(B_plus_M_DTF);
+ tree_others->Fill();
+ h_BplusMass_others->Fill(B_plus_M_DTF);
+ continue;
+ }
+ }
+ }
+
+
+ //B+ <-> b quark
+ if (TMath::Abs(K_star_plus_TRUEID) == TRUEID.B_PLUS)
+ if(TMath::Abs(K_plus_TRUEID) == TRUEID.K_PLUS){ //Paticle IDs
+ if(TMath::Abs(K_star_plus_MOTHER_ID) == 5)
+ if(TMath::Abs(K_plus_MOTHER_ID) == TRUEID.B_PLUS){ //Mother IDs
+ tree_bquark->Fill();
+ h_BplusMass_bquark->Fill(B_plus_M_DTF);
+ continue;
+ }
+ }
+
+
+
+ //B+ <-> b quark 2.0
+ if (TMath::Abs(K_star_plus_TRUEID) ==5)
+ if(TMath::Abs(K_plus_TRUEID) == TRUEID.K_PLUS){ //Paticle IDs
+ if(TMath::Abs(K_star_plus_MOTHER_ID) == 0)
+ if(TMath::Abs(K_plus_MOTHER_ID) == TRUEID.B_PLUS || TMath::Abs(K_plus_MOTHER_ID) == TRUEID.K_STAR_PLUS ){ //Mother IDs
+ tree_bquark->Fill();
+ h_BplusMass_bquark->Fill(B_plus_M_DTF);
+ continue;
+ }
+ }
+
+
+ //Bstar tree
+ if (TMath::Abs(K_star_plus_TRUEID) == TRUEID.B_PLUS)
+ if(TMath::Abs(K_plus_TRUEID) == TRUEID.K_PLUS){ //Paticle IDs
+ if(TMath::Abs(K_star_plus_MOTHER_ID) == 523)
+ if(TMath::Abs(K_plus_MOTHER_ID) == TRUEID.B_PLUS){ //Mother IDs
+ if(TMath::Abs(K_plus_GD_MOTHER_ID) == 523){//Grandmother IDs
+ tree_B_star->Fill();
+ h_BplusMass_B_star->Fill(B_plus_M_DTF);
+ continue;
+ }
+ }
+ }
+
+ //Bstar tree 2.0
+ if (TMath::Abs(K_star_plus_TRUEID) == TRUEID.K_PLUS)
+ if(TMath::Abs(K_plus_TRUEID) == TRUEID.K_PLUS){ //Paticle IDs
+ if(TMath::Abs(K_star_plus_MOTHER_ID) == 523)
+ if(TMath::Abs(K_plus_MOTHER_ID) == TRUEID.B_PLUS){ //Mother IDs
+ if(TMath::Abs(K_plus_GD_MOTHER_ID) == 523){//Grandmother IDs
+ tree_B_star->Fill();
+ h_BplusMass_B_star->Fill(B_plus_M_DTF);
+ continue;
+ }
+ }
+ }
+
+ //Bstar tree 3.0 (K* misID B+)
+ if (TMath::Abs(K_star_plus_TRUEID) == TRUEID.K_PLUS)
+ if(TMath::Abs(K_plus_TRUEID) == TRUEID.K_PLUS){ //Paticle IDs
+ if(TMath::Abs(K_star_plus_MOTHER_ID) == TRUEID.B_PLUS)
+ if(TMath::Abs(K_plus_MOTHER_ID) == TRUEID.B_PLUS){ //Mother IDs
+ if(TMath::Abs(K_plus_GD_MOTHER_ID) == 523){//Grandmother IDs
+ tree_B_star->Fill();
+ h_BplusMass_B_star->Fill(B_plus_M_DTF);
+ continue;
+ }
+ }
+ }
+ //Bstar tree 4.0 (K* misID B+)
+ if (TMath::Abs(K_star_plus_TRUEID) == 0)
+ if(TMath::Abs(K_plus_TRUEID) == TRUEID.K_PLUS){ //Paticle IDs
+ if(TMath::Abs(K_star_plus_MOTHER_ID) == 0)
+ if(TMath::Abs(K_plus_MOTHER_ID) == TRUEID.B_PLUS){ //Mother IDs
+ if(TMath::Abs(K_plus_GD_MOTHER_ID) == 523 ||TMath::Abs(K_plus_GD_MOTHER_ID) == 10521){//Grandmother IDs
+ tree_B_star->Fill();
+ h_BplusMass_B_star->Fill(B_plus_M_DTF);
+ continue;
+ }
+ }
+ }
+ //combinatorics tree
+ if (TMath::Abs(K_star_plus_TRUEID) == 0)
+ if(TMath::Abs(K_plus_TRUEID) == TRUEID.K_PLUS ||TMath::Abs(K_plus_TRUEID) == 0 ){ //Paticle IDs
+ if(TMath::Abs(K_star_plus_MOTHER_ID) == 0)
+ if(TMath::Abs(K_plus_MOTHER_ID) == TRUEID.K_STAR_PLUS ||TMath::Abs(K_plus_TRUEID) == 0 ){ //Mother IDs
+ if(TMath::Abs(K_plus_GD_MOTHER_ID) == TRUEID.B_PLUS){//Grandmother IDs
+ tree_combinatorics->Fill();
+ h_BplusMass_combinatorics->Fill(B_plus_M_DTF);
+ continue;
+ }
+ }
+ }
+
+ //the rest of stuff
+ tree_others->Fill();
+ h_BplusMass_others->Fill(B_plus_M_DTF);
+
+ }
+ //output truthmatching results
+ std::cout << "Resulting TruthMatching data: " << TRUE_events << "/" << nEvents << " are found to be correctly reconstructed!" << std::endl;
+ std::cout << "The incorrect reconstructed particles are the following:" << std::endl;
+ std::cout << "(only the first found-incorrect particle is counted)" << std::endl;
+ std::cout << std::endl;
+ //std::cout << (B0 ? "B_zero:\t\t" : "B_plus:\t\t") << B_plus_VETO << std::endl;
+ //std::cout << (B0 ? "K_star_zero:\t" : ( K1 ? "K_one_plus:\t" : "K_star_plus:\t")) << K_star_plus_VETO << std::endl;
+ std::cout << "mu_plus:\t" << mu_plus_VETO << std::endl;
+ std::cout << "mu_minus:\t" << mu_minus_VETO << std::endl;
+ if(Kst2Kpluspi0Resolved){
+ std::cout << "K_plus:\t\t" << K_plus_VETO << std::endl;
+ std::cout << "pi_zero:\t" << pi_zero_VETO << std::endl;
+ std::cout << "gamma1:\t\t" << gamma1_VETO << std::endl;
+ std::cout << "gamma2:\t\t" << gamma2_VETO << std::endl;
+ }
+ if(Kst2Kpluspi0Merged){
+ std::cout << "K_plus:\t\t" << K_plus_VETO << std::endl;
+ std::cout << "pi_zero:\t" << pi_zero_VETO << std::endl;
+ }
+ if(Kst2Kspiplus){
+ std::cout << "K_short:\t" << K_short_VETO << std::endl;
+ std::cout << "Ks_pi_plus:\t" << Ks_pi_plus_VETO << std::endl;
+ std::cout << "Ks_pi_minus:\t" << Ks_pi_minus_VETO << std::endl;
+ std::cout << "pi_plus:\t" << pi_plus_VETO << std::endl;
+ }
+ std::cout << "J_psi:\t\t" <cd();
+ tree_correct->Write();
+ cout << "Correctly id'd entries " << tree_correct->GetEntries() << endl;
+ tree_K1_1270->Write();
+ cout << "B+->K1(1270) entries " << tree_K1_1270->GetEntries() << endl;
+ tree_K1_1400->Write();
+ cout << "B+->K1(1400) entries " << tree_K1_1400->GetEntries() << endl;
+ tree_K1_1410->Write();
+ cout << "B+->K1(1410) entries " << tree_K1_1410->GetEntries() << endl;
+ tree_K_plus->Write();
+ cout << "B+->K+pi0 entries " << tree_K_plus->GetEntries() << endl;
+ tree_K_plus_misID->Write();
+ cout << "B+->K*->pi+pi0 " << tree_K_plus_misID->GetEntries() << endl;
+ tree_B_star->Write();
+ cout << "B*-> B+->K+ entries " << tree_B_star->GetEntries() << endl;
+ tree_Kstar_misID->Write();
+ cout << "K* misID entries " << tree_Kstar_misID->GetEntries() << endl;
+ tree_combinatorics->Write();
+ cout << "b-quark entries " << tree_bquark->GetEntries() << endl;
+ tree_bquark->Write();
+ cout << "Combinatorics " << tree_combinatorics->GetEntries() << endl;
+ tree_others->Write();
+ cout << "Other entries " << tree_others->GetEntries() << endl;
+
+ THStack *tmp = new THStack("IncMC","IncMC;B^{+} mass [MeV];Entries");
+ //tmp->GetXaxis()->SetTitle("B^{+} mass [MeV]");
+ //tmp->GetYaxis()->SetTitle("Entries");
+
+ h_BplusMass_others->SetFillColor(kGreen);
+ h_BplusMass_others->SetLineColor(kGreen);
+ tmp->Add(h_BplusMass_others);
+ h_BplusMass_bquark->SetFillColor(kGreen);
+ h_BplusMass_bquark->SetLineColor(kGreen);
+ tmp->Add(h_BplusMass_bquark);
+
+
+ h_BplusMass_K1_1270->SetFillColor(kBlue);
+ h_BplusMass_K1_1270->SetLineColor(kBlue);
+ tmp->Add(h_BplusMass_K1_1270);
+
+// h_BplusMass_K1_1400->SetFillColor(0);
+// h_BplusMass_K1_1400->SetLineColor(0);
+// tmp->Add(h_BplusMass_K1_1400);
+
+// h_BplusMass_K1_1410->SetFillColor(0);
+// h_BplusMass_K1_1410->SetLineColor(0);
+// tmp->Add(h_BplusMass_K1_1410);
+
+// h_BplusMass_K_plus->SetFillColor(0);
+// h_BplusMass_K_plus->SetLineColor(0);
+// tmp->Add(h_BplusMass_K_plus);
+
+// h_BplusMass_K_plus_misID->SetFillColor(0);
+// h_BplusMass_K_plus_misID->SetLineColor(0);
+// tmp->Add(h_BplusMass_K_plus_misID);
+
+ h_BplusMass_B_star->SetFillColor(kYellow);
+ h_BplusMass_B_star->SetLineColor(kYellow);
+ tmp->Add(h_BplusMass_B_star);
+
+// h_BplusMass_Kstar_misID->SetFillColor(0);
+// h_BplusMass_Kstar_misID->SetLineColor(0);
+// tmp->Add(h_BplusMass_Kstar_misID);
+//
+ // h_BplusMass_combinatorics->SetFillColor(kBlack);
+ // h_BplusMass_combinatorics->SetLineColor(kBlack);
+ // tmp->Add(h_BplusMass_combinatorics);
+
+
+ h_BplusMass_JpsiVETO->SetFillColor(kMagenta-10);
+ h_BplusMass_JpsiVETO->SetLineColor(kMagenta-10);
+ tmp->Add(h_BplusMass_JpsiVETO);
+
+ h_BplusMass_GDVETO->SetFillColor(kOrange-3);
+ h_BplusMass_GDVETO->SetLineColor(kOrange-3);
+ tmp->Add(h_BplusMass_GDVETO);
+
+ h_BplusMass_correct->SetFillColor(kRed);
+ h_BplusMass_correct->SetLineColor(kRed);
+ tmp->Add(h_BplusMass_correct);
+
+ tmp->Write();
+
+
+ TCanvas *c1 = new TCanvas("c1","all",900,700);
+ c1->cd();
+ gStyle->SetOptStat(0);
+ // h_BplusMass_correct->SetFillColor(0);
+ h_BplusMass_correct->Draw();
+ // h_BplusMass_others->SetFillColor(0);
+ h_BplusMass_others->Draw("SAME");
+ // h_BplusMass_K1_1270->SetFillColor(0);
+ h_BplusMass_K1_1270->Draw("SAME");
+ //h_BplusMass_K1_1400->Draw("SAME");
+ //h_BplusMass_K1_1410->Draw("SAME");
+ //h_BplusMass_K_plus->Draw("SAME");
+ //h_BplusMass_K_plus_misID->Draw("SAME");
+ // h_BplusMass_B_star->SetFillColor(0);
+ h_BplusMass_B_star->Draw("SAME");
+ //h_BplusMass_Kstar_misID->Draw("SAME");
+ //h_BplusMass_combinatorics->Draw("SAME");
+ // h_BplusMass_bquark->SetFillColor(0);
+ h_BplusMass_bquark->Draw("SAME");
+ // h_BplusMass_JpsiVETO->SetFillColor(0);
+ h_BplusMass_JpsiVETO->Draw("SAME");
+ // h_BplusMass_GDVETO->SetFillColor(0);
+ h_BplusMass_GDVETO->Draw("SAME");
+
+ c1->Write();
+
+ TCanvas *c2 = new TCanvas("c2","al2",900,700);
+ c2->cd();
+ tmp->Draw();
+ h_BplusMass_tot->SetLineWidth(3);
+ h_BplusMass_tot->SetLineColor(kBlack);
+ h_BplusMass_tot->Draw("SAMEE");
+ c2->Write();
+ c2->SaveAs(Form("%s/data/MC/BtoXJpsi/%s%s/%s%s_pi0Resolved%s_BKG.eps",path_to_output_KplusPizero.c_str(), year.c_str(),magnet.c_str(),year.c_str(),magnet.c_str(),(smallSample ? "_small":"") ),"eps");
+
+ }
+ // Kst2Kpluspi0Merged case
+ else if(Kst2Kpluspi0Merged){
+ //TODO
+ }
+
+ // Kst2Kspiplus case
+ else if(Kst2Kspiplus){
+ //TODO
+ }
+
+ else return 0;
+
+ if(!outputFile->IsOpen()){
+ std::cout << "[ERROR]\t\tFile was not opened succesfully!" << std::endl;
+ return 0;
+ }
+
+ outputFile->cd();
+ //treeTruthMatched->Write("",TObject::kWriteDelete);
+ if (Kst2Kpluspi0Resolved){
+ h_pi0_mismatched_mass->SetLineColor(kRed);
+ h_pi0_mismatched_mass->SetLineWidth(3);
+ h_pi0_resolved_mass->SetLineColor(kBlue);
+ h_pi0_resolved_mass->SetLineWidth(3);
+ h_pi0_mismatched_mass->Write("",TObject::kWriteDelete);
+ h_pi0_resolved_mass->Write("",TObject::kWriteDelete);
+
+ h_B_plus_TRUEID ->Write("",TObject::kWriteDelete);
+ h_K_star_plus_TRUEID ->Write("",TObject::kWriteDelete);
+ h_K_plus_TRUEID ->Write("",TObject::kWriteDelete);
+ h_pi_zero_TRUEID ->Write("",TObject::kWriteDelete);
+
+ h_B_plus_TRUEID_rm ->Write("",TObject::kWriteDelete);
+ h_K_star_plus_TRUEID_rm ->Write("",TObject::kWriteDelete);
+ h_K_plus_TRUEID_rm ->Write("",TObject::kWriteDelete);
+ h_pi_zero_TRUEID_rm ->Write("",TObject::kWriteDelete);
+
+ h_B_plus_K1 ->Write("",TObject::kWriteDelete);
+ h_B_plus_Kst ->Write("",TObject::kWriteDelete);
+ h_B_plus_Kpl ->Write("",TObject::kWriteDelete);
+ }
+
+ delete outputFile;//->Close();
+
+ delete h_pi0_mismatched_mass;
+ delete h_pi0_resolved_mass;
+
+ delete tree;
+ std::cout << "[DONE]\t\tFinished Truth-Matching for INC sample: " << year << " " << magnet << std::endl;
+
+ return 1;
+}
+
+
+
+int plotIncSampleAll() {
+
+
+ if ( plotIncSample("2011","down") == 0) return 0;
+ if ( plotIncSample("2011","up") == 0) return 0;
+ if ( plotIncSample("2012","down") == 0) return 0;
+ if ( plotIncSample("2012","up") == 0) return 0;
+ if ( plotIncSample("2015","down") == 0) return 0;
+ if ( plotIncSample("2015","up") == 0) return 0;
+ if ( plotIncSample("2016","down") == 0) return 0;
+ if ( plotIncSample("2016","up") == 0) return 0;
+ return 1;
+
+}
+
diff --git a/Code/Scripts/Backgrounds/MisID.cc b/Code/Scripts/Backgrounds/MisID.cc
new file mode 100755
index 0000000..5df4189
--- /dev/null
+++ b/Code/Scripts/Backgrounds/MisID.cc
@@ -0,0 +1,182 @@
+#include
+#include
+#include
+#include