11. Synchrotron Radiation#

11.1. History#

Synchrotron radiation was first observed in GE synchrotron on 1946.

../../_images/ge_synchrotron.png

Fig. 11.1 GE synchrotron#

../../_images/sr_paper_1947.png

Fig. 11.2 First paper of SR#

Then it was realized as the major obstacle to achieve higher electron energy in a ring accelerator. Since the radiation power is scaled as:

(11.1)#Pγ4ρ2

11.2. The Lienard- Wiechert Potential#

We are interested in the E-M field generated by a moving charged particle Suppose the charge particle has determined trajectory r0(tr), the time tr is the time at the charged particle. The observer located at P as position r=r0(tr)+R(tr). The time t is related to tr by:

(11.2)#tr+|R(tr)|c=t

tr is the retarded time. The time derivative of tr is given by:

(11.3)#d(tr+|R(tr)|c)=dt(1+ddtr|R(tr)|c)dtr=dt

from R2=RR, we have

(11.4)#dRdtr=vRR

So the tr ‘s derivative is :

(11.5)#dtrdt=11βR^

From the wave form of the Maxwell equation of one particle:

(11.6)#(2+1c22t2)ϕ=ρε0(2+1c22t2)A=μ0J

Here, the charged density and current density are

(11.7)#ρ=qδ(rr0(tr))J=qr(tr)δ(rr0(tr))

The scalar and vector potential are

(11.8)#ϕ(r,t)=14πϵ0qδ3(rrs(t))|rr|δ(ttr)dtd3rA(r,t)=μ04πqvs(t)δ3(rrs(t))|rr|δ(ttr)dtd3r

Then the potentials reduces to

(11.9)#ϕ(r,t)=14πϵ0q(1βR^)|rr0|A(r,t)=μ04πqv(1βR^)|rr0|

Both are evaluated at time tr.

Hide code cell source
import numpy as np
import matplotlib.pyplot as plt
%matplotlib widget

def cir_rtd_potential(theta, radius=1, boundary=10, ngrid=300, gamma=1000):
    beta_amp=np.sqrt(1-1/gamma**2)
    position=np.array([np.cos(theta), np.sin(theta)])*radius
    velocity=np.array([np.cos(theta+np.pi/2), np.sin(theta+np.pi/2)])*beta_amp
    x=np.linspace(-boundary/2.0, boundary/2.0, ngrid)
    y=np.linspace(-boundary/2.0, boundary/2.0, ngrid)
    xx,yy=np.meshgrid(x,y)
    rdist=np.sqrt((xx-position[0])**2+(yy-position[1])**2)
    betadotr=(velocity[0]*(xx-position[0])+velocity[1]*(yy-position[1]))/rdist
    phi=1/(1-betadotr)/rdist
    
    return xx, yy, phi
r=1
theta=3*np.pi/12
xx, yy, phi=cir_rtd_potential(theta, radius=r, gamma=500)
fig, ax=plt.subplots()
ax.set_xlim(-5,5)
ax.set_ylim(-5,5)
circle = plt.Circle( (0., 0. ), r ,fill = False, color='C3', alpha=0.5 )
 

ax.add_artist(circle)
ax.set_aspect('equal')
mask=xx*xx+yy*yy>1.3*r*r
ax.contour(xx, yy, phi, np.linspace(np.min(phi[mask]**0.5), np.max(phi[mask]**0.5),20, endpoint=True)**2, alpha=0.5)
ax.scatter([r*np.cos(theta),], [r*np.sin(theta),], c='C2', alpha=0.5)
<matplotlib.collections.PathCollection at 0x10eae47a0>

The fields therefore can be calculated as from

(11.10)#E=ϕAtB=×A

To evaluate these differential operations, it is important to know the following relations:

(11.11)#|rr0|=trd|rr0|dtr+R^=trcβR^+R^

And we know that

