5# ==================================================================
41pdg = ROOT.TDatabasePDG.Instance()
46 Trim particle name for use
with the PDG database
48 if "down" in particle:
52 if "strange" in particle:
54 if "charm" in particle:
56 if "bottom" in particle:
58 if "beauty" in particle:
63 particle = particle.replace(
"1",
"'")
68 or (
"nu_" in particle)
69 or (
"eta" in particle)
70 or (
"phi" in particle)
71 )
and (particle
not in [
"d",
"u",
"s",
"c",
"b",
"t"]):
78 Read particle ID from PDG database
80 particle = PDGname(particle)
81 tPart = pdg.GetParticle(particle)
82 return int(tPart.PdgCode())
87 Read particle mass from PDG database
89 particle = PDGname(particle)
90 tPart = pdg.GetParticle(particle)
96 Read particle width from PDG database
98 particle = PDGname(particle)
99 tPart = pdg.GetParticle(particle)
105 Read particle lifetime from PDG database
107 particle = PDGname(particle)
108 tPart = pdg.GetParticle(particle)
109 if particle ==
"D0" or particle ==
"D0bar":
111 elif particle ==
"D+" or particle ==
"D-":
113 elif particle ==
"D_s+" or particle ==
"D_s-":
115 elif particle ==
"B0" or particle ==
"B0bar":
117 elif particle ==
"B+" or particle ==
"B-":
120 return tPart.Lifetime()
125 Store some constants useful for HNL physics
132 "K_L0": 0.156 / math.sqrt(2) * u.GeV,
133 "K_S0": 0.156 / math.sqrt(2) * u.GeV,
134 "K*0": 0.230 * u.GeV,
135 "K*0_bar": 0.230 * u.GeV,
136 "K*+": 0.230 * u.GeV,
137 "K*-": 0.230 * u.GeV,
138 "phi": 0.230 * u.GeV,
139 "eta": -0.142 * u.GeV,
140 "eta'": 0.038 * u.GeV,
142 "D*+": 0.205 * u.GeV,
144 "D*-": 0.205 * u.GeV,
145 "D_s+": 0.259 * u.GeV,
146 "D*_s+": 0.259 * u.GeV,
147 "D_s-": 0.259 * u.GeV,
148 "D*_s-": 0.259 * u.GeV,
152 "B_s0": 0.228 * u.GeV,
153 "B0_bar": 0.191 * u.GeV,
154 "B_s0_bar": 0.228 * u.GeV,
157 self.
GF = 1.166379e-05 / (u.GeV * u.GeV)
158 self.
MW = 80.385 * u.GeV
159 self.
gW2 = self.
GF / math.sqrt(2) * 8 * self.
MW * self.
MW
162 self.
heV = 6.58211928 * pow(10.0, -16)
170 "tneutrino": self.
gW2 * self.
t2thetaw * 1.0 / 32.0,
180 Lifetime and total
and partial decay widths of an RPV neutralino
183 def __init__(self, mass, couplings, sfmass, benchmark, debug: bool =
False) ->
None:
185 Initialize with mass
and couplings of the RPV neutralino
189 which benchmark scenario (1,2,3,4,5)
190 couplings (list of [\
lambda production, \
lambda decay])
191 sfermion mass to normalise the couplings by (GeV)
193 self.MN = mass * u.GeV
195 self.U2 = [ui * ui for ui
in self.
U]
199 1: [
"N -> K+ mu-",
"N -> K*+ mu-",
"N -> K*0 nu_mu",
"N -> K_L0 nu_mu",
"N -> K_S0 nu_mu"],
210 3: [
"N -> K+ mu-",
"N -> K*+ mu-",
"N -> K*0 nu_mu",
"N -> K_L0 nu_mu",
"N -> K_S0 nu_mu"],
211 4: [
"N -> D+ mu-",
"N -> D*+ mu-",
"N -> K*0 nu_mu",
"N -> K_L0 nu_mu",
"N -> K_S0 nu_mu"],
212 5: [
"N -> K+ tau-",
"N -> K*+ tau-",
"N -> K*0 nu_tau",
"N -> K_L0 nu_tau",
"N -> K_S0 nu_tau"],
217 2: [
"D_s+ -> N mu+"],
218 3: [
"B0 -> N nu_mu"],
219 4: [
"B0 -> N nu_mu"],
220 5: [
"B0 -> N nu_tau",
"B+ -> N tau+"],
224 print(
"RPVSUSYbranchings instance initialized with couplings:")
225 print(
"\t benchmark scenario = %d" % self.
bench)
226 print(
"\t decay coupling = %s" % self.
U[0])
227 print(
"\t production coupling = %s" % self.
U[1])
228 print(
"\t sfermion mass = %s" % self.
sfmass)
229 print(
"\t total prod coupling = %s" % (self.
U[0] / self.
sfmass**2))
230 print(
"\t total decay coupling = %s" % (self.
U[1] / self.
sfmass**2))
232 print(
"\tm = %s GeV" % (self.
MN))
242 for decay
in decays_tmp:
244 decay_cpy = decay_cpy.replace(
"N -> ",
"")
245 particles = decay_cpy.split()
246 codes = [
PDGcode(p)
for p
in particles]
250 any(
"K+" in s
for s
in particles)
251 or any(
"K-" in s
for s
in particles)
252 or any(
"K*+" in s
for s
in particles)
253 or any(
"K*-" in s
for s
in particles)
254 or any(
"K*0" in s
for s
in particles)
255 or any(
"K*0_bar" in s
for s
in particles)
259 "9900015:addChannel = 1 {:.12} 0 {}".format(bf,
" ".join(str(code)
for code
in codes))
262 "9900015:addChannel = 1 {:.12} 0 {}".format(bf,
" ".join(str(-code)
for code
in codes))
266 "9900015:addChannel = 1 {:.12} 0 {}".format(bf,
" ".join(str(code)
for code
in codes))
269 print(
"debug readdecay table", particles, codes, bf)
273 Returns the RPV neutralino decay width into neutral meson and lepton
276 - H
is a string (name of the meson)
277 - L
is a string (name of the lepton)
279 if (mass(H) + mass(L)) > self.
MN:
286 - 2 * self.
MN**2 * mass(H) ** 2
287 - 2 * self.
MN**2 * mass(L) ** 2
288 - 2 * mass(H) ** 2 * mass(L) ** 2
291 if "nu_mu" in L
or "nu_e" in L
or "nu_tau" in L:
294 / (self.
sfmass**4 * 128 * u.pi * self.
MN**3)
295 * c.GST2[
"sneutrino"]
296 * c.decayConstant[H] ** 2
297 * (self.
MN**2 + mass(L) ** 2 - mass(H) ** 2)
302 / (self.
sfmass**4 * 128 * u.pi * self.
MN**3)
304 * c.decayConstant[H] ** 2
305 * (self.
MN**2 + mass(L) ** 2 - mass(H) ** 2)
308 if "K*" in H
or "D*" in H
or "phi" in H:
309 if "nu_mu" in L
or "nu_e" in L
or "nu_tau" in L:
312 / (self.
sfmass**4 * 2 * u.pi * self.
MN**3)
313 * c.GST2[
"tneutrino"]
314 * c.decayConstant[H] ** 2
315 * (2 * (self.
MN**2 - mass(L) ** 2) ** 2 - mass(H) ** 2 * (mass(H) ** 2 + self.
MN**2 + mass(L) ** 2))
320 / (self.
sfmass**4 * 2 * u.pi * self.
MN**3)
322 * c.decayConstant[H] ** 2
323 * (2 * (self.
MN**2 - mass(L) ** 2) ** 2 - mass(H) ** 2 * (mass(H) ** 2 + self.
MN**2 + mass(L) ** 2))
325 width = self.
U2[1] * tmp_width
327 if self.
bench == 1
and (
"K_" in H
or "K*" in H):
328 width = (self.
U2[0] + self.
U2[1]) * tmp_width
330 if self.
bench == 2
and (
"eta" in H
or "phi" in H):
331 width = self.
U2[0] * tmp_width
339 Returns the Meson decay width to RPV neutralino and lepton
341 - H
is a string (name of the meson)
342 - L
is a string (name of the lepton)
345 if mass(H) < (self.
MN + mass(L)):
351 - 2 * self.
MN**2 * mass(H) ** 2
352 - 2 * self.
MN**2 * mass(L) ** 2
353 - 2 * mass(H) ** 2 * mass(L) ** 2
357 if "nu_mu" in L
or "nu_e" in L
or "nu_tau" in L:
360 / (self.
sfmass**4 * 64 * u.pi * mass(H) ** 3)
361 * c.GST2[
"sneutrino"]
362 * c.decayConstant[H] ** 2
363 * (mass(H) ** 2 - self.
MN**2 - mass(L) ** 2)
368 / (self.
sfmass**4 * 64 * u.pi * mass(H) ** 3)
370 * c.decayConstant[H] ** 2
371 * (mass(H) ** 2 - self.
MN**2 - mass(L) ** 2)
374 if "K*" in H
or "D*" in H
or "phi" in H:
375 if "nu_mu" in L
or "nu_e" in L
or "nu_tau" in L:
378 / (self.
sfmass**4 * 3 * u.pi * mass(H) ** 3)
379 * c.GST2[
"tneutrino"]
380 * c.decayConstant[H] ** 2
381 * (mass(H) ** 2 * (mass(H) ** 2 + self.
MN**2 + mass(L) ** 2 - 2 * (self.
MN**2 - mass(L) ** 2) ** 2))
386 / (self.
sfmass**4 * 3 * u.pi * mass(H) ** 3)
388 * c.decayConstant[H] ** 2
389 * (mass(H) ** 2 * (mass(H) ** 2 + self.
MN**2 + mass(L) ** 2 - 2 * (self.
MN**2 - mass(L) ** 2) ** 2))
392 width = self.
U2[0] * tmp_width
398 Returns the total SUSYRPV neutralino decay width
401 hadlist = [re.search(r"->\ (.+?)\ ", dec).group(1)
for dec
in declist]
402 leplist = [dlist[1].strip()
for dlist
in [re.findall(
r"\ \w+", dec)
for dec
in declist]]
403 print(leplist, hadlist)
404 totalwidth = sum([self.
Width_H_L(hadlist[i], leplist[i])
for i
in range(0, len(hadlist))])
409 Returns the total SUSYRPV neutralino production width
412 hadlist = [re.search(r"(.+?)\ ->", dec).group(1)
for dec
in declist]
413 leplist = [dlist[1].strip()
for dlist
in [re.findall(
r"\ \w+", dec)
for dec
in declist]]
414 totalwidth = sum([self.
Width_N_L(hadlist[i], leplist[i])
for i
in range(0, len(hadlist))])
419 Returns the branching ratio of the selected SUSY RPV neutralino decay channel
422 - decayString is a string describing the decay,
in the form
'N -> stuff1 ... stuffN'
424 had = re.search(r"->\ (.+?)\ ", decayString).group(1)
425 decaysplit = decayString.split(
" ")
426 for split
in decaysplit:
427 if split.find(
"mu") > -1
or split.find(
"e") > -1
or split.find(
"tau") > -1:
429 if had ==
"pi+" or had ==
"pi-" or had ==
"pi0":
431 "findBranchingRatio() ERROR: Pions in final "
432 "state have not been implemented, please choose "
433 "a different decay mode of out...\n"
438 corrdecstring = f
"N -> {had} {lep}"
441 print(
"findBranchingRation() INFO: You have chosen the decay: '", corrdecstring)
443 if corrdecstring
in dec:
446 print(
"findBranchingRation() ERROR: Badly formulated decay string, please choose one of the following\n")
453 br = self.
Width_H_L(had, lep) / totalwidth
458 Returns the branching ratio of the selected SUSY RPV neutralino product channel
461 - decayString is a string describing the decay,
in the form
'H -> N ... stuffN'
463 had = re.search(r"(.+?)\ ->", decayString).group(1)
464 decaysplit = decayString.split(
" ")
465 for split
in decaysplit:
466 if split.find(
"mu") > -1
or split.find(
"e") > -1
or split.find(
"tau") > -1:
468 if had ==
"pi+" or had ==
"pi-" or had ==
"pi0":
470 "findProdBranchingRatio() ERROR: Pions in final "
471 "state have not been implemented, please choose "
472 "a different decay mode of out...\n"
477 corrdecstring = f
"{had} -> N {lep}"
480 print(
"findProdBranchingRation() INFO: You have chosen the decay: '", corrdecstring)
482 if corrdecstring
in dec:
486 "findProdBranchingRation() ERROR: Badly formulated decay string, please choose one of the following\n"
497 SUSY RPV neutralino physics according to the nuMSM
500 def __init__(self, mass, couplings, sfmass, benchmark, debug: bool =
False) ->
None:
502 Initialize with mass
and couplings of the HNL
506 couplings (list of [\lambda_{production}^{2}, \lambda_{decay}^{2}])
507 mass of universal sfermion
508 which benchmark (integer between 1
and 5 inclusive)
510 RPVSUSYbranchings.__init__(self, mass, couplings, sfmass, benchmark, debug)
514 Compute the RPV neutralino lifetime
517 - system: choose between default (i.e. SI, result in s)
or FairShip (result
in ns)
523 if system ==
"FairShip":
def computeNLifetime(self, str system="SI")
None __init__(self, mass, couplings, sfmass, benchmark, bool debug=False)
def Width_H_L(self, H, L)
list[str] Get_Dec_Modes(self)
list[str] Get_Prod_Modes(self)
None __init__(self, mass, couplings, sfmass, benchmark, bool debug=False)
def findProdBranchingRatio(self, decayString)
def findDecayBranchingRatio(self, str decayString)
None AddChannelsToPythia(self, P8Gen, bool verbose=True)
def Width_N_L(self, H, L)
int PDGcode(str particle)