from pyscript import *
defaults.units=UNITS['mm']
defaults.linewidth=1
black = Color("Black")
grey = Color("LightGray")
laserCol = Color("OrangeRed")
pumpCol = Color("RoyalBlue")
def ScaledText(text,**dict):
t=TeX(text).scale(2,2)
apply(t,(),dict)
return t
def arrowhead(n,wid,len,angle,col):
L = P(0,len)
W = P(wid,0)
arrow = Path(n,n-L+W,n-L-W,n,bg=col).rotate(angle,p=n)
return arrow
def loop(c,radius):
return Circle(r=radius,c=c)
def fibre(c):
loops = Group(
loop(c+P(0,1),10),
loop(c,10),
loop(c-P(0,1),10)
)
l = 10
x1 = P(0,l)
x2 = P(0,1.5*l)
x3 = P(-l/2,2*l)
x4 = P(-l,2.5*l)
return Group(
Path(loops.e,
loops.e+x1,
C(loops.e+x2, loops.e+x2),
loops.e+x3
#loops.e+x4
),
Path(loops.w,
loops.w-x1,
C(loops.w-x2, loops.w-x2),
loops.w-x3
#loops.w-x4
),
loops
).rotate(-45,p=c)
def fibrecoupler(c,angle):
boxW = 15
boxH = 12
nozzle = 3
box = Rectangle(c=c+P(boxW/6,0),width=boxW,height=boxH)
fibrepos = c
lenspos = box.e-P(box.width/3,0)
irispos = box.e-P(box.width/12,0)
irisInside = P(0,1)
irisOutside = P(0,5)
iris = Group(
Path(irispos+irisInside,
irispos+irisOutside
),
Path(irispos-irisInside,
irispos-irisOutside
)
)
lens = Circle(r=4)
lens.scale(0.3,1)
lens.c = lenspos
coupler = Group(
box,
Path(box.w,fibrepos),
Path(fibrepos,
fibrepos-P(0,nozzle/2),
fibrepos-P(nozzle,0),
fibrepos+P(0,nozzle/2),
fibrepos,
bg=black
),
lens,
iris
).rotate(angle,p=c)
return coupler
def fibrecollimator(c,angle):
rectW = c
collimator = Group(
Path(c,
c+P(0,1.5),
c+P(-3,0),
c+P(0,-1.5),
c,
bg=black
),
Rectangle(w=rectW,width=2,height=8,bg=black)
).rotate(angle,p=c)
return collimator
def hologram(c,angle):
platesize = P(0,6)
plate = Path(c-platesize,c+platesize,linewidth=3)
stageStart = 1.25*platesize
stageFinish = 2.25*platesize
arrowL = 2
arrowW = 1
offset = arrowL/4
hologram = Group(
plate,
Path(c+stageStart,c+stageFinish-P(0,offset)),
Circle(r=0.75,c=c+stageStart,bg=black),
arrowhead(c+stageFinish,arrowW,arrowL,0,black),
ScaledText(r"$x$",c=c+stageFinish-P(4,0)),
ScaledText(r"$y$",c=c+stageStart-P(4,0))
)
return hologram
def laser(e):
box = Rectangle(e=e,width=20,height=8,bg=grey)
lasername = ScaledText(r'Laser',c=box.c,fg=Color("DarkBlue"));
#I want to do a squiggle with an arrow (the light symbol)
return Group(
box,
lasername,
)
coupler1 = fibrecoupler(P(180,10),180)
coupler2 = fibrecoupler(P(180,10),180)
analyser1 = Group(
Path(P(110,10),P(150,10),linewidth=2,fg=laserCol),
arrowhead(P(140,10),1,3,90,laserCol),
Path(P(150,10),P(180,10),linewidth=2,fg=laserCol).rotate(-22.5,p=P(150,10)),
hologram(P(150,10),0),
coupler1.rotate(-22.5,p=P(150,10))
)
analyser2 = Group(
Path(P(110,10),P(150,10),linewidth=2,fg=laserCol),
arrowhead(P(140,10),1,3,90,laserCol),
Path(P(150,10),P(180,10),linewidth=2,fg=laserCol).rotate(22.5,p=P(150,10)),
hologram(P(150,10),0),
coupler2.rotate(22.5,p=P(150,10))
)
analyser1.rotate(40,p=P(110,10))
point1 = analyser1.itoe(analyser1[4].w)
analyser2.rotate(-40,p=P(110,10))
point2 = analyser2.itoe(analyser2[4].w)
fibre1 = fibre(P(220,10))
fibre1.scale(1,-1,p=fibre1.c)
#fibre1.move(point1+P(10,-5)-fibre1.itoe(fibre1[0].path[-1]))
fibre1.move(point1+P(10,-5)-fibre1.itoe(fibre1[0].P(1)))
fibre2 = fibre(P(220,10))
#fibre2.move(point2+P(10,5)-fibre2.itoe(fibre2[0].path[-1]))
fibre2.move(point2+P(10,5)-fibre2.itoe(fibre2[0].P(1)))
detector1 = Group(
Rectangle(c=P(240,10),width=10,height=10,bg=black),
Circle(r=5,c=P(245,10),bg=black),
)
#detector1.move(fibre1.itoe(fibre1[1].path[-1])-detector1[1].w)
detector1.move(fibre1.itoe(fibre1[1].P(1))-detector1[1].w)
detector2 = Group(
Rectangle(c=P(240,10),width=10,height=10,bg=black),
Circle(r=5,c=P(245,10),bg=black),
)
#detector2.move(fibre2.itoe(fibre2[1].path[-1])-detector2[1].w)
detector2.move(fibre2.itoe(fibre2[1].P(1))-detector2[1].w)
render(
laser(P(70,10)),
Path(P(70,10),P(110,10),linewidth=2,fg=pumpCol),
arrowhead(P(100,10),1,3,90,pumpCol),
Path(P(110,10),P(140,10),linewidth=2,fg=pumpCol),
arrowhead(P(130,10),1,3,90,pumpCol),
Rectangle(c=P(140,10),width=4,height=4,fg=None,bg=black),
analyser1,
analyser2,
# label analyser hologram
# label coupler2
Rectangle(c=P(110,10),height=12,width=3,bg=grey),
ScaledText(r'BBO',n=P(110,2)),
ScaledText(r'coupler 2',s=point2+P(-5,5)),
Path(
point1,
C(point1+P(5,-5), point1+P(5,-5)),
point1+P(10,-5),
),
Path(
point2,
C(point2+P(5,5), point2+P(5,5)),
point2+P(10,5),
),
ScaledText(r'holo 1',s=P(140,-28)),
ScaledText(r'holo 2',s=P(135,48)),
# label preparation hologram
# insert fibre between coupler and fibre loop
fibre1,
Rectangle(width=20,height=7,c=fibre1.c,bg=Color(1)),
ScaledText(r'SMF',c=fibre1.c),
fibre2,
Rectangle(width=20,height=7,c=fibre2.c,bg=Color(1)),
ScaledText(r'SMF',c=fibre2.c),
# insert fibre between coupler and detector
detector1,
ScaledText(r'detector 1',nw=detector1.itoe(detector1[1].s)+P(-3,-3)),
# label detector
detector2,
ScaledText(r'detector 2',sw=detector2.itoe(detector2[1].n)+P(-3,3)),
# label detector
Path(detector1.itoe(detector1[1].e),
detector1.itoe(detector1[1].e)+P(20,0)
),
Path(detector2.itoe(detector2[1].e),
detector2.itoe(detector2[1].e)+P(20,0)
),
arrowhead(detector1.itoe(detector1[1].e)+P(20,0),1,3,90,black),
arrowhead(detector2.itoe(detector2[1].e)+P(20,0),1,3,90,black),
ScaledText(r'''\begin{center}
Coincidence Counting\\Electronics\end{center}''',
w=P(240,10)),
file="twoqubitQST.eps"
)
|