(11.12)#tr+1c|rr0|=0tr(1βR^)=1cR^

Therefore we can gather all useful relations below:

(11.13)#dtrdt=11βR^tr=1cR^1βR^|rr0|=R^(1R^β)

The the electric field gives:

(11.14)#E=q4πϵ0γ2R^βR2(1βR^)3+q4πϵ0cR^×(R^β)×β˙R(1βR^)3

The magnetic field gives:

(11.15)#B=R^×E/c

The first term does not involve acceleration, which described a ‘uniformly’ moving charge (see “The classical Theory of Fields” by Landau and Lifshitz). After a Lorentz transform, tt is just the static electric field from a charged particle. The emitted energy from this term is zero. Therefore only the contribution from the second term ‘radiates’ out, which is consequence of β˙, or acceleration.

11.3. Radiation Field and Flux#

The Poynting vector of the radiation term gives (using the fact R^E=0):

(11.16)#S=1μ0E×B=1μ0E×(R^×E/c)=1μ0cE2R^

The power dissipates in the unit solid angle gives, evalutated as source is :

(11.17)#dPdΩ=R2SR^dtdtr=(1R^βs)R2E2μ0c=q216π2ϵ0c(R^×((R^β)×β˙))2(1βR^)5

11.3.1. Non-relativistic limit#

In this limit, the approximation β1 is made, which leads to:

  • R^βR^

  • 1βR^1

Then the power flux gives:

(11.18)#dPdΩ=q216π2ϵ0c(R^×(R^×β˙))2=q216π2ϵ0c3v˙2(sinθ)2

Here we establish the spherical coordinate system along v˙ and the angle between v˙ and R^ is θ. Therefore the total power is simply:

(11.19)#P=dPdΩdΩ=q216π2ϵ0c3v˙202πdϕ0π(sinθ)2sinθdθ=14πϵ02q23c3v˙2

Which reduces to the Larmor’s formula

11.3.2. General Case#

In accelerator, we are interested in relativistic case. We start with

(11.20)#dPdΩ=q216π2ϵ0c(R^×((R^β)×β˙))2(1βR^)5=q216π2ϵ0c((R^β˙)(R^β)(1R^β)β˙)2(1βR^)5

We need to establish a spherical coordinate system to go further. Let’s assume β=β(0,0,1), β˙=β˙(sinΘ,0,cosΘ) and R^=(sinθcosϕ,sinθsinϕ,cosθ) and the result is calculated below by Sympy package.

Hide code cell source
import sympy
from sympy.physics.vector import ReferenceFrame
sympy.init_printing()
bth,th,ph=sympy.symbols(r"\Theta, \theta, \phi")
beta,dbeta=sympy.symbols(r"\beta, \dot{\beta}")
ref=ReferenceFrame('N')
beta=1*ref.z*beta
beta_dot=(sympy.sin(bth)*ref.x+sympy.cos(bth)*ref.z)*dbeta
r_hat=sympy.sin(th)*sympy.cos(ph)*ref.x+sympy.sin(th)*sympy.sin(ph)*ref.y+sympy.cos(th)*ref.z
temp1=r_hat.dot(beta_dot)*(r_hat-beta)-(1-r_hat.dot(beta))*beta_dot
temp1=sympy.simplify(temp1.magnitude()*temp1.magnitude())
temp2=(1-r_hat.dot(beta))*(1-r_hat.dot(beta))
temp2*=temp2
temp2*=(1-r_hat.dot(beta))
ang_dep=temp1/temp2
sympy.simplify(ang_dep.subs(bth,sympy.pi/2).subs(ph,ph))
int1=sympy.integrate(temp1/temp2, (ph,0,2*sympy.pi))
u,v=sympy.symbols(r"u,v")
int2=sympy.simplify(int1.subs(th, sympy.acos(u)))
#int2=sympy.simplify(int2.subs(u, (1+v)/ba))
intg1=sympy.simplify(sympy.integrate(int2, u))
sympy.simplify(intg1.subs(u,1)-intg1.subs(u,-1))
../../_images/0b0ed6ec2592e56b4c84ab4e01f3a523f8a140541b79e3c2d4c59c6b8082e071.png
(11.21)#P=dPdΩdΩ=q216π2ϵ0c8πβ˙2(β2sin2(Θ)1)3(β63β4+3β21)=14πϵ02q23cγ6β˙2(1β2sin2(Θ))=14πϵ02q23cγ6β˙2(1β2|β×β˙|2β2β˙2)=14πϵ02q23cγ6(β˙2|β×β˙|2)

