SND@LHC Software
Loading...
Searching...
No Matches
hnl.HNLbranchings Class Reference
Inheritance diagram for hnl.HNLbranchings:

Public Member Functions

 __init__ (self, mass, couplings, debug=False)
 
 sqrt_lambda (self, a, b, c)
 
 QCD_correction (self)
 
 Width_3nu (self)
 
 Width_nu_f_fbar (self, alpha, beta)
 
 Integrand (self, xx, xi)
 
 I (self, x1, x2, x3)
 
 Width_l1_l2_nu2 (self, alpha, beta)
 
 Width_l_u_d (self, alpha, beta, gamma)
 
 Width_H0_nu (self, H, alpha)
 
 Width_H_l (self, H, alpha)
 
 Width_charged_leptons (self)
 
 Width_neutral_mesons (self)
 
 Width_charged_mesons (self)
 
 Width_quarks_neutrino (self)
 
 Width_quarks_lepton (self)
 
 NDecayWidth (self)
 
 findBranchingRatio (self, decayString)
 
 allowedChannels (self)
 

Public Attributes

 U2
 
 U
 
 MN
 
 CKM
 
 CKMelemSq
 
 decays
 
 QCD_corr
 

Detailed Description

Lifetime and total and partial decay widths of an HNL

Definition at line 102 of file hnl.py.

Constructor & Destructor Documentation

◆ __init__()

hnl.HNLbranchings.__init__ (   self,
  mass,
  couplings,
  debug = False 
)
Initialize with mass and couplings of the HNL

Inputs:
mass (GeV)
couplings (list of [U2e, U2mu, U2tau])

Reimplemented in hnl.HNL.

Definition at line 106 of file hnl.py.

106 def __init__(self, mass, couplings, debug=False):
107 """
108 Initialize with mass and couplings of the HNL
109
110 Inputs:
111 mass (GeV)
112 couplings (list of [U2e, U2mu, U2tau])
113 """
114 self.U2 = couplings
115 self.U = [math.sqrt(ui) for ui in self.U2]
116 self.MN = mass*u.GeV
117 self.CKM = CKMmatrix()
118 self.CKMelemSq = {'pi+':self.CKM.Vud**2.,
119 'rho+':self.CKM.Vud**2.,
120 'D_s+':self.CKM.Vcs**2.,
121 'D*_s+':self.CKM.Vcs**2.,
122 'K+':self.CKM.Vus**2.,
123 # Quarks (up,down)
124 # up: 1=u, 2=c, 3=t
125 # down: 1=d, 2=s, 3=b
126 (1,1):self.CKM.Vud**2., (1,2):self.CKM.Vus**2., (1,3):self.CKM.Vub**2.,
127 (2,1):self.CKM.Vcd**2., (2,2):self.CKM.Vcs**2., (2,3):self.CKM.Vcb**2.,
128 (3,1):self.CKM.Vtd**2., (3,2):self.CKM.Vts**2., (3,3):self.CKM.Vtb**2.}
129 self.decays = [ 'N -> nu nu nu',
130 'N -> e- e+ nu_e',
131 'N -> e- e+ nu_mu',
132 'N -> e- e+ nu_tau',
133 'N -> e- mu+ nu_mu',
134 'N -> mu- e+ nu_e',
135 'N -> pi0 nu_e',
136 'N -> pi0 nu_mu',
137 'N -> pi0 nu_tau',
138 'N -> pi+ e-',
139 'N -> mu- mu+ nu_e',
140 'N -> mu- mu+ nu_mu',
141 'N -> mu- mu+ nu_tau',
142 'N -> pi+ mu-',
143 'N -> eta nu_e',
144 'N -> eta nu_mu',
145 'N -> eta nu_tau',
146 'N -> rho0 nu_e',
147 'N -> rho0 nu_mu',
148 'N -> rho0 nu_tau',
149 'N -> rho+ e-',
150 'N -> omega nu_e',
151 'N -> omega nu_mu',
152 'N -> omega nu_tau',
153 'N -> rho+ mu-',
154 'N -> eta1 nu_e',
155 'N -> eta1 nu_mu',
156 'N -> eta1 nu_tau',
157 'N -> phi nu_e',
158 'N -> phi nu_mu',
159 'N -> phi nu_tau',
160 'N -> e- tau+ nu_tau',
161 'N -> tau- e+ nu_e',
162 'N -> mu- tau+ nu_tau',
163 'N -> tau- mu+ nu_mu',
164 'N -> D_s+ e-',
165 'N -> D_s+ mu-',
166 'N -> D*_s+ e-',
167 'N -> D*_s+ mu-',
168 'N -> eta_c nu_e',
169 'N -> eta_c nu_mu',
170 'N -> eta_c nu_tau' ]
171 if self.MN>=1.:
172 self.QCD_corr = self.QCD_correction()
173
174 if debug:
175 print("HNLbranchings instance initialized with couplings:")
176 print("\tU2e = %s"%self.U2[0])
177 print("\tU2mu = %s"%self.U2[1])
178 print("\tU2tau = %s"%self.U2[2])
179 print("and mass:")
180 print("\tm = %s GeV"%(self.MN))
181

