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))
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()
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
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()
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()
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()
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))