9from darkphoton
import alphaQED
10from scipy.integrate
import dblquad
15protonMomentum = math.sqrt(protonEnergy * protonEnergy - mProton * mProton)
20 """From https://arxiv.org/abs/0910.5589"""
22 f1ra = 0.6165340033101271
23 f1rb = 0.22320420111672623
24 f1rc = -0.33973820442685326
25 f1wa = 1.0117544786579074
26 f1wb = -0.8816565944110686
27 f1wc = 0.3699021157531611
28 f1prho = f1ra * 0.77**2 / (0.77**2 - m**2 - 0.77 * 0.15j)
29 f1prhop = f1rb * 1.25**2 / (1.25**2 - m**2 - 1.25 * 0.3j)
30 f1prhopp = f1rc * 1.45**2 / (1.45**2 - m**2 - 1.45 * 0.5j)
31 f1pomega = f1wa * 0.77**2 / (0.77**2 - m**2 - 0.77 * 0.0085j)
32 f1pomegap = f1wb * 1.25**2 / (1.25**2 - m**2 - 1.25 * 0.3j)
33 f1pomegapp = f1wc * 1.45**2 / (1.45**2 - m**2 - 1.45 * 0.5j)
34 return abs(f1prho + f1prhop + f1prhopp + f1pomega + f1pomegap + f1pomegapp)
39 """Compute energy from momentum and mass"""
40 return math.sqrt(p * p + m * m)
44 """Penalty factor for high masses - dipole form factor in the proton-A' vertex"""
47 return math.pow(m * m / 0.71, -4)
53 """Fraction of the proton momentum carried away by the paraphoton in the beam direction"""
54 return p / (protonMomentum * math.sqrt(theta * theta + 1.0))
58 """Paraphoton transverse momentum in the lab frame"""
59 return protonMomentum * theta *
zeta(p, theta)
63 """Square paraphoton transverse momentum in the lab frame"""
67def H(p, theta, mDarkPhoton):
68 """A kinematic term"""
71 + (1.0 -
zeta(p, theta)) * mDarkPhoton * mDarkPhoton
72 + pow(
zeta(p, theta), 2.0) * mProton * mProton
76def wba(p, theta, mDarkPhoton, epsilon):
77 """Cross section weighting function in the Fermi-Weizsaeker-Williams approximation"""
78 const = epsilon * epsilon * alphaQED / (2.0 * math.pi *
H(p, theta, mDarkPhoton))
80 h2 = pow(
H(p, theta, mDarkPhoton), 2.0)
81 oneMinusZSquare = pow(1.0 -
zeta(p, theta), 2.0)
82 mp2 = mProton * mProton
83 mA2 = mDarkPhoton * mDarkPhoton
85 p1 = (1.0 + oneMinusZSquare) /
zeta(p, theta)
89 * (1.0 -
zeta(p, theta))
90 * ((2.0 * mp2 + mA2) /
H(p, theta, mDarkPhoton) - pow(
zeta(p, theta), 2.0) * 2.0 * mp2 * mp2 / h2)
93 p3 = 2.0 *
zeta(p, theta) * (1.0 -
zeta(p, theta)) * (1 + oneMinusZSquare) * mp2 * mA2 / h2
94 p4 = 2.0 *
zeta(p, theta) * oneMinusZSquare * mA2 * mA2 / h2
95 return const * (p1 - p2 + p3 + p4)
99 """Parametrisation of sigma(s)"""
107 p1 = a2 * pow(math.log(s / a3), 2.0)
108 p2 = a4 * pow((1.0 / s), a5)
109 p3 = a7 * pow((1.0 / s), a6)
110 return a1 + p1 - p2 + p3
113def es(p, mDarkPhoton):
115 return 2.0 * mProton * (
energy(protonMomentum, mProton) -
energy(p, mDarkPhoton))
119 """sigma(s') / sigma(s)"""
120 return sigma(
es(p, mDarkPhoton)) /
sigma(2.0 * mProton *
energy(protonMomentum, mProton))
124 """Differential A' rate per p.o.t. as a function of Z and Pt^2"""
125 return sigmaRatio(p, mDarkPhoton) *
wba(p, theta, mDarkPhoton, epsilon)
129 """Jacobian Pt^2->theta"""
130 z2 = pow(
zeta(p, theta), 2.0)
131 return 2.0 * theta * z2 * protonMomentum * protonMomentum
136 return 1.0 / (protonMomentum * math.sqrt(theta * theta + 1.0))
140 """Differential A' rate per p.o.t. as a function of P and theta"""
142 return math.fabs(diffRate)
146 return max(0.14 * protonMomentum, mDarkPhoton)
151 return math.sqrt((
energy(protonMomentum, mProton) ** 2.0 - mDarkPhoton**2.0) - mDarkPhoton**2.0)
154def prodRate(mDarkPhoton, epsilon, tmin=-0.5 * math.pi, tmax=0.5 * math.pi):
155 """dNdPdTheta integrated over p and theta"""
160 lambda x:
pMin(mDarkPhoton),
161 lambda x:
pMax(mDarkPhoton),
162 args=(mDarkPhoton, epsilon),
180 """Probability density function for A' production in SHIP"""
181 return (1.0 / norm) *
dNdPdTheta(p, theta, mDarkPhoton, epsilon)
184def hProdPDF(mDarkPhoton, epsilon, norm, binsp, binstheta, tmin=-0.5 * math.pi, tmax=0.5 * math.pi, suffix=""):
185 """Histogram of the PDF for A' production in SHIP"""
186 angles = np.linspace(tmin, tmax, binstheta).tolist()
187 anglestep = 2.0 * (tmax - tmin) / binstheta
188 momentumStep = (
pMax(mDarkPhoton) -
pMin(mDarkPhoton)) / (binsp - 1)
189 momenta = np.linspace(
pMin(mDarkPhoton),
pMax(mDarkPhoton), binsp, endpoint=
False).tolist()
191 f
"hPDF_eps{epsilon}_m{mDarkPhoton}",
192 f
"hPDF_eps{epsilon}_m{mDarkPhoton}",
194 pMin(mDarkPhoton) - 0.5 * momentumStep,
195 pMax(mDarkPhoton) - 0.5 * momentumStep,
197 tmin - 0.5 * anglestep,
198 tmax - 0.5 * anglestep,
200 hPDF.SetTitle(f
"PDF for A' production (m_{{A'}}={mDarkPhoton} GeV, #epsilon ={epsilon})")
201 hPDF.GetXaxis().SetTitle(
"P_{A'} [GeV]")
202 hPDF.GetYaxis().SetTitle(
"#theta_{A'} [rad]")
204 f
"hPDFtheta_eps{epsilon}_m{mDarkPhoton}",
205 f
"hPDFtheta_eps{epsilon}_m{mDarkPhoton}",
207 tmin - 0.5 * anglestep,
208 tmax - 0.5 * anglestep,
211 f
"hPDFp_eps{epsilon}_m{mDarkPhoton}",
212 f
"hPDFp_eps{epsilon}_m{mDarkPhoton}",
214 pMin(mDarkPhoton) - 0.5 * momentumStep,
215 pMax(mDarkPhoton) - 0.5 * momentumStep,
217 hPDFp.GetXaxis().SetTitle(
"P_{A'} [GeV]")
218 hPDFtheta.GetXaxis().SetTitle(
"#theta_{A'} [rad]")
222 hPDF.Fill(p, theta, w)
223 hPDFtheta.Fill(theta, w)
225 hPdfFilename = sys.modules[
"__main__"].options.outputDir + f
"/ParaPhoton_eps{epsilon}_m{mDarkPhoton}{suffix}.root"
226 outfile = r.TFile(hPdfFilename,
"recreate")
def prodRate(mDarkPhoton, epsilon, tmin=-0.5 *math.pi, tmax=0.5 *math.pi)
def dNdZdPtSquare(p, mDarkPhoton, theta, epsilon)
def pTransverse(p, theta)
def wba(p, theta, mDarkPhoton, epsilon)
def dNdPdTheta(p, theta, mDarkPhoton, epsilon)
def sigmaRatio(p, mDarkPhoton)
def normalisedProductionPDF(p, theta, mDarkPhoton, epsilon, norm)
def H(p, theta, mDarkPhoton)
def hProdPDF(mDarkPhoton, epsilon, norm, binsp, binstheta, tmin=-0.5 *math.pi, tmax=0.5 *math.pi, suffix="")