Angular analysis of B+->K*+(K+pi0)mumu
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

363 lines
15 KiB

  1. ############# Global settings
  2. runFilters = False
  3. MDST = False
  4. data = False
  5. down = True
  6. year = "2011"
  7. stream = "AllStreams"
  8. line = "B2XMuMu_Line"
  9. channel = "BtoKstJpsi"
  10. #subdecay chains
  11. KShortPiPlus = False
  12. KplusPi0Merged = False
  13. KplusPi0Resolved = True
  14. from Gaudi.Configuration import *
  15. from Configurables import DaVinci
  16. from Configurables import FilterDesktop, GaudiSequencer
  17. from Configurables import CombineParticles
  18. from Configurables import TupleToolP2VV, MCTupleToolP2VV
  19. #---------- Debugging tools----------#
  20. #MessageSvc().OutputLevel = VERBOSE
  21. #MessageSvc().OutputLevel = DEBUG
  22. #MessageSvc().Format = "% F%100W%S%7W%R%T %0W%M"
  23. #Run1 or Run2
  24. #DST or MDST?
  25. Run1 = True
  26. if (year == "2011" or year == "2012"):
  27. Run1 = True
  28. elif (year == "2015" or year == "2016"):
  29. Run1 = False
  30. else:
  31. print "[WARNING]\tWrong year input!\n"
  32. #MC Truthmatching fix for run 1 (obsolete)
  33. #if (not data and Run1):
  34. # from Configurables import PhysConf
  35. # PhysConf().CaloReProcessing=True
  36. #triggerlines
  37. if (Run1):
  38. print "[INFO]\tTriggerlines for Run 1 added!\n"
  39. triggerlines = [
  40. #l0
  41. "L0HadronDecision",
  42. "L0MuonDecision",
  43. "L0GlobalDecision",
  44. #hlt1
  45. "Hlt1TrackMuonDecision",
  46. "Hlt1DiMuonHighMassDecision",
  47. "Hlt1DiMuonLowMassDecision",
  48. "Hlt1TrackAllL0Decision",
  49. "Hlt1TrackAllL0TightDecision",
  50. "Hlt1L0AnyDecision",
  51. "Hlt1MBNoBiasDecision",
  52. "Hlt1GlobalDecision",
  53. #hlt2
  54. "Hlt2CharmHadD2HHHHDecision",
  55. "Hlt2CharmHadD2HHHHWideMassDecision",
  56. "Hlt2IncPhiDecision",
  57. "Hlt2ExpressDs2PhiPiDecision",
  58. "Hlt2Topo2BodySimpleDecision",
  59. "Hlt2Topo3BodySimpleDecision",
  60. "Hlt2Topo2BodyBBDTDecision",
  61. "Hlt2Topo3BodyBBDTDecision",
  62. "Hlt2TopoMu2BodyBBDTDecision",
  63. "Hlt2TopoMu3BodyBBDTDecision",
  64. "Hlt2TopoE2BodyBBDTDecision",
  65. "Hlt2TopoE3BodyBBDTDecision",
  66. "Hlt2RadiativeTopoTrackTOSDecision",
  67. "Hlt2RadiativeTopoPhotonL0Decision",
  68. "Hlt2SingleMuonDecision",
  69. "Hlt2DiMuonDetachedDecision",
  70. "Hlt2DiMuonDetachedHeavyDecision"]
  71. else:
  72. print "[INFO]\tTriggerlines for Run 2 added!\n"
  73. triggerlines = [
  74. #l0
  75. "L0HadronDecision",
  76. "L0MuonDecision",
  77. "L0DiMuonDecision",
  78. #"L0GlobalDecision",
  79. #hlt1
  80. "Hlt1TrackMuonDecision",
  81. "Hlt1DiMuonHighMassDecision",
  82. "Hlt1DiMuonLowMassDecision",
  83. "Hlt1TrackMVADecision",
  84. "Hlt1TwoTrackMVADecision",
  85. "Hlt1L0AnyDecision",
  86. "Hlt1MBNoBiasDecision",
  87. "Hlt1GlobalDecision",
  88. #hlt2
  89. "Hlt2Topo2BodyDecision",
  90. "Hlt2Topo3BodyDecision",
  91. "Hlt2TopoMu2BodyDecision",
  92. "Hlt2TopoMu3BodyDecision",
  93. "Hlt2TopoMuMu2BodyDecision",
  94. "Hlt2TopoMuMu3BodyDecision",
  95. "Hlt2SingleMuonDecision",
  96. "Hlt2SingleMuonHighPTDecision",
  97. "Hlt2SingleMuonLowPTDecision",
  98. "Hlt2DiMuonDetachedDecision",
  99. "Hlt2DiMuonDetachedHeavyDecision"]
  100. ############### Pre Filter, does not really do much except choose only candidates passing the Stripping line, maybe beneficial to performance
  101. #from Configurables import LoKi__HDRFilter as StripFilter
  102. #stripFilter = StripFilter( "stripPassFilter",\
  103. # Code = "HLT_PASS('StrippingB2XMuMu_LineDecision')",\
  104. # Location= "/Event/Strip/Phys/DecReports")
  105. ############# DecayTreeTuple
  106. from DecayTreeTuple.Configuration import *
  107. from Configurables import TupleToolTISTOS
  108. from PhysSelPython.Wrappers import AutomaticData, Selection, SelectionSequence
  109. from Configurables import PrintDecayTree, PrintDecayTreeTool
  110. ############# MCDecayTreeTuple
  111. from Configurables import MCDecayTreeTuple
  112. from Configurables import MCTupleToolKinematic, TupleToolMCBackgroundInfo, TupleToolMCTruth
  113. #Fix Truthmatching
  114. from Configurables import BackgroundCategory,Calo2MCTool,DaVinciSmartAssociator
  115. ##subpid stuff
  116. #from Configurables import SubPIDMMFilter
  117. from Configurables import SubstitutePID ,BTaggingTool
  118. from Configurables import TupleToolDecayTreeFitter, TupleToolTrackIsolation, TupleToolConeIsolation
  119. from Configurables import LoKi__Hybrid__TupleTool
  120. ##########################################
  121. ###B+ -> (K*(892)+ -> KS0 pi+) mu+ mu- ### (> 1 <)
  122. ##########################################
  123. ### AND/OR ###
  124. ##########################################################
  125. ###B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) mu+ mu- ### (> 2 <)
  126. ##########################################################
  127. #This is probably a very stupid idea but python should be okay with it
  128. b2KstmumuTupleList= []
  129. b2KstmumuTupleList.append(DecayTreeTuple("b2KstKs0pimumu_Tuple"))
  130. b2KstmumuTupleList.append(DecayTreeTuple("b2KstKpi0mumuResolvedTuple"))
  131. for b2KstmumuTuple in b2KstmumuTupleList:
  132. if (MDST):
  133. b2KstmumuTuple.RootInTES = '/Event/{0}'.format(stream)
  134. b2KstmumuTuple.Inputs = ['Phys/{0}/Particles'.format(line)]
  135. else:
  136. b2KstmumuTuple.Inputs = ['{0}/Phys/{1}/Particles'.format(stream, line)]
  137. #decay descriptor
  138. b2KstmumuTupleList[0].Decay = "[B+ -> ^(K*(892)+ -> ^(KS0 -> ^pi+ ^pi-) ^pi+) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
  139. b2KstmumuTupleList[0].addBranches({
  140. "B_plus" : "^([B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC)" ,
  141. "K_star_plus" : "[B+ -> ^(K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
  142. "K_short" : "[B+ -> (K*(892)+ -> ^(KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
  143. "Ks_pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> ^pi+ pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
  144. "Ks_pi_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ ^pi-) pi+) (J/psi(1S) -> mu- mu+)]CC",
  145. "pi_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) ^pi+) (J/psi(1S) -> mu- mu+)]CC",
  146. "J_psi" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) ^(J/psi(1S) -> mu- mu+)]CC",
  147. "mu_minus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> ^mu- mu+)]CC",
  148. "mu_plus" : "[B+ -> (K*(892)+ -> (KS0 -> pi+ pi-) pi+) (J/psi(1S) -> mu- ^mu+)]CC"
  149. })
  150. b2KstmumuTupleList[1].Decay = "[B+ -> ^(K*(892)+ -> ^K+ ^(pi0 -> ^gamma ^gamma)) ^(J/psi(1S) -> ^mu- ^mu+)]CC"
  151. b2KstmumuTupleList[1].addBranches({
  152. "B_plus" : "^([B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC)",
  153. "K_star_plus" : "[B+ -> ^(K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
  154. "K_plus" : "[B+ -> (K*(892)+ -> ^K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
  155. "pi_zero_resolved" : "[B+ -> (K*(892)+ -> K+ ^(pi0 -> gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
  156. "gamma1" : "[B+ -> (K*(892)+ -> K+ (pi0 -> ^gamma gamma)) (J/psi(1S) -> mu- mu+)]CC",
  157. "gamma2" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma ^gamma)) (J/psi(1S) -> mu- mu+)]CC",
  158. "J_psi" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) ^(J/psi(1S) -> mu- mu+)]CC",
  159. "mu_minus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> ^mu- mu+)]CC",
  160. "mu_plus" : "[B+ -> (K*(892)+ -> K+ (pi0 -> gamma gamma)) (J/psi(1S) -> mu- ^mu+)]CC"
  161. })
  162. #add tools
  163. for b2KstmumuTuple in b2KstmumuTupleList:
  164. b2KstmumuTuple.ToolList = ["TupleToolKinematic",
  165. "TupleToolPrimaries",
  166. "TupleToolEventInfo",
  167. "TupleToolTrackInfo",
  168. "TupleToolRecoStats",
  169. "TupleToolAngles",
  170. "TupleToolPid",
  171. "TupleToolPhotonInfo"]
  172. #add MCtools
  173. if not (data):
  174. b2KstmumuMCTuple = b2KstmumuTuple.addTupleTool("TupleToolMCTruth/b2KstmumuMCTuple")
  175. b2KstmumuMCTuple.addTupleTool("MCTupleToolHierarchy")
  176. b2KstmumuTuple.ToolList += ["MCTupleToolKinematic",
  177. "TupleToolMCBackgroundInfo"]
  178. #Adding Angle Calculator
  179. b2KstmumuTuple.B_plus.addTool(TupleToolMCTruth, name="B_plusMCTruth")
  180. b2KstmumuTuple.B_plus.ToolList = [ "TupleToolMCTruth/B_plusMCTruth"]
  181. b2KstmumuTuple.B_plus.B_plusMCTruth.ToolList = [ "MCTupleToolP2VV/B2KsMuMu"]
  182. b2KstmumuTuple.B_plus.B_plusMCTruth.addTool( MCTupleToolP2VV, name="B2KsMuMu" )
  183. b2KstmumuTuple.B_plus.B_plusMCTruth.B2KsMuMu.Calculator = 'MCBu2KstarMuMuAngleCalculator'
  184. if ( (channel == "BtoXJpsi" and not Run1) or (channel == "B0toKstMuMu" and not Run1) ):
  185. from Configurables import Calo2MCTool
  186. for b2KstmumuTuple in b2KstmumuTupleList:
  187. b2KstmumuTuple.addTool(Calo2MCTool,name="Calo2MCTool")
  188. b2KstmumuTuple.Calo2MCTool.Hypo2Cluster=True
  189. #add tools to branches
  190. if (KplusPi0Resolved):
  191. b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolPi0Info")
  192. b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolCaloHypo")
  193. b2KstmumuTupleList[1].pi_zero_resolved.addTupleTool("TupleToolGeometry/Geo")
  194. b2KstmumuTupleList[1].pi_zero_resolved.Geo.Verbose = True
  195. b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolProtoPData")
  196. b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolPhotonInfo")
  197. b2KstmumuTupleList[1].gamma1.addTupleTool("TupleToolCaloHypo")
  198. b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolProtoPData")
  199. b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolPhotonInfo")
  200. b2KstmumuTupleList[1].gamma2.addTupleTool("TupleToolCaloHypo")
  201. for b2KstmumuTuple in b2KstmumuTupleList:
  202. b2KstmumuTuple.B_plus.addTupleTool("TupleToolGeometry/Geo")
  203. b2KstmumuTuple.B_plus.Geo.Verbose = True
  204. b2KstmumuTuple.B_plus.addTupleTool("TupleToolPropertime")
  205. #Adding Angle Calculator
  206. TupleToolP2VV_Bu = TupleToolP2VV('TupleToolP2VV_Bu')
  207. TupleToolP2VV_Bu.Calculator = 'Bu2KstarMuMuAngleCalculator'
  208. b2KstmumuTuple.B_plus.addTool(TupleToolP2VV_Bu)
  209. b2KstmumuTuple.B_plus.ToolList += ["TupleToolP2VV/TupleToolP2VV_Bu"]
  210. b2KstmumuTuple.J_psi.addTupleTool("TupleToolGeometry/Geo")
  211. b2KstmumuTuple.J_psi.Geo.Verbose = True
  212. b2KstmumuTuple.mu_minus.addTupleTool("TupleToolGeometry/Geo")
  213. b2KstmumuTuple.mu_minus.Geo.Verbose = True
  214. b2KstmumuTuple.mu_plus.addTupleTool("TupleToolGeometry/Geo")
  215. b2KstmumuTuple.mu_plus.Geo.Verbose = True
  216. if (KShortPiPlus):
  217. b2KstmumuTupleList[0].K_short.addTupleTool("TupleToolGeometry/Geo")
  218. b2KstmumuTupleList[0].K_short.Geo.Verbose = True
  219. b2KstmumuTupleList[0].pi_plus.addTupleTool("TupleToolGeometry/Geo")
  220. b2KstmumuTupleList[0].pi_plus.Geo.Verbose = True
  221. if (KplusPi0Resolved):
  222. b2KstmumuTupleList[1].K_plus.addTupleTool("TupleToolGeometry/Geo")
  223. b2KstmumuTupleList[1].K_plus.Geo.Verbose = True
  224. ### DST isolation info tools ###
  225. for b2KstmumuTuple in b2KstmumuTupleList:
  226. if not( MDST ):
  227. b2KstmumuTuple.addTupleTool("TupleToolTrackIsolation/TrackIso")
  228. b2KstmumuTuple.TrackIso.Verbose = True
  229. b2KstmumuTuple.addTupleTool("TupleToolConeIsolation/ConeIso")
  230. b2KstmumuTuple.addTool(TupleToolDecay, name="TupleToolDecayBplus")
  231. #decay tree fitter (DTF)
  232. b2KstmumuTuple.B_plus.addTupleTool('TupleToolDecayTreeFitter/DTF')
  233. b2KstmumuTuple.B_plus.DTF.constrainToOriginVertex = True
  234. b2KstmumuTuple.B_plus.DTF.UpdateDaughters = True
  235. b2KstmumuTuple.B_plus.DTF.Verbose = True
  236. #Add mass constraints
  237. if (KShortPiPlus):
  238. b2KstmumuTupleList[0].B_plus.DTF.daughtersToConstrain = ['KS0']
  239. if (KplusPi0Resolved):
  240. b2KstmumuTupleList[1].B_plus.DTF.daughtersToConstrain = ['pi0']
  241. #LoKi tools
  242. ConeIsoInfo = 'ConeIsoInfo'
  243. VtxIsoInfo = 'VtxIsoInfo'
  244. if (not Run1 and not MDST):
  245. if ( (channel == "BtoXJpsi") or (channel == "B0toKstMuMu")):
  246. ConeIsoInfo = 'ConeIsoInfoBDT'
  247. ConeIsoInfo = 'VtxIsoInfoBDT'
  248. if ( MDST ) :
  249. for b2KstmumuTuple in b2KstmumuTupleList:
  250. LoKiToolb2KstmumuTuple = b2KstmumuTuple.addTupleTool("LoKi::Hybrid::TupleTool/LoKiToolb2KstmumuTuple")
  251. LoKiToolb2KstmumuTuple.Variables = {"ETA" : "ETA" ,
  252. "PHI" : "PHI" ,
  253. "DOCA1" : "DOCA(1,2)" ,
  254. "CONEANGLE" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEANGLE', -1.)",
  255. "CONEMULT" : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEMULT', -1.)",
  256. 'CONEPTASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPTASYM', -1.)",
  257. 'CONEPT': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPT', -1.)",
  258. 'CONEP': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEP', -1.)",
  259. 'CONEPASYM' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEPASYM', -1.)",
  260. 'CONEDELTAETA' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAETA', -1.)",
  261. 'CONEDELTAPHI' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + ConeIsoInfo + "', 'CONEDELTAPHI', -1.)",
  262. 'VTXISONUMVTX' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISONUMVTX', -1.)",
  263. 'VTXISODCHI2ONETRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2ONETRACK', -1.)",
  264. 'VTXISODCHI2MASSONETRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSONETRACK', -1.)",
  265. 'VTXISODCHI2TWOTRACK' : "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2TWOTRACK', -1.)",
  266. 'VTXISODCHI2MASSTWOTRACK': "RELINFO('/Event/" + stream + "/Phys/B2XMuMu_Line/" + VtxIsoInfo + "', 'VTXISODCHI2MASSTWOTRACK', -1.)"
  267. };
  268. #trigger config
  269. for b2KstmumuTuple in b2KstmumuTupleList:
  270. b2KstmumuTT = b2KstmumuTuple.addTupleTool(TupleToolTISTOS)
  271. b2KstmumuTT.TriggerList = triggerlines
  272. b2KstmumuTT.FillL0 = True
  273. b2KstmumuTT.FillHlt1 = True
  274. b2KstmumuTT.FillHlt2 = True
  275. b2KstmumuTT.Verbose = True
  276. b2KstmumuTT.VerboseL0 = True
  277. b2KstmumuTT.VerboseHlt1 = True
  278. b2KstmumuTT.VerboseHlt2 = True
  279. ###########################
  280. ##Main sequence
  281. ###########################
  282. b2KstmumuSeq = GaudiSequencer("b2KstmumuSeq")
  283. if (KShortPiPlus):
  284. b2KstmumuSeq.Members += [b2KstmumuTupleList[0]]
  285. if (KplusPi0Resolved):
  286. b2KstmumuSeq.Members += [b2KstmumuTupleList[1]]
  287. b2KstmumuSeq.ModeOR = True
  288. b2KstmumuSeq.ShortCircuit = False
  289. ###########################
  290. ##DaVinci configurations
  291. ###########################
  292. dv = DaVinci()
  293. #dv.EventPreFilters = [stripFilter]
  294. dv.UserAlgorithms += [b2KstmumuSeq]
  295. if(MDST):
  296. dv.InputType = "MDST"
  297. else:
  298. dv.InputType = "DST"
  299. dv.RootInTES = "/Event/{0}".format(stream)
  300. dv.DataType = year
  301. dv.Simulation = not data
  302. dv.Lumi = True
  303. #dv.VerboseMessages = True
  304. #dv.SkipEvents = 0
  305. dv.PrintFreq = 1000
  306. dv.EvtMax = -1
  307. dv.TupleFile = "BtoKstJpsi_2011MagDown.root"
  308. dv.CondDBtag = "sim-20160614-1-vc-md100"
  309. dv.DDDBtag = "dddb-20160318-1"