We have derived the total power that emitted by an accelerated beam. The first term in the parentheses is the contribution from beam acceleration. The second term is the contribution from the bending term.

11.3.2.1. Radiation in linac#

In a linac, the total radiation power is:

(11.22)#P=14πϵ02q23cγ6β˙2

It is more convenient to convert the change of velocity to the energy. From β2γ2=γ21, we have

(11.23)#ββ˙=γ3γ˙=1mc2γ3dEdxdxdt=βmcγ3dEdx

Therefore:

(11.24)#P=14πϵ02q23cγ61m2c2γ6(dEdx)2=14πϵ02q2c3(mc2)2(dEdx)20.288eV/s×(Energy gradient [MeV/m]Beam rest energy [MeV])2

The angular dependence becomes:

(11.25)#dPdΩβ˙2sin2(θ)(βcos(θ)+1)5

when the beam is ultra-relativistic, β112γ2, sinθθ, and cosθ1θ2/2, therefore, the angular distribution becomes:

(11.26)#dPdΩβ˙2θ2(θ2+1γ2)5

The maximum angle locates at θ1γ.

Hide code cell source
import matplotlib.pyplot as plt
import numpy as np
%matplotlib widget
fig,ax=plt.subplots()
ax.set_xlabel(r"$\theta$")
ax.set_ylabel(r"Power")
def power_dis(theta, beta):
    return np.sin(theta)*np.sin(theta)/np.power(1.0-beta*np.cos(theta),5.0)
theta=np.linspace(0,np.pi/4,200)
betas=[0.8, 0.9,0.95,0.99]
for be in betas:
    ax.semilogy(theta, power_dis(theta,be), label=r'$\beta$={}'.format(be))
ax.legend(loc='best');
Hide code cell source
import matplotlib.pyplot as plt
import numpy as np

beta=0.9999
z=np.linspace(-2,20.0,1000)
x=np.linspace(-1.0,1.0,400)

zz,xx=np.meshgrid(z,x)
theta=np.arctan2(xx,zz)
r2=zz*zz+xx*xx
srp=np.sin(theta)*np.sin(theta)/np.power(1.0-beta*np.cos(theta),5.0)/r2

fig,ax=plt.subplots()
ax.set_ylabel("x [m]")
ax.set_xlabel("z [m]")
con=ax.contour(zz,xx,np.log(srp))
ax.clabel(con);

11.3.2.2. Radiation in dipole#

In the magnetic field, the velocity only changes its direction, β˙β, and the amplitude is

(11.27)#β˙=cβ2ρ

Then the total power is:

(11.28)#P=14πϵ02q23cγ6β˙2(1β2sin2(Θ))=14πϵ02q23cγ4β4ρ2

We try to re-express the power in terms of the classical radius r0 and radiation constant Cγ, who are defined as:

(11.29)#r0=14πϵ0q2mc2
(11.30)#Cγ=4π3r0(mc2)3

Then

(11.31)#P=Cγ2πcβ4E4ρ2

For different particle species the constant Cγ gives:

(11.32)#Cγ={8.85×105 m/(GeV)3Electron4.84×1014 m/(GeV)3Muon7.78×1018 m/(GeV)3Proton

The total energy radiated of the ring will be:

(11.33)#Ur=0TPdtCγ2πβ4E41ρ2ds

The angular distribution can be found as:

(11.34)#dPdΩβ˙2(1βcos(θ))5(β2sin2(ϕ)sin2(θ)+β22βcos(θ)+sin2(ϕ)sin2(θ)+cos2(θ))β˙2(1βcos(θ))5(sin2(ϕ)sin2(θ)γ2+(βcosθ)2)
Hide code cell source
import matplotlib.pyplot as plt
import numpy as np

beta=0.9999
gamma=1/np.sqrt(1-beta*beta)
print(gamma)
z=np.linspace(-2,20.0,1000)
x=np.linspace(-1.0,1.0,1000)


zz,xx=np.meshgrid(z,x)
theta=np.arctan2(xx,zz)
r2=zz*zz+xx*xx

sphi=1
sphith=sphi*np.sin(theta)/gamma
cth=np.cos(theta)
srp=(sphith*sphith+(beta-cth)*(beta-cth))/np.power(1.0-beta*cth,5.0)/r2


fig,ax=plt.subplots()
ax.set_ylabel("x [m]")
ax.set_xlabel("z [m]")
con=ax.contour(zz,xx,np.log(srp))
ax.clabel(con);
70.71244595191452

In the relativistic limit, we have

(11.35)#dPdΩβ˙2(1βcos(θ))5(sin2(ϕ)sin2(θ)γ2+(βcosθ)2)β˙2(1γ2+θ2)5(4sin2(ϕ)θ2γ2+(1γ2θ2)2)

The power will drop significantly when θ1/γ.

11.4. Radiation Spectrum#

11.4.1. Qualitative analysis#

../../_images/sr_ering.png

Fig. 11.3 Cartoon of an ESR#

We are interested in an electron storage ring. The retarded time interval of shining the SR cone to a far field target is

(11.36)#Δtrρθβcργc

Convert to the observer’s time:

(11.37)#Δt=dtdtrΔtrργ3c

Therefore the frequency content is approximated with:

(11.38)#ω1/Δtγ3cργ3ω0

11.4.2. Quantitative analysis#

To study the frequency spectrum of the synchrotron radiation, we return to the flux, evaluated at the observation point gives

(11.39)#dPdΩ=R2SR^=1μ0cR2E2G(t)2

We define an amplitude radiation function which is the square root of the flux:

(11.40)#G(t)=1μ0cR(t)E

Then the frequency content is given by Fourier transform:

(11.41)#G(ω)=12πG(t)eiωtdt=q4πϵ0c12πμ0cR^×(R^β)×β˙(1βR^)3eiωtdt=q232π3ϵ0cR^×(R^β)×β˙(1βR^)2eiω(tr+R/c)dtr

Now we have to use far field approximation to proceed. We know that R=rr0. The far field approximation implies |r||r0|, then

(11.42)#R=|rr0|=r|r^r0/r|r(1r^r0/r)rR^r0

Then the frequency spectrum becomes

(11.43)#G(ω)=q232π3ϵ0ceiωr/cR^×(R^β)×β˙(1βR^)2eiω(trR^r0/c)dtr=iωq232π3ϵ0ceiωr/cR^×(R^×β)eiω(trR^r0/c)dtr

Here we use the relation below and integration by part:

(11.44)#ddtr(R^×(R^×β)1βR^)=R^×(R^β)×β˙(1βR^)2

Here we found the frequency spectrum of the radiation amplitude. However, what we can measure is the total radiation energy per solid angle:

(11.45)#dUdΩ=dPdΩdt=|G(t)|2dt=|G(ω)|2dω(Parseval's theorem)=20|G(ω)|2dω0dIdωdω(Real signal)

Therefore we will then focus on the spectrum of the energy:

(11.46)#dIdω=2|G(ω)|2=q2ω216π3ϵ0c|R^×(R^×β)eiω(trR^r0/c)dtr|2
../../_images/sr_coordinate.png