Member Function Documentation

◆ allowedChannels()

hnl.HNLbranchings.allowedChannels (   self)
Returns a dictionary of kinematically allowed decay channels

Inputs:
- decayString is a string describing the decay, in the form 'N -> stuff1 ... stuffN'

Definition at line 527 of file hnl.py.

527 def allowedChannels(self):
528 """
529 Returns a dictionary of kinematically allowed decay channels
530
531 Inputs:
532 - decayString is a string describing the decay, in the form 'N -> stuff1 ... stuffN'
533 """
534 m = self.MN
535 allowedDecays = {'N -> nu nu nu':'yes'}
536 if m > 2.*mass('e-'):
537 allowedDecays.update({'N -> e- e+ nu_e':'yes'})
538 allowedDecays.update({'N -> e- e+ nu_mu':'yes'})
539 allowedDecays.update({'N -> e- e+ nu_tau':'yes'})
540 if m > mass('e-') + mass('mu-'):
541 allowedDecays.update({'N -> e- mu+ nu_mu':'yes'})
542 allowedDecays.update({'N -> mu- e+ nu_e':'yes'})
543 if m > mass('pi0'):
544 allowedDecays.update({'N -> pi0 nu_e':'yes'})
545 allowedDecays.update({'N -> pi0 nu_mu':'yes'})
546 allowedDecays.update({'N -> pi0 nu_tau':'yes'})
547 if m > mass('pi+') + mass('e-'):
548 allowedDecays.update({'N -> pi+ e-':'yes'})
549 if m > 2.*mass('mu-'):
550 allowedDecays.update({'N -> mu- mu+ nu_e':'yes'})
551 allowedDecays.update({'N -> mu- mu+ nu_mu':'yes'})
552 allowedDecays.update({'N -> mu- mu+ nu_tau':'yes'})
553 if m > mass('pi+') + mass('mu-'):
554 allowedDecays.update({'N -> pi+ mu-':'yes'})
555 if m > mass('eta'):
556 allowedDecays.update({'N -> eta nu_e':'yes'})
557 allowedDecays.update({'N -> eta nu_mu':'yes'})
558 allowedDecays.update({'N -> eta nu_tau':'yes'})
559 if m > mass('rho0'):
560 allowedDecays.update({'N -> rho0 nu_e':'yes'})
561 allowedDecays.update({'N -> rho0 nu_mu':'yes'})
562 allowedDecays.update({'N -> rho0 nu_tau':'yes'})
563 if m > mass('rho+') + mass('e-'):
564 allowedDecays.update({'N -> rho+ e-':'yes'})
565 if m > mass('omega'):
566 allowedDecays.update({'N -> omega nu_e':'yes'})
567 allowedDecays.update({'N -> omega nu_mu':'yes'})
568 allowedDecays.update({'N -> omega nu_tau':'yes'})
569 if m > mass('rho+') + mass('mu-'):
570 allowedDecays.update({'N -> rho+ mu-':'yes'})
571 if m > mass('eta1'):
572 allowedDecays.update({'N -> eta1 nu_e':'yes'})
573 allowedDecays.update({'N -> eta1 nu_mu':'yes'})
574 allowedDecays.update({'N -> eta1 nu_tau':'yes'})
575 if m > mass('phi'):
576 allowedDecays.update({'N -> phi nu_e':'yes'})
577 allowedDecays.update({'N -> phi nu_mu':'yes'})
578 allowedDecays.update({'N -> phi nu_tau':'yes'})
579 if m > mass('e-') + mass('tau-'):
580 allowedDecays.update({'N -> e- tau+ nu_tau':'yes'})
581 allowedDecays.update({'N -> tau- e+ nu_e':'yes'})
582 if m > mass('mu-') + mass('tau-'):
583 allowedDecays.update({'N -> mu- tau+ nu_tau':'yes'})
584 allowedDecays.update({'N -> tau- mu+ nu_mu':'yes'})
585 if m > mass('D_s+') + mass('e-'):
586 allowedDecays.update({'N -> D_s+ e-':'yes'})
587 if m > mass('D_s+') + mass('mu-'):
588 allowedDecays.update({'N -> D_s+ mu-':'yes'})
589 if m > mass('D*_s+') + mass('e-'):
590 allowedDecays.update({'N -> D*_s+ e-':'yes'})
591 if m > mass('D*_s+') + mass('mu-'):
592 allowedDecays.update({'N -> D*_s+ mu-':'yes'})
593 if m > mass('eta_c'):
594 allowedDecays.update({'N -> eta_c nu_e':'yes'})
595 allowedDecays.update({'N -> eta_c nu_mu':'yes'})
596 allowedDecays.update({'N -> eta_c nu_tau':'yes'})
597
598 for decay in self.decays:
599 if decay not in allowedDecays:
600 allowedDecays.update({decay:'no'})
601 return allowedDecays
602
603
604
605

