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