Fig. 11.4 Coordinates for calculation#

Now we concentrate on the spectrum of an electron storage ring with coordinate as shown.
Assume r0 is along a ring with radius ρ, therefore:

(11.47)#r0=ρ(1cos(ω0tr),0,sin(ω0tr))

Here, ω0 is the angular revolution frequency. The velocity therefore gives

(11.48)#β=β(sin(ω0tr),0,cos(ω0tr))

And the unit vector R^ in spherical coordinate is written as:

(11.49)#R^=(sinθcosϕ,sinθsinϕ,cosθ)

We may only consider the tangential plane (y-z), without losing generality, viz. ϕ=π/2. Therefore

(11.50)#R^=(0,sinθ,cosθ)

Also we use the following assumption:

  • small cone size θ1/γ1

  • short retarded time interval ω0tr1

We have:

(11.51)#R^×(R^×β)=R^(R^β)β=β(ω0tr,θ,0)

and

(11.52)#ω(trR^r0/c)=ω(trρcsin(ω0tr)cosθ)=ω(trβω0sin(ω0tr)cosθ)=ω(tr1ω0(112γ2)(ω0trω03tr36)(1θ22))=ω(tr(112γ2)(trω02tr36)(1θ22))=ω2((θ2+1γ2)tr+ω02tr33)

Now, we redefine the variable aγθ1, and further define:

(11.53)#xω02tr2θ2+1γ2=γω0tr(1+a2)1/2ξω3(1+a2)3/2γ3ω0=ω2ωc(1+a2)3/2

Here we define the critical frequency of synchrotron radiation:

(11.54)#ωc32γ3ω03γ3c2ρ

Then, we have:

(11.55)#ω(trR^r0/c)=32ξ(x+x33)

The spectrum of the energy flux finally reduces to:

(11.56)#dIdω=q2ω216π3ϵ0c|R^×(R^×β)eiω(trR^r0/c)dtr|2=q2ω216π3ϵ0c|β(ω0trx^+θy^)exp(i32ξ(x+x33))dtr|2β2q2ω216π3ϵ0c|(Gxx^+Gyy^))|2

Clearly, the total frequency spectrum of the radiation intensity consists the contribution from two transverse components Gx and Gy. The integral yields the modified Bessel functions of the second kind:

(11.57)#Gx=1+a2ω0γ2xexp(i32ξ(x+x33))dx=231+a2ω0γ2K2/3(ξ)Gy=a(1+a2)1/2ω0γ2exp(i32ξ(x+x33))dx=23a(1+a2)1/2ω0γ2K1/3(ξ)

Then the frequency spectrum becomes

(11.58)#dIdω=β2q2ω216π3ϵ0c|(Gxx^+Gyy^))|2=β2q2ω216π3ϵ0c431+a2ω02γ4((1+a2)K2/32(ξ)+a2K1/32(ξ))

We are interest in the frequency range of the characteristic frequency of the SR. Using the definition of critical frequency, ωc=3γ3ω0/2:

(11.59)#dIdω=3q216π3ϵ0cω2ωc2γ2(1+a2)2(K2/32(ξ)+a21+a2K1/32(ξ))=3q24π3ϵ0cξ2γ2(1+a2)1(K2/32(ξ)+a21+a2K1/32(ξ))

The two terms of modified Bessel function corresponds to the contribution from the horizontal and vertical polarized radiation field respectively.
We see that in the bending plane, a=γθ=0, the radiation is purely horizontal polarized.

Hide code cell source
import matplotlib.pyplot as plt
import numpy as np
import scipy.special as special
%matplotlib widget