◆ findBranchingRatio()

hnl.HNLbranchings.findBranchingRatio (   self,
  decayString 
)
Returns the branching ratio of the selected HNL decay channel

Inputs:
- decayString is a string describing the decay, in the form 'N -> stuff1 ... stuffN'

Definition at line 462 of file hnl.py.

462 def findBranchingRatio(self, decayString):
463 """
464 Returns the branching ratio of the selected HNL decay channel
465
466 Inputs:
467 - decayString is a string describing the decay, in the form 'N -> stuff1 ... stuffN'
468 """
469 br = 0.
470 totalWidth = self.NDecayWidth()
471
472 if (decayString not in self.decays) and (decayString not in ['N -> hadrons','N -> charged hadrons']):
473 print('findBranchingRatio ERROR: unknown decay %s'%decayString)
474 quit()
475
476 if decayString == 'N -> nu nu nu' or decayString == 'N -> 3nu': br = self.Width_3nu() / totalWidth # inclusive
477 if decayString == 'N -> e- e+ nu_e': br = self.Width_nu_f_fbar(1,1) / totalWidth
478 if decayString == 'N -> e- e+ nu_mu': br = self.Width_nu_f_fbar(2,1) / totalWidth
479 if decayString == 'N -> e- e+ nu_tau': br = self.Width_nu_f_fbar(3,1) / totalWidth
480 if decayString == 'N -> e- mu+ nu_mu': br = self.Width_l1_l2_nu2(1,2) / totalWidth
481 if decayString == 'N -> mu- e+ nu_e': br = self.Width_l1_l2_nu2(2,1) / totalWidth
482 if decayString == 'N -> pi0 nu_e': br = self.Width_H0_nu('pi0',1) / totalWidth
483 if decayString == 'N -> pi0 nu_mu': br = self.Width_H0_nu('pi0',2) / totalWidth
484 if decayString == 'N -> pi0 nu_tau': br = self.Width_H0_nu('pi0',3) / totalWidth
485 if decayString == 'N -> pi+ e-': br = self.Width_H_l('pi+',1) / totalWidth
486 if decayString == 'N -> mu- mu+ nu_e': br = self.Width_nu_f_fbar(1,2) / totalWidth
487 if decayString == 'N -> mu- mu+ nu_mu': br = self.Width_nu_f_fbar(2,2) / totalWidth
488 if decayString == 'N -> mu- mu+ nu_tau': br = self.Width_nu_f_fbar(3,2) / totalWidth
489 if decayString == 'N -> pi+ mu-': br = self.Width_H_l('pi+',2) / totalWidth
490 if decayString == 'N -> eta nu_e': br = self.Width_H0_nu('eta',1) / totalWidth
491 if decayString == 'N -> eta nu_mu': br = self.Width_H0_nu('eta',2) / totalWidth
492 if decayString == 'N -> eta nu_tau': br = self.Width_H0_nu('eta',3) / totalWidth
493 if decayString == 'N -> rho0 nu_e': br = self.Width_H0_nu('rho0',1) / totalWidth
494 if decayString == 'N -> rho0 nu_mu': br = self.Width_H0_nu('rho0',2) / totalWidth
495 if decayString == 'N -> rho0 nu_tau': br = self.Width_H0_nu('rho0',3) / totalWidth
496 if decayString == 'N -> rho+ e-': br = self.Width_H_l('rho+',1) / totalWidth
497 if decayString == 'N -> omega nu_e': br = self.Width_H0_nu('omega',1) / totalWidth
498 if decayString == 'N -> omega nu_mu': br = self.Width_H0_nu('omega',2) / totalWidth
499 if decayString == 'N -> omega nu_tau': br = self.Width_H0_nu('omega',3) / totalWidth
500 if decayString == 'N -> rho+ mu-': br = self.Width_H_l('rho+',2) / totalWidth
501 if decayString == 'N -> eta1 nu_e': br = self.Width_H0_nu('eta1',1) / totalWidth
502 if decayString == 'N -> eta1 nu_mu': br = self.Width_H0_nu('eta1',2) / totalWidth
503 if decayString == 'N -> eta1 nu_tau': br = self.Width_H0_nu('eta1',3) / totalWidth
504 if decayString == 'N -> phi nu_e': br = self.Width_H0_nu('phi',1) / totalWidth
505 if decayString == 'N -> phi nu_mu': br = self.Width_H0_nu('phi',2) / totalWidth
506 if decayString == 'N -> phi nu_tau': br = self.Width_H0_nu('phi',3) / totalWidth
507 if decayString == 'N -> e- tau+ nu_tau': br = self.Width_l1_l2_nu2(1,3) / totalWidth
508 if decayString == 'N -> tau- e+ nu_e': br = self.Width_l1_l2_nu2(3,1) / totalWidth
509 if decayString == 'N -> mu- tau+ nu_tau': br = self.Width_l1_l2_nu2(2,3) / totalWidth
510 if decayString == 'N -> tau- mu+ nu_mu': br = self.Width_l1_l2_nu2(3,2) / totalWidth
511 if decayString == 'N -> D_s+ e-': br = self.Width_H_l('D_s+',1) / totalWidth
512 if decayString == 'N -> D_s+ mu-': br = self.Width_H_l('D_s+',2) / totalWidth
513 if decayString == 'N -> D*_s+ e-': br = self.Width_H_l('D*_s+',1) / totalWidth
514 if decayString == 'N -> D*_s+ mu-': br = self.Width_H_l('D*_s+',2) / totalWidth
515 if decayString == 'N -> eta_c nu_e': br = self.Width_H0_nu('eta_c',1) / totalWidth
516 if decayString == 'N -> eta_c nu_mu': br = self.Width_H0_nu('eta_c',2) / totalWidth
517 if decayString == 'N -> eta_c nu_tau': br = self.Width_H0_nu('eta_c',3) / totalWidth
518
519 if decayString == 'N -> hadrons':
520 mesonWidth = self.Width_neutral_mesons() + self.Width_charged_mesons()
521 quarkWidth = self.Width_quarks_neutrino() + self.Width_quarks_lepton()
522 br = max([mesonWidth, quarkWidth]) / totalWidth
523 if decayString == 'N -> charged hadrons':
524 br = max([self.Width_charged_mesons(), self.Width_quarks_lepton()]) / totalWidth
525 return br
526

