Beispiel #1
0
 def showResult():
     wavelength = float(entrystrings[0].get())  # laser wavelength in nm
     beamwaist = float(entrystrings[1].get())   # beam waist in m
     power = float(entrystrings[2].get())       # power in Watts 
     bprop = [wavelength, power, beamwaist] # collect beam properties
     atomSymbol = entrystrings[3].get()         # choose Rb or Cs
     L = int(entrystrings[4].get())             # orbital angular momentum
     J = float(entrystrings[5].get())             # total angular momentum
     
     # choose element
     if atomSymbol == "Rb87":
         atomObj = atom(atm = 'Rb87')
         F = 1
     elif atomSymbol == "Cs133":
         atomObj = atom(atm = 'Cs133')
         F = 3
     elif atomSymbol == "K41":
         atomObj = atom(atm = 'K41')
         F = 1
     else:
         messagebox.showinfo("Error", "You must choose Rb87, Cs133 or K41")
         return 0
     
     # get transition data for the given state
     if L == 0:
         D0, w0, lw, nlj = atomObj.D0S, atomObj.w0S, atomObj.lwS, atomObj.nljS
     elif L == 1 and J == 0.5:
         D0, w0, lw, nlj = atomObj.D0P1, atomObj.w0P1, atomObj.lwP1, atomObj.nljP1
     elif L == 1 and J == 1.5:
         D0, w0, lw, nlj = atomObj.D0P3, atomObj.w0P3, atomObj.lwP3, atomObj.nljP3
     
     # construct the instance of the dipole class
     dipoleObj = dipole(atomObj, (L,J,F,F), bprop)
     
     messagebox.showinfo("Calculation Result", getStarkShift(dipoleObj))
Beispiel #2
0
def compareArora():
    """Plot Fig. 5 - 8 in Arora et al 2007 to show that the polarisabilities 
    of Rb and Cs without hyperfine levels are correct"""
    # beam properties: wavelength, power, beam waist
    # intensity set to 1e10 MW/cm^2
    bprop = [1064e-9, np.pi*0.5e-2, 1e-6]
    
    for ATOM in [atom(atm = 'Rb87'), atom(atm = 'Cs133')]:
        if ATOM.X == 'Rb87':
            wavel1 = np.linspace(780, 800, 200)*1e-9
            Ylim1 = (-8000, 8000)
            wavel2 = np.linspace(787,794, 200)*1e-9 
            Ylim2 = (-1000, 1000)
            FS, FP = 1, 3
        elif ATOM.X == 'Cs133':
            wavel1 = np.linspace(925, 1000, 200)*1e-9
            Ylim1 = (-1000, 5000)
            wavel2 = np.linspace(927, 945, 200)*1e-9
            Ylim2 = (-100, 100)
            FS, FP = 3, 5
            
        S = dipole(ATOM, (0,1/2.,FS,FS), bprop)
        
        P3 = dipole(ATOM, (1,3/2.,FP,FP), bprop)
                        
        # compare polarisability of excited states
        plt.figure()
        plt.title("Polarisability of "+ATOM.X)
        plt.plot(wavel1*1e9, S.polarisability(wavel1)/au, 'r', label='s')
        plt.plot(wavel1*1e9, P3.polarisability(wavel1,mj=0.5)/au, 'g--', label='p$_{3/2}$, mj=1/2')
        plt.plot(wavel1*1e9, P3.polarisability(wavel1,mj=1.5)/au, 'm:', label='p$_{3/2}$, mj=3/2')
        plt.legend()
        plt.xlabel("Wavelength (nm)")
        plt.ylabel("Polarisability (a.u.)")
        plt.ylim(Ylim1)
        plt.xlim(wavel1[0]*1e9, wavel1[-1]*1e9)
        
        # calculate stark shifts between F, MF states
        mfLS = ['r', 'g--', 'm:', 'c-.', 'k-.', 'y']  # line styles
        plt.figure()
        plt.title("AC Stark Shifts for transitions from P$_{3/2}$ m$_F$ to \nthe groundstate in "+ATOM.X)
        dES = S.acStarkShift(0,0,0, wavel2, HF=True)   # ground state stark shift
        for MF in range(FP+1):
            P3.MF = MF
            dEPMF = P3.acStarkShift(0,0,0, wavel2, HF=True) # excited MF state stark shift
            plt.plot(wavel2*1e9, (dEPMF - dES)/h/1e6, mfLS[MF], label=r'm$_F$ = $\pm$'+str(MF))
        xlims = [wavel2[0]*1e9, wavel2[-1]*1e9]
        plt.plot(xlims, [0,0], 'k:', alpha=0.4)  #  show where zero is
        plt.ylim(Ylim2)
        plt.xlim(xlims)
        plt.xlabel("Wavelength (nm)")
        plt.ylabel("Stark Shift (MHz)")
        plt.legend()
        
    plt.show()