fig, ax=plt.subplots()
ax.set_xlim(1e-5,10)
ax.set_ylim(1e-8,1)
ax.set_xlabel(r'$\omega/\omega_c$')
ax.set_ylabel(r'$\sim dI/ d\omega$')
omega_ratio=np.logspace(-6,1,1000)
for a in [0,1,2,5]:
    xi=omega_ratio/2.0*(1+a*a)**1.5
    k23=special.kv(2.0/3,xi)
    k13=special.kv(1.0/3,xi)
    Igx=xi*xi*k23*k23
    Igy=xi*xi*k13*k13

    ax.loglog(omega_ratio, (Igx+a*a*Igy/(1+a*a))/(1+a*a), label=r'$\gamma\theta={}$'.format(a))
ax.legend(loc='best');

We see that the spectrum is broad band and sudden drops when the the frequency exceeds the critical frequency.

Recall that:

(11.60)#dUdΩ=0dIdωdω

Therefore, the energy spectrum can be achieved by integrating all solid angles:

(11.61)#dUdω=dIdωdΩ=3q24πϵ0cγωωcω/ωcK5/3(ξ)dξ

By defining

(11.62)#S(ξ)=938πξξK5/3(ξ)dξ

which satisfy 0S(ξ)dξ=1, we will rewrite the energy spectrum as:

(11.63)#dUdω=2q29ϵ0cγS(ωωc)
Hide code cell source
import matplotlib.pyplot as plt
import numpy as np
import scipy.special as special
import pickle
%matplotlib widget

omega_ratio=np.logspace(-6,1,10001)
xi=np.sqrt((omega_ratio[:-1]*omega_ratio[1:]))
k53=special.kv(5.0/3,xi)
diff=np.diff(omega_ratio)
allsum=np.sum(k53*diff)
intg=allsum-np.cumsum(k53*diff)
s_xi=xi*intg*9*np.sqrt(3)/8/np.pi


int2=np.sum(s_xi*diff)

fig, ax=plt.subplots()
ax.set_xlim(1e-6,20)
#ax.set_ylim(1e-8,1)
ax.set_xlabel(r'$\omega/\omega_c$')
ax.set_ylabel(r'$S(\omega/\omega_c)$')
omega_ratio=np.logspace(-6,1,1000)
ax.loglog(xi, s_xi, label=r'$S(\omega/\omega_c)$')
ax.legend(loc='best')
print("The integral of S function is:", int2);
The integral of S function is: 0.9976699617994194

The total energy can be also attained from the frequency domain integration.

(11.64)#U=0dUdωdω=2q29ϵ0cγ0S(ωωc)dω=2q29ϵ0cγωc=q23ϵ0ργ4=2πρcP

We return to the earlier SR power from time domain integral.

11.5. Quantum Fluctuation#

The photon emission in the SR process is a quantum effect. The energy u of the photon is related to its frequency by u=ω The photon number is found by:

(11.65)#un(u)du=dUdωdω

Therefore: the photon number density gives:

(11.66)#n(u)=12ωdUdω=12ωc22q2ωc9ϵ0cγωcωS(ωωc)=USRuc2ωcωS(ωωc)

here uc=ωc is the critical photon energy. And using the integration fact:

(11.67)#0S(ξ)ξdξ=1538

We get the total emitted photon in one revolution gives:

(11.68)#N=n(u)du=1538USRuc=1538q23ϵ0ργ2ρ3c=5π3q24πϵ0cγ=5π3αγ

Here α is the fine structure constant. These photons emits randomly around one revolution.

The average emitted photon gives energy by

(11.69)#u¯=1N0un(u)du=8153uc

And the variation gives by

(11.70)#u2¯=1N0u2n(u)du=1127uc2

We can summarized the synchrotron radiation parameters’s dependence on energy:

Quantities

Power of energy

Radiation Power (fix ρ)

Pγ4/ρ2

Radiation Power (fix field)

Pγ2B2

Number of Photon

Nγ

Average photon energy

u¯γ3

Photon energy variation

u2¯γ6

Accumulated photon energy variation

Nu2¯γ7