◆ I()

hnl.HNLbranchings.I (   self,
  x1,
  x2,
  x3 
)
Numerical integral needed for 3-body decays trough W boson.
xi = mi/MN

Definition at line 273 of file hnl.py.

273 def I(self,x1,x2,x3):
274 """
275 Numerical integral needed for 3-body decays trough W boson.
276 xi = mi/MN
277 """
278 theFunction = self.Integrand
279 func = ROOT.TF1('func',theFunction,0,1,3) # Setting function
280 func.SetParameters(x1,x2,x3)
281 xmin = (x1 + x3)**2
282 xmax = (1. - x2)**2
283 wf1 = ROOT.Math.WrappedTF1(func) # Setting simple Gauss integration method
284 ig = ROOT.Math.GaussIntegrator()
285 ig.SetFunction(wf1)
286 ig.SetRelTolerance(0.001)
287 res = 12. * ig.Integral(xmin,xmax)
288 return res
289

◆ Integrand()

hnl.HNLbranchings.Integrand (   self,
  xx,
  xi 
)
Function to integrate needed for numerical integration using ROOT. Needed for 3-body decays trough W boson.
First argument is a list of 1 number, argument. Second is the list of 3 numbers xi = mi/MN

Definition at line 255 of file hnl.py.

255 def Integrand(self,xx,xi):
256 """
257 Function to integrate needed for numerical integration using ROOT. Needed for 3-body decays trough W boson.
258 First argument is a list of 1 number, argument. Second is the list of 3 numbers xi = mi/MN
259 """
260 x = xx[0]
261 xl2 = xi[0]**2
262 xu2 = xi[1]**2
263 xd2 = xi[2]**2
264 if x==0: # Workaround for division by zero
265 return 0
266 res = 1./x
267 res *= (x - xl2 - xd2)
268 res *= (1. + xu2 - x)
269 res *= self.sqrt_lambda(x,xl2,xd2)
270 res *= self.sqrt_lambda(1.,x,xu2)
271 return res
272

