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.

344 lines
15 KiB

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