FairShip
Loading...
Searching...
No Matches
dpProductionRates.py
Go to the documentation of this file.
1# SPDX-License-Identifier: LGPL-3.0-or-later
2# SPDX-FileCopyrightText: Copyright CERN for the benefit of the SHiP Collaboration
3
4import math
5
6import proton_bremsstrahlung
7import ROOT
8
9PDG = ROOT.TDatabasePDG.Instance()
10protonFlux = 2e20
11
12
13def isDP(pdg):
14 return bool(pdg == 9900015 or pdg == 4900023)
15
16
17def pbremProdRateVDM(mass, epsilon, doprint=True):
18 xswg = proton_bremsstrahlung.prodRate(mass, epsilon)
19 if doprint:
20 print("A' production rate per p.o.t: \t %.8g" % (xswg))
22 if doprint:
23 print("A' rho form factor: \t %.8g" % rhoff)
24 if doprint:
25 print("A' rescaled production rate per p.o.t:\t %.8g" % (xswg * rhoff))
26 return xswg * rhoff
27
28
29def pbremProdRateDipole(mass, epsilon, doprint=False):
30 xswg = proton_bremsstrahlung.prodRate(mass, epsilon)
31 if doprint:
32 print("A' production rate per p.o.t: \t %.8g" % (xswg))
34 if doprint:
35 print("A' penalty factor: \t %.8g" % penalty)
36 if doprint:
37 print("A' rescaled production rate per p.o.t:\t %.8g" % (xswg * penalty))
38 return xswg * penalty
39
40
41# obtained with Pythia8: average number of meson expected per p.o.t from inclusive pp to X production, 100k events produced
43 if mumPdg == 111:
44 return 6.166
45 if mumPdg == 221:
46 return 0.7012
47 if mumPdg == 223:
48 return 0.8295
49 if mumPdg == 331:
50 return 0.07825
51 print(" -- ERROR, unknown mother pdgId %d" % mumPdg)
52 return 0
53
54
55# from the PDG, decay to photon channels available for mixing with DP
56def mesonBRtoPhoton(mumPdg, doprint=False):
57 br = 1
58 if mumPdg == 111:
59 br = 0.9879900
60 if mumPdg == 221:
61 br = 0.3931181
62 if mumPdg == 223:
63 br = 0.0834941
64 if mumPdg == 331:
65 br = 0.0219297
66 if doprint:
67 print("BR of %d meson to photons: %.8g" % (mumPdg, br))
68 return br
69
70
71def brMesonToGammaDP(mass, epsilon, mumPdg, doprint=False):
72 mMeson = PDG.GetParticle(mumPdg).Mass()
73 if doprint:
74 print("Mass of mother %d meson is %3.3f" % (mumPdg, mMeson))
75 if mass < mMeson:
76 br = 2 * epsilon**2 * pow((1 - mass**2 / mMeson**2), 3) * mesonBRtoPhoton(mumPdg, doprint)
77 else:
78 br = 0
79 if doprint:
80 print("Branching ratio of %d meson to DP is %.8g" % (mumPdg, br))
81 return br
82
83
84def brMesonToMesonDP(mass, epsilon, mumPdg, dauPdg, doprint=False):
85 mMeson = PDG.GetParticle(mumPdg).Mass()
86 mDaughterMeson = PDG.GetParticle(dauPdg).Mass()
87 if doprint:
88 print("Mass of mother %d meson is %3.3f" % (mumPdg, mMeson))
89 if doprint:
90 print("Mass of daughter %d meson is %3.3f" % (dauPdg, mDaughterMeson))
91 if mass < (mMeson - mDaughterMeson):
92 fac1 = pow(mMeson**2.0 - mDaughterMeson**2.0, -3.0)
93 fac2 = pow((mass**2.0 - (mMeson + mDaughterMeson) ** 2.0) * (mass**2.0 - (mMeson - mDaughterMeson) ** 2.0), 1.5)
94 massfactor = fac1 * fac2
95 br = (epsilon**2.0) * mesonBRtoPhoton(mumPdg, doprint) * massfactor
96 else:
97 br = 0
98 if doprint:
99 print("Branching ratio of %d meson to DP is %.8g" % (mumPdg, br))
100 return br
101
102
103def brMesonToDP(mass, epsilon, mumPdg, doprint=False):
104 if mumPdg == 223:
105 return brMesonToMesonDP(mass, epsilon, mumPdg, 111, doprint)
106 elif mumPdg == 111 or mumPdg == 221:
107 return brMesonToGammaDP(mass, epsilon, mumPdg, doprint)
108 elif mumPdg == 331:
109 return brMesonToMesonDP(mass, epsilon, mumPdg, 113, doprint), brMesonToGammaDP(mass, epsilon, mumPdg, doprint)
110 else:
111 print("Warning! Unknown mother pdgId %d, not implemented. Setting br to 0." % mumPdg)
112 return 1
113
114
115def mesonProdRate(mass, epsilon, mumPdg, doprint=False):
116 brM2DP = brMesonToDP(mass, epsilon, mumPdg, doprint)
117 if mumPdg == 331:
118 avgMeson = getAverageMesonRate(mumPdg) * brM2DP[0]
119 avgMeson1 = getAverageMesonRate(mumPdg) * brM2DP[1]
120 return avgMeson * 0.6, avgMeson1 * 0.6
121 # return avgMeson + avgMeson1
122 if mumPdg != 331:
123 avgMeson = getAverageMesonRate(mumPdg) * brM2DP
124 return avgMeson * 0.6
125
126
127# from interpolation of Pythia XS, normalised to epsilon^2
128def qcdprodRate(mass, epsilon, doprint=False):
129 xs = 0.0
130 if mass > 3.0:
131 xs = math.exp(-5.928 - 0.8669 * mass)
132 elif mass > 1.4:
133 xs = math.exp(-4.1477 - 1.4745 * mass)
134 else:
135 xs = 0.0
136 return xs * epsilon * epsilon
137
138
139def getDPprodRate(mass, epsilon, prodMode, mumPdg, doprint=False):
140 if "pbrem" in prodMode:
141 print("VDM")
142 return pbremProdRateVDM(mass, epsilon, doprint)
143 elif "pbrem1" in prodMode:
144 print("Dipole")
145 return pbremProdRateDipole(mass, epsilon, doprint)
146 elif "meson" in prodMode:
147 return mesonProdRate(mass, epsilon, mumPdg, doprint)
148 elif "qcd" in prodMode:
149 return qcdprodRate(mass, epsilon, doprint)
150 else:
151 print("Unknown production mode! Choose among pbrem, meson or qcd.")
152 return 1
def getAverageMesonRate(mumPdg)
def pbremProdRateVDM(mass, epsilon, doprint=True)
def mesonBRtoPhoton(mumPdg, doprint=False)
def getDPprodRate(mass, epsilon, prodMode, mumPdg, doprint=False)
def brMesonToDP(mass, epsilon, mumPdg, doprint=False)
def qcdprodRate(mass, epsilon, doprint=False)
def pbremProdRateDipole(mass, epsilon, doprint=False)
def mesonProdRate(mass, epsilon, mumPdg, doprint=False)
def brMesonToGammaDP(mass, epsilon, mumPdg, doprint=False)
def brMesonToMesonDP(mass, epsilon, mumPdg, dauPdg, doprint=False)
def prodRate(mDarkPhoton, epsilon, tmin=-0.5 *math.pi, tmax=0.5 *math.pi)