◆ NDecayWidth()

hnl.HNLbranchings.NDecayWidth (   self)
Returns the total HNL decay width

Definition at line 452 of file hnl.py.

452 def NDecayWidth(self):
453 """
454 Returns the total HNL decay width
455 """
456 leptonWidth = self.Width_3nu() + self.Width_charged_leptons()
457 mesonWidth = self.Width_neutral_mesons() + self.Width_charged_mesons()
458 quarkWidth = self.Width_quarks_neutrino() + self.Width_quarks_lepton()
459 totalWidth = leptonWidth + max([mesonWidth, quarkWidth])
460 return totalWidth
461

◆ QCD_correction()

hnl.HNLbranchings.QCD_correction (   self)
Returns 3-loops QCD correction to HNL decay width into quarks

Definition at line 192 of file hnl.py.

192 def QCD_correction(self):
193 """
194 Returns 3-loops QCD correction to HNL decay width into quarks
195 """
196 alpha_s = ROOT.TGraph( os.path.expandvars('$FAIRSHIP/python/alpha_s.dat') )
197 a_s = alpha_s.Eval(self.MN)
198 qcd_corr = a_s / math.pi
199 qcd_corr += 5.2 * (a_s / math.pi)**2.
200 qcd_corr += 26.4 * (a_s / math.pi)**3.
201 return qcd_corr
202

◆ sqrt_lambda()

hnl.HNLbranchings.sqrt_lambda (   self,
  a,
  b,
  c 
)
Useful function for decay kinematics. Returns 0 for kinematically forbidden region

Definition at line 182 of file hnl.py.

182 def sqrt_lambda(self,a,b,c):
183 """
184 Useful function for decay kinematics. Returns 0 for kinematically forbidden region
185 """
186 l = a**2 + b**2 + c**2 - 2*a*b - 2*b*c - 2*a*c
187 if l<0:
188 return 0
189 else:
190 return math.sqrt(l)
191

◆ Width_3nu()

hnl.HNLbranchings.Width_3nu (   self)
Returns the HNL decay width into three neutrinos

Definition at line 203 of file hnl.py.

203 def Width_3nu(self):
204 """
205 Returns the HNL decay width into three neutrinos
206 """
207 width = (c.GF**2.)*(self.MN**5.)*sum(self.U2)/(192.*(u.pi**3.))
208 width = 2.*width # Majorana case (charge conjugate channels)
209 return width
210

◆ Width_charged_leptons()

hnl.HNLbranchings.Width_charged_leptons (   self)
Returns the total HNL leptonic decay width with charged leptons in final state

Definition at line 392 of file hnl.py.

392 def Width_charged_leptons(self):
393 """
394 Returns the total HNL leptonic decay width with charged leptons in final state
395 """
396 width = 0.
397 for l1 in [1,2,3]:
398 for l2 in [1,2,3]:
399 width += self.Width_nu_f_fbar(l1,l2)
400 width += self.Width_l1_l2_nu2(l1,l2)
401 return width
402

◆ Width_charged_mesons()

hnl.HNLbranchings.Width_charged_mesons (   self)
Returns the total HNL decay width into a charged meson and a charged lepton

Definition at line 414 of file hnl.py.

414 def Width_charged_mesons(self):
415 """
416 Returns the total HNL decay width into a charged meson and a charged lepton
417 """
418 mesons = ['pi+','rho+','D_s+','D*_s+']
419 width = 0.
420 for m in mesons:
421 for l in [1,2,3]:
422 width += self.Width_H_l(m,l)
423 return width
424

◆ Width_H0_nu()

hnl.HNLbranchings.Width_H0_nu (   self,
  H,
  alpha 
)
Returns the HNL decay width into neutral meson and neutrino

Inputs:
- H is a string (name of the meson)
- alpha is a flavour of the nu (1, 2 or 3), determine the mixing angle U_alpha

