Nanophotonic Resonators for Optical Quantum Memories based on Rare-Earth-Doped Materials - CaltechTHESIS
CaltechTHESIS
A Caltech Library Service
About
Browse
Deposit an Item
Instructions for Students
Nanophotonic Resonators for Optical Quantum Memories based on Rare-Earth-Doped Materials
Citation
Miyazono, Evan Tsugio
(2017)
Nanophotonic Resonators for Optical Quantum Memories based on Rare-Earth-Doped Materials.
Dissertation (Ph.D.), California Institute of Technology.
doi:10.7907/Z98K773F.
Abstract
The growing interest in optical quantum systems has led to the exploration of multiple platforms. Though pioneering experiments were performed in trapped atom and trapped ion systems, solid state systems show promise of being scalable and robust. Rare earth dopants in crystalline hosts are an appealing option because they possess a rich spectrum of energy levels that result from a partially filled electron orbital. While level structure varies across the period, all elements possess crystal field splittings corresponding to near infra-red or optical frequencies, as well as Zeeman and often hyperfine levels separated by radio frequency and microwave frequencies. These levels demonstrate long excited-state lifetimes and coherence times and have been used in diverse applications, including demonstrating storage of a photonic state, converting of optical to microwave photons, and manipulating a single ion as a single qubit. The ions' weak interaction with their environment results in low coupling to optical fields, which had previously required measurements with macroscopically large ensembles of ions. Coupling the ions to an optical cavity enables the use of a smaller ensemble, which is required for the development of the aforementioned technologies in an on-chip scalable architecture.
This thesis contains recent progress towards fabricating optical micro and nanocavities coupled to ensembles of erbium ions, mainly erbium in yttrium orthosilicate. In one design, focused ion beam milling was used to create a triangular nanobeam photonic crystal cavity in a bulk erbium-doped substrate. A second design leveraged the fabrication capabilities of silicon photonics, defining amorphous silicon ring resonators using electron beam lithography and dry etching. These devices coupled evanescently to erbium ions below the ring, in the bulk substrate. Simulation, design, fabrication, and characterization of both resonators are discussed. Coupling between the ions and the resonator is demonstrated for each, and capabilities offered by these devices are described. Preliminary work implementing coherent control of erbium ions is presented. Lastly, alternative substrates are evaluated for possible future solid-state erbium systems.
Item Type:
Thesis (Dissertation (Ph.D.))
Subject Keywords:
rare earth ions; optical cavities; cavity quantum electrodynamics; optical quantum memories; erbium; amorphous silicon hybrid
Degree Grantor:
California Institute of Technology
Division:
Engineering and Applied Science
Major Option:
Applied Physics
Thesis Availability:
Public (worldwide access)
Research Advisor(s):
Faraon, Andrei
Group:
Institute for Quantum Information and Matter, Kavli Nanoscience Institute
Thesis Committee:
Vahala, Kerry J. (chair)
Schwab, Keith C.
Scherer, Axel
Faraon, Andrei
Defense Date:
5 April 2017
Non-Caltech Author Email:
evan.zono (AT) gmail.com
Funders:
Funding Agency
Grant Number
Defense Advanced Research Projects Agency
QUINESS W31P4Q-15-1-0012
Air Force Office of Scientific Research
FA9550-15-1-0252
Air Force Office of Scientific Research
FA9550-15-1-002
National Science Foundation
PHY-1125565
Gordon and Betty Moore Foundation
GBMF-2644
Record Number:
CaltechTHESIS:03152017-114949088
Persistent URL:
DOI:
10.7907/Z98K773F
Related URLs:
URL
URL Type
Description
DOI
Adapted for ch 2 and part of ch 4.
DOI
Adapted for ch 3 and part of ch 4.
DOI
Adapted for part of ch 2.
DOI
Adapted for part of ch 2.
ORCID:
Author
ORCID
Miyazono, Evan Tsugio
0000-0003-2176-0335
Default Usage Policy:
No commercial reproduction, distribution, display or performance rights in this work are provided.
ID Code:
10096
Collection:
CaltechTHESIS
Deposited By:
Evan Miyazono
Deposited On:
16 May 2017 17:14
Last Modified:
02 Jun 2020 21:46
Thesis Files
Preview
PDF (Final complete pdf)
- Final Version
Creative Commons Attribution Non-commercial Share Alike
31MB
Repository Staff Only:
item control page
CaltechTHESIS is powered by
EPrints 3.3
which is developed by the
School of Electronics and Computer Science
at the University of Southampton.
More information and software credits
Nanophotonic Resonators for Optical Quantum
Memories Based on Rare-Earth-Doped Materials

Thesis by

Evan Tsugio Miyazono

In Partial Fulfillment of the Requirements for the
degree of
Doctor of Philosophy

CALIFORNIA INSTITUTE OF TECHNOLOGY
Pasadena, California

2017
Defended April 5, 2017

ii

Evan Tsugio Miyazono
ORCID: 0000-0003-2176-0335
Some rights reserved. This thesis is distributed under a
“Creative Commons Attribution-NonCommercial-ShareAlike License”

Is this thesis informative and engaging? Hopefully. Is it interesting? Perhaps.
But regardless, this thesis should at least make sense.

Reproduced with permission from the author. ©SMBC

iii

iv

ACKNOWLEDGEMENTS

The dynamics of any system are governed by its internal evolution and its coupling
to external systems. As my state at t = 0 was trivial, I entirely credit the rest of the
universe for this from-scratch apple pie [1], but these are the dominant terms.
Andrei, thank you for the opportunity to join your group and everything from
then to now. I deeply appreciate the trust you put in me by bringing me on as your
first student, and I hope I rose to the challenge. It’s hard to say whether I’ll more
fondly remember the times when we had our first successes, or the times when it
seemed clear we were both figuring out our respective roles together. I’ve grown in
many dimensions under your guidance while deeply enjoying the experience. I’ve
never regretted coming to Caltech and joining your group, and I think that’s the best
available metric for any decision.
I must express my appreciation to the whole rare earth subgroup. Thank you to
Jon and Tian for knowing the answers to all nearly all of my questions about echoes
and holes, and for sharing the knowledge from troubleshooting the Nd experiments.
Jon, your wanderings over to 214 were more helpful than you’ll ever know. Jake,
thanks for taking over fab on the erbium side; you are truly a gifted nano-sculptor.
John, your enthusiasm is contagious and your thesis has remained my favorite REI
spectroscopy reference; I wish you could have joined us sooner. Alex, thanks for
the Perl, lol. Seriously, though, I’m very fond of work we did together, both the
research and the friendship that resulted from it. Ioana, I couldn’t have asked for a
better lab partner. Thank you for our wordless coordination, alternating which of us
was tirelessly optimistic and which was exasperatedly cynical. And while I doubt
it was a conscious effort, thanks for reminding me of things I value and ought to
spend time on. I’m not sure how I would have made it this far without you.
Though other group members worked on unrelated topics, I can’t neglect acknowledging their help. Thank you to Yu, Ehsan, and Mahsa, for the occasional
assistance on KNI tools, critical advice on fabrication methods, and helping manage
the simulation computers. I extend extra gratitude to Amir, for always being willing to give me a sanity check, always answering helpfully, and dispelling apparent
paradoxes without me feeling judged or daft. (Well, whenever that was possible.)
I would also like to thank the members of my committee, Axel Scherer, Keith
Schwab, and Kerry Vahala. I’ve consistently been enthralled by conversations with

each of you in which you provided guidance and perspective.
I owe much gratitude to the KNI staff, and everyone from the Painter group and
Scherer group who helped train me, specifically thanks to Richard, Justin, Sean,
and Andrew for starting me off in the right direction with simulations and fab,
and occasionally providing course corrections. Max, the instances of respite and
nepenthe we stumbled across or hunted down together were no less important to this
thesis than your fab training and advice you gave me.
I’d also like to thank everyone at Caltech who gave me support outside the lab,
starting with Christy and Cecilia, who helped so many of us to focus on the research.
Though they are too many to name, I have to thank all my Caltech friends; I promise
I appreciated every single invitation you extended to me, even if I wasn’t able to
make it. I give many, many thanks to all my friends from what feel like previous
lives. If I forced you through a lab tour, or if I flew to visit you and forced you to
decipher diagrams on napkins or go through my most recent presentation slides, I
promise that you helped make the explorations of an unimaginably long string of
dead ends that is research become substantially less burdensome, and even exciting
(especially if I photographed you in a bunny suit). And however transient it may
have ended up being, I’d like to think we’re all part of the same big positive feedback
loop of optimism and pursuit of our respective potentials.
My family’s role in shaping who I am started well before graduate school, and
naturally continued throughout. Morgan, thank you for the occasional recipe idea or
ingredient combination that either brightened my day or reminded me that creativity
means trying things that sound absurd, sometimes simply for that reason. Clinton,
I definitely appreciated the encouragement and the reminders to enjoy school while
I can, as well as the various visits and trips that eased the burden during the more
difficult stretches of grad school. Jeannette, that strategy you gave for writing
copious amounts was more useful than you might guess. Mom, Dad, thank you for
getting me here. You deserve more credit than you’ll ever accept. By comparison,
all other teachers and mentors have made negligible contributions to me being the
person I am today, with all the accomplishments I can claim.
Kate, nothing I can say here can thank you enough for the encouragement,
support, sympathy, empathy, and love you’ve shown me from thousands and then
hundreds of miles away as I consistently "just finish the last n months of this Ph.D."
for around 3n months for at least the past two years. While acknowledging that is
not enough, it at least fits on the page. I’ll try to make it up to you.

vi

ABSTRACT

The growing interest in optical quantum systems has led to the exploration of
multiple platforms. Though pioneering experiments were performed in trapped
atom and trapped ion systems, solid state systems show promise of being scalable
and robust. Rare earth dopants in crystalline hosts are an appealing option because
they possess a rich spectrum of energy levels that result from a partially filled
electron orbital. While level structure varies across the period, all elements possess
crystal field splittings corresponding to near infra-red or optical frequencies, as well
as Zeeman and often hyperfine levels separated by radio frequency and microwave
frequencies. These levels demonstrate long excited-state lifetimes and coherence
times and have been used in diverse applications, including demonstrating storage
of a photonic state, converting of optical to microwave photons, and manipulating a
single ion as a single qubit. The ions’ weak interaction with their environment results
in low coupling to optical fields, which had previously required measurements with
macroscopically large ensembles of ions. Coupling the ions to an optical cavity
enables the use of a smaller ensemble, which is required for the development of the
aforementioned technologies in an on-chip scalable architecture.
This thesis contains recent progress towards fabricating optical micro and
nanocavities coupled to ensembles of erbium ions, mainly erbium in yttrium orthosilicate. In one design, focused ion beam milling was used to create a triangular
nanobeam photonic crystal cavity in a bulk erbium-doped substrate. A second design leveraged the fabrication capabilities of silicon photonics, defining amorphous
silicon ring resonators using electron beam lithography and dry etching. These
devices coupled evanescently to erbium ions below the ring, in the bulk substrate.
Simulation, design, fabrication, and characterization of both resonators are discussed. Coupling between the ions and the resonator is demonstrated for each, and
capabilities offered by these devices are described. Preliminary work implementing coherent control of erbium ions is presented. Lastly, alternative substrates are
evaluated for possible future solid-state erbium systems.

vii

PUBLISHED CONTENT AND CONTRIBUTIONS

[1] Evan Miyazono et al. “Coupling erbium dopants in yttrium orthosilicate to
silicon photonic resonators and waveguides”. In: Optics Express 25.3 (Feb.
2017), p. 2863. issn: 1094-4087. doi: 10.1364/OE.25.002863.
ETM participated in the conception of the project and fabricated the device.
Characterization, data collection, and analysis was performed with IC. The
manuscript was written by ETM with input from IC and AF.
[2] Evan Miyazono et al. “Coupling of erbium dopants to yttrium orthosilicate
photonic crystal cavities for on-chip optical quantum memories”. In: Applied Physics Letters 108.1 (Jan. 2016), p. 011111. issn: 0003-6951. doi:
10.1063/1.4939651.
ETM participated in the conception of the project, fabricated and characterized the device, gathered and analyzed the data, and wrote the manuscript
with AF.
[3] Tian Zhong et al. “High quality factor nanophotonic resonators in bulk rareearth doped crystals”. In: Optics Express 24.1 (Jan. 2016), p. 536. issn:
1094-4087. doi: 10.1364/OE.24.000536.
ETM participated in simulations and some assembly of characterization
optics.
[4] Tian Zhong et al. “Nanophotonic coherent light–matter interfaces based
on rare-earth-doped crystals”. In: Nature Communications 6 (Sept. 2015),
p. 8206. issn: 2041-1723. doi: 10.1038/ncomms9206.
ETM participated in simulations and assembly of characterization optics.

viii

TABLE OF CONTENTS

Acknowledgements

iv

Abstract

vi

Published Content and Contributions

vii

Table of Contents

viii

List of Illustrations

List of Tables

xii

Nomenclature

xiii

Chapter I: Introduction
1.1 Solid State Optical Quantum Memories . . . . . . . . . . . . . . . . 1
1.2 Rare Earth Ions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.3 Spectral Tailoring and Echos . . . . . . . . . . . . . . . . . . . . . . 13
1.4 Rare Earth Ion Cavity Quantum Electrodynamics . . . . . . . . . . . 19
1.5 Outline of the Thesis . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Chapter II: Triangular Nanobeam Devices
2.1 Device Simulation and Design . . . . . . . . . . . . . . . . . . . . .
2.2 Nanobeam Fabrication . . . . . . . . . . . . . . . . . . . . . . . . .
2.3 Confocal Microscope Characterization . . . . . . . . . . . . . . . .
2.4 Cavity-Ion Coupling . . . . . . . . . . . . . . . . . . . . . . . . . .

25
25
28
29
31

Chapter III: Hybrid Microring Devices
3.1 Initial Device Study for Neodymium Ions . . . . . . . . . . . . . . .
3.2 Device Simulation and Design . . . . . . . . . . . . . . . . . . . . .
3.3 Hybrid Ring Fabrication . . . . . . . . . . . . . . . . . . . . . . . .
3.4 Device Characterization . . . . . . . . . . . . . . . . . . . . . . . .
3.5 Amorphous Silicon Hydride Absorption at Shorter Wavelengths . . .

37
37
40
43
47
49

Chapter IV: Optical Manipulation of Erbium Ions
4.1 Purcell Enhanced Decay Measurement . . . . . . . . . . . . . . . .
4.2 Comparison of Nanobeam and Hybrid Microring devices . . . . . .
4.3 Beyond a Two Level System . . . . . . . . . . . . . . . . . . . . . .
4.4 Photon Echoes . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

52
52
58
61
67

Chapter V: Erbium-167 and Future Directions
5.1 Hyperfine Structure . . . . . . . . . . . . . . . . . . . . . . . . . .
5.2 Hyperfine Level Hole Burning . . . . . . . . . . . . . . . . . . . . .
5.3 Atomic Frequency Combs . . . . . . . . . . . . . . . . . . . . . . .
5.4 Summary and Future Directions . . . . . . . . . . . . . . . . . . . .

69
69
70
70
75

ix
Bibliography

78

Appendix A: Code for Cavity Mode Simulation and Analysis
A.1 MEEP Code to Model the Ring . . . . . . . . . . . . . . . . . . . .
A.2 MEEP Code to Model the Nanobeam . . . . . . . . . . . . . . . . .
A.3 Matlab Code to Analyze the Ring . . . . . . . . . . . . . . . . . . .

87
87
88
91

Appendix B: Code for Running Optical Characterization Experiments
95
B.1 Tektronix 5014 Arbitrary Waveform Generator . . . . . . . . . . . . 95
B.2 Sequence Loader . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
B.3 Tunics TECL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
B.4 Toptica DLC pro . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
B.5 Tektronix Oscilloscope . . . . . . . . . . . . . . . . . . . . . . . . . 128

LIST OF ILLUSTRATIONS

Number
Page
1.1 Elastic and inelastic decoherence on the Bloch sphere (illustration) . . 3
1.2 Outer orbital radial electron density for a rare earth ion (theory) . . . 5
1.3 Erbium energy levels and lifting degeneracies (illustration) . . . . . 8
1.4 Homogeneous and inhomogenous linewidths (illustration) . . . . . . 9
1.5 Yttrium orthosilicate unit cell and principal axes (illustration) . . . . 11
1.6 Spectral hole burning on the spin levels of erbium (illustration) . . . 14
1.7 Two pulse photon echo on the Bloch sphere (illustration) . . . . . . . 16
1.8 Atomic frequency comb delay lines and spin-wave storage (illustration) 18
1.9 Cavity quantum electrodynamics rates (illustration) . . . . . . . . . . 19
2.1 Nanobeam cavity robustness against error (simulation) . . . . . . . . 26
2.2 Nanobeam cavity mode profile (simulation) . . . . . . . . . . . . . . 27
2.3 Nanobeam cavity (micrographs) . . . . . . . . . . . . . . . . . . . . 30
2.4 Confocal microscope (illustration and photo) . . . . . . . . . . . . . 32
2.5 Nanobeam cavity transmission spectrum (measurement) . . . . . . . 33
2.6 Cryostat nitrogen tuning line (photo) . . . . . . . . . . . . . . . . . . 34
2.7 Nanobeam cavity transmission while tuning (measurement) . . . . . 35
2.8 Resonant nanobeam cavity transmission (fit) . . . . . . . . . . . . . 36
3.1 Resonance of gallium arsenide rings on glass (measured) . . . . . . . 39
3.2 Gallium arsenide device transfer (photos and micrographs) . . . . . . 41
3.3 Ring resonator field profile (simulation) . . . . . . . . . . . . . . . . 42
3.4 Grating coupler optimization (simulation) . . . . . . . . . . . . . . . 43
3.5 Fabrication procedure for silicon hydride rings (illustration) . . . . . 44
3.6 Amorphous silicon hydride microring (micrographs) . . . . . . . . . 46
3.7 Hybrid ring resonator transmission spectra (measurement) . . . . . . 48
3.8 Hybrid ring transmission while tuning (measurement) . . . . . . . . 49
3.9 Resonant microring cavity transmission (fit) . . . . . . . . . . . . . . 50
3.10 Silicon hydride ring resonances at other wavelengths (measurement) . 51
4.1 Purcell-enhanced decay in both cavities (measurement) . . . . . . . . 54
4.2 Histograms of coupling strength for both resonators (simulation) . . . 55
4.3 Photoluminescence decay vs detuning (simulation) . . . . . . . . . . 56
4.4 Purcell enhancement and photoluminescence from both cavities (fit) . 57

xi
4.5
4.6
4.7
4.8
4.9
4.10
4.11
4.12
5.1
5.2
5.3
5.4

Effective Purcell factor vs detuning (fit) . . . . . . . . . . . . . . . . 58
Coupling to devices withing the Bluefors fridge (photo) . . . . . . . 62
Bluefors fiber access to the Bluefors fridge (photo) . . . . . . . . . . 63
Nanobeam scans inside the fridge (measurement) . . . . . . . . . . . 64
Fiber optic sample characterization system (illustration) . . . . . . . 65
Nanobeam reflection while tuning in a magnetic field (measurement) 66
Atomic frequency comb in the nanobeam cavity (measurement) . . . 67
Nanobeam echo and coherence decay curve (measurement) . . . . . . 68
167 Er:YSO inhomogeneous line with spectral holes (measurement) . . 71
Accumulated atomic frequency combs in 167 Er:YSO (fit) . . . . . . . 72
Piecewise-defined atomic frequency comb in 167 Er:YSO (measurement) 74
Atomic frequency comb echoes in 167 Er:YSO (measurement) . . . . 75

xii

LIST OF TABLES
Number
Page
3.1 PECVD deposition recipe for amorphous silicon hydride . . . . . . . 44
3.2 Spin coating recipe for films for electron beam lithography . . . . . . 45
3.3 ICP etch recipe for amorphous silicon hydride . . . . . . . . . . . . 45
4.1 Summary of various parameters for the two optical resonator designs 59

xiii

NOMENCLATURE

βr

the branching ratio; probability an excited state decays directly to a particular
level

the permittivity

0

the vacuum permittivity

efficiency of photon memory recall

the reduced Planck constant

κc

the rate of energy decay from the cavity into the input/output coupled mode

κi

the rate of energy decay from the cavity into all other modes

the applied magnetic field

finesse of the atomic frequency comb, defined analogously to Fabry-Pérot
cavities

the dipole moment of the transition in question, in the direction parallel to
the polarization of the electric field

µB

e~
the Bohr magneton, 2m

max() a function that returns the maximum value of the argument

ensemble coupling rate between the ions and the cavity, a generalization of
gtot

ωc

the angular frequency of the cavity resonance

density of ions; approximately 1.87 million ions per cubic micron in 200
ppm Er:YSO

E(r)

the electric field vector as a vector-valued function of position

cooperativity; figure of merit describing ensemble-cavity coupling

FP

the Purcell factor; ratio between an emitter’s rate of spontaneous emission in
a cavity to the rate in free space

g0

the coupling rate between an emitter and a cavity

gion

the coupling rate for an ion at the cavity electric field maximum

gtot

total coupling rate for the ensemble

xiv

the refractive index

Qi

the intrinsic quality factor, ωκic

Ql

the loaded quality factor, κiω+κc c

Vmode the mode volume of the cavity
AFC atomic frequency comb
AOM acousto-optic modulator
cQED cavity quantum electrodynamics
EOM electro-optic modulator
HF

hydrofluoric acid; it’s a chemical formula, not an acronym, silly

MEEP MIT electromagnetic equation propagation open source FDTD simulation
software
optical excited state the lowest energy state of the 4 I13/2 total angular momentum
manifold
optical ground state the lowest energy state of the 4 I15/2 total angular momentum
manifold
PDMS polydimethylsiloxane
PL

photoluminescence

qubit quantum bit
RF

radio frequency

SEM scanning electron microscope
SNSPD superconducting nanowire single photon detector
telecom C band the conventional “erbium window” in optical telecommunications
from 1530-1565 nm
YSO yttrium silicon oxide, also yttrium orthosilicate, Y2 SiO5

Chapter 1

INTRODUCTION
1.1

Solid State Optical Quantum Memories

The most prominent promises of engineered quantum systems are two potentially
antipathetic cases of quantum information manipulation. The better popularized set
of implementations are lumped under the category of quantum computation. Stemming from the idea of the classical computability of physical systems, quantum
computation leverages additional complexity in quantum systems to store and process information [2, 3]. It found its first interesting engineering application in Peter
Shor’s algorithm for solving the discrete logarithm problem and performing integer
factorization in polynomial time on a quantum computer [4]. This application won
renown because an efficient implementation of this algorithm would compromise
the RSA cryptosystem, which is commonly used to secure network traffic, encrypt
and authenticate e-mail, and secure credit card payment systems [5].
Interestingly, the second set of imminently implementable applications of quantum engineering are quantum cryptography, which strives to provide secrecy and
security by leveraging aspects of quantum mechanics. Quantum key distribution
(QKD), one of the older and more developed areas of quantum cryptography,
promises provably secure encryption above an arbitrarily high confidence threshold
[6]. While commercial systems exist for generation and measurement of quantum
bits (qubits) needed for the two main QKD algorithms [7, 8], the distance over
which keys can be distributed is limited to the distance over which a quantum bit
can be conveyed. For photons, this limit is dominated by absorption/distortion for
fiber optics or alignment/focusing of free space optics. Due to the complexity, of
free space optical communication, fiber systems are easier to construct, install over
large distances, and maintain. Fortunately, the exponential decay of transmission
success as a function of distance can be somewhat circumvented with a sufficiently
good quantum memory. This is achieved by implementing entanglement swapping
[9] and purification of entanglement to construct a quantum repeater [10], where
the qubit transmission efficiency scales polynomially with distance [11].
In the process of developing optical quantum memories, various researchers
conceived of additional interesting applications, including quantum metrology [12],

on-demand single photons [13], efficient single-photon detection [14], and probing
fundamental quantum phenomena [15].
After a brief explanation of lifetimes and coherence of quantum states, the
remaining sections of this chapter will be spent on three topics. First, I will describe
the physical properties that make rare earth ions a naturally superior platform for
long-term storage of quantum information. Then, I will outline various methods
of initializing, storing, and recovering classical and quantum information using
rare earth ions. Next, I will highlight the motivations toward building a scalable
interface. The chapter will conclude with an outline of the remainder of the thesis.
Lifetime and Coherence
Throughout this thesis the lifetime of quantum states and the coherence time
between states will be discussed as two relevant timescales affecting the corruption
of a quantum state. The lifetime of a state, denoted T1 , is the inverse of the sum
of the various exponential decay rates at which that state decays to other states.
Symbolically,
Õ 
T1 ≡ 1/Γtot = 1/
Γi ,
(1.1)
where Γi is one of various decay rates. These rates are related to various mechanisms
relaxing the qubit to the ground state. The relaxation can involve decays via other
levels in a many-level system. The exponential nature of the decay arises from the
fact that the probability of decay at any moment in time is constant.
The lifetime, which describes the rate of excited state information loss, is distinct
from the coherence time, which characterizes the loss of phase information usually
with respect to the ground state. Before clarifying, as an analog I would like
to point out that one can describe photon interference experiments in two ways.
In the common explanation, which I would consider arguably incorrect, photons
following one path interfere with photons passing through the other path, and the
phase difference between the two photons causes the resulting interference pattern,
provided that the path difference is shorter than the coherence length of the photon.
This explanation breaks down if the experiment is performed with single photons,
and we must conclude that the single photon is passing through both paths of the
interferometer and interfering with itself. The proper explanation of multi-photon
interference should similarly involve each photon interfering with itself.
I describe this because the description of coherence decay that is often used in
nuclear magnetic resonance involves an ensemble of nuclear spins rotating in the

xy-plane with an applied magnetic field in the z direction. In this description, due
to fluctuations and interactions, the bulk magnetization in the xy-plane becomes
smeared out across the ensemble until it sums to zero. If one is dealing with
a single magnetic moment or electron spin, then the xy-plane of the precessing
magnetization must be described as a superposition of the excited and ground states,
which possesses an associated phase between the two. Throughout this thesis, I
will generally describe the decay or decoherence of the ensemble as though each
ion remained a pure state; though illustrative and more conceptually intuitive, this
is demonstrably not the case and explanations which break down on the single-ion
level should be understood in the aforementioned manner.
Evolution of quantum two-level states is typically represented graphically as a
point on the surface of a Bloch sphere, where zenith and nadir represent the ground
|gi and excited states |ei, respectively. The equator represents equal superposition
of the two and latitudinal precession is expressed as a complex phase. In this
representation, decoherence is the smearing out of the pure state latitudinally, leading
to a loss of phase information. Similarly, smearing out in the vertical direction
corresponds to the collapse of the state into the ground or excited state, and is thus
described by T1 . An illustration of these two decay types is shown in Figure 1.1.
As decay processes that destroy amplitude will also destroy the phase information,
the T1 decoherence time will also limit the T2 .

Figure 1.1: Illustration of a state vector on the Bloch sphere (left) as well as inelastic
(center) and elastic (right) decoherence processes. The zenith (θ = 0) and nadir of
the sphere are the ground and excited states, respectively. The energy of the state
is encoded in θ, while φ encodes the complex phase, represented as the latitude on
the Bloch sphere. Thus, inelastic decoherence, characterized by T1 , is a smearing
of the pure state longitudinally, while elastic decoherence involves smearing of the
state latitudinally.
Using the definition of ‘elastic’ that means preserving or conserving energy, T2

and T1 decay are also sometimes referred to as elastic and inelastic decoherence.
It’s also worth mentioning explicitly that a lifetime and coherence time refer to a two
level system, and though the ground state is usually understood, in some instances
ambiguity arises from the presence of multiple ground states.
1.2

Rare Earth Ions

Rare earth elements, namely scandium (21 Sc), yttrium (39 Y), lanthanum (57 La),
and the lanthanides (57 Ce to 71 Lu) [16], are a distinctive group of elements sharing
similar chemical properties. Interestingly, the misleading name “rare earth” arises
from a historic difficulty to mine and purify the elements rather than any actual
scarcity and a mistaken association with the alkaline earth metals. The rare earth
ions share an electron configuration consisting of a Xenon electron core, a filled 6s
orbital, a partially filled 4 f orbital, and, for La, Ce, Gd, and Lu, a single electron
in a 5d state; this 5d occupation occurs in elements that have an empty, nearly
empty, half-full, and full 4 f orbital, respectively. The chemical properties shared
by the lanthanides result from a trivalent oxidation state with electron configuration
[Xe]4 f N , where N takes values between 1 and 14 for each of the 14 lanthanides.
4f Intraorbital Transitions
Because a trivalent rare earth ion is still a multi-electron system, the partially
filled 4 f orbitals cannot merely be described using single electron wave function
solutions to the hydrogen atom. Instead, the wave functions for rare earth ions in
vacuum can be approximated using the Hartree-Fock method, numerically building
a many-body wave function as a Slater determinant of the single particle wave
functions. This has been performed for many of the rare earth ions in [17], and a
more comprehensive treatment of Hartree-Fock calculations can be found therein.
Attributes of the wave functions can be calculated from the basis of energy
eigenstates produced by the Hartree-Fock method. Specifically, it is interesting to
examine the radial electron density distribution of the 4 f , 5s, 5p, and 6s orbitals
in gadolinium, shown in Figure 1.2, and note that the partially filled 4 f orbital are
spatially located within the filled 5s and 5p orbitals. The remarkable coherence
properties of the various configurations of the 4 f states result from the 5s and 5p
orbitals strongly shielding the partially filled 4 f orbitals. These outer orbitals are
often likened to a Faraday cage for electrons in the 4 f orbitals, shielding them
from external electric fields. Though this is somewhat metaphoric, the similarity
between spectra for a free-ion and in a host crystal illustrates the low influence that

external fields have. While Figure 1.2 specifically shows probability densities for
gadolinium, the relative radial distributions vary weakly with atomic number across
the rare earth ions.

Figure 1.2: Radial probability density distributions for electrons in various orbitals
of free Gd+ ions, from Hartree-Fock approximation. The distributions illustrate
that electrons in the partially filled 4f orbitals exist largely within the bound of
electrons in the filled 5s and 5p orbitals. Reprinted figure with permission from
[17], Copyright 1962 by the American Physical Society.
Though the 4 f orbitals of the hydrogen atom are energy-degenerate eigenstates
that are distinguishable with angular momentum quantum numbers, the act of including other electrons lifts this energy degeneracy due to the Coulombic interaction
between the various electrons. Taking spin-orbit coupling into account as well leads
to a separation of various states for which total orbital angular momentum is a good
quantum number. It’s important to note for future reference that the excitation of
an electron should be considered a transition from one many-body quantum state to
another many-body quantum state. As a result, I endeavor to refer to the state of the
ion, rather than the state of the electron.
The free-ion spectra of rare earth ions and actinides are the most complex atomic

emission spectra, and were accordingly the last spectra to be rigorously investigated
experimentally [18] and modeled theoretically. In the early 1960s, immediately
following these measurements, theoretical descriptions achieved success in both
fitting parameters in Hartree-Fock approximations to measured transition energies
[19, 20] as well as the independent development by Judd [21] and Ofelt [22] of
an accurate description of the weak dipole transitions between what might naïvely
be thought to be parity forbidden 4 f intra-orbital transitions. These small dipole
moments result in long optical lifetimes for the associated transitions and weak
interaction with external radiation.
In rare earth ions, transitions between the lowest states of each of the total angular
momentum manifolds have useful lifetime and coherence properties, since decay
rates within each manifold can be faster. The transitions most often used in quantum
optical experiments are the 3 H4 to 1 D2 transition in praseodymium, the 4 I9/2 to
4F
3/2 transition in neodymium, the H6 to H4 transition in thulium, the F0 to D0
transition in europium, and the 4 I15/2 to 4 I13/2 transition in erbium, where we have
used Russell-Saunders notation 2S+1 L J to denote the total angular momentum [23].
Many rare earth ion phenomena and protocols were pioneered in praseodymium or
neodymium, partly because of their easily accessible transitions corresponding to
visible (∼600 nm) or near infrared (∼880 nm) wavelengths, respectively. Europium
ions distinguish themselves with the longest recorded coherence time in solid state,
with a decay time of six hours at 2 K for the hyperfine structure of the ground state
[24]. The rare earth ion erbium, (68 Er), possesses an optical transition with a long
excited state lifetime (11 ms) in the wavelength range of the transparency window
of glass optical fiber. Erbium-doped fiber amplifiers (EDFAs), which use erbium
dopant ions as the active material for amplifying a fiber’s optical mode, enable
long-distance communication across all modern fiber networks [25]. If one could
develop an efficient optical qubit interface within the optical telecommunications
conventional band, or telecom C band, the devices could leverage the existing global
optical fiber network to build a quantum network.
Though the 5s and 5p orbitals strongly shield the 4 f transitions from external
electric fields, adding the ions as dopants to a host material leads to a small variation
in energy separation for ions in different host materials. This is caused by the large
DC electric field resulting from the surrounding environment of ions, referred to as
the crystal field. For a low-symmetry site, this can be expected to lift all degeneracies
save one described by Kramer’s theorem [26]. This theorem, which can be proven

quite elegantly [27], states that systems with time-reversal symmetry and half-integer
total spin will have at least double degeneracy of energy eigenstates.1 In Er3+ , this
manifests as a degeneracy between electron spin states for isotopes with no nuclear
spin. An externally applied magnetic field will break time reversal symmetry and
lift this last degeneracy of Kramers doublets. This sequential lifting of degeneracies
via the inclusion of additional terms in the Hamiltonian is illustrated for erbium in
Figure 1.3.
Rare Earth Hosts
Upon surrounding a rare earth ion with a substrate, variations in the local environment of individual ions will result in slightly different energy spacings between
various electron energy levels. The envelope of the distribution of ion transition
energies across an ensemble can be influenced by factors which are Lorentzian as
well as Gaussian distributed, and thus can be generally described by a Voigt profile
[31], which is the convolution of the two, namely

∫ +∞ 
−x 2 /(2σ 2 )
 dx.
(1.2)
V(x; σ, γ) =
√ e
π (x − x 0)2 − γ 2
−∞
σ 2π
As such, it can vary from completely Gaussian (γ = 0) to completely Lorentzian
(σ = 0). Furthermore, each individual emitter will have a characteristic linewidth,
which we call the homogeneous linewidth. For an ensemble, the absorption profile
consists of the sum of the homogeneous linewidth of each ion placed at that ion’s
detuning. The combination of the Voigt distribution of detunings with the individual
homogeneous linewidth of ions is illustrated in Figure 1.4, and has a linewidth which
we call the inhomogeneous linewidth.
Since broadening of the inhomogeneous linewidth is caused by static variations
between the environment of different ions, it typically arises from variations in the
crystal field due to lattice strain or defects. These causes can range in dimensionality
from 2D grain boundaries and interfaces to 1D dislocations to 0D point defects. As
the rare earth ion dopants themselves are point defects, high dopant concentrations
also lead to an increase in the inhomogeneous linewidth.
1 Though it’s too great a digression to include in the main text, the outline of the proof involves

showing that T = iσy C acts as a time inversion operator, where C gives the complex conjugate.
Then T commutes with a time invariant Hamiltonian, and so if ψ is an energy eigenstate, then Kψ
is as well, with the same eigenvalue. It is then straightforward to show that they’re either the same
eigenstate, or that they may differ by a sign if the number of fermions is odd (as you obtain a factor
of i every time you apply T). This proof was shown first by Wigner [28], and it was recently shown
eigenvectors need not exist for the theorem to hold [29].

Energy

Inter-electron
Coulomb Interaction
and
Spin-Orbit Coupling

Crystal Field

External
Magnetic Field

I13/2

6508 cm-1
1536 nm

[Xe]4f11

500 cm-1

Er3+
(Single Electron Orbital)

I15/2

Total Angular
Momentum States
(Free Ion Hamiltonian)

Free Ion Energy

250 cm-1

J+1 2 Kramers
Doublets

2J+1 States

Figure 1.3: Energy levels of an erbium ion as degeneracies are lifted. Including
electron-electron interaction and spin-orbit coupling leads to a partial lifting of the
degeneracy of the hydrogen-like 4 f orbital, leaving total angular momentum states
as acceptable quantum numbers. Addition of the crystal field for a low-symmetry
crystal site, like those in yttrium orthosilicate (YSO), results in the lifting of all
but the degeneracy guaranteed by Kramer’s theorem, which can be lifted by an
applied magnetic field. For erbium ions replacing yttrium ions in site 1 of YSO,
the wavelength of the transition between the lowest crystal field levels of the 4 I15/2
and 4 I13/2 state corresponds to 1536 nm light. The splitting due to the magnetic
field is typically on the order of 10 GHz/T [30], depending on field orientation. In
167 Er, the nonzero nuclear spin results in 8 possible electron spin states which couple
to the unpaired electron spin in both of the would-be Kramers doublet, lifting the
degeneracy as 16 hyperfine states where even isotopes have two.
Generally, it is useful to have a low inhomogeneous linewidth, as this provides
higher optical depth for a given bandwidth, and allows the spectral resolution of
various transitions and increases optical depth for a given concentration. As a
result, erbium and other rare earth ions are usually placed as low-concentration
dopants in a host crystal containing yttrium, which has similar valance electron

Absorption

Homogeneous
linewidth

Inhomogeneous
linewidth

Frequency

Figure 1.4: Absorption as a function of frequency illustrating the inhomogeneous
linewidth in blue, which is the sum of all absorption lineshapes for individual
ions (red, green, and yellow). Though both are dependent on concentration and
temperature, for 50 ppm Er:YSO around 4 K, the inhomogeneous linewidth can be
as low as 500 MHz [32], while the homogeneous linewidth is on the order of 10
kHz to 10 MHz, depending on magnetic field [33].
properties and a similar ionic radius as erbium. Sometimes a larger inhomogeneous
linewidth can be helpful, for example when a large-bandwidth spectral feature
must be tailored in the absorption profile, as in broadband AFC memories [34].
Additionally, increasing the inhomogeneous linewidth can also be used to verify that
spin-spin interactions dominate decoherence [35]. However, from an engineering
perspective it is generally far easier to increase a small inhomogeneous linewidth
than it is to decrease a large inhomogeneous linewidth.
Yttrium Orthosilicate
Long coherence times also require reducing the sensitivity to both magnetic
fluctuations and thermal vibrations (phonons) and coupling to other active defects.
This reinforces the need for a low concentration of rare earth dopants, as coupling
between two dopants is a source of decoherence. Additionally, the use of a host
crystal with low magnetic spin fluctuations becomes important. For this reason,
yttrium orthosilicate (Y2 SiO5 ), abbreviated YSO, is often chosen as a host, because
all three of its constituent elements are magnetically quiet relative to other hosts.
The only stable isotope of yttrium, 89Y has a nuclear spin of one half with a very
small magnetic moment of -0.137 µN [36]. Of the three stable isotopes of silicon,
29 Si is the only one with a net nuclear spin, and it has an abundance of only 4.7%.
Lastly, the only isotope of oxygen with a net nuclear magnetic moment has a natural
abundance of about 0.04%.
In this host crystal, hyperfine lifetimes for praseodymium and europium dopants

10
have been shown to be 5 minutes and 23 days, respectively [37, 38]. Furthermore,
the longest coherence time to date in solid state was demonstrated using the hyperfine
levels of Eu:YSO [24]. Non-isotopically pure erbium dopants in YSO have been
shown to have optical coherence times longer than 4 ms [23] and inhomogeneous
linewidths on the order of 500 MHz [32]. Erbium is commonly used in silica, where
the optical properties are far inferior to those in rare earth host crystals; the coherence
time at 150 mK was measured to be 3.8 µs with an inhomogeneous linewidth of
1.3 THz [39, 40]. In addition, recent work in 167 Er:YSO at high magnetic fields
demonstrated a hyperfine lifetime over 10 minutes and a coherence time over a
second [41].
YSO is a biaxial monoclinic crystal, characterized first by Harris and Finch [42]
6 space group
and later more precisely by Maksimov et al. [43]. It belongs to the C2h
and thus has fairly low-symmetry. The dimensions of the unit cell, as determined
by x-ray defractometery are a = 1.04 nm, b = 0.672 nm, and c = 1.24 nm, and
the angle between a and c is β = 102.65◦ . Four unit cells are shown in Figure
1.5 (a). Yttrium ions occupy two unique sites within the crystal, both with C1
symmetry, with one surrounded by six oxygen atoms, and the other surrounded
by seven. Accordingly, dopants in site 1 and site 2 experience differing crystal
fields, and thus exhibit slightly different energy level spectra, though they can be
easily distinguished spectroscopically. Despite this, the transition from the lowest
energy state of the 4 I15/2 total angular momentum manifold to the lowest energy
state of the 4 I13/2 manifold has a wavelength near the center of the telecom C band
[32] for erbium dopants occupying either site for YSO. Due to the usefulness of
and focus on this transition, I refer to these two levels as the ground and excited
states of the optical transition, respectively, throughout this thesis. Additionally,
it is shown in Figure 1.5 that yttrium ions can fall into one of two sites linked to
each other via inversion through the center of the unit cell; this results in opposing
responses to an applied magnetic field unless the applied field is applied along
specific high-symmetry directions.
The low crystal symmetry also results in a directional dependence of the refractive index and dipole moment. The optical indicatrix, an ellipsoid which describes
the refractive index as a function of k-vector direction, does not have principal axes
perfectly aligned to the unit cell directions of a, b, and c. For k-vectors along the
principal axes of this ellipsoid, there is no observed birefringence, and thus the
ellipsoid orientation can be determined optically. The three principal axes of the

a)

Full Unit Cell

b)

Half Unit Cell

D2
11.4°

11

Si

β=102.65°

24°
D1

Figure 1.5: a) Illustrations of a unit cell of yttrium orthosilicate (YSO), showing
two different angles for both a full and half unit cell each. Inverting a copy of the
lower half of the unit cell though the center will reconstruct the full unit cell, which
consists of 4(Y2 SiO5 ). The low symmetry results in the lifting of most degeneracies
and allowed quasi-dipole optical transitions. Image rendered using Avogadro and
data from [43]. b) The orientation of the crystallographic axes a and c relative to the
principal axes D1 and D2 . Both sets of axes share the same b axis, which is oriented
out of the plane here.
indicatrix have unique magnitudes, which by definition means YSO is biaxial. Due
to symmetry constraints, one of the principal axes of the indicatrix must be aligned
with the b axis, while the other two principal axes lie in the in the a-c plane [44].
Li et al. labeled these principal axes D1 and D2 [45]. Much of the literature use a
right-handed variation on the coordinates set by Li et al., and have D1 at 24◦ from
the a axis toward from the c axis, and thus 79◦ from the D1 axis [44]; D1 is in the a-c
plane and perpendicular to D1 and b. These orientations are shown in Figure 1.5b.
Using the measurements by Beach et al. [46] and the interpretation of the coordinates of Sun [44], we can calculate the refractive indices of YSO for a wavelength
of 1536 nm to be nb =1.770, nD1 =1.769, and nD2 =1.789. The 1% difference between
the largest and smallest refractive indices was taken to be negligible in most of the
simulation work.
Erbium-doped Yttrium Orthosilicate
There exists a large body of work characterizing and probing the lifetime and
coherence properties of erbium ions in bulk YSO, specifically measuring the aforementioned optical transition near 1540 nm. Much of this work was performed by
Böttger, Sun, Cone, and Thiel. This includes precise measurement and characterization of the absorption and emission spectra and measurement of the lifetimes of

12
the excited states for the site 1 and site 2 optical transitions [32]. The causes and
rates of optical decoherence as a function of temperature and erbium concentration,
as well as the applied magnetic field magnitude and direction were also explored
[33, 47]. The magnetic g tensors were fit to measurements for the lowest energy
states of the 4 I13/2 and 4 I15/2 manifolds for erbium ions in both site 1 and site 2
[30]. Additionally, the use of YSO co-doped with erbium and europium enabled an
experiment which yielded strong evidence that spin-spin interaction dominates decoherence for low temperature and moderate magnetic fields [48], later corroborated
with measurements on a scandium-erbium codoped sample [35].
Substantial progress has also been made optimizing the applied magnetic field
Zeeman level lifetimes and implementing optical storage in Er:YSO by HastingsSimon, Lauritzen, and de Riedmatten under Afzelius and Gisin, including lifetime
characterization in the low magnetic field regime [49], use of auxiliary methods
to improve state initialization [50], and the demonstration of optical storage at the
single photon level [51]. Furthermore, evidence was presented that suggested the
existence of long-lived hyperfine states for the odd isotope of erbium, 167 Er [49],
which was later followed by identification of two lambda systems in isotopically
purified 167 Er:YSO [52].
While there is far too much information to summarize thoroughly in a subsection
of the introduction, some relevant details from the literature should be included. The
experimental work in this thesis primarily uses erbium ions in site 1, which has a
transition at a wavelength of 1536.45 nm and the dipole moment for this transition is
largest for light polarized along the D2 direction [32]. The application of a magnetic
field lifts the Kramers degeneracy of the lowest 4 I13/2 and 4 I15/2 states, separating a
spin-up and a spin-down state for both the 4 I13/2 level and 4 I15/2 . The splitting of the
ground state is gg µB B, where gg is the ground state magnetic coupling tensor (a ranke~
is the Bohr magneton, and B is the applied magnetic field vector;
2 tensor), µB = 2m
this is illustrated on the far right of Figure 1.3. Analogously, the excited state splitting
is determined using ge , the excited state magnetic coupling tensor. The complete
magnetic coupling tensors were determined completely from measurements by Sun
et al. [30]. Using these, one can determine the expected splitting between both spin
preserving and spin-flipping optical transitions. Furthermore, because the two g
tensors do not share an eigenbasis, the relative coupling strength to the two excited
states will vary as a function of magnetic field orientation for a given ground state.
Similarly, decay rates from an excited state into each of the two ground states will be

13
dependent on the magnetic field orientation. As it will be useful later, the branching
ratio, βr , is defined to be the probability of the decays from an occupied state to a
specific lower energy state.
1.3

Spectral Tailoring and Echos

The measurement techniques to determine lifetime, decoherence rates, and
causes can be complex and nuanced, and this description is far closer to the minimum
utilitarian explanation required than a complete summary. Measurement of excited
state lifetime is somewhat straightforward, while measurement of the coherence
time is less intuitive and will be described in greater detail.
Spectral Hole Burning
First we begin with the measurement of excited state lifetime, which is achieved
in an intuitive manner, namely setting up the system in the excited state and checking
some time later to determine if it’s still in that state. Rather than pump the entire
ensemble, it is typical to probe the dynamics of ions using only a subset of the
ions, selected using a range of transition energies smaller than the inhomogeneous
line. Shining a laser on the sample and exciting this subset of ions will move the
population to an excited state, from which it will decay to various lower energy
states at rates described by the appropriate branching ratios and a characteristic
lifetime equal to the reciprocal of the sum of the rates. For Er:YSO under an applied
magnetic field, there is only one metastable ground state besides the initial state
into which the excited state can decay. If the decay rate of the other Zeeman state
into the initial state is sufficiently slow compared to the decay rate of the excited
state, population will accumulate in the other Zeeman state. A frequency scan of the
absorption will show a decrease in the absorption spectrum of the ions where the
ions were resonant with the driving laser; this feature is known as a hole or spectral
hole. A diagram illustrating the relevant levels, transitions, and spectral features
is presented in Figure 1.6. The figure also illustrates the formation of side-holes
and anti-holes, which are two modifications of the normal absorption spectrum
due to the redistribution of population from the spectral hole. The frequency scan
can be performed at various delays after the pump laser is turned off in order to
determine rate at which the hole fills. Because the optical density is proportional
to the difference in occupation between the ground and excited state, the change in
occupation is proportional to the logarithm of the transmitted optical intensity. As
a result, the T1 of the upper ground level, the Zeeman lifetime, is then the 1/e decay

14
time of the natural logarithm of the hole size. Symbolically, the optical density,
OD ∝ Ne − Ng and transmission T = exp[−OD].

Absorption

ge μB B

Pump Laser

Energy

Zeeman
Splitting

ω3

ω1
ω4

Accululate eDeplete e-

ω2

Anti-Hole

Hole

Anti-Hole
ω1

Side-Hole
ω2

ω3

ω4

gg μB B

Figure 1.6: Lowest crystal field levels of the 4 I13/2 and 4 I15/2 manifolds with their
respective Kramers degeneracies lifted by an applied magnetic field (left). The pump
laser is tuned to frequency ω3 , exciting the transition is shown in red. Population
decays along green transitions, as well as back down to the initial state. If the
lifetime of the upper |gi state is long compared to the decay from the lower |ei
state, population accumulates in the upper |gi state. Subsequent scanning of a
laser will show an increase or decrease in the absorption, depending on whether
there is an accumulation or depletion of population from the lower state of the
transition. Transitions ω2 and ω3 are spin preserving, while ω1 , ω4 , and the decay
between ground states involve a spin-flip and have thus been depicted by lines at an
angle. A sample of this spectrum, where the pump laser is narrow compared to the
inhomogeneous linewidth of the transition is shown as well (right).
The hole will fill to equilibrium as the result of a number of processes which
can be classified into two categories. Namely, the hole is either filled in from the
sides, or the hole is filled in by population moving from a different level. The former
is known as spectral diffusion, and typically results from an interaction between
spatially neighboring electron spins. The latter process is the result of decay from
either the excited state or the other ground state in the Kramers doublet. It is also
generally true that ions in optical excited state can and will decay to other states in
the 4 I15/2 manifold, with each decay transition occurring with its own characteristic

15
rate. Using detailed balance the individual decay processes may be dispensed with,
and the multitude of individual rates can be simplified by grouping all levels other
than the states of interest. This yields excited state decay rates into the ground states
of interest and one rate into all other states, decay rates from the lumped other states
into each of the lowest Kramers doublet, and a decay rate between the two states in
the Kramers doublet.
Photon Echos
The primary tool for probing decoherence is the photon echo, which was first
demonstrated in a ruby laser crystal by Abella et al. [53]. The underlying physics
is analogous to the spin echo, which was first demonstrated by Hahn in 1950 [54]:
both rephase decoherence in a two level system. The photon echo differs only in that
energy separation between the two levels corresponds to an optical photon, rather
than a microwave or radio frequency (RF) photon for spin echos.
To explain the echo itself, we return to our discussion of the Bloch sphere from
Section 1.1, where the quantum mechanical state of a two-level system is represented
generally by |ψi = cos(θ/2) |0i + eiφ sin(θ/2) |1i, where |0i is the lower state, |1i is
the upper state, and θ and φ are the angles which identify the state. As before, the
latitude on the sphere, represented by θ, dictates the energy of the system, while φ
represents the complex phase between the ground and excited states.
The time-dependent Schrödinger equation, i~ ∂t∂ Ψ = Ĥψ, can be easily solved for
energy eigenstates, yielding Ψ(x, t) = e i~t ψ(x), which shows that energy eigenstates
accumulate a complex phase at rate proportional to their energy. As such, an excited
group of ions initially on the equator of the Bloch sphere with the same phase will
each accumulate phase at a variety of rates. This initialization for a photon [spin]
echo is achieved by the application of an optical [microwave] driving pulse which
rotates the state 90◦ along the y axis. After allowing a period of time for dephasing,
denoted τ, a second application of the driving field serves to rotate the ensemble
of state vectors around the y axis by 180◦ . These two pulses are called π/2 and π
pulses, respectively.2 During a second period of time of equal length, the ensemble
of vectors will continue to dephase relative to each other, only now losing the relative
phase difference, due to the negative sign on the already accumulated phase acquired
from the rotation. After a second interval of τ, the ensemble of emitters, which
2 Here, π and π/2 refer to the pulse area, calculated from the incident field intensity, duration,

and coupling strength. For explicit computation of pulse area, as well as a wonderfully thorough
discussion of two-level systems, see [55].

16

Amplitude (arb)

were previously destructively interfering, are now once more have the same phase
and many will spontaneously emit. An illustration of the pulse sequence and the
resulting manipulation of the state on the Bloch sphere are shown in Figure 1.7.
π/2 pulse

π pulse

echo

Time (ms)

Figure 1.7: The pulse sequence of an echo and associated Bloch sphere representation of the state, where the effects of the drive laser are shown in red and spontaneous
effects are in gold. First, a π/2 pulse serves to move the state vector from the ground
state to the equatorial plane. The state will immediately begin to dephase. A subsequent π pulse after time τ rotates the state around the same axis, inverting the
relative phase that has been accumulated since the end of the first pulse. The state
continues to dephase, completing the reversal of the previous dephasing at time τ.
At this point, there is no phase interference between the various components of the
state, and spontaneous emission.
The canonical metaphor was presented by Hahn in Physics Today and accompanied by an image on the cover [56]. Imagine a number of runners, each with a
characteristic speed, who all begin running. When signaled, at time τ after starting,
all runners turn around while maintaining their characteristic speed. At time τ after
the cue, all runners will reach the starting line, provided that their characteristic
speed did not change. The metaphor is strained by the implication that it’s possible to reverse the direction of phase accumulation. Therefore, a compromise to
improve accuracy would be to imagine ants constrained to run clockwise from your
perspective on a paper track; upon flipping the paper track upside down, to maintain
clockwise motion the ants must reverse direction, and you would see rephasing.

17
If the phase is perturbed during the process, the amplitude of the resulting echo
will decrease. The coherence time, T2 , is the exponential decay constant for this
amplitude decay as a function of total wait time. Symbolically, the amplitude is
proportional to exp [2τ/T2 ].
It’s worth noting that the photon echo can be thought to be a method of storing
photons, as the rephasing pulse recovers the initial pulse. However, because it relies
on the coherence of the optical transition, storage time is limited compared to storage
utilizing a metastable spin or hyperfine transition. Additionally, the rephasing pulse
leads to inversion and spontaneous decay if the initial pulse has a low-amplitude,
which precludes it as a quantum storage protocol. Lastly, to be considered an optical
memory, the input must be able to recalled on demand.3
Many proposals and demonstrations of quantum optical memory protocols can
be found, well-summarized in existing review articles [13, 57]. Of these, many are
based on the dephasing and engineered rephasing of an absorbing ensemble. Below
I will describe the protocol based on Atomic Frequency Combs.
Atomic Frequency Combs
Atomic frequency combs (AFCs) were shown to store light without the amplified
spontaneous emission issue of photon echoes by eliminating the need for a rephasing
pulse [58]. First an AFC is set up with spectral hole burning to tailor the absorption
profile. Using a scanned laser frequency or pulse pairs to excite periodically spaced
ions, moving population to a long-lived auxiliary state. Note that to increase optical
depth (and in doing so, increase echo efficiency), population can be initialized into
the ground state using the |auxi → |ei transition. A temporally short pulse is
absorbed by the ions in the comb teeth across the broad spectral feature. Then, each
of the absorbing teeth evolve with a phase. For comb teeth separated in frequency
by ∆, the phases accumulated by the teeth will be e E/i~t , e(E+~∆)/i~t , e(E+2~∆)/i~t . . ..
Clearly, at time t = 1/∆, the phases will all match to within a factor of 2π, at which
point the ensemble will re-emit the absorbed input.
Because the total storage time of the ensemble is set before it receives its input,
the AFC echo described here is often regarded as a delay line. This system can
be expanded to an on-demand quantum memory, however. The full proposal was
first presented in [59] and demonstrated in [60]. As before, an AFC is prepared
3 I consider this to be a somewhat arbitrary nomenclature convention, as no readout method can

be instantaneous. However, there are practical, applications-based reasons why any delay between
querying the memory and receiving the stored photon must be short.

18
and the input is sent in. Then a π-pulse is used to rotate the excitation from the
upper optical state to a a long-lived spin-wave storage state. Once the pulse is to
be recalled, a second π-pulse is applied, rotating the excitation back to the optical
excited state, whereupon it continues its evolution for the remainder of t = 1/∆
before spontaneously emitting. Lauritzen et al. demonstrated AFC storage for 360
ns at the single photon level with an efficiency of 0.7% in bulk Er:YSO [51].

Intensity

Prepare Comb

Absorption

Energy

Burning Laser

As both a long lived shelving state and auxiliary state are required in addition to
the ground and excited states of the optical transition, implementing a full spin-wave
memory is not possible using the erbium Kramers doublets heretofore described.
It should be possible to implement a spin-wave AFC memory using the hyperfine
levels of isotopically purified 167 Er in YSO, however, which will be addressed in
Chapter 5.

Frequency

Optional Spin Wave Storage

Input
T0

Output
2π/Δ-T0

Figure 1.8: Schematic diagram of the ground, excited, and auxiliary states used in
preparation of the atomic frequency comb, as well as the shelving state used for
spin-wave storage. The comb on the transition between ground and excited states
are burned, tailoring the inhomogeneous absorption profile. The echo is reproduced
after time 2π/∆. To implement spin-wave storage, the excitation is moved to a
shelving state using π pulses (blue), which extends the storage time, limited by the
coherence of the shelving state.

19
1.4

Rare Earth Ion Cavity Quantum Electrodynamics

At this point, outside the Faraon lab, the rare earth ion community works with
ions in host crystals either in bulk, waveguides defined in various manners [61, 62,
63], or machined mesoscopic whispering-gallery mode resonators implemented a
macroscopic cavity [23]. There have also been demonstrations of coupling rare
earth ions in hosts to microwave cavities [64]. However, so far no optical cavities
with mode volumes on the order of a few cubic wavelengths have been demonstrated
elsewhere. We set out to use micro and nanoscale optical cavities to improve upon
and extend this line of work, by leveraging cavity quantum electrodynamics (cQED).

In cQED, we model a system containing an optical cavity and an optical emitter,
which we treat as a two-level system. The emitter’s transition, with ground and
excited states |gi and |ei, corresponds to a frequency ωa , which may be detuned
from center of the optical mode of the cavity at frequency ωc . We characterize
the system with three rates: γ is the spontaneous emission rate of the emitter, κ is
the cavity decay rate, and g is the coupling rate between the emitter and the cavity
mode. The canonical cQED illustration of a Fabry-Perot cavity with the three rates
is labeled in Figure 1.9.
κi
κc

Figure 1.9: The iconic representation of cavity quantum electrodynamics, depicting
a cavity (blue) with mode coupled to a two-level system (white). The system is
characterized by excitation transfer rates (green), namely the coupling between the
ion and the cavity, g, the spontaneous loss from the cavity, γ, and the loss from
the cavity mode. Cavity loss κ is the sum of all loss rates from the cavity, which
includes coupling to the input/output channel, κc , as well as all other loss modes, κi ,
including scattering and absorption.
Ambiguity occasionally arises in the literature surrounding whether g, γ, and κ
refer to the rate of decay of the electromagnetic energy or the field; I will exclusively

20
use the energy decay rates and have endeavored to adjust all equations reproduced
from cited references accordingly.
The cavity is typically characterized by a quality factor and a mode volume. The
quality factor is 2π times the number of oscillations sustained by the confined field
before it decays to 1/e of its initial value, and is related to κ with Q = ωc /κ. The
mode volume is often approximated with
® r )| 2 dV
 | E(®
,
Vmode =
(1.3)
® r )| 2
max (®
r )| E(®
® r ) is the electric field as a vector-valued function, max() is a function that
where(( E(®
returns the maximum value of the argument,  is the permittivity, and we integrate
over the position in the cavity, r®. It’s worth noting that while this equation is exact
for non-leaky microwave cavities, where the mode is confined within conducting
boundaries, the equation does not truly converge for dielectric cavities [65]. However, for the low-loss cavities discussed in this thesis, Equation 1.3 is sufficiently
accurate.
Increased Effective Optical Depth
A rare earth ion in bulk crystal weakly couples to its environment. While the
resulting long storage time is beneficial for memories, a memory must also be able
to be written to and read from efficiently, and unfortunately, this relative isolation
also results in a low probability of interaction with an input photon. As a result,
work performed with bulk crystals require very large ensembles of ions to attain
suitable optical depth.
Intuitively, trapping the photon in the vicinity of the ion should increase the
coupling, and that a smaller cavity or longer storage time in the cavity should
increase the coupling. More quantitatively, if we assume the ions and cavity are
coresonant at angular frequency ω, then the coupling rate for an ion at a given
position r® is described by
E(®
r)
gion (®
r ) = g0
max(E)
E(®
r)
n 2~0Vmode max(Ez )

(1.4)
(1.5)

where g0 is the coupling rate for an ion at the cavity electric field maximum, µ is
the electric dipole moment of the transition, n is the refractive index at the location

21
of the cavity maximum, ~ is the reduced Planck constant, and 0 is the vacuum
permittivity. We use µ to denote the dipole moment for the given polarization of
electric field. Typically the dipole moment is a vector, and the misalignment between
the dipole moment and the electric field polarization is achieved by including a term
® µ®|| E® |; however, because the 4 f transitions in rare earth ions are not
cos(ξ) = µ® · E/|
pure dipole transitions, the dipole moment cannot be expressed easily as a vector.
As multiple ions are added to the cavity, the total coupling rate, gtot for the
ensemble, increases with the size of the ensemble as
gtot = gion N

(1.6)

for N ions, presuming that all are coupled equally.
The cooperativity is a coupling figure of merit, and can be calculated from cQED
parameters as
g2
ζ=
(1.7)
κγ
where higher cooperativity corresponds to stronger coupling.4 This can be interpreted using the definitions of the various rates such that a cooperativity of 1 implies
that a photon in the cavity is equally likely to couple to the ion and back to the cavity
as it is to escape to free space. Given the above expressions for g0 and κ, we can see
that the cooperativity is proportional to the ratio of quality factor to mode volume.
Thus, the coupling to an ion can be increased by placing the ion in a small cavity
with a high quality factor.
Increased Echo Efficiency
In the regime where the quality factor is exceedingly high, light is once again
unlikely to couple to the ions, except that now the cause is the low transparency
of the cavity. The cavity energy decay rate κ is the sum of the decay rates for the
various channels of the cavity. It is useful to explicitly separate the coupling between
the cavity and the input/output mode, κc , from the total decay rate for the remaining
channels, κi . The quality factor corresponding to κi is known as the intrinsic quality
factor, Qi , while the Q corresponding to κ is known as the loaded quality factor,
Q l . Logically, simulations and measurements both probe the loaded Q, and cavities
which are weakly coupled to the input mode will possess a loaded Q l that nearly
matches Qi .
4 Note that usually η is used to represent cooperativity; however, to reduce ambiguity, in this

thesis η is only used for echo efficiency, described shortly.

22
It was shown that an optical cavity can achieve complete absorption of the input
light if κi is negligibly small and κ ≈ κc is equal to the rate of energy absorption
by the ensemble [66]. Quantitatively, the cavity-enhanced AFC echo efficiency is
given by
2
 
4Γc κc
−7
η=
(1.8)
exp 2 .
(Γc + Γ0 + κ)
Here, F is the finesse of the AFC, defined analogously to Fabry-Pérot cavities as the
ratio of FWHM to feature spacing; Γc and Γ0 describe the absorption rate of light
by the cavity comb and the absorbing background in addition to the comb, due to
imperfect comb initialization. Perfect hole burning will reduce Γ0 to zero, and with
κc = κ = Γc , the prefactor reaches unity while the exponential term accounts for
the rephasing efficiency limit due to the nonzero width of the AFC teeth. Progress
toward reaching this regime, referred to as impedance matching, is discussed in
Chapters 4 and 5.
Increased Hole burning Efficiency
Efficient hole burning is difficult in Er:YSO because the spin decay rate is only
at most a factor of 10 longer than the excited state decay rate. As hole burning is
necessary for state preparation in many optical memory protocols, creative methods
have been attempted to improve the hole burning efficiency, including applying an RF
field to mix the excited state population to other spin states as well as optically driving
spontaneous decay to a short-lived auxiliary state higher in the 4 I15/2 manifold [50].
Coupling an optical cavity to an emitter can modify spontaneous decay rates for
coupled emitters via the Purcell effect [67], allowing us to shorten the optical
excited state lifetime without changing the spin state lifetime. This is demonstrated
and further discussed in Chapter 4 for the purpose of improved hole burning without
the application of auxiliary optical or RF fields. However, here we introduce and
discuss relevant aspects of the Purcell effect.
Originally proposed for relaxation of spins in a microwave cavity, the Purcell
effect describes the increase in excited state decay rate due to the interaction with
a resonant cavity. The rate for any spontaneously occurring transition in quantum
mechanics from initial state |ii to final state | f i is described by Fermi’s golden rule
and is proportional to the density of final states. A resonant cavity serves to modify
the local density of final states, and we can express the ratio of the spontaneous

23
emission rate in the cavity to the spontaneous emission rate in free space as
 3
2
3 Q
Γcav
κ2
µE(®
r)
 .
Γfree 4π 2 Vmode n (ω − ωcav )2 + (κ/2)2 max E(®
r)

(1.9)

This ratio is known as the Purcell factor, and denoted FP . The Lorentzian lineshape
accounts for detuning between the emitter and the cavity, while the final term
accounts for an emitter’s location in the cavity mode profile. It’s worth noting
that when the cavity is on resonance with the emitter and spatially located at the
maximum, this expression reduces to
 3
3 Q
(1.10)
FP,max = 2
4π Vmode n
which has a clear dependence on the ratio between quality factor and mode volume.
As a result, cavities with smaller mode volumes and higher quality factors demonstrate larger Purcell enhancements. If the emitter can decay via multiple channels,
the branching ratio, βr = T1 /Tspon , must be included in the above expression to
account for the fact that only a fraction of the light is emitted into the cavity mode.
Starting from
2
 3
κ2
µE(®
r)
3 Q
β.
(1.11)
FP = 2
r ))
4π Vmode n (ω − ωcav )2 + (κ/2)2 max(E(®
We can substitute for gion , β, and Tspon [23] and thoroughly rearrange to arrive at an
alternate expression,
T1 κgion
(1.12)
FP =
(ω − ωcav )2 + (κ/2)2
2 is large compared to κ/T , the spontaneous emission rate will be higher
Thus, if gion
than that of a free ion, and the decay rate is said to be Purcell enhanced.

1.5

Outline of the Thesis

The remainder of the thesis describes progress toward implementing a scalable,
erbium-based, optical quantum memories. Chapters 2 and 3 contain descriptions of
the simulation, design, fabrication, and characterization of two distinct architectures
of devices coupled to erbium ions in YSO. Lithography of optical cavities typically generally requires a membrane of the material to provide optical confinement,
but high-quality YSO can only be grown in bulk; device architectures presented
in Chapters 2 and 3 provide independent solutions to this issue. The device in
Chapter 2 utilizes a short and highly serialized fabrication procedure based on focused ion beam milling of triangular nanobeam cavities. The device in Chapter 3

24
utilizes electron beam lithography and dry etching to achieve a scalable microcavity that can be coupled to silicon photonics. Chapter 4 discusses progress using
both cavity architectures in erbium state manipulation, compares both devices, and
describes progress implementing memory protocols in the triangular nanobeam cavities. Chapter 5 contains a discussion of alternative erbium systems and potential
future directions.

25
Chapter 2

TRIANGULAR NANOBEAM DEVICES

This chapter describes the design, fabrication, and characterization of triangular
nanobeam devices. While devices with this architecture have been made in the
Faraon group previously for various wavelengths and using different substrates [68,
69], this chapter will focus on the YSO device which I fabricated and used to
demonstrate coupling of a microscale to an erbium ion ensemble for the first time,
presented in [70].
2.1

Device Simulation and Design

It has been demonstrated that light can be confined to mode volumes on the order
of a cubic wavelength, using one-dimensional [71, 72] and two-dimensional [73]
photonic crystal cavities. Typical high-quality-factor one-dimensional nanocavities
consist of etched holes located along the center line of a nanobeam with rectangular
cross-section [74]. Confinement within the beam arises from total internal reflection
owing to a higher refractive index within the beam. Confinement along the beam
results from a careful choice of hole area and spacing, and the periodic spacing
can result in a photonic band gap wherein distributed reflection from the holes
results in constructive interference among reflections. To make such a beam, the
device is designed in simulations, the pattern is exposed in electron beam resist or
photoresist, and the pattern defining the waveguide and holes is transferred using
anisotropic etching. This process, however, requires starting with a membrane of
the material to provide initial refractive index contrast with air or some substrate,
and thus preventing light-leakage into the substrate.
Inspired by the work of Bayn et al. in which triangular nanobeams in diamond
were milled using a focused ion beam [75], we considered removing material from
two angles to create a suspended YSO nanobeam. This fabrication method was
modified by Burek et al. to be scalable through the use of an angled oxygen plasma
etch [76, 77]; however, this technique could not be adapted because there are no good
recipes for dry etching of YSO. Thus, patterning of the YSO was to be performed
using a focused ion beam.
In designing the device, we initially investigated using centered round holes,

26
but soon found that these preliminary designs were very sensitive to perturbations
in alignment of the center holes; offsetting a cylindrical hole from the center line
substantially changes the volume of material removed, which changes the local effective refractive index. While alignment to an accuracy of nanometers is easily
achievable in electron beam lithography, stage drift in the focused ion beam system
would likely result in misalignment of holes. As a result, rectangular trenches with
different widths were chosen to be milled into the top of the triangle to provide
the periodic refractive index variation necessary for confinement along the length
of the beam. It was predicted, and later verified, that the shape of subwavelength
features would be unlikely to cause scattering from the cavity mode. The triangular
nanobeam cavity’s robustness against fabrication imperfections is shown in Figure
2.1. Due to difficulty calibrating the milling rate and focusing the beam, the parameters most prone to variation are the ridge depth, the top width of the nanobeam, and
the ridge length. Each of these demonstrate a fairly weak influence on the cavity’s
quality factor and resonant wavelength.

900

950

1000

900

Wavelength (nm)
Quality Factor

Quality Factor

6e5

850
800

950

850
800

750

750

950

950

850

850

900

800

750

700
300 320 340 360 380
afinal (nm)

0.8

1000

900

950

850
800

750

700
0.35 0.4 0.45 0.5
Ridge Length / afinal

Wavelength (nm)

700
1.0 1.1 1.2 1.3
Top Width (μm)
e5
1000

Wavelength (nm)
Quality Factor

Quality Factor

700
0.5 0.55 0.6 0.65 0.7
Ridge Depth / Beam Height
1000
6e5

6e5

Wavelength (nm)

1000

Wavelength (nm)
Quality Factor

6e5

900

800

750

700
0.9
1.1
ainitial/afinal

Figure 2.1: Simulation results showing quality factor and resonant frequency of
the cavity mode for ± 10% errors on the five main parameters for the nanobeam
resonator. Due to the fabrication method, certain parameters are more reliable
to generate consistently. Parameter plots are roughly sorted from most prone to
fabrication error (top row) to most consistently precise (bottom row). Simulations
were run and analyzed by Alex Hartz.

27
Analogous to most traditional nanobeam optical cavities, we implement a constant periodicity for the “mirror” portions of the cavity and include a parabolic
defect, wherein we vary the spacing between grooves to allow the cavity mode to
exist in a region that adiabatically transitions to regions with photonic band gaps at
the cavity frequency on either side.
A milling angle of 30 degrees was chosen to produce an equilateral triangular
cross section. The cavity quality factor was optimized by searching the parameter
space with finite difference time domain simulations. Simulations were performed
using the freely available software package, MEEP [78]. The cavity mode is polarized in the TE direction (parallel to the top surface of the substrate and perpendicular
to the beam’s length), and possesses a simulated quality factor of Q sim = 70,000 and
a mode volume of Vmode = 1.65 cubic wavelengths. The code used to simulate the
beam can be found in Appendix A.2. The cavity cross-section and optical mode
profiles generated by the simulation are shown in Figure 2.2.
Top view

Cross Section
Ey Mode Profile y

Cross section

Side view

E Field Scale

-1

Figure 2.2: Cross sectional views of the triangular nanobeam structure and associated simulated electric field profile of the mode. The top and side show the vertical
grove structure of the beam, with the smaller spacing period in the center barely
visible. The transverse cross section shows the equilateral triangular shape and the
TE evanescent mode on the sides of the triangle.
The triangular nanobeam optical cavities were first demonstrated with resonant
frequencies at 883 nm, where they were used to demonstrate coupling to neodymium
dopants in YSO [68]. To fabricate a device to couple to the transition of Er:YSO,
the dimensions were scaled such that the resulting device would have a resonant

28
wavelength of 1536 nm. For this scaled device, the top of the triangular beam was
1.38 µm wide, with 200 nm wide grooves that were 800 nm deep and spaced with
a 570 nm period. The mode volume in cubic wavelengths and the simulated quality
factor remain unchanged in the scaling, due to the scale invariance of Maxwell’s
equations in the absence of charge.
2.2

Nanobeam Fabrication

A focused ion beam (FIB) system uses magnetic lenses to focus a beam of
charged particles onto a spot on a sample surface which is rastered across an area
of the sample using additional steering electromagnets. This is similar to electron
beam microscopy, except that in FIB systems the charged particles are gallium
ions emitted from a heated and ionized source, rather than merely electrons. Our
nanobeam devices were milled on an FEI Nova 600 dual beam, which images with
an electron beam and mills with an ion beam that is tilted at a 52◦ angle relative to
the electron beam.
The YSO crystal used was grown by Scientific Materials Inc. with 0.02% concentration of Er dopants, and cut such that the b axis was normal to the polished
top surface. It was intended that the nanobeam would be oriented such that the TE
mode of the resonator would be aligned to the D2 optical axis of the YSO crystal,
because the site 1 dipole moment for the transition of interest is approximately a
factor of 2 larger than in the D1 direction [32]. However, both of the best devices
fabricated in Er:YSO to date are oriented such that the electric field is parallel to the
D1 direction of the crystal, due to a combination of poor labeling and bad luck.
Before milling, a 50 nm layer of chromium was deposited using an electron
beam evaporation tool. This layer prevents charging from either the electron beam
used to image the sample, or the ion beam used for milling. Later devices use
charge compensation where the electron beam simultaneously exposes the sample to
counterbalance the positive charge resulting from the gallium ion beam. Chromium
was chosen because chrome etchant CR-7S minimally etches YSO, and with no
noticeable anisotropy on short timescales.
For all milling, the accelerating voltage on the ions was 20 keV. Before defining
the beam, circular alignment marks were added on either side of the beam to mark
the center of the beam along its length. The beam was then defined using two angled
trenches, milled with a 2.1 nA beam. These milling steps must be performed in
series, as the sample sage must be rotated between cuts to achieve the opposing

29
angle. After each rotation step, the rectangle used to mill the subsequent trench
must be manually aligned to the beam for precision. Additionally, during each step,
sputtered YSO and backscattered gallium from the milling process accumulated on
the underside of the beam. This material was removed using successively lower ion
beam current of 81 pA. Lower ion currents allow more precise milling at a lower
rate due to a lower focal spot-size. Ion currents on this device slightly differ from
those later presented in [69], which were optimized for speed and precision of a
beam resonant with the 883 nm transition of Nd.
The top trenches were all milled in parallel using a 81 pA beam. To calibrate the
milling rate for this step, a sacrificial waveguide was used as a depth test, in which
sample trenches were cut for a range of milling times to precisely determine the time
required for milling to the target depth. Trench depth was calculated geometrically
using the width of the waveguide spine at the bottom of the trench. Coupling
trenches were milled past the end on either side of the nanobeam using a 760 pA
beam, to mill a rectangle 5 µm wide and 700 nm tall at 45◦ from vertical.
The sample was placed in CR-7S for 40 seconds, which also was believed to
remove some of the redeposited gallium and exterior YSO whose crystal structure
had been damaged by the ion beam. Afterward, the sample was rinsed with DI water
and blown dry with nitrogen1. Scanning electron microscope (SEM) images of the
completed beam are shown in Figure 2.3.
It was initially a concern that some combination of gallium ion implantation,
sputtering damage to the crystal lattice, or REI proximity to the crystal boundary
might exacerbate decoherence rates or increase inhomogeneous broadening of the
ions, but the coherence time measured in the nanobeam-coupled ions matched that
measured in bulk in [68].
2.3

Confocal Microscope Characterization

The nanobeam device was characterized using a custom-built confocal microscope to determine resonant frequency and quality factor. A schematic of the
measurement apparatus is shown in Figure 2.4. The optical input could be selected
from multiple sources using sliding mirrors mounted onto 19 mm dovetail optical
rails, labeled as “flip mirrors” in the figure. Collimated light from the input path was
sent through two alignment apertures to an non-polarizing plate beamsplitter. Light
1 Somewhat surprisingly, critical point drying was found to be unnecessary, probably due to the

width of the side trenches used to define the beam.

30

5 μm

1 μm

Figure 2.3: Scanning electron microscope images of the triangular nanobeam cavity
in YSO. Angled trenches at the ends of the beam couple the cavity mode to free
space modes used in transmission measurements. The x, y, and z axes on the image
correspond to the crystal’s optical axes D1 , D2 , and b, respectively. The top image
was taken before removal of the chromium anti-charging layer, while the bottom
images were taken after, resulting in the visible distortion (left) and brightness
variations (right).
reflected by the beamsplitter was aligned to an Olympus LCPlan N 50x IR objective
with a numerical aperture of 0.65 and working distance of 4.5 mm. The objective
was required to focus 1536 nm light through a 1 mm of glass (cryostat window) and
onto the sample. The sample containing the nanobeam cavity was indium-soldered
onto the cold finger of a Janis ST-500 continuous flow liquid helium cryostat and
cooled to 4.7K for the duration of the experiment. The light transmitted through
the cavity was collected and collimated by the objective, and half of the light conveyed back to the beamsplitter passes to the output path. The output path was
also defined by two alignment apertures, and included a pair of lenses aligned as a
telescope/beam-expander. A pinhole on a flip mount was used as a spatial filter on
the image plane of the telescope to selectively pass light emitted from the output
port and block all other light. The collimated output of the telescope continues
along the output path and was directed to various detectors using mirrors mounted

31
onto optical rails.2
Input sources included a 532 nm alignment laser for easy visibility, a 1064
nm alignment laser that was visible on Si-based cameras but closer to sharing focal
lengths with the 1536 light, a tunable external cavity diode laser (TUNICS PLUS SC)
for narrow-linewidth scans and excitations, and a supercontinuum laser (Fianium
WhiteLase Micro) for broadband transmission.
Detectors included a spectrometer (Princeton Instruments SP2750) with an InGaAs photodiode array (Princeton PyLoN IR 1024-1.7), an InGaAs/InP avalanche
photodiode detector (ID Quantique ID220), or one of two cameras used for alignment. To facilitate imaging, an additional beamsplitter on a flip-mount was used to
mix in diffuse light from a 940 nm (Thorlabs M940F1) LED immediately before the
objective. A silicon-based CCD camera (Edmund Optics EO-0312M-GL) was used
in conjunction with the 532 nm and 1064 nm alignment lasers, as well as the diffuse
940 nm light source. To facilitate improved alignment to the device, an InGaAs
infrared camera (Sensors Unlimited 320HX-1.7RT) was also used to image the 1536
nm light directly.
The transmission of the nanobeam is shown in Figure 2.5. The simulated broadband transmission spectrum of the nanobeam cavity is compared to the transmission
spectrum measured using the supercontinuum laser and spectrometer. A narrowband scan of the resonance is also included, achieved by frequency scanning the
diode laser across the resonance and integrating the transmitted counts on the spectrometer. The quality factor of this resonance was determined to be Q l = 11, 400 by
least-squares fitting of a Lorentzian to the transmission curve, also shown in Figure
2.5.
2.4

Cavity-Ion Coupling

Due to the small linewidth of both the cavity resonance and the ions’ optical
transition, fabricating a device with a cavity exactly coresonant with the optical
transition upon cooling was determined to be prohibitively difficult in a reasonable
amount of time. Instead, the resonance of a high quality factor device near the erbium
transition was tuned to match the transition by tuning the device’s resonance using the
condensation of nitrogen gas [79]; the difference between the electric susceptibility
of the nitrogen and that of vacuum results in a modification of the effective refractive
2 I found optical rails had more precision and repeatability than flip mounts, which was particularly

important for some components.

32

Flip Mirror

Mirror

Waveform
Generator
Timing
Module

Input Arm

Supercontinuum/
Alignment Laser

Modulator

Polarizer

Laser

Pinhole

Diffuse
Source

Output Arm

tat
yos

Spectrometer/
Cameras

Cr

SPD

le

tiv
jec

mp

Sa

Ob

Fli am- r
Be litte
Sp

er

riz

am r
Be litte
Sp

la
Po

sco

le
Te

or

irr

pM
Fli

er r
Fibouple

Objective
Sample
Input Arm

Telescope
Output Arm

BeamSplitter

Figure 2.4: Schematic diagram and labeled image of the confocal microscope used
in the characterization of the devices. Black arrows show the direction of data in
cables, optical fiber is shown as a black line with a red core, and flip-mounted
components are in a black dotted rectangles. Different input sources are selected
using individual flip mirrors, shown at the top of the diagram. Similarly, various
detectors are selected using flip mirrors on the output arm. Alignment aperture
locations are depicted using unlabeled thin blue lines. The short cylindrical cryostat
shown in the image is depicted in a green dotted outline.
index of the mode, which shifts the cavity mode to longer wavelengths.

33

Transmission

Data
Fit

1400

1500

Wavelength (nm)

1600

1537.5

1538

1538.5

Wavelength (nm)

Figure 2.5: Broad and narrow transmission spectra of the detuned nanobeam at
room temperature. Broad-spectrum data shows the measured transmission through
the cavity using a supercontinuum laser, measured with a spectrometer, with the
resonance of interest outlined in green. Inset shows a frequency scan of a narrow
linewidth laser in transmission through the cavity resonance at room temperature.
Fitting the transmission spectrum with a Lorentzian distribution yields a linewidth
of 135 pm (17.1 GHz), corresponding to a quality factor of 11,400. A higher quality
factor of Q l = 70, 000 was later achieved with a refined fabrication process.
The nitrogen gas was slowly bled into the chamber through a port added to the
side-flange of the cryostat. On the opposite side of the flange, a 1/8” outer diameter
stainless steel tube conveyed the nitrogen above the outer radiation shield and was
aimed the sample. Both sides of the flange are shown in images in Figure 2.6.
A series of frequency scans of the cavity transmission are shown in Figure
2.7, illustrating the progression of tuning as the cavity resonance reaches the ion
transition. Our paper presenting initial results coupling erbium ensembles to a
nanobeam cavity, Reference [70], pointed out that the coresonant transmission scan
at low intensity portrays a dip that is ∼40% of the full transmission peak, and
that using the bulk absorption coefficient for light polarized along the D1 direction
(24.5 cm−1 [32]) would result in a 3.8% dip in a waveguide of the same length (26
microns). This was stated to illustrate the enhancement of coupling provided by the
cavity.
It provides more insight, however, to compare the transmission of the cavity to the
theoretical model of an optical cavity coupled to an inhomogeneously broadened
ensemble presented by Diniz et al. [80]. Given constants a and b, and a phase
accounting Fano interference between cavity transmission and a leakage mode, φ,

34

Nitrogen
Outlet Tube

Nitrogen
Inlet Tube

Figure 2.6: Nitrogen line into the cryostat used for condensation tuning. The tuning
line meanders over the cylindrical heat shield and is slightly flattened in order to
prevent thermal contact to the circular heat shield or cryostat housing. When the
cryostat is under vacuum, the nitrogen travels ballistically and some scatters off of
the inside of the top cover (not shown) onto the sample.
the transmission is given by
− 2κ
T = a be +
i(ω − ωcavity ) − 2κ − iW(ω − ωions )

where

(2.1)

! 2
 ω + iγ/2 
πln2 Ω2
iγ/2
 erfc −i
W(ω) = −i
exp 
(2.2)
∆/ ln2
 ∆/ ln2 
accounts for the coupling to the inhomogeneously broadened ensemble, which we
assume is Gaussian distributed. Here κ, γ, and ω are as previously defined in
Section 1.4, ∆ is the HWHM of the ensemble inhomogeneous broadening, erfc() is
the complex complementary error function, and
s∫
Ω=

2 (®
gion
r )ρdV

(2.3)

is the ensemble coupling rate between the ions and the cavity, a generalization of
gtot in Equation 1.6. This expression uses the ion density, ρ = 1.87 million ions per

35

Transmission (arb)

Tune Step 1

Tune Step 2

Tune Step 3

-30 -20 -10 0 10 20 30
Detuning (GHz)

Figure 2.7: Measured transmission spectra as the nanobeam is tuned toward longer
wavelengths onto resonance with the Er:YSO transition. The frequency of the
transition is denoted with a thin gold line at a detuning of 0.
cubic micron,3 and the position dependent coupling rate gion (®
r ), defined in Equation
(1.4). The atomic loss rate γ is much slower than all other rates and thus neglected,
and ∆ = 0.65 GHz is the HWHM of the ensemble inhomogeneous broadening,
measured in the bulk Er:YSO.
Using Equation 2.1, we can fit the measured transmission for Ω. The result of
the fit is shown in Figure 2.8, from which we can extract the value Ω = 1.35 GHz.
Using this, we can calculate the cooperativity, ζ = 0.48, using Equation 1.7.
Once coupled to the rare-earth ions, the cavity can be used to enhance the
coherent control of the ions. This will be discussed in Chapter 4, along with a detailed
comparison comparing and contrasting a second device architecture presented in
the following chapter.

3 This site 1 ion density assumes 200 ppm concentration calculated using the macroscopic density

of 4.44 g/cm3 and the molar mass of 285.9 g/mol. It is also assumed that Er occupies both yttrium
sites equally, due to the close match in covalent radius (Er: 189 pm, Y: 190 pm) [81].

36

Transmission (arb)

Data
Fit

-20

-10

10
Detuning [GHz]

20

30

Figure 2.8: Fit of the resonant cavity transmission to the expected transmission of a
cavity coupled to an inhomogeneously broadened ensemble, fitting for the detuning
and ensemble coupling rate Ω.

37
Chapter 3

HYBRID MICRORING DEVICES

In this chapter, we describe the design, fabrication, and characterization of hybrid
resonator devices where the optical mode is confined in a high index material sitting
on top of YSO. The coupling to the ions occurs via the evanescent field. First I
discuss some preliminary work on hybrid devices on YSO, and then I focus on the
silicon photonics device which I fabricated and used to demonstrate scalable devices
coupling to an erbium ion ensemble, presented in [82].
These devices were conceived to allow for scalable fabrication of multiple interconnectable, indistinguishable devices; serial fabrication of nanobeams using
focused ion beam milling would be unlikely to succeed in yielding two devices
which could both be tuned to the ion resonance or scaled to produce multiple qubit
storage devices. Still facing the problem of requiring optical confinement within
a bulk slab of material, I determined to make hybrid resonators, in which the resonators are composed of one material on an optically active substrate composed of a
rare earth host crystal. These resonators would consist of a patterned layer containing most of the electromagnetic field, while the ions would couple to the evanescent
tail of the mode extending into the bulk substrate. To achieve confinement and
eliminate loss into the bulk, it was necessary for the material of the cavity to have
a higher refractive index than the YSO substrate. As characterization equipment
at 883 nm was more readily available, preliminary work focused on resonators to
couple to neodymium dopants.
3.1

Initial Device Study for Neodymium Ions

Before starting fabrication of hybrid devices for coupling to Er:YSO, multiple directions were explored to develop hybrid cavities on Nd:YSO. Traditional nanobeam
photonic crystal cavities, disks, and ring resonators were explored in both silicon
nitride and gallium arsenide.
Silicon Nitride Devices
Both low stress silicon nitride and stoichiometric silicon nitride were found to
be easily deposited on YSO as uniform films with high adhesion. However, in
simulations, the refractive index of silicon nitride, nSi3 N4 ≈2 [83], was found to not

38
provide enough contrast against the refractive index of YSO, nYSO ≈1.8, to enable
optical cavities with high quality factor and reasonably small mode volumes.
Gallium Arsenide
Unlike silicon nitride, gallium arsenide (GaAs) must be a single crystal to exhibit
low optical losses, and thus cannot be deposited on an arbitrary substrate as a useful
optical layer. As a result, a single crystal membrane of GaAs must be used. This
is achieved by first using molecular beam epitaxy to grow a sacrificial aluminum
gallium arsenide (Al x Ga1−x As) layer and then a GaAs membrane on top of a GaAs
wafer. As the lattice constant of AlGaAs and GaAs are nearly equal [84], the added
layers can be deposited in such a way that the crystal lattice is propagated perfectly
during the deposition. With a room-temperature band gap corresponding to ∼870
nm light [85], GaAs devices can be fabricated without substantial absorption loss
for the 883 nm transition of Nd:YSO.
Since the membrane must be patterned, it is necessary to transfer the GaAs
from the epitaxial wafer to the rare earth host either before or after patterning
the GaAs membrane; both courses of action have their respective disadvantages.
Transfer using an unpatterned membrane was attempted by selectively etching the
AlGaAs in hydrofluoric acid (HF). This was found to seldom yield large planar
areas, due to the fragility of the GaAs membranes. Using spin coating to apply
electron beam resist resulted in visible thickness irregularities due to edge effects and
wrinkles in the membrane. This, in conjunction with poor charge dissipation from
the transferred GaAs membrane on insulating substrates, resulted in inconsistent
exposure of the pattern. The most successful devices achieved using this method
were ring resonators patterned into a GaAs membrane that had been transferred onto
a glass substrate. At liquid helium temperatures, these rings demonstrated a quality
factor of 24,000 near the neodymium resonance wavelength. Figure 3.1 depicts the
cavity spectrum at room and liquid helium temperature, as well as the Lorentzian
lineshape fitted to the cavity dip used to estimate the quailty factor. The spectra
were measured by collecting the transmission through a waveguide coupled to the
cavity, using a confocal microscope, analogous to the one described in Section 2.3,
operating at 880 nm. A supercontinuum laser was used as the input source, and the
output was sent to a spectrometer with a Pixis CCD camera.
Patterning the membrane before lift off substantially encumbers the use of waveguide coupled ring or disk resonators, since the spacing between waveguide and res-

39

Reflection (arb)

1 room temp
296K

840

860

880

1 cryo
4.2K

900

Wavelength (nm)

940

Reflection (arb)

Reflection (arb)

874

920

876

878
880
Wavelength (nm)

882

Q=24,000

Data
Fit

875.9 876 876.1 876.2 876.3 876.4
Wavelength (nm)

Figure 3.1: Reflection spectra of gallium arsenide rings, patterned into a membrane
that had been transferred onto glass. The measured spectrum at room temperature
(red) clearly illustrates the absorption onset at the band edge near 880 nm, which
shifts toward shorter wavelengths at liquid helium temperatures (blue). The inset
shows a fit of the lineshape on the high resolution spectrum, yielding a Q = 24,000.
onator cannot remain fixed if the membrane is fully etched. Incompletely etching
the device layer, followed by transferring and then etching to release the devices was
determined to be prohibitively difficult due to the low tolerance in device height and
the high variability in etch rate.
Disks were fabricated on the assumption that ions coupled to the waveguide could
potentially be excited, which would emit into the disk. That light might then scatter
from the disk and be collected without a waveguide. Additionally, one-dimensional
photonic crystals were patterned and etched, knowing that individual nanobeams
could be transferred intact. To transfer nanobeams to the YSO substrate, the devices
were almost entirely undercut in HF. Then, a drop of dilute HF was placed on the
YSO and the GaAs device chip was placed face down on top of the YSO sample.

40
The sample was blown dry before the liquid completely evaporated, as YSO etches
slowly in HF and evaporating HF deposits HF crystals on the substrate. The total
number of devices which completed the transfer or remained on the GaAs chip were
a small fraction < 1% of fabricated devices, leaving us the additional problem of
improving transfer efficiency. Optical and scanning electron microscope images of
gallium arsenide devices fabricated using both methods are shown in Figure 3.2.
It has since been shown that polydimethylsiloxane (PDMS) can be used to
transfer mesocopic continguous sheets of patterned devices to arbitrary substrates
[86]. However, this does not bypass or solve the additional issue that high quality
factor GaAs devices using these two methods proved untenable even before transfer.
Residual AlF3 and AlF(H2 O) [87], resulting from the HF etch of AlGaAs, found
on the underside of the devices appeared to reduce the device quality factor with no
readily apparent scheme to solve or circumvent this problem.
3.2

Device Simulation and Design

Amorphous silicon hydride, already being used for other devices within the
Faraon group [88], was considered for use with Er:YSO as we developed optical
characterization capabilities in the telecom C band. Though ellipsometry measurements found a substantial decrease in transparency for wavelengths past the visible,
it was initially unclear how much absorption would be observed at 1536 nm.
As a test, mircrorings were fabricated in amorphous silicon hydride on a thermally oxidized wafer. After determining that the absorption-limited Q might be
sufficiently high, microrings were designed using MEEP, optimizing the ring width
and height for a first-order TM mode. Mode shape and quality factor were found
to be optimized for a ring 380 nm tall and 480 nm wide. While rings with smaller
radii demonstrated high losses experimentally, rings with a sufficiently large radius
of 11.0 microns were found to have low bending loss in simulation and experiment
The simulated mode is depicted in cross-sections perpendicular to the vertical (z)
and azimuthal (θ) directions of the ring resonator in Figure 3.3. The TM polarization
was chosen to achieve an increase in the electric field at the ions. Due to the boundary
condition on the continuity of  E for the electric field perpendicular to the surface,
there is a factor of (nαSi /nYSO )2 at the boundary, compared to continuity of E for the
TE mode. The resulting field profile from this boundary condition is illustrated in
Figure 3.3.
A high resolution simulation of the cavity mode was performed using cylindrical

41

Transfer onto YVO or YSO, then write
20 μm

2 μm

2 μm

20 μm

2 μm

1 μm

1 μm

Write then transfer
5 μm

2 μm

1 μm

20 μm

5 μm

1 μm

2 μm

1 μm

Figure 3.2: Mixed optical and scanning electron microscope images of gallium
arsenide devices in various stages. The top eight images depict crystalline GaAs
membranes transferred to rare earth hosts before patterning. Images with blue backgrounds are devices on YVO, in which micro-cracks in the transferred membrane
are visible. On red backgrounds, the left images show patterned and developed electron beam resist before etching, viewed on an optical microscope. The rightmost
four images on red backgrounds show progressive magnification of various rings on
YSO, where micro-cracks, distortion, and drift in the ring location can be seen.
On gold backgrounds there are waveguide-coupled disks on the top row, and photonic crystal nanobeams with parabolic defects in the second row. The images with
green backgrounds show a transferred nanobeam and ring on YSO.
coordinates for a precise field distribution with low pixelation. This mode profile
was used to calculate a resonator mode volume of 2.93 cubic microns. Here it is
necessary to take into account the sinusoidal envelope in the azimuthal direction,
which contributes a factor of 1/2. The profile was also used to calculate the coupling
rates for ions, gion (®
r ), throughout the simulated volume of YSO, though in this case

42

Distance (μm)

10

-10

Vertical Distance (μm)

Distance (μm)

Ez(arb.)

10

Ez (arb.)

α-Si

-1

εr

-10

YSO
9.5

10.5
11.5
Radial Distance (μm)

9.5

10.5
11.5
Radial Distance (μm)

1 3.24

εr

11.63

Figure 3.3: Ring resonator mode profile simulated in MEEP. The top shows a cross
section of the field through the mode maximum. Below, a cross section through
the ring shows the dielectric permittivity of the structure in blue (left), intensity
of the electric field in red (center) and a plot through the mode maximum. The
discontinuity in the field across the top and bottom of the ring results from the
continuity of the perpendicular component of  E.
the azimuthal sinusoidal envelope is not included, as the period of the 200 THz light
is negligible compared to all other timescales. As a result, on the relevant timescale
of the ions, the field can be taken to be azimuthally homogeneous.
Three-dimensional simulations of the ring and a waveguide were run to determine the waveguide width and approximate the optimum spacing between the two.
First, waveguide width was chosen to be slightly smaller than the ring width to better
match k-vectors between the straight waveguide and curved ring. Then, simulations
were run with a variety of ring-waveguide gaps; the loaded quality factors were then
used to approximate the loss rate to the waveguide as a function of distance. To
achieve the critical coupling described in section 1.4, the loss rate to the waveguide

43
must match the absorption of the cavity mode by the atomic ensemble, and both
must be much greater than the intrinsic loss rate of the cavity. When devices were
fabricated, multiple rings were made, each with a different spacing between the ring
and waveguides to allow the selection of an optimally coupled ring.
Additionally, grating couplers were simulated in two dimensions, varying width
and duty cycle to maximize the amount of light scattered perpendicular to the
sample. A comparison demonstrating the local maximum that was found during the
optimization is shown in Figure 3.4.
Dipole source
Einput

Duty cycle:
0.25

Eoutput vacuum

α-Si

YSO
0.20

0.60

0.30

Periodicity: 0.65

0.70

Figure 3.4: Simulations optimizing grating coupler efficiency in two dimensions.
The structure is shown in greyscale in the top left corner, illustrating the location of a
dipole source. To couple to a TM mode, the dipole source and depicted field profile
are polarized along the directions labeled Einput and Eoutput , respectively. Gratings
with slightly larger and smaller gratings and duty cycles are depicted on all sides,
with duty cycle in green and periodicity in gold.
3.3

Hybrid Ring Fabrication

As with the nanobeam, the substrate was a Czochralski grown Y2 SiO5 single
crystal with 200 ppm erbium dopants. The fabrication is summarized in Figure 3.5
and described below.
After initially cleaning the YSO in warm Nano Remover PG (MicroChem),
acetone, and isopropanol, the amorphous silicon hydride film was deposited using a plasma-enhanced chemical-vapor deposition (Oxford Instruments System 100

44

Deposit α-Si
on Y2 SiO5

Spin and pattern
e-beam resist

Transfer pattern
into α-Si

Figure 3.5: Overview of fabrication procedure for amorphous silicon hydride rings.
YSO is shown in blue, amorphous silicon hydride in red, and electron beam resist
in gold.
PECVD) using the recipe in Table 3.1. The deposition process incorporates hydrogen from the silane (SiH4 ) into the silicon; as a result, the membrane is actually
amorphous silicon hydride.
Etch Parameter
RF Forward Power
RF Capacitors
5% SiH4 in Ar Flow Rate
Chamber Pressure
Temperature
Deposition Time

Value
10 W (0 W reflected)
70.3 and 20.5
40.0 sccm
801 mTorr
200 ◦ C
21 min. 35 sec.

Table 3.1: Recipe for amorphous silicon hydride deposition on the Oxford Instruments System 100 PECVD.

Spin coating was used to apply first a 300 nm layer of electron beam resist
(Zeon Chemicals ZEP520A), and then a layer of a spinnable charge-disspation
layer (Mitsubishi Rayon AquaSAVE-ZX). Parameters for the spin coating steps are
included in Table 3.2. As a procedural aside, it is important to let the substrate cool
after baking the ZEP before applying the AquaSAVE.
The ring, waveguides, and grating couplers were then defined in the resist using
a Leica Microsystems EBPG-5000+. The write itself included a bias of 50 nm
and a dose of 150 µC/cm2 , with a proximity error correction for 310 nm of silicon
on Y2 SiO5 . The proximity error correction was generated using the open source

45
material
ZEP520A
AquaSAVE-ZX

spin speed
(rpm)
5000
1500

ramp rate time
(rpm/s) (min.)
5000
1500

bake temp
(◦ C)
180
70

bake time
(min.)

Table 3.2: Spin coating recipe to apply electron beam resist and charge dissipation
layer to the amorphous silicon hydride layer for electron beam lithography.

Penelope, Monte Carlo simulation software [89] to generate the necessary point
spread function. The resist was developed with room temperature anisole for three
minutes, rinsed 30 seconds in methyl isobutyl ketone (MIBK), and blown dry with
nitrogen.
The pattern was transferred from the resist into the silicon membrane using
a mixed-mode etch on an inductively-coupled plasma reactive ion etch (ICP-RIE)
tool (Oxford Instruments System 100 ICP 380). Prior to etching the sample, the
chamber was cleaned with a high power O2 plasma for 10 minutes, followed by a 10
minute conditioning run of the chamber. For the etch, the sample was temporarily
mounted to a 150 mm wafer using Santovac 5 Diffusion Pump Oil (Kurt J. Lesker).
The sample was etched according to parameters in Table 3.3. After etching, the
Santovac 5 was removed using isopropanol, and the resist was removed by leaving
the sample in a closed jar of Nano Remover PG (MicroChem) at 180 ◦ C overnight.
Etch Parameter
Value
RF Forward Power
23 W (2 W reflected)
RF Capacitors
17.4 and 49.0
ICP Forward Power
1200 W (13 W reflected)
ICP Capacitors
45.5 and 58.7
DC Bias Voltage
79 V
SF6 Flow Rate
15.0 sccm
C4 F8 Flow Rate
40.0 sccm
Chamber Pressure
11.0 mTorr
Temperature
16 ◦ C
Etch Time
5 min. 20 sec.
Helium Backing Pressure
4.0 Torr
Helium Backing Flow
13.4 sccm
Table 3.3: Etch recipe for amorphous silicon hydride hybrid rings on the Oxford
Instruments System 100 ICP 380

The completed device is shown in scanning electron microscope images in Figure

46
3.6. In addition to a ring and a straight waveguide terminated in grating couplers, the
device can be seen to additionally posses additional features. A second waveguide
allows measurement of the cavity in transmission, collecting resonant light, which
facilitates measurement. The ring can be measured as a narrow-band add or drop
filter by selecting the input coupler to use in conjunction with the output coupler
labeled in Figure 3.6. To increase signal-to-noise during measurement of the ring,
the waveguides each have a 90◦ bend between the input grating and the output
gratings; as a result, TM-polarized light impinging on one grating is polarized
perpendicularly to TM-polarized light emitted from the output grating, and can be
filtered with a polarizer. The grating opposite the bottom input grating terminates
in a sharp point to scatter light and minimize the interference pattern at the opposite
grating resulting from reflection. Lastly, a triangular feature between the input and
transmission output grating prevents light from scattering into the slab mode directly
between the input and output couplers.

output

200 nm

input

10 microns

500 nm
10 microns

Figure 3.6: Scanning electron microscope images of the hybrid rings. The top right
image includes a label of the input and output couplers for measuring transmission
through the ring. Charging of the ring and waveguides results in some distortion in
the bottom left image. A portion of the ring (top) and a ring-waveguide gap (bottom)
are shown in the right two images. The ring can also be probed as a drop-filter by
sending input through the unlabeled grating coupler using the same output grating
coupler.

47
3.4

Device Characterization

The device was mounted and tested in the same custom-built confocal microscope used to measure the triangular nanobeams described in Section 2.3 and
depicted in Figure 2.4, with minor component substitutions. Discussion of these
substitutions and the results of the characterization follow.
Confocal Microscope Characterization
When characterizing these devices, a more stable diode laser (Toptica CTL and
DLC Pro) was used for narrow bandwidth measurements instead of the TUNICS
laser. Additionally, tungsten silicide (WSi) superconducting nanowire single photon
detectors (SNSPDs) from Matt Shaw’s group at JPL were used for single photon
detection [90]. In addition to the pinhole used to spatially filter output light, linear
polarizing filters were used on the input and output paths to allow improved extinction
between the light that coupled to the ring and backscattered light.
The cavity resonances were measured in transmission using the spontaneous
emission from an EDFA and measured on the spectrometer for broad-spectrum
scans, and for narrow scans the diode laser was tuned across the resonance using external control of the internal piezo motor and detected on an InGaAs transimpedance
amplified photodetector (Thorlabs PDA10CS). To calibrate the piezo scan, a phase
electro-optic modulator (EOM) was used to add sidebands with known frequency
offset which is convolved with a narrow spectral feature like the cavity resonance,
which provides a conversion from scan time to optical frequency. Data from both
types of scans are shown in Figure 3.7. A Lorentzian distribution was fit to the cavity
linewidth with a 1.4 GHz FWHM, corresponding to a quality factor of Q l =112,000.
We believe the loss in the ring is dominated by free-carrier absorption, as the quality
factor was found to increase with decreasing temperature, starting at 64,000 at room
temperature.
Cavity-Ion Coupling
Tuning the cavity resonances to match the 4 I15/2 to 4 I13/2 transition of the site 1
erbium ion ensemble was performed using the same nitrogen condensation described
in Section 2.4. The tuning process is illustrated by a series of cavity scans in Figure
3.8. After repeatedly tuning and detuning, by condensing nitrogen and warming
to room temperature, the quality factor of the device was found to be degraded;
we believe this to be the result of water adsorption to the surface because the
initial quality factor was recovered by heating the device to 200 ◦ C under vacuum.

48

Transmission (arb)

cryo
4.2K

1525

1535

1545
1555
Detuning (GHz)

1565

Transmission (arb)

room temp
296K

-5

Q=112,000

Data
Fit

Detuning (GHz)

Figure 3.7: Transmission spectra of the hybrid ring at room temperature and cryogenic temperatures for a broadband scan, as well as a narrow-linewidth scan of the
resonance near 1536 nm outlined in green. Quality factors and coupling strength
increased as the devices were cooled, resulting in a substantial reduction in the background noise from the EDFA broadband spectrum visible in the room temperature
spectrum. The resonances seem to have shifted slightly toward longer wavelengths
because cooling results in a thermal contraction shifting modes slightly less than
two free spectral ranges.
However, for demonstrations of cavity-ion coupling, data was taken while the Q was
degraded to 80,400. This quality factor was measured and fit while the cavity was
detuned from the ion ensemble. This quality factor corresponds to a cavity decay
rate κ/2π of 2.43 GHz.
Using the high resolution 2D simulation of the cavity described in Section 3.2,
we calculate gion calculated using Equation 1.4. After discretizing the integral in
Equation 2.2 and evaluating across our pixels, we find that Ω = 0.537 for this cavity.
We also have the HWHM of the inhomogeneous broadening, measured in bulk to be
∆ = 0.65GHz. Using these values, we can calculate the expected transmission using
Equation 2.1, fitting only for cavity detuning from the ions; the result of this is shown
in Figure 3.9. As remarked in the relevant publication [82], if the transmission data
is fit using Equations 2.1 and 2.2 to determine the inhomogeneous linewidth, the
resulting HWHM is ∆ = 0.687 GHz. The small deviation from the bulk measured
value of ∆ = 0.65 GHz indicates that processing does not substantially alter the
crystal structure of the YSO, and is unlikely to affect the optical properties.

49

Tune Step 1

Transmission (arb)

Tune Step 2

Tune Step 3
Tune Step 4
Tune Step 5

-10

10
Detuning (GHz)

Figure 3.8: Measured transmission spectra as the microring is tuned toward longer
wavelengths onto resonance with the Er:YSO transition. The frequency of the
transition is denoted with a thin gold line at a detuning of 0. Due to the high quality
factor, the cavity resonance appears much narrower relative to the inhomogeneous
dip when compared to the nanobeam tuning in Figure 2.7
3.5

Amorphous Silicon Hydride Absorption at Shorter Wavelengths

The ease at which amorphous silicon hydride can be deposited on an arbitrary
substrate makes it an appealing option for coupling to various emitters. To further
the consideration of this technology for other emitters like neodymium, other rare
earth ions, or color centers in silicon carbide, rings were also tested to determine
compatibility at other wavelengths.
There exists a substantial body of literature describing the optical and electronic
properties of silicon hydride, summarized well by Gaspari [91]. In this work, he
describes that absorption onset does not begin abruptly at a cut-off frequency due
to the gradual band edge of amorphous silicon hydride; rather, an effective band
gap energy between around 1.7 and 1.9 eV can be extrapolated from measurements,
depending on hydrogen content, though absorption is still observed at longer wavelengths due to dangling bonds. These energies correspond to a wavelength range
of 650-730 nm, and thus we believe the dangling bonds to be responsible for the
temperature-dependent absorption at 1536 nm.
With no adjustments to the device or confocal microscope, the ring described in
Sections 3.2 to 3.4 was measured using the supercontinuum source and spectrometer

50
Transmission (arb)

Data
Fit

-10

Detuning (GHz)

10

Figure 3.9: Comparison of the resonant cavity transmission to the expected transmission of a cavity coupled to an inhomogeneously broadened ensemble, fitting
only for the detuning between the cavity resonance and the ion ensemble, and using
measured or simulated values for coupling rates and cavity linewidth.
and demonstrated resonances from wavelengths of 1240 nm to 1620 nm, as shown
in Figure 3.10. The inset of the figure shows the quality factor for the resonance at
at 1270 nm is 21,000 at room temperature, which is likely limited by absorption in
the amorphous silicon hydride. The resonances below 1240 are not detected due
to a decrease in the grating coupler efficiency, as the ring itself should still support
higher order modes at shorter wavelengths. No resonances above 1620 are detected
due to the low quantum efficiency of the spectrometer camera used.
Figure 3.10 also includes transmission spectra of amorphous silicon hydride
rings on Nd:YSO that have been scaled in all dimensions by a factor of (883 nm
/ 1536 nm) to be resonant with the 4 I9/2 to 4 F3/2 transition in neodymium. Lowresolution scans show modes of a ring spanning 40 nm. High resolution scans show
multiple resonances near the transition wavelength for different sized rings. One of
the resonances is shown fitted by a Lorentzian with a linewidth of 65.0 pm, which
corresponds to a quality factor of 14,000. This is approximately a factor of 5 lower
than the room temperature quality factor of the rings on Er:YSO, and likely results
from absorption. Cooling the device to lower temperatures should mitigate this
loss, as was observed in the ring on Er:YSO. However, at this point in time, silicon
hydride rings did now offer sufficient advantages to switch from existing triangular
nanobeams in Nd:YSO.

51

Transmission (arb)

1269.6

1250

1300

1350

1269.8

1270

1500
1400
1450
Wavelength (nm)

1550

1600

Transmission (arb)

Q=21,000

880

870

890
Wavelength (nm)

Transmission (arb)

882

900

910

Q=14,000
887.4

884

886

888
890
Wavelength (nm)

892

887.7

888

894

Figure 3.10: Spectra demonstrating low losses in amorphous silicon hydride across
the near infrared at room temperature. The top plot shows a broad spectrum transmission of the ring described in Sections 3.2 to 3.4, demonstrating resonances from
wavelengths of 1240 nm to 1620 nm. The sawtooth background noise is an artifact
from the stitching together of multiple spectra. The middle plot shows a broadband
spectrum of a scaled ring on Nd:YSO for coupling to the 883 nm transition in Nd
shows multiple resonances, while the bottom plot shows spectra of three different
rings of slightly different sizes. Resonances outlined in green were fitted with a
Lorentzian to determine quality factor.

52
Chapter 4

OPTICAL MANIPULATION OF ERBIUM IONS

This chapter presents progress towards manipulating the state of erbium ensembles
using both cavity architectures previously described. Additionally, a comparison of
the two devices is provided, and the chapter concludes with a discussion of progress
towards manipulating the population in the ground states of the ensemble coupled
to the triangular nanobeam cavities. While the demonstration of Purcell enhanced
decay rates is described in our publications on the nanobeam [70] and ring cavities
[82], later material in the chapter includes unpublished work performed recently.
4.1

Purcell Enhanced Decay Measurement

For both devices, the strength of the coupling between the ensemble and the
cavity was estimated using simulation and verified experimentally using the Purcell
factor. While the same confocal microscope described earlier was used in characterizing both devices, input sources and output detectors were upgraded between
initially measuring the nanobeam and measuring the hybrid rings.
Measuring Photoluminescence
When measuring the resonators, each cavity was tuned through resonance in
steps using nitrogen condensation. At each detuning, the spectrum was measured by
scanning the narrow laser across the cavity linewidth and recording the transmitted
power. For the nanobeam, the output power was recorded on the spectrometer’s
camera as the laser stepped across the cavity linewidth,1 When measuring the ring,
the transmission of a time-resolved frequency scan of the laser was measured on the
InGaAs transimpedance amplified photodetector and multiple scans were integrated
on an oscilloscope. Examples of these were shown previously in Figures 2.7 and
3.8. The capability to average many fast and repeatable scans of the laser resulted
in a reduction of noise for the scans of the ring resonator.
In addition to measuring the transmission spectrum at each step, the ensemble
was resonantly excited with a laser pulse, and the photoluminescence (PL) was
1 Even for the relatively low quality factor nanobeam, the cavity linewidth (FWHM = 135 pm)

was too narrow for the spectrometer’s resolution (46 pm/pixel) using a 600 grooves/mm and SP2750
spectrograph.

53
measured using single photon counters, though different amplitude modulators and
detectors were used when characterizing the two devices. A fiber-coupled electrooptic modulator (EOM) was used to generate 20 ms pulses to excite the nanobeam
ensemble, while 100 µs pulses were generated using a fiber-coupled acousto-optic
modulator (AOM) when measuring the hybrid rings. The output of the nanobeam
was coupled to a multimode fiber and measured using the InGaAs/InP avalanche
photodiode detector (ID Quantique ID220) single-photon counter. The output of the
hybrid rings was coupled into a single-mode fiber with a decrease in the numerical
aperture from the pinhole to the fiber to reduce spurious interference patterns arising
from different points on the non-negligible area of the grating coupler. This fiber
conveyed the signal to a WSi SNSPD in a shielded mu-metal box on the 400 mK
plate of a BlueFors helium-3 refrigerator. The optical connections and components
inside the refrigerator are further discussed in Section 4.3
For the ring resonator, the frequency of the maximum of the cavity transmission
was measured on a Burleigh WA-1600 wavemeter. This was used in tandem with
the EOM calibration described in Section 3.4 to accurately determine the frequency
axis of transmission scans. Additionally, the wavemeter was used to accurately tune
the laser in order to measure PL at three frequencies, spaced by approximately a GHz
in the inhomogeneous line. Detuning frequency for the nanobeam was determined
using the internal calibration of the laser, which was sufficiently accurate, given the
cavity’s large linewidth.
Figure 4.1 shows a plot comparing bulk photoluminescence emission to emission from ions while the cavity is resonant with the ion transition frequency for
the nanobeam. The figure also includes a comparison between emission from an
ensemble coupled to the hybrid ring cavity and an ensemble only coupled to a
waveguide. Because the local density of optical states is modified by the waveguide,
it is worth noting that the effect is too weak to observe a Purcell-enhanced decay
rate in the waveguide; the lifetime in the waveguide was fit as 11.4 ms, which agrees
closely to the value reported in the literature, and is consistent with the 10.8 ms ms
lifetime measured in bulk. The difference between fitted lifetimes in bulk and the
waveguide can be accounted for by noise in the measurement, error in the fitting,
and variation in the sample.2 Before quantifying and discussing the enhancement
of the decay rate for the ions coupled to the nanobeam and microring, we discuss
the expected shape of the photoluminescence curve, determined by simulation.
2 Note that the shorter, fitted lifetime of 10.8 ms in bulk listed in [70] results from fitting past the

Normalized PL (counts)

54

0.1

0.01

Bulk

0.1

Nanobeam

Waveguide

15
Time (ms)

30

0.01

Microring

15
Time (ms)

30

Figure 4.1: Purcell-enhanced decay in each of the cavities, with a comparison
between the nanobeam and bulk PL, and between the ring and the waveguide,
measured while the cavity was detuned. The lifetime of bulk and waveguide were
fit by single exponentials with lifetimes 10.8 and 11.4 ms, which are consistent with
measurements in the literature [32].
Simulating Photoluminescence
The emission of a photon for an excited ion is a Poisson process (continuous,
independent, and with constant probability in time), and so the photoluminescence
curve generated by histogramming the emission times should produce an exponential
curve. However, different ions couple with different strength to the cavity, due to
the inhomogeneity in the cavity field across the ions, included quantitatively as
2
E(®
r)
in Equations 1.4 and 1.11. This results in a distribution of Purcell
max(E(®
r ))
enhanced decay rates for different ions. Using the simulated field profile of the
2
E(®
r)
cavity mode, we can calculate the value of max(E(®r )) as a function of location
within the resonator. The nonuniformity in coupling across the ensemble is shown
in Figure 4.2, which illustrates the fraction of ions as a function of electric field,
electric field intensity (the aforementioned, squared quantity), and the electric field
intensity weighted by the contribution to Ω at the location of the ion for each of the
two resonators. Though it’s not immediately clear from the log scale, due to the
large number of ions weakly coupled to the ring resonator, the total cooperativity
rates are very similar between the two cavities, though the total coupling rate for the
beam is approximately three times higher.
Additionally, we can use the field profile to calculate the expected lifetime for
ions at any simulated voxel in the resonator. Summing the contributions of the
various ions, weighted by their individual probabilities of emitting into the cavity
initial, linear portion of the decay curve, which includes additional effects.

55

1010

beam
ring

Number of ions

108
106
104
102

1010

0.1

0.2

0.3

0.4

0.5

0.6

0.7

0.8

0.9

0.1

0.2

0.3

0.4

0.5

0.6

0.7

0.8

0.9

0.1

0.2

0.3

0.4

0.5

0.6

0.7

0.8

0.9

Number of ions

108
106
104
102

Contribution to Ω

105

)2

104
103

Figure 4.2: Histograms showing the number of ions as a function of coupling
strength for each of the two resonators. The bin size is approximately 0.01, which
corresponds to a 1% difference in E(®
r )2 . The granularity in the curves result from
finite resolution in the simulation results. Note that the maximum value for the rings
is approximately 0.75, while the nanobeam maximum value is 1, since the field
maximum occurs in the YSO.
mode we can construct a predicted excitation decay rate curve for the ensemble as
a whole, as a function of detuning between the cavity and the ensemble resonance.
The expected photoluminescence intensity as a function of time for a continuous
range of detunings can be computed from this, and is shown is Figure 4.3. Though
the images appear similar, the scales of the ordinates differ by nearly an order of
magnitude because of the factor of 10 increase between nanobeam and ring quality
factors. Also, the higher total coupling rate Ω of the nanobeam results in faster

56
decay overall, which manifests as a general shift of the PL decay to slightly shorter
times.
Nanobeam

-300
-200

Detuning (GHz)

-100

1.0

100

0.8

200
300

0.4

Hybrid Ring

-50

Detuning (GHz)

0.6
0.2

-25

25
50

Time (ms)

Figure 4.3: Simulated photoluminescence intensity as a function of time for various
detunings. Note that the order of magnitude difference in cavity linewidth is reflected
in the relevant scale of the detuning.

Fitting Photoluminescence
Alternatively, approximating the ensemble PL curve with a single exponential
decay lifetime is useful when describing the modification of the system dynamics,
like the improved spectral hole burning described in Section 1.3. To justify this, we
compare and find good agreement between the measured PL from the cavity a single
exponential fit to the data in Figure 4.4 for both the nanobeam and the ring resonator,
where the single exponential was fit for lifetime, amplitude, and background. We
also include a curve showing the simulated photoluminescence intensity, fit only
for amplitude and background. The disagreement between simulated PL and the
measured nanobeam data may result from the fabrication imperfections between the
simulated and the measured device, as the simulated version perfect 60◦ and right

57
angles, while angles of the fabricated version were limited by the nonzero focal spot
of the gallium beam.
Nanobeam

Photoluminescence (counts)

103

700

data
simulated decay
single exp

600
500

102

10

Hybrid Ring

400

Time (ms)

10

12

3000

Time (ms)

10

Figure 4.4: Photoluminescence intensity data for an ensemble coupled to a resonant
cavity, compared to both the simulated PL curve fitted for amplitude and background,
and a single exponential decay, fit for lifetime, amplitude, and background.
We aim to predict the lifetime generated from the single exponential fit by first
logically extending Equation 2.3 for the total coupling rate, Ω, to an average of the
coupling rate across an ensemble non-uniformly coupled to a cavity as
2
2 gion (®
r)
ρ dV
E (®
r)

YSO z
geff
(4.1)


dV
YSO z
where ρ = 1.87 × 106 µm−3 is the ion density per unit volume for 200 ppm Er:YSO
and the contribution of gion for each ion has been weighted by the proportion of
the mode energy density at the ion, Ez (®
r ) . For the ring resonator, we calculate
geff
2π = 0.211 MHz, while for the beam, we find this value to be 1.33 MHz. Using this
value and Equation 1.11, we can compute the average effective Purcell factor at zero
detuning to be 6.26 for the ring, and 5.20 for the beam. Additionally, we can calculate
the effective Purcell factor as a function of detuning, and compare to the lifetime for a
single exponential fit of PL decay curves measured at various detunings. The single
exponential lifetime prediction and fit as a function of detuning between cavity and
ensemble is shown in Figure 4.5. The data points taken on for the nanobeam do
not span the detuning curve enough to capture the gradual transition of the single
exponential lifetime to reach that of bulk because the number of ions in the cavity is
low enough that achieving a high signal-to-noise ratio on the photoluminescence is
difficult without the cavity enhanced absorption and collection described in section

58
1.4. We also note that the lifetime of the transition over a detuning range far greater
than the cavity linewidth. Quantitatively, therhalf width at half maximum of the
 2
lifetime vs. detuning curve is approximately κ FP ggeff0 + 1.
12

Single Exponential
Lifetime Fit (ms)

10

Nanobeam

10

Hybrid Ring

12

-60 -40 -20 0 20 40 60
Detuning (GHz)

-15

-10

single exp. fits
sim. eff. lifetime

10
-5
Detuning (GHz)

15

Figure 4.5: Effective Purcell factor as a function of detuning between the ion ensemble and the cavity. We compare the theoretical effective lifetime generated using
measured cavity parameters and simulated mode profile with single exponential
decay fittings from experimentally measured photoluminescence curves (in green
both here and in Figure 4.4.
4.2

Comparison of Nanobeam and Hybrid Microring devices

While both devices accomplish the common goal of coupling an ensemble
of erbium ions to a low-loss, microscale optical cavity, differences are numerous
enough that a comparison and summary of relevant parameters is included below.
Following this, we continue with a discussion of fabrication limitations on extending
the devices, as well as comparing the efficiency and ease with which we can couple
to the devices efficiently.
Devices Architecture Quantitative Summary and Comparison
A summary of the quantitative comparison of the two device architectures is
presented in Table 4.1. Note that, though the effective Purcell factor and the cooperativity are relatively similar for the two architectures, this is due to an accumulation
of happenstances and is not due to some fundamental limit set by coupling to an erbium ion ensemble in YSO. For example, new nanobeams fabricated more recently
demonstrate quality factors which are higher by a factor of two, and should thus
demonstrate a factor of two improvement in the cooperativity.
2 /κ∆ = Qg 2 /∆,
Because gtot ∝ N/Vmode , the cooperativity, which scales as gtot
tot

59
Parameter
Highest measured quality factor
Mode volume (µm3 )
Maximum Purcell factor
Effective Purcell factor
Effective Coupling rate, geff (MHz)
Total coupling rate, Ω (GHz)
Cooperativity
One-way coupler efficiency

Nanobeam
70,000
1.05
517
7.0 (5.20)
0.211
1.35 (1.60)
0.48
∼ 20%

Hybrid Ring
112,000
2.93
285
6.6 (6.25)
1.33
0.537
0.54
∼ 2%

Table 4.1: Maximum values fitted from measurements and (simulated) for various
parameters for the two optical resonator designs.Though the highest measured quality factor for the nanobeam is 25,000, all other parameters and measurements to this
point were performed using an earlier beam with Q=11,400.

is dependent on the quality factor and the quantity (N/Vmode ), which is very nearly
the ion concentration ρ. As a result, a slightly higher cooperativity was achieved
by the larger ring resonators, despite a lower geff due to the resonator’s evanescent
coupling, due to the increased quality factor, and because the large mode volume
did not weaken the ensemble coupling rate. The coupler efficiency is included for
because other concerns beyond individual device specifications must be considered
to create scalable optical quantum memories.
Limits on Implementing Optical Quantum Memory Devices
An on-chip optical quantum memory would ideally be able to efficiently store
large number of qubits with high fidelity for long storage times. The goal of
storing many qubits requires scalability of fabrication. Additionally, temperaturedependent electron state dynamics require lower temperatures than those accessible
in the continuous flow cryostat used in the above experiments, and engineering
constraints place additional requirements on input and output coupler efficiency.
These two concerns are discussed sequentially.
Fabrication methodologies continue to improve, but there are stark differences
in scalability between the two devices. While far more susceptible to variations in
manufacturing due to the manual nature of the FIB milling, the art and science of
low-loss nanobeam fabrication has been steadily improving in the group, both in
consistency between beams as well as quality factor of completed devices. Recent
devices fabricated by Jake Rochman show quality factors up to 70,000 in YSO,
and quality factors of up to 50,000 have been achieved in YVO. These high loaded

60
quality factors were achieved by improving fabrication processes, further optimizing
the design, and decreasing the input coupling rate κc . While these measurements
place a lower bound on the intrinsic quality factor, Equation 1.8 shows that κc must
be equal to the absorption rate of the ions to maximize the echo efficiency, and
both must be much greater than κi ; this means the loaded Q must be intentionally
degraded by increasing κc . After doing so, it becomes difficult to determine Qi
easily from measurements of the much smaller Q l and, because of the serial nature
of the fabrication, it is difficult to guarantee consistent values of Qi across multiple
devices.
Additionally, there is an inherent difficulty in accurately milling structures that
are more than about twice the length of the nanobeam resonators. To do so entails
either aligning features larger than the scan-size of the FIB system at high magnification, or the accurate fabrication of devices at low magnification. As a result,
fabricating waveguides to couple milled cavities to on-chip sources, detectors, or
each other is daunting. By comparison, electron beam lithography and dry etching
used in the fabrication of the hybrid resonators allows trivial extension of the demonstrated fabrication process to generate chip-scale waveguides coupling an arbitrary
number of resonators, with straightforward extension to include on-chip detection.
However, implementing on-chip sources is formidable, and thus efficient coupling
of off-chip sources to the devices is paramount.
As stated in Section 1.3, spin state lifetimes in Er:YSO are only around a factor
of 10 longer than the lifetime of the optical exited state (the lowest 4 I13/2 state),
depending on magnetic field strength and orientation, which results in poor state
initialization. Cooling below ≈ 3 K can extend the spin lifetime to the point where
population can accumulate in auxiliary ground states [49], which involved the use
of a helium-3 refrigerator. Engineering constraints, which will be described in
the following section, required that the device be measured in reflection from free
space. As a result, the efficiency of the optical coupling is an important parameter
to compare between the two devices.
The efficiency of the nanobeams’ trench-end coupler was measured to be approximately 20% [92], and was high enough that coupling to the cavity in reflection
using a single port could be performed with sufficient signal to noise. The largest
contribution to the noise was the Fresnel reflection of 8% of the incident power off
of the top surface of the YSO, which was lower than the 4% round-trip coupling
efficiency because the Fresnel reflection inefficiently coupled back into the single

61
mode input fiber. The efficiency of the rings’ grating couplers, however, was measured to be a much lower value, at 0.04-0.05% round trip, which comes out to ≈ 2%
for each grating. Because of the low coupling efficiency, measurement of the hybrid
devices required two different grating couplers to collect transmission through the
ring. This could be remedied using a substantially more complex fabrication procedure to create a mode-matched waveguide for coupling with a lensed fiber or a
self-aligning fiber coupler [93, 94], where single-pass efficiencies of 34.7% [95] and
86% [96] have been demonstrated in experimental systems. However, low efficiency
at present prohibited single port measurement, which precluded easily measuring
the devices in the 3 He fridge with a single stack of nanopositioners. As a result, all
further measurements were performed on triangular nanobeam devices.
4.3

Beyond a Two Level System

Temperatures lower than the 4 K boiling point of liquid helium, required for
extending spin lifetimes to experimentally relevant timescales, were accessed using
a BlueFors BF-LD250 system, which used a pure helium-3 cycle on the “still plate”
to reach ∼500 mK.3 The system is a dry fridge, using pulse tubes to cool a still plate
where helium-3 is compressed and condensed, and gaseous helium-3 is pumped out
to be recompressed again. The still plate is mounted to and in weak thermal contact
with a plate at ≈ 4 K, which is similarly mounted to another plate at ≈ 45 K, which is
mounted to the top plate of the system at room temperature. The underside of each
plate is enclosed by a radiation shield, and all cooled components in the system are
enclosed in a vacuum chamber consisting of a cylinder attached to the top plate.
Device Coupling in the Helium-3 Fridge
The samples with milled nanobeam devices were indium-soldered to a custommachined sample mount, screwed onto an xyz Attocube stack (ANP101/RES) which
was mounted on a custom machined U-shaped component screwed into the underside of the still plate. A copper braid provided thermal connectivity between the
sample mount and the still plate. Photographs of the sample mount and optics are
shown in Figure 4.6. All custom components were machined from oxygen-free high
thermal conductivity (OFHC) copper and most were gold-plated to improve thermal
conductivity by optimizing hot electron transport across the interfaces.
Optical access to the vacuum chamber in the telecom C band was achieved using
3 The unit was purchased without a mixing chamber or the turbo pump required to implement a

full dilution refrigerator, but with the capability to add the necessary components in the future.

62

45 K
Plate

Magnet
Mount

Tuning
Line

Aspheric Doublet
4 K Plate

Tuning Line
Heat Shield

Tuning
Outlet

Mu-Metal
Box with
WSi SNSPD

Still Plate
400 mK
Sample Mount

Sample Mount

Tuning
Outlet

Tuning Gas Inlet
(external)

attocube Stack

Figure 4.6: Sample mount and optics for coupling to devices withing the Bluefors
fridge. The 45 K, 4 K, and 400 mK plates are labeled in red. The mu-metal box
housing the SNSPD and the 1/4” stainless steel tube used for gas-condensation
tuning are also indicated. On the right, three images show different angles of the
sample mount on top of the attocube stack, sitting on the ‘U’ mount attached to the
bottom of the 400 mK plate. The magnet on the near side has been removed from
the mount to allow viewing of the sample through the mount.
single-mode optical fibers (SMF-28e). The fibers were FC/APC connectorized on
one end and plugged into mounted fiber connectors on the front panel of a lighttight break-out box. The other end of the fiber was guided out of the box, through
vacuum bellows and a hole in a KF-40 flange; the latter was sealed with epoxy
(Loctite STYCAST 2850FT) and the flange was attached to a vacuum feedthrough
on the top plate of the fridge. Though the fiber is at atmospheric pressure within
the box and bellows, vacuum hardware is used to provide a light-tight environment.
The break-out box and epoxy-sealed feed-through are shown in Figure 4.7.
Inside the fridge, a bare fiber end was cleaved and spliced to an FC/APC connectorized fiber which was plugged into a free-space coupler and aligned to an

63

Figure 4.7: Optical access to the Bluefors fridge is achieved using optical fiber. The
image on the left shows the breakout box with connectorized access to 42 fibers,
including single mode and multimode fibers with transparency windows including
880 nm, 980 nm, and 1550 nm. The fibers leave the box through the tube in the
top, through a bellows and through a drilled hole in a blank KF-40 flange. The KF
flange and epoxy-sealed hole are shown on the right, viewed from the inside of the
vacuum chamber.
aspheric doublet, both of which were mounted in a commercially available 16 mm
cage optomechanical system. The posts from this cage system were mounted into
custom machined mounting components, mounted to the still plate of the fridge. On
top of the still plate, another of the fibers passing through the epoxy-sealed vacuum
feed-through was similarly spliced and connected to a self-aligning WSi nanowire
taper SNSPD inside a mu-metal box, which can also be seen in Figure 4.6. The
detectors were fabricated by Matt Shaw and his group at JPL [90].
Optical coupling between the fiber and the devices was accomplished performing coarse alignment when mounting and fine alignment using the attocube stack.
Spacing between the sample and the devices was initially set adjusting the cage
mount, before using the attocube z positioner to maximize the reflected signal.
Prior to mounting the sample, the position of the devices was determined relative
to a corner of the sample using the confocal microscope. A map of the sample
was then generated using the attocube x and y positioners. Scanning was typically
performed at or above 4 K, before running the helium-3 condensation cycle, as
attocube responsivity and repeatability was low at ∼ 400 mK. An example image
of the beams generated by this scan is shown in Figure 4.8. Finally, coupling was
achieved and optimized by manually rastering the positioners in the vicinity of the
coupling trench while observing the collected reflection on the spectrometer and
watching for the characteristic spectral feature of the cavity.

64

2650
position [μm]

500

power [μW]

2700

400

2690

2750
2050

3156
3160
3164
position [μm]

2100
2150
position [μm]

2200

position [μm]

2695
2700
2705
2090

2095

2100

2105
2110
position [μm]

2115

2120

Figure 4.8: The reflected power as a function of the z position of the attocube is
shown on the left, with a clear maximum indicating the light is focused on the top
surface. A coarse scan of 12 devices is shown on the right, and a fine scan is shown
on the bottom. The black artifacts on the right side of the two scans results from
inconsistent distanced traversed by the x attocube in the given number of steps.
The optical system used to characterize the sample is shown in Figure 4.9. Samples were optical characterized using only fiber components, and a fiber circulator
was used to separate input light from output light. The input light was amplitude
modulated by an AOM and frequency modulated by the laser, and the output was
sent to either the spectrometer, fast photodetector, or back into the fridge to the WSi
SNSPD by manually disconnecting and reconnecting fibers. Additionally, the output could be amplitude modulated using an EOM (or later, a second AOM) to avoid
sending too much light to the SNSPD. The apparatus allows light to be coupled to

65
and from the devices, analogous to the capability of the confocal microscope, except
exclusively one optical mode is measured, limited by the single mode fiber.
Laser

AOM

Function Generator

Timing Module

PC

Doublet
Sample
attocube

APD
EOM

SNSPD

Spectrometer

400 mK
He Fridge

Figure 4.9: The fiber optic system used to characterize the devices in the fridge at
400 mK, illustrating input frequency control with the laser’s internal piezo control,
amplitude control with the AOM, and polarization control (PC), as well as the
various detectors which can be selected by disconnected and reconnecting fiber.
Additionally, mounts were machined and mounted to the still plate to hold two 1”
diameter cylindrical magnets on either side of the sample to apply a static magnetic
field. By choosing different sized magnets and adjusting the spacing of the magnets,
the applied field could be changed continuously from 5 to 120 mT while the fridge
was vented. The magnet mounts and magnets are also visible in Figure 4.6.
Cavity-Enhanced Absorption Tailoring
With this system constructed, we were able to burn and probe spectral holes in
the devices in Er:YSO using the lowest doublets of the 4 I15/2 and 4 I13/2 manifolds.
As described in Section 1.2 and 1.3, the lifetime and branching ratio of the optical
excited state depend on magnetic field strength and orientation. For measurements
on this beam, we used a magnetic field of 60 mT applied at angle of 120◦ from
D1 toward D2 . According to measurements in the literature [97, 47], an angle of
approximately 100◦ or 135◦ will maximize the hole burning depth, likely differing
due to the strength of the applied field and erbium concentration.
To allow gas tuning of the nanobeam cavities inside the fridge, a 1/4” stainless
steel tube conveyed nitrogen gas from the top, room temperature plate of the fridge
down to the sample. The tube was thermally and mechanically connected at the
45K plate of the fridge, and surrounded by a stainless steel tube thermally and
mechanically mounted to the 4 K plate, acting has a heat shield. The tuning line
itself can be seen in Figure 4.6. A tuning curve illustrating the resonance of the

66

scan 3
scan 12

Transitions

Ste

-4

Detuning (GHz)

12

Tu
nin

-5 0 5 10
Detuning (GHz)

10
15
20
25

ps

Reflection (arb)

Reflection (arb)

device moving across the two spin-preserving transitions (ω2 and ω3 in Figure 1.6)
can be seen in Figure 4.10; the two cross-transitions are too weak to be visible in the
plot, unlike in the schematic illustration, Figure 1.6. The spin-preserving transitions
appear to change from a peak to a dip as the cavity is tuned, due to a predicted
Fano interference between the light in the cavity and the ensemble described well
by Equation 2.1 and 2.2 from [80].

Figure 4.10: Reflection amplitude off the trench-end coupler of the resonator as the
resonator is tuned through the optical transition of the erbium ions. The plot on
the left shows two scans of the cavity illustrating the two narrow spectral features
corresponding to the spin-preserving transitions of the erbium. Scans are separated
vertically for clarity. A surface constructed of scans along multiple tuning steps is
shown on the right. The transitions appears to change from a dip in the foreground
to a peak on the far side as the cavity resonance passes due to an interference effect.

Spectral hole burning was demonstrated in the cavity-coupled ensemble by
leaving the laser at one frequency, then reducing the intensity and scanning across
the transition while recording the intensity. Due to the small size of the ensemble
and fairly high cooperativity, it was overly arduous to obtain a scan of the full
ensemble without saturating the transition or having a signal indistinguishable from
noise. Locally, the hole could be observed, but a baseline for absorption, and hence
accurate measurement of the hole depth and the initialization efficiency could not
be measured.
By burning at multiple frequencies, population can be driven from different
points in the inhomogeneous line to create a spectral structure in the ensemble. The
experimental parameters were varied to optimize hole depth for this two-toothed

67
comb: 75 repetitions of 500 µs burn pulses at three separate frequencies approximately 14 MHz apart, with 500 µs between burn pulses to tune the laser were used
to define the teeth. The resulting atomic frequency comb in the nanobeam cavity
is shown in Figure 4.11. Unfortunately, the aforementioned saturation problem precluded an accurate determination of the comb contrast. The deepest spectral holes
that we could burn in bulk yielded holes that reduced the total optical depth by 5%.
As the hole burning should be enhanced by the cavity, we can use the bulk efficiency
as a conservative estimate for the hole burning efficiency measured in bulk. If we
additionally assume that 30% of the cavity loss is coupled to the input channel,
Equation 1.8 predicts that the echo efficiency from this AFC would be less than 0.1
% efficient, which was below the noise floor of the measurement. The dominant
term handicapping the efficiency was the absorbing background due to poor hole
burning. However, a promising method of improving hole burning efficiency and
echo efficiency will be discussed in the remainder of the thesis.

Reflection (cps)

0.52
0.5
data
rolling average

0.48
-60

-40

-20

Detuning (MHz)

20

40

60

Figure 4.11: Reflection scan of an atomic frequency comb burned into the ground
state of the ensemble inside the nanobeam cavity. The blue line illustrates a rolling
average of 7 points. Due to low count rates, this reflection spectrum required an
integration time of 8 hours.
4.4

Photon Echoes

Additionally, we were also able to probe the coherence of the optical transition
for the erbium ensemble in the nanobeam using two pulse photon echoes. Figure
4.12 shows three echoes, with pulse delays of 440 ns, 1.3 µs, and 3 µs. The
high intensity of the π/2 and π pulses required for the echo resulted in latching
of the detectors. From the shape of the coherence decay curve, also shown in

68
Figure 4.12, we can extrapolate a decay constant of 800 ns. Because the pulse
spacing is half the dephasing time, and the echo height is proportional to amplitude
while T2 describes the decay of the wavefunction (and is thus a field, not intensity
parameter), this decay constant corresponds to a T2 of 3.2 µs. The oscillation on the
exponential decay of the lifetime curve is believed to be the result of superhyperfine
interaction between the net electron spin of the erbium ions and the nuclear spin
of the yttrium ions, since the period of the sinusoidal oscillation has a period of
approximately 0.6 MHz, which is fairly consistent the strength of the superhyperfine
interaction predicted and measured in the literature [98]; any discrepancy can likely
be accounted for error arising from measuring only approximately one oscillation
of the sinusoidal variation.

Cavity Reflection (kcounts)

π/2 pulse

π pulses

103

102

echoes

Echo Height (counts)

Time (μs)

10

Pulse Spacing (μs)

Figure 4.12: Measured echo intensity measured from the triangular nanobeam in
reflection. The distortion of the π/2 and π pulses is the result of saturation.
For the nanobeams in Nd:YSO, the coherence time was measured in both the
nanobeam and bulk, and it was determined that the coherence time was not degraded
by the fabrication process itself. We were unable to measure photon echoes when
reflecting off the back side of the bulk Er:YSO sample due to high absorption; the 500
micron thickness exhibited an optical density of approximately 5, and due to k-vector
matching, the echo, reemitted in the forward direction, would be strongly attenuated
by ions not excited by the driving pulses. However, the coherence time measured in
the beam is consistent with the measured values presented in the literature [33] for
the same concentration at higher temperatures and higher magnetic fields.

69
Chapter 5

ERBIUM-167 AND FUTURE DIRECTIONS

In this chapter, I discuss very recent progress and future directions. I discuss
the prospects of using isotopically pure 167 Er:YSO for telecom C band quantum
memories. Specifically, we motivate the use of the hyperfine levels of erbium167 in high magnetic fields, present the results of bulk hole burning and atomic
frequency comb preparation, and present future directions combining the previous
devices with hyperfine structure of erbium-167.
5.1

Hyperfine Structure

In order to implement long-term spin-wave storage using an AFC protocol, one
optical excited state and three metastable ground states are required. As discussed
in Section 1.3, the population is moved via spectral hole burning from the ground
state of the optical transition to a storage state; after the write pulse is absorbed by
the comb, the resulting excitation on the optical transition is shifted to an excitation
between the ground state and an auxiliary ground state using light at a different
frequency. While using the hyperfine levels of erbium-167, the only erbium isotope
with nonzero nuclear spin, has always been a long-term consideration, implementation of any protocol on the levels is difficult due to the large number of ground and
excited hyperfine levels.
For low and moderate applied magnetic fields, the 16 ground and excited states
exhibit 256 optical transitions that are unresolvable when scanning the inhomogeneous line. Nonetheless, work has been done to identify lambda-like systems
(where two metastable ground states share an excited state) in 167 Er:YSO that were
used to demonstrate electromagnetically induced transparency [52]. Additionally,
microwave resonators have been used to directly excite the hyperfine transitions
in 167 Er:YSO to more accurately determine the spin Hamiltonian parameters [99].
Lastly, and perhaps most importantly to the task of producing scalable telecom optical quantum memories, one effort probed a bulk 167 Er:YSO sample under very high
magnetic fields, separating spin flip levels to be much larger than the peak in the
phonon occupation spectrum, which provided three important results [41]. Firstly,
it was found that optical pumping of the ensemble could achieve very long-lived
(∼10 minute decay constant) and highly efficient state initialization. Secondly, ini-

70
tialization of the population in a single hyperfine ground state reduced the number
of active transitions and allowed the remaining transitions to be spectrally resolved.
Lastly, the coherence time between hyperfine transitions was shown to be greater
than a second at 1.4 K. For comparison, one second is long enough for signals in an
optical fiber to circumnavigate the globe over five times, and thus sufficiently long
storage time to implement quantum repeater protocols for a global optical network.
However, our experimental apparatus is, as yet, unable to reach magnetic fields of
this magnitude. As hyperfine coherence time was found to possess a local maximum
at lower magnetic field, until reaching a field of over 2 T, yielding a splitting of
approximately 500 GHz, our initial exploratory work included here was performed
with a 60 mT field applied along the D2 axis. This work includes a demonstration of
hole burning with substantially higher state initialization efficiency than the erbium
dopant ensembles with natural isotopic abundance, as well as the burning of atomic
frequency combs and the measurement of atomic frequency comb echoes.
5.2

Hyperfine Level Hole Burning

A bulk sample of 167 Er:YSO was indium-soldered onto the attocube sample
mount shown in Figure 4.6 and characterized using the fiber optic system illustrated
in Figure 4.9. The sample, obtained from Scientific Materials, was doped with 50
ppm 167 Er and measured 1.0 mm x 1.5 mm x 1.5 mm in the D1 , D2 , and b directions,
respectively. Light coupled from the fiber and aspheric doublet above the sample
mount propagated along the D1 axis and was focused on the back side of the sample.
The incident light was polarized parallel to the D2 axis using polarization paddles
to maximize absorption.
A location in the inhomogeneous line was identified which exhibited particularly
efficient hole burning. A set of three holes were burned stepping between the
three burning frequencies, waiting 100 ms, and then scanning the inhomogeneous
absorption line. The holes are shown in Figure 5.1, and reach a depth of 0.2 OD from
a maximum of 0.6. From this, we can conclude that two thirds of the equilibrium
population has been moved to and remains in other hyperfine states.
5.3

Atomic Frequency Combs

Two methods were implemented in our attempts to create atomic frequency
combs and measure AFC echoes. The first method involves using pairs of short
pulses generate a comb in frequency space. The second method entails alternating
between burning trenches to define a tooth and manually tuning the laser between

71

0.8

Optical Density

0.6

0.4

0.2

-4

-3

-2

-1

Detuning (GHz)

Figure 5.1: Absorption measurement of the inhomogeneous spectrum of bulk
167 Er:YSO with three spectral holes. Numerous anti-holes and side-holes can be
identified by the presence of three peaks or dips. The actual data points are shown to
emphasize the low density of points, while the line between points aids in identifying
the narrow spectral features.
stops. Greater success was achieved using the latter method, but progress implementing both procedures is presented.
Accumulated AFCs
Accumulated atomic frequency combs are formed using pairs of laser pulses to
excite ions according to a sinusoidal distribution in frequency. This relation follows
directly from the Fourier transform of two pulse pairs, namely
Intensity(ω) ∝ F rect(t/a) ∗ (δ(t − t0 ) + δ(t + t0 )
(5.1)
= F rect(t/a) · F (δ(t − t0 ) + δ(t + t0 )
(5.2)
r !
sinc(aω/2) · cos (ωt0 ) ,
(5.3)
= a
which is precisely a sinusoidal intensity variation on a sinc envelope. It’s worth
noting that the period depends on the spacing between the pulses and the width of
the sinc is inversely proportional to the width of the individual pulses.

72
When burning accumulated combs, it is possible to use multiple pairs of pulses,
in order to excite more ions and deepen the comb contrast, provided the spacing
between pulse pairs exceeds the coherence time of the optical transition. In this
manner, 1000 pairs of 40 ns pulses were used with 100 ns between pulses to
generate the first comb depicted in Figure 5.2. The second comb was generated
using 4000 pairs of 20 ns pulses spaced by 220 ns.
1.0
Reflection (arb)

data
theory

0.5

Reflection (arb)

1.0

0.5

-60

-40

-20

20
Frequency (MHz)

40

60

Figure 5.2: Measured and simulated atomic frequency combs in 167 Er:YSO, generated using a train of pulse pairs. The upper comb was generated with 40 ns pulses
100 ns apart, while the lower comb was generated with 20 ns pulses spaced 220 ns
apart. The lower comb was best fit assuming 32 ns pulses.
There’s a noticeable asymmetry across the two sides of the comb, arising solely
as an artifact of the scan direction. In addition to the data, we show the predicted
curve generated by computing the Fourier transform of the input pulses. Because
the rise time required to generate 20 ns pulses is past the bandwidth limit of the
AOM used to generate the pulses, the lower comb is better modeled by 32 ns pulses.
Additionally the envelope of the comb deviates from the sinc due to the imperfect
rectangular shape of the pulses themselves.

73
A large comb bandwidth is ideal; however, a minimum of two teeth are required
to obtain an echo. Additionally, there is a limit on the width of an individual AFC
comb tooth, resulting from the homogeneous linewidth and spectral diffusion of
the erbium ions. Unfortunately, due to the characteristic size of holes that can be
burned, even this weak constraint of two teeth creates a requirement on the width
of the individual pulses that can be used when driving the optical transition. These
narrow pulses contain a very low optical power, and as a result, many pulse pairs
must be used. However, given requirements on the separation of pairs, increasing
the number of pulses approaches an asymptotic limit and does not yield arbitrarily
efficient hole burning. The inefficient hole burning is apparent when observing
the absorbing background between the teeth of the comb. Due to this background,
and the variation in tooth height across the comb, we were unable to measure AFC
echoes using this comb.
Piecewise-defined AFCs and Echoes
More success was achieved in burning piecewise-defined combs, as shown in
Figure 5.3. To generate this feature, 2 ms burn pulses were spaced by 500 µs, during
which the laser was tuned 5.6 MHz using the internal piezo-mounted grating. The
pattern was reinforced 25 times with 500 µs between repetitions and a 10 ms wait
before scanning the comb. We observe that the maximum optical depth of the comb
is d = 0.38 OD, the absorbing background is approximately d0 = 0.18 OD, and the
finesse is approximately F = 2. The efficiency of an AFC echo is given by
 2
exp − − 2 − d0 ,
η=
F F

(5.4)

derived by Afzelius, et al. in [59]. Using this, we can calculate the expected
efficiency for an AFC echo from this comb to be 0.4%.
Using this comb, we were also able to measure AFC echoes in bulk 167 Er:YSO,
shown in Figure 5.4. For comparison, the echo is also shown from a comb with
teeth spaced 5.6 MHz, using the same pulse parameters. The measured efficiencies
for the shown echoes are estimated to be 0.17% and 0.22% for the 5.6 MHz and
6.6 MHz combs, respectively. The factor of two difference between expected and
measured efficiency likely results from difficulty estimating the optical density of
the comb itself.
The fabrication of a cavity coupled to these erbium-167 ions should dramatically
improve both the preparation of the comb and the efficiency of the echo. To predict

74
0.5

Optical Density

0.4
0.3
0.2
0.1

-20

-15

-10
-5
Frequency (MHz)

10

15

Figure 5.3: Measured atomic frequency comb in 167 Er:YSO generated by burning
5 holes sequentially to create each of the four teeth. The comb teeth spacing is 6.6
MHz. The optical density axis appears to possess discrete values due to the limited
resolution of the oscilloscope digitization of the linear APD output.
the efficiency of future devices, we assume (κc /κ) = 0.5 and a quality factor of
20,000, which corresponds to an intrinsic quality factor of 40,000.1 Using Equation
1.8 from [100] and neglecting improved comb initialization from the cavity, we can
compute the expected efficiency to be 0.5%, which already more than doubles the
bulk echo efficiency. In a realistically optimistic scenario, we first assume that we
can reproduce the 95% initialization efficiency in the high magnetic field regime
[41]. Then, if we assume a finesse of 5 and (κc /κ) = 0.75, which requires that the
loaded quality factor is one quarter of the intrinsic quality factor and use the highest
measured nanobeam quality factor of 70,000, this gives us a loaded quality factor
of 17,500. Substituting these values into Equation 1.8 gives a predicted efficiency
of 17.6 %. While these are optimistic values, all are based on measured parameters
or existing devices. Furthermore, the Purcell effect would increase the ratio of
excited state lifetime to hyperfine lifetime, improving hole burning efficiency for
cavity-coupled ions.
As AFC echoes have been shown to preserve the complete quantum state of single
photons for quantum teleportation [101], as well as preserving time-bin qubits for
long periods of time by extending to spin-wave storage [102] for other rare earth
ions, this is a substantial step towards on-chip cavity-enhanced quantum storage
1 Using κ = κ + κ and Q = ω /κ, it can be shown for x = (κ /κ), that Q = (1 − x)Q .
tot

75
using erbium.
105

5.6 MHz comb
6.6 MHz comb

Reflection (counts)

104
103
102
-50

50

100

Time (ns)

150

200

250

Figure 5.4: Measured atomic frequency comb echoes from two different combs with
teeth spacings of 5.6 and 6.6 MHz. The associated storage times should thus be 180
and 150 ns, respectively, which approximately match the observed delays.
Accommodating Requirements of High-Q Cavities
To leverage the substantial improvement in hyperfine lifetimes resulting from
high magnetic fields, there are requirements for the cavity that must be considered.
Optical manipulation of the hyperfine spin state requires that the cavity can couple
to both sets of cross transitions that increase or decrease the nuclear spin by 1. At
a magnetic field of 7 T, these transitions are approximately a GHz on either side
of the spin-preserving transition. A 2 Ghz splitting between the ∆mI = -1 and +1
transitions would match the full width at half maximum of a cavity with Q = 98,000.
As a result, working with higher quality-factor cavities at such high fields might
require creative solutions to enable coupling to all three sets of transitions (∆mI
= -1, 0, and +1). Fortunately, it is expected that weaker magnetic fields will also
provide long hyperfine lifetimes and coherence times for lower magnetic fields when
the sample is at sub-Kelvin temperatures.
5.4

Summary and Future Directions

Coupling rare earth ions in rare earth host crystals to nanoscale optical resonators
has been pioneered by the work of the Faraon group [68, 82]. Though prior works
have demonstrated coupling to rare earth ions in other host materials, the use of
magnetically quiet crystalline hosts is necessary to achieve the long coherence

76
times required for applications of quantum light-matter interfaces. Other work
demonstrated mesoscopic optical cavities fabricated using macroscopic machining
tools. However, we have conceived, optimized, and demonstrated two architectures
for optical cavities, each with mode volumes smaller than 3 cubic microns.
For one architecture, we have demonstrated fabrication of triangular nanobeam
cavities with ultra-low mode-volume and highly efficient coupling to free space
modes. For the other, we have demonstrated a simple and highly scalable fabrication method for producing cavities and waveguides on chip for coupling to rare earth
ensembles. We have demonstrated and thoroughly characterized the coupling between each type of optical cavity and a resonant ensemble of erbium ions. Though an
optical quantum memory was not demonstrated, storage of light was achieved using
a photon echo in the nanobeam devices, and spectral tailoring of the cavity-coupled
ensemble was demonstrated.
Additionally, bulk measurements performed in 167 Er:YSO and recent results in
the literature show substantial promise and provide a logical extension of the work
presented in this thesis. Fabrication of a triangular nanobeam cavity in 167 Er:YSO
will enable efficient hole burning in the ensemble at high magnetic fields. Use of
an additional hyperfine level as a shelving state will allow the creation of an atomic
frequency comb with spin-wave storage on a separate hyperfine level to allow storage
of infrared photons for hundreds of milliseconds, while the efficiency of storage and
read-out will be enhanced by the optical cavity.
Fabrication development could allow the implementation of extensions to the
existing devices. Interchanging grating couplers on the hybrid resonators with efficient end-fire couplers would allow the resonators to be tested in the helium-3
fridge at sub-Kelvin temperatures using the existing optics. Furthermore, integrating superconducting nanowire single-photon detectors on chip would substantially
improve detection efficiency and increase scalability. Additionally, incorporating
electrodes for memory protocols based on the Stark effect provide an additional
avenue for implementing on-demand optical quantum memories.
Beyond integration of superconducting detectors and electrodes, fabrication of
high quality factor and low mode-volume superconducting microwave cavities is
the first step toward using erbium-based efficient on-chip optical to microwave
conversion. While optical to microwave conversion is an active field, aiming to
bridge the gap between the developed fields of infrared optical communication and
superconducting microwave qubits, scalable and efficient conversion of quantum bits

77
with high fidelity has yet to be demonstrated. Often an intermediary excitation, like
a phonon is required [103]; however, the hyperfine levels of erbium can circumvent
this requirement, as the ion possesses resonances at both the relevant optical and
microwave frequencies. To achieve efficient conversion, it is necessary that the ions
coupled to the optical cavity are the same ions coupled to the microwave cavity,
which likely also requires spatially defined implantation and annealing of erbium.
Detection and manipulation of a single cavity-coupled ion is ongoing within the
Faraon group and is more likely to be accomplished in Nd:YVO, where the optical
dipole moment is larger and laser stabilization hardware is more developed within
our lab.
Also, ongoing work is being done fabricating amorphous silicon hybrid ring resonators on silicon carbide to couple to ensembles of chromium defects or divacancy
color centers.
Given that the subfield of rare earth nanophotonics is very young, it is even quite
possible that the most important future applications have not yet been proposed or
conceived. I have no doubt that interest in coupling rare earth ions to nanophotonic
systems will continue to grow, due to the remarkable spectral properties of rare earth
ions and the clear benefits of scalable nanofabrication.

78

BIBLIOGRAPHY

[1] Carl Sagan. Cosmos. Cognitive systems monographs. Ballantine Books,
1985. isbn: 9780345331359.
[2] Paul Benioff. “The computer as a physical system: A microscopic quantum
mechanical Hamiltonian model of computers as represented by Turing machines”. In: Journal of Statistical Physics 22.5 (May 1980), pp. 563–591.
issn: 0022-4715. doi: 10.1007/BF01011339.
[3] Richard P. Feynman. “Simulating physics with computers”. In: International
Journal of Theoretical Physics 21.6-7 (June 1982), pp. 467–488. issn: 00207748. doi: 10.1007/BF02650179. arXiv: 9508027 [quant-ph].
[4] Peter W Shor. “Polynomial-Time Algorithms for Prime Factorization and
Discrete Logarithms on a Quantum Computer”. In: SIAM Journal on Computing 26.5 (Oct. 1997), pp. 1484–1509. issn: 0097-5397. doi: 10.1137/
S0097539795293172.
[5] Dan Boneh. “Twenty Years of Attacks on the RSA Cryptosystem”. In: Notices of the American Mathematical Society 46.2 (1999), pp. 203–213. issn:
00029920. doi: 10.1.1.525.7995.
[6] M. A. Nielsen and I. L. Chuang. Quantum Computation and Quantum
Information. New York, NY, USA: Cambridge University Press, 2011. isbn:
9781107002173.
[7] C. H. Bennett and G. Brassard. “Quantum cryptography: Public key distribution and coin tossing”. In: Proceedings of IEEE International Conference
on Computers, Systems and Signal Processing. Vol. 175. 1984, p. 8.
[8] Artur K. Ekert. “Quantum cryptography based on Bell’s theorem”. In: Physical Review Letters 67.6 (Aug. 1991), pp. 661–663. issn: 0031-9007. doi:
10.1103/PhysRevLett.67.661. arXiv: 0911.4171v2.
[9] Bernard Yurke and David Stoler. “Bells-inequality experiments using independentparticle sources”. In: Physical Review A 46.5 (1992), pp. 2229–2234. issn:
10502947. doi: 10.1103/PhysRevA.46.2229.
[10] H.-J. Briegel et al. “Quantum Repeaters: The Role of Imperfect Local Operations in Quantum Communication”. In: Physical Review Letters 81.26
(1998), pp. 5932–5935. issn: 0031-9007. doi: 10.1103/PhysRevLett.
81.5932. arXiv: 9803056v1 [quant-ph].
[11] L.-M. Duan et al. “Long-distance quantum communication with atomic
ensembles and linear optics”. In: Nature 414.6862 (Nov. 2001), pp. 413–418.
issn: 0028-0836. doi: 10.1038/35106500. arXiv: 0105105 [quant-ph].

79
[12] Vittorio Giovannetti, Seth Lloyd, and Lorenzo Maccone. “Advances in quantum metrology”. In: Nature Photonics 5.4 (Apr. 2011), pp. 222–229. issn:
1749-4885. doi: 10 . 1038 / nphoton . 2011 . 35. arXiv: arXiv : 1102 .
2318v1.
[13] Alexander I. Lvovsky, Barry C. Sanders, and Wolfgang Tittel. “Optical
quantum memory”. In: Nature Photonics 3.12 (2009), pp. 706–714. issn:
1749-4885. doi: 10.1038/nphoton.2009.231. arXiv: 1002.4659.
[14] A. Imamoglu. “High Efficiency Photon Counting Using Stored Light”. In:
Physical Review Letters 89.16 (2002), p. 163602. issn: 0031-9007. doi:
10.1103/PhysRevLett.89.163602. arXiv: 0205196 [quant-ph].
[15] Félix Bussières et al. “Prospective applications of optical quantum memories”. In: Journal of Modern Optics 60.18 (June 2013), pp. 1519–1537. issn:
0950-0340. doi: 10.1080/09500340.2013.856482. arXiv: 1306.6904.
[16] International Union of Pure Chemistry and Applied. Nomenclature of Inorganic Chemistry: IUPAC Recommendations 2005. 2005, p. 366. isbn:
0854044388. doi: 10.1515/ci.2005.27.6.25.
[17] A. J. Freeman and R. E. Watson. “Theoretical investigation of some magnetic
and spectroscopic properties of rare-earth ions”. In: Physical Review 127.6
(1962), pp. 2058–2075. issn: 0031899X. doi: 10.1103/PhysRev.127.
2058.
[18] G. H. Dieke, H. M. Crosswhite, and B. Dunn. “Emission Spectra of the
Doubly and Triply Ionized Rare Earths”. In: Journal of the Optical Society
of America 51.8 (Aug. 1961), p. 820. issn: 0030-3941. doi: 10 . 1364 /
JOSA.51.000820.
[19] E. Cicely Ridley. “Self-consistent fields without exchange for Pr$ˆ{3+}$ and
Tm$ˆ{3+}$”. In: Mathematical Proceedings of the Cambridge Philosophical Society 243.01 (Jan. 1960), p. 422. issn: 14698064. doi: 10.1017/
S0305004100034277.
[20] G. H. Dieke and H. M. Crosswhite. “The Spectra of the Doubly and Triply
Ionized Rare Earths”. In: Applied Optics 2.7 (July 1963), p. 675. issn:
0003-6935. doi: 10.1364/AO.2.000675.
[21] B. R. Judd. “Optical absorption intensities of rare-earth ions”. In: Physical Review 127.3 (1962), pp. 750–761. issn: 0031899X. doi: 10.1103/
PhysRev.127.750.
[22] G. S. Ofelt. “Intensities of Crystal Spectra of Rare-Earth Ions”. In: The
Journal of Chemical Physics 37.3 (1962), p. 511. issn: 00219606. doi:
10.1063/1.1701366. arXiv: arXiv:1011.1669v3.

80
[23] D. L. McAuslan, J. J. Longdell, and M. J. Sellars. “Strong-coupling cavity
QED using rare-earth-metal-ion dopants in monolithic resonators: What
you can do with a weak oscillator”. In: Physical Review A 80.6 (Dec. 2009),
pp. 1–9. issn: 1050-2947. doi: 10.1103/PhysRevA.80.062307. arXiv:
0908.1994v2.
[24] Manjin Zhong et al. “Optically addressable nuclear spins in a solid with a
six-hour coherence time”. In: Nature 517.7533 (Jan. 2015), pp. 177–180.
issn: 0028-0836. doi: 10.1038/nature14025. arXiv: 1411.6758.
[25] R.J. Mears et al. “Low-noise erbium-doped fibre amplifier operating at
1.54µm”. In: Electronics Letters 23.19 (1987), p. 1026. issn: 00135194.
doi: 10.1049/el:19870719.
[26] H A Kramers. “Théorie générale de la rotation paramagnétique dans les
cristaux”. In: Proc. Amst. Acad. 33 (1930), pp. 959–972.
[27] Anatole Abragam and Brebis Bleaney. Electron Paramagnetic Resonance
of Transition Ions. Oxford University Press, 1970. isbn: 978-0199651528.
[28] E. Wigner. “Uber die Operation der Zeitumkehr in der Quantenmechanik”.
In: Nachrichten von der Gesellschaft der Wissenschaften zu Göttingen 31
(1932), pp. 546–559.
[29] Bryan W. Roberts. “Kramers degeneracy without eigenvectors”. In: Physical
Review A 86.3 (Sept. 2012), p. 034103. issn: 1050-2947. doi: 10.1103/
PhysRevA.86.034103. arXiv: 1208.3889.
[30] Yongchen Sun et al. “Magnetic g tensors for the i 15/2 4 and i 13/2 4
states of Er3+: Y2 Si O5”. In: Physical Review B - Condensed Matter
and Materials Physics 77.8 (Feb. 2008), p. 085124. issn: 10980121. doi:
10.1103/PhysRevB.77.085124.
[31] Valerii Ter-Mikirtychev. Fundamentals of Fiber Lasers and Fiber Amplifiers.
Vol. 181. Springer Series in Optical Sciences. Cham: Springer International
Publishing, 2014. isbn: 978-3-319-02337-3. doi: 10.1007/978-3-31902338-0.
[32] Thomas Böttger et al. “Spectroscopy and dynamics of Er3+ :Y2 SiO5 at 1.5
µm”. In: Physical Review B 74.7 (Aug. 2006), p. 075107. issn: 1098-0121.
doi: 10.1103/PhysRevB.74.075107.
[33] Thomas Böttger et al. “Optical decoherence and spectral diffusion at 1.5
µm in Er3+ :Y2 SiO5 versus magnetic field, temperature, and Er3+ concentration”. In: Physical Review B - Condensed Matter and Materials Physics 73.7
(2006), p. 075101. issn: 10980121. doi: 10.1103/PhysRevB.73.075101.
[34] E. Saglamyurek et al. “An integrated processor for photonic quantum states
using a broadband light–matter interface”. In: New Journal of Physics 16.6
(June 2014), p. 065019. issn: 1367-2630. doi: 10.1088/1367-2630/16/
6/065019. arXiv: 1402.0481.

81
[35] S. Welinski et al. “Effects of disorder on optical and electron spin linewidths
in Er3+,Sc3+:Y2SiO5”. In: Optical Materials (Sept. 2016). issn: 09253467.
doi: 10.1016/j.optmat.2016.09.039.
[36] Gladys H. Fuller. “Nuclear Spins and Moments”. In: Journal of Physical and
Chemical Reference Data 5.4 (Oct. 1976), pp. 835–1092. issn: 0047-2689.
doi: 10.1063/1.555544.
[37] Keith Holliday et al. “Spectral hole burning and holography in an Y2 SiO5 :Pr3+
crystal”. In: Physical Review B 47.22 (1993), pp. 14741–14752. issn: 01631829. doi: 10.1103/PhysRevB.47.14741.
[38] Flurin Könz et al. “Temperature and concentration dependence of optical dephasing, spectral-hole lifetime, and anisotropic absorption in Eu3+ Y2 SiO5 ”.
In: Physical Review B 68.8 (Aug. 2003), p. 085109. issn: 0163-1829. doi:
10.1103/PhysRevB.68.085109.
[39] Matthias U. Staudt et al. “Investigations of optical coherence properties
in an erbium-doped silicate fiber for quantum state storage”. In: Optics
Communications 266.2 (Oct. 2006), pp. 720–726. issn: 00304018. doi:
10.1016/j.optcom.2006.05.007. arXiv: 0603192 [quant-ph].
[40] Erhan Saglamyurek et al. “Quantum storage of entangled telecom-wavelength
photons in an erbium-doped optical fibre”. In: Nature Photonics 9.2 (Sept.
2015), pp. 83–87. issn: 1749-4885. doi: 10.1038/nphoton.2014.311.
arXiv: 1409.0831.
[41] Miloš Rančić et al. “Coherence time of over a second in a telecom-compatible
quantum memory storage material”. In: (Nov. 2016). arXiv: 1611.04315.
[42] L.A. Harris and C.B. Finch. “Mineralogical notes 1493”. In: The American
Minerologist 50.9 (1965), pp. 1493–1495.
[43] B. A. Maksimov et al. “Crystal Structure of the Y-Oxysilicate Y[SiO4]O”.
In: Kristallografiya 15.6 (1970), pp. 926–933.
[44] Y. C. Sun. Spectroscopic Properties of Rare Earths in Optical Materials. Ed.
by Guokui Liu and Bernard Jacquier. Vol. 83. Springer Series in Materials
Science. Berlin/Heidelberg: Springer-Verlag, 2005, pp. 379–429. isbn: 3540-23886-7. doi: 10.1007/3-540-28209-2.
[45] C. Li, Ch. Wyon, and R. Moncorge. “Spectroscopic properties and fluorescence dynamics of Er/sup 3+/ and Yb/sup 3+/ in Y/sub 2/SiO/sub 5/”. In:
IEEE Journal of Quantum Electronics 28.4 (Apr. 1992), pp. 1209–1221.
issn: 00189197. doi: 10.1109/3.135248.
[46] Ray Beach et al. “Optical absorption and stimulated emission of neodymium
in yttrium orthosilicate”. In: IEEE Journal of Quantum Electronics 26.8
(1990), pp. 1405–1412. issn: 00189197. doi: 10.1109/3.59689. arXiv:
arXiv:1011.1669v3.

82
[47] Thomas Böttger et al. “Effects of magnetic field orientation on optical
decoherence in Er3+ :Y2 SiO5 ”. In: Physical Review B 79.11 (Mar. 2009),
p. 115104. issn: 1098-0121. doi: 10.1103/PhysRevB.79.115104.
[48] C. W. Thiel, W. R. Babbitt, and R. L. Cone. “Optical decoherence studies
of yttrium oxyorthosilicate Y2 SiO5 codoped with Er3+ and Eu3+ for optical
signal processing and quantum information applications at 1.5 microns”.
In: Physical Review B 85.17 (May 2012), p. 174302. issn: 1098-0121. doi:
10.1103/PhysRevB.85.174302.
[49] S. R. Hastings-Simon et al. “Zeeman-level lifetimes in Er3+ :Y2 SiO5 ”. In:
Physical Review B 78.8 (Aug. 2008), p. 085410. issn: 1098-0121. doi:
10.1103/PhysRevB.78.085410.
[50] B. Lauritzen et al. “State preparation by optical pumping in erbium-doped
solids using stimulated emission and spin mixing”. In: Physical Review A
78.4 (Oct. 2008), p. 043402. issn: 1050-2947. doi: 10.1103/PhysRevA.
78.043402. arXiv: arXiv:0808.3537v1.
[51] Björn Lauritzen et al. “Telecommunication-Wavelength Solid-State Memory
at the Single Photon Level”. In: Physical Review Letters 104.8 (Feb. 2010),
p. 080502. issn: 0031-9007. doi: 10.1103/PhysRevLett.104.080502.
[52] E. Baldit et al. “Identification of Λ-like systems in Er3+ :Y2 SiO5 and observation of electromagnetically induced transparency ”. In: Physical Review B
81.14 (Apr. 2010), p. 144303. issn: 1098-0121. doi: 10.1103/PhysRevB.
81.144303.
[53] I. D. Abella, N. A. Kurnit, and S. R. Hartmann. “Photon Echoes”. In:
Physical Review 141.1 (Jan. 1966), pp. 391–406. issn: 0031-899X. doi:
10.1103/PhysRev.141.391.
[54] E.L. Hahn. “Spin Echoes”. In: Physical Review 80.4 (1950), pp. 580–594.
issn: 0031-899X. doi: 10.1103/PhysRev.80.580.
[55] L. Allen and J.H. Eberly. Optical Resonance and Two Level Atoms. Second.
New York, NY, USA: Dover Publications, Inc., 1987.
[56] E. L. Hahn. “Free nuclear induction”. In: Physics Today 6.11 (Nov. 1953),
pp. 4–9. issn: 0031-9228. doi: 10.1063/1.3061075.
[57] Khabat Heshami et al. “Quantum memories: emerging applications and recent advances”. In: Journal of Modern Optics 63.20 (Nov. 2016), pp. 2005–
2028. issn: 0950-0340. doi: 10.1080/09500340.2016.1148212. arXiv:
1511.04018.
[58] Hugues de Riedmatten et al. “A solid-state light–matter interface at the
single-photon level”. In: Nature 456.7223 (Dec. 2008), pp. 773–777. issn:
0028-0836. doi: 10.1038/nature07607. arXiv: 0810.0630.

83
[59] Mikael Afzelius et al. “Multimode quantum memory based on atomic frequency combs”. In: Physical Review A 79.5 (May 2009), p. 052329. issn:
1050-2947. doi: 10.1103/PhysRevA.79.052329. arXiv: 0805.4164.
[60] Mikael Afzelius et al. “Demonstration of atomic frequency comb memory
for light with spin-wave storage”. In: Physical Review Letters 104.4 (2010),
pp. 1–4. issn: 00319007. doi: 10 . 1103 / PhysRevLett . 104 . 040503.
arXiv: 0908.2309.
[61] Erhan Saglamyurek et al. “Broadband waveguide quantum memory for entangled photons”. In: Nature 469.7331 (Jan. 2011), pp. 512–515. issn: 00280836. doi: 10.1038/nature09719. arXiv: 1009.0490.
[62] Giacomo Corrielli et al. “Integrated Optical Memory Based on LaserWritten Waveguides”. In: Physical Review Applied 5 (May 2016), p. 054013.
issn: 2331-7019. doi: 10 . 1103 / PhysRevApplied . 5 . 054013. arXiv:
1512.09288.
[63] Sara Marzban et al. “Observation of Photon Echoes from Evanescently Coupled Rare-Earth Ions in a Planar Waveguide”. In: Physical Review Letters
115.1 (2015), pp. 1–5. issn: 10797114. doi: 10.1103/PhysRevLett.115.
013601. arXiv: 1503.0252.
[64] S. Probst et al. “Three-dimensional cavity quantum electrodynamics with a
rare-earth spin ensemble”. In: Physical Review B - Condensed Matter and
Materials Physics 90.10 (2014), pp. 1–5. issn: 1550235X. doi: 10.1103/
PhysRevB.90.100404. arXiv: arXiv:1406.3535v1.
[65] Philip Trøst Kristensen, Cole Van Vlack, and Stephen Hughes. “Generalized
effective mode volume for leaky optical cavities”. In: Optics Letters 37.10
(May 2012), p. 1649. issn: 0146-9592. doi: 10.1364/OL.37.001649.
arXiv: 1107.4601.
[66] Mikael Afzelius and Christoph Simon. “Impedance-matched cavity quantum
memory”. In: Physical Review A 82.2 (Aug. 2010), p. 022310. issn: 10502947. doi: 10.1103/PhysRevA.82.022310.
[67] E. M. Purcell. “Spontaneous Emission Probabilities at Radio Frequencies”.
In: Proceedings of the American Physical Society. Vol. 69. 1946, p. 681.
isbn: 9789729914386.
[68] Tian Zhong et al. “Nanophotonic coherent light–matter interfaces based
on rare-earth-doped crystals”. In: Nature Communications 6 (Sept. 2015),
p. 8206. issn: 2041-1723. doi: 10.1038/ncomms9206.
[69] Tian Zhong et al. “High quality factor nanophotonic resonators in bulk rareearth doped crystals”. In: Optics Express 24.1 (Jan. 2016), p. 536. issn:
1094-4087. doi: 10.1364/OE.24.000536. arXiv: 1512.03947.

84
[70] Evan Miyazono et al. “Coupling of erbium dopants to yttrium orthosilicate
photonic crystal cavities for on-chip optical quantum memories”. In: Applied
Physics Letters 108.1 (Jan. 2016), p. 011111. issn: 0003-6951. doi: 10.
1063/1.4939651.
[71] J. S. Foresi et al. “Photonic-bandgap microcavities in opticalwaveguides”.
In: Nature 390.6656 (Nov. 1997), pp. 143–145. issn: 00280836. doi: 10.
1038/36514.
[72] J. P. Zhang et al. “Nanofabrication of 1-D photonic bandgap structures
along a photonic wire”. In: IEEE Photonics Technology Letters 8.4 (1996),
pp. 491–493. issn: 10411135. doi: 10.1109/68.491093.
[73] O. Painter, J. Vučkovič, and A. Scherer. “Defect modes of a two-dimensional
photonic crystal in an optically thin dielectric slab”. In: Journal of the
Optical Society of America B 16.2 (Feb. 1999), p. 275. issn: 0740-3224.
doi: 10.1364/JOSAB.16.000275.
[74] Parag B. Deotare et al. “High quality factor photonic crystal nanobeam
cavities”. In: Applied Physics Letters 94.12 (Mar. 2009), p. 121106. issn:
0003-6951. doi: 10.1063/1.3107263. arXiv: 0901.4158.
[75] Igal Bayn et al. “Triangular nanobeam photonic cavities in single-crystal
diamond”. In: New Journal of Physics 13.2 (Feb. 2011), p. 025018. issn:
1367-2630. doi: 10.1088/1367-2630/13/2/025018. arXiv: 1101.1367.
[76] Michael J Burek et al. “Free-Standing Mechanical and Photonic Nanostructures in Single-Crystal Diamond.” In: Nano letters (Nov. 2012). issn:
1530-6992. doi: 10.1021/nl302541e.
[77] Michael J. Burek et al. “High quality-factor optical nanocavities in bulk
single-crystal diamond”. In: Nature Communications 5 (Dec. 2014), p. 5718.
issn: 2041-1723. doi: 10.1038/ncomms6718. arXiv: 1408.5973.
[78] Ardavan F. Oskooi et al. “Meep: A flexible free-software package for electromagnetic simulations by the FDTD method”. In: Computer Physics Communications 181.3 (2010), pp. 687–702. issn: 00104655. doi: 10.1016/j.
cpc.2009.11.008.
[79] S. Mosor et al. “Scanning a photonic crystal slab nanocavity by condensation of xenon”. In: Applied Physics Letters 87.14 (2005), pp. 1–3. issn:
00036951. doi: 10.1063/1.2076435.
[80] I. Diniz et al. “Strongly coupling a cavity to inhomogeneous ensembles
of emitters: Potential for long-lived solid-state quantum memories”. In:
Physical Review A 84.6 (Dec. 2011), p. 063810. issn: 1050-2947. doi:
10.1103/PhysRevA.84.063810. arXiv: 1101.1842.
[81] Beatriz Cordero et al. “Covalent radii revisited”. In: Dalton Transactions 21
(2008), p. 2832. issn: 1477-9226. doi: 10.1039/b801115j.

85
[82] Evan Miyazono et al. “Coupling erbium dopants in yttrium orthosilicate to
silicon photonic resonators and waveguides”. In: Optics Express 25.3 (Feb.
2017), p. 2863. issn: 1094-4087. doi: 10.1364/OE.25.002863.
[83] Kevin Luke et al. “Broadband mid-infrared frequency comb generation in
a Si_3N_4 microresonator”. In: Optics Letters 40.21 (Nov. 2015), p. 4823.
issn: 0146-9592. doi: 10.1364/OL.40.004823.
[84] F. A. Ponce and D. P. Bour. “Nitride-based semiconductors for blue and
green light-emitting devices”. In: Nature 386.6623 (Mar. 1997), pp. 351–
359. issn: 0028-0836. doi: 10.1038/386351a0.
[85] Charles Kittel. Introduction to Solid State Physics. 6th. New York: John
Wiley, 1986.
[86] Luozhou Li et al. “Nanofabrication on unconventional substrates using transferred hard masks”. In: Scientific Reports 5 (Jan. 2015), p. 7802. issn:
2045-2322. doi: 10.1038/srep07802.
[87] Cheng-wei Cheng et al. “Epitaxial lift-off process for gallium arsenide substrate reuse and flexible electronics”. In: Nature Communications 4 (Mar.
2013), p. 1577. issn: 2041-1723. doi: 10.1038/ncomms2583.
[88] A Arbabi et al. “Dielectric metasurfaces for complete control of phase and
polarization with subwavelength spatial resolution and high transmission”.
In: Nature Nanotechnology 10.11 (Aug. 2015), pp. 937–943. issn: 17483387. doi: 10.1038/nnano.2015.186. arXiv: 1411.1494.
[89] J. Baró et al. “PENELOPE: An algorithm for Monte Carlo simulation of
the penetration and energy loss of electrons and positrons in matter”. In:
Nuclear Instruments and Methods in Physics Research Section B: Beam
Interactions with Materials and Atoms 100.1 (May 1995), pp. 31–46. issn:
0168583X. doi: 10.1016/0168-583X(95)00349-5.
[90] V. B. Verma et al. “High-efficiency WSi superconducting nanowire singlephoton detectors operating at 2.5 K”. In: Applied Physics Letters 105.12
(2014), pp. 2013–2016. issn: 00036951. doi: 10.1063/1.4896045. arXiv:
1406.1810.
[91] Franco Gaspari. Optoelectronics - Materials and Techniques. Ed. by P. Predeep. InTech, Sept. 2011, pp. 3–26. isbn: 978-953-307-276-0. doi: 10 .
5772/779.
[92] Tian Zhong et al. “High quality factor nanophotonic resonators in bulk rareearth doped crystals”. In: Optics Express 24.1 (Jan. 2016), p. 536. issn:
1094-4087. doi: 10.1364/OE.24.000536.
[93] M.A. Rosa et al. “Self-alignment of optical fibers with optical quality endpolished silicon rib waveguides using wet chemical micromachining techniques”. In: IEEE Journal of Selected Topics in Quantum Electronics 5.5
(1999), pp. 1249–1254. issn: 1077260X. doi: 10.1109/2944.806748.

86
[94] R. Moosburger et al. “Passive alignment of single-mode fibers to integrated
polymer waveguide structures utilizing a single-mask process”. In: IEEE
Photonics Technology Letters 11.7 (July 1999), pp. 848–850. issn: 10411135. doi: 10.1109/68.769728.
[95] Seán M. Meenehan et al. “Silicon optomechanical crystal resonator at millikelvin temperatures”. In: Physical Review A 90.1 (July 2014), p. 011803.
issn: 1050-2947. doi: 10.1103/PhysRevA.90.011803. arXiv: 1403.
3703.
[96] Justin D Cohen, Seán M Meenehan, and Oskar Painter. “Optical coupling to
nanoscale optomechanical cavities for near quantum-limited motion transduction”. In: Optics Express 21.9 (May 2013), p. 11227. issn: 1094-4087.
doi: 10.1364/OE.21.011227. arXiv: 1302.1807.
[97] Björn Lauritzen. “Quantum Memories for Telecommunication Networks”.
PhD thesis. 2010, p. 166.
[98] O. Guillot-Noël et al. “Direct observation of rare-earth-host interactions
in Er: Y2 Si O5”. In: Physical Review B 76.18 (2007), p. 180408. issn:
10980121. doi: 10.1103/PhysRevB.76.180408.
[99] Yu-Hui Chen, Xavier Fernandez-Gonzalvo, and Jevon J. Longdell. “Coupling erbium spins to a three-dimensional superconducting cavity at zero
magnetic field”. In: Physical Review B 94.7 (Aug. 2016), p. 075117. issn:
2469-9950. doi: 10.1103/PhysRevB.94.075117. arXiv: 1512.03606.
[100] Mikael Afzelius and Christoph Simon. “Impedance-matched cavity quantum
memory”. In: Physical Review A 82.2 (Aug. 2010), p. 022310. issn: 10502947. doi: 10.1103/PhysRevA.82.022310.
[101] Félix Bussières et al. “Quantum teleportation from a telecom-wavelength
photon to a solid-state quantum memory”. In: Nature Photonics 8.10 (Sept.
2014), pp. 775–778. issn: 1749-4885. doi: 10.1038/nphoton.2014.215.
arXiv: 1401.6958.
[102] Mustafa Gündoğan et al. “Solid State Spin-Wave Quantum Memory for
Time-Bin Qubits”. In: Physical Review Letters 114.23 (June 2015), p. 230501.
issn: 0031-9007. doi: 10 . 1103 / PhysRevLett . 114 . 230501. arXiv:
1501.03980.
[103] R. W. Andrews et al. “Bidirectional and efficient conversion between microwave and optical light”. In: Nature Physics 10.4 (Mar. 2014), pp. 321–
326. issn: 1745-2473. doi: 10.1038/nphys2911. arXiv: 1310.5276.

87
Appendix A

CODE FOR CAVITY MODE SIMULATION AND ANALYSIS

The code in Section A.1 and A.2 were used to simulate the ring and nanobeam
cavities, respectively. The code in Section A.3 was used to generate the included
figures from the simulation output.1
A.1

MEEP Code to Model the Ring

1 ; ring-on-YSO-cyl.ctl
2 ; simulates the modes for an amorphous silicon ring on YSO in cylindrical coordinates.
3 ; Evan Miyazono 9/2016
5 ( define-param w 0.4785)
; width of waveguide
6 ( define-param r 11.0055)
; outer radius of ring
7 ( define-param h_ring 0.377)
; ring height
9 ( define-param res 75)
; resolution
10
11 ( define-param fcen 0.651)
; 1536 nm
12 ( define-param df 0.2)
13 ( define-param time 2000)
14
15 ( set-param! m 118)
; azimuthal symmetry number
16
17 ( define-param rpad ( ceiling (/ 2 (- fcen df)) )) ; radial padding between waveguide and ...
edge of PML
18 ( define-param zpad ( ceiling (/ 2 (- fcen df)) )) ; vertical padding between waveguide and ...
edge of PML
19 ( define-param dpml 1) ; thickness of PML
20
21 ( define n_si 3.48)
; material making up ring
22 ( define n_YSO 1.8)
; material above the ring
23
24 ( define sr (+ r rpad dpml) ) ; radial size (cell is from 0 to sr)
25 ( define sz (+ h_ring (* 2 zpad) (* 2 dpml) ) ) ; vertical size
26
27 (set! dimensions CYLINDRICAL )
28 (set! geometry-lattice (make lattice (size sr no-size sz)))
29
30 (set! geometry (list
31
(make block
; YSO substrate
32
( center (/ sr 2) 0 (/ (+ zpad dpml h_ring ) 2) ) ; r 0 z (z=0 at center , r=0 at left)
33
(size sr infinity (+ zpad dpml) )
; r phi z
34
( material (make dielectric ( index n_YSO ))))
35
(make block
; ring
36
( center (- r (/ w 2)) 0 0)
37
(size w infinity h_ring )
38
( material (make dielectric ( index n_si))))
39 ) )
40
41
1 typesetting of meep (Scheme) and matlab code was accomplished using lstlang0.sty, writ-

ten by Andreas Stuhlm uller (https://github.com/stuhlmueller/scheme-listings) and
mcode.sty library, written by Florian Knorn (www.florian-knorn.com).

88
42 (set! pml-layers (list (make pml ( thickness dpml))))
43 ( set-param! resolution res) ; simulation resolution
44
45 (set! sources (list
46
(make source
47
(src (make gaussian-src ( frequency fcen) ( fwidth df)))
48
( component Ez) ( center (+ r (/ w -2.0001) ) 0 0))))
49
50 ( run-sources+
51
time
52
( after-sources ( harminv Ez ( vector3 (- r (/ w 2)) 0 (/ h_ring 2)) fcen df))
53
( at-beginning output-epsilon )
54
( at-end output-efield )
55 )

A.2

MEEP Code to Model the Nanobeam

1 ; nanobeam-YSO.ctl
2 ; Tian 's cavity scaled to 1536 nm resonance
3 ; initially written by Alex Hartz , modified by Tian Zhong , lastly edited by Evan Miyazono
6 ( define-param n_air 1)
; index of air holes
7 ( define-param n_YSO 1.8)
; index for bottom half YSO
9 ( define-param N 20)
; number of holes on either side of defect
10 ( define cur 0)
; current hole index
11
12 ( define-param fcen 0.651)
; pulse center frequency
13 ( define-param df 0.2)
; pulse width (in frequency )
14
15 ( define-param time 1000)
; running time
16 ( define-param nfreq 50000) ; number of frequencies at which to compute flux
17 ( define-param w 1)
; source area
18
19 ; uncomment the following and run using >mpirun -np 22 meep-mpi nanobeam-YSO.ctl > ...
resonances_cav.txt &
20 ( define-param dir " resonances_cavity ")
21 ( define-param compute-modes ? true) ; find resonant modes
22 ( define-param no_holes ? false )
23 ( define-param paraFrac .95)
24
25 ; uncomment the following and run using >mpirun -np 15 meep-mpi nanobeam-YSO.ctl > ...
transmission_cav.txt &
26 ;( define-param dir " transmission_cavity_hr ")
27 ;( define-param compute-modes ? false ) ; find transmission spectrum
28 ;( define-param no_holes ? false )
29 ;( define-param paraFrac .95)
30
31 ; uncomment the following and run using >mpirun -np 7 meep-mpi nanobeam-YSO.ctl > ...
transmission_mir.txt &
32 ;( define-param dir " transmission_mirror ")
33 ;( define-param compute-modes ? false ) ; find transmission spectrum
34 ;( define-param no_holes ? false )
35 ;( define-param paraFrac 1)
36
37 ; uncomment the following and run using >mpirun -np 4 meep-mpi nanobeam-YSO.ctl > ...
transmission_wg.txt &
38 ;( define-param dir " transmission_wg ")
39 ;( define-param compute-modes ? false ) ; find transmission spectrum
40 ;( define-param no_holes ? true)
41 ;( define-param paraFrac .95)
42
43

89
44 ( define-param trenchFrac .432)
; trench length/afinal
45 ( define-param trenchDepthFrac .65)
; trench depth/nanobeam height at center
46 ( define-param afinal (* 1.7395 .34))
; final hole spacing 2*.19 ;.35
47 ( define trenchDepth (* (* (tan trenchAngle ) (/ midWidth 2) ) trenchDepthFrac ) )
48 ( define trenchWidth (* trenchFrac afinal ))
49
50 ( define ainit (* paraFrac afinal ))
51 ( define-param spaceInts 7)
; number of points in parabolic spacing profile
52
53 ( define-param midWidth (* 1.7395 0.8))
; width of top of nanobeam
54 ( define-param trenchWidth (* 1.7395 1.00) )
55 ( define-param trenchDegAngle 60)
; interior angle of triangular nanobeam
56 ( define trenchAngle (* trenchDegAngle (/ pi 180)))
57
58 ( define s (/ (/ (+ midWidth trenchWidth ) 2) (cos trenchAngle ) .5)) ; AEH 's super clear ...
naming scheme
59 ( define deltaSpace (/ (- afinal ainit ) (* spaceInts spaceInts ) ))
60
61 ( define-param res 30)
62
63 ( use-output-directory dir)
64
65 ( define ( findSpace num)
66 (cond (
67
(<= num spaceInts )
68
(set! num (- num 1))
69
(+ (* num num deltaSpace ) ainit )
70
71
(else
72
(* afinal 1)
73
74 )
75 )
76
77 ( define ( getPos num)
78
(cond (
79
(= num 1)
80
(set! cur (/ ainit 2))
81
82
(else
83
(set! cur (+ cur ( findSpace num) ))
84
85
)86
cur
87 )
88
89 ( define-param pad 1) ; padding between last hole and PML edge
90 ( define-param dpml 1) ; PML thickness
91
92 ( define useX (* 2 N afinal ))
93
94 ( define sx (+ useX (* 2 (+ pad dpml)) )) ; size of cell in x direction
95 ( define sy (+ (* 2 trenchWidth ) midWidth (* 2 dpml)) )
96 ( define sz (+ s (* 2 dpml) ))
97
98 (set! geometry-lattice (make lattice (size sx sy sz)))
99 (set! default-material airMat )
100 ( define airMat (make dielectric ( index n_air )))
101 ( define ysoMat (make dielectric ( index n_YSO )))
102
103 ; Define the substrate , side trenches , and top trenches
104 (set! geometry
105
( append geometry ;
106
(list
107
(make block ( center 0 0 (* sz -0.1) ) (size sx midWidth (* 0.2 sz))
...
; YSO substrate
108
( material ysoMat ))

90
109
110
111
112

(make block ( center 0 (/ (+ trenchWidth midWidth ) 2) 0) (size sx trenchWidth s)
...
; side trench 1
(e1 1 0 0) (e2 0 1 0) (e3 0 (cos trenchAngle ) (sin trenchAngle )) ( material airMat ))
(make block ( center 0 (/ (+ trenchWidth midWidth ) -2) 0) (size sx trenchWidth s)
...
; side trench 2
(e1 1 0 0) (e2 0 1 0) (e3 0 ( * -1 (cos trenchAngle )) (sin trenchAngle )) ( material ...
airMat ))

113
114
115 )
116
117 ( define tempLoc 0)
118 ( define ( addHoles holeN )
119
(set! tempLoc ( getPos holeN ))
120
(if (not no_holes ?)
121
(list
122
(set! geometry ( append geometry (list
123
(make block ( center tempLoc 0 0) (size trenchWidth midWidth (* 2 trenchDepth )) ...
( material airMat ))
124
(make block ( center (* -1 tempLoc ) 0 0) (size trenchWidth midWidth (* 2 ...
trenchDepth )) ( material airMat )))))
125
(if (< holeN N)
126
( addHoles (+ holeN 1) ) )
127
128
129 )
130 ( addHoles 1)
131
132 ; Run the simulation
133 (set! pml-layers (list (make pml ( thickness dpml))))
134 ( set-param! resolution res)
135
136 (if compute-modes ?
137
( begin
138
(set! sources (list
139
(make source
140
(src (make gaussian-src ( frequency fcen) ( fwidth df)))
141
( component Ey)
142
( center 0 0 (/ (* (tan trenchAngle ) (/ midWidth 2)) -3) ) (size 0 ...
0 0)
143
144
145
146
( run-sources+ time
147
( at-beginning output-epsilon )
148
( after-sources ( harminv Ey ( vector3 0 0 0) fcen df))
149
( at-end output-efield )
150
( at-end print ( meep-fields-modal-volume-in-box fields ( meep-fields-total-volume fields )))
151
152
153
else
154
( begin
155
(set! sources (list
156
(make source
157
(src (make gaussian-src ( frequency fcen) ( fwidth df)))
158
( component Ey)
159
;( center (+ dpml (* -0.5 sx) (/ pad 2)) ; source at the opposite end
160
( center 0 0 (/ (* (tan trenchAngle ) (/ midWidth 2)) -3) ) ; source at ...
center
161
(size 0 midWidth ))))
162
( define trans ; transmitted flux
163
( add-flux fcen df nfreq
164
(make flux-region
165
( center (/ (+ useX pad) 2) 0 (* midWidth - .433) )
; sqrt (3) /4 = .433
166
(size 0 midWidth (* midWidth .866) )
167
( direction X) )))
168
( display-fluxes trans ) ; print out the flux spectrum
169

91
170 )

A.3

Matlab Code to Analyze the Ring

1 % ring_plotSimulatedPL.m
2 % imports mode profile from meep (as HDF5) and calculates ring - ensemble coupling
3 % Written by Evan Miyazono , partly based on code by Andrei Faraon
5 %% set constants and read meep results
6 n_Si = 3.41;
7 n_YSO = 1.8;
8 lambda_um = 1.536;
10 eps_fname = 'ring_TM_2D_res_75_m_118_df_0.05_tim_2000 -eps -000000000 .h5 ';
11 e_fname = 'ring_TM_2D_res_75_m_118_df_0.05_tim_2000 -e -000060000 .h5 ';
12
13 resolution = 75;
14 interface_index = 404; % YSO is from index 404 to end
15
16 fname = ['meep/ ring_sims /' eps_fname ];
17 epsilon = hdf5read (fname ,'eps ');
18 fname = ['meep/ ring_sims /' e_fname ];
19 er = hdf5read (fname ,'er.r ') + 1i* hdf5read (fname ,'er.i ');
20 ep = hdf5read (fname ,'ep.r ') + 1i* hdf5read (fname ,'ep.i ');
21 ez = hdf5read (fname ,'ez.r ') + 1i* hdf5read (fname ,'ez.i ');
22 etot = sqrt(abs(er).^2 + abs(ep).^2 + abs(ez).^2);
23
24 dr = 1/ resolution ;
25 dz = dr;
26 r = linspace (0, size(epsilon ,1)*dr ,size(epsilon ,1));
27 z = linspace (0, size(epsilon ,2)*dz ,size(epsilon ,2)) - size(epsilon ,2)*dz /2;
28
29 linear_index = find(etot == max(max(etot)));
30 [max_r , max_z ] = ind2sub (size(etot),linear_index );
31
32
33 % meep analysis
34 figure (1);
% xy plot x, y, and z components of E, and epsilon |E|^2
35 subplot (2 ,2 ,1); imagesc (r,z,epsilon '); title ('epsilon ')
36 axis tight ;
37 subplot (2 ,2 ,2); imagesc (r,z,abs(ep ')); title ('ep')
38 axis tight ;
39 subplot (2 ,2 ,3); imagesc (r,z,real(ez ')); title ('ez')
40 axis tight ;
41 subplot (2 ,2 ,4); imagesc (r,z,epsilon ' .* etot '.^2); title ('\ epsilon * etot ^2')
42 axis tight ;
43
44 zlims = 300:475;
45 rlims = 700:900;
46
47 fig = figure ();
48 subplot (3 ,1 ,1)
49 yyaxis left
50 plot(z( zlims ),abs(ez(max_r , zlims ))/max(abs(ez(max_r , zlims ))), 'Color ')
51 ylabel ('field ')
52 yyaxis right
53 plot(z( zlims ),abs( epsilon (max_r , zlims )));
54 set(gca ,'XTick ' ,[])
55 ylabel ('\ epsilon '); axis tight ;
56
57 ax1= subplot (3 ,1 ,2);
58 imagesc (z( zlims ),r( rlims ),real(ez(rlims , zlims )));
59 set(gca ,'XTick ' ,[])
60 ylabel ('r (\ mum)'); axis tight ;

92
61 colorbar ;
62
63 ax3= subplot (3 ,1 ,3);
64 imagesc (z( zlims ),r( rlims ),real( epsilon (rlims , zlims )));
65 xlabel ('z (\ mum)' ) % (vacuum , Si , YSO) ')
66 ylabel ('r (\ mum)'); axis tight ;
67
68 Et_max = max(max(etot));
69 Er_max = max(max(abs(er)))/ Et_max ;
70 Ep_max = max(max(abs(ep)))/ Et_max ;
71 Ez_max = max(max(abs(ez)))/ Et_max ;
72
73 [~,R] = meshgrid (z,r);
74 dV = dz *2* pi*dr*R;
75 dU = dV.* epsilon. * etot. ^2;
76 U_tot = sum(sum(dU));
77 U_YSO = sum(sum(dU(:, interface_index :end)));
78
79 % Standing wave mode volume and YSO mode volume
80 if Er_max < ( Ep_max ^2 + Ez_max ^2)
81
% factor of 0.5 for azimuthal sinusoidal variation
82
V = 0.5 * U_tot /( max(max( epsilon. *( abs(ez).^2 + abs(ep).^2))));
83
V_YSO = U_YSO /( max(max( epsilon. *( abs(ez).^2 + abs(ep).^2))));
84
disp('looks like a TM mode ')
85 else
86
V = U_tot /( max(max( epsilon. *( abs(er).^2))));
87
V_YSO = U_YSO /( max(max( epsilon. *( abs(er).^2))));
88
disp('looks like a TE mode ')
89 end
90 disp( ['volume = ' num2str (V/( lambda_um ^3/( n_YSO * n_Si ^2))) ' cubic wavelengths (in aSi)'] )
91 disp( ['volume = ' num2str (V) ' um ^3 '] )
92 disp( ['volume in YSO = ' num2str ( V_YSO ) ' um ^3'] )
93 disp( ['fraction of field energy in YSO = ' num2str ( U_YSO / U_tot )] )
94
95 % ion density in ions/um ^3 for 0.02% Er:YSO ( factor of 1/2 for site1 / site2 )
96 ion_density = 1/2 * 0 .0002 * (2*4 .44 /286 / 1e4 ^3 * 6 .022e23 );
97 disp ([ 'total number of ions in the YSO mode volume : ' num2str ( V_YSO * ion_density )])
98
99 disp( ['Max E field in YSO/max E field in aSi ratio = ' ...
100
num2str (max(max(abs(ez(:, interface_index :end)))) / max(max(abs(ez))))] )
101
102 % truncate simulation at interface_index for integrals over the ions
103 Ez_YSO_abs_ratio = abs(ez(:, interface_index :end)) / max(max(abs(ez)));
104 dV_YSO = dV(:, interface_index :end);
105
106 %% plot Eratio histogram
107 values = Ez_YSO_abs_ratio (:).^2;
108 weights = ion_density * dV_YSO (:);% .* Ez_YSO_abs_ratio (:).^2;
109 edges = linspace (min( values ), max( values ), 75);
110 [~, bin] = histc (values , edges );
111 count = accumarray (bin , weights );
112 figure ;
113 bar(edges , count )
114 set(gca ,'YScale ','log ')
115 xlim ([ -0 .01 1.01 ]);
116 title ('ring ')
117
118 %% matlab computation constants
119 c =3*10^8;
120 hbar =1 .0546 *10^ -34;
121 vac_permit = 8.854e -12;
122 lambda = lambda_um *10^ -6;
123
124 % YSO parameters
125 omega_1536 = 2* pi *3 e8/ lambda ; % in hertz
126 mu = 2.07e -32;
% in Cm from McAuslan " ...do with a weak oscillator "
127
128 % resonator parameters

93
129 Q =80400;
% from fit ( FitCavityAndIonsScript_gtotal )
130 V_mode = V*1e -18;
% in cubic meters
131 kappa =2* pi*c/( lambda *Q);
% energy decay in 2pi Hz
132 T_1 = 0 .0114 ;
% in seconds
133 detuning = 2* pi *0 e9;
% in 2pi Hz
134
135 % cavity effective index calculated by weighing epsilon by the |E|^2
136 g0 = mu / n_Si * sqrt( omega_1536 /(2* hbar* vac_permit * V_mode ));
% in 2pi Hz
137
138 g_map = g0 * Ez_YSO_abs_ratio ;
139 g_tot = sqrt(sum(sum( ion_density * dV_YSO. *( g_map /(2* pi)).^2)));
140 disp ([ 'g_total is ' num2str ( g_tot /1 e6 ) ' MHz ' ])
141 g_eff = 2* pi*sqrt(sum(sum( Ez_YSO_abs_ratio. ^2.*( g_map /(2* pi)).^2)) / sum(sum( ...
Ez_YSO_abs_ratio. ^2 )) );
142 disp ([ 'g_0 is ' num2str ( g0 /1 e6 ) ' (2 pi)MHz ' ])
143 disp ([ 'g_effective is ' num2str ( g_eff /1 e6 ) ' (2 pi)MHz ' ])
144 disp ([ 'effective number of ions ( g_tot / g_eff ): ' num2str ( g_tot / g_eff )])
145
146 chi_L = (( n_YSO ^2 + 2) /3) ^2;
147 T_spon = 3* vac_permit *hbar* lambda ^3/(8* pi ^2* n_YSO *mu ^2* chi_L );
148 Fp_max = 3/(4* pi ^2) * lambda ^3/( n_Si ^2* n_YSO * chi_L ) * Q/ V_mode * T_1/ T_spon ;
149
150 %% iterate and fit all PL files
151 directory = 'plfromaug4th /'; % Have to be in folder plfromaug4th
152 filelist =dir ([ directory 'tune*PL*.phu ']);
153 % detuned frequency measured via wavemeter after PL
154 meas_detunings = [[195116 .78 ,195117 .75 ,195118 .80 ] -195125 .11 ,...
155
[195116 .74 ,195115 .74 ,195117 .75 ] -195123 .30 ,...
156
[195116 .81 ,195115 .80 ,195117 .77 ] -195122 .43 ,...
157
[195116 .75 ,195115 .78 ,195117 .76 ] -195121 .39 ,...
158
[195116 .78 ,195115 .77 ,195117 .76 ] -195120 .67 ,...
159
[195116 .75 ,195117 .75 ,195115 .76 ] -195119 .60 ,...
160
[195116 .75 ,195115 .76 ,195117 .78 ] -195118 .61 ,...
161
[195116 .88 ,195117 .77 ,195115 .74 ] -195115 .94 ,...
162
[195116 .90 ,195117 .73 ,195115 .75 ] -195114 .62 ,...
163
[195116 .80 ,195115 .77 ,195117 .75 ] -195113 .73 ]*1 e9;
164
165 dt = 0 .004096 ; %ms
166 startPL = 27;
167 stopPL = startPL -1+7200/3; %
168 binsize = 25;
169
170 PL_time = (0: binsize :( stopPL - startPL ))*dt *1e -3;
% time axis in seconds
171 single_exp_lifetimes = zeros (size( filelist )); % to save the single exp fit
172
173 meas_decay = zeros ( length ( meas_detunings ), length ( PL_time )); % the PL data
174
175 % selected specific files for higher SNR ( subset of file_list )
176 high_snr_filenums = [2 ,5:6 ,8:9 ,11:27 ,29:30];
177 % use file 27 ( detuning 1.13 GHz) for fig. 4a
178 for fileindex = high_snr_filenums
179
% extract counts , crop and bin PL curve
180
filename = filelist ( fileindex ) .name ;
181
[counts , times ] = get_counts_from_PHU ([ directory filename ] ,0);
182
counts = counts (: ,1) ';
183
data_x = times ( startPL : binsize : stopPL )-times ( startPL ); % in seconds
184
data_y = counts ( startPL : stopPL );
185
data_y = sum( reshape (data_y ,[ binsize , length ( data_x )]));
186
187
decay_rate_map = 1/ T_1 + g_map. ^2* kappa / (( kappa /2) ^2 + meas_detunings ( fileindex )^2);
188
PL = zeros ('like ',PL_time );
189
Ez_ratio_threshold = 0.001; % skip weakly coupled ions (doesn 't change result )
190
for voxel_index = 1: numel ( Ez_YSO_abs_ratio )
191
if Ez_YSO_abs_ratio ( voxel_index ) > Ez_ratio_threshold
192
Fp_voxel = Fp_max * Ez_YSO_abs_ratio ( voxel_index )^2;
193
PL = PL + dV_YSO ( voxel_index ) .* Fp_voxel /( Fp_voxel +1) * ...
194
exp(- PL_time * decay_rate_map ( voxel_index )) * ...
195
decay_rate_map ( voxel_index );

94
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212

end
end
PL = PL/max(PL);
meas_decay (fileindex , :) = PL;
% plot fits
figure ( fileindex ); hold on;
plot( data_x *1e3 ,data_y ,'x')
% fit PL_sim
f_simdecay =@(params , PL_time ) ( params (1)*PL + params (2));
[ sim_params ,~,~, CovB_sim ,~ ,~]= nlinfit (data_x ,data_y , f_simdecay ,
[240 ,400] , statset ('MaxIter ', 1e6));
plot( PL_time *1e3 , f_simdecay ( sim_params , PL_time ));

...

% fit single exp
f_expdecay =@(params , PL_time ) ( params (1)*exp(- PL_time / params (3)) + params (2));
[ exp_params ,~,~, CovB_exp ,~ ,~]= nlinfit (data_x ,data_y , f_expdecay , ...
[240 ,400 ,0 .011], statset ('MaxIter ', 1e6));
plot( PL_time *1e3 , f_expdecay ( exp_params , PL_time ));

213
214
215
xlabel ('time (ms)')
216
ylabel ('PL (arb)')
217
set(gca ,'yscale ','log ');
218
legend ({'data ','simulated decay ','single exp '});
219 end
220
221 %% generate simulated PL intensity vs detuning contour plot
222 binsize = 10;
223 sim_detunings = linspace ( -50 ,50 ,200) *1 e9;
224 PL_time = (0: binsize :( stopPL - startPL ))*dt *1e -3;
% in seconds
225 sim_decay = zeros ( length ( sim_detunings ),length ( PL_time ));
226
227 for detuning_index = 1: length ( sim_detunings )
228
decay_rate_map = 1/ T_1 + 2* g_map. ^2* kappa / ( kappa ^2 + sim_detunings ( detuning_index )^2);
229
PL = zeros ('like ',PL_time );
230
Ez_ratio_threshold = 0.001;
231
for voxel_index = 1: numel ( Ez_YSO_abs_ratio )
232
if Ez_YSO_abs_ratio ( voxel_index ) > Ez_ratio_threshold
233
Fp_voxel = Fp_max * Ez_YSO_abs_ratio ( voxel_index )^2;
234
PL = PL + dV_YSO ( voxel_index ) .* Fp_voxel /( Fp_voxel +1) * ...
235
exp(- PL_time * decay_rate_map ( voxel_index )) * ...
236
decay_rate_map ( voxel_index ); % to normallize integral (PL) to 1
237
end
238
end
239
PL = PL/max(PL);
240
sim_decay ( detuning_index , :) = PL;
241 end
242
243 inversion_proportion = cumsum (sim_decay ,2)./ meshgrid (sum(sim_decay ,2) ,PL_time ) ';
244 figure ();
245 imagesc ( PL_time *1e3 , sim_detunings /1e9 , 1- inversion_proportion );
246 xlabel ('time (ms)')
247 ylabel ('detuning (GHz)')

95
Appendix B

CODE FOR RUNNING OPTICAL CHARACTERIZATION
EXPERIMENTS
B.1

Tektronix 5014 Arbitrary Waveform Generator

1 % Tektronix_AWG5041.m
2 %
3 % Interface object to control a Tektronix AWG5014B arbitrary waveform generator
4 % Built from a few sources
5 %
http :// www1.tek.com / forum / viewtopic.php ?f=6&t =3217
6 %
Tektronix AWG5014 programmer manual from online saved in fgen_libraries
7 %
8 % The AWG can run in continuous mode or sequence mode.
9 % Continuous mode involves using a single waveform per channel.
10 % Sequence mode
11 % Functions that work with only one mode should
12 %
13 % Make sure to turn off the AWG5014 VXI -11 server (and probably GPIB) and
14 % enable LAN communication using port 4000 on the AWG5014 itself (its
15 % system menu in the program that runs the outputs )
16 %
17 % If a session gets interrupted and the AWG refuses to connect to matlab ,
18 % turn LAN communication off and then on again (on the AWG5014 itself ) and
19 % then try reconnecting.
20 %
21 % If the marker vector doesn 't load , check out and debug the
22 % create_waveform command - I had to do some sketchy shit to make it work.
23 %
24 % usage :
25 %
Awg_instance = Tektronix_AWG5014 ( '169 .254.178.97 ', 1064)
26 %
Awg_instance.clear ();
27 %
Awg_instance.create_waveform ('hole_amp ', hole_amp_waveform , mark_start , mark_end );
28 %
Awg_instance.set_channel_waveform (1,' hole_amp ');
29 %
Awg_instance.set_sampling_rate ( sample_rate *1000) ;
30 %
Awg_instance.set_repetition_rate (1/( total_time *1e -3));
31 %
Awg_instance.start_output ([1 ,2]);
32 %
33 % ETM 20151105
34
35
36 classdef ( ConstructOnLoad = true) Tektronix_AWG5014 < handle
37
properties ( SetAccess = private )
38
awg_tcpip ;
39
buffer_size ;
40
41
channel_has_waveform ;
42
channel_output_on ;
43
sampling_rate_limits ;
44
end
45
methods
46
function obj = Tektronix_AWG5014 (address , out_buffer_size )
47
48
% check naively that address is IP -like (doesn 't check <255)
49
if regexp (address ,'^(?:[0 -9]{1 ,3}\ .){3}[0 -9]{1 ,3}$')
50
instr_address = address ;
51
else
52
instr_address = '169 .254.178.97 ';
53
warning ('provided address invalid , using 169 .254.178.97 ');

96
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121

end
if out_buffer_size < 0
obj.buffer_size = 1064;
else
obj.buffer_size = out_buffer_size ;
end
obj.awg_tcpip = tcpip ( instr_address , 4000 , 'OutputBufferSize ', obj.buffer_size );
fopen ( obj.awg_tcpip );

% Connect to instrument object , obj.

% obj.clear ();
obj.channel_has_waveform = [0 ,0 ,0 ,0];
obj.channel_output_on = [0 ,0 ,0 ,0];
obj.sampling_rate_limits = [1e7 , 10 e9 ];
end
%% control
% reset waveforms and settings
function clear (obj)
flushinput ( obj.awg_tcpip );
flushoutput ( obj.awg_tcpip );
fprintf ( obj.awg_tcpip ,'*rst;');
fprintf ( obj.awg_tcpip ,'*cls;');
end
function close (obj)
warning ('off ','TekAWG5014 : channelcheck ')
stop_output (obj ,[1 ,2 ,3 ,4]);
warning ('on','TekAWG5014 : channelcheck ')
fclose ( obj.awg_tcpip );
% Disconnect all objects.
end
% turn output 'on ' and run for channels named in a vector of length
% 'channels ' lists channel numbers to turn on; ex. [1 ,2] or [4 ,2 ,3]
function start_output (obj , channels )
for channel = 1:4
% only turn on the passed in channels with waveforms loaded
if ~ isempty (find( channels == channel ,1))
if obj.channel_has_waveform ( channel )
fprintf ( obj.awg_tcpip ,['OUTP ' num2str ( channel ) ' ON']);
obj.channel_output_on ( channel ) = 1;
else
warning ('TekAWG5014 : channelcheck ' ,['channel ' num2str ( channel ) ...
' does not have a waveform loaded... dummy ']);
end
end
end
fprintf ( obj.awg_tcpip , ': awgcontrol :run;');
end
% stop running and turn output 'off ' for channels named in a vector of length
% 'channels ' lists channel numbers to turn off; ex. [1 ,2] or [4 ,2 ,3]
function stop_output (obj , channels )
fprintf ( obj.awg_tcpip , ': awgcontrol :stop;');
for channel = 1:4
if ~ isempty (find( channels == channel ,1))
if obj.channel_output_on ( channel )
fprintf ( obj.awg_tcpip ,['OUTP ' num2str ( channel ) ' OFF ']);
obj.channel_output_on ( channel ) = 0;
else
warning ('TekAWG5014 : channelcheck ' ,['channel ' num2str ( channel ) ...
' was not on. What kind of shit are you trying to pull?']);
end
end
end
end
% prevents execution of new commands until pending commands are executed
function finish_current_command (obj)
fprintf ( obj.awg_tcpip , '*wai ');
end

97
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187

%% getters
% lists both user defined and predefined waveforms
function waveform_name_list = get_waveform_names (obj)
fprintf ( obj.awg_tcpip , 'wlist :size?');
num_names = str2double ( fscanf ( obj.awg_tcpip ));
waveform_name_list = cell(num_names ,1);
for name_index = 1: num_names
fprintf ( obj.awg_tcpip , ['wlist :name? ' num2str ( name_index -1) ]);
waveform_name_list { name_index } = fscanf ( obj.awg_tcpip );
end
end
% gets waveform name - not on sequence mode
function waveform_name = get_channel_waveform_name (obj , channel_num )
fprintf ( obj.awg_tcpip , [': source ' num2str ( channel_num ) ': waveform ?']);
waveform_name = fscanf ( obj.awg_tcpip );
end
function voltage_amplitude = get_channel_amplitude (obj , channel )
fprintf ( obj.awg_tcpip ,[ ': source ' num2str ( channel ) ': voltage ?']);
voltage_amplitude = fscanf ( obj.awg_tcpip );
end
function sampling_rate_limits = get_sampling_rate_limits (obj)
sampling_rate_limits = obj.sampling_rate_limits ;
end
function num_steps = get_sequence_num_steps (obj)
fprintf ( obj.awg_tcpip ,': SEQuence : length ?');
num_steps = str2double ( fscanf ( obj.awg_tcpip ));
end
function total_points = get_total_loaded_points (obj)
total_points = 0;
names = get_waveform_names (obj);
for waveform_index = 26: length ( names ) % first 25 are preloaded
total_points = total_points + ...
get_waveform_length (obj , names { waveform_index });
end
end
function length = get_waveform_length (obj , name)
fprintf ( obj.awg_tcpip ,[ 'WLISt : WAVeform : LENgth ? ' name ]);
length = str2double ( fscanf ( obj.awg_tcpip ));
end
function message = get_error_message (obj)
fprintf ( obj.awg_tcpip ,': SYSTem : ERRor ?');
message = str2double ( fscanf ( obj.awg_tcpip ));
end
%% setters
% Send a waveform and markers to store in memory under the given
% name. Note: waveform_vector is scaled so that the largest value
% is either 1 or -1 (and a warning is thrown ) while marker_vector
% must be either 0 or 1
function create_waveform (obj , waveform_name , waveform_vector , marker_vector1 , ...
marker_vector2 )
if isempty ( waveform_vector )
error ([ waveform_name ' is empty ']);
end
if max( waveform_vector ) >1 || min( waveform_vector ) <-1
waveform_vector = waveform_vector / max(abs( waveform_vector ));
disp ([ 'range is [' num2str (max( waveform_vector )) ',' ...
num2str (min( waveform_vector )) ']'])
warning ('rescaling waveform_vector to be between -1 and 1')
end
if length ( waveform_vector ) ~= length ( marker_vector1 ) || ...
length ( waveform_vector ) ~= length ( marker_vector2 )
warning ([ 'waveform and marker vectors must have equal ' ...
'length... the markers are all set low until '...
'you get your shit together '] ,0);
marker_vector1 = zeros (size( waveform_vector ));
marker_vector2 = marker_vector1 ;

98
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230 %
231 %
232 %
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254

end
waveform_length = length ( waveform_vector );
single_vector = single ( waveform_vector );
% reshape so each point is a byte column
binary_waveform = reshape ( typecast ( single_vector ,'uint8 ') ,[4, waveform_length ]);
% encode marker 1 bits to bit 6
m1 = bitshift ( uint8 ( logical ( marker_vector1 )) ,6); % check dec2bin (m1 (2) ,8)
% encode marker 2 bits to bit 7
m2 = bitshift ( uint8 ( logical ( marker_vector2 )) ,7); % check dec2bin (m2 (2) ,8)
% merge markers
marker_vector = m1 + m2; % check dec2bin ( marker_vector (2) ,8)
% add on the marker data
binary_waveform_wmarker = vertcat ( binary_waveform , marker_vector );
% reshape to 4 wave bytes then 1 marker byte repeating
binary_waveform_wmarker = reshape ( binary_waveform_wmarker ,1 ,5* waveform_length );
bytes = num2str ( length ( binary_waveform_wmarker ));
header = ['#' num2str ( length ( bytes )) bytes ];
fprintf ( obj.awg_tcpip ,[ ': wlist : waveform :new "' ...
waveform_name '",' num2str ( waveform_length ) ',REAL;']);
send_long_command (obj ,[ ': wlist : waveform :data "' ...
waveform_name '",' header binary_waveform_wmarker ';']);
% now set the marker data alone , because sometimes it fucks up
% the end of the waveform when marker 2 is high at the end
marker_bytes = num2str ( length ( marker_vector ));
marker_header = ['#' num2str ( length ( marker_bytes )) marker_bytes ];
send_long_command (obj ,[ ': wlist : waveform : marker :data "' ...
waveform_name '",' marker_header marker_vector +2^5 ';']);
% OH MY FUCKING GOD , THIS HAS TO BE THE WORST BUG I'VE EVER
% ENCOUNTERED. THE ABOVE LINES SHOULD RESET THE MARKER TO WHAT
% IT ALREADY IS BUT FOR SOME REASON THIS FIXES THE WAVEFORM ?!?!
% and don 't ask me what the FUCK that 2^5 does exactly
% but it fixes it somehow.
% check names afterward to confirm upload
% nice idea , but it takes way too long to run
if find( strcmp ( get_waveform_names (obj),waveform_name ))
error (['well , shit... uploading ' waveform_name ' failed '])
end
end
function set_channel_waveform (obj , channel , waveform_name )
fprintf ( obj.awg_tcpip ,[ ': source ' num2str ( channel ) ': waveform "' waveform_name '";']);
obj.channel_has_waveform ( channel ) = 1;
end
function set_channel_voltage_range (obj , channel , V_range )
amplitude = range ( V_range );
offset = mean( V_range );
if range ( V_range ) > 4.5
warning ([ 'voltage range on channel ' num2str ( channel ) ' is too high '])
end
if mean( V_range ) < -2.25
warning ([ 'voltage offset on channel ' num2str ( channel ) ' is too low '])
end
if mean( V_range ) > 2.25
warning ([ 'voltage offset on channel ' num2str ( channel ) ' is too high '])
end
fprintf ( obj.awg_tcpip ,[ ': source ' num2str ( channel ) ': voltage ' num2str ( amplitude )]);
fprintf ( obj.awg_tcpip ,[ ': source ' num2str ( channel ) ': voltage : offset ' ...
num2str ( offset ) ]);
end
function set_channel_amp_volts (obj , channel , amplitude )
fprintf ( obj.awg_tcpip ,[ ': source ' num2str ( channel ) ': voltage ' num2str ( amplitude )]);

99
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314

end
function set_channel_offset_volts (obj , channel , offset )
fprintf ( obj.awg_tcpip ,[ ': source ' num2str ( channel ) ': voltage : offset ' ...
num2str ( offset ) ]);
end
function set_marker_out_range (obj , channel , marker_num , marker_high , marker_low )
fprintf ( obj.awg_tcpip ,[ ': source ' num2str ( channel ) ': marker ' num2str ( marker_num ) ...
': voltage :high ' num2str ( marker_high ) ]);
fprintf ( obj.awg_tcpip ,[ ': source ' num2str ( channel ) ': marker ' num2str ( marker_num ) ...
': voltage :low ' num2str ( marker_low ) ]);
end
function set_repetition_rate (obj , rep_rate )
fprintf ( obj.awg_tcpip ,[ ': awgcontrol : rrate ' num2str ( rep_rate )]);
end
function set_sampling_rate (obj , samp_rate )
if samp_rate < obj.sampling_rate_limits (1)
warning ([ 'sample rate too low. setting to ' ...
num2str ( obj.sampling_rate_limits (1))])
samp_rate = num2str ( obj.sampling_rate_limits (1));
else if samp_rate > obj.sampling_rate_limits (2)
warning ([ 'sample rate too high. setting to ' ...
num2str ( obj.sampling_rate_limits (2))])
samp_rate = num2str ( obj.sampling_rate_limits (2));
end
end
fprintf ( obj.awg_tcpip ,[ 'source : frequency ' num2str ( samp_rate ) ]);
end
function set_sequence_mode_on (obj , bool)
if bool
fprintf ( obj.awg_tcpip ,'AWGControl : RMODe sequence ');
else
fprintf ( obj.awg_tcpip ,'AWGControl : RMODe continuous ');
end
end
% assign a waveform to a channel sequence step
function set_channel_waveform_seq_step (obj , channel , step , waveform_name )
fprintf ( obj.awg_tcpip ,[ 'SEQuence : ELEMent ' num2str (step) ': WAVeform ' ...
num2str ( channel ) ' "' waveform_name '";']);
obj.channel_has_waveform ( channel ) = 1;
end
function set_channel_seq_step_loop_num (obj , step , loop_num )
fprintf ( obj.awg_tcpip ,[ ': SEQuence : ELEMent ' num2str (step) ':loop: count ' ...
num2str ( loop_num ) ';']);
end
function set_sequence_num_steps (obj , numsteps )
fprintf ( obj.awg_tcpip ,[ ': SEQuence : length ' num2str ( numsteps ) ]);
end
function set_sequence_step_goto (obj , gofrom_step , goto_step )
fprintf ( obj.awg_tcpip ,[ ': SEQuence : ELEMent ' num2str ( gofrom_step ) ':GOTO: STATe 1']);
fprintf ( obj.awg_tcpip ,[ ': SEQuence : ELEMent ' num2str ( gofrom_step ) ':GOTO: INDex ' ...
num2str ( goto_step ) ]);
end
function delete_waveform_by_name (obj , name)
% note , the name 'all ' will delete all user waveforms
fprintf ( obj.awg_tcpip ,[ ': wlist : waveform : delete ' name ]);
end
function clear_all_sequence_steps (obj)
obj.set_sequence_num_steps (0);
obj.channel_has_waveform = [0 ,0 ,0 ,0];
end
% to be used when sending commands over 1064 characters long
function send_long_command (obj , command_string )
bytes = length ( command_string );
if obj.buffer_size >= bytes
% might have to make this fwrite for proper formatting ?
fprintf ( obj.awg_tcpip , command_string );

100
315
else
316
% write buffer_size blocks till what 's left is 317
for i = 1: obj.buffer_size :bytes - obj.buffer_size
318
fwrite ( obj.awg_tcpip , command_string (i:i+ obj.buffer_size -1));
319
end
320
fwrite ( obj.awg_tcpip , command_string (i+ obj.buffer_size :end));
321
obj.finish_current_command ();
322
end
323
end
324
end
325 end

B.2

Sequence Loader

1 % Sequence_loader.m
2 %
3 % Object that interfaces with the Tektronix_AWG5014 object to more cleanly
4 % upload and keep track of various pulse steps in a sequence to eliminate
5 % unnecessary loading of long steps ( breaks down and loops flat steps ).
6 %
7 % Constructor takes an active Tektronix_AWG5014.m object and each run_ ***
8 % takes a fully populated struct. A struct 's
9 % parameters vary by function , and are outlined in each function.
10 %
11 % Functions starting with "run_" are experiment - level commands , which take
12 % a sequence object containing the relevant sequence parameters. These use
13 % helper functions with names formatted as " make_ *** _step ". The helper
14 % functions create and upload analog and digital waveforms for the relevant
15 % channels as steps. If the step doesn 't exist , the make___step commands
16 % will create it , upload it , and add it to the list of loaded waveforms ; it
17 % does NOT add it to the current sequence. Once waveforms are uploaded ,
18 % they must be added to either the channel (in continuous mode) or the step
19 % (in sequence mode). Within the AWG , waveforms are stored individually with
20 % 1 analog + 2 digital. Because waveforms must be the same number of points ,
21 % they are stored together in Sequence_loader in "step" objects , all created
22 % by functions that call the function make_generic_step.
23 %
24 %
step objects possess :
25 %
name - ( theoretically ) unique identifier string
26 %
amp - analog output for channel amp_channel_num
27 %
freq - analog output for channel freq_channel_num
28 %
output - analog output for channel output_channel_num
29 %
scan_marker - digital output
30 %
sync_marker - digital output
31 %
MEMS_marker - digital output
32 %
33 % The function plot_current ( downsample_factor ) will plot the loaded steps.
34 % A downsample factor of ~100 is recommended , as the number of total points
35 % will likely be large.
36 %
37 %
list of experiment - level "run" functions
38 %
run_hole_burn
39 %
run_trench_burn_scan
40 %
run_trench_burn
41 %
run_stepNburn_afc_scan
42 %
run_stepNburn_afc_echo
43 %
run_accumulated_afc
44 %
run_accumulated_afc_echo
45 %
run_echo
46 %
list of step creation functions
47 %
frac_n_make_burn_step
48 %
frac_n_make_burn_trench_step
49 %
make_full_burn_step
50 %
make_full_burn_step_trench

101
51 %
make_burn_ramp_step
52 %
make_burn_trench_ramp_step
53 %
make_burn_pair_step_loop
54 %
make_stepNburn_step_loop
55 %
make_readout_step
56 %
make_sync_trigger_step
57 %
make_scan_n_triggersync_step
58 %
frac_n_make_wait_step
59 %
make_flat_step
60 %
make_cosine_step
61 %
make_generic_step
62 %
list of utility functions
63 %
is_name_loaded
64 %
get_step_from_name
65 %
upload_step
66 %
append_to_sequence
67 %
close_sequence_loop
68 %
plot_current
69 %
concat_waveform
70 %
check_rounding
71 %
72 % output chanels are as follows :
73 %
amplitude waveform - voltage to the AOM
74 %
- marker 1: input_marker - high when input (AOM) is >0 (for RF switch )
75 %
- marker 2: sync_marker - triggers timing card ( timeharp ) for scan or read
76 %
freq waveform - voltage to the laser piezo
77 %
- marker 1: scan_marker - triggers on the middle of the scan range
78 %
- marker 2: MEMS_marker - a pulse at beginng and end of read or scan pulse
79 %
output waveform - voltage to output AOM
80 %
- marker 1: output_marker - high when output is 1
81 %
- marker 2: 1- input_marker - high when input is 0
82 %
83 % usage :
84 %
Awg_instance = Tektronix_AWG5014 ( '169 .254.22.43 ', 1064) ;
85 %
sequence_loader = Sequence_loader ( Awg_instance );
86 %
87 %
afc_sequence.burn_amplitude = 0.04;
88 %
afc_sequence.burn_time = 1;
89 %
afc_sequence.burn_freq_rise_time = 1;
90 %
afc_sequence.teeth_range = [-.2 ,.2 ];
91 %
afc_sequence.num_teeth = 5;
92 %
afc_sequence.wait_times = [0 .5 100 0.5 30];
93 %
afc_sequence.num_burn_loops = 50;
94 %
afc_sequence.input_rise_time = 0;
95 %
afc_sequence.out_rise_time = 0;
96 %
afc_sequence.freq_rise_time = 5;
97 %
afc_sequence.wait_freq_offset = 0;
98 %
afc_sequence.hole_freq_offset = 0;
99 %
afc_sequence.read_amplitude = 1;
100 %
afc_sequence.read_time = 0 .00004 ;
101 %
afc_sequence.num_read_loops = 200;
102 %
afc_sequence.MEMS_rise_time = 0;
103 %
afc_sequence.MEMS_trigger_time = 0.1;
104 %
afc_sequence.block_readout_step = 0;
105 %
106 %
sequence_loader.run_stepNburn_afc_echo ( afc_sequence )
107 %
108 % ETM ,IC 20160203
109
110 classdef ( ConstructOnLoad = true) Sequence_loader < handle
111
properties ( SetAccess = private )
112
Awg_instance ;
113
114
% loaded_steps contains all loaded 'step ' structs , uniquely named ,
115
% which includes the step type (i.e. burn , wait) and relevant params.
116
loaded_steps ;
117
% approximate number of loaded points , to determine when to clear
118
% saved waveforms

102
119
total_loaded_points ;
120
% channel numbers for input , output , and frequency waveforms
121
freq_channel_num ;
122
input_channel_num ;
123
output_channel_num ;
124
% constant to determine the output value for output "on"
125
output_channel_on ;
126
127
sample_rate = 50000; % 200000; % 1e6; % samples per s
128
trigger_time = 1/10; % in ms (MEMS switch intermittently misses shorter )
129
max_flat_time ;
130
verbose ;
131
current_steps ;
132
current_sequence ;
133
134
MEMS_block_output = 0;
135
MEMS_pass_output = 1;
136
output_block = -1;
137
output_pass = 1;
138
139
end
140
methods
141
function obj = Sequence_loader ( Awg_instance )
142
Awg_instance.clear ();
143
obj.Awg_instance = Awg_instance ;
144
obj.loaded_steps = {};
145
obj.total_loaded_points = 0;
146
obj.Awg_instance.set_sequence_mode_on (true);
147
148
obj.output_channel_num = 2;
149
obj.input_channel_num = 3;
150
obj.freq_channel_num = 4;
151
obj.max_flat_time = 10; % in ms
152
obj.verbose = true;
153
154
% set the MEMS marker amplitude
155
% set_marker_out_range (obj , channel , marker_num , marker_high , marker_low )
156
obj.Awg_instance.set_marker_out_range ( obj.freq_channel_num , 2, 2, 0)
157
end
158
159
function sequence = get_current_sequence (obj)
160
sequence = obj.current_sequence ;
161
end
162
163
function clean_for_new_sequence (obj)
164
if obj.total_loaded_points > 129 .6e6 - 50 e6 % AWG only holds 129 .6e6 total points
165
if obj.verbose
166
disp ([ '*** Total number of stored waveform points ('...
167
num2str ( obj.total_loaded_points ) ...
168
') is too large ; clearing waveforms *** '])
169
end
170
obj.Awg_instance.delete_waveform_by_name ('all ')
171
172
obj.loaded_steps = {};
173
obj.total_loaded_points = 0;
174
end
175
176
obj.Awg_instance.clear_all_sequence_steps ();
177
obj.Awg_instance.set_sequence_mode_on (true);
178
obj.Awg_instance.set_sampling_rate ( obj.sample_rate *1000) ;
179
end
180
181 %% full experiment - level "run" commands
182
183
% burn a spectral hole and scan it after a wait period
184
function run_hole_burn (obj , sequence )
185
% A _sequence_ struct is presumed to contain :
186
total_time - total time of the run (next 3 values + end buffer )

103

187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223

obj.clean_for_new_sequence ();
obj.output_channel_on = 1; % turn on output channel loadings for this
intermission_time = sequence.total_time - sequence.burn_time ...
- sequence.wait_time - sequence.scan_time ;
if sequence.input_rise_time > sequence.wait_time || ...
sequence.freq_rise_time > sequence.wait_time
error ('increase wait time or decrease rise time ')
end
if 2* sequence.input_rise_time > intermission_time || ...
2* sequence.freq_rise_time > intermission_time
error ('increase total time or decrease rise time ')
end
% burn
burn_steps = obj.frac_n_make_burn_step ( sequence.freq_rise_time ,...
sequence.input_rise_time , sequence.burn_time ,...
sequence.burn_amplitude , sequence.hole_freq_offset ,...
sequence.wait_freq_offset , obj.output_block , obj.MEMS_block_output );
obj.append_to_sequence ( burn_steps );
% wait
wait_steps = obj.frac_n_make_wait_step ( sequence.wait_time - ...
2* sequence.freq_rise_time , sequence.wait_freq_offset , obj.output_pass , ...
obj.MEMS_pass_output );
obj.append_to_sequence ( wait_steps );

224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252

burn_time - time duration of hole burn
wait_time - time duration of wait between burn end and midscan
scan_time - time for linear region of scan
input_rise_time - rise time for AOM signal ( reduce ringing )
freq_rise_time - rise time for laser piezo ( reduce ringing )
burn_amplitude - amplitude (to AOM) of burn pulse between 0,1
scan_amplitude - amplitude (to AOM) of scan pulse between 0,1
hole_freq_offset - piezo offset during hole burn
wait_freq_offset - piezo offset during wait time
scan_freq_range - 1x2 vector with min and max of piezo scan range

% scan
scan_step = obj.make_scan_n_triggersync_step ( sequence.freq_rise_time ,...
sequence.input_rise_time , sequence.scan_time ,...
sequence.scan_freq_range , sequence.scan_amplitude ,...
sequence.wait_freq_offset );
obj.append_to_sequence ( scan_step );
% wait2
wait_steps2 = obj.frac_n_make_wait_step ( intermission_time - ...
2* sequence.freq_rise_time , sequence.wait_freq_offset , obj.output_pass , ...
obj.MEMS_pass_output );
obj.append_to_sequence ( wait_steps2 );

% run stuff
obj.current_steps = [ burn_steps , wait_steps , scan_step , wait_steps2 ];
obj.current_sequence = sequence ;
obj.Awg_instance.finish_current_command ();
obj.close_sequence_loop ();
obj.Awg_instance.start_output ([ obj.input_channel_num , obj.freq_channel_num ]);
if obj.output_channel_on
obj.Awg_instance.start_output ( obj.output_channel_num );
end
end
% burn a wide spectral hole ( trench ) and scan it after a wait period
% A _sequence_ struct is presumed to contain :
total_time - total time of the run (next 3 values + end buffer )

104
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289

burn_time - time duration of hole burn
wait_time - time duration of wait between burn end and midscan
scan_time - time for linear region of scan
input_rise_time - rise time for AOM signal ( reduce ringing )
freq_rise_time - rise time for laser piezo ( reduce ringing )
burn_amplitude - amplitude (to AOM) of burn pulse between 0,1
scan_amplitude - amplitude (to AOM) of scan pulse between 0,1
hole_freq_offset - piezo offset during hole burn
wait_freq_offset - piezo offset during wait time
scan_freq_range - 1x2 vector with min and max of piezo scan range
function run_trench_burn_scan (obj , sequence )
obj.clean_for_new_sequence ();
obj.output_channel_on = 1; % turn on output channel loadings for this
intermission_time = sequence.total_time - sequence.burn_time ...
- sequence.wait_time - sequence.scan_time ;
if sequence.wait_time < 4* obj.trigger_time
error ('Wait time before scan pulse is too short for MEMS switch trigger pulse ')
end
if sequence.input_rise_time > sequence.wait_time
error ('increase wait time or decrease rise time ')
end
if sequence.input_rise_time > intermission_time
error ('increase total time or decrease rise time ')
end
% burn
burn_steps = obj.frac_n_make_burn_trench_step ( sequence.freq_modulation_period , ...
sequence.input_rise_time , sequence.burn_time ,...
sequence.burn_amplitude , sequence.trench_fraction );
obj.append_to_sequence ( burn_steps );
% wait (keep MEMS off for some additional time to block burn pulse )
wait_steps_MEMS = obj.frac_n_make_wait_step (4* obj.trigger_time , 0, ...
obj.output_block , obj.MEMS_block_output );
obj.append_to_sequence ( wait_steps_MEMS );

290
291
292
293
294
295
296
297

wait_steps = obj.frac_n_make_wait_step ( sequence.wait_time - 4* obj.trigger_time - ...
sequence.freq_rise_time , 0, obj.output_pass , obj.MEMS_pass_output );
obj.append_to_sequence ( wait_steps );
% scan
scan_step = obj.make_scan_n_triggersync_step ( sequence.freq_rise_time , ...
sequence.input_rise_time , ...
sequence.scan_time , sequence.scan_freq_range , ...
sequence.scan_amplitude ,0);
obj.append_to_sequence ( scan_step );

298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316

% wait2
wait_steps2 = obj.frac_n_make_wait_step ( intermission_time - 4* obj.trigger_time - ...
sequence.freq_rise_time ,0, obj.output_pass , obj.MEMS_pass_output );
obj.append_to_sequence ( wait_steps2 );
obj.append_to_sequence ( wait_steps_MEMS );
% run stuff
obj.current_steps = [ burn_steps , wait_steps_MEMS , wait_steps , scan_step , ...
wait_steps2 , wait_steps_MEMS ];
obj.current_sequence = sequence ;
obj.Awg_instance.finish_current_command ();
obj.close_sequence_loop ();
obj.Awg_instance.start_output ([ obj.input_channel_num , obj.freq_channel_num ]);
if obj.output_channel_on
obj.Awg_instance.start_output ( obj.output_channel_num );
end
end

105
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380

% burn a wide spectral hole ( trench ) and read it out using heterodyne interference
% with a pulse it after a wait period
% A _sequence_ struct is presumed to contain :
total_time - total time of the run (next 3 values + end buffer )
burn_time - time duration of hole burn
wait_time - time duration of wait between burn end and midscan
scan_time - time for linear region of scan
input_rise_time - rise time for AOM signal ( reduce ringing )
freq_rise_time - rise time for laser piezo ( reduce ringing )
burn_amplitude - amplitude (to AOM) of burn pulse between 0,1
scan_amplitude - amplitude (to AOM) of scan pulse between 0,1
hole_freq_offset - piezo offset during hole burn
wait_freq_offset - piezo offset during wait time
scan_freq_range - 1x2 vector with min and max of piezo scan range
function run_trench_burn (obj , sequence )
obj.clean_for_new_sequence ();
obj.output_channel_on = 1; % turn on output channel loadings for this
intermission_time = sequence.total_time - sequence.burn_time ...
- sequence.wait_time - sequence.read_time ;
if sequence.wait_time < 4* obj.trigger_time
error ('Wait time before scan pulse is too short for MEMS switch trigger pulse ')
end
if sequence.input_rise_time > sequence.wait_time
error ('increase wait time or decrease rise time ')
end
if sequence.input_rise_time > intermission_time
error ('increase total time or decrease rise time ')
end
% burn
if sequence.burn_time <= 0
burn_steps = [];
else
burn_steps = ...
obj.frac_n_make_burn_trench_step ( sequence.freq_modulation_period , ...
sequence.input_rise_time , sequence.burn_time ,...
sequence.burn_amplitude , sequence.trench_fraction );
obj.append_to_sequence ( burn_steps );
end
% wait (keep MEMS off for some additional time to block burn pulse )
wait_steps_MEMS = obj.frac_n_make_wait_step (4* obj.trigger_time , 0, ...
obj.output_block , obj.MEMS_block_output );
obj.append_to_sequence ( wait_steps_MEMS );
wait_steps = obj.frac_n_make_wait_step ( sequence.wait_time - 4* obj.trigger_time , ...
0, obj.output_pass , obj.MEMS_pass_output );
obj.append_to_sequence ( wait_steps );
% readout
if sequence.block_readout_step == 0
readout_output = obj.output_pass ;
else
readout_output = obj.output_block ;
end
readout_step = make_readout_step (obj , sequence.read_amplitude ,...
sequence.read_time , 0, 0, readout_output , 1);
obj.append_to_sequence ( readout_step );
% wait2 (turn MEMS off for some additional time to block burn pulse )
wait_steps2 = obj.frac_n_make_wait_step ( intermission_time -4* obj.trigger_time , ...
0, obj.output_pass , obj.MEMS_pass_output );
obj.append_to_sequence ( wait_steps2 );

106
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446

obj.append_to_sequence ( wait_steps_MEMS );
% run stuff
obj.current_steps = [ burn_steps , wait_steps_MEMS , wait_steps , readout_step , ...
wait_steps2 , wait_steps_MEMS ];
obj.current_sequence = sequence ;
obj.Awg_instance.finish_current_command ();
obj.close_sequence_loop ();
obj.Awg_instance.start_output ([ obj.input_channel_num , obj.freq_channel_num ]);
if obj.output_channel_on
obj.Awg_instance.start_output ( obj.output_channel_num );
end
end
% burn and then scan an afc at 0 frequency detuning of the laser
% by burning each tooth individually ( using make_stepNburn_step_loop )
% A _sequence_ struct is presumed to contain :
burn_amplitude - heights of pulses
burn_times - width of pulses in ms
wait_time - wait time between pulses in ms
teeth_range - [min ,max] of linear region of scan
num_teeth - number of teeth to be burned in the comb
num_burn_loops - number of times to sweep over the full comb
input_rise_time - rise time for input signal ( reduce ringing )
out_rise_time - rise time for output signal ( reduce ringing )
freq_rise_time - rise time for frequency signal ( reduce ringing )
wait_freq_offset - piezo offset during wait time
hole_freq_offset - piezo offset during burn time
scan_amplitude - amplitude (to AOM) of scan pulse between 0,1
scan_freq_range - 1x2 vector with min and max of piezo scan range
function run_stepNburn_afc_scan (obj , sequence )
obj.clean_for_new_sequence ();
obj.output_channel_on = 0;
if sequence.wait_times (2) < obj.trigger_time
error ('Wait time before scan pulse is too short for MEMS switch trigger pulse ')
end
if sequence.wait_times (3) < obj.trigger_time
error ('Wait time after scan pulse is too short for MEMS switch trigger pulse ')
end
% if 2* sequence.input_rise_time > sequence.wait_times (1)
error (' increase wait between burn pulses or decrease rise time ')
% end
% if 2* sequence.input_rise_time > sequence.wait_times (3) || ...
2* sequence.freq_rise_time > sequence.wait_times (3)
error (' increase prescan wait time or decrease rise time ')
% end
% if 2* sequence.input_rise_time > sequence.wait_times (4) || ...
2* sequence.freq_rise_time > sequence.wait_times (4)
error (' increase postscan wait time or decrease rise time ')
% end
% burn
stepNburn_step = obj.make_stepNburn_step_loop ( sequence.burn_amplitude ,...
sequence.burn_time , sequence.wait_times (1) , sequence.num_teeth ,...
sequence.num_burn_loops , sequence.burn_freq_rise_time ,...
sequence.input_rise_time , sequence.hole_freq_offset ,...
sequence.teeth_range , sequence.wait_freq_offset );
obj.append_to_sequence ( stepNburn_step );
% wait
prescan_wait_steps = obj.frac_n_make_wait_step ( sequence.wait_times (2) , ...
sequence.wait_freq_offset , obj.output_pass , ...
obj.MEMS_pass_output );
obj.append_to_sequence ( prescan_wait_steps );

107
% scan
scan_step = obj.make_scan_n_triggersync_step ( sequence.freq_rise_time ,...
sequence.input_rise_time , sequence.scan_time ,...
sequence.scan_freq_range , sequence.scan_amplitude ,...
sequence.wait_freq_offset );
obj.append_to_sequence ( scan_step );

447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512

% wait
postscan_wait_steps = obj.frac_n_make_wait_step ( sequence.wait_times (3) , ...
sequence.wait_freq_offset , obj.output_pass , ...
obj.MEMS_pass_output );
obj.append_to_sequence ( postscan_wait_steps );

% run stuff
obj.current_steps = [ stepNburn_step , prescan_wait_steps , ...
scan_step , postscan_wait_steps ];
obj.current_sequence = sequence ;
obj.close_sequence_loop ();
obj.Awg_instance.start_output ([ obj.input_channel_num , obj.freq_channel_num ]);
if obj.output_channel_on
obj.Awg_instance.start_output ( obj.output_channel_num )
end
end
% burn an afc and then probe an afc echo at 0 frequency detuning of the laser
% by burning each tooth individually ( using make_stepNburn_step_loop )
% A _sequence_ struct is presumed to contain :
burn_amplitude - heights of pulses
burn_times - width of pulses in ms
wait_time - wait time between pulses in ms
teeth_range - [min ,max] of linear region of scan
num_teeth - number of teeth to be burned in the comb
num_burn_loops - number of times to sweep over the full comb
input_rise_time - rise time for input signal ( reduce ringing )
out_rise_time - rise time for output signal ( reduce ringing )
freq_rise_time - rise time for frequency signal ( reduce ringing )
wait_freq_offset - piezo offset during wait time
hole_freq_offset - piezo offset during burn time
read_amplitude - amplitude (to AOM) of read pulse between 0,1
read_time - time duration of the read pulse
num_read_loops - number of reads per AFC
function run_stepNburn_afc_echo (obj , sequence )
obj.clean_for_new_sequence ();
obj.output_channel_on = 0;
if sequence.wait_times (2) < obj.trigger_time
error ('Wait time before scan pulse is too short for MEMS switch trigger pulse ')
end
if sequence.wait_times (4) < obj.trigger_time
error ('Wait time after scan pulse is too short for MEMS switch trigger pulse ')
end
% burn
stepNburn_step = obj.make_stepNburn_step_loop ( sequence.burn_amplitude ,...
sequence.burn_time , sequence.wait_times (1) , sequence.num_teeth ,...
sequence.num_burn_loops , sequence.burn_freq_rise_time ,...
sequence.input_rise_time , sequence.hole_freq_offset ,...
sequence.teeth_range , sequence.wait_freq_offset );
obj.append_to_sequence ( stepNburn_step );
% wait
prescan_wait_steps = obj.frac_n_make_wait_step ( sequence.wait_times (2) , ...
sequence.wait_freq_offset , obj.output_pass , ...
obj.MEMS_pass_output );

108
obj.append_to_sequence ( prescan_wait_steps );

513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528

529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578

% read
if sequence.block_readout_step == 0
readout_output = obj.output_pass ;
else
readout_output = obj.output_block ;
end
readout_step = obj.make_readout_step ( sequence.read_amplitude ,...
sequence.read_time , sequence.wait_times (3) , ...
sequence.hole_freq_offset , readout_output , sequence.num_read_loops );
obj.append_to_sequence ( readout_step );
% wait
postscan_wait_steps = obj.frac_n_make_wait_step ( sequence.wait_times (4) , ...
sequence.wait_freq_offset , obj.output_pass , obj.MEMS_pass_output ); % 1 for ...
output
obj.append_to_sequence ( postscan_wait_steps );

% run stuff
obj.current_steps = [ stepNburn_step , prescan_wait_steps , ...
readout_step , postscan_wait_steps ];
obj.current_sequence = sequence ;
obj.close_sequence_loop ();
obj.Awg_instance.start_output ([ obj.input_channel_num , obj.freq_channel_num ]);
if obj.output_channel_on
obj.Awg_instance.start_output ( obj.output_channel_num )
end
% set MEMS switch output
obj.Awg_instance.set_marker_out_range (4, 2, 2.5 , 0);
end
% burn afc using pulse pairs and then scan it at 0 frequency detuning of the laser
% A _sequence_ struct is presumed to contain :
burn_amplitudes - height of [first , second ] pulses
burn_times - width of [first , second ] pulses in ms
wait_times - wait time after [pulse1 ,pulse2 , before scan , after scan] in ms
scan_time - time for linear region of scan
num_burn_loops - number of times to send in burn pairs
input_rise_time - rise time for input signal ( reduce ringing )
out_rise_time - rise time for output signal ( reduce ringing )
freq_rise_time - rise time for frequency signal ( reduce ringing )
wait_freq_offset - piezo offset during wait time
hole_freq_offset - piezo offset during burn time
scan_amplitude - amplitude (to AOM) of scan pulse between 0,1
scan_freq_range - 1x2 vector with min and max of piezo scan range
function run_accumulated_afc (obj , sequence )
obj.clean_for_new_sequence ();
obj.output_channel_on = 0; % turn off output channel loadings for this
assert ( length ( sequence.burn_times )==2 && ...
length ( sequence.burn_amplitudes )==2 && ...
length ( sequence.wait_times )==4);
if 2* sequence.input_rise_time > sequence.wait_times (1)
error ('increase wait between burn pulses or decrease rise time ')
end
if 2* sequence.input_rise_time > sequence.wait_times (3) || ...
2* sequence.freq_rise_time > sequence.wait_times (3)
error ('increase prescan wait time or decrease rise time ')
end
if 2* sequence.input_rise_time > sequence.wait_times (4) || ...
2* sequence.freq_rise_time > sequence.wait_times (4)
error ('increase postscan wait time or decrease rise time ')
end

109
579
580
581
582
583
584
585
586
587
588
589
590

% burn
burn_pair_loop_step = obj.make_burn_pair_step_loop ( sequence.burn_amplitudes ,...
sequence.burn_times , sequence.wait_times (1:2) , ...
sequence.num_burn_loops , sequence.freq_rise_time , ...
sequence.input_rise_time , sequence.hole_freq_offset , ...
sequence.wait_freq_offset );
obj.append_to_sequence ( burn_pair_loop_step );
% wait
prescan_wait_steps = obj.frac_n_make_wait_step ( sequence.wait_times (3) , ...
sequence.wait_freq_offset , ...
obj.output_pass , obj.MEMS_pass_output );
obj.append_to_sequence ( prescan_wait_steps );

591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642

% scan
scan_step = obj.make_scan_n_triggersync_step ( sequence.freq_rise_time ,...
sequence.input_rise_time , sequence.scan_time ,...
sequence.scan_freq_range , sequence.scan_amplitude ,...
sequence.wait_freq_offset );
obj.append_to_sequence ( scan_step );
% wait
postscan_wait_steps = obj.frac_n_make_wait_step ( sequence.wait_times (4) , ...
sequence.wait_freq_offset , 0, ...
obj.output_pass , obj.MEMS_pass_output );
obj.append_to_sequence ( postscan_wait_steps );

% run stuff
obj.current_steps = [ burn_pair_loop_step , prescan_wait_steps , ...
scan_step , postscan_wait_steps ];
obj.current_sequence = sequence ;
obj.close_sequence_loop ();
obj.Awg_instance.start_output ([ obj.input_channel_num , obj.freq_channel_num ]);
if obj.output_channel_on
obj.Awg_instance.start_output ( obj.output_channel_num )
end
end

% burn an afc using pulse pairs and then probe an afc echo at 0 frequency detuning ...
of the laser
% A _sequence_ struct is presumed to contain :
burn_amplitudes - height of [first , second ] pulses
burn_times - width of [first , second ] pulses in ms
wait_times - wait time after [pulse1 ,pulse2 , before scan ,each readouts , after ...
scan] in ms
scan_time - time for linear region of scan
num_burn_loops - number of times to send in burn pairs
input_rise_time - rise time for input signal ( reduce ringing )
out_rise_time - rise time for output signal ( reduce ringing )
read_amplitude - amplitude (to AOM) of read pulse between 0,1
read_time - time duration of the read pulse
num_read_loops - number of reads per AFC
function run_accumulated_afc_echo (obj , sequence )
obj.clean_for_new_sequence ();
obj.output_channel_on = 0; % turn off output channel loadings for this
assert ( length ( sequence.burn_times )==2 && ...
length ( sequence.burn_amplitudes )==2 && ...
length ( sequence.wait_times )==5);
if sequence.wait_times (3) < obj.trigger_time
warning ([ 'Not enough time to trigger the MEMS switch between burn and '...
' readout pulses. Wait must currently be >' num2str ( obj.trigger_time ) ' ms'])
end

110
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708

% burn
burn_pair_loop_step = obj.make_burn_pair_step_loop ( sequence.burn_amplitudes ,...
sequence.burn_times , sequence.wait_times (1:2) , ...
sequence.num_burn_loops , 0, sequence.input_rise_time , 0, 0);
obj.append_to_sequence ( burn_pair_loop_step );
% wait
prescan_wait_steps = obj.frac_n_make_wait_step ( sequence.wait_times (3) , ...
0, obj.output_pass , obj.MEMS_pass_output );
obj.append_to_sequence ( prescan_wait_steps );
% read
if sequence.block_readout_step == 0
readout_output = obj.output_pass ;
else
readout_output = obj.output_block ;
end
readout_step = obj.make_readout_step ( sequence.read_amplitude ,...
sequence.read_time , sequence.wait_times (4) , ...
0, readout_output , sequence.num_read_loops );
obj.append_to_sequence ( readout_step );
% wait
postscan_wait_steps = obj.frac_n_make_wait_step ( sequence.wait_times (5) ,...
0, obj.output_pass , obj.MEMS_pass_output ); % 1 for output
obj.append_to_sequence ( postscan_wait_steps );
% run stuff
obj.current_steps = [ burn_pair_loop_step , prescan_wait_steps , ...
readout_step , postscan_wait_steps ];
obj.current_sequence = sequence ;
obj.close_sequence_loop ();
obj.Awg_instance.start_output ([ obj.input_channel_num , obj.freq_channel_num ]);
if obj.output_channel_on
obj.Awg_instance.start_output ( obj.output_channel_num )
end
end
% run an echo at 0 frequency detuning of the laser
% keeps MEMS switch open at all times ( output_channel not used)
% A _sequence_ struct is presumed to contain :
burn_amplitudes - height of [first ,second ,( third )] pulses
amplitudes (3) =0 or length ( amplitudes )=2 sets 2 pulse echo
total_time - total time of the run (sum of next 3 values + end buffer )
burn_times - width of [first ,second ,( third )] pulses in ms
burn_times (3) =0 or length ( burn_times )=2 sets 2 pulse echo
wait12 - time between end of first and start of second pulse
waitT - time between end of second and start of third pulse
input_rise_time - rise time for input signal ( reduce ringing )
output_rise_time - rise time for output signal ( reduce ringing )
function run_echo (obj , sequence )
obj.clean_for_new_sequence ();
obj.output_channel_on = 1; % turn on output channel loadings for this
assert ( sequence.input_rise_time < sequence.wait12 || ...
max( sequence.input_rise_time , sequence.wait12 ) == 0); % otherwise you can 't ...
turn things on and off
assert ( sequence.output_rise_time < sequence.wait12 || ...
max( sequence.output_rise_time , sequence.wait12 ) == 0 ); % otherwise you ...
won 't see the echo
assert ( length ( sequence.burn_amplitudes )== length ( sequence.burn_times ) );
obj.check_rounding ([ sequence.burn_times sequence.wait12 sequence.waitT ]);

111
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751

intermission_time = sequence.total_time - sum( sequence.burn_times )...
- sequence.wait12 - sequence.waitT ;
sync_trigger_step = obj.make_sync_trigger_step (0, 1);
obj.append_to_sequence ( sync_trigger_step );
if sequence.burn_times (1) >0
first_burn_step = obj.frac_n_make_burn_step (0, sequence.input_rise_time ,...
sequence.burn_times (1) ,sequence.burn_amplitudes (1) ,0,0, ...
obj.output_pass , obj.MEMS_pass_output );
obj.append_to_sequence ( first_burn_step );
end
wait_tau12_step = obj.frac_n_make_wait_step ( sequence.wait12 , 0, obj.output_pass , ...
obj.MEMS_pass_output );
obj.append_to_sequence ( wait_tau12_step );
if sequence.burn_times (2) >0
second_burn_step = obj.frac_n_make_burn_step (0, sequence.input_rise_time ,...
sequence.burn_times (2) ,sequence.burn_amplitudes (2) ,0,0, ...
obj.output_pass , obj.MEMS_pass_output );
obj.append_to_sequence ( second_burn_step );
end
listen_step = obj.frac_n_make_wait_step ( intermission_time , 0, obj.output_pass , ...
obj.MEMS_pass_output );
if length ( sequence.burn_amplitudes ) == 3 ...
&& length ( sequence.burn_times ) == 3 && sequence.burn_times (3) ~=0
assert ( 2* sequence.input_rise_time < sequence.waitT );
wait_T_step = obj.frac_n_make_wait_step ( sequence.waitT , ...
sequence.wait_freq_offset , obj.output_pass , obj.MEMS_pass_output );
obj.append_to_sequence ( wait_T_step );
third_burn_step = obj.frac_n_make_burn_step (0, sequence.input_rise_time ,...
sequence.burn_times (3) ,sequence.burn_amplitudes (3) ,0,0, ...
obj.output_pass , obj.MEMS_pass_output );
obj.append_to_sequence ( third_burn_step );
obj.current_steps = [ sync_trigger_step , first_burn_step , wait_tau12_step , ...
second_burn_step , wait_T_step , third_burn_step , listen_step ];
else
if sequence.burn_times (1) ==0
obj.current_steps = [ sync_trigger_step , wait_tau12_step , ...
second_burn_step , listen_step ];
elseif sequence.burn_times (2) ==0
obj.current_steps = [ sync_trigger_step , first_burn_step , ...
wait_tau12_step , ...
listen_step ];
else
obj.current_steps = [ sync_trigger_step , first_burn_step , ...
wait_tau12_step , ...
second_burn_step , listen_step ];
end

752
753
754
end
755
756
obj.append_to_sequence ( listen_step );
757
758
% run stuff
759
obj.current_sequence = sequence ;
760
obj.close_sequence_loop ();
761
obj.Awg_instance.start_output ([ obj.input_channel_num , obj.freq_channel_num ]);
762
if obj.output_channel_on
763
obj.Awg_instance.start_output ( obj.output_channel_num );
764
end
765
end
766
767 %% step creation functions
768

112
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836

% make a hole burn step in 3 or 4 parts , looping the middle section if
% necessary (and possible having some remainder burn step), and calling
% make_burn_ramp_step for the start and end
function burn_steps = frac_n_make_burn_step (obj , freq_rise_time , ...
input_rise_time ,burn_time , burn_amplitude ,...
hole_freq_offset , wait_freq_offset ,output ,MEMS)
% conditionally split the wait time into blocks of length obj.max_flat_time
if burn_time > 2* obj.max_flat_time
num_loops = floor ( burn_time / obj.max_flat_time );
remainder = mod(burn_time , obj.max_flat_time );
if freq_rise_time > 0
burn_pre = make_burn_ramp_step (obj , freq_rise_time , ...
input_rise_time , burn_amplitude ,...
hole_freq_offset , wait_freq_offset ,output ,MEMS ,1);
burn_pre.num_loops = 1;
burn_post = make_burn_ramp_step (obj , freq_rise_time , ...
input_rise_time , burn_amplitude ,...
hole_freq_offset , wait_freq_offset ,output ,MEMS ,0);
burn_post.num_loops = 1;
end
% this 0 for output channel ->
burn_loop = make_flat_step (obj , obj.max_flat_time , burn_amplitude , ...
hole_freq_offset ,output ,MEMS);
burn_loop.num_loops = num_loops ;
% don 't make an empty wait step
% this 0 for output channel ->
burn_remainder = make_flat_step (obj , remainder , burn_amplitude ,...
hole_freq_offset ,output ,MEMS);
burn_remainder.num_loops = 1;
if freq_rise_time > 0
burn_steps = [ burn_pre burn_loop burn_remainder burn_post ];
else
burn_steps = [ burn_loop burn_remainder ];
end

if remainder > 0

else
if freq_rise_time > 0
burn_steps = [ burn_pre burn_loop burn_post ];
else
burn_steps = burn_loop ;
end
end
else
burn_steps = make_full_burn_step (obj , freq_rise_time , ...
input_rise_time ,burn_time , burn_amplitude ,...
hole_freq_offset , wait_freq_offset ,output ,MEMS);
end
end
% make a trench burn step in 3 or 4 parts , looping the middle section if
% necessary (and possible having some remainder burn step), and calling
% and calling make_burn_trench_ramp_step for the start and end
function burn_steps = frac_n_make_burn_trench_step (obj , freq_mod_period , ...
input_rise_time ,burn_time , burn_amplitude ,...
trench_fraction )
% conditionally split the wait time into blocks of length obj.max_flat_time
actual_burn_time = round ( burn_time /( freq_mod_period /2))*( freq_mod_period /2);
if actual_burn_time ~= burn_time
warning ([ 'burn time input was ', num2str ( burn_time ), ...
' burn time actually used is ' num2str ( actual_burn_time )])
end
burn_time = actual_burn_time ;
freq_rise_time = freq_mod_period /2;

113
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904

if actual_burn_time < freq_mod_period
error ('burn time must be >= frequency modulation period ')
end
num_loops = floor (( burn_time - freq_mod_period )/ freq_mod_period );
odd_half_periods =mod( burn_time /( freq_mod_period /2) ,2);
burn_pre = make_burn_trench_ramp_step (obj , freq_rise_time , ...
input_rise_time , burn_amplitude ,...
trench_fraction ,1 ,0);
burn_pre.num_loops = 1;
if burn_time > 3* freq_rise_time
burn_loop = make_cosine_step (obj , freq_mod_period ,...
freq_mod_period , trench_fraction , burn_amplitude );
burn_loop.num_loops = num_loops ;
else
burn_loop = [];
end
if odd_half_periods
burn_post = make_burn_trench_ramp_step (obj , freq_rise_time , ...
input_rise_time , burn_amplitude ,...
trench_fraction ,0 ,1);
burn_extra_halfcos = make_cosine_step (obj , freq_mod_period /2, ...
freq_mod_period , trench_fraction , burn_amplitude );
burn_extra_halfcos.num_loops = 1;
burn_steps = [ burn_pre burn_loop burn_extra_halfcos burn_post ];
else
burn_post = make_burn_trench_ramp_step (obj , freq_rise_time , ...
input_rise_time , burn_amplitude ,...
trench_fraction ,0 ,0);
burn_post.num_loops = 1;
burn_steps = [ burn_pre burn_loop burn_post ];
end
end
% make a hole burn step , with rise and fall in one step
function burn_steps = make_full_burn_step (obj , freq_rise_time , ...
input_rise_time ,burn_time , burn_amplitude ,...
hole_freq_offset , wait_freq_offset ,output ,MEMS)
name = ['brn ' num2str ( freq_rise_time ) 'fqrs ,' ...
num2str ( input_rise_time ) 'inrs ,' ...
num2str ( burn_time ) 'tm ,' ...
num2str ( burn_amplitude ) 'brnpw ,' ...
num2str ( hole_freq_offset ) 'hofs ,' ...
num2str ( wait_freq_offset ) 'wofs '];
freq_rise_samples = freq_rise_time * obj.sample_rate ;
input_rise_samples = input_rise_time * obj.sample_rate ;
burn_samples = round ( burn_time * obj.sample_rate );
amp_wave = [ zeros (1, freq_rise_samples - input_rise_samples ),...
burn_amplitude * (0:1/( input_rise_samples -1) :1) ,...
burn_amplitude * ones (1, burn_samples ),...
burn_amplitude * (1: -1/( input_rise_samples -1) :0) ,...
zeros (1, freq_rise_samples - input_rise_samples )];
freq_wave = [ flat2flat_transition ( freq_rise_samples , ...
wait_freq_offset , hole_freq_offset ),...
hole_freq_offset *ones (1, burn_samples ),...
flat2flat_transition ( freq_rise_samples , ...
hole_freq_offset , wait_freq_offset )];
% zero for output_marker , scan_marker , sync_marker , MEMS_marker
Os = zeros (size( amp_wave ));
burn_steps = obj.make_generic_step (name , amp_wave , freq_wave , ...
output +Os , Os , Os , MEMS+Os);

114
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939

burn_steps.num_loops = 1;
end
% make a trench burn step in 3 parts , calling
% make_burn_trench_ramp_step for the start and end
function burn_steps = make_full_burn_step_trench (obj , freq_mod_period , ...
input_rise_time ,burn_time , burn_amplitude ,...
trench_fraction )
name = ['brn ' num2str ( freq_mod_period ) 'fqmp ,' ...
num2str ( input_rise_time ) 'inrs ,' ...
num2str ( burn_time ) 'tm ,' ...
num2str ( burn_amplitude ) 'brnpw ,' ...
num2str ( trench_fraction ) 'trfrc ,'];
actual_burn_time = round ( burn_time /( freq_mod_period /2))*( freq_mod_period /2);
if actual_burn_time ~= burn_time
warning ([ 'burn time input was ', num2str ( burn_time ), ...
' burn time actually used is ' num2str ( actual_burn_time )])
end
burn_time = actual_burn_time ;
odd_half_periods =mod( burn_time /( freq_mod_period /2) ,2);
input_rise_samples = input_rise_time * obj.sample_rate ;
burn_samples = ( burn_time * obj.sample_rate );
freq_mod_period_samples = freq_mod_period * obj.sample_rate ;
amp_wave = [ burn_amplitude * (0:1/( input_rise_samples -1) :1) ,...
burn_amplitude * ones (1, burn_samples ),...
burn_amplitude * (1: -1/( input_rise_samples -1) :0) ];
if odd_half_periods
freq_wave = [ zeros (1, input_rise_samples ),...
flat2flat_transition ( freq_mod_period_samples /2, ...
0, trench_fraction ),...
cos_freq_mod ( trench_fraction , freq_mod_period_samples , ...
burn_samples - freq_mod_period_samples ),...
flat2flat_transition ( freq_mod_period_samples /2, ...
-trench_fraction ,0) ,...
zeros (1, freq_rise_samples - input_rise_samples )];
else
freq_wave = [ zeros (1, input_rise_samples ),...
flat2flat_transition ( freq_mod_period_samples /2, ...
0, trench_fraction ),...
cos_freq_mod ( trench_fraction , freq_mod_period_samples , ...
burn_samples - freq_mod_period_samples ),...
flat2flat_transition ( freq_mod_period_samples /2, ...
trench_fraction ,0) ,...
zeros (1, freq_rise_samples - input_rise_samples )];
end

940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969

% zero for output_marker , scan_marker , sync_marker , MEMS_marker
Os = zeros (size( amp_wave ));
burn_steps = obj.make_generic_step (name , amp_wave , freq_wave , ...
obj.output_block +Os , Os , Os , ...
obj.MEMS_block_output +Os);
burn_steps.num_loops = 1;
end
% the rise or falling side of a pulse used to burn a spectral hole. Frequency
% is constant while amplitude increases or decreases according to up_not_down
function burn_step = make_burn_ramp_step (obj , freq_rise_time , ...
input_rise_time , burn_amplitude ,...
hole_freq_offset , wait_freq_offset ,output ,MEMS , up_not_down )
name = [ num2str ( freq_rise_time ) 'fqrs ,' ...
num2str ( input_rise_time ) 'inrs ,' ...
num2str ( burn_amplitude ) 'brnpw ,' ...
num2str ( hole_freq_offset ) 'hofs ,' ...
num2str ( wait_freq_offset ) 'wofs '];

115
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035

freq_rise_samples = freq_rise_time * obj.sample_rate ;
input_rise_samples = input_rise_time * obj.sample_rate ;
amp_wave = [ zeros (1, freq_rise_samples - input_rise_samples ),...
burn_amplitude * (0:1/( input_rise_samples -1) :1) ];
freq_wave = flat2flat_transition ( freq_rise_samples , ...
wait_freq_offset , hole_freq_offset );
% output gate , sync , and scan marker are both zero for burn pulses
Os = zeros (size( amp_wave ));
if up_not_down
burn_step = obj.make_generic_step (['brn -up' name], amp_wave , freq_wave ,...
output +Os , Os , Os , MEMS+Os);
else
burn_step = obj.make_generic_step (['brn -dwn ' name], ...
fliplr ( amp_wave ), fliplr ( freq_wave ), ...
output +Os , Os , Os , MEMS+Os);
end
burn_step.num_loops = 1;
end
% the rise or falling side of the long pulse used to burn a wide spectral
% hole , or trench. Frequency is varied sinusoidally while amplitude
% increases or decreases according to up_not_down
function burn_step = make_burn_trench_ramp_step (obj , freq_rise_time , ...
input_rise_time , burn_amplitude ,...
trench_fraction , up_not_down ,odd)
name = [ num2str ( freq_rise_time ) 'fqrs ,' ...
num2str ( input_rise_time ) 'inrs ,' ...
num2str ( burn_amplitude ) 'brnpw ,' ...
num2str ( trench_fraction ) 'trfr ' ...
num2str ( up_not_down ) 'und ,' ...
num2str (odd) 'odd '];
freq_rise_samples = freq_rise_time * obj.sample_rate ;
input_rise_samples = input_rise_time * obj.sample_rate ;
if freq_rise_samples < input_rise_samples
error (['freq_rise_samples (' num2str ( freq_rise_samples ) ...
') must be greater than input_rise_samples (' ...
num2str ( input_rise_samples ) ')'])
end
amp_wave = [ burn_amplitude * (0:1/( input_rise_samples -1) :1) ,...
burn_amplitude * ones (1, freq_rise_samples - input_rise_samples )];
freq_wave = flat2flat_transition ( freq_rise_samples , ...
0, trench_fraction );
% output gate , sync , and scan marker are both zero for burn pulses
Os = zeros (size( amp_wave ));
if up_not_down
burn_step = obj.make_generic_step (['brn -up' name], ...
amp_wave , freq_wave , obj.output_block +Os , Os , Os , ...
obj.MEMS_block_output +Os);
elseif ~ up_not_down && ~odd
burn_step = obj.make_generic_step (['brn -dwn ' name], ...
fliplr ( amp_wave ), fliplr ( freq_wave ), ...
obj.output_block +Os , Os , Os , obj.MEMS_block_output +Os);
elseif ~ up_not_down && odd
burn_step = obj.make_generic_step (['brn -dwn ' name], ...
fliplr ( amp_wave ), -fliplr ( freq_wave ), ...
obj.output_block +Os , Os , Os , obj.MEMS_block_output +Os);
end
burn_step.num_loops = 1;
end
% send a pair of burn pulses ; used for acuumulated / Fourier atomic frequency combs
function burn_steps = make_burn_pair_step_loop (obj , burn_amplitudes , ...
burn_times , wait_times , num_burn_loops , ...
freq_rise_time , input_rise_time , ...
hole_freq_offset , wait_freq_offset )
% takes up sum( burn_times ) + wait_times (1)+ wait_times (2) and loops ...
num_burn_loops times
name = ['b' num2str ( freq_rise_time ) 'fqrs ' ...

116
num2str ( input_rise_time ) 'inrs ' ...
num2str ( burn_times (1)) ',' ...
num2str ( burn_times (2)) 'tm' ...
num2str ( burn_amplitudes (1)) ',' ...
num2str ( burn_amplitudes (2)) 'amp ' ...
num2str ( hole_freq_offset ) 'hofs ' ...
num2str ( wait_freq_offset ) 'wofs ' ...
num2str ( wait_times (1)) ',' ...
num2str ( wait_times (2)) 'wt'];

1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102

input_rise_samples = input_rise_time * obj.sample_rate ;
burn_samples = burn_times * obj.sample_rate ;
wait_samples = wait_times * obj.sample_rate ;
if hole_freq_offset == wait_freq_offset
freq_rise_samples = 0;
else
freq_rise_samples = freq_rise_time * obj.sample_rate ;
end
% wait , transition to fully open when the frequency hits the target
% burn the first pulse , come back down , wait , rise back up again
% burn the second pulse , come down again
amp_wave = [ zeros (1, freq_rise_samples - input_rise_samples ), ...
burn_amplitudes (1) * (0:1/( input_rise_samples -1) :1) ,...
burn_amplitudes (1) * ones (1, burn_samples (1)), ...
burn_amplitudes (1) * (1: -1/( input_rise_samples -1) :0) ,...
zeros (1, wait_samples (1) -2* input_rise_samples ), ...
burn_amplitudes (2) * (0:1/( input_rise_samples -1) :1) , ...
burn_amplitudes (2) * ones (1, burn_samples (2)), ...
burn_amplitudes (2) * (1: -1/( input_rise_samples -1) :0) ,...
zeros (1, wait_samples (2) -freq_rise_samples - input_rise_samples )];
if hole_freq_offset == wait_freq_offset
freq_wave = hole_freq_offset * ones(size( amp_wave ));
else
freq_wave = [ flat2flat_transition ( freq_rise_samples , wait_freq_offset , ...
hole_freq_offset ), ...
hole_freq_offset *ones (1, burn_samples (1)+ wait_samples (1)+ burn_samples (2)), ...
flat2flat_transition ( freq_rise_samples , hole_freq_offset , wait_freq_offset ), ...
wait_freq_offset *ones (1, wait_samples (2) -2* freq_rise_samples )];
end
% zero for output_marker , scan_marker , sync_marker , MEMS_marker
Os = zeros (size( amp_wave ));
burn_steps = obj.make_generic_step (name , amp_wave , freq_wave , ...
obj.output_block +Os , Os , Os , obj.MEMS_block_output +Os);
burn_steps.num_loops = num_burn_loops ;
end
% burn an atomic frequency comb in a piecewise manner ( stepping frequency
% between teeth ).
function burn_steps = make_stepNburn_step_loop (obj , burn_amplitude ,...
burn_time , wait_time , num_teeth , num_burn_loops ,...
freq_rise_time , input_rise_time , hole_freq_offset ,...
teeth_range , wait_freq_offset )
name = ['b' num2str ( num_teeth ) 'teeth ' ...
num2str ( teeth_range (1)) ',' ...
num2str ( teeth_range (2)) 'tr ' ...
num2str ( freq_rise_time ) 'fqrs ' ...
num2str ( input_rise_time ) 'inrs ' ...
num2str ( burn_time ) 'tm' ...
num2str ( burn_amplitude ) 'amp ' ...
num2str ( hole_freq_offset ) 'hofs ' ...
num2str ( wait_freq_offset ) 'wofs ' ...
num2str ( wait_time ) 'wt'];
if freq_rise_time < wait_time
error (['freq_rise_time (time from 0 to first freq) must '...
'be longer than the first value in wait_time (time '...

117
'to transition frequency between steps )'])

1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125

1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168

end
input_rise_samples = input_rise_time * obj.sample_rate ;
burn_samples = burn_time * obj.sample_rate ;
wait_samples = wait_time * obj.sample_rate ;
freq_rise_samples = freq_rise_time * obj.sample_rate ;
% amplitude waits freq_rise_samples , and then alternates being on for
% burn_samples and being off for wait_samples , rising with input - rise_samples
% each time.
amp_rect = [ burn_amplitude * (0:1/( input_rise_samples -1) :1) ,...
burn_amplitude * ones (1, burn_samples ),...
burn_amplitude * (1: -1/( input_rise_samples -1) :0) ,...
zeros (1, wait_samples )];
amp_wave = [ zeros (1, freq_rise_samples ), repmat (amp_rect , 1, num_teeth ),...
zeros (1, freq_rise_samples - wait_samples )];
% frequency rises with freq_rise_samples to the first step , and then
% alternates waiting burn_samples and stepping in wait_samples to the next
% value using flat2flat_transition
if num_teeth > 1
teeth_freqs = ...
( teeth_range (1): range ( teeth_range )/( num_teeth -1): teeth_range (2)) + ...
hole_freq_offset ;
else
teeth_freqs = hole_freq_offset ;
end
freq_steps = num2cell ( meshgrid ( teeth_freqs , ...
1:( burn_samples +2* input_rise_samples )) ,1);
freq_moves = arrayfun ( @flat2flat_transition , ...
[ freq_rise_samples , ...
wait_samples *ones (1, num_teeth -1) ,...
freq_rise_samples ],...
[ wait_freq_offset , teeth_freqs ], ...
[ teeth_freqs , wait_freq_offset ], ...
'UniformOutput ', false );
freq_wave = freq_moves {1};
for index = 1: num_teeth % let it grow , LET IT GROW !!!
freq_wave = [ freq_wave freq_steps { index }' freq_moves { index +1} ]; %#ok
end
% zero for output_marker , scan_marker , sync_marker , MEMS_marker
Os = zeros (size( amp_wave ));
burn_steps = obj.make_generic_step (name , amp_wave , freq_wave , ...
obj.output_block +Os , Os , Os , obj.MEMS_block_output +Os);
burn_steps.num_loops = num_burn_loops ;
end
% make a readout step for an AFC (i.e. burn comb once , read out many times ).
% The function makes this one step , while the code to loop the step is
% commented because repeating any step 40000 times seems to make the AWG ill
function readout_step = make_readout_step (obj , burn_amplitude ,...
burn_time , wait_time , freq_offset , output , num_loops )
% a readout step has the output open
name = ['read ' num2str ( burn_time ) 'tm' ...
num2str ( burn_amplitude ) 'amp ' ...
num2str ( wait_time ) 'wt' ...
num2str ( freq_offset ) 'fqofs ' ...
num2str ( num_loops ) 'numloops ' ];
burn_samples = burn_time * obj.sample_rate ;
wait_samples = wait_time * obj.sample_rate ;
amp_wave = burn_amplitude *[ ones (1, burn_samples ) zeros (1, wait_samples )];
freq_wave = freq_offset * ones(size( amp_wave ));
scan_marker = amp_wave >0;
sync_marker = [ones (1, burn_samples ) zeros (1, wait_samples )];
readout_step = obj.make_generic_step (name , ...
repmat (amp_wave ,[1 , num_loops ]) , ...

118
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233

repmat (freq_wave ,[1 , num_loops ]) ,...
repmat ( output *ones(size( amp_wave )) ,[1, num_loops ]) , ...
repmat ( scan_marker ,[1 , num_loops ]) ,...
repmat ( sync_marker ,[1 , num_loops ]) , ...
repmat ( obj.MEMS_pass_output *ones(size( amp_wave )) ,[1, num_loops ])); ...
readout_step.num_loops = 1;
% readout_step = obj.make_generic_step (name , amp_wave , freq_wave ,...
ones(size( amp_wave )), scan_marker , zeros (size( amp_wave )), ...
ones(size( amp_wave )));
% readout_step.num_loops = num_loops ;
end
% makes a step of length obj.trigger_time which triggers the MEMS switch and
% optionally triggers the sync_marker
function sync_trigger_step = make_sync_trigger_step (obj , wait_freq_offset )
name = ['sync_ ' num2str ( obj.trigger_time ) 'trigtime ,' ...
num2str ( wait_freq_offset ) 'wofs ,'];
trigger_samples = obj.sample_rate * obj.trigger_time ;
amp_wave = zeros (1, trigger_samples );
freq_wave = wait_freq_offset * ones(size( amp_wave ));
output_wave = ones(size( amp_wave ));
scan_marker = zeros (size( amp_wave ));
sync_marker = sync_to_on * ones (1, trigger_samples );
MEMS_marker = obj.MEMS_pass_output *ones (1, trigger_samples );
sync_trigger_step = obj.make_generic_step (name , amp_wave , ...
freq_wave , output_wave , scan_marker , sync_marker , MEMS_marker );
sync_trigger_step.num_loops = 1;
end
% makes a step that includes a square on the sync marker and a frequency scan
function scan_step = make_scan_n_triggersync_step (obj , freq_rise_time , ...
input_rise_time , ...
scan_time , scan_freq_range , scan_amplitude , ...
wait_freq_offset )
name = ['scn ' num2str ( freq_rise_time ) 'fqrs ,' ...
num2str ( input_rise_time ) 'inrs ,' ...
num2str ( scan_time ) 'tm ,' ...
num2str ( scan_freq_range ) 'scnrng ,'...
num2str ( scan_amplitude ) 'scnpw '...
num2str ( wait_freq_offset ) 'wofs '];
freq_rise_samples = freq_rise_time * obj.sample_rate ;
input_rise_samples = input_rise_time * obj.sample_rate ;
scan_samples = scan_time * obj.sample_rate ;
amp_wave = [ zeros (1, freq_rise_samples - input_rise_samples ) ...
scan_amplitude * (0:1/( input_rise_samples -1) :1) ,...
scan_amplitude * ones (1, scan_samples ),...
scan_amplitude * (1: -1/( input_rise_samples -1) :0) ...
zeros (1, freq_rise_samples - input_rise_samples )];
freq_wave = smooth_transition_scan (2* freq_rise_samples ...
+ scan_samples , scan_samples , scan_freq_range , wait_freq_offset );
output_wave = obj.output_pass *ones(size( amp_wave ));
scan_marker = [ones (1, floor ( length ( amp_wave )/2)) ...
zeros (1, ceil( length ( amp_wave )/2)) ];
trigger_samples = obj.trigger_time * obj.sample_rate ;
sync_marker = [ones (1, trigger_samples ), ...
zeros (1, length ( scan_marker )-trigger_samples )];
MEMS_marker = obj.MEMS_pass_output *ones(size( amp_wave ));
scan_step = obj.make_generic_step (name , amp_wave , freq_wave , output_wave , ...
scan_marker , sync_marker , MEMS_marker );
scan_step.num_loops = 1;
end
% breaks a single wait step into a looped shorter step and a remainder step
function wait_steps = frac_n_make_wait_step (obj , flat_time , freq_offset , output , MEMS)
if flat_time <= 0 % so that it doesn 't die for wait_time == rise_time /2
wait_steps = [];
else
% split the wait time into blocks of length obj.max_flat_time

119
num_loops = floor ( flat_time / obj.max_flat_time );
remainder = mod(flat_time , obj.max_flat_time );

1234
1235
1236
1237
1238

if num_loops > 0
wait_loop = obj.make_flat_step ( obj.max_flat_time , 0, ...
freq_offset ,output ,MEMS);
wait_loop.num_loops = num_loops ;
end

1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295

if remainder > 0
% don 't make an empty wait step
wait_remainder = obj.make_flat_step ( round (remainder ,10) , 0, ...
freq_offset ,output ,MEMS);
wait_remainder.num_loops = 1;
if num_loops > 0
wait_steps = [ wait_remainder wait_loop ];
else
wait_steps = wait_remainder ;
end
else
wait_steps = wait_loop ;
end
end
end
% a flat step is assumed to have 1 in the mems marker and 0 in the sync marker ,
% thus triggering neither. To actually trigger , use make_readout_step
function flat_step = make_flat_step (obj , flat_time , amplitude , freq_offset ,output ,MEMS)
name = ['flat ' num2str ( flat_time ) ',' ...
num2str ( amplitude ) 'amp ,' ...
num2str ( freq_offset ) 'frqofst '];
% flat_samples = round ( flat_time ) * obj.sample_rate ; %%%%%%% pretty sure this ...
was wrong
flat_samples = round ( flat_time * obj.sample_rate );
amp_wave = amplitude * ones (1, flat_samples );
output_wave = output * ones(size( amp_wave ));
freq_wave = freq_offset * ones (1, flat_samples );
scan_marker = zeros (size( amp_wave ));
sync_marker = zeros (size( amp_wave ));
MEMS_marker = MEMS*ones(size( amp_wave ));
flat_step = obj.make_generic_step (name , amp_wave , freq_wave , output_wave , ...
scan_marker , sync_marker , MEMS_marker );
end
% a flat step is assumed to have 1 in the mems marker and 0 in the sync marker ,
% thus triggering neither. To actually trigger , use make_readout_step
function cosine_step = ...
make_cosine_step (obj , cosine_time , freq_mod_period , freq_amplitude , amplitude )
name = ['cos ' num2str ( cosine_time ) ',' ...
num2str ( freq_amplitude ) 'trfr ,' ...
num2str ( amplitude ) 'amp '];
% flat_samples = round ( flat_time ) * obj.sample_rate ; %%%%%%% pretty sure this ...
was wrong
cosine_samples = cosine_time * obj.sample_rate ;
freq_mod_period_samples = freq_mod_period * obj.sample_rate ;
amp_wave = amplitude * ones (1, cosine_samples );
output_wave = obj.output_block * ones(size( amp_wave ));
freq_wave = freq_amplitude * cos (2* pi *(1: cosine_samples )/ freq_mod_period_samples );
scan_marker = zeros (size( amp_wave ));
sync_marker = zeros (size( amp_wave ));
MEMS_marker = obj.MEMS_block_output *ones(size( amp_wave ));
cosine_step = obj.make_generic_step (name , amp_wave , freq_wave , output_wave , ...
scan_marker , sync_marker , MEMS_marker );
end
% makes a step struct and , if it doesn 't already exist , uploads it to the AWG
function step = make_generic_step (obj , name , amp , freq , output , scan_marker , ...
sync_marker , MEMS_marker )
name = strrep (name , '0.', '.');

120
1296
if length (name) >=64
1297
error (['step name "' name '" is too long. ruh roh... );']);
1298
end
1299
if ~ obj.is_name_loaded (name)
1300
step.name = name;
1301
step.amp_wave = amp;
1302
step.freq_wave = freq;
1303
step.input_marker = amp >0;
% shows when input is on
1304
step.sync_marker = sync_marker ;
1305
step.scan_marker = scan_marker ;
1306
step.MEMS_marker = MEMS_marker ;
1307
step.output_wave = output ;
1308
step.output_marker = output >0; % shows when output_wave is on
1309
obj.upload_step (step)
1310
else
1311
step = obj.get_step_from_name (name);
1312
end
1313
end
1314
1315 %% utility commands
1316
1317
% determines if a step is loaded using the cell array of loaded steps
1318
function loaded = is_name_loaded (obj , name)
1319
loaded = false ;
1320
for loadedstep = obj.loaded_steps
1321
if ~ isempty ( loadedstep )
1322
loaded = loaded || strcmp (name , loadedstep {1} .name );
1323
end
1324
end
1325
end
1326
1327
% finds and returns the full step object for a given step name
1328
% using the cell array of loaded steps obj.loaded_steps
1329
function step = get_step_from_name (obj , step_name )
1330
for loadedstep = obj.loaded_steps
1331
if strcmp ( loadedstep {1} .name , step_name )
1332
step = loadedstep {1};
1333
break
1334
end
1335
end
1336
end
1337
1338
% loads the frequency and amplitude components into the AWG also
1339
% chooses which markers to load for each step currently set to
1340
% upload input_marker to marker2 and either scan or output
1341
% marker to amp&freq or output waves for marker 1, respectively
1342
function upload_step (obj , step)
1343
if length ( step.amp_wave )~= length ( step.input_marker ) || ...
1344
length ( step.amp_wave )~= length ( step.sync_marker ) || ...
1345
length ( step.amp_wave )~= length ( step.scan_marker ) || ...
1346
length ( step.amp_wave )~= length ( step.MEMS_marker )
1347
error (['Size mismatch on generated waveforms for ' ...
1348
step.name ' If you reached this using a '...
1349
'Sequence_loader function , you ''ve earned a '...
1350
'phone -a- friend : 949 -370 -0707.'])
1351
end
1352
1353
obj.loaded_steps { length ( obj.loaded_steps )+1} = step;
1354
obj.Awg_instance.create_waveform ( strcat ('a_',step.name ),...
1355
step.amp_wave , step.input_marker , step.sync_marker );
1356
obj.Awg_instance.create_waveform ( strcat ('f_',step.name ),...
1357
step.freq_wave , step.scan_marker , step.MEMS_marker );
1358
if obj.output_channel_on
1359
obj.Awg_instance.create_waveform ( strcat ('o_ ',step.name ),...
1360
step.output_wave , step.output_marker , step.input_marker );
1361
end
1362
obj.total_loaded_points = obj.total_loaded_points + ...
1363
length ( step.amp_wave )*(2+ obj.output_channel_on );

121
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423

if obj.verbose
if obj.output_channel_on
disp ([ '
uploaded amp ,freq ,& output for step: ' step.name ]);
else
disp ([ '
uploaded amp&freq for step: ' step.name ]);
end
end
end
% Adds steps by name to the end of the sequence. Assumes names are
% unique identifiers , and waveforms by those names have already been
% uploaded to the AWG
function append_to_sequence (obj , steps )
for step = steps
step_num = obj.Awg_instance.get_sequence_num_steps () +1;
obj.Awg_instance.set_sequence_num_steps ( step_num );
obj.Awg_instance.set_channel_waveform_seq_step ( obj.input_channel_num , ...
step_num ,[ 'a_' step.name ]);
obj.Awg_instance.set_channel_waveform_seq_step ( obj.freq_channel_num , ...
step_num ,[ 'f_' step.name ]);
if obj.output_channel_on
obj.Awg_instance.set_channel_waveform_seq_step ( obj.output_channel_num , ...
step_num ,[ 'o_' step.name ]);
end
assert ( isfield (step ,'num_loops '))
if step.num_loops ~= 1
obj.Awg_instance.set_channel_seq_step_loop_num (step_num , step.num_loops )
end
if obj.verbose
disp ([ '
appended step: ' step.name ' (loop:' num2str ( step.num_loops ) ')']);
end
pause (.5)
end
end
% causes the sequence to loop back to the first step after completing the last
function close_sequence_loop (obj)
num_steps = obj.Awg_instance.get_sequence_num_steps ();
obj.Awg_instance.set_sequence_step_goto (num_steps ,1);
end
% plot the loaded steps. A downsample factor of ~100 is recommended ,
% as the number of total points will likely be large.
function plot_handle = plot_current (obj , downsample_factor )
channel_a_waveform = [];
channel_b_waveform = [];
sync_marker_waveform = [];
input_marker_waveform = [];
scan_marker_waveform = [];
MEMS_marker_waveform = [];
channel_c_waveform = [];
output_marker_waveform = [];
for step = obj.current_steps
channel_a_waveform = [ channel_a_waveform downsample ( repmat ( step.amp_wave , ...
[1, step.num_loops ]) ,downsample_factor )]; %#ok
channel_b_waveform = [ channel_b_waveform downsample ( repmat ( step.freq_wave , ...
[1, step.num_loops ]) ,downsample_factor )]; %#ok
input_marker_waveform = [ input_marker_waveform ...
downsample ( repmat ( step.input_marker , ...
[1, step.num_loops ]) ,downsample_factor )]; %#ok
sync_marker_waveform = [ sync_marker_waveform ...
downsample ( repmat ( step.sync_marker , ...
[1, step.num_loops ]) ,downsample_factor )]; %#ok
scan_marker_waveform = [ scan_marker_waveform ...
downsample ( repmat ( step.scan_marker , ...
[1, step.num_loops ]) ,downsample_factor )]; %#ok
MEMS_marker_waveform = [ MEMS_marker_waveform ...
downsample ( repmat ( step.MEMS_marker , ...
[1, step.num_loops ]) ,downsample_factor )]; %#ok
if obj.output_channel_on

122
channel_c_waveform = [ channel_c_waveform ...
downsample ( repmat ( step.output_wave , ...
[1, step.num_loops ]) ,downsample_factor )]; %#ok
output_marker_waveform = [ output_marker_waveform ...
downsample ( repmat ( step.output_marker , ...
[1, step.num_loops ]) ,downsample_factor )]; %#ok

1424
1425
1426
1427
1428
1429
1430
1431
1432
1433

end
end
plot_handle = figure ();
total_samples = length ( scan_marker_waveform );
x = (1: total_samples )/ obj.sample_rate /1000* downsample_factor ;
plot(x, channel_a_waveform , x, channel_b_waveform , x, input_marker_waveform , x, ...
sync_marker_waveform , ...
x, scan_marker_waveform , x, MEMS_marker_waveform );
xlabel ('seconds ')
ylabel ('volts ')
if obj.output_channel_on
hold on
plot(x, channel_c_waveform , x, output_marker_waveform )
hold off
legend ('input open ', 'frequency offset ', 'RF switch ', 'sync marker ', 'scan ...
trigger ', ...
'MEMS trigger ', 'output wave ','Location ','SouthEast ');
else
legend ('input open ', 'frequency offset ', 'RF switch ', 'sync marker ', 'scan ...
trigger ', ...
'Location ','SouthEast ');
end

1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444

1445
1446
1447
end
1448
1449
% used to determine if rounding of samples due to division of total
1450
% time by sample rate will lead to rounding errors. If a warning is
1451
% given , check that you 're tolerant of the amount rounded.
1452
function check_rounding (obj , time_vector )
1453
for time = time_vector
1454
num_samples = time * obj.sample_rate ;
1455
if mod( num_samples ,1) ~=0
1456
warning ([ 'may be rounding value ' num2str (time) ' ms by ' ...
1457
num2str (time - round ( num_samples )/ obj.sample_rate ) ' ms'])
1458
end
1459
end
1460
end
1461
end
1462 end

B.3

Tunics TECL

1 % Tunics_TECL_obj.m
2 %
3 % Interface object to control a TUNICS PLUS SC External Cavity Diode Laser
4 % Built starting from lfm.m and the instrument control toolbox. Note that
5 % frequency commands are not completely implemented.
6 %
7 % more information on commands used in
8 % www.equipland.com / objects / catalog / product / extras /1520 _Photonetics_Tunics_PR_PRI_Manual.pdf
9 %
10 % usage :
11 %
laser_instance = Tunics_TECL_obj ('GPIB1 ::2::0:: INSTR ',0.5);
12 %
laser_instance.lase ();
13 %
laser_instance.set_wavelength_nm (1536 .45);
14 %
power = laser_instance.get_power_mW ();
15 %
laser_instance.lasing_off ();
16 %
laser_instance.close ();
17 %

123
18 % ETM 20150407
19
20 classdef ( ConstructOnLoad = true) Tunics_TECL_obj < handle
21
properties ( SetAccess = private )
22
Tunics_visa ;
23
pause_time =0 .5; % pause time after sending commands
24
end
25
methods
26
function obj = Tunics_TECL_obj (address , time_to_pause )
27
if nargin >= 1 % use the given address , if provided
28
if ~ ischar ( address )
29
address = 'GPIB1 ::2::0:: INSTR ';
30
disp ([ 'invalid address , using ' address ])
31
end
32
end
33
instruments = instrfind ('Type ', 'visa -gpib ', 'RsrcName ', address , 'Tag ', '');
34
35
if isempty ( instruments ) % Create the VISA -GPIB object if it does not exist
36
obj.Tunics_visa = visa('AGILENT ', address );
37
else
% otherwise use the object that was found.
38
fclose ( instruments );
39
obj.Tunics_visa = instruments (1);
40
end
41
42
fopen ( obj.Tunics_visa );
% Connect to instrument object , obj.
43
44
if nargin == 2 % use the given wait time , if provided
45
obj.pause_time = max (0.5 , time_to_pause );
46
end
47
end
48
function lase(obj)
49
fprintf ( obj.Tunics_visa , 'ENABLE ');
50
pause ( obj.pause_time );
51
end
52
function lasing_off (obj)
53
fprintf ( obj.Tunics_visa , 'DISABLE ');
54
pause ( obj.pause_time );
55
end
56
function close (obj)
57
fclose ( obj.Tunics_visa );
% Disconnect all objects.
58
end
59
% function start_sweep (obj)
60
fprintf ( obj.Tunics_visa , 'SCAN ');
61
% end
Useless : SCAN doesn 't work on this laser for some reason
62
function stop_sweep (obj)
63
fprintf ( obj.Tunics_visa , 'STOP ');
64
end
65
%% getters
66
function current = get_current_mA (obj)
67
query ( obj.Tunics_visa , 'I?');
68
current = fscanf ( obj.Tunics_visa );
69
end
70
function power = get_power_mW (obj)
71
query ( obj.Tunics_visa , 'P?');
72
power = fscanf ( obj.Tunics_visa );
73
end
74
function wavelength = get_wavelength_nm (obj)
75
query ( obj.Tunics_visa , 'L?');
76
wavelength = fscanf ( obj.Tunics_visa );
77
end
78
function freq = get_freq_GHz (obj)
79
query ( obj.Tunics_visa , 'f?');
80
freq = fscanf ( obj.Tunics_visa );
81
end
82
function is_lim = is_at_limit (obj)
83
query ( obj.Tunics_visa , 'LIMIT ?');
84
is_lim = fscanf ( obj.Tunics_visa );
85
end

124
86
%% setters
87
function set_const_power (obj) % varies current to reduce power noise
88
fprintf ( obj.Tunics_visa , 'APCON ');
89
pause ( obj.pause_time );
90
end
91
function set_const_current (obj) % sets constant current
92
fprintf ( obj.Tunics_visa , 'APCOFF ');
93
pause ( obj.pause_time );
94
end
95
function set_fine_scan (obj , delta_lambda )
96
fprintf ( obj.Tunics_visa , ['FSCL=' num2str ( delta_lambda , '%03 .1f ')]);
97
end
98
% function configure_scan_range_nm (obj , min_wavelength , delta_lambda , max_wavelength )
99
fprintf ( obj.Tunics_visa , ['Smin=' num2str ( min_wavelength , '%08.3f ') ]);
100
fprintf ( obj.Tunics_visa , ['Smax=' num2str ( delta_lambda , '%08.3f ') ]);
101
fprintf ( obj.Tunics_visa , ['Step=' num2str ( max_wavelength , '%04.3f ') ]);
102
% end
Useless : SCAN doesn 't work on this laser for some reason
103
function set_scan_dwell_sec (obj , dwell_time )
104
fprintf ( obj.Tunics_visa , ['Stime =' num2str ( dwell_time , '%03 .1f ')]);
105
end
106
function set_power_mW (obj , power )
107
fprintf ( obj.Tunics_visa , ['P=' num2str (power , '%05 .2f ')]);
108
pause ( obj.pause_time );
109
end
110
function set_current_mA (obj , current )
111
fprintf ( obj.Tunics_visa , ['I=' num2str (current , '%04 .1f ')]);
112
end
113
function set_wavelength_nm (obj , wavelength )
114
if wavelength <1450 || wavelength >1590
115
error ('wavelength out of range ')
116
else
117
fprintf ( obj.Tunics_visa , ['L=' num2str ( wavelength , '%08 .3f ')]);
118
end
119
pause ( obj.pause_time );
120
end
121
function set_frequency_GHz (obj , frequency )
122
fprintf ( obj.Tunics_visa , ['I=' num2str (frequency , '%08 .1f ')]);
123
end
124
end
125 end

B.4

Toptica DLC pro

1 % Toptica_DLCpro_obj.m
2 %
3 % Interface object to control a Toptica CTL and DLC Pro
4 % Built from Tunics_TECL_obj.m and the matlab instrument control toolbox
5 %
6 % DLCpro command reference on USB stick with laser manuals in the filecabinet
7 % copied to ~\ Documents \ Toptica documentation \1 _TOPTICA DLC pro
8 %
SOFTWARE_1.3.1 \1 _DOCUMENTATION \ Toptica_DLCpro -Command - Reference
9 %
10 % Most errors that arise seem to be caused by the read buffer not being
11 % cleared properly. In the event of something weird , try uncommenting
12 % that either the end of the constructor or changing set_n_confirm ()
13 %
14 % usage :
15 %
laser_instance = Toptica_DLCpro_obj ( '131 .215.48.207 ');
16 %
% or: Toptica_DLCpro_obj ('COM5 ');
17 %
laser_instance.lase ();
18 %
laser_instance.set_wavelength_nm (1536 .45);
19 %
power = laser_instance.get_power_mW ();
20 %
laser_instance.lasing_off ();
21 %
laser_instance.close ();

125
22 %
23 % ETM 20151016
24
25 classdef ( ConstructOnLoad = true) Toptica_DLCpro_obj < handle
26
properties ( SetAccess = private )
27
DLCpro_visa ;
28
bool_str = {'#f';'#t'}
29
end
30
methods
31
function obj = Toptica_DLCpro_obj ( address_str )
32
% Connect via USB
33
if strncmpi ( address_str , 'COM ' ,3) || strncmpi ( address_str , 'USB ' ,3)
34
instruments = instrfind ('Type ', 'serial ', 'Port ', address_str , 'Tag ', '');
35
36
if isempty ( instruments ) % Create the VISA - serial object if it does not exist
37
obj.DLCpro_visa = serial ( address_str );
38
else
% otherwise use the object that was found.
39
fclose ( instruments );
40
obj.DLCpro_visa = instruments (1);
41
end
42
% Connect via ethernet
43
else % check naively that address_str is IP -like (doesn 't check <255)
44
if regexp ( address_str ,'^(?:[0 -9]{1 ,3}\ .){3}[0 -9]{1 ,3}$')
45
instr_address = address_str ;
46
else
47
instr_address = '131 .215.48.207 '; % last I checked , this was it
48
warning ([ 'given address invalid , using ' instr_address ]);
49
end
50
obj.DLCpro_visa = tcpip ( instr_address , 1998) ;
51
end
52
fopen ( obj.DLCpro_visa );
% Connect to instrument object , obj.
53
54
fprintf ( obj.DLCpro_visa , '(param -set! ''echo #f)');
55
flushinput ( obj.DLCpro_visa );
56
flushoutput ( obj.DLCpro_visa );
57
58
% % debug code in case reading information fails
59
% echo = fscanf ( obj.DLCpro_visa );
60
% if echo ~= '0'
61
disp('echo off is acting funny ');
62
if strcmp (echo ,'(param -set! ''echo #f) ') == 1
63
disp('woah , boy. acting real funny -like ');
64
echo = fscanf ( obj.DLCpro_visa );
65
if echo ~= '0'
66
error ([' something went sideways. Should print 0 but got ' echo ])
67
end
68
end
69
fscanf ( obj.DLCpro_visa );
70
% end
71
72
% have some fun
73
fprintf ( obj.DLCpro_visa , '(exec ''buzzer : welcome "EEEE
EEEE
EEEE
AAA ...
HH EEEE
AAA HH EEEEEE
KKKK
KKKK
KKKK
LLL GG CCCC
AAA ...
GG EEEEEE ") ');
74
end
75
function close (obj)
76
fclose ( obj.DLCpro_visa );
% Disconnect all objects.
77
end
78
function start_sweep (obj)
% sweep using coarse ( motor ) scan
79
fprintf ( obj.DLCpro_visa , '(exec ''laser1 :ctl:scan: start )');
80
end
81
function stop_sweep (obj)
82
fprintf ( obj.DLCpro_visa , '(exec ''laser1 :ctl:scan:stop)');
83
end
84
function pause_sweep (obj)
85
fprintf ( obj.DLCpro_visa , '(exec ''laser1 :ctl:scan: pause )');
86
end
87
function resume_sweep (obj) % can only resume a paused sweep

126
88
89
90
91
92
93
94

95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149

fprintf ( obj.DLCpro_visa , '(exec ''laser1 :ctl:scan: continue )');
end
function sing(obj , song_num ) % you 're welcome
if( song_num ==1)
fprintf ( obj.DLCpro_visa , '(exec ''buzzer :play "AAAA
AA A AAAA CC B BB ...
A AAA A AAAAAA ")');
else
fprintf ( obj.DLCpro_visa , '(exec ''buzzer :play "EEEE
EEEE
EEEE
AAA ...
HH EEEE
AAA HH EEEEEE
KKKK
KKKK
KKKK
LLL GG CCCC
...
AAA
GG EEEEEE ")');
end
end
%% getters
function power = get_power_mW (obj)
fprintf ( obj.DLCpro_visa , '(param -ref ''laser1 :ctl: power :power -act)');
output = fscanf ( obj.DLCpro_visa );
power = str2double ( output (3: end -2));
end
function current = get_current_mA (obj)
fprintf ( obj.DLCpro_visa , '(param -ref ''laser1 :dl:cc:current -act)');
output = fscanf ( obj.DLCpro_visa );
current = str2double ( output (3: end -2));
end
function wavelength = get_wavelength_nm (obj)
fprintf ( obj.DLCpro_visa , '(param -ref ''laser1 :ctl: wavelength -act)');
output = fscanf ( obj.DLCpro_visa );
wavelength = str2double ( output (3: end -2));
end
function voltage = get_piezo_actual_voltage (obj)
fprintf ( obj.DLCpro_visa , '(param -ref ''laser1 :dl:pc:voltage -act)');
output = fscanf ( obj.DLCpro_visa );
voltage = str2double ( output (3: end -2));
end
function voltage = get_piezo_offset_voltage (obj)
fprintf ( obj.DLCpro_visa , '(param -ref ''laser1 :scan: offset )');
output = fscanf ( obj.DLCpro_visa );
voltage = str2double ( output (3: end -1));
end
function sweep_bounds = get_motor_sweep_bounds (obj)
fprintf ( obj.DLCpro_visa , '(param -ref ''laser1 :ctl:scan: wavelength - begin )');
sweep_start = fscanf ( obj.DLCpro_visa );
fprintf ( obj.DLCpro_visa , '(param -ref ''laser1 :ctl:scan: wavelength -end)');
sweep_end = fscanf ( obj.DLCpro_visa );
sweep_bounds = [ str2double ( sweep_start (3: end -2)) str2double ( sweep_end (3: end -2))];
end
function scale_factor = get_piezo_scaling_factor (obj)
fprintf ( obj.DLCpro_visa , '(param -ref ''laser1 :dl:pc:external - input : factor )');
string = fscanf ( obj.DLCpro_visa );
scale_factor = str2double ( string (3: end));
end
% returns if the system should tune the piezo with external input
% getting the right channel and a nontrivial tuning range
function enabled = get_external_piezo_enabled (obj)
external_enabled = query ( obj.DLCpro_visa , '(param -ref ...
''laser1 :dl:pc:external - input : enabled )');
input_factor = query ( obj.DLCpro_visa , '(param -ref ...
''laser1 :dl:pc:external - input : factor )');
input_channel = query ( obj.DLCpro_visa , '(param -ref ...
''laser1 :dl:pc:external - input : signal )');
enabled = strcmp ( external_enabled (3:4) , '#t') && ...
( str2double ( input_factor (3: end)) >0) && ...
isempty (find ([0 ,1 ,2 ,4]== input_channel ,1));
end
% accurately tune to a given frequency using a wavemeter
% needs debugging because the wavemeter failed before I finished
% function goto_freq_closedloop (obj , goto_freq_GHz , wavemeter_obj )
c = 299792458;
obj.set_wavelength_nm (c/ goto_freq_GHz );

127
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206

% end

volts_per_GHz = 10/2 .1; % going from 69V to 79V moved 2.1 GHz
actual_freq = wavemeter_obj.get_freq_GHz ();
pause (1);
while abs( actual_freq - goto_freq_GHz ) > 0.05
% dlambda = -c / f^2 * df
obj.set_piezo_voltage ( volts_per_GHz * c / goto_freq_GHz ^2 *...
(freq - wavemeter.get_freq_GHz ()) ...
+ obj.get_piezo_actual_voltage () );
pause (1);
actual_freq = wavemeter_obj.get_freq_GHz ();
pause (1);
end

%% setters
function set_const_power (obj)
fprintf ( obj.DLCpro_visa , '(param -ref ''laser1 :ctl:power - stabilization : enabled #t)');
end
function set_const_current (obj)
fprintf ( obj.DLCpro_visa , '(param -ref ''laser1 :ctl:power - stabilization : enabled #f)');
end
function configure_scan_range_nm (obj , min_wavelength , max_wavelength , speed , loop_sweep )
set_n_confirm (obj , ['(param -set! ''laser1 :ctl:scan: wavelength - begin ' ...
num2str ( min_wavelength , '%08 .3f ') ')']);
set_n_confirm (obj , ['(param -set! ''laser1 :ctl:scan: wavelength -end ' ...
num2str ( max_wavelength , '%08 .3f ') ')']);
set_n_confirm (obj , ['(param -set! ''laser1 :ctl:scan: speed ' num2str (speed , ...
'%08 .3f ') ')']);
set_n_confirm (obj , ['(param -set! ''laser1 :ctl:scan: continuous -mode ' ...
obj.bool_str {1+ loop_sweep } ')']);
set_n_confirm (obj , '(param -set! ''laser1 :ctl:scan: microsteps #t)');
end
function set_power_mW (obj , power )
set_n_confirm (obj , ['(param -set! ''laser1 :ctl:power - stabilization : setpoint ' ...
num2str (power , '%05 .2f ') ')']);
end
function set_current_mA (obj , current )
set_n_confirm (obj , ['(param -set! ''laser1 :dl:cc:current -set ' num2str (current , ...
'%04 .1f ') ')' ]);
end
function set_wavelength_nm (obj , wavelength )
% could read the limits from the laser , but I hardcoded it because I'm lazy
if wavelength <1460 || wavelength >1570
error ('wavelength out of range ')
else
set_n_confirm (obj , ['(param -set! ''laser1 :ctl: wavelength -set ' ...
num2str ( wavelength ) ')']);
end
end
function set_piezo_enable (obj , true_for_on )
set_n_confirm (obj , ['(param -set! ''laser1 :dl:pc: enabled ' ...
obj.bool_str {1+ true_for_on } ')']);
end
function set_piezo_voltage (obj , voltage )
set_n_confirm (obj , ['(param -set! ''laser1 :dl:pc:voltage -set ' num2str ( voltage ) ')']);
end
function set_piezo_dithering (obj , true_for_on )
set_n_confirm (obj , ['(param -set! ''laser1 :dl:pc:voltage -set - dithering ' ...
obj.bool_str {1+ true_for_on } ')']);
end
function set_piezo_external_channel (obj , front_channel_num )
set_n_confirm (obj , ['(param -set! ''laser1 :dl:pc:external - input : signal ' ...
num2str ( front_channel_num ) ')']);
end
function set_piezo_scaling_factor (obj , scaling_factor )
set_n_confirm (obj , ['(param -set! ''laser1 :dl:pc:external - input : factor ' ...
num2str ( scaling_factor ) ')']);

128
207
208
209

end
function set_piezo_external_control (obj , enable )
set_n_confirm (obj , ['(param -set! ''laser1 :dl:pc:external - input : enabled ' ...
obj.bool_str {1+ enable } ')']);
end

210
211
212
% internal set command that confirms
213
function set_n_confirm (obj , command_string )
214
value = query ( obj.DLCpro_visa , command_string );
215
if( value ~= '0')
216
error (['something didn ''t set correctly. instead got value : ' value ])
217
end
218
end
219
220
end
221 end

B.5

Tektronix Oscilloscope

1 % Tektronix_TDS2014B.m
2 %
3 % Interface object to control a Tektronix TDS2014B oscilloscope
4 % Built from a few sources
5 %
http :// www1.tek.com / forum / viewtopic.php ?f=6&t =3217
6 %
AWG2014 programmer manual from online saved in fgen_libraries
7 %
Jon 's implementation of the 2024c Tex mdd file readscope
8 %
9 % does not implement possible trigger commands
10 %
% to get list of settings that can be configured
11 %
set(osc)
12 %
% to get the current configuration of the oscilloscope
13 %
get(osc)
14 %
% configuring trigger (as example of setting up scope )
15 %
trigger_group = get(osc , 'Trigger ');
16 %
% use get command to read property
17 %
get( trigger_group , 'Slope ' );
18 %
% use set command to set.
19 %
set( trigger_group , 'Slope ', 'falling ');
20 %
% can get list of other properties using
21 %
get( trigger_group )
22 %
23 % usage :
24 %
scope_instance = Tektronix_AWG5014 ('USB0 ::0 x0699 ::0 x0368 :: C034313 ::0:: INSTR ');
25 %
scope_instance.set_channels_on ([1 ,1 ,0 ,1]);
26 %
scope_instance.set_num_averaging (2);
27 %
scope_instance.get_waveform (2); % channel 2
28 %
scope_instance.close (2);
29 %
30 % ETM 20151130
31
32 classdef ( ConstructOnLoad = true) Tektronix_TDS2014B < handle
33
properties ( SetAccess = private )
34
tds_obj ;
35
buffer_size ;
36
acq_obj ;
37
waveform_group ;
38
chan_obj ;
39
num_values = 2500;
40
channels_on ;
41
end
42
methods
43
function obj = Tektronix_TDS2014B ( address )
44

129
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112

if ischar ( address )
instr_address = address ;
else
instr_address = 'USB0 ::0 x0699 ::0 x0368 :: C034313 ::0:: INSTR ';
end
% Find a VISA -USB object.
instr_visa = instrfind ('Type ', 'visa -usb ', 'RsrcName ', instr_address , 'Tag ', '');
% % in case it doesn 't work , try this
% disconnect ( obj.tds_obj )
% delete ( obj.tds_obj )
% Create the VISA -USB object if it does not exist
% otherwise use the object that was found.
if isempty ( instr_visa )
instr_visa = visa('AGILENT ', instr_address );
else
fclose ( instr_visa );
instr_visa = instr_visa (1);
end
obj.tds_obj = icdevice ('tektronix_tds2014.mdd ', instr_visa );
% Connect device object to hardware.
connect ( obj.tds_obj );
obj.acq_obj = get( obj.tds_obj ,'Acquisition ');
wvfm_group = get( obj.tds_obj , 'Waveform ');
obj.waveform_group = wvfm_group (1);
obj.chan_obj = get( obj.tds_obj ,'Channel ');
for channel = 1:4
obj.channels_on ( channel ) = strcmp ( obj.chan_obj.State ( channel ),'on');
end
end
%% control
function close (obj)
disconnect ( obj.tds_obj );
delete ( obj.tds_obj );
end
% check every 100 ms to make sure the scope is not busy before
% continuing. Breaks after max_time_sec
function finish_last_command (obj , max_time_sec )
warning ('this command doesn ''t seem to work ')
for i=1: max_time_sec /10;
if ~ obj.tds_obj.Busy
return ;
end
pause (10)
end
warning ('command did not finish in allotted time ')
end
%% getters
function acq_settings = get_acquisition_settings (obj)
acq_settings = obj.acq_obj ;
end
function chan_settings = get_channel_settings (obj)
chan_settings = obj.chan_obj ;
end
function [X, Y] = get_waveform (obj , channel_nums )
if ~ isempty ( channel_nums )
if isscalar ( channel_nums )
[Y, X] = invoke ( obj.waveform_group , ...
'readwaveform ', ['channel ' num2str ( channel_nums )]);
else
if max( channel_nums ) >4 || min( channel_nums ) <1

130
113
error ('oh come on... channel numbers are 1-4')
114
end
115
Y = zeros ( obj.num_values ,4);
116
X = zeros ( obj.num_values ,4);
117
for channel_num = channel_nums
118
disp ([ 'sending in ->channel ' num2str ( channel_num ) '<-'])
119
[y, x] = invoke ( obj.waveform_group , ...
120
'readwaveform ', ['channel ' num2str ( channel_num )]);
121
Y(:, channel_num ) = y;
122
X(:, channel_num ) = x;
123
end
124
end
125
end
126
end
127
function channel_bits = get_channels_on (obj)
128
channel_bits = obj.channels_on ;
129
end
130
%% setters
131
function set_single_acquisition (obj)
132
set( obj.acq_obj ,'State ','run ')
133
set( obj.acq_obj ,'Control ','single ')
134
end
135
% number of frames to average
136
function set_num_averaging (obj , num_frames )
137
set( obj.acq_obj ,'NumberOfAverages ',num_frames )
138
end
139
function set_timebase_seconds (obj , time)
140
set( obj.acq_obj ,'Timebase ',time)
141
end
142
% delay between trigger and acquisition window
143
function set_timedelay_seconds (obj , time)
144
set( obj.acq_obj ,'Delay ',time)
145
end
146
% give a 'binary ' vector to turn channels on/off
147
function set_channels_on (obj , channel_bits )
148
if length ( channel_bits )==4
149
for channel_num = 1:4
150
if logical ( channel_bits ( channel_num ))
151
set( obj.chan_obj ( channel_num ),'State ','on');
152
else
153
set( obj.chan_obj ( channel_num ),'State ','off ');
154
end
155
end
156
obj.channels_on = channel_bits ;
157
else
158
error ('channel_bits must be 1x4 , setting all channels ');
159
end
160
end
161
function set_voltage_scale (obj , V, channel_nums )
162
for channel_num = channel_nums
163
set( obj.chan_obj ( channel_num ),'Scale ',V);
164
end
165
end
166
function set_voltage_position (obj , V, channel_nums )
167
for channel_num = channel_nums
168
set( obj.chan_obj ( channel_num ),'Position ',V);
169
end
170
end
171
172
end
173 end