Beispiel #3
0
def compareKien():
    """compare Kien 2013 Fig 4,5"""
    bprop =[880e-9,20e-3,1e-6]
    Cs = atom(atm = 'Cs133')
    Cs880 = dipole(Cs, (0,1/2.,3,3), bprop)
                    
    CsP = dipole(Cs, (1,3/2.,3,3), bprop)               
    
    wls = [np.linspace(680, 690, 200)*1e-9, np.linspace(930, 940, 200)*1e-9]
    ylims = [(-1200, 300), (-3000, 6000)]
    for ii in range(2):
        plt.figure()
        plt.title("Cs Polarisabilities. Red: 6S$_{1/2}$, Blue: 6P$_{3/2}$.\nscalar: solid, vector: dashed, tensor: dotted")
        a1 = Cs880.polarisability(wls[ii],mj=0.5,split=True)
        a2 = 0.5*(np.array(CsP.polarisability(wls[ii],mj=1.5, split=True))+
            np.array(CsP.polarisability(wls[ii],mj=0.5, split=True)))
        ls = ['-', '--', ':']
        for i in range(3):
            plt.plot(wls[ii]*1e9, a1[i]/au, 'r', linestyle=ls[i], label="Cs")
            plt.plot(wls[ii]*1e9, a2[i]/au, 'b', linestyle=ls[i], label="$P_{3/2}$")
        #plt.legend()
        plt.ylim(ylims[ii])
        plt.xlabel("Wavelength (nm)")
        plt.ylabel("Polarisablity (a.u.)")
        plt.show()
"""Stefan Spence 04.07.19

estimate the displacement of the trap centre due to the vector 
light shift in a tweezer trap using the formula from 
B. Albrecht et al. PRA 94, 061401(R) (2016)
"""
import numpy as np
import matplotlib.pyplot as plt
import sys
sys.path.append(r'Y:\Tweezer\Code\Python 3.5\polarisability')
sys.path.append(r'Z:\Tweezer\Code\Python 3.5\polarisability')
from AtomFieldInt_V3 import dipole, atom, c, eps0, h, hbar, a0, e, me, kB, amu, Eh, au

Rb = atom(atm='Rb87')
Cs = atom(atm='Cs133')
# from scipy.constants import physical_constants
# muB = physical_constants['Bohr magneton']

wavelength = 1064e-9  # wavelength in m
power = 5e-3  # beam power in W
waist = 1.2e-6  # beam waist of tweezer in m
ehat = (2**(-0.5), 1j * 2**(-0.5), 0)  # E field circular polarisation

# create dipole objects for ground state Rb / Cs
bprop = [wavelength, power, waist, ehat]
Rb5S = dipole(Rb, (0, 1 / 2., 1, 1), bprop)
# Rb5S.gJ = 2.00233113 # Fine structure Lande g-factor (from Steck)

Cs6S = dipole(Cs, (0, 1 / 2., 3, 3), bprop)
# Cs6S.gJ = 2.00254032 # Fine structure Lande g-factor (from Steck)
Calculate the polarisability of Cs and Na while merging as in 
L. R. Liu et al., Science 360, 900–903 (2018)
assuming hyperfine transitions can be ignored
"""
import numpy as np
import matplotlib.pyplot as plt
import os

os.chdir(os.path.dirname(os.path.realpath(__file__)))
import sys

sys.path.append('..')
from AtomFieldInt_V3 import (dipole, atom, c, eps0, h, hbar, a0, e, me, kB,
                             amu, Eh, au, atom)

Rb = atom(atm='Rb87')
Cs = atom(atm='Cs133')
Na = atom(atm='Na23')

Cswl = 976e-9  # wavelength of the Cs tweezer trap in m
Nawl = 700e-9  # wavelength of the Rb tweezer trap in m
Cspower = 5e-3  # power of Cs tweezer beam in W
Napower = 5e-3  # power of Rb tweezer beam in W
Cswaist = 0.8e-6  # beam waist for Cs in m
Nawaist = 0.7e-6  # beam waist fir Na in m

# Cs in its own tweezer
Cs976 = dipole(Cs, (0, 1 / 2., 4, 4), [Cswl, Cspower, Cswaist])
# Cs in the Na tweezer
Cs700 = dipole(Cs, (0, 1 / 2., 4, 4), [Nawl, Napower, Nawaist])
# Na in the Cs tweezer
Beispiel #6
0
def check880Trap(wavelength = 880e-9,     # wavelength in m
                 wavels = np.linspace(795,930,500)*1e-9, # wavelengths in m to plot
                 power = 5e-3,            # beam power in W
                 beamwaist = 1e-6,        # beam waist in m
                 species = 'Rb'):         # which species to set a 1mK trap for
    """Plot graphs of the trap depth experienced by Cs around 880nm when 
    the ground state Rb trap depth is fixed at 1mK. Look at the scattering
    rates and hence trap lifetimes that are possible."""
    bprop = [wavelength, power, beamwaist]
    Rb = atom(atm = 'Rb87')
    Rb5S = dipole(Rb, (0,1/2.,1,1), bprop)
    
    Rb5P = dipole(Rb, (1,3/2.,1,1), bprop)
    
    Cs = atom(atm = 'Cs133')                
    Cs6S = dipole(Cs, (0,1/2.,3,3), bprop)
                    
    Cs6P = dipole(Cs, (1,3/2.,3,3), bprop)               
    
    # choose power so that Rb trap depth is fixed at 1 mK:
    if species == Cs.X:
        Powers = abs(1e-3*kB * np.pi * eps0 * c * beamwaist**2 / Cs6S.polarisability(wavels)) # in Watts
    else:
        Powers = abs(1e-3*kB * np.pi * eps0 * c * beamwaist**2 / Rb5S.polarisability(wavels)) # in Watts
    _, ax1 = plt.subplots()
    ax1.set_title('Fixing the trap depth of ground state '+species+' at 1 mK')
    ax1.set_xlabel('Wavelength (nm)')
    ax1.plot(wavels*1e9, Powers*1e3, color='tab:blue')
    ax1.set_ylabel('Power (mW)', color='tab:blue')
    ax1.tick_params(axis='y', labelcolor='tab:blue')
    ax1.set_xlim(wavels[0]*1e9, wavels[-1]*1e9)
    # ax1.set_ylim(min(Powers)*1e3-0.5, 15)

    ax2 = ax1.twinx()
    # now the power and the wavelength are varied:
    Llabels = ['$S_{1/2}$', '$P_{3/2}$']
    if species == Cs.X:
        colors = ['k', 'tab:orange', 'tab:orange', 'tab:orange']
        linestyles = ['--', '-.', '-', ':']
    else:
        colors = ['tab:orange', 'tab:orange', 'k', 'tab:orange']
        linestyles = ['-', '-.', '--', ':']
    
    trapdepths = []
    for obj in [Cs6S, Cs6P, Rb5S, Rb5P]:
        res = np.zeros(len(Powers))
        for i in range(len(Powers)):
            obj.field.E0 = 2 * np.sqrt(Powers[i] / eps0 / c / np.pi)/beamwaist
            # average mj states (doesn't have any effect on j=1/2 states)
            res[i] = 0.5*(obj.acStarkShift(0,0,0, wavels[i], mj=1.5) + 
                    obj.acStarkShift(0,0,0, wavels[i], mj=0.5))
        color = colors.pop(0)
        ls = linestyles.pop(0)
        ax2.plot(wavels*1e9, res*1e3/kB, color=color, label=obj.X+" "+Llabels[obj.L], linestyle=ls)
        trapdepths.append(res)

    ax2.plot(wavels*1e9, np.zeros(len(wavels)), 'k', alpha=0.1) # show zero crossing    
    ax2.set_ylabel('Trap Depth (mK)', color='tab:orange')
    ax2.legend()
    ax2.set_ylim(-3, 3)
    ax2.tick_params(axis='y', labelcolor='tab:orange')
    plt.tight_layout()

    I = 2*Powers / np.pi / beamwaist**2
    # scattering rate of Cs from the D2 line:
    deltaCsD1 = 2*np.pi*c * (1/wavels - 1/Cs.rwS[0]) # detuning from D1 (rad/s)
    deltaCsD2 = 2*np.pi*c * (1/wavels - 1/Cs.rwS[35]) # detuning from D2 (rad/s)
    IsatCsD1 = 2.4981 *1e-3 *1e4 # saturation intensity for D1 transition, sigma polarised
    IsatCsD2 = 1.1023 *1e-3 *1e4 # saturation intensity for D2 transition, pi polarised
    CsRsc = 0
    for vals in [[Cs.lwS[0], deltaCsD1, IsatCsD1], [Cs.lwS[35], deltaCsD2, IsatCsD2]]:
        CsRsc += vals[0]/2. * I/vals[2] / (1 + 4*(vals[1]/vals[0])**2 + I/vals[2])
    # Cstau = 1e-3*kB / (hbar*(2*np.pi/wavels))**2 * 2.*Cs.m / CsRsc # the lifetime is the trap depth / recoil energy / scattering rate
    Cst = 4*np.sqrt(Cs.m*abs(trapdepths[0])) / (2*np.pi/wavels)**2 /hbar /beamwaist /CsRsc # duration in vibrational ground state (s) = 1/Lamb-Dicke^2 /Rsc

    # scattering rate of Rb from the D1 line:
    deltaRbD1 = 2*np.pi*c * (1/wavels - 1/Rb.rwS[0]) # detuning from D1 (rad/s)
    IsatRbD1 = 4.484 *1e-3 *1e4 # saturation intensity for D1 transition, pi polarised
    RbRsc = Rb.lwS[0]/2. * I/IsatRbD1 / (1 + 4*(deltaRbD1/Rb.lwS[0])**2 + I/IsatRbD1) # per second
    # Rbtau = 1e-3*kB / (hbar*(2*np.pi/wavels))**2 * 2.*Rb.m / RbRsc # the lifetime is the trap depth / recoil energy / scattering rate
    Rbt = 4*np.sqrt(Rb.m*abs(trapdepths[2])) / (2*np.pi/wavels)**2 /hbar /beamwaist /RbRsc # duration in vibrational ground state (s) = 1/Lamb-Dicke^2 /Rsc

    # plot lifetime and scattering rate on the same axis:
    for Rsc, ts, X in [[RbRsc, Rbt, Rb.X], [CsRsc, Cst, Cs.X]]:
        fig, ax3 = plt.subplots()
        ax3.set_title('Scattering rate and lifetime of ground state '+X+' in a 1 mK trap (for '+species+')')
        ax3.set_xlabel('Wavelength (nm)')
        ax3.semilogy(wavels*1e9, Rsc, color='tab:blue')
        ax3.plot(wavels*1e9, np.zeros(len(wavels))+100, '--', color='tab:blue', alpha=0.25) # show acceptable region
        ax3.set_ylabel('Scattering rate ($s^{-1}$)', color='tab:blue')
        ax3.tick_params(axis='y', labelcolor='tab:blue')
        ax3.set_xlim(wavels[0]*1e9, wavels[-1]*1e9)
        ax3.set_ylim(1, 1e5)

        ax4 = ax3.twinx()
        ax4.semilogy(wavels*1e9, ts, color='tab:orange')
        ax4.plot(wavels*1e9, np.ones(len(wavels))/2., '--', color='tab:orange', alpha=0.25) # show acceptable region
        ax4.set_ylabel('Time in the vibrational ground state (s)', color='tab:orange')
        ax4.tick_params(axis='y', labelcolor='tab:orange')
        ax4.set_ylim(0.001,10)
        plt.tight_layout()
    
    plt.show()
Beispiel #7
0
def plotStarkShifts(ATOM1 = atom(atm = 'Rb87'),ATOM2 = atom(atm = 'Cs133'), wavelength = 880e-9,             # laser wavelength in nm
                    beamwaist = 1e-6,                # beam waist in m
                    power = 20e-3):                  # power in Watts
    """Find the ac Stark Shifts in Rb, Cs"""
    # typical optical tweezer parameters:
    bprop = [wavelength, power, beamwaist] # collect beam properties

    # mass, (L,J,F,MF), bprop, dipole matrix elements (Cm), resonant frequencies (rad/s),
    # linewidths (rad/s), state labels, nuclear spin, atomic symbol.
    Rb5S = dipole(ATOM1, (0,1/2.,1,1), bprop)
    
    Rb5P = dipole(ATOM1, (1,3/2.,1,1), bprop)
                    
    Cs6S = dipole(ATOM2, (0,1/2.,3,3), bprop)
                    
    Cs6P = dipole(ATOM2, (1,3/2.,3,3), bprop)
    
    # need a small spacing to resolve the magic wavelengths - so it will run slow
    # to resolve magic wavelengths, take about 10,000 points.
    wavels = np.linspace(700e-9, 1100e-9, 500) 
    
    # ac Stark Shift in Joules:
    dE6S = Cs6S.acStarkShift(0,0,0,wavels, mj=0.5, HF=False)
    # average over mj states
    dE6P = 0.5*(Cs6P.acStarkShift(0,0,0,wavels, mj=1.5, HF=False) + 
        Cs6P.acStarkShift(0,0,0,wavels, mj=0.5, HF=False))
    dif6P = dE6P - dE6S
    
    magic6P = getMagicWavelengths(dif6P, dE6P, wavels)
    
    plt.figure()
    plt.title("AC Stark Shift in $^{133}$Cs")
    plt.plot(wavels*1e9, dE6S/h*1e-6, 'b--', label='Ground S$_{1/2}$')
    plt.plot(wavels*1e9, dE6P/h*1e-6, 'r-.', label='Excited P$_{3/2}$')
    plt.plot(wavels*1e9, (dif6P)/h*1e-6, 'k', label='Difference')
    plt.plot([magic6P[0]*1e9]*2, [min(dif6P/h/1e6),max(dif6P/h/1e6)], 'm:',
                label = 'Magic Wavelength')
    plt.legend()
    for mw in magic6P[1:]:
        plt.plot([mw*1e9]*2, [min(dif6P/h/1e6),max(dif6P/h/1e6)], 'm:')
    plt.ylabel("Stark Shift (MHz)")
    plt.xlabel("Wavelength (nm)")
    plt.xlim(wavels[0]*1e9, wavels[-1]*1e9)
    plt.ylim(-2200,2200)
    plt.plot(wavels*1e9, np.zeros(len(wavels)), 'k', alpha=0.25) # show zero crossing
    plt.show()
    print("Magic wavelengths at:\n", magic6P)
    
    
    # ac Stark Shift in Joules:
    dE5S = Rb5S.acStarkShift(0,0,0,wavels, mj=0.5, HF=False)
    # average over mj states
    dE5P = 0.5*(Rb5P.acStarkShift(0,0,0,wavels, mj=1.5, HF=False) + 
            Rb5P.acStarkShift(0,0,0,wavels, mj=0.5, HF=False))
    dif5P = dE5P - dE5S

    plt.figure()
    plt.title("AC Stark Shift in $^{87}$Rb")
    plt.plot(wavels*1e9, dE5S/h*1e-6, 'b--', label='Ground S$_{1/2}$')
    plt.plot(wavels*1e9, dE5P/h*1e-6, 'r-.', label='Excited P$_{3/2}$')
    plt.plot(wavels*1e9, (dif5P)/h*1e-6, 'k', label='Difference')
    plt.legend()
    plt.ylabel("Stark Shift (MHz)")
    plt.xlabel("Wavelength (nm)")
    plt.ylim(-500,500)
    plt.plot(wavels*1e9, np.zeros(len(wavels)), 'k', alpha=0.25) # show zero crossing
    plt.show()
Beispiel #8
0
def combinedTrap(Cswl = 1064e-9, # wavelength of the Cs tweezer trap in m
                Rbwl = 880e-9, # wavelength of the Rb tweezer trap in m
                power = 6e-3, # power of Cs tweezer beam in W
                Rbpower = -1, # power of Rb tweezer beam in W 
                beamwaist = 1e-6): # beam waist in m
    """Model tweezer traps for Rb and Cs and find the potential each experiences
    when they're overlapping. Should fix the separate tweezer trap depths to >1mK.
    We also want Rb to experience a deeper trap from its tweezer than from the Cs
    tweezer so that there isn't too much heating during merging.
    args:
    Cswl = 1064e-9, # wavelength of the Cs tweezer trap in m
    Rbwl = 880e-9, # wavelength of the Rb tweezer trap in m
    power = 6e-3, # power of Cs tweezer beam in W
    Rbpower = -1, # power of Rb tweezer beam in W (if < 0 then choose a power
    such that both species experience the same trap depth when the tweezers are
    overlapping)
    beamwaist = 1e-6 # beam waist in m
    """
    bprop = [Cswl, power, beamwaist] # collect beam properties
    
    # For the 1064nm trap:
    # mass, (L,J,F,MF), bprop, dipole matrix elements (Cm), resonant frequencies (rad/s),
    # linewidths (rad/s), state labels, nuclear spin, atomic symbol.
    # groundstate rubidium
    Rb = atom(atm = 'Rb87')
    Rb1064 = dipole(Rb, (0,1/2.,1,1), bprop)
                    
    # groundstate caesium
    Cs = atom(atm = 'Cs133')
    Cs1064 = dipole(Cs, (0,1/2.,4,4), bprop)
                    
    CsP = dipole(Cs, (1,3/2.,5,5), bprop)
                    
    # set the power of the traps so that the trap depth experienced by each 
    # species in the overlapping trap is the same:
    if Rbpower < 0:
        Rbpower = (Cs1064.polarisability(Cswl,mj=0.5) - Rb1064.polarisability(Cswl, mj=0.5)) / (Rb1064.polarisability(Rbwl, mj=0.5) - Cs1064.polarisability(Rbwl, mj=0.5)) * power
    
    # for the 880nm trap:
    bprop = [Rbwl, abs(Rbpower), beamwaist]
    Rb880 = dipole(Rb, (0,1/2.,1,1), bprop)
                    
    Cs880 = dipole(Cs, (0,1/2.,3,3), bprop)
                    
    
    # in the trap with both tweezers overlapping: 
    U0 = abs(Rb1064.acStarkShift(0,0,0) + Rb880.acStarkShift(0,0,0))
    wrRb = np.sqrt(4*U0 / Rb.m / beamwaist**2) /2. /np.pi /1e3
    wrCs = np.sqrt(4*U0 / Cs.m / beamwaist**2) /2. /np.pi /1e3
    print("%.0f beam power: %.3g mW\t\t%.0f beam power: %.3g mW"%(Cswl*1e9, power*1e3, Rbwl*1e9, Rbpower*1e3))
    print("""In the combined %.0fnm and %.0fnm trap with a depth of %.3g mK the radial trapping frequencies are: 
Rubidium: %.0f kHz \nCaesium: %.0f kHz"""%(Rbwl*1e9, Cswl*1e9, U0/kB*1e3, wrRb, wrCs))
    
    # with just the Cs tweezer trap:
    URb =abs(Rb1064.acStarkShift(0,0,0))
    wrRb1064 = np.sqrt(4*URb / Rb.m / beamwaist**2) /2. /np.pi /1e3
    UCs = abs(Cs1064.acStarkShift(0,0,0))
    wrCs1064 = np.sqrt(4*UCs / Cs.m / beamwaist**2) /2. /np.pi /1e3
    print("""\nIn just the %.0fnm trap:
    Rubidium has trap depth %.3g mK
                 radial trapping frequency %.0f kHz
    Caesium has trap depth %.3g mK
                radial trapping frequency %.0f kHz"""%(Cswl*1e9, URb/kB*1e3, wrRb1064, UCs/kB*1e3, wrCs1064))
    
    print(getStarkShift(Cs1064))
    print(getStarkShift(CsP))
    
    # plot merging traps:
    n = 5   # number of time steps in merging to plot
    sep = np.linspace(0, 10e-6, n)     # initial separation of the tweezer traps
    zs = np.linspace(-2, 10, 200)*1e-6 # positions along the beam axis
    
    for atoms in [[Rb1064, Rb880], [Cs1064, Cs880]]:
        plt.figure()
        plt.subplots_adjust(hspace=0.01)
        
        for i in range(n):
            ax = plt.subplot2grid((n,1), (i,0))
            
            U = (atoms[0].acStarkShift(0,0,zs) + atoms[1].acStarkShift(0,0,zs-sep[n-i-1]))/kB*1e3 # combined potential along the beam axis
            U1064 = atoms[0].acStarkShift(0,0,zs)/kB*1e3         # potential in the 1064 trap
            U880 = atoms[1].acStarkShift(0,0,zs-sep[n-i-1])/kB*1e3 # potential in the 880 trap
            plt.plot(zs*1e6, U, 'k')
            plt.plot(zs*1e6, U1064, color='tab:orange', alpha=0.6)
            plt.plot(zs*1e6, U880, color='tab:blue', alpha=0.6)
            plt.plot([0]*2, [min(U),0], color='tab:orange', linewidth=10, label='%.0f'%(Cswl*1e9), alpha=0.4)
            plt.plot([sep[n-i-1]*1e6]*2, [min(U),0], color='tab:blue', linewidth=10, label='%.0f'%(Rbwl*1e9), alpha=0.4)
            ax.set_xticks([])
            ax.set_yticks([])

            if i == 0:
                ax.set_title("Optical potential experienced by "+atoms[0].X
        +"\n%.0f beam power: %.3g mW   %.0f beam power: %.3g mW"%(Cswl*1e9, power*1e3, Rbwl*1e9, Rbpower*1e3),
                    pad = 25)
                plt.legend(bbox_to_anchor=(0., 1.02, 1., .102), loc=3, ncol=2, mode="expand", borderaxespad=0.)
        
            
        plt.xlabel(r'Position ($\mu$m)')
        ax.set_xticks(sep*1e6)
        plt.ylabel('Trap Depth (mK)')
        ax.yaxis.set_major_locator(AutoLocator())
        
    plt.show()
Beispiel #9
0
        ax4.semilogy(wavels*1e9, ts, color='tab:orange')
        ax4.plot(wavels*1e9, np.ones(len(wavels))/2., '--', color='tab:orange', alpha=0.25) # show acceptable region
        ax4.set_ylabel('Time in the vibrational ground state (s)', color='tab:orange')
        ax4.tick_params(axis='y', labelcolor='tab:orange')
        ax4.set_ylim(0.001,10)
        plt.tight_layout()
    
    plt.show()
    
        
if __name__ == "__main__":
    # run GUI by passing an arg:
    if np.size(sys.argv) > 1 and sys.argv[1] == 'rungui':
        runGUI()
        sys.exit() # don't run any of the other code below
    atom  = atom(atm = 'Rb87')
    vmfSS(atom)

    # combinedTrap(Cswl = 1064e-9, # wavelength of the Cs tweezer trap in m
    #             Rbwl = 810e-9, # wavelength of the Rb tweezer trap in m
    #             power = 5e-3, # power of Cs tweezer beam in W
    #             Rbpower = 1e-3, # power of Rb tweezer beam in W 
    #             beamwaist = 1e-6)
    #check880Trap(wavels=np.linspace(795, 1100, 400)*1e-9, species='Rb')

    # getMFStarkShifts()
    # plotStarkShifts(wlrange=[800,1100])

    # for STATES in [[Rb5S, Rb5P],[Cs6S, Cs6P]]:
    #     plt.figure()
    #     plt.title("AC Stark Shift in "+STATES[0].X+"\nbeam power %.3g mW, beam waist %.3g $\mu$m"%(power*1e3,beamwaist*1e6))