Definition at line 339 of file hnl.py.

339 def Width_H0_nu(self, H, alpha):
340 """
341 Returns the HNL decay width into neutral meson and neutrino
342
343 Inputs:
344 - H is a string (name of the meson)
345 - alpha is a flavour of the nu (1, 2 or 3), determine the mixing angle U_alpha
346 """
347 if (H not in ['pi0','eta','rho0','omega','eta1','phi','eta_c']) or (alpha not in [1,2,3]):
348 print('Width_H0_nu ERROR: unknown channel H0 =',H,' alpha =',alpha)
349 quit()
350 x = mass(H)/self.MN
351 if x > 1: # The decay is kinematically forbidden
352 return 0.
353 width = (c.GF**2.)*(c.decayConstant[H]**2.)*(self.MN**3.)*self.U2[alpha-1]/(32.*math.pi)
354 if H in ['pi0','eta','eta1','eta_c']: # pseudoscalar mesons
355 width *= (1 - x**2.)**2.
356 if H in ['rho0','omega','phi']: # vector mesons
357 width *= (1. + 2*x**2.)*(1. - x**2.)**2.
358 if H=='rho0':
359 width *= (1. - 2.*c.s2thetaw)**2.
360 if H=='omega':
361 width *= (16.*c.s2thetaw**2.)/9.
362 if H=='phi':
363 width *= (1. - 4./3.*c.s2thetaw)**2.
364 width = 2.*width # Majorana case (charge conjugate channels)
365 return width
366

◆ Width_H_l()

hnl.HNLbranchings.Width_H_l (   self,
  H,
  alpha 
)
Returns the HNL decay width into charged meson and lepton

Inputs:
- H is a string (name of the positively charged meson)
- alpha is the lepton flavour (1, 2 or 3), determine the mixing angle U_alpha

Definition at line 367 of file hnl.py.

367 def Width_H_l(self, H, alpha):
368 """
369 Returns the HNL decay width into charged meson and lepton
370
371 Inputs:
372 - H is a string (name of the positively charged meson)
373 - alpha is the lepton flavour (1, 2 or 3), determine the mixing angle U_alpha
374 """
375 if (H not in ['pi+','rho+','D_s+','D*_s+']) or (alpha not in [1,2,3]):
376 print('Width_H_l ERROR: unknown channel H =',H,' alpha =',alpha)
377 quit()
378 l = [None,'e-','mu-','tau-']
379 xl = mass(l[alpha])/self.MN
380 xh = mass(H)/self.MN
381 if xl+xh > 1: # The decay is kinematically forbidden
382 return 0.
383 width = (c.GF**2.)*(c.decayConstant[H]**2.)*self.CKMelemSq[H]*(self.MN**3.)*self.U2[alpha-1]/(16.*math.pi)
384 width *= self.sqrt_lambda(1., xl**2, xh**2)
385 if H in ['pi+','D_s+']: # pseudoscalar mesons
386 width *= ( (1. - xl**2.)**2. - xh**2. *(1. + xl**2.) )
387 if H in ['rho+','D*_s+']: # vector mesons
388 width *= ( (1. - xl**2.)**2. + xh**2.*(1. + xl**2.) - 2.*xh**4. )
389 width = 2.*width # Majorana case (charge conjugate channels)
390 return width
391

◆ Width_l1_l2_nu2()

hnl.HNLbranchings.Width_l1_l2_nu2 (   self,
  alpha,
  beta 
)
Returns the HNL decay width into two different flavour leptons and a neutrino (decay through W boson)

Inputs:
- alpha is a flavour of the first lepton (1,2 or 3), determine the mixing angle U_alpha
- beta is a flavour of the second lepton and neutrino (1, 2 or 3)

Definition at line 290 of file hnl.py.

290 def Width_l1_l2_nu2(self, alpha, beta):
291 """
292 Returns the HNL decay width into two different flavour leptons and a neutrino (decay through W boson)
293
294 Inputs:
295 - alpha is a flavour of the first lepton (1,2 or 3), determine the mixing angle U_alpha
296 - beta is a flavour of the second lepton and neutrino (1, 2 or 3)
297 """
298 if (alpha not in [1,2,3]) or (beta not in [1,2,3]):
299 print('Width_l1_l2_nu2 ERROR: unknown channel alpha =',alpha,' beta =',beta)
300 quit()
301 if alpha==beta: # The interference case is handled by Width_nu_f_fbar function, workaround for a total width calculation
302 return 0
303 l = [None,'e-','mu-','tau-']
304 x1 = mass(l[alpha])/self.MN
305 x2 = mass(l[beta])/self.MN
306 if x1+x2>1: # The decay is kinematically forbidden
307 return 0
308 width = (c.GF**2.)*(self.MN**5.)*self.U2[alpha-1]/(192.*(math.pi**3.))
309 width = width*self.I(x1,x2,0)
310 width = 2.*width # Majorana case (charge conjugate channels)
311 return width
312

◆ Width_l_u_d()

hnl.HNLbranchings.Width_l_u_d (   self,
  alpha,
  beta,
  gamma 
)
Returns the HNL tree level decay width into a charged lepton, up quark and down quark (decay through W boson)

Inputs:
- alpha is a flavour of the charged lepton (1,2 or 3), determine the mixing angle U_alpha
- beta is the up quark generation (1, 2, 3 for u, c, t)
- gamma is the down quark generation (1, 2, 3 for d, s, b)

Definition at line 313 of file hnl.py.

313 def Width_l_u_d(self, alpha, beta, gamma):
314 """
315 Returns the HNL tree level decay width into a charged lepton, up quark and down quark (decay through W boson)
316
317 Inputs:
318 - alpha is a flavour of the charged lepton (1,2 or 3), determine the mixing angle U_alpha
319 - beta is the up quark generation (1, 2, 3 for u, c, t)
320 - gamma is the down quark generation (1, 2, 3 for d, s, b)
321 """
322 if (alpha not in [1,2,3]) or (beta not in [1,2,3]) or (gamma not in [1,2,3]):
323 print('Width_l_u_d ERROR: unknown channel alpha =',alpha,' beta =',beta,' gamma =',gamma)
324 quit()
325 l = [None,'e-','mu-','tau-']
326 u = [None,'u','c','t']
327 d = [None,'d','s','b']
328 xl = mass(l[alpha])/self.MN
329 xu = mass(u[beta])/self.MN
330 xd = mass(d[gamma])/self.MN
331 if xl+xu+xd>1: # The decay is kinematically forbidden
332 return 0
333 width = (c.GF**2.)*(self.MN**5.)*self.U2[alpha-1]/(192.*(math.pi**3.))
334 width *= 3*self.CKMelemSq[(beta, gamma)]
335 width *= self.I(xl,xu,xd)
336 width = 2.*width # Majorana case (charge conjugate channels)
337 return width
338

◆ Width_neutral_mesons()

hnl.HNLbranchings.Width_neutral_mesons (   self)
Returns the total HNL decay width into a neutral meson and a neutrino

Definition at line 403 of file hnl.py.

403 def Width_neutral_mesons(self):
404 """
405 Returns the total HNL decay width into a neutral meson and a neutrino
406 """
407 mesons = ['pi0','eta','rho0','omega','eta1','phi','eta_c']
408 width = 0.
409 for m in mesons:
410 for l in [1,2,3]:
411 width += self.Width_H0_nu(m,l)
412 return width
413

◆ Width_nu_f_fbar()

hnl.HNLbranchings.Width_nu_f_fbar (   self,
  alpha,
  beta 
)
Returns the HNL tree level decay width into the fermion-antifermion pair and a neutrino (decay through Z boson or Z and W)

Inputs:
- alpha is a flavour of neutrino (1,2 or 3), determine the mixing angle U_alpha
- beta is a flavour of the fermions: (1, 2 or 3) for charge leptons or (4, 5, 6, 7, 8, 9) for quarks

Definition at line 211 of file hnl.py.

211 def Width_nu_f_fbar(self, alpha, beta):
212 """
213 Returns the HNL tree level decay width into the fermion-antifermion pair and a neutrino (decay through Z boson or Z and W)
214
215 Inputs:
216 - alpha is a flavour of neutrino (1,2 or 3), determine the mixing angle U_alpha
217 - beta is a flavour of the fermions: (1, 2 or 3) for charge leptons or (4, 5, 6, 7, 8, 9) for quarks
218 """
219 if (alpha not in [1,2,3]) or (beta not in [1,2,3,4,5,6,7,8,9]):
220 print('Width_nu_f_fbar ERROR: unknown channel alpha =',alpha,' beta =',beta)
221 quit()
222 l = [None,'e-','mu-','tau-','u','d','s','c','b','t']
223 x = mass(l[beta]) / self.MN
224 if x > 0.5: # the decay is kinematically forbidden
225 return 0
226 width = (c.GF**2.)*(self.MN**5.)*self.U2[alpha-1]/(192.*(math.pi**3.))
227 L = 0.
228 if x>0.01:
229 logContent = (1. - 3.*x**2. - (1.-x**2.)*math.sqrt(1. - 4.*x**2.) ) / ( (x**2.)*(1 + math.sqrt(1. - 4.*x**2.)) )
230 else:
231 logContent = x**4 + 4.*x**6 + 14.*x**8
232 if logContent > 0:
233 L = math.log( logContent )
234 if beta < 4: # lepton decay
235 NZ = 1
236 if alpha == beta: # interference case
237 C1 = 0.25*(1. + 4.*c.s2thetaw + 8.*c.s2thetaw**2.)
238 C2 = 0.5*c.s2thetaw*(2.*c.s2thetaw +1.)
239 else: # no interference
240 C1 = 0.25*(1. - 4.*c.s2thetaw + 8.*c.s2thetaw**2.)
241 C2 = 0.5*c.s2thetaw*(2.*c.s2thetaw -1.)
242 else: # decay into quarks
243 NZ = 3
244 if (beta in [4,7,9]): # up quarks
245 C1 = 0.25*(1. - 8./3.*c.s2thetaw + 32./9.*c.s2thetaw**2.)
246 C2 = 1./3.*c.s2thetaw*(4./3.*c.s2thetaw - 1.)
247 if (beta in [5,6,8]): # down quarks
248 C1 = 0.25*(1. - 4./3.*c.s2thetaw + 8./9.*c.s2thetaw**2.)
249 C2 = 1./6.*c.s2thetaw*(2./3.*c.s2thetaw - 1.)
250 width = width*NZ*( C1*( (1.-14.*x**2. -2.*x**4. -12.*x**6.)*math.sqrt(1-4.*x**2) +12.*x**4. *(-1.+x**4.)*L )
251 + 4.*C2*( x**2. *(2.+10.*x**2. -12.*x**4.) * math.sqrt(1.-4.*x**2) + 6.*x**4. *(1.-2.*x**2+2.*x**4)*L ) )
252 width = 2.*width # Majorana case (charge conjugate channels)
253 return width
254

◆ Width_quarks_lepton()

hnl.HNLbranchings.Width_quarks_lepton (   self)
Returns the total HNL decay width with quarks and charged lepton in final state. Uses 3-loops alpha_s correction

Definition at line 438 of file hnl.py.

438 def Width_quarks_lepton(self):
439 """
440 Returns the total HNL decay width with quarks and charged lepton in final state. Uses 3-loops alpha_s correction
441 """
442 if self.MN<1.: # decay into quarks is not applicable at low HNL mass
443 return 0
444 width = 0.
445 for l in [1,2,3]:
446 for u in [1,2,3]:
447 for d in [1,2,3]:
448 width += self.Width_l_u_d(l,u,d)
449 width *= (1. + self.QCD_corr)
450 return width
451

◆ Width_quarks_neutrino()

hnl.HNLbranchings.Width_quarks_neutrino (   self)
Returns the total HNL decay width with quarks and neutrino in final state. Uses 3-loops alpha_s correction

Definition at line 425 of file hnl.py.

425 def Width_quarks_neutrino(self):
426 """
427 Returns the total HNL decay width with quarks and neutrino in final state. Uses 3-loops alpha_s correction
428 """
429 if self.MN<1.: # decay into quarks is not applicable at low HNL mass
430 return 0
431 width = 0.
432 for l in [1,2,3]:
433 for q in [4,5,6,7,8,9]:
434 width += self.Width_nu_f_fbar(l,q)
435 width *= (1. + self.QCD_corr)
436 return width
437

Member Data Documentation

◆ CKM

hnl.HNLbranchings.CKM

Definition at line 117 of file hnl.py.

◆ CKMelemSq

hnl.HNLbranchings.CKMelemSq

Definition at line 118 of file hnl.py.

◆ decays

hnl.HNLbranchings.decays

Definition at line 129 of file hnl.py.

◆ MN

hnl.HNLbranchings.MN

Definition at line 116 of file hnl.py.

◆ QCD_corr

hnl.HNLbranchings.QCD_corr

Definition at line 172 of file hnl.py.

◆ U

hnl.HNLbranchings.U

Definition at line 115 of file hnl.py.

◆ U2

hnl.HNLbranchings.U2

Definition at line 114 of file hnl.py.


The documentation for this class was generated from the following file: