HLT2 trigger line to select D0 to KsKs
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.

726 lines
24 KiB

1 year ago
  1. ###############################################################################
  2. # (c) Copyright 2020 CERN for the benefit of the LHCb Collaboration #
  3. # #
  4. # This software is distributed under the terms of the GNU General Public #
  5. # Licence version 3 (GPL Version 3), copied verbatim in the file "COPYING". #
  6. # #
  7. # In applying this licence, CERN does not waive the privileges and immunities #
  8. # granted to it by virtue of its status as an Intergovernmental Organization #
  9. # or submit itself to any jurisdiction. #
  10. ###############################################################################
  11. """
  12. Lines to select the decay D*+ -> D0 pi+ with D0 -> KS0 KS0 and KS0 -> pi+ pi-.
  13. The KS0 can be reconstructed either from long or downstream tracks, resulting
  14. in the combinations LLLL, LLDD, DDDD.
  15. The tight lines apply tighter cuts on the KS0 and D*+ invariant masses for
  16. the LLLL and LLDD lines, and on the KS0 invariant masses for the DDDD line.
  17. """
  18. import Functors as F
  19. from Functors.math import in_range
  20. from GaudiKernel.SystemOfUnits import MeV, mm, GeV
  21. from Moore.config import register_line_builder
  22. from Moore.lines import Hlt2Line
  23. from RecoConf.reconstruction_objects import make_pvs
  24. from Hlt2Conf.standard_particles import make_down_pions, make_long_pions, make_up_pions
  25. from Hlt2Conf.algorithms import ParticleContainersMerger
  26. from Hlt2Conf.algorithms_thor import (ParticleCombiner, ParticleFilter)
  27. from Hlt2Conf.lines.charm.particle_properties import _KS_M
  28. from Hlt2Conf.lines.charm.prefilters import charm_prefilters
  29. # from Hlt2Conf.lines.charm.up_taggers import make_tagging_pions
  30. from PyConf.Algorithms import Monitor__ParticleRange
  31. #####################################################################
  32. ### Shortcuts for filters and builders used throughout the module ###
  33. #####################################################################
  34. def make_tagging_pions():
  35. return ParticleFilter(
  36. make_long_pions(),
  37. F.FILTER(F.require_all(F.PT > 200 * MeV, F.P > 1 * GeV)),
  38. )
  39. def _make_long_pions_from_ks():
  40. return ParticleFilter(
  41. make_long_pions(),
  42. F.FILTER(F.MINIPCHI2CUT(IPChi2Cut=36., Vertices=make_pvs())))
  43. def _make_down_pions_from_ks():
  44. return ParticleFilter(
  45. make_down_pions(),
  46. F.FILTER(F.require_all(F.PT > 175 * MeV, F.P > 3000 * MeV)))
  47. def _make_down_pions_from_ks_LD():
  48. return ParticleFilter(
  49. make_down_pions(),
  50. F.FILTER(F.require_all(F.PT > 100 * MeV, F.P > 2000 * MeV)))
  51. def _make_up_pions_from_ks():
  52. return ParticleFilter(
  53. make_up_pions(),
  54. F.FILTER(F.MINIPCHI2CUT(IPChi2Cut=10., Vertices=make_pvs())))
  55. def _make_ll_ks_tight(descriptor="KS0 -> pi+ pi-"):
  56. """Returns maker for KS0 -> pi+ pi- constructed with two long pions with a tighter mass cut."""
  57. return ParticleCombiner(
  58. [_make_long_pions_from_ks(),
  59. _make_long_pions_from_ks()],
  60. DecayDescriptor=descriptor,
  61. name='Charm_D0ToKsKs_Ks_LL_Tight_{hash}',
  62. CombinationCut=F.require_all(
  63. in_range(_KS_M - 50 * MeV, F.MASS, _KS_M + 50 * MeV),
  64. F.PT > 450 * MeV,
  65. ),
  66. CompositeCut=F.require_all(
  67. in_range(_KS_M - 30 * MeV, F.MASS, _KS_M + 30 * MeV),
  68. F.CHI2DOF < 7, # TODO: study if this cut can be tightened
  69. in_range(-100 * mm, F.END_VZ, 500 * mm),
  70. F.PT > 500 * MeV,
  71. ),
  72. )
  73. def _make_ll_ks_tight_ULLL(descriptor="KS0 -> pi+ pi-"):
  74. """Returns maker for KS0 -> pi+ pi- constructed with two long pions with a tighter mass cut for ULLL."""
  75. return ParticleCombiner(
  76. [_make_long_pions_from_ks(),
  77. _make_long_pions_from_ks()],
  78. DecayDescriptor=descriptor,
  79. name='Charm_D0ToKsKs_Ks_LL_Tight_ULLL{hash}',
  80. CombinationCut=F.require_all(
  81. in_range(_KS_M - 50 * MeV, F.MASS, _KS_M + 50 * MeV),
  82. F.PT > 250 * MeV,
  83. ),
  84. CompositeCut=F.require_all(
  85. in_range(_KS_M - 30 * MeV, F.MASS, _KS_M + 30 * MeV),
  86. F.CHI2DOF < 7, # TODO: study if this cut can be tightened
  87. in_range(-100 * mm, F.END_VZ, 500 * mm),
  88. F.PT > 300 * MeV,
  89. ),
  90. )
  91. def _make_ld_ks_tight(descriptor="KS0 -> pi+ pi-"):
  92. """Returns maker for KS0 -> pi+ pi- constructed with a long and down pion with a tighter mass cut."""
  93. return ParticleCombiner(
  94. [_make_long_pions_from_ks(),
  95. _make_down_pions_from_ks_LD()],
  96. DecayDescriptor=descriptor,
  97. name='Charm_D0ToKsKs_Ks_LD_Tight_{hash}',
  98. CombinationCut=F.require_all(
  99. in_range(_KS_M - 85 * MeV, F.MASS, _KS_M + 85 * MeV),
  100. F.PT > 450 * MeV,
  101. ),
  102. CompositeCut=F.require_all(
  103. in_range(_KS_M - 65 * MeV, F.MASS, _KS_M + 65 * MeV),
  104. F.CHI2DOF < 10, # TODO: study if this cut can be tightened
  105. in_range(50 * mm, F.END_VZ, 500 * mm),
  106. F.PT > 500 * MeV,
  107. ),
  108. )
  109. def _make_dd_ks_tight(descriptor="KS0 -> pi+ pi-"):
  110. """Returns maker for KS0 -> pi+ pi- constructed with two downstream pions with a tighter mass cut."""
  111. return ParticleCombiner(
  112. [_make_down_pions_from_ks(),
  113. _make_down_pions_from_ks()],
  114. DecayDescriptor=descriptor,
  115. name='Charm_D0ToKsKs_Ks_DD_Tight_{hash}',
  116. CombinationCut=F.require_all(
  117. in_range(_KS_M - 80 * MeV, F.MASS, _KS_M + 80 * MeV),
  118. F.PT > 450 * MeV,
  119. ),
  120. CompositeCut=F.require_all(
  121. in_range(_KS_M - 60 * MeV, F.MASS, _KS_M + 60 * MeV),
  122. F.CHI2DOF < 10, # TODO: study if this cut can be tightened
  123. in_range(300 * mm, F.END_VZ, 2275 * mm),
  124. F.PT > 500 * MeV,
  125. ),
  126. )
  127. def _make_ul_ks_tight(descriptor="KS0 -> pi+ pi-"): # change req
  128. """Returns maker for KS0 -> pi+ pi- constructed with one long and one up pion with a tighter mass cut."""
  129. return ParticleCombiner(
  130. [_make_up_pions_from_ks(),
  131. _make_long_pions_from_ks()],
  132. DecayDescriptor=descriptor,
  133. name='Charm_D0ToKsKs_Ks_UL_Tight_{hash}',
  134. CombinationCut=F.require_all(
  135. in_range(_KS_M - 90 * MeV, F.MASS, _KS_M + 90 * MeV),
  136. F.PT < 5050 * MeV,
  137. ),
  138. CompositeCut=F.require_all(
  139. in_range(_KS_M - 70 * MeV, F.MASS, _KS_M + 70 * MeV),
  140. F.CHI2DOF < 10, # TODO: study if this cut can be tightened
  141. in_range(-100 * mm, F.END_VZ, 500 * mm),
  142. F.PT > 400 * MeV,
  143. ),
  144. )
  145. def _make_dstars_tight(dzeros, pions, descriptor):
  146. """Returns maker for D*+- -> D0 pi+- with a tighter mass cut."""
  147. return ParticleCombiner(
  148. [dzeros, pions],
  149. DecayDescriptor=descriptor,
  150. name='Charm_D0ToKsKs_DstarsTight_{hash}',
  151. CombinationCut=F.MASS - F.CHILD(1, F.MASS) < 160 * MeV,
  152. CompositeCut=F.require_all(
  153. F.MASS - F.CHILD(1, F.MASS) < 150 * MeV,
  154. F.CHI2DOF < 25, # fix due to control channel
  155. ),
  156. )
  157. #########################
  158. ### Lines definition ###
  159. #########################
  160. all_lines = {}
  161. @register_line_builder(all_lines)
  162. def dst_to_d0pi_d0toksks_ll_tightline(
  163. name="Hlt2Charm_DstpToD0Pip_D0ToKsKs_LLLL_Tight"):
  164. pvs = make_pvs()
  165. kshorts = _make_ll_ks_tight()
  166. dzeros = ParticleCombiner(
  167. [kshorts, kshorts],
  168. DecayDescriptor="D0 -> KS0 KS0",
  169. name="Charm_D0ToKsKs_D0ToKsKs_LLLL_Tight",
  170. CombinationCut=F.require_all(
  171. in_range(1730 * MeV, F.MASS, 2000 * MeV),
  172. F.SUM(F.PT) > 1500 * MeV,
  173. ),
  174. CompositeCut=F.require_all(
  175. in_range(1775 * MeV, F.MASS, 1955 * MeV),
  176. F.BPVFDCHI2(pvs) > 5,
  177. F.CHI2DOF < 10, # fix
  178. F.BPVDIRA(pvs) > 0.9994,
  179. ),
  180. )
  181. pitag = make_tagging_pions()
  182. dstarp = _make_dstars_tight(dzeros, pitag,
  183. "D*(2010)+ -> D0 pi+")
  184. dstarm = _make_dstars_tight(dzeros, pitag,
  185. "D*(2010)- -> D0 pi-")
  186. dstars = ParticleContainersMerger([dstarp, dstarm])
  187. pisoft_pt = Monitor__ParticleRange(
  188. Input=pitag,
  189. Variable=F.PT,
  190. HistogramName=f"/{name}/pisoft_PT",
  191. Bins=50,
  192. Range=(0 * MeV, 1000 * MeV),
  193. )
  194. delta_m = Monitor__ParticleRange(
  195. Input=dstars,
  196. Variable=F.MASS - F.CHILD(1, F.MASS),
  197. HistogramName=f"/{name}/delta_m",
  198. Bins=200,
  199. Range=(100 * MeV, 200 * MeV),
  200. )
  201. pi1 = Monitor__ParticleRange(
  202. Input=dzeros,
  203. Variable=F.CHILD(1, F.CHILD(1, F.PT)),
  204. HistogramName=f"/{name}/pi_l1",
  205. Bins=200,
  206. Range=(0 * MeV, 3000 * MeV),
  207. )
  208. pi2 = Monitor__ParticleRange(
  209. Input=dzeros,
  210. Variable=F.CHILD(1, F.CHILD(2, F.PT)),
  211. HistogramName=f"/{name}/pi_l2",
  212. Bins=200,
  213. Range=(0 * MeV, 3000 * MeV),
  214. )
  215. pi3 = Monitor__ParticleRange(
  216. Input=dzeros,
  217. Variable=F.CHILD(2, F.CHILD(1, F.PT)),
  218. HistogramName=f"/{name}/pi_l3",
  219. Bins=200,
  220. Range=(0 * MeV, 3000 * MeV),
  221. )
  222. pi4 = Monitor__ParticleRange(
  223. Input=dzeros,
  224. Variable=F.CHILD(2, F.CHILD(2, F.PT)),
  225. HistogramName=f"/{name}/pi_l4",
  226. Bins=200,
  227. Range=(0 * MeV, 3000 * MeV),
  228. )
  229. return Hlt2Line(
  230. name=name, algs=charm_prefilters() + [kshorts, dzeros, dstars, pisoft_pt, delta_m, pi1, pi2, pi3, pi4])
  231. @register_line_builder(all_lines)
  232. def dst_to_d0pi_d0toksks_ld_tightline(
  233. name="Hlt2Charm_DstpToD0Pip_D0ToKsKs_LLDD_Tight"):
  234. pvs = make_pvs()
  235. dd_kshorts = _make_dd_ks_tight("KS0 -> pi+ pi-")
  236. ll_kshorts = _make_ll_ks_tight()
  237. dzeros = ParticleCombiner(
  238. [dd_kshorts, ll_kshorts],
  239. DecayDescriptor="D0 -> KS0 KS0",
  240. AllowDiffInputsForSameIDChildren=True,
  241. name="Charm_D0ToKsKs_D0ToKsKs_LLDD_Tight",
  242. CombinationCut=F.require_all(
  243. in_range(1730 * MeV, F.MASS, 2000 * MeV),
  244. F.SUM(F.PT) > 1500 * MeV,
  245. ),
  246. CompositeCut=F.require_all(
  247. in_range(1775 * MeV, F.MASS, 1955 * MeV),
  248. F.CHI2DOF < 10,
  249. F.BPVDIRA(pvs) > 0.9994,
  250. ),
  251. )
  252. pitag = make_tagging_pions()
  253. dstarp = _make_dstars_tight(dzeros, pitag, "D*(2010)+ -> D0 pi+")
  254. dstarm = _make_dstars_tight(dzeros, pitag, "D*(2010)- -> D0 pi-")
  255. dstars = ParticleContainersMerger([dstarp, dstarm])
  256. pisoft_pt = Monitor__ParticleRange(
  257. Input=pitag,
  258. Variable=F.PT,
  259. HistogramName=f"/{name}/pisoft_PT",
  260. Bins=50,
  261. Range=(0 * MeV, 1000 * MeV),
  262. )
  263. delta_m = Monitor__ParticleRange(
  264. Input=dstars,
  265. Variable=F.MASS - F.CHILD(1, F.MASS),
  266. HistogramName=f"/{name}/delta_m",
  267. Bins=200,
  268. Range=(100 * MeV, 200 * MeV),
  269. )
  270. pi1 = Monitor__ParticleRange(
  271. Input=ll_kshorts,
  272. Variable=F.CHILD(1, F.PT),
  273. HistogramName=f"/{name}/pi_l1",
  274. Bins=200,
  275. Range=(0 * MeV, 3000 * MeV),
  276. )
  277. pi2 = Monitor__ParticleRange(
  278. Input=ll_kshorts,
  279. Variable=F.CHILD(2, F.PT),
  280. HistogramName=f"/{name}/pi_l2",
  281. Bins=200,
  282. Range=(0 * MeV, 3000 * MeV),
  283. )
  284. pi3 = Monitor__ParticleRange(
  285. Input=dd_kshorts,
  286. Variable=F.CHILD(1, F.PT),
  287. HistogramName=f"/{name}/pi_d1",
  288. Bins=200,
  289. Range=(0 * MeV, 3000 * MeV),
  290. )
  291. pi4 = Monitor__ParticleRange(
  292. Input=dd_kshorts,
  293. Variable=F.CHILD(2, F.PT),
  294. HistogramName=f"/{name}/pi_d2",
  295. Bins=200,
  296. Range=(0 * MeV, 3000 * MeV),
  297. )
  298. return Hlt2Line(
  299. name=name, algs=charm_prefilters() + [dd_kshorts, dzeros, dstars, pisoft_pt, delta_m, pi1, pi2, pi3, pi4])
  300. @register_line_builder(all_lines)
  301. def dst_to_d0pi_d0toksks_dd_tightline(
  302. name="Hlt2Charm_DstpToD0Pip_D0ToKsKs_DDDD_Tight"):
  303. pvs = make_pvs()
  304. dd_kshorts = _make_dd_ks_tight()
  305. dzeros = ParticleCombiner(
  306. [dd_kshorts, dd_kshorts],
  307. DecayDescriptor="D0 -> KS0 KS0",
  308. name="Charm_D0ToKsKs_D0ToKsKs_DDDD_Tight",
  309. CombinationCut=F.require_all(
  310. in_range(1730 * MeV, F.MASS, 2000 * MeV),
  311. F.SUM(F.PT) > 1500 * MeV,
  312. ),
  313. CompositeCut=F.require_all(
  314. in_range(1775 * MeV, F.MASS, 1955 * MeV),
  315. F.CHI2DOF < 10,
  316. F.BPVDIRA(pvs) > 0.9994,
  317. ),
  318. )
  319. pitag = make_tagging_pions()
  320. dstarp = _make_dstars_tight(dzeros, pitag,
  321. "D*(2010)+ -> D0 pi+")
  322. dstarm = _make_dstars_tight(dzeros, pitag,
  323. "D*(2010)- -> D0 pi-")
  324. dstars = ParticleContainersMerger([dstarp, dstarm])
  325. pisoft_pt = Monitor__ParticleRange(
  326. Input=pitag,
  327. Variable=F.PT,
  328. HistogramName=f"/{name}/pisoft_PT",
  329. Bins=50,
  330. Range=(0 * MeV, 1000 * MeV),
  331. )
  332. delta_m = Monitor__ParticleRange(
  333. Input=dstars,
  334. Variable=F.MASS - F.CHILD(1, F.MASS),
  335. HistogramName=f"/{name}/delta_m",
  336. Bins=200,
  337. Range=(100 * MeV, 200 * MeV),
  338. )
  339. pi1 = Monitor__ParticleRange(
  340. Input=dzeros,
  341. Variable=F.CHILD(1, F.CHILD(1, F.PT)),
  342. HistogramName=f"/{name}/pi_d1",
  343. Bins=200,
  344. Range=(0 * MeV, 3000 * MeV),
  345. )
  346. pi2 = Monitor__ParticleRange(
  347. Input=dzeros,
  348. Variable=F.CHILD(1, F.CHILD(2, F.PT)),
  349. HistogramName=f"/{name}/pi_d2",
  350. Bins=200,
  351. Range=(0 * MeV, 3000 * MeV),
  352. )
  353. pi3 = Monitor__ParticleRange(
  354. Input=dzeros,
  355. Variable=F.CHILD(2, F.CHILD(1, F.PT)),
  356. HistogramName=f"/{name}/pi_d3",
  357. Bins=200,
  358. Range=(0 * MeV, 3000 * MeV),
  359. )
  360. pi4 = Monitor__ParticleRange(
  361. Input=dzeros,
  362. Variable=F.CHILD(2, F.CHILD(2, F.PT)),
  363. HistogramName=f"/{name}/pi_d4",
  364. Bins=200,
  365. Range=(0 * MeV, 3000 * MeV),
  366. )
  367. return Hlt2Line(
  368. name=name, algs=charm_prefilters() + [dd_kshorts, dzeros, dstars, pisoft_pt, delta_m, pi1, pi2, pi3, pi4])
  369. @register_line_builder(all_lines)
  370. def dst_to_d0pi_d0toksks_ulll_tightline(
  371. name="Hlt2Charm_DstpToD0Pip_D0ToKsKs_ULLL_Tight"):
  372. pvs = make_pvs()
  373. ll_kshorts = _make_ll_ks_tight_ULLL()
  374. ul_kshorts = _make_ul_ks_tight()
  375. dzeros = ParticleCombiner(
  376. [ll_kshorts, ul_kshorts],
  377. DecayDescriptor="D0 -> KS0 KS0",
  378. name="Charm_D0ToKsKs_D0ToKsKs_ULLL_Tight",
  379. AllowDiffInputsForSameIDChildren=True,
  380. CombinationCut=F.require_all(
  381. in_range(1730 * MeV, F.MASS, 2000 * MeV),
  382. F.SUM(F.PT) > 1500 * MeV,
  383. ),
  384. CompositeCut=F.require_all(
  385. in_range(1775 * MeV, F.MASS, 1955 * MeV),
  386. F.CHI2DOF < 10,
  387. F.BPVDIRA(pvs) > 0.9994,
  388. ),
  389. )
  390. pitag = make_tagging_pions()
  391. dstarp = _make_dstars_tight(dzeros, make_tagging_pions(), "D*(2010)+ -> D0 pi+")
  392. dstarm = _make_dstars_tight(dzeros, make_tagging_pions(), "D*(2010)- -> D0 pi-")
  393. dstars = ParticleContainersMerger([dstarp, dstarm])
  394. pisoft_pt = Monitor__ParticleRange(
  395. Input=pitag,
  396. Variable=F.PT,
  397. HistogramName=f"/{name}/pisoft_PT",
  398. Bins=50,
  399. Range=(0 * MeV, 1000 * MeV),
  400. )
  401. delta_m = Monitor__ParticleRange(
  402. Input=dstars,
  403. Variable=F.MASS - F.CHILD(1, F.MASS),
  404. HistogramName=f"/{name}/delta_m",
  405. Bins=200,
  406. Range=(100 * MeV, 200 * MeV),
  407. )
  408. pi1 = Monitor__ParticleRange(
  409. Input=ul_kshorts,
  410. Variable=F.CHILD(1, F.PT),
  411. HistogramName=f"/{name}/pi_u",
  412. Bins=200,
  413. Range=(0 * MeV, 3000 * MeV),
  414. )
  415. pi2 = Monitor__ParticleRange(
  416. Input=ul_kshorts,
  417. Variable=F.CHILD(2, F.PT),
  418. HistogramName=f"/{name}/pi_l1",
  419. Bins=200,
  420. Range=(0 * MeV, 3000 * MeV),
  421. )
  422. pi3 = Monitor__ParticleRange(
  423. Input=ll_kshorts,
  424. Variable=F.CHILD(1, F.PT),
  425. HistogramName=f"/{name}/pi_l2",
  426. Bins=200,
  427. Range=(0 * MeV, 3000 * MeV),
  428. )
  429. pi4 = Monitor__ParticleRange(
  430. Input=ll_kshorts,
  431. Variable=F.CHILD(2, F.PT),
  432. HistogramName=f"/{name}/pi_l3",
  433. Bins=200,
  434. Range=(0 * MeV, 3000 * MeV),
  435. )
  436. return Hlt2Line(
  437. name=name, algs=charm_prefilters() + [ul_kshorts, dzeros, dstars, pisoft_pt, delta_m, pi1, pi2, pi3, pi4])
  438. @register_line_builder(all_lines)
  439. def dst_to_d0pi_d0toksks_uldd_tightline(
  440. name="Hlt2Charm_DstpToD0Pip_D0ToKsKs_ULDD_Tight"):
  441. pvs = make_pvs()
  442. dd_kshorts = _make_dd_ks_tight()
  443. ul_kshorts = _make_ul_ks_tight()
  444. dzeros = ParticleCombiner(
  445. [dd_kshorts, ul_kshorts],
  446. DecayDescriptor="D0 -> KS0 KS0",
  447. name="Charm_D0ToKsKs_D0ToKsKs_ULDD_Tight",
  448. AllowDiffInputsForSameIDChildren=True,
  449. CombinationCut=F.require_all(
  450. in_range(1730 * MeV, F.MASS, 2000 * MeV),
  451. F.SUM(F.PT) > 1500 * MeV,
  452. ),
  453. CompositeCut=F.require_all(
  454. in_range(1775 * MeV, F.MASS, 1955 * MeV),
  455. F.CHI2DOF < 10,
  456. F.BPVDIRA(pvs) > 0.9994,
  457. ),
  458. )
  459. pitag = make_tagging_pions()
  460. dstarp = _make_dstars_tight(dzeros, pitag, "D*(2010)+ -> D0 pi+")
  461. dstarm = _make_dstars_tight(dzeros, pitag, "D*(2010)- -> D0 pi-")
  462. dstars = ParticleContainersMerger([dstarp, dstarm])
  463. pisoft_pt = Monitor__ParticleRange(
  464. Input=pitag,
  465. Variable=F.PT,
  466. HistogramName=f"/{name}/pisoft_PT",
  467. Bins=50,
  468. Range=(0 * MeV, 1000 * MeV),
  469. )
  470. delta_m = Monitor__ParticleRange(
  471. Input=dstars,
  472. Variable=F.MASS - F.CHILD(1, F.MASS),
  473. HistogramName=f"/{name}/delta_m",
  474. Bins=200,
  475. Range=(100 * MeV, 200 * MeV),
  476. )
  477. pi1 = Monitor__ParticleRange(
  478. Input=ul_kshorts,
  479. Variable=F.CHILD(1, F.PT),
  480. HistogramName=f"/{name}/pi_u",
  481. Bins=200,
  482. Range=(0 * MeV, 3000 * MeV),
  483. )
  484. pi2 = Monitor__ParticleRange(
  485. Input=ul_kshorts,
  486. Variable=F.CHILD(2, F.PT),
  487. HistogramName=f"/{name}/pi_l",
  488. Bins=200,
  489. Range=(0 * MeV, 3000 * MeV),
  490. )
  491. pi3 = Monitor__ParticleRange(
  492. Input=dd_kshorts,
  493. Variable=F.CHILD(1, F.PT),
  494. HistogramName=f"/{name}/pi_d1",
  495. Bins=200,
  496. Range=(0 * MeV, 3000 * MeV),
  497. )
  498. pi4 = Monitor__ParticleRange(
  499. Input=dd_kshorts,
  500. Variable=F.CHILD(2, F.PT),
  501. HistogramName=f"/{name}/pi_d2",
  502. Bins=200,
  503. Range=(0 * MeV, 3000 * MeV),
  504. )
  505. return Hlt2Line(
  506. name=name, algs=charm_prefilters() + [ul_kshorts, dzeros, dstars, pisoft_pt, delta_m, pi1, pi2, pi3, pi4])
  507. @register_line_builder(all_lines)
  508. def dst_to_d0pi_d0toksks_lddd_tightline(
  509. name="Hlt2Charm_DstpToD0Pip_D0ToKsKs_LDDD_Tight"):
  510. pvs = make_pvs()
  511. dd_kshorts = _make_dd_ks_tight()
  512. ld_kshorts = _make_ld_ks_tight()
  513. dzeros = ParticleCombiner(
  514. [dd_kshorts, ld_kshorts],
  515. DecayDescriptor="D0 -> KS0 KS0",
  516. name="Charm_D0ToKsKs_D0ToKsKs_LDDD_Tight",
  517. AllowDiffInputsForSameIDChildren=True,
  518. CombinationCut=F.require_all(
  519. in_range(1730 * MeV, F.MASS, 2000 * MeV),
  520. F.SUM(F.PT) > 1500 * MeV,
  521. ),
  522. CompositeCut=F.require_all(
  523. in_range(1775 * MeV, F.MASS, 1955 * MeV),
  524. F.CHI2DOF < 10,
  525. F.BPVDIRA(pvs) > 0.9994,
  526. ),
  527. )
  528. pitag = make_tagging_pions()
  529. dstarp = _make_dstars_tight(dzeros, pitag, "D*(2010)+ -> D0 pi+")
  530. dstarm = _make_dstars_tight(dzeros, pitag, "D*(2010)- -> D0 pi-")
  531. dstars = ParticleContainersMerger([dstarp, dstarm])
  532. pisoft_pt = Monitor__ParticleRange(
  533. Input=pitag,
  534. Variable=F.PT,
  535. HistogramName=f"/{name}/pisoft_PT",
  536. Bins=50,
  537. Range=(0 * MeV, 1000 * MeV),
  538. )
  539. delta_m = Monitor__ParticleRange(
  540. Input=dstars,
  541. Variable=F.MASS - F.CHILD(1, F.MASS),
  542. HistogramName=f"/{name}/delta_m",
  543. Bins=200,
  544. Range=(100 * MeV, 200 * MeV),
  545. )
  546. pi1 = Monitor__ParticleRange(
  547. Input=ld_kshorts,
  548. Variable=F.CHILD(1, F.PT),
  549. HistogramName=f"/{name}/pi_l",
  550. Bins=200,
  551. Range=(0 * MeV, 3000 * MeV),
  552. )
  553. pi2 = Monitor__ParticleRange(
  554. Input=ld_kshorts,
  555. Variable=F.CHILD(2, F.PT),
  556. HistogramName=f"/{name}/pi_d",
  557. Bins=200,
  558. Range=(0 * MeV, 3000 * MeV),
  559. )
  560. pi3 = Monitor__ParticleRange(
  561. Input=dd_kshorts,
  562. Variable=F.CHILD(1, F.PT),
  563. HistogramName=f"/{name}/pi_d2",
  564. Bins=200,
  565. Range=(0 * MeV, 3000 * MeV),
  566. )
  567. pi4 = Monitor__ParticleRange(
  568. Input=dd_kshorts,
  569. Variable=F.CHILD(2, F.PT),
  570. HistogramName=f"/{name}/pi_d3",
  571. Bins=200,
  572. Range=(0 * MeV, 3000 * MeV),
  573. )
  574. return Hlt2Line(
  575. name=name, algs=charm_prefilters() + [ld_kshorts, dzeros, dstars, pisoft_pt, delta_m, pi1, pi2, pi3, pi4])
  576. @register_line_builder(all_lines)
  577. def dst_to_d0pi_d0toksks_llld_tightline(
  578. name="Hlt2Charm_DstpToD0Pip_D0ToKsKs_LLLD_Tight"):
  579. pvs = make_pvs()
  580. ll_kshorts = _make_ll_ks_tight()
  581. ld_kshorts = _make_ld_ks_tight()
  582. dzeros = ParticleCombiner(
  583. [ll_kshorts, ld_kshorts],
  584. DecayDescriptor="D0 -> KS0 KS0",
  585. name="Charm_D0ToKsKs_D0ToKsKs_LLLD_Tight",
  586. AllowDiffInputsForSameIDChildren=True,
  587. CombinationCut=F.require_all(
  588. in_range(1730 * MeV, F.MASS, 2000 * MeV),
  589. F.SUM(F.PT) > 1500 * MeV,
  590. ),
  591. CompositeCut=F.require_all(
  592. in_range(1775 * MeV, F.MASS, 1955 * MeV),
  593. F.CHI2DOF < 10,
  594. F.BPVDIRA(pvs) > 0.9994,
  595. ),
  596. )
  597. pitag = make_tagging_pions()
  598. dstarp = _make_dstars_tight(dzeros, pitag, "D*(2010)+ -> D0 pi+")
  599. dstarm = _make_dstars_tight(dzeros, pitag, "D*(2010)- -> D0 pi-")
  600. dstars = ParticleContainersMerger([dstarp, dstarm])
  601. pisoft_pt = Monitor__ParticleRange(
  602. Input=pitag,
  603. Variable=F.PT,
  604. HistogramName=f"/{name}/pisoft_PT",
  605. Bins=50,
  606. Range=(0 * MeV, 1000 * MeV),
  607. )
  608. delta_m = Monitor__ParticleRange(
  609. Input=dstars,
  610. Variable=F.MASS - F.CHILD(1, F.MASS),
  611. HistogramName=f"/{name}/delta_m",
  612. Bins=200,
  613. Range=(100 * MeV, 200 * MeV),
  614. )
  615. pi1 = Monitor__ParticleRange(
  616. Input=ll_kshorts,
  617. Variable=F.CHILD(1, F.PT),
  618. HistogramName=f"/{name}/pi_l1",
  619. Bins=200,
  620. Range=(0 * MeV, 3000 * MeV),
  621. )
  622. pi2 = Monitor__ParticleRange(
  623. Input=ll_kshorts,
  624. Variable=F.CHILD(2, F.PT),
  625. HistogramName=f"/{name}/pi_l2",
  626. Bins=200,
  627. Range=(0 * MeV, 3000 * MeV),
  628. )
  629. pi3 = Monitor__ParticleRange(
  630. Input=ld_kshorts,
  631. Variable=F.CHILD(1, F.PT),
  632. HistogramName=f"/{name}/pi_l3",
  633. Bins=200,
  634. Range=(0 * MeV, 3000 * MeV),
  635. )
  636. pi4 = Monitor__ParticleRange(
  637. Input=ld_kshorts,
  638. Variable=F.CHILD(2, F.PT),
  639. HistogramName=f"/{name}/pi_d",
  640. Bins=200,
  641. Range=(0 * MeV, 3000 * MeV),
  642. )
  643. return Hlt2Line(
  644. name=name, algs=charm_prefilters() + [ld_kshorts, dzeros, dstars, pisoft_pt, delta_m, pi1, pi2, pi3, pi4])