1
from __future__ import division
2
from __future__ import absolute_import
4
from math import sqrt, pow
5
from itertools import product
6
from six.moves import range
8
class WaveFunction(list):
9
"""a objet for a WaveFunction"""
18
def __init__(self, spin= None, size=None):
19
"""Init the list with zero value"""
22
size = self.spin_to_size[spin]
23
list.__init__(self, [0]*size)
26
def ixxxxx(p,fmass,nhel,nsf):
27
"""Defines an inflow fermion."""
31
fi[0] = complex(-p[0]*nsf,-p[3]*nsf)
32
fi[1] = complex(-p[1]*nsf,-p[2]*nsf)
35
pp = min(p[0],sqrt(p[1]**2 + p[2]**2 + p[3]**2 ))
37
sqm = [sqrt(abs(fmass))]
38
sqm.append(sign(sqm[0],fmass))
43
fi[3] = im*nsf*sqm[ip]
44
fi[4] = ip*nsf*sqm[im]
48
sf = [(1+nsf+(1-nsf)*nh)*0.5,(1+nsf-(1-nsf)*nh)*0.5]
49
omega = [sqrt(p[0]+pp),fmass/(sqrt(p[0]+pp))]
52
sfomeg = [sf[0]*omega[ip],sf[1]*omega[im]]
55
chi1 = complex(-nh,0.)
57
chi1 = complex(nh*p[1]/sqrt(2.*pp*pp3),\
59
chi = [complex(sqrt(pp3*0.5/pp)),chi1]
61
fi[2] = sfomeg[0]*chi[im]
62
fi[3] = sfomeg[0]*chi[ip]
63
fi[4] = sfomeg[1]*chi[im]
64
fi[5] = sfomeg[1]*chi[ip]
67
sqp0p3 = sqrt(max(p[0]+p[3],0.))*nsf
69
chi1 = complex(-nhel*sqrt(2.*p[0]),0.)
71
chi1 = complex(nh*p[1]/sqp0p3,p[2]/sqp0p3)
72
chi = [complex(sqp0p3,0.),chi1]
74
fi[2] = complex(0.,0.)
75
fi[3] = complex(0.,0.)
81
fi[4] = complex(0.,0.)
82
fi[5] = complex(0.,0.)
86
def oxxxxx(p,fmass,nhel,nsf):
87
""" initialize an outgoing fermion"""
90
fo[0] = complex(p[0]*nsf,p[3]*nsf)
91
fo[1] = complex(p[1]*nsf,p[2]*nsf)
94
pp = min(p[0],sqrt(p[1]**2 + p[2]**2 + p[3]**2 ))
96
sqm = [sqrt(abs(fmass))]
97
sqm.append( sign(sqm[0], fmass))
98
ip = int(-((1-nh)//2) * nhel)
99
im = int((1+nh)//2 * nhel)
101
fo[2] = im*sqm[abs(im)]
102
fo[3] = ip*nsf*sqm[abs(im)]
103
fo[4] = im*nsf*sqm[abs(ip)]
104
fo[5] = ip*sqm[abs(ip)]
107
sf = [(1+nsf+(1-nsf)*nh)*0.5,(1+nsf-(1-nsf)*nh)*0.5]
108
omega = [sqrt(p[0]+pp),fmass/(sqrt(p[0]+pp))]
111
sfomeg = [sf[0]*omega[ip],sf[1]*omega[im]]
112
pp3 = max(pp+p[3],0.)
114
chi1 = complex(-nh,0.)
116
chi1 = complex(nh*p[1]/sqrt(2.*pp*pp3),\
117
-p[2]/sqrt(2.*pp*pp3))
118
chi = [complex(sqrt(pp3*0.5/pp)),chi1]
120
fo[2] = sfomeg[1]*chi[im]
121
fo[3] = sfomeg[1]*chi[ip]
122
fo[4] = sfomeg[0]*chi[im]
123
fo[5] = sfomeg[0]*chi[ip]
126
sqp0p3 = sqrt(max(p[0]+p[3],0.))*nsf
128
chi1 = complex(-nhel*sqrt(2.*p[0]),0.)
130
chi1 = complex(nh*p[1]/sqp0p3,-p[2]/sqp0p3)
131
chi = [complex(sqp0p3,0.),chi1]
135
fo[4] = complex(0.,0.)
136
fo[5] = complex(0.,0.)
138
fo[2] = complex(0.,0.)
139
fo[3] = complex(0.,0.)
145
def vxxxxx(p,vmass,nhel,nsv):
146
""" initialize a vector wavefunction. nhel=4 is for checking BRST"""
151
nsvahl = nsv*abs(nhel)
152
pt2 = p[1]**2 + p[2]**2
153
pp = min(p[0],sqrt(pt2 + p[3]**2))
154
pt = min(pp,sqrt(pt2))
156
vc[0] = complex(p[0]*nsv,p[3]*nsv)
157
vc[1] = complex(p[1]*nsv,p[2]*nsv)
177
vc[2] = complex(0.,0.)
178
vc[3] = complex(-nhel*sqh,0.)
179
vc[4] = complex(0.,nsvahl*sqh)
180
vc[5] = complex(hel0,0.)
183
emp = p[0]/(vmass*pp)
184
vc[2] = complex(hel0*pp/vmass,0.)
185
vc[5] = complex(hel0*p[3]*emp+nhel*pt/pp*sqh)
187
pzpt = p[3]/(pp*pt)*sqh*nhel
188
vc[3] = complex(hel0*p[1]*emp-p[1]*pzpt, \
190
vc[4] = complex(hel0*p[2]*emp-p[2]*pzpt, \
193
vc[3] = complex(-nhel*sqh,0.)
194
vc[4] = complex(0.,nsvahl*sign(sqh,p[3]))
197
pt = sqrt(p[1]**2 + p[2]**2)
198
vc[2] = complex(0.,0.)
199
vc[5] = complex(nhel*pt/pp*sqh)
201
pzpt = p[3]/(pp*pt)*sqh*nhel
202
vc[3] = complex(-p[1]*pzpt,-nsv*p[2]/pt*sqh)
203
vc[4] = complex(-p[2]*pzpt,nsv*p[1]/pt*sqh)
205
vc[3] = complex(-nhel*sqh,0.)
206
vc[4] = complex(0.,nsv*sign(sqh,p[3]))
211
"""Fortran's sign transfer function"""
215
# y should be complex
216
if abs(y.imag) < 1e-6 * abs(y.real):
227
"""initialize a scalar wavefunction"""
231
sc[2] = complex(1.,0.)
232
sc[0] = complex(p[0]*nss,p[3]*nss)
233
sc[1] = complex(p[1]*nss,p[2]*nss)
237
def txxxxx(p, tmass, nhel, nst):
238
""" initialize a tensor wavefunction"""
245
pt2 = p[1]**2 + p[2]**2
246
pp = min(p[0],sqrt(pt2+p[3]**2))
247
pt = min(pp,sqrt(pt2))
250
ft[(4,0)] = complex(p[0], p[3]) * nst
251
ft[(5,0)] = complex(p[1], p[2]) * nst
260
ep[2] = complex(0, nst*sqh)
266
pzpt = p[3]/(pp*pt)*sqh
267
ep[1] = complex( -p[1]*pzpt , -nst*p[2]/pt*sqh )
268
ep[2] = complex( -p[2]*pzpt , nst*p[1]/pt*sqh )
271
ep[2] = complex( 0 , nst*sign(sqh,p[3]) )
281
em[2] = complex( 0 , nst*sqh )
287
pzpt = -p[3]/(pp*pt)*sqh
288
em[1] = complex( -p[1]*pzpt , -nst*p[2]/pt*sqh )
289
em[2] = complex( -p[2]*pzpt , nst*p[1]/pt*sqh )
292
em[2] = complex( 0 , nst*sign(sqh,p[3]) )
295
if ( abs(nhel) <= 1 ):
299
#e0[0] = complex( rZero )
300
#e0[1] = complex( rZero )
301
#e0[2] = complex( rZero )
304
emp = p[0]/(tmass*pp)
311
# e0[1] = complex( rZero )
312
# e0[2] = complex( rZero )
317
ft[(i,j)] = ep[i]*ep[j]
321
ft[(i,j)] = em[i]*em[j]
329
ft[(i,j)] = sqh*( ep[i]*e0[j] + e0[i]*ep[j] )
333
ft[(i,j)] = sqs*( ep[i]*em[j] + em[i]*ep[j] + 2 *e0[i]*e0[j] )
337
ft[(i,j)] = sqh*( em[i]*e0[j] + e0[i]*em[j] )
340
raise Exception('invalid helicity TXXXXXX')
365
def irxxxx(p, mass, nhel, nsr):
366
""" initialize a incoming spin 3/2 wavefunction."""
368
# This routines is a python translation of a routine written by
369
# K.Mawatari in fortran dated from the 2008/02/26
377
pt2 = p[1]**2 + p[2]**2
378
pp = min([p[0], sqrt(pt2+p[3]**2)])
379
pt = min([pp,sqrt(pt2)])
382
rc[(4,0)] = -1*complex(p[0],p[3])*nsr
383
rc[(5,0)] = -1*complex(p[1],p[2])*nsr
386
nsv = -nsr # nsv=+1 for final, -1 for initial
395
pzpt = p[3]/(pp*pt)*sqh
396
ep[1] = complex( -p[1]*pzpt , -nsv*p[2]/pt*sqh )
397
ep[2] = complex( -p[2]*pzpt , nsv*p[1]/pt*sqh )
400
ep[2] = complex( 0 , nsv*sign(sqh,p[3]) )
404
ep[2] = complex(0, nsv * sqh)
414
em[2] = complex( 0 , nsv*sqh )
420
pzpt = -p[3]/(pp*pt)*sqh
421
em[1] = complex( -p[1]*pzpt , -nsv*p[2]/pt*sqh )
422
em[2] = complex( -p[2]*pzpt , nsv*p[1]/pt*sqh )
425
em[2] = complex( 0 , nsv*sign(sqh,p[3]) )
427
if ( abs(nhel) <= 1 ):
431
#e0[0] = complex( rZero )
432
#e0[1] = complex( rZero )
433
#e0[2] = complex( rZero )
443
# e0[1] = complex( rZero )
444
# e0[2] = complex( rZero )
451
sf, omega, sfomeg, chi = [0, 0], [0,0], [0,0], [0,0]
454
pp = min([p[0],sqrt(p[1]**2+p[2]**2+p[3]**2)])
460
fip[1] = im * nsr * sqm
461
fip[2] = ip * nsr * sqm
464
sf[0] = float(1+nsr+(1-nsr)*nh)*0.5
465
sf[1] = float(1+nsr-(1-nsr)*nh)*0.5
466
omega[0] = sqrt(p[0]+pp)
467
omega[1] = mass/omega[0]
468
ip = ((3+nh)//2) -1 # -1 since they are index
469
im = ((3-nh)//2) -1 # -1 since they are index
470
sfomeg[0] = sf[0]*omega[ip]
471
sfomeg[1] = sf[1]*omega[im]
472
pp3 = max([pp+p[3],0])
473
chi[0] = sqrt(pp3*0.5/pp)
477
chi[1] = complex( nh*p[1] , p[2] )/sqrt(2*pp*pp3)
479
fip[0] = sfomeg[0]*chi[im]
480
fip[1] = sfomeg[0]*chi[ip]
481
fip[2] = sfomeg[1]*chi[im]
482
fip[3] = sfomeg[1]*chi[ip]
484
sqp0p3 = sqrt(max([p[0]+p[3],0])) * nsr
487
chi[1] = -nhel * sqrt(2*p[0])
489
chi[1] = complex( nh*p[1], p[2] )/sqp0p3
491
#fip[0] = complex( rZero )
492
#fip[1] = complex( rZero )
498
#fip(3) = complex( rZero )
499
#fip(4) = complex( rZero )
504
sf, omega, sfomeg, chi = [0, 0], [0,0], [0,0], [0,0]
507
pp = min([p[0],sqrt(p[1]**2+p[2]**2+p[3]**2)])
513
fim[1] = im * nsr * sqm
514
fim[2] = ip * nsr * sqm
517
sf[0] = float(1+nsr+(1-nsr)*nh)*0.5
518
sf[1] = float(1+nsr-(1-nsr)*nh)*0.5
519
omega[0] = sqrt(p[0]+pp)
520
omega[1] = mass/omega[0]
523
sfomeg[0] = sf[0]*omega[ip]
524
sfomeg[1] = sf[1]*omega[im]
525
pp3 = max([pp+p[3],0])
526
chi[0] = sqrt(pp3*0.5/pp)
530
chi[1] = complex( nh*p[1] , p[2] )/sqrt(2*pp*pp3)
532
fim[0] = sfomeg[0]*chi[im]
533
fim[1] = sfomeg[0]*chi[ip]
534
fim[2] = sfomeg[1]*chi[im]
535
fim[3] = sfomeg[1]*chi[ip]
537
sqp0p3 = sqrt(max([p[0]+p[3],0])) * nsr
540
chi[1] = -nhel * sqrt(2*p[0])
542
chi[1] = complex( nh*p[1], p[2] )/sqp0p3
544
#fip[0] = complex( rZero )
545
#fip[1] = complex( rZero )
551
#fip(3) = complex( rZero )
552
#fip(4) = complex( rZero )
556
# recurent relation put her for optimization
557
cond1 = (pt == 0 and p[3] >= 0)
558
cond2 = (pt == 0 and p[3] < 0)
560
# spin-3/2 fermion wavefunction
562
for i,j in product(list(range(4)), list(range(4))):
563
rc[(i, j)] = ep[i] *fip[j]
566
for i,j in product(list(range(4)), list(range(4))):
568
rc[(i,j)] = sq2/sq3*e0[i]*fip[j] +1/sq3*ep[i]*fim[j]
570
rc[(i,j)] = sq2/sq3*e0[i]*fip[j] -1/sq3*ep[i]*fim[j]
572
rc[(i,j)] = sq2/sq3*e0[i]*fip[j] + \
573
1/sq3*ep[i]*fim[j] *complex(p[1],nsr*p[2])/pt
575
for i,j in product(list(range(4)), list(range(4))):
577
rc[(i,j)] = 1/sq3*em[i]*fip[j] +sq2/sq3*e0[i]*fim[j]
579
rc[(i,j)] = 1/sq3*em[i]*fip[j] -sq2/sq3*e0[i]*fim[j]
581
rc[(i,j)] = 1/sq3*em[i]*fip[j] + \
582
sq2/sq3*e0[i]*fim[j] *complex(p[1],nsr*p[2])/pt
584
for i,j in product(list(range(4)), list(range(4))):
586
rc[(i, j)] = em[i] *fim[j]
588
rc[(i, j)] = -em[i] *fim[j]
590
rc[(i, j)] = em[i]*fim[j] *complex(p[1],nsr*p[2])/pt
613
def orxxxx(p, mass, nhel, nsr):
614
""" initialize a incoming spin 3/2 wavefunction."""
616
# This routines is a python translation of a routine written by
617
# K.Mawatari in fortran dated from the 2008/02/26
620
ro = WaveFunction(spin=4)
626
pt2 = p[1]**2 + p[2]**2
627
pp = min([p[0], sqrt(pt2+p[3]**2)])
628
pt = min([pp,sqrt(pt2)])
630
rc[(4,0)] = complex(p[0],p[3])*nsr
631
rc[(5,0)] = complex(p[1],p[2])*nsr
634
nsv = nsr # nsv=+1 for final, -1 for initial
643
pzpt = p[3]/(pp*pt)*sqh
644
ep[1] = complex( -p[1]*pzpt , -nsv*p[2]/pt*sqh )
645
ep[2] = complex( -p[2]*pzpt , nsv*p[1]/pt*sqh )
648
ep[2] = complex( 0 , nsv*sign(sqh,p[3]) )
652
ep[2] = complex(0, nsv * sqh)
661
em[2] = complex( 0 , nsv*sqh )
667
pzpt = -p[3]/(pp*pt)*sqh
668
em[1] = complex( -p[1]*pzpt , -nsv*p[2]/pt*sqh )
669
em[2] = complex( -p[2]*pzpt , nsv*p[1]/pt*sqh )
672
em[2] = complex( 0 , nsv*sign(sqh,p[3]) )
674
if ( abs(nhel) <= 1 ):
678
#e0[0] = complex( rZero )
679
#e0[1] = complex( rZero )
680
#e0[2] = complex( rZero )
690
# e0[1] = complex( rZero )
691
# e0[2] = complex( rZero )
696
sqm, fop, omega, sf, sfomeg = [0]*2,[0]*4,[0]*2,[0]*2,[0]*2
699
pp = min([p[0],sqrt(p[1]**2+p[2]**2+p[3]**2)])
701
sqm[0] = sqrt(abs(mass)) # possibility of negative fermion masses
702
sqm[1] = sign(sqm[0],mass) # possibility of negative fermion masses
705
fop[0] = im * sqm[im]
706
fop[1] = ip*nsr * sqm[im]
707
fop[2] = im*nsr * sqm[-ip]
708
fop[3] = ip * sqm[-ip]
710
pp = min(p[0],sqrt(p[1]**2+p[2]**2+p[3]**2))
711
sf[0] = (1+nsr+(1-nsr)*nh)*0.5
712
sf[1] = (1+nsr-(1-nsr)*nh)*0.5
713
omega[0] = sqrt(p[0]+pp)
714
omega[1] = mass/omega[0]
715
ip = (3+nh)//2 -1 # -1 since this is index
716
im = (3-nh)//2 -1 # -1 since this is index
717
sfomeg[0] = sf[0]*omega[ip]
718
sfomeg[1] = sf[1]*omega[im]
719
pp3 = max([pp+p[3],0])
720
chi[0] = sqrt(pp3*0.5/pp)
724
chi[1] = complex( nh*p[1] , -p[2] )/sqrt(2*pp*pp3)
727
fop[0] = sfomeg[1]*chi[im]
728
fop[1] = sfomeg[1]*chi[ip]
729
fop[2] = sfomeg[0]*chi[im]
730
fop[3] = sfomeg[0]*chi[ip]
733
if(p[1] == 0 and p[2] == 0 and p[3] < 0):
736
sqp0p3 = sqrt(max(p[0]+p[3], 0))*nsr
740
chi[1] = complex(-nhel )*sqrt(2*p[0])
742
chi[1] = complex( nh*p[1], -p[2] )/sqp0p3
758
sqm, fom, omega, sf, sfomeg = [0]*2,[0]*4,[0]*2,[0]*2,[0]*2
764
pp = min([p[0],sqrt(p[1]**2+p[2]**2+p[3]**2)])
766
sqm[0] = sqrt(abs(mass)) # possibility of negative fermion masses
767
sqm[1] = sign(sqm[0],mass) # possibility of negative fermion masses
771
fom[0] = im * sqm[im]
772
fom[1] = ip*nsr * sqm[im]
773
fom[2] = im*nsr * sqm[-ip]
774
fom[3] = ip * sqm[-ip]
777
pp = min([p[0],sqrt(p[1]**2+p[2]**2+p[3]**2)])
778
sf[0] = (1+nsr+(1-nsr)*nh)*0.5
779
sf[1] = (1+nsr-(1-nsr)*nh)*0.5
780
omega[0] = sqrt(p[0]+pp)
781
omega[1] = mass/omega[0]
782
ip = (3+nh)//2 -1 #-1 since ip is an index
784
sfomeg[0] = sf[0]*omega[ip]
785
sfomeg[1] = sf[1]*omega[im]
786
pp3 = max([pp+p[3], 0])
787
chi[0] = sqrt(pp3*0.5/pp)
791
chi[1] = complex( nh*p[1] , -p[2] )/sqrt(2*pp*pp3)
794
fom[0] = sfomeg[1]*chi[im]
795
fom[1] = sfomeg[1]*chi[ip]
796
fom[2] = sfomeg[0]*chi[im]
797
fom[3] = sfomeg[0]*chi[ip]
799
if(p[1] == 0 == p[2] and p[3] < 0):
802
sqp0p3 = sqrt(max([p[0]+p[3],0]))*nsr
805
chi[1] = complex(-nhel )*sqrt(2*p[0])
807
chi[1] = complex( nh*p[1], -p[2] )/sqp0p3
819
cond1 = ( pt==0 and p[3]>=0)
820
cond2= (pt==0 and p[3]<0)
823
# spin-3/2 fermion wavefunction
825
for i,j in product(list(range(4)), list(range(4))):
826
rc[(i, j)] = ep[i] *fop[j]
830
for i,j in product(list(range(4)), list(range(4))):
832
rc[(i,j)] = sq2/sq3*e0[i]*fop[j] + 1/sq3*ep[i]*fom[j]
834
rc[(i,j)] = sq2/sq3*e0[i]*fop[j] - 1/sq3*ep[i]*fom[j]
836
rc[(i,j)] = sq2/sq3*e0[i]*fop[j] + 1/sq3*ep[i]*fom[j] * \
837
complex(p[1],-nsr*p[2])/pt
840
for i,j in product(list(range(4)), list(range(4))):
842
rc[(i,j)] = 1/sq3*em[i]*fop[j]+sq2/sq3*e0[i]*fom[j]
844
rc[(i,j)] =1/sq3*em[i]*fop[j]-sq2/sq3*e0[i]*fom[j]
846
rc[(i,j)] = 1/sq3*em[i]*fop[j] + sq2/sq3*e0[i]*fom[j] *\
847
complex(p[1],-nsr*p[2])/pt
849
for i,j in product(list(range(4)), list(range(4))):
851
rc[(i,j)] = em[i] * fom[j]
853
rc[(i,j)] = - em[i] * fom[j]
855
rc[(i,j)] = em[i] * fom[j] * complex(p[1],-nsr*p[2])/pt