Download Multi-Spectral Raman Gain in Dual

Document related concepts

Photon polarization wikipedia , lookup

Delayed choice quantum eraser wikipedia , lookup

Transcript
NORTHWESTERN UNIVERSITY
MULTI-SPECTRAL RAMAN GAIN IN DUAL-ISOTOPE RUBIDIUM VAPOR
A THESIS
SUBMITTED TO THE GRADUATE SCHOOL
IN PARTIAL FULFILLMENT OF THE REQUIREMENTS
for the degree
MASTER OF SCIENCE
Field of Electrical and Computer Engineering
By
Joseph E. Vornehm Jr.
EVANSTON, ILLINOIS
June 2005
ii
© Copyright 2005 by
Joseph E. Vornehm, Jr.
Abstract
Multi-Spectral Raman Gain in Dual-Isotope Rubidium Vapor
Joseph E. Vornehm Jr.
An experimental system is presented for generating and observing Raman gain in
neutral rubidium vapor. The development of a sophisticated, highly accurate detection
system for spectrally resolved photon counting is described as well. Experimental results
are given, including for both continuous-wave (CW) and pulsed excitation of the vapor
medium. Most interestingly, in dual-isotope rubidium vapor, a single pump laser excites
as many as eight spectral lines; these lines are explored through numerical simulation and
found to correspond to Stokes and anti-Stokes fields from each rubidium isotope, as well
as shifted variants of these lines due to the AC Stark effect. A conceptual theoretical
background is given initially, and a somewhat more detailed description of the theory is
added later. Additional experimental details are included in several appendices. The text
is written to be largely accessible to readers with an undergraduate education in
engineering or physics.
iii
To Meta
and Lili
with love
iv
Table of Contents
Acknowledgements.......................................................................................................... xiii
Chapter 1: Introduction ....................................................................................................... 1
1.1
Overview............................................................................................................. 1
1.1.2
Properties of Rubidium ............................................................................... 1
1.1.3
Energy Level Transitions............................................................................ 2
1.1.4
Three-Level Systems .................................................................................. 5
1.1.5
Rubidium D Line Transitions ..................................................................... 6
1.2
The Raman Effect ............................................................................................... 7
1.2.1
Stokes Generation ....................................................................................... 8
1.2.2
Anti-Stokes Generation............................................................................... 9
1.2.3
The Stimulated Raman Effect ..................................................................... 9
1.2.4
Optical Pumping ....................................................................................... 10
1.3
Applications of Raman Transitions .................................................................. 11
1.3.1
Quantum Memory..................................................................................... 11
1.3.2
Quantum Entanglement Generation.......................................................... 13
1.3.3
Other Experiments .................................................................................... 13
Chapter 2: Experiment Description .................................................................................. 23
2.1
2.1.1
Realization of a Raman System ........................................................................ 23
Phases of the Experiment.......................................................................... 25
v
vi
2.2
Phase I – Raman Gain....................................................................................... 26
2.2.1
Initial Setup............................................................................................... 26
2.2.2
The Fabry-Pérot Spectrum Analyzer ........................................................ 28
2.3
Phase II – Experimental Refinements............................................................... 30
2.3.1
Single Photon Detection ........................................................................... 30
2.3.2
Glass Raman Cell...................................................................................... 31
2.3.3
Magnetic Shielding ................................................................................... 34
2.4
Phase III – Pulsed Excitation ............................................................................ 36
2.4.1
Isotopically Pure Raman Cell ................................................................... 36
2.4.2
Pulsed Excitation Using AOMs ................................................................ 37
2.4.3
Glass Absorption Cell ............................................................................... 39
2.4.4
Photon Correlation and Photon Number Correlation................................ 39
2.5
Experimental Details......................................................................................... 41
2.5.1
Laser Frequency Generation and Tuning.................................................. 41
2.5.2
Vapor Cells ............................................................................................... 43
2.5.3
Absorption and Filtering ........................................................................... 46
2.5.4
Phase I, II, and III Details ......................................................................... 48
2.5.5
Other Modifications .................................................................................. 49
Chapter 3: The Detection System ..................................................................................... 70
3.1
Overview........................................................................................................... 70
3.2
Spectral Resolution of a Classical Signal ......................................................... 72
3.2.1
The Fabry-Pérot Spectrum Analyzer ........................................................ 73
vii
3.2.2
Neutral-Density Filter Wheels .................................................................. 74
3.2.3
The Classical Photodetector...................................................................... 74
3.2.4
The TDS 3012 Digital Oscilloscope ......................................................... 75
3.2.5
Computer Interfaces.................................................................................. 75
3.2.6
Performance .............................................................................................. 77
3.3
Spectral Resolution at Low Light Levels.......................................................... 77
3.3.1
The Photon-Counting APD....................................................................... 78
3.3.2
The SR400 Photon Counter ...................................................................... 81
3.3.3
The SR430 Scaler/Averager ..................................................................... 83
3.4
Pulsed Excitation and Pulse Control................................................................. 87
3.4.1
Pulse Generation ....................................................................................... 87
3.4.2
Photon Detection....................................................................................... 89
3.4.3
Performance .............................................................................................. 90
3.5
Computer Control of the Detection System...................................................... 91
3.5.1
GPIB ......................................................................................................... 91
3.5.2
LabVIEW.................................................................................................. 93
3.5.3
LabVIEW Execution................................................................................. 96
3.6
The Vapor Cell Experiment LabVIEW Program............................................ 101
3.6.1
User Interface.......................................................................................... 102
3.6.2
Data File Format ..................................................................................... 107
3.6.3
VI Internal Structure ............................................................................... 108
3.6.4
Performance ............................................................................................ 110
viii
3.7
Computer-Aided Analysis .............................................................................. 111
3.7.1
Data Import Commands.......................................................................... 112
3.7.2
Plotting and Analysis .............................................................................. 112
3.7.3
RS-232 Instrument Control..................................................................... 115
Chapter 4: Experimental Results .................................................................................... 126
4.1
Summary of Results........................................................................................ 126
4.2
Classical-Level Results................................................................................... 126
4.2.1
Anti-Stokes Generation at Classical Levels............................................ 126
4.2.2
Vapor Cell Absorption Spectra............................................................... 127
4.3
Spectrally Resolved Photon Counting ............................................................ 128
4.3.1
Multi-Spectral Raman Gain .................................................................... 129
4.3.2
Effects of Optical Pumping..................................................................... 131
4.3.3
Isotopically Pure Line Spectrum............................................................. 131
4.4
Pulsed Excitation ............................................................................................ 131
Chapter 5: Theory ........................................................................................................... 149
5.1
Raman Effect in an Atomic Ensemble............................................................ 149
5.2
Rabi Oscillations............................................................................................. 150
5.3
Collective Excitation Mode ............................................................................ 152
5.4
Entanglement Using the Raman Effect........................................................... 153
5.5
Photon Storage Using the Raman Effect ........................................................ 154
Chapter 6: Conclusion..................................................................................................... 156
6.1
Results and Validity........................................................................................ 156
ix
6.2
Future Direction .............................................................................................. 157
References....................................................................................................................... 158
Appendix A: APD Power Supply ................................................................................... 161
Appendix B: Fabry-Pérot Cavities.................................................................................. 163
Appendix C: LabVIEW Documentation......................................................................... 176
Appendix D: MATLAB Source Code ............................................................................ 191
List of Figures
Figure 1. A three-level system. ........................................................................................ 16
Figure 2. Rubidium absorption spectrum......................................................................... 17
Figure 3. Rubidium levels involved in D2 transitions. .................................................... 18
Figure 4. Relevant energy levels for the present experiment........................................... 19
Figure 5. Raman transitions. ............................................................................................ 20
Figure 6. A quantum memory experiment. ...................................................................... 21
Figure 7. Energy level structure for a quantum memory experiment. ............................. 22
Figure 8. Heat pipe cell diagram...................................................................................... 51
Figure 9. Acousto-optic modulator (AOM) schematic. ................................................... 52
Figure 10. Summary of the three experiment phases....................................................... 53
Figure 11. Phase I and II experiment diagram................................................................. 54
Figure 12. Relevant energy levels for the present experiment......................................... 55
Figure 13. Heating coil wrapping. ................................................................................... 56
Figure 14. Pulse timing diagram...................................................................................... 57
Figure 15. Energy level structure for pulsed excitation................................................... 58
Figure 16. Block diagram of experiment. ........................................................................ 59
Figure 17. Schematic diagram of Phase I and Phase II of the experiment. ..................... 60
Figure 18. Schematic diagram of Phase III of the experiment. ....................................... 61
Figure 19. Saturated absorption spectrum for rubidium. ................................................. 62
x
xi
Figure 20. Relative shift between pump and probe. ........................................................ 63
Figure 21. Heating coil wrapping. ................................................................................... 64
Figure 22. Magnetic shielding for glass vapor cells. ....................................................... 65
Figure 23. Location of polarizing beamsplitter cube performing primary polarization
filtering.............................................................................................................................. 66
Figure 24. Frequency spectrum used in Phase I and Phase II.......................................... 67
Figure 25. Frequency spectrum used in Phase III............................................................ 68
Figure 26. Typical absorption spectrum measurement. ................................................... 69
Figure 27. Detection system block diagram. ................................................................. 118
Figure 28. High voltage ramp distortion........................................................................ 119
Figure 29. Shielding for APD and fiber coupling lens. ................................................. 120
Figure 30. APD gate switching circuit........................................................................... 121
Figure 31. Fabry-Pérot ramp mirror image.................................................................... 122
Figure 32. Pulsed-mode excitation timing diagram....................................................... 123
Figure 33. APD dead time. ............................................................................................ 124
Figure 34. Vapor Cell Experiment VI front panel. ........................................................ 125
Figure 35. Stimulated Raman gain, FSR of 15 GHz...................................................... 134
Figure 36. 6.07 GHz beat note between Raman anti-Stokes line and probe line. ......... 135
Figure 37. Saturated absorption spectrum for mixed-isotope cell. ................................ 136
Figure 38. Absorption spectra for three vapor cells....................................................... 137
Figure 39. Population transfer with optical pumping. ................................................... 138
Figure 40. Single-photon, spectrally resolved trace showing multi-spectral gain. ........ 139
xii
Figure 41. Stokes (probe) vs. anti-Stokes intensity. ...................................................... 140
Figure 42. Light shift with increasing optical pump power........................................... 141
Figure 43. Simulation results compared to experimental results................................... 142
Figure 44. Stokes and anti-Stokes powers for different detunings. ............................... 143
Figure 45.
85
Rb spectrum with 27 GHz FSR. ................................................................ 144
Figure 46.
85
Rb cell lines. .............................................................................................. 145
Figure 47. Population decay after 0.5 ms optical pumping pulse.................................. 146
Figure 48. A typical pulse, as recorded by the APD...................................................... 147
Figure 49. Pulsed-mode excitation. ............................................................................... 148
Figure 50. A three-level system. .................................................................................... 155
Figure 51. Hard drive and ATX power connectors........................................................ 162
Figure 52. Schematic of a Fabry-Pérot cavity. .............................................................. 173
Figure 53. Important locations for analyzing cavity resonance..................................... 174
Figure 54. Transmitted light intensity for three values of F. ......................................... 175
Acknowledgements
The author gratefully acknowledges the guidance of his advisor, Dr. Selim M.
Shahriar, in the conception and writing of this text and the execution of the experiment
described herein, as well as for general tutelage in the fields of quantum mechanics and
quantum optics. The author would also like to acknowledge the assistance and support of
Dr. Gour S. Pati in understanding and conducting the experiment and providing the dayto-day assistance and friendship necessary for success in the academic environment. The
author thanks Dr. Prem Kumar and Dr. Mary R. Phillips for their supervisory role in the
development of this thesis. Finally, the author would like to thank his wife Modhumeta
and his daughter Liliana for their love, support, encouragement, and sustaining presence
during all of his work.
xiii
Chapter 1: Introduction
1.1 Overview
Optical Raman transitions in neutral atoms have many interesting quantum
mechanical properties. Such transitions are useful for carrying out experiments in
nonlinear optics, atomic and molecular optics, and quantum computing, among others.
The theory of such atom-matter interactions is mature [1]. While this theory is widely
believed to be correct, and experiments thus far have validated the theoretical models,
continued experimental verification is necessary to determine the accuracy of those
models. Experimentation is also needed to demonstrate the potential applications of
these effects, to discover the real-world obstacles to realization of theoretically predicted
systems, and to determine the limitations of operation of such systems.
1.1.2 Properties of Rubidium
Neutral rubidium atoms in a vacuum environment are particularly well-suited for
the study of Raman transitions. Individual atoms in a vacuum environment are
analytically simple systems, with few interactions to take into account. Rubidium is
plentiful, now believed to be the 16th most common element in the Earth’s crust [2].
Neutral rubidium atoms are not significantly affected by stray electric fields in the
laboratory environment, as ions would be. The energy level structure of rubidium atoms
1
2
lends itself favorably to the study of Raman transitions using near-infrared light, allowing
the use of highly accurate optical methods.
Naturally occurring rubidium consists of two isotopes: 85Rb, occurring with 72%
abundance, and 87Rb, occurring with 28% abundance [3].
85
Rb is stable, while 87Rb
exhibits β– decay with a half-life of 4.9×1010 years. Rubidium has one valence electron;
it is the second-most alkaline, second-most electronegative element, after sodium.
Similar to sodium, neutral rubidium is explosive when exposed to water (including
ambient moisture), rapidly forming rubidium dioxide (or rubidium superoxide) and
releasing hydrogen; the hydrogen is ignited by the intense heat of the reaction. Rubidium
must be kept under vacuum, and extreme care must be exercised when a cell containing
rubidium is emptied or loaded.
85
Rb has a nuclear spin of 5/2, and 87Rb has a nuclear
spin of 3/2 [2].
1.1.3 Energy Level Transitions
Every atom can exist in one of several energy levels. The possible energy levels
are determined by the internal structure of the atom. The primary origin of this structure
is the motion of the electrons around the nucleus, as well as the interactions between the
electrons and the nucleus and any interactions between the atom and external forces. The
actual energy level of the atom is mainly due to the kinetic energy of the electrons,
although several other important factors come into play. Put succinctly, the state of the
atom determines its energy level. More precisely, each state in which the atom is
permitted by its internal structure to exist is called an allowed state, and its corresponding
energy level is called an allowed level. Other states and levels are disallowed, meaning
3
that it is not physically possible for the atom to exist in such a state (or at such an energy
level). This important fact bears repeating: The atom may only exist in one of several
discrete states, each with a well-defined energy level.
When an atom’s electrons are moving in such a way that their combined energy
could be no lower, the atom is said to be in the ground state. If the energy level of the
atom is higher than the ground state energy, the atom is in an excited state. Some of the
atom’s allowed energy levels are not precisely the lowest-energy state but are very close
to it; these states are also considered ground states.
An atom can move from one state to another by absorbing or emitting a photon.
The photon’s energy must match the difference in energy levels between the two atomic
states. The change from one energy level to another is called a transition, or an allowed
transition. (Under certain circumstances, even if two energy levels are allowed, the
transition between them can be disallowed.) The photon energy is defined by its
frequency (or wavelength) via the equation E = hω = hc λ . E is the energy of the
photon, ω = 2π f is the radial frequency of the photon, c is the speed of light in a
vacuum, λ is the photon wavelength (also in a vacuum), h is Planck’s constant, and
h = h 2π . The process of absorbing and emitting photons is generally called scattering,
because photons can be re-emitted in different directions (and at different frequencies)
than they have when they arrive at the atom.
Consider an atom with a ground state and an excited state, and a difference E
between the energy levels of the two states; assume the ground-to-excited state transition
is allowed. When the atom is in the ground state and a photon approaches the atom, if the
4
energy of the photon matches the transition energy E , the atom will absorb the photon
and move into the higher energy excited state. This process is unsurprisingly called
absorption. If the atom is initially in the excited state when the photon approaches, the
photon causes the atom to emit a second, identical-wavelength photon, and the atom
returns to the ground state. This process is called stimulated emission. The incident
photon and emitted photon typically travel in the same direction, namely, the direction
the incident photon followed before it reached the atom. If the atom is left undisturbed in
an excited state for sufficiently long, then it will randomly decay into a lower-energy
state, emitting a photon of the appropriate wavelength in a random direction. This
process is called spontaneous emission; the average time the atom remains in the excited
state before decaying is called the excited state lifetime. The process of atomic energy
decay is related to a process called decoherence, and the excited state lifetime is related
to the decoherence time of the atom.
When the energy of the incoming photon matches the transition energy, the
photon is said to be resonant with the transition. If the frequency (or wavelength) of the
photon is very nearly but not exactly equal to the required frequency, the photon is said to
be detuned by a small frequency δ . Detuned photons can still cause transitions, but they
do so with a probability reduced roughly by the factor δ −1 ; these are usually called nonresonant transitions, in contrast with the resonant transitions, where δ = 0 . If the
detuning δ is extremely large, the atom is transparent to the photon; in other words, the
photon travels past the atom, and the atom and the photon do not interact.
5
When a resonant or detuned laser field is incident on an atom, many photons of
the same frequency are impinging on the atom. An atom will go through repeated cycles:
first, it absorbs a photon and moves to the excited state; next, stimulated emission causes
it to emit a photon and return to the ground state. These cycles are called Rabi
oscillations. The oscillation rate is lower for detuned fields than for resonant fields; one
can think of this as a result of the lowered probability that an atom is excited by a detuned
field.
1.1.4 Three-Level Systems
Figure 1 shows a typical energy level diagram for an atom with three levels. (For
the present discussion, an atom will suffice as a three-level system. It should be noted
that many other systems function quantum mechanically in the same manner.) Two of
the states, a and b , are ground states, with nearly equal energies. The upper level, c , is
the excited state. Using the Dirac notation prevalent in quantum mechanics, these states
are written as a , b , and c
The diagram is not to scale; typically, the energy
between the ground and excited states is 100 000 to 1 000 000 times as large as the
ground-state separation. We presume that the transitions from a to c and from b to
c are allowed. We also assume that the a to b transition is disallowed. Although
b is technically a higher-energy state than a , the energy level difference is so small
and the lifetime of b so great that an atom in state b will essentially never decay into
state a . Transitions may be disallowed for other reasons, but in this example, the
reason is simple convenience and scope of consideration. A three-level system is one
such as this where only three energy levels are considered. A lambda system, or Λ-
6
system, is a three-level system consisting of two ground states and one excited state, with
the two ground state-excited state transitions allowed and the ground state-ground state
transition disallowed. (It is called a Λ-system because the two allowed transitions
resemble the shape of the Greek capital letter lambda.)
An atom can be moved from state a to state b by way of state c as follows:
An atom in state a is excited to state c by absorbing a photon from a laser tuned to
the angular frequency Eac h . A second laser is also incident on the atom with frequency
Ebc h . Once the atom reaches state c , it is de-excited to state b by the second laser,
and it emits a photon with frequency Ebc h . Such a transition—from one level to
another by way of a third—is called a Raman transition. Note that the atom absorbed
one photon at frequency Eac h and emitted one photon at frequency Ebc h ; in effect,
one photon was converted from the higher to the lower frequency. This process is called
photon conversion or photon frequency conversion. In a collection of many atoms, such
as an atomic vapor, many atoms will cause photon conversion, and a fraction of the first
laser power will be converted into the second laser frequency. This conversion is known
as the Raman effect. The Raman effect has many uses in atomic and molecular optics,
both for studying fundamental properties of physics and for building interesting devices.
An experiment allowing the stimulation and observation of the Raman effect forms the
basis for many current experiments in atomic and molecular optics.
1.1.5 Rubidium D Line Transitions
The absorption spectrum of naturally occurring rubidium is shown in Figure 2.
This experiment is primarily concerned with the D2 transitions of 85Rb, occurring
7
between the 52S1/2 and 52P3/2 energy levels. These transitions are excited by absorbing
(or emitting) photons of 780 nm wavelength. The hyperfine interaction causes splitting
of the 52S1/2 ground state. For this experiment, the F = 2 and F = 3 hyperfine sublevels
are used, with a ground-state splitting of 3.0357 GHz. The 52P3/2 level has four hyperfine
sublevels, all spaced within approximately 1 GHz; however, due to Doppler broadening
of the vapor cell medium (discussed later), these four sublevels may be treated as a single
level. Thus, the two hyperfine 52S1/2 ground states and the 52P3/2 excited state form a
Λ-system, with the F = 2 to F = 3 transition disallowed, as shown in Figure 3.
One other transition sees extensive use in this experiment, and that is the D2
F = 2 transition of 87Rb between the 52S1/2 and 52P1/2 levels. This transition is also at
780 nm; in terms of frequency, it is approximately 1.22 GHz downshifted from the 85Rb
D2 F = 3 transition. Typically, the experiment employs optical beams that are reddetuned (downshifted) from the 85Rb D2 F = 3 transition by 1.1 GHz; the 87Rb D2
F = 2 transition readily absorbs these beams, since the detuning from that transition is
only 120 MHz [4]. Figure 4 shows a total picture of the relevant energy levels and
transitions.
1.2 The Raman Effect
In 1928, C. V. Raman discovered that a sample of material scattering light from
an intense, monochromatic source can produce scattered wavelengths other than that of
the source. This effect is called the Raman effect in his honor, and such scattering is
called Raman scattering. The Raman effect has since been studied in great detail. Two
8
variations of this effect exist: the spontaneous Raman effect and the stimulated Raman
effect.
1.2.1 Stokes Generation
To understand the operation of the Raman effect, consider the Λ-system shown in
Figure 5(a). Assume an atom is in state a and is part of a large ensemble of identical
atoms (say, a gas sample). Further, assume a laser field, called the pump field (or simply
pump), is incident on the ensemble. The pump field has frequency ω1 = ωac − δ , detuned
from the a – c transition by some amount −δ . If the atom and an incoming photon
interact, then the atom will tend not to transition to state c but instead move into state
b , emitting a photon at frequency ω2 = ωbc − δ = ω1 − ωab that is detuned from the b –
c transition by the same amount −δ . The intermediate energy level that is detuned by
−δ from b is called a virtual level. Although we say that the atom may not strictly
exist at that energy level, it behaves in some ways as though it does. In particular, photon
absorption and emission happen as if the atom existed at the virtual level for a brief time.
The net effects of this process are that the input photon at the frequency ω1 is converted
to an output photon at the frequency ω2 = ω1 − ωab and the atom is moved from state a
to state b . Since the output photon frequency ω2 = ω1 − ωab is lower than the input
frequency, the output photon is called a Stokes photon, and ω2 is called the Stokes
frequency. In an ensemble of many atoms, with a pump field of sufficient intensity and
proper frequency, enough atoms will demonstrate this effect that the Stokes field will be
noticeable.
9
1.2.2 Anti-Stokes Generation
If the atom is initially in state b when the photon approaches, then Figure 5(b)
applies. The photon will absorb a pump photon at frequency ω1 , transition to state a
via the virtual level, and emit a photon at frequency ω3 = ω1 + ωab . Since the emitted
photon is at a higher frequency than the input photon, the output photon is called an antiStokes photon, and ω3 is called the anti-Stokes frequency. The question of whether a
given atom generates Stokes or anti-Stokes light then depends on the energy level of the
atom at the time of photon arrival. If a material sample could be cooled to absolute zero,
all atoms would exist in their lowest-energy ground states. However, at temperatures
above absolute zero (such as room temperature), a material sample at thermodynamic
equilibrium has atoms in a distribution among available energy levels. In the case of the
atom represented by the three-level system in Figure 5, this means that a sample of these
atoms at room temperature has some atoms in state a and some in state b . The
number of atoms in b is smaller than the number in a by the Boltzmann factor
exp(− hωab kT ) , where k is the Boltzmann constant. At room temperature, then, an
incident pump at frequency ω1 would produce both Stokes and anti-Stokes radiation.
1.2.3 The Stimulated Raman Effect
As with spontaneous and stimulated emission, the Raman effect has both
spontaneous and stimulated varieties. With a single laser incident upon the sample at
frequency ω1 , the Stokes and anti-Stokes photons are emitted in random directions, and
the process is very inefficient. If, say, an additional laser at frequency ω2 , called the
probe, is shined on the sample (at the same point as the first laser), the Stokes conversion
10
process becomes very efficient, and the Stokes photons are emitted in the same direction
as the laser at frequency ω2 . A similar effect happens for anti-Stokes generation if the
probe laser is instead at frequency ω3 . (However, the anti-Stokes generation process is
less efficient than Stokes generation, for reasons discussed in [5].) Because of this strong
directionality, the stimulated Raman effect is often called the forward-scattered Raman
process. The intensity of the probe field is greater at the output of the sample (due to the
Raman effect) than at the input to the sample; this increase in the intensity of the probe
field is called Raman gain. Raman gain has been studied extensively in both theory and
experiment [6–9].
1.2.4 Optical Pumping
When only Stokes generation or only anti-Stokes generation is desired, another
efficiency question arises: A sample at room temperature will exhibit both Stokes and
anti-Stokes conversion, even under spontaneous Raman emission. How can one ensure
that little or no energy is converted from the pump field into the anti-Stokes field? The
answer lies in controlling the fraction of atoms of the sample in the states a and b
(called the population of states a and b ). This is done through a technique known as
optical pumping.
Consider an intense CW beam (or a very long pulse) tuned to frequency ωbc and
incident on the sample. After a long period of time, what will happen to the atoms in the
sample? Those in state b will be unaffected by the field. Those in state a will
transition from a to c . From state c , most atoms will be stimulated back down to
a again, and the process will repeat itself. However, a small fraction of atoms will
11
decay spontaneously into state b , where they will no longer be affected by the incident
field. Eventually, all of the atoms in the sample will be “pumped” into state b by the
optical field, and the population of state a will be zero—hence the name optical
pumping. (Throughout this text, “optical pump” will always be used to refer to the
optical pumping beam. Where clarification is necessary, “Raman pump” will be used to
refer to the pump beam used in the Raman excitation process.) Optical pumping can be
used when only a Stokes transition or only an anti-Stokes transition is desired.
1.3 Applications of Raman Transitions
1.3.1 Quantum Memory
A quantum computer, if such is to be fabricated, would naturally require some
sort of memory device for storing information; this device is usually referred to as a
quantum memory. As quantum computers rely on the quantum mechanical property of
entanglement to carry information and to perform their functions, it is necessary for this
quantum memory to be able to store entanglement. For example, it is widely believed
that a quantum computer would use photons for data transmission and atoms for data
storage. A quantum memory in this scheme would take a pair of entangled photons and
“store” them by using them to entangle two atoms in a memory cell. Later, these two
atoms could be stimulated to reproduce the original, entangled photons. Such a device
would be useful not only for quantum computing but also for studying the properties of
entanglement. Several schemes for implementing a quantum memory have been
12
presented in the literature [10]; the one presented here is believed to be the simplest and
most straightforward.
A diagram of such a quantum memory is shown in Figure 6. An energy level
diagram showing the operation of the quantum memory is shown in Figure 7. A small
glass cell containing neutral rubidium vapor acts as the quantum memory. A source of
entangled photons, as well as a series of control pulses from a laser, represents the
quantum computer attempting to store quantum information in the quantum memory and
retrieve the information later. The atoms in the vapor cell act as three-level systems,
having states a , b , and c . The atoms in the vapor cell have already been moved
into state b using optical pumping. The entangled photon (one of the entangled pair of
photons) arrives at the same time as the storage pulse, or “write” pulse, from the control
laser. The entangled photon causes a transition from b to c . The entangled photon is
now stored, entanglement properties and all. However, c is an excited state and is not
stable; after some time, it will decay to a lower-energy state. The storage pulse causes a
transition from c to a , putting the atom in a stable state. Because of the laws of
quantum mechanics, the atom is still in an entangled state, meaning the quantum
information from the original photon is still stored in the atom. Later, when the computer
wishes to retrieve the photon stored in the memory, the control laser sends a retrieval
pulse, or “read” pulse, into the vapor cell. The atom storing the photon sees the pulse, is
excited from a to c , and decays down to b , emitting the original, entangled photon.
When the read pulse arrives, other atoms in the vapor cell are in state b , meaning they
are transparent to the read pulse; in this way, a single photon can be stored in a large
13
ensemble of atoms. (In the actual experiment, the transitions excited are detuned from
c .)
1.3.2 Quantum Entanglement Generation
The same process used to fashion a quantum memory out of rubidium vapor can
also be used to create a source of entangled photons [11]. When an atom completes a
b – c – a Raman transition, it absorbs a photon of energy Ebc and emits a photon of
energy Eac . When it completes the reverse transition, it absorbs a photon of energy Eac
and emits a photon of energy Ebc . The photons emitted by the two Raman transitions are
entangled. Thus, the rubidium vapor cell, when stimulated this way, can act as a source
of entangled photons for other experiments, such as testing the quantum memory
described above.
1.3.3 Other Experiments
Many other experiments are based on the Raman effect and Raman transitions in
neutral vapor media. For example, electromagnetically induced transparency (EIT) is a
process whereby Raman transitions are excited in a medium such that the medium
becomes transparent to a narrow range of frequencies. Just as in the quantum memory
device, where optically pumped atoms in the b state are transparent to light at the
frequency Eac h , EIT produces a medium which, while under laser stimulation, allows
light of a certain narrow frequency to pass through transparently [12].
An EIT medium is also useful for so-called slow light experiments. In such
scenarios, the propagation of a single frequency of light through the medium is
14
dramatically slowed or even halted. Such an effect may be used to “store” a laser pulse.
Under different conditions, a medium may be placed in such a state that it demonstrates
fast light. Fast light, as one would expect, is the propagation of light over a narrow range
of frequencies at speeds greater than the speed of light in a vacuum. (Interestingly, it has
been shown that even in a fast light medium, information cannot be transmitted faster
than the speed of light.)
Communication within and between quantum computers also poses an interesting
problem that could potentially be solved using the systems described in this text.
Quantum information, in the form of entanglement, must be communicated using the
principles of teleportation. Detuned Raman transitions in three-level systems offer a
promising avenue for the implementation of real-world teleportation [13]. Some progress
has already been reported in this area [14–15].
Strong magnetic fields affect the internal structure of an atom. The Zeeman effect
causes an atom’s energy levels to shift (and even to split) in the presence of a magnetic
field. Because of this energy level shift, the frequencies of photons absorbed and emitted
by the affected atom change slightly. If this frequency shift is measured very precisely,
then a medium exhibiting the Raman effect can be used as a magnetometer.
All of these experiments are of great interest at present in the optics community.
Although the underlying theory is mature, the effects are not completely understood, and
much attention is given to their investigation and comprehension. Once the effects are
fully understood, many exciting and novel applications will be developed [16]. All of
these effects, however, require an experimental system for testing and observing the
15
Raman effect in a medium. The experimental system discussed in this text, while
primarily motivated by the quantum memory application discussed above, forms an
excellent platform for investigating all of the effects mentioned here.
16
c
Ebc = hωbc
Eac = hωac
b
a
Figure 1. A three-level system.
17
1
0.9
0.8
Transmission
0.7
0.6
0.5
0.4
85
Rb
F=2
87
Rb
F=2
0.3
85
Rb
F=3
0.2
0.1
0
1
2
3
4
5
frequency (GHz)
Figure 2. Rubidium absorption spectrum.
6
7
18
δ = 1.1 GHz
Figure 3. Rubidium levels involved in D2 transitions.
19
4
5P3/2(F')
Optical
Pump
Pump
Probe
Pump
F=2
~1.22 GHz
F=3
5S1/2(F)
6.8 GHz
3.0357 GHz
F=2
F =1
Rb85
Rb87
Figure 4. Relevant energy levels for the present experiment.
20
c
δ
c
δ
Anti-Stokes (ω3 )
Pump (ω1 )
Stokes (ω2 )
Pump (ω1 )
b
a
b
a
Figure 5. Raman transitions.
21
Optical Delay Line
Pulsed Source of
Entangled Photon Pairs
Coincidence
Monitor
PBS
SP
Readout Pulse (RP)
Quantum Memory
Storage Pulse (SP)
Figure 6. A quantum memory experiment.
RP
22
Storage:
Probe
Pump
B 1
A 0
Retrieval:
Probe
Pump
A 0
B 1
Figure 7. Energy level structure for a quantum memory experiment.
Chapter 2: Experiment Description
2.1 Realization of a Raman System
Rubidium atoms in some form are needed to observe Raman transitions. As
mentioned in the Introduction chapter, sealed glass cells containing neutral rubidium
under vacuum are commercially available. It is also possible to create a closed vacuum
system from heat pipes, a vacuum pump, and several grams of solid rubidium. A
diagram of the heat pipe cell is shown in Figure 8. Both the glass cell and the heat pipe
cell are heated to vaporize the rubidium; increasing the temperature of the cell causes an
increase in rubidium vapor density. In vapor form, the rubidium atoms are sufficiently
distant from each other to behave essentially as isolated atoms. Thus, neutral rubidium
vapor cells provide a convenient method for manipulating isolated rubidium atoms.
Lasers generate the photons absorbed by the rubidium atoms during energy level
transitions. While lasers produce essentially a single frequency of light, observation of
the desired frequencies may require several different frequencies of light. The
polarization of the laser light plays an important role in the experiment, so beam splitters,
wave plates, and polarizing filters are used to adjust the polarization of the beam. Lenses
are used to increase laser intensity where needed. To provide multiple laser frequencies,
a portion of the laser beam is diverted through an acousto-optic modulator (AOM), which
shifts the frequency of the beam and can pulse the beam, if desired.
23
24
Acousto-optic modulators (AOMs) are used to achieve pulsing and frequency
shifting. An AOM operated in CW mode consists of a laser input, a radio-frequency
(RF) sinusoidal input, and a diffracted, frequency-shifted laser output (see Figure 9). The
output laser frequency is shifted by an integer multiple of the frequency of the RF input;
different integer frequency multiples, as well as red- or blue-shifting, may be chosen by
using different spatial mode outputs from the AOM. A separate microwave frequency
counter indicates the exact frequency of the AOM RF sinusoidal input. Because the entry
and exit apertures of the AOM are so small, a focusing lens must be placed before the
AOM input, and a collimating lens must be placed at the AOM output. The output from
the laser is used to generate the optical pumping, write, and read pulses. To achieve
pulsed-mode operation, a RF switch is connected to the RF input of each AOM. The RF
switch pulses the beam by switching the RF input on and off based on a TTL control
pulse. The RF switch acts in essence like a mixer, gating the sinusoid on when the TTL
pulse is high and switching the sinusoid off when the TTL pulse is low. If CW-mode
operation is desired instead of pulsed operation, the RF switch may be driven by a TTL
high level.
The combination of AOMs and polarization-changing optical components, along
with the appropriate control circuitry for the AOMs, can produce any desired
combination of laser pulses or continuous-wave (CW) laser beams. With these tools, the
rubidium atoms in the vapor cell may be manipulated in any fashion. In order to verify
the behavior of the rubidium atoms and the effects of the incident light, a system is
needed to detect and characterize photons emitted by the rubidium atoms. The detection
25
system consists primarily of a single-photon-counting avalanche photodiode (APD),
along with an advanced array of detection electronics. A scanning Fabry-Pérot spectrum
analyzer provides spectral characterization of the output signals. A standard photodiode
for detecting higher-intensity signals is also available as part of the detection system.
A polarization- and frequency-selective filtering and absorption scheme protects
the sensitive detection electronics and blocks undesired signals. Polarization filtering is
performed using the same kinds of polarizing optics as in the generation of the incoming
light signals. Absorption filtering using the 87Rb D2 transition is carried out using
additional rubidium vapor cells, as discussed in the Energy Level Transitions subsection.
Although the signals to be absorbed are not precisely tuned to the 87Rb D2 transition, the
absorbing vapor is Doppler-broadened and absorbs signals over approximately a 1 GHz
band. The atoms in the rubidium vapor have a net kinetic energy and are moving in
random directions relative to each other and relative to the observer. Because of this
motion, the atoms each see a slightly different Doppler-shifted light frequency. As a
result, the absorbing rubidium vapor’s energy levels are effectively broadened from
narrow lines into ranges on the order of 1 GHz wide.
2.1.1 Phases of the Experiment
The experiment history can be delineated into roughly three different phases, each
motivated by a slightly different goal. The three phases moved sequentially, each phase
building successively on the progress and maturity of the prior phase. Phase I focused on
the observation and characterization of Raman gain in the vapor medium under CW
illumination. Phase II saw the evolution and refinement of experimental details to
26
increase accuracy and flexibility in the experimental setup. Phase III changed to a pulsed
excitation regime and new vapor cells. The results from Phases I and II are applicable to
both a fast-light gyroscope and a quantum memory, as discussed in the Applications of
Raman Transitions section, while Phase III is devoted specifically to developing a
quantum memory or quantum entanglement source. Figure 10 summarizes the three
experimental phases.
2.2 Phase I – Raman Gain
The first objective was to demonstrate Raman gain in the vapor cell medium.
Figure 11 shows an overview of the experiment. Two detuned CW beams, the pump
beam and the probe beam, illuminated a heat pipe vapor cell to excite the 85Rb D2 F = 2
and F = 3 transitions, as shown in Figure 12. The probe beam stimulated the F = 3
transition with a detuning of 1.1 GHz. The pump beam operated on the F = 2 transition
and was far detuned from the transition; the pump detuning was 1.1 GHz plus the ground
state splitting of 3.0357 GHz, or about 4.1 GHz total. Both beams were red-detuned, i.e.,
downshifted. Because the pump and probe detuning matched the ground state splitting,
the Raman effect could be observed between the two ground states. The goal was to see
gain in the probe beam; the pump, acting on the 87Rb D2 F = 2 transition, was absorbed
in a second heat-pipe vapor cell.
2.2.1 Initial Setup
The primary laser was tuned to the pump frequency, and the probe beam was
generated by passing a portion of the pump beam through a pair of AOMs each tuned to
27
1.51785 GHz, or half the ground state splitting. The pump was horizontally polarized,
and the probe was vertically polarized; a polarizing beamsplitter recombined the two
beams before they entered the Raman vapor cell. Later in the experiment, a horizontally
polarized, counter-propagating optical pump beam from a second laser, tuned to the 85Rb
D2 F = 3 transition, entered the Raman cell through another polarizing beamsplitter.
The third optical window on the heat pipe cell offered a view of the infrared fluorescence
inside the cell, which could be seen with an infrared viewer to verify proper operation of
the cell. A transverse optical pumping configuration was also attempted but was
ineffective, largely due to the geometry of the vapor cell and the difficulty of supplying
enough optical pump power to the active region inside the vapor cell.
Polarizing beamsplitters filtered out the Raman pump and optical pump beams to
a high degree and allowed the probe beam to pass through to the detector. The heat-pipe
absorption cell also absorbed both pump beams, allowing the probe to pass. (The
majority of the optical pump beam power was absorbed in the Raman cell, and the
polarization filtering and the absorption cell filtered out any leakage or scattering.) Later
in Phase I, the absorption cell was rearranged into a double-pass configuration to improve
absorption characteristics.
Initially, a photodetector connected to an oscilloscope formed the detection
system. The oscilloscope showed the amount of light incident on the detector. The
experiment was run once with only the Raman pump shining on the medium (i.e., with
the probe beam blocked), in order to determine the amount of background radiation
incident on the detector after filtering and absorption. The experiment was run a second
28
time with only the probe shining on the medium, to determine the amount of light in the
probe beam itself. Finally, the experiment was run once with both beams both beams
illuminating the vapor cell. Raman gain was verified by observing that the light level
with both beams active was higher than the sum of the individual detection levels; in
other words, with both beams on, some of the pump power was converted into light at the
probe frequency. The remainder of the pump was absorbed and not seen by the detector.
2.2.2 The Fabry-Pérot Spectrum Analyzer
As a second step, a scanning Fabry-Pérot cavity was added immediately before
the detector. A Fabry-Pérot cavity, also called a resonator, consists of two mirrors
separated by a small space and facing each other along the beam axis. Most light is
reflected back from the first mirror; however, the mirror is not perfectly reflecting, and a
small amount of light enters the cavity. If the wavelength of that light is an integer
multiple of the round-trip distance between the mirrors, the light resonates and is
ultimately transmitted through the cavity. In this way, the cavity acts like a narrowband,
wavelength-selective filter, where the wavelength passed by the cavity is a function of the
distance between the mirrors. In a Fabry-Pérot spectrum analyzer, a piezoelectric crystal
attached to one of the mirrors allows that mirror to be translated by an applied voltage.
The mirror scans back and forth, and the resonant wavelength of the cavity changes with
the mirror position. As the cavity scans across a range of wavelengths, the oscilloscope
records a trace of the output from the cavity; this trace shows the spectrum of the light
impinging on the cavity.
29
Adding the Fabry-Pérot cavity to the detection system allowed the collection of
spectral data and made the Raman gain process easier to observe and to measure. The
pump and probe frequencies appeared as separate lines on the spectrum. Because of this,
the absorption of the pump and the gain in the probe could be measured accurately and
independently.
A standard technique used in conjunction with Fabry-Pérot cavities is a locking
circuit. Fabry-Pérot cavities are extremely sensitive to vibration, and small changes in
the cavity mirror position produce sharp changes in the resonant wavelength of the cavity.
A locking circuit actively compensates for vibration by shifting the movable cavity
mirror slightly in response to vibrations detected. Locking often requires an extra beam
in addition to the locking circuitry. Two techniques, a DC side lock and a dithered lock
using a lock-in amplifier, were attempted during Phase I. Both kinds of locks were
successful in reducing the effects of vibration on the cavity and in stabilizing the
amplitude of the detected signal. The locked Fabry-Pérot cavity operated as a stable,
robust frequency-selective filter. However, it was determined that spectral resolution of
the signal was far preferable to detection of only a single frequency. Brief trials with a
locked Fabry-Pérot cavity revealed that laser intensity fluctuations contributed far more
variation to the light level than any vibrations in the Fabry-Pérot cavity. Additionally, it
was anticipated that scattering of the high-intensity locking beam would hamper
detection of extremely low-light signals. Thus, the idea of locking the Fabry-Pérot cavity
was abandoned.
30
2.3 Phase II – Experimental Refinements
Phase II saw several important refinements to the experiment established in Phase
I. Light levels were reduced until the experiment entered the single- and few-photon
regime, and a photon-counting system was introduced. The existing heat pipe Raman
cell was swapped for a glass vapor cell. The glass vapor cell was characterized and
proved to have both sufficient performance and highly desirable experimental
characteristics, and so a glass Raman vapor cell was used for the remainder of the
experiment. Finally, magnetic shielding was introduced to reduce the stray magnetic
fields picked up by the Raman cell.
2.3.1 Single Photon Detection
The first step in Phase II involved the use of lower light levels, which in turn
required a more sensitive detection system. A single-photon counting module replaced
the photodetector. The single-photon counting module is based on an avalanche
photodiode (APD), and it emits a short pulse every time a photon is detected. To ensure
accurate operation of the APD, the incident light was restricted to less than one million
incoming photons per second, or a light level of approximately 0.25 pW. The APD emits
discrete pulses, rather than a continuous voltage level, so the APD output was connected
to a dedicated photon counting device and to a scaler. The photon counter displays a
single number, namely, the number of photons counted in a second. The scaler counts
the number of photons detected over series of short, consecutive, equal-duration time
windows (or time bins) and then displays a graph of the photon count in each time bin.
Both devices require accurate, synchronized trigger signals, and both devices may be
31
operated under computer control or independently. The scaler also offers the option to
record data traces.
Data recorded from the photodetector-oscilloscope system and the APD-scaler
system were plotted and analyzed on a computer. The use of a computer offered a great
deal of analytical flexibility as well as the capacity to store an essentially unlimited
amount of historical data. Both features proved useful throughout the experiment. Thus,
Phase II established a detection system that could record single-photon or classicalintensity data with highly accurate time and spectral resolution and unlimited flexibility
in analysis.
At low light levels, the APD detected additional spectral lines that were not
visible in Phase I. While the probe line was still the strongest, several lines were seen
above and below the probe line. Extensive analysis and verification showed these lines
to be Stokes and anti-Stokes converted photons from both 85Rb and 87Rb. These lines
provide interesting effects that hinder some applications and help others.
2.3.2 Glass Raman Cell
Although the heat pipe cell provided a high-density vapor, heat pipe cells have
several features that make them experimentally difficult to handle. The cell must be
continually vacuum-pumped and water-cooled. It is large and unwieldy. Heating the
large, thick metal cell walls to vaporize the solid rubidium requires a lot of heat, and
hence a lot of electrical current; the cell heating coils were attached to a variable
transformer connected directly to line voltage. Line voltage itself provides a 60 Hz AC
magnetic field, which induces the Zeeman effect in the rubidium atoms, shifting the line
32
spectra slightly. Rubidium vapor is emitted from one arm of the cross-shaped heat pipe
cell into the center of the cross, so the rubidium atoms have a net velocity; this net
velocity tends to increase the Doppler broadening of the pump and probe lines. While
Doppler broadening is usually desirable for the absorption spectrum, sharp spectral lines
are important in the Raman cell. Even in the absorption cell, an excessively high degree
of Doppler broadening can be too much of a good thing. Finally, the heat pipe cell must
be reloaded with solid rubidium samples from time to time, as the vaporized rubidium is
eventually removed from the system by the vacuum pump. Solid, neutral rubidium is
extremely explosive and requires extreme care in handling, as discussed earlier.
A commercially available glass vapor cell solves many of these problems. The
glass cell is sealed, requiring no vacuum pump. The cell is cylindrical, approximately
2.5 cm in diameter and 6 to 8 cm long, making it much smaller than the heat pipe cell.
The cell is made of Pyrex glass, allowing it to be heated to sufficiently high temperatures
to increase the vapor density and vapor pressure, but the smaller cell requires less heat
and no cooling. Fiberglass-insulated heating wire is wrapped around the cell to form
heating coils; these heating coils can be connected to a DC power source, rather than to
stepped line voltage, since they require much less current. Glass vapor cells are
commercially available and do not need to be fabricated in the laboratory. A glass cell
will eventually lose its vapor and must be replaced; however, the cost of a single glass
cell is often much less than the cost of a single sample of solid rubidium to be loaded into
the heat pipe cell, and the glass cell lasts much longer. The glass cell has optical-quality
windows at either end, causing no beam distortion. Although the optical windows may
33
be coated with an anti-reflective coating, an uncoated glass cell was used for the
experiment, introducing a slight reflection of approximately 4%. (The glass cell windows
have a slight wedge angle to prevent further back reflections.)
The glass cell was originally supposed to have a vapor density too low to allow
observation of the desired effects. However, at this point in the experiment, the heat pipe
cell was replaced with the glass cell, and the Raman gain in the glass cell was observed.
It was found that, while the Raman gain was lower in the glass cell due to a lower vapor
density, the gain was sufficiently high to proceed with the experiment. (The additional
Stokes and anti-Stokes lines in both 85Rb and 87Rb were also present at power levels
roughly similar to those seen in the heat pipe cell.) The glass Raman cell thus
permanently replaced the heat pipe Raman cell in the experiment.
One aspect of the experiment made more difficult by the particular choice of glass
cell was optical pumping. Cross-propagating optical pumping was found to be effective,
as with the heat pipe cell. However, transverse optical pumping was made virtually
impossible by the cylindrical shape of the glass cell. Although cross-shaped glass cells
with four optical-quality windows are available commercially, the glass cell used in the
experiment at the time was cylindrical and had only two optical windows. A cylindrical
lens was used to focus the transverse optical pumping beam into a short line (as opposed
to a small circular spot, as with a typical spherical lens). Unfortunately, the side of the
glass cell, while appearing smooth to the eye, was not optically smooth and caused too
much deflection and distortion of the beam for transverse optical pumping to be effective.
34
2.3.3 Magnetic Shielding
The Zeeman effect had been observed in the heat pipe cell at times and was also
present in the glass cell, mainly due to the magnetic field induced by the current in the
heating coils. The allowed energy levels of an atom are primarily dictated by protonelectron interactions. The energy levels are resolved first in terms of the energy of the
electron’s orbit around the nucleus. Fine splitting of the energy levels is caused by the
electron spin (which induces a small magnetic field) interacting with the electron orbit.
Hyperfine splitting is accounted for by considering the tiny magnetic field due to nuclear
spin in addition to electron orbit and electron spin. An external magnetic field applied to
the atom will naturally cause further energy level splitting. This splitting due to an
external magnetic field is called the Zeeman effect.
The Zeeman effect is a nuisance in this experiment, as it broadens (and ultimately
splits) the pump and probe spectral lines. Even if the Zeeman effect were desired, the
experimentalist would want control over the magnitude and direction of the magnetic
field, probably using external magnetic coils. The heating coils of the cell must carry a
particular current to heat the cell to the proper temperature, and so the user may not use
the heating coils to vary the induced magnetic field. While Zeeman splitting was less
noticeable with the lower current used to heat the glass cell than with the high current
used with the heat pipe cell, the effect was still present to a small degree in the glass cell.
Additionally, stray magnetic fields (from sources other than the heating coils) can induce
Zeeman splitting in the rubidium vapor, although this proved not to be an issue in the
current experiment.
35
The first, and probably most important, step taken to reduce Zeeman splitting was
the bifilar winding of the heating coils. A diagram of the winding and wrapping of the
heating coils is shown in Figure 13. The heating coil was bent in half and twisted, much
like a twisted pair of communications wires. The magnetic field induced by the DC
current in the coil would then be concentrated between the two twisted conductors and
not outside the twisted coil. The twisted coil was then wrapped in a spiral fashion around
the cylindrical cell. With the heating coil so wrapped, the magnetic field inside the cell
due to the heating coil was found to be immeasurably small, even for large heating
currents.
The second step taken to reduce Zeeman splitting was the construction of
magnetic shielding. The shielding was constructed out of thin sheets of magnetic
shielding metal, and its shape can best be described as a cylinder fit snugly inside a box.
The box is rectangular with square ends, and holes are drilled in the shielding at several
points for cell mounting and to allow forward and transverse beam propagation. Two
anti-Helmholtz magnetic coils are also mounted inside the shielding to allow application
of a controlled magnetic field, although this feature has not been used thus far. The
shielding was found to be effective, and the field inside the shielding was immeasurably
small, even when the Earth’s magnetic field could be measured outside the shielding.
However, because the magnetic shielding is heavy and relatively unwieldy, and because
the laboratory environment is essentially free of strong magnetic fields, the magnetic
shielding is typically not used. Stray magnetic fields in the laboratory and the Earth’s
magnetic field have little or no observable effect on the vapor cell medium.
36
2.4 Phase III – Pulsed Excitation
Whereas Phases I and II used CW lasers to excite rubidium transitions, Phase III
moved to a pulsed excitation scheme. This phase of the experiment focused on the
applications of quantum memory and quantum entanglement generation using 85Rb. To
avoid the additional 87Rb spectral lines, which are a source of loss for this application, an
isotopically pure glass vapor cell containing only 85Rb vapor was obtained. After the
85
Rb Raman cell was put in place, the beam paths and AOMs were reconfigured to allow
pulsing of the beams entering the vapor cell. The pulses launched into the Raman cell are
a long optical pumping pulse and shorter “write” and “read” pulses. Optical pumping
from the second laser was done away with. When the heat pipe absorption cell was
found to absorb over too broad a frequency range, it was replaced with a glass absorption
cell (incidentally, the same glass cell that served as the Raman cell in Phase II). Finally,
the focus of the experiment has recently moved from spectral characterization to photon
correlation and photon number correlation, wherein the entangled nature of Ramangenerated photons may be demonstrated [17].
2.4.1 Isotopically Pure Raman Cell
For the applications specific to Phase III, the additional spectral lines due to 87Rb
interfere with the operation of the system and are considered a source of loss. For this
reason, a cross-shaped glass vapor cell containing isotopically pure 85Rb was obtained.
The cell geometry resembles two cylinders that intersect at their midpoints, one 8 cm
long, one 5 cm long, and both approximately 2 cm in diameter. Each of the four arms
ends in an optical-quality window, thus allowing for transverse optical pumping. Heating
37
coils were wrapped bifilarly around the cell as with the mixed-isotope cell. Once the
85
Rb cell replaced the mixed-isotope glass cell as the Raman cell, the 87Rb lines
disappeared, thus verifying the Phase II analysis of the origins of the spectral lines.
2.4.2 Pulsed Excitation Using AOMs
Figure 15(a) shows a diagram of the energy levels that ideally would be used in
pulsed excitation of the vapor medium. The optical pumping pulse is still tuned to the
Rb D2 F = 3 transition, pumping atoms into the F = 2 ground state; however, it now
85
co-propagates with the other beams, rather than being counter- or transverse-propagating.
The optical pumping pulse duration is on the order of 1 ms. When a photon is present in
the F = 2 mode, a far-detuned write pulse causes Raman transitions from F = 2 to
F = 3 and absorption of the F = 2 photon. A resonant or slightly detuned read pulse
excites a Raman transition from F = 3 back to F = 2 , and the atom re-emits the stored
photon in the process. The read pulse should be highly efficient and cause the read
transition with high probability. Both the write and the read pulse last approximately
1 µs . The delay from the optical pumping pulse to the write pulse is on the order of
1 µs , and the write-to-read delay is around 200 ns. All of the pulses must occur within
the optical pumping decoherence time, i.e., before the atoms optically pumped into the
F = 2 state experience decoherence and return to the F = 3 state. Figure 14 shows a
pulse timing diagram. (Decoherence in a vapor cell is largely due to collisions of atoms
and energy exchanges in collisions.)
Certain experimental difficulties make the level scheme pictured in Figure 15(a)
impractical. Most notably, the excitation pulses must be absorbed and not reach the
38
detector, while the Stokes and anti-Stokes signal photons must pass through. One
solution to this problem is shown in Figure 15(b). The optical pump is resonant and is
completely absorbed by 85Rb. The write pulse is detuned from the F = 2 transition by
4.1 GHz, the same amount as the Raman pump detuning in Phases I and II. The write
pulse is thus completely absorbed by 87Rb, while the Stokes photon is passed through the
absorption cell. The write pulse is also used as a read pulse; although it is detuned from
the F = 3 transition, it is still efficient enough to cause the read transition. The antiStokes photon is then detuned from the F = 2 transition by a sufficient amount not to be
absorbed. One drawback to this approach is that the read pulse, which causes a F = 3 to
F = 2 transition in atoms already pumped to the F = 3 state, will also cause a F = 2 to
F = 3 transition (i.e., a write transition) in atoms remaining in the F = 2 ground state.
This difficulty may be avoided by reducing the pulse powers, as discussed later, so that
only one atom is excited per pulse. A second option, shown in Figure 15(c), was also
considered. In this case, the optical pump frequency is used for the read pulse.
Unfortunately, in this case, the anti-Stokes photon is absorbed by the 85Rb F = 2
transition, as it is resonant at that frequency.
Initially, the pulse powers were high enough that several atoms make the
appropriate write and read transitions. However, the collective excitation mode
necessary for entanglement of vapor cells as macroscopic ensembles (discussed briefly in
the Theory chapter) requires that exactly one atom in the entire vapor be excited from the
F = 3 to the F = 2 state. Once the write and read transitions have been verified, the
39
pulse powers will be reduced until only, on average, less than one Stokes or anti-Stokes
photon was detected after each pulse.
2.4.3 Glass Absorption Cell
As the read transition used in Phase III is nearly resonant, it falls within the 87Rb
absorption spectrum in the highly Doppler-broadened heat pipe absorption cell. A heat
pipe cell was chosen as the absorption cell for the same reasons that a heat pipe cell was
originally chosen as the Raman cell, and it has all of the same advantages and drawbacks.
However, since the read signal was being absorbed, it was determined that a glass cell
would be used as the absorption cell. The glass cell used for absorption was the mixedisotope cell originally used in Phase II as the Raman cell. Once heated sufficiently, the
glass cell proved to be as effective as the heat pipe cell in absorbing the optical pump and
write pulses. The glass cell’s absorption lines were broad enough for proper absorption
of the excitation pulses but narrow enough to allow the signal to pass. Originally, the
heat pipe cell was left in the beam path and simply not heated, meaning no vapor was
present in the cell and the cell had virtually no effect on the beam. Once the glass vapor
cell proved more useful, the heat pipe cell was removed from the beam path entirely.
2.4.4 Photon Correlation and Photon Number Correlation
For the Raman vapor cell to work correctly as a quantum memory or quantum
entanglement source, the Stokes and anti-Stokes photons emitted during the write and
read pulses must be entangled. Entanglement is best demonstrated using a photon
correlation measurement, also called a start-stop experiment. The experiment works as
40
follows: In the single-atom excitation regime, when the write pulse is active, the singlephoton detector waits for a photon detection event. When the event occurs, an external
device begins counting the time until a second photon is detected. Under ideal
circumstances, the second photon detected will be the anti-Stokes photon generated by
the read pulse. However, photon emission is a random process; additionally, detector
noise and stray light may cause either the first or second detection event. To establish the
entanglement of the two photons, the experiment is run many times, and the distribution
of inter-photon arrival times is plotted. A strong peak in the distribution should occur
near the time between the write and read pulses, indicating that the majority of photons
are the Stokes-anti-Stokes pairs desired.
An additional experiment, called a number correlation experiment, is used when
the pulses are operated at a higher light level. In this case, many photons are generated
during each write and each read pulse. The majority of the photons detected, though,
should be the Stokes-anti-Stokes pairs desired, and so the number of photons detected
during the write pulse should be strongly correlated to the number of photons detected
during the read pulse. This experiment is performed by counting the number of photons
detected during the write pulse, separately counting the number of photons detected
during the read pulse, and then comparing the two numbers. However, in this case, the
read pulse may also generate write transitions, as discussed before, so the verification
process is somewhat more complicated.
Because the photon correlation and number correlation experiments perform
statistical measurements, they must be run for thousands or millions of repetitions before
41
results can be obtained. Computer control of experimental equipment is required for the
rapid experiment repetition rates and result aggregation required. Sophisticated pulsing
and synchronization are also used. More details about computer control and
synchronization are given in the chapter entitled The Detection System.
2.5 Experimental Details
The experimental layout consists conceptually of laser frequency generation and
tuning, vapor cells, absorption and filtering, and detection (see Figure 16). The
experimental details below are organized in that fashion, with the exception that specifics
of detection components are covered in The Detection System. Following the experiment
details are specific details about each phase of the experiment. A full schematic diagram
of the experiment in Phases I and II is shown in Figure 17. A diagram of the Phase III
experiment is shown in Figure 18.
2.5.1 Laser Frequency Generation and Tuning
The main laser is an optically pumped Coherent 899 titanium-doped sapphire
(Ti:Sapphire) ring laser tuned to output approximately 700 mW in continuous-wave
(CW) mode at a wavelength of 780.245 nm (verified by a Burleigh wavelength meter).
The Ti:Sapphire laser output is linearly polarized, has a linewidth of 1 MHz to 5 MHz,
and has a spot size of 2 mm. The pump laser is a Coherent Innova 400 water-cooled
argon ion CW-mode laser operating in multi-line visible spectrum (MLVS) mode at
approximately 12 W output power. The Ti:Sapphire laser can be tuned over a broad
frequency range and locked to a specific frequency by way of an attached reference
42
cavity. A small part of the laser output is diverted to a saturated absorption setup, a glass
rubidium vapor cell and a photodetector, so that the laser frequency can be locked
relative to any 85Rb or 87Rb D2 transition. Figure 19 shows the typical saturated
absorption spectrum. The laser may also be set to scan every 250 ms over a broad
frequency range, or an external voltage may control the laser frequency (although this last
feature is seldom used in the present experiment). The secondary laser used for optical
pumping in Phases I and II is an identical Coherent 899 Ti:Sapphire ring laser pumped by
an identical Coherent 400 argon ion laser; all other parameters of the secondary laser are
identical to those of the first, and the secondary laser also feeds a small saturated
absorption setup of its own.
AOMs perform frequency shifting and pulsing. A given AOM is rated for a
particular center frequency; diffraction efficiency and output laser power decrease as the
AOM is operated at a frequency farther and farther from the rated center frequency. For
example, the ground-state splitting in Phase I is provided by two 1.5 GHz AOMs
operating at 1.51785 GHz, which results in high diffraction efficiency. If 1.2 GHz AOMs
were operated at that frequency instead, the diffraction efficiency would be near zero,
resulting in virtually no laser power at the output of the AOM. Brimrose, Intra-Action,
Crystal Technology, and Isomet manufacture AOMs of the type used in the experiment;
available AOMs have center frequencies of 1.2 and 1.5 GHz, as well as 90, 200, and
270 MHz. Electronics are also needed to provide the RF signal needed to drive the AOM.
Typically, an AOM driver is used, which provides a tunable frequency source and an
appropriate power level for the AOM. In some cases, an AOM driver is fashioned from a
43
DC voltage source, a voltage-controlled oscillator (VCO), and an amplifier with an
appropriate bandwidth. In either case, the AOM driver is connected to the AOM through
a RF switch, which allows the AOM to be pulsed on and off. Figure 20 shows the
relative shift of the pump and probe beams using a cell absorption trace, indicating that
the AOMs are properly configured.
2.5.2 Vapor Cells
The vapor cell used in Phase I is a custom-made, vacuum-pumped heat pipe
rubidium vapor cell. The heat pipe cell is configured in a cross shape, with optical
quality windows on three arms and a heat pipe oven making up the fourth arm. The heat
pipe oven resembles a half-open section of pipe. The oven contains a 5 g ampoule of
neutral rubidium in its natural isotopic distribution, i.e., 72% 85Rb and 28% 87Rb . The
oven has a nozzle at the connection point with the rest of the cell. The input and output
light pass through the windows on the two arms adjacent to the oven. The third window,
opposite the oven, allows for observation of fluorescence inside the cell, which indicates
proper absorption. Heating coil (as in the case of the glass Raman vapor cell) is wrapped
tightly around the entire oven and attached to a variable transformer (variac) supplied by
120 VAC line voltage. The oven nozzle section has a separate heating coil with its own
variac, and a third heating coil and variac heat the pipe sections closest to the three
windows. Chilled water runs through copper tubing soldered to the cell midsection.
During operation, the windows and nozzle are heated highest, and the oven is heated only
slightly, to preclude rubidium condensation on (and clogging of) the optical windows and
oven nozzle. Typical temperatures are 420 K or less for the window sections, 420 K for
44
the nozzle, and 370 K for the oven. Higher temperatures are required when the rubidium
ampoule is nearly depleted. Vacuum pumping maintains the cell vacuum around
0.01 torr (around 1.33 Pa); vapor densities as high as approximately 1015 atoms cm3 can
be achieved. For Raman operation, the center of the cell is located at the focal point
between two lenses of 2.5 cm diameter with focal lengths 400 mm and 200 mm,
respectively. The cell is held in place by a series of circular clamps attached to optical
mounts.
Two glass vapor cells are used in the experiment, a mixed-isotope cell and an
isotopically pure 85Rb cell. The mixed-isotope cell is a sealed glass cylindrical cell
containing rubidium vapor under low vacuum, with optical-quality windows at either end
of the cell. The mixed-isotope vapor consists of a naturally-occurring distribution of
rubidium isotopes, i.e., 72% 85Rb and 28% 87Rb. The cell is cylindrical, 10 cm in length
and 2.5 cm in diameter, with optical-quality windows at either end. The windows have a
small wedge angle to prevent direct back-reflections of incoming laser beams. In the
85
Rb cell, the cell vapor is greater than 90% isotopically pure. The cell is cross-shaped;
its geometry is that of a 8 cm long cylinder intersected at its midpoint by a 5 cm long
cylinder, creating a cross-shaped container. Both cylinders are 2 cm in diameter and end
in optical-quality windows with small wedge angles. The shorter arms allow the use
transverse optical pumping beams. The vapor density can be as high as approximately
1012 atoms cm3 . For Raman operation, light is focused at the center of the glass cell, as
with the heat pipe cell. Each cell is glued to an optical mount and either mounted directly
on the optical table or placed inside a magnetic shielding box.
45
To increase the density of rubidium vapor within each glass cell, a heating coil is
wound around the cell and attached to a 0 A to 3 A DC current source. The coil consists
of nickel-chrome wire inside a braided fiberglass insulation sleeve of 2 mm diameter
(rated to house 16 AWG wire). The heating coil is wound bifilarly, as shown in Figure
21. A length of coil is cut and bent in half. The bend point is twisted until the entire
length of wire becomes like a twisted pair cable. The twisted coil is then wound in
solenoid fashion around the glass cell and tied in place at the ends of the cell using
copper wire. Some glass is left exposed near the center of the length of the cell to allow
the transverse optical pumping beam to enter the cell. It is important to note that
rubidium inside the vapor cell will tend to condense where the cell is coldest. As such, it
is important to wind the coils tightly near the window sections to reduce or prevent
rubidium condensation on the optical windows. (If any rubidium condenses on the
windows, proper heating can vaporize and remove the condensed metal.) During
operation, the cell is heated to a temperature of approximately 320 K by a DC current of
approximately 1.0 A.
The glass vapor cells can be mounted inside a somewhat complicated magnetic
shielding box, shown in Figure 22. The box itself is 16.5 cm long with 11 cm square
removable end caps; the box is made of two layers of 0.5 mm thick magnetic shielding
foil, and the end caps are made of three layers of 0.2 mm thick magnetic shielding foil.
The box fits snugly around a five-layer open-ended cylinder of 0.2 mm thick magnetic
shielding foil. The cylinder, in turn, fits snugly around a pair of identical anti-Helmholtz
coils, located at the ends of the cylinders. The anti-Helmholtz coils consist of 50 turns of
46
20 AWG enamel-coated copper wire wound around a light wooden former. The coils
allow for active cancellation or induction of magnetic fields, but the coils are not
currently used. Holes are drilled in the end caps to allow light to pass in and out of the
cell; a similar hole is drilled in the side of the box (and cylinder) to allow the transverse
optical pumping beam to enter the cell. A small hole is drilled in one end cap for the
mounting post. Tiny holes are drilled in the end caps for the leads from the antiHelmholtz coils.
A Gaussmeter was used to measure the magnetic field inside the cell. A magnetic
testing “cell” was fashioned out of an open-ended roll of paperboard of the same
dimensions as the glass cell; the paper cell was mounted on a similar optical mount and
wrapped in a second, identical heating coil. A hole was cut in the side of the paper cell to
allow the Gaussmeter probe to enter through the transverse optical pumping hole in the
shielding and measure the magnetic field in the center of the cell. After calibrating the
Gaussmeter and applying current to the heating coil, the magnetic field reads as less than
35 mG, or below the noise margin of the Gaussmeter.
2.5.3 Absorption and Filtering
In order to shield the detection setup from the strong laser pulses used in the
experiment, both polarization and frequency filtering are used. The photons of interest
are the photons emitted during the pump and probe transitions. Any other photons not
absorbed during the pump or probe transitions are considered noise and must be filtered
out before they reach the detector. Noise photons include optical pump, Raman pump,
47
and probe photons not absorbed by the Raman medium, as well as any photons scattered
by the medium or by the experimental optics.
Polarizing beamsplitter cubes provide the majority of the polarization filtering.
The optical pump and write pulse are horizontally polarized, and the read pulse is
vertically polarized. A 1 cm polarizing beamsplitter cube with an extinction ratio
measured at 30 dB acted as the primary polarizing filter, located just after the Raman
vapor cell (see Figure 23). Polarizing beamsplitters exhibit polarization mixing, whereby
a small component of horizontally-polarized light is mixed with the vertically-polarized
output and vice versa. Due to polarization mixing, the use of additional polarizing
beamsplitters will not increase the extinction ratio. After the absorption vapor cell
(discussed below), a polarizing filter is used to further ensure single polarization.
Because of the choice of energy levels, 87Rb is used as a frequency-selective
absorbing medium. The off-resonant D2 F = 3 transition in 85Rb closely matches the D2
F = 2 transition in 87Rb, making 87Rb an excellent absorber of the write pulse and any
scattered light from the optical pumping beam. A heat pipe rubidium vapor cell is used
in a double-pass configuration as the primary absorber. The absorption heat pipe cell is
identical to the Raman heat pipe cell. The double-pass configuration sends the beam
through the cell twice, using slightly different locations in the cell each time (so that the
same vapor atoms are not excited by the first and second passes). At the output of the
vapor cell, the beam polarization is rotated 90° by a half-wave plate; a polarizing
beamsplitter after the wave plate separates the second pass beam from the first, and
another before the cell input allows the first and second passes to be combined. Typical
48
temperatures for the cell heating are identical to those of the Raman heat pipe cell, i.e.,
420 K or less for the window sections, 420 K for the nozzle, and 370 K for the oven.
Under these conditions, absorption of the optical pumping and write beams is more than
70 dB.
2.5.4 Phase I, II, and III Details
Figure 24 shows the frequency spectrum used in Phase I. The laser frequency is
locked to the Raman pump frequency, or 1.1 GHz below the 85Rb F = 3 transition; the
optical pump laser is locked to the 85Rb F = 3 transition. The probe beam is generated
from the Raman pump beam by pair of 1.5 GHz AOMs, each operating at a frequency of
1.51785 GHz, or half of 3.0357 GHz. The AOMs operate in CW mode, i.e., the radio
frequency (RF) sinusoidal input to the AOM is not switched on and off. The Raman
pump and optical pump are horizontally polarized, and the probe is vertically polarized.
Since the goal of Phases I and II was to observe Raman gain in the probe, this choice of
polarizations allowed the use of polarization filtering. In Phase I, the Raman and
absorption vapor cells were both heat pipe cells with a shared vacuum pump and chilled
water connections.
In Phase II, the mixed-isotope glass vapor cell replaced the heat pipe Raman
vapor cell. The heat pipe absorption cell remained in place. The frequency scheme used
was the same as that of Phase I (see Figure 24).
In Phase III, the spectrum used was slightly different than that of Phases I and II.
The Phase III spectrum is shown in Figure 25. Additionally, the signals were pulsed by
sending appropriate TTL pulses to AOM RF switches. A 200 MHz AOM is used to
49
pulse the optical pump. The laser is red-detuned from the 85Rb F = 3 transition by
200 MHz; when the optical pump is pulsed on, the AOM blue-shifts the optical pump
back up to resonance with the F = 3 transition. The write and read pulses are generated
from the laser by a 1.2 GHz AOM operating at 1.0 GHz. As a result, the write and read
pulses are red-detuned from the F = 3 transition by 1.2 GHz, putting them at nearly the
same frequency as the Raman pump in Phases I and II. The AOM switching pulses come
from the pulse generation setup described in greater detail in The Detection System. The
optical pumping pulse and the write/read pulse are vertically polarized. The 85Rb vapor
cell became the new Raman cell, the mixed-isotope glass cell became the new absorption
cell, and the heat pipe absorption cell was removed. (During this time, the mixed-isotope
cell came unglued from its mount. Since this cell no longer needed to be mounted inside
the magnetic shielding box, it was not re-glued; rather, it was mounted using two circular
clamps on optical mounts. Several layers of aluminum foil were wrapped around the
heating coil to protect it from the circular clamps.)
2.5.5 Other Modifications
Although the experiment can be broken down roughly into three phases, some
small “side experiments” were carried out to accomplish specific objectives. The most
noteworthy of these is the measurement of the absorption spectrum of the various vapor
cells, such as in Figure 26. For this experiment, the laser control was set to scan over a
frequency range of 5 to 10 GHz, the Fabry-Pérot cavity was removed from the beam path,
and the photodetector trace was averaged over many scans and recorded on the
oscilloscope. Only one beam and no AOMs were used.
50
An additional experiment that was carried out was a heterodyne detection
experiment, using specialized high-frequency photodetectors. Any photodetector detects
the intensity (and envelope) of the incident light. In a heterodyne setup, two beams are
superimposed. The field incident on the photodetector then consists of more than one
frequency component (due to the multiplicity of beams). When the detector measures the
incident intensity, this is equivalent to taking the magnitude squared of the field strength
(to within a scaling factor). If the photodetector output is viewed on a spectrum analyzer,
peaks will appear at the sum and difference frequencies of the input beams (called the
beat note of the heterodyne signal). This is useful because the strength of those peaks
depends on the input power of both input beams, and thus one strong input beam may be
used to amplify another, weaker beam through heterodyne detection. Additionally, this
technique allows for accurate resolution of the individual frequency components of a
signal.
51
Figure 8. Heat pipe cell diagram.
52
Input beam
Input beam
Sinusoid
Input beam
AOM
AOM
RF switch
AOM
Output beam
(order −1)
(a)
−2
−1
0
+1
+2
TTL gate
signal
(b)
Figure 9. Acousto-optic modulator (AOM) schematic.
Pulsed
output
(c)
53
Phase I
Phase II
Phase III
Characterize
Single-photon
Photon correlation
vapor medium
spectral resolution
and entanglement
Mode
CW
CW
Pulsed
Raman cell
Heat pipe
Glass 85/87
Glass 85
Absorption cell
Heat pipe
Heat pipe
Glass 85/87
Detection
Photodiode
Photon counting
Photon counting
Spectral resolution
Yes
Yes
No
Objective
Figure 10. Summary of the three experiment phases.
54
λ/2
λ/2
PBS
Laser 2
Optical pump
Laser 1
Probe
AOM 2
Absorption
Rb cell
PBS
λ/2
Probe
PBS
PBS
Raman
Rb cell
Fabry-Perot Polarizing
cavity
filter
PBS
Attenuators
APD
Photodetector
Pump
AOM 1
Figure 11. Phase I and II experiment diagram.
55
4
5P3/2(F')
Optical
Pump
Pump
Probe
Pump
F=2
~1.22 GHz
F=3
5S1/2(F)
6.8 GHz
3.0357 GHz
F=2
F =1
Rb85
Rb87
Figure 12. Relevant energy levels for the present experiment.
56
Figure 13. Heating coil wrapping.
57
Figure 14. Pulse timing diagram.
58
F=4
F=1
δ = 1.2 GHz
Optical
pump
Read
Write
F=3
3.0357 GHz
F=2
(a)
F=4
F=4
F=1
F=1
δ = 1.2 GHz
Write,
read
OP
OP, read
Write
F=3
(b)
F=3
(c)
Figure 15. Energy level structure for pulsed excitation.
59
Figure 16. Block diagram of experiment.
60
λ/2
λ/2
PBS
Laser 2
Optical pump
Laser 1
Probe
AOM 2
Absorption
Rb cell
PBS
λ/2
Probe
PBS
PBS
Raman
Rb cell
Fabry-Perot Polarizing
cavity
filter
PBS
Attenuators
APD
Photodetector
Pump
AOM 1
Figure 17. Schematic diagram of Phase I and Phase II of the experiment.
61
λ/2
PBS
λ/2
Laser 1
AOM 2
OP
Read
Write
AOM 1
Absorption
Rb cell
PBS
λ/2
Probe
50/50 BS
Raman
Rb cell
APD
Polarizing
filter
Figure 18. Schematic diagram of Phase III of the experiment.
PBS
Attenuators
62
1
0.9
0.8
Transmission
0.7
0.6
0.5
0.4
85
Rb
F=2
87
Rb
F=2
0.3
85
Rb
F=3
0.2
0.1
0
1
2
3
4
5
frequency (GHz)
Figure 19. Saturated absorption spectrum for rubidium.
6
7
63
Raman pump
0.05
0.04
0.03
magnitude
0.02
0.01
Probe
0
-0.01
-0.02
-0.03
-0.04
-0.08
-0.06
-0.04
-0.02
0
0.02
time
0.04
0.06
Figure 20. Relative shift between pump and probe.
0.08
0.1
64
Figure 21. Heating coil wrapping.
65
shielding box
transverse optical pumping hole
Rb cell
mount
cylindrical shield
anti-Helmholtz coils
Figure 22. Magnetic shielding for glass vapor cells.
λ/2
Probe
66
Figure 23. Location of polarizing beamsplitter cube performing primary polarization filtering.
67
1
Raman
pump
0.9
Optical
pump
0.8
Transmission
0.7
3.0357 GHz
0.6
Probe
0.5
87
Rb F = 2
0.4
0.3
85
Rb F = 3
0.2
0.1
0
δ ≈ 1.1 GHz
-5
-4
-3
-2
-1
Frequency (GHz)
0
1
Figure 24. Frequency spectrum used in Phase I and Phase II.
68
1
Write
beam
0.9
Optical
pump
0.8
Transmission
0.7
0.6
0.5
87
Rb F = 2
Laser
0.4
0.3
85
Rb F = 3
0.2
0.1
0
δ ≈ 1.2 GHz
-5
-4
-3
-2
-1
Frequency (GHz)
0
Figure 25. Frequency spectrum used in Phase III.
1
69
8
7
New cell
6
5
Normal cell
4
3
Saturated
absorption
2
1
0
-1
-0.1
-0.08
-0.06
-0.04
-0.02
0
0.02
0.04
0.06
Figure 26. Typical absorption spectrum measurement.
0.08
0.1
Chapter 3: The Detection System
3.1 Overview
In order to verify that the desired effects actually occur in the experiment, the
experimental detection system needs to be a highly accurate, flexible system capable of
taking multiple kinds of measurements. The ability to plot, manipulate, and store the data
on a computer is vital. The detection system must be synchronized to the rest of the
experiment, particularly when operating the experiment in the pulsed excitation regime.
Finally, the detection system must be reasonably simple to operate, so that extensive
training is not needed and few things can go wrong during data collection.
Several kinds of measurements must be made. Both classical light levels on the
order of 10 µ W to 100 mW and low light levels on the order of 1 to
1 000 000 photons/sec must be observed. Often, spectral resolution is desirable;
sometimes, inter-photon arrival times are important. Virtually all data must be recorded
over time, and these traces must be manipulated, analyzed, and saved for future reference.
In particular, the computer software package MATLAB, published by The MathWorks, is
used for all plotting and analysis; all data must end up in MATLAB in some form.
MATLAB revision 13 (version 6.5) was used for this experiment; at present, MATLAB
revision 14 (version 7) is available and is likely to provide similar results. Although
MATLAB runs on several platforms, the computer used for data analysis in this
experiment is an IBM-compatible PC running Windows 2000 and connected to the
70
71
university network. (It is intended that the computer be upgraded to Windows XP in the
future. No obstacles to this upgrade are foreseen.)
The detection system consists of a Fabry-Pérot cavity-based spectrum analyzer, a
series of neutral-density filter wheels (attenuator wheels), a classical photodetector, and
an avalanche photodiode (APD) operated in single-photon counting mode. Figure 27
shows a diagram. The detection system has features for meeting all of these needs, as
well as providing the flexibility needed to adapt to the changing needs of the experiment.
The system can be reconfigured quickly if a new kind of measurement is desired to track
a previously unseen event. The data recorded can be transferred to computer in a
straightforward manner. Custom MATLAB software, as well as a program developed in
the LabVIEW environment from National Instruments, was written to handle data
transfer and to aid analysis of the data.
With modern technology and modern laboratory equipment, a great deal of
complexity and automation is made possible. However, the development, refining, and
verification of complex systems take time, and system faults are made ever more likely
with increasing complexity. Many times, a decision must be made as to the worthiness of
developing a particular component or a particular feature of the system; often, the
decision is whether to integrate and automate a set of operations that otherwise would be
performed manually. For the present experiment, the general rule was that a particular
component is worth developing if the development, testing, and use of a system will
require less time over the life of the experiment than manually performing the same tasks.
This rule was not always followed, especially in cases of error-prone or non-existent
72
manual procedures or high-cost automation components. It is believed that the resulting
system makes optimal use of available technology to enable and speed experiment
progress without excessive cost.
A discussion of the detection system is perhaps best pursued in a task-oriented
manner. The description that follows is arranged in order of specific tasks, each roughly
corresponding to a phase of the experiment. (See The Detection System for more
information on Phases I, II, and III of the experiment.) This ordering also follows the
chronological development of the experiment and the detection system. More
background information about the theory and operation of Fabry-Pérot cavities is
contained in Appendix A: Fabry-Pérot Cavities. LabVIEW software documentation can
be found in Appendix B: LabVIEW Documentation. MATLAB source code can be
found in Appendix C: MATLAB Source Code.
3.2 Spectral Resolution of a Classical Signal
One important task is the recording of a spectrally resolved, classical-level signal.
This was an integral capability in Phase I of the experiment (see Experiment Description).
The measurement is carried out by scanning the Fabry-Pérot cavity, measuring the cavity
output with a classical photodetector, and recording the trace on an oscilloscope.
Attenuator wheels allow the detection of excessively strong signals without sacrificing
detector performance.
73
3.2.1 The Fabry-Pérot Spectrum Analyzer
The Fabry-Pérot cavity consists of two circular mirrors 2.5 cm in diameter. One
mirror is fixed, and one mirror is movable. The movable mirror is mounted on a
piezoelectric crystal. With an applied voltage, the crystal deflects by 0.446 V/nm and is
linear over a range greater than 0 V to 250 V. Typically, the cavity mirrors are spaced
approximately 1 cm apart, giving a free spectral range (FSR) of 174 V, or a halfwavelength at 780 nm; the FSR may also be expressed as 14.9 GHz. The cavity FSR
may be changed by dismounting and re-mounting the fixed mirror. At resonance, the
cavity transmits approximately 70% of the signal power and has a finesse of about 45
with a line width of about 260 MHz. The cavity was custom-made of aluminum and has
three hand screws for alignment. The Fabry-Pérot cavity may be removed from the beam
path and reinserted with relative ease.
The Fabry-Pérot piezoelectric crystal is driven by a triangle wave signal coming
through a high-voltage amplifier from a function generator. The high-voltage amplifier is
custom-made. The function generator is a Stanford Research Systems DS345 30 MHz
function and arbitrary waveform generator. (At times when the DS345 is unavailable, a
BK Precision model 4011A 5 MHz function generator is used instead; however, the
DS345 is preferred.) The function generator produces a 10 Hz triangle wave with a 2.3 V
amplitude and a −0.12 V offset. The function generator also puts out a synchronization
pulse to indicate the start of the positive and negative half-cycles of the triangle wave.
Because of the DC signal offset, the rising edge of the sync pulse comes approximately
one sixth of a cycle before the triangle wave goes from falling to rising, and the falling
74
edge of the sync pulse occurs a half-cycle later. The high-voltage amplifier is an
inverting 500 V amplifier that clips negative voltages. The amplifier output is monitored
on a two-channel oscilloscope through a probe that attenuates by a factor of 10. The
high-voltage amplifier output begins to distort the triangle wave at frequencies between
10 Hz and 100 Hz. At 10 Hz, RMS distortion of the triangle wave is less than 0.6% (see
Figure 28).
3.2.2 Neutral-Density Filter Wheels
The attenuator wheels are standard neutral-density filter wheels, available from
any optics supply company. Each filter comes with front and back wheels, and each
wheel may be moved independently to select an attenuation level. The attenuation levels
are measured in optical density (OD), where 1 OD = 10 dB . One wheel can be turned to a
value of 0.04, 0.1, 0.2, 0.3, 0.4, or 0.5 OD, and the other wheel can select filters of 0.04,
0.5, 1.0, 1.5, 2.0, or 2.5 OD, giving a total range of 0.08 to 3.0 OD, roughly in steps of
0.1 OD. The attenuator wheels cause little or no beam distortion. One wheel is placed
before the Fabry-Pérot cavity, and two wheels are placed before the input to the APD.
3.2.3 The Classical Photodetector
The classical photodetector is located after the output of the Fabry-Pérot cavity.
A flip mirror diverts the beam path from the APD input to the photodetector. The
photodetector is a Thorlabs model PDA55 photodetector with a ±12 V DC power supply,
and it is capable of detecting envelope fluctuations in the light up to 10 MHz. The
photodetector has an effective area of 13 mm 2 . The gain in the photodetector can be
75
selected as 0 dB to 40 dB in steps of 10 dB, with a roughly constant gain-bandwidth
product. The photodetector clips near 10 mW input light power at 0 dB gain. The output
of the photodetector is connected to an oscilloscope. When the Fabry-Pérot cavity is
used, the oscilloscope displays a spectral resolution of the light signal. As the FabryPérot mirror scans over a free spectral range, the oscilloscope shows both the scan
voltage and the cavity output, giving the frequency spectrum of the light signal.
3.2.4 The TDS 3012 Digital Oscilloscope
The oscilloscope is a Tektronix TDS 3012 portable, two-channel digital
oscilloscope. It has a 100 MHz analog bandwidth, a maximum signal input of ±10 V , a
sampling rate of up to 1.25 GS/s, and independent 9-bit input channel digitization. It
includes the same basic features of all modern oscilloscopes, as well as some additional
mathematical and triggering functions. It can be triggered by a threshold crossing on one
of the two input channels or by an independent triggering signal. It can run continuously
or acquire and display a single trace. It has both RS-232 and GPIB control interfaces.
Additionally, it can read traces from and write traces to a MS-DOS-formatted 1.44 MB
floppy disk. It is this last feature which enables the transfer of data to a computer.
3.2.5 Computer Interfaces
The oscilloscope can write data files in several formats, The most universally
accessible is comma-separated value (CSV) format, a format often used for spreadsheets.
In this format, the time and voltage values of the oscilloscope trace are saved as two rows
in a matrix, i.e., one time point and one voltage per line. This format has the advantage
76
of being extremely easy to import into MATLAB (via the csvread command), as well as
being a human-readable text format. However, a typical TDS3000-series data trace
contains 10 000 data points, each of which has one time and one voltage coordinate. As a
result, the CSV files produced by the oscilloscope are roughly 170 kB, and only eight
such files fit on a standard 1.44 MB floppy disk. Additionally, since floppy drives are
rather slow, it takes over 60 s to save traces of both oscilloscope channels in this format.
The oscilloscope also allows traces to be saved in the oscilloscope’s internal
format, with a filename extension of .isf. (Usually, the filenames follow the pattern
tek00000.isf, with incrementing numbers for each file saved on a single floppy disk.) In
this format, the oscilloscope stores the data in binary form, making the file size an
average of only 20 kB. The format is native to the oscilloscope, meaning no conversion
is required to write the file. These two factors make file internal-format files quicker to
save than CSV files by a factor of three. Additionally, the internal file format contains
the major settings of the oscilloscope at the time the data trace was taken, making
internal-format files more informative than CSV files. Tektronix publishes the details of
the internal file format. A MATLAB command, read_tds3000, was written to read the
internal-format files copied to the PC. The command is robust and correctly parses any
file that adheres to the specification published by Tektronix.
The TDS 3012 oscilloscope has both RS-232 serial and GPIB control interfaces.
It would therefore be possible to transfer data traces from the oscilloscope to the PC
using either a serial or a GPIB connection; such a connection would also allow automated
operation of the oscilloscope, if such were desired. However, such an interface takes
77
time to develop, and the existing method of saving data to a floppy disk is sufficiently
quick and simple for the purposes of the present experiment.
3.2.6 Performance
The performance of this system was sufficient for Phase I of the experiment. The
Fabry-Pérot cavity is able to resolve spectral lines separated by approximately 0.25 GHz.
For continuous wave (CW) excitation at a classical light level, the photodetector
resolution was more than adequate. Intensity fluctuations in the laser and noise in the
high-voltage amplifier make the light level fluctuate by more than 3%, and sometimes by
as much as 10%; such fluctuations are difficult to overcome, and 3% accuracy is
sufficient for measurements in Phase I. As stated, it takes roughly 20 s to save two data
traces to the floppy disk. Typically, the Fabry-Pérot triangle wave and the photodetector
output are saved to disk simultaneously. While the system in its present form is not able
to take measurements at a high repetition rate, Phase I does not require rapidly-repeated
identical measurements, such as for statistical measurements. As such, the classical
spectral-resolution detection system performance is ample.
3.3 Spectral Resolution at Low Light Levels
At low light levels (i.e., single-photon or low-photon-count levels), the photoncounting avalanche photodiode (APD) replaces the classical photodetector. Although
this is essentially the only change to the detection system optics, the photon-counting
nature of the APD requires much more complicated support electronics, and the detection
78
system becomes more complex. The optical connection to the APD is also more
complicated than simply shining the beam on the detector.
3.3.1 The Photon-Counting APD
The APD is a Perkin-Elmer SPCM-AQR-16-FC with a dark count of 25 counts/s.
It is extremely sensitive to stray light and is housed inside a dark protective box (see
Figure 29). The box is fashioned from a double layer of black, paper-covered foam
boards approximately 5 mm thick. (The foam boards are of the kind used for
presentations and poster displays.) The box dimensions are approximately 53 cm wide
by 26.5 cm deep by 26.5 cm tall. Edges and corners are taped with black electrical tape,
and the base of the box has a black felt skirt approximately 7.5 cm wide to cover areas
where cables enter and leave the box. The APD has a fiber connector, a power supply, a
signal output, and a gate input. The gate input can be used to switch the APD on and off.
Multi-mode optical fiber connected to a fiber coupling lens is used to bring light in from
the beam to the APD. Typically, as much as 90% of the light power is coupled into the
fiber. The coupling lens is mounted on an optical mount and is protected by a 2.5 cmdiameter barrel approximately 22 cm long. The barrel contains a narrowband filter that
filters out all but the range 755 nm to 805 nm, with approximately 50% transmission over
that range. At 17 cm away from the coupling lens, the barrel tapers to 1.25 cm in
diameter. A small iris is placed near the open end of the barrel; the iris aperture is
approximately 4 mm in diameter. Two filter wheels are placed between the iris and the
Fabry-Pérot cavity. A shroud fashioned from three black foam boards and a long piece of
black felt cover the coupling lens, the barrel, the iris, and one filter wheel. The part of the
79
optical fiber outside of the APD box is spiral-wrapped in two to three layers of black
electrical tape; otherwise, light entering the fiber through the cladding increases the APD
dark count. Black foam board “walls” shield the APD box and coupler shroud from the
rest of the experiment and also are placed at key points throughout the optical table to
reduce reflections. Typical experimental dark counts are on the order of 100 counts/s
with the iris blocked by a black foam board. The APD has a quantum efficiency of
approximately 58% and is linear up to 1 000 000 photons/s. Between
1 000 000 photons/s and 15 000 000 photons/s, a correction factor must be applied, and
above 15 000 000 photons/s, the APD saturates. Extreme input illumination can
permanently damage the APD. In the present experiment, the APD is never exposed to
light levels above 1 000 000 photons/s. The APD requires the use of a large heat sink,
although this is less critical at light levels below 1 000 000 photons/s.
The APD requires a 5 V power supply that can supply as much as 2 A. The APD
power supply was fashioned out of a computer power supply. Details of the APD power
supply are listed in Appendix A: APD Power Supply.
The APD output pulses are between 1 V and 2 V high into 50 Ω and are
approximately 35 ns wide; the pulse has a sharp rising edge and a slow exponential decay.
There is a 60 ns dead time between pulses, during which no photons can be detected.
This dead time would limit the maximum observable photon flux to
16 000 000 photons/s; however, the APD is operated under much lower light conditions.
The APD has a probability of 0.5% of after-pulsing, i.e., issuing a second pulse for a
single photon.
80
Certain kinds of APDs may be used simply as extra-sensitive photodetectors, and
their output voltage levels vary with the incident light level. However, because the
SPCM-AQR series are photon-counting APDs, their outputs are pulsed, and an
oscilloscope is not suitable for recording measurements. The pulses must be counted
digitally and typically summed over some time window to evaluate the APD output
correctly. The pulse counting is performed by the SR400 and the SR430, discussed
below.
The APD has a gate input that may be used to disable the APD temporarily.
While the gate is off, the APD does not generate any output pulses. However, the gating
function is somewhat complicated. Although the APD datasheet claims that a TTL low
level will gate the APD off, this is not strictly correct. The gate input drives current when
the gate is disabled, and not all TTL sources can sink current while generating a low
voltage. In order to connect a TTL pulse to the gate via a 50 Ω cable, a small transistorbased circuit is required. A simplistic example circuit, and the one used in this
experiment, is shown in Figure 30. The TTL input is connected to the transistor base,
and the collector is connected to the APD gate input. One additional factor complicates
the gating process. After the APD gate input is switched high, the APD takes
approximately 500 ns to recover. During this time, it emits no pulses. At the end of the
500 ns, the APD always emits a single pulse [18]. Shortly after this single pulse, the
APD resumes its normal operation.
81
3.3.2 The SR400 Photon Counter
The Stanford Research Systems model SR400 Photon Counter is a dual-channel
photon counter, intended for counting photon detection pulses from a photon-counting
APD or a photomultipler tube (PMT). The pulse detection discriminator threshold is
user-settable between −0.3 V and 0.3 V , with either a rising or falling slope. The
SR400 trigger and clock may be either externally or internally generated. Total counts
can go as high as 100 000 000 photons before an overflow occurs. Additional features
and more complicated counting modes than the ones described here are available.
The basic counting mode of the SR400 involves counting pulses over a specified
range of time (called the count window), waiting a certain time (called the dwell time),
and optionally repeating the process a fixed number of times or indefinitely. The
accumulated count is displayed on the unit’s two-line LCD both as it accumulates and
after counting has finished. The count window may be as short as 100 ns or as long as
99.92 ms. The minimum dwell time is 2 ms using internal triggering, or as short as about
1.4 ms when using an external trigger. Both the count window and the dwell time may
be specified to one significant figure, e.g., 30 clock cycles or 300 clock cycles but not
310 clock cycles.
As an example, the SR400 is typically configured in the present experiment for a
count window of 1 s and a dwell time of 0.5 s. The SR400 then counts pulses over a
period of one second, displaying the count as it accumulates; when the one-second period
is complete, the final count is displayed for a half-second before the count is restarted. In
this particular configuration, it is possible to see the number of photons incident on the
82
APD per second, allowing a quick estimate of whether the APD is operating in a
nonlinear or saturation regime. Typically, the SR400 is left running whenever the APD is
powered up, in order to detect quickly any sudden increase in photon flux and protect the
APD from damage.
The SR400 has a digital-to-analog (D/A) output and generates an analog voltage
on that output that varies either linearly or logarithmically with the final count at the end
of the count window. As the count is completed, the D/A voltage is changed to match the
new count; the D/A voltage is not changed again until another count completes. This
allows the SR400 count to be displayed graphically on an oscilloscope. However, as the
minimum dwell time is 2 ms, the counter resolution becomes extremely limited. A count
cycle (a count window plus a dwell time) can not be any shorter than slightly over 2 ms.
As the count cycle becomes shorter and shorter, the dwell time becomes a greater and
greater fraction of the count cycle time. Since photon arrival and photon counting are
statistical processes, they must be averaged over some time or some number of repeated
measurements to produce accurate results. For example, a 100 ns count window with a
2 ms dwell time means that the photon counter is only counting for 0.005% of the count
cycle. The resolution cannot be increased past 2 ms, and the short count window means
that the photon count will have a high variance. Increasing the count window to 1 ms
will increase the accuracy of the count, but already the count cycle time has been
increased to 3 ms, leading to a loss in resolution. Even a count cycle near 2 ms limits the
resolution to 50 data points per 10 Hz Fabry-Pérot cycle. As a result, the SR400 cannot
be used with an oscilloscope for data storage.
83
The SR400 also has serial and GPIB interfaces, allowing complete control of the
instrument by computer. The SR400 can store up to 2000 consecutive counts per
channel; these counts can be retrieved via serial or GPIB connection. A serial connection
was attempted, and some success was achieved in retrieving count results in this manner.
However, the 2 ms dwell time again presented a resolution problem. Additionally, the
serial interface proved unreliable, even with RTS/CTS handshaking (also called
hardware flow control). It is unknown whether this was due to the SR400, the serial
programming features of MATLAB, or both. Reading all 2000 counts off the two-line
SR400 display would have been an extremely laborious, manually intensive, error-prone
process and, as such, was not attempted. As the SR400 has no other data interface (e.g.,
floppy disk drive), data collection could not be performed using the SR400. The SR400
served only as a visual count monitor for the experiment.
3.3.3 The SR430 Scaler/Averager
The Stanford Research Systems SR430 Multi-channel Scaler/Averager can be
thought of as the graphical equivalent of the SR400. It has a single data input and a
trigger input. It records the number of pulses in each of a large number of identical,
consecutive time bins, and it plots the resulting counts on a graphical display. The time
bins can range from 5 ns to 10 ms in duration, and the total number of bins may be varied
from 1024 to 16 384 in increments of 1024, with no dead time or dwell time between bins.
The SR430 can also accumulate the results over repeated runs (from 1 to 65 535 runs or
indefinitely). Additional, slightly more complicated modes of operation, as well as
additional features, are available. The SR430 has both RS-232 serial and GPIB interfaces.
84
The primary unit of execution of the SR430 is a scan. When the user presses the
“Start” button, the SR430 waits for a trigger. A trigger signal is mandatory. Once the
trigger is received, the SR430 begins to count pulses in the first bin. Immediately after
the first bin is complete, the SR430 stores the bin count and begins counting pulses for
the second bin. Counting continues this way, with no dead time between bins, until the
preset number of bins is reached (from 1024 to 16 384). Once this number of bins has
been reached, the SR430 has completed one record. The number of records per scan may
be set from 1 to 65 536. If more than one record per scan has been requested, then when
one record is complete, the SR430 repeats the process, waiting for a trigger and then
adding pulse counts to each bin in order. In this way, the SR430 can accumulate multiple
records in a single scan.
The SR430 has several important features that are not used in the present
experiment. If the number of records per scan is set to zero, the SR430 will accumulate
indefinitely, until the user presses the “Stop/Reset” button. The SR430 has options for
subtracting records from the accumulated total instead of adding them. The SR430 can
either alternate between adding and subtracting records or may subtract records marked
by an external add/subtract TTL signal. There is also an option to delay the start of data
acquisition up to 16 320 time bins after the arrival of the trigger signal.
The SR430 can save trace data to a MS-DOS-formatted 720 KB floppy disk for
transfer to a PC. The trace data is saved in binary format; Stanford Research has
documented the binary file format. The floppy disk is used to transfer data to the PC. A
MATLAB command, read_sr430, has been written to read the SR430 trace data files into
85
MATLAB. The command returns the relative time offsets of each bin, the bin counts,
and optionally the SR430 settings contained in the trace data file. The SR430 floppy
drive is only compatible with 720 KB floppy disks. As such disks are difficult to find
presently, it is easiest to fashion one out of a 1.44 MB floppy disk by covering the disk
density marker hole in the corner of the disk (opposite the write-protect switch) with a
piece of tape. Unfortunately, as the disk is used repeatedly to transfer files from the
SR430 to the PC, the tape covering the density marker becomes stretched out, and the
floppy drive sensor detects the disk as a 1.44 MB disk. This results in data read errors;
on the PC, the operating system usually identifies the disk as unformatted at this point.
Removing the floppy disk and adjusting or reapplying the tape fixes the error.
The SR430 also offers the option of serial and/or GPIB control. GPIB control
was attempted later; see the Computer Control of the Detection System section. Serial
control proved to be unfruitful. The interface’s primary utility is in data transfer from the
SR430. However, using the serial port interface, data transfer is forced to occur in text
mode, rather than binary mode. Ill-conceived text-mode formatting forces each bin count
to be transferred using a zero-padded format that results in an average of 14 bytes
transferred per bin; at the maximum serial data rate of 19 200 bit/s, with one start bit, one
stop bit, no parity bits, and 8-bit data words, this results in a transfer time of 120 s.
Additionally, the SR430’s serial interface shows similar unreliability to the SR400’s, due
to the SR430, MATLAB, or both.
When the Fabry-Pérot cavity is used with a 10 Hz triangle wave, the SR430 is
configured for a bin width of 5.12 µ s and 16 384 bins per record. At these settings, and
86
with the appropriate trigger timing, the SR430 records the APD output for the entire
positive-going half-cycle of the Fabry-Pérot scan as well as some additional “buffer” time
before and after that half-cycle. In this way, the entire signal spectrum is recorded.
Furthermore, the user can visually identify the start and end of the half-cycle in the data
file by virtue of the two mirror-image lines that can be drawn at the boundaries between
each half-cycle (see Figure 31).
The SR430 manual lists the maximum trigger rate as 2400 Hz; that rate is
achievable only using particular settings of the SR430 and not in the general case. In
practice, the SR430 is usually triggered at 10 Hz and never faster than 100 Hz, due to
limitations in other parts of the detection system. The number of records per scan is
usually either one or several hundred, but rarely are more than a thousand records
accumulated in a single scan. At a triggering rate of 10 Hz, one thousand records take
100 s to collect. Additionally, saving the trace data to floppy disk takes approximately
30 s. While this amount of time is considerable, it is sufficient for most manual
measurements taken during the experiment. The exception to this is the regime of high
repetition rate photon correlation and photon number correlation experiments; for those
cases, a GPIB control program was developed in LabVIEW. Once the LabVIEW control
program was developed, it largely replaced floppy disks for data transfer to the PC, even
for low repetition rate experiments. For spectrally resolved measurement experiments,
the resolution is determined by the Fabry-Pérot cavity; as such, the low light level
detection system offers intensity resolution to the single photon level but no increase in
spectral resolution over the classical light level detection system.
87
3.4 Pulsed Excitation and Pulse Control
In order to have a pulsed excitation experiment, it is necessary to send enable
pulses to the AOM RF switches. These enable pulses must be carefully timed and
synchronized. For this purpose, a pulse generator is used. The DS345 function generator
has a TTL sync output; this sync signal is used as the master trigger for the rest of the
system. The DS345 is set to run at 10 Hz, as before. Since the Fabry-Pérot cavity is not
used in pulsed mode (see below), higher triggering rates are possible when the highvoltage amplifier is temporarily disconnected from the function generator ramp output.
3.4.1 Pulse Generation
The pulse generator is a Quantum Composers model 9514 pulse generator,
operated in external trigger mode. In this mode, the generator requires a trigger input and
generates four TTL pulses of arbitrary duration and delay from the input trigger. The
delay and duration settings are accurate to within 10 ns, with less than 400 ps of jitter.
Each pulse may be specified as positive, negative (inverted), or disabled. Of the four
output channels of the pulse generator, Channel 1 generates the optical pump pulse,
Channel 2 generates the write pulse, and Channel 3 generates the read pulse. As
described in The Detection System, the optical pumping pulse is about 1 ms long, the
write pulse is about 1 µ s long and follows the optical pumping pulse by about 1 µ s , and
the read pulse is about 1 µ s long and follows the write pulse by about 200 ns. A timing
diagram is shown in Figure 32.
Channel 4 of the pulse generator provides the SR430 trigger, and the same signal
is also used sometimes to generate an APD gate signal. The SR430 trigger pulse’s rising
88
edge is placed near the end of the optical pumping pulse, as the primary observations are
of the effects of the write and read pulses. The SR430 is not sensitive to the pulse
duration, so the pulse duration is adjusted to gate the APD appropriately. Typically, the
APD gate is enabled from 1 µ s before the end of the optical pumping pulse to some time
shortly after the read pulse.
The AOMs are pulsed on and off by the TTL pulses from the pulse generator. As
described in the Experiment Description chapter, the pulsed mode of operation involves
the use of either the optical pumping beam or the write beam as the read beam. As such,
one beam needs to be pulsed twice. For this purpose, TTL digital logic is used to
combine the pulses. A 74LS32 quadruple OR gate is mounted on a small circuit board
inside a small enclosure with BNC connectors for power supply, input, and output; two
dual-input OR gates are made available through the enclosure. The OR gate is
sufficiently fast to combine pulses of the widths involved. (It was discovered that
floating inputs cause the OR gate output to float high.) The AOMs switch on and off
cleanly and sharply with the pulses supplied.
At times during the course of the experiment, particularly when component
alignments need to be readjusted, it is convenient to have a CW beam, rather than a
pulsed beam. To simulate a CW beam, the pulse generator outputs can be inverted, or the
pulse durations can be increased to nearly 100% of the trigger repetition period. In this
way, the AOMs are switched on for nearly a 100% duty cycle.
89
3.4.2 Photon Detection
For pulsed operation, fine resolution of a short range of data is required. For this
purpose, the SR430 is typically set to a bin width of 5 ns and a count of 1024 bins per
record. These settings allow the recording of 5.12 µ s of data with 5 ns pulse resolution.
Occasionally, the pulses used are wide enough to require a higher bin count.
It should be noted that in the case of pulsed excitation, the Fabry-Pérot cavity is
not used. The write and read pulses are extremely close together in time, less than 1 µ s
apart, and well-separated in frequency, more than 3 GHz shifted. The cavity can not be
scanned fast enough between pulses to transmit both frequencies at the appropriate times.
One occasional use of the Fabry-Pérot cavity in pulsed mode is as a frequency-selective
filter. Ideally, the function generator would generate a DC voltage that would hold the
cavity at the appropriate spacing. However, the DS345 function generator does not
generate a sync pulse when set to a frequency of 0 Hz. Instead, the function generator is
configured to generate an extremely small-amplitude ramp with a DC offset
corresponding to the desired DC voltage level. The small-amplitude ramp is buried in the
noise at the output of the high-voltage amplifier driving the Fabry-Pérot piezoelectric
crystal, so the same effect is achieved. However, the cavity mirror spacing drifts
noticeably over the course of a minute, probably due to thermal expansion. If the cavity
is left at the same DC voltage, it will typically drift off the transmission peak within 600 s.
Photon correlation and photon number correlation experiments require a finer
degree of control over data acquisition. To perform those kinds of measurements, one
must keep traces from many repetitions of the pulse sequence. While the SR430 can
90
accumulate and sum records, it cannot store more than a single record of accumulated
data. To save each individual record, computer control is needed; see Computer Control
of the Detection System below.
3.4.3 Performance
Typically, the system is operated at the same 10 Hz used to generate the FabryPérot triangle wave, even though the Fabry-Pérot cavity is typically not used for pulsed
excitation experiments. A repetition rate of 10 Hz is usually sufficient for present
purposes. If the high-voltage amplifier is disconnected from the function generator, the
repetition rate can be increased as high as 100 Hz. Operation at repetition rates above
100 Hz is not advisable; the optical pumping pulse is between 1 ms and 3 ms in duration,
and the vapor cell population needs time between repetitions to relax after the write and
read pulses. Although a large number of records may be accumulated quickly, it is not
possible to store a long string of individual records
At first glance, the 5 ns bin width of the SR430 would seem to be unnecessarily
accurate, given the 60 ns dead time of the APD. However, it should be noted that a bin
width of 5 ns allows the accurate resolution of pulse start times. The fact that the APD
has a 60 ns dead time should not be taken to mean that the APD pulses indicate photon
arrival only to within 60 ns, or that the APD can only emit a pulse during consecutive
60 ns windows, like a digital system with a 60 ns clock period. Rather, the APD pulses
may occur at any time, and the 60 ns dead time simply indicates a period after the pulse
during which no more pulses may be emitted (see Figure 33).
91
3.5 Computer Control of the Detection System
For certain kinds of experiments, it is not sufficient to accumulate records on the
SR430. When individual photon count traces from many repetitions are required,
computer control of the SR430 is needed. A computer program commands the SR430 to
run a single scan; when the scan is completed, the program reads the SR430’s trace data
and stores it. The program then repeats the cycle. Each run-finish-read cycle is called an
experiment cycle, or simply a cycle.
The computer program controls the SR430 using the GPIB interface; data is also
transferred via GPIB. The program was developed using the LabVIEW programming
system from National Instruments. Version 7.1.1 of the LabVIEW Full Development
System was used.
3.5.1 GPIB
GPIB, or General Purpose Interface Bus, is a standard interface used to control
test and measurement equipment such as the SR430. IEEE standard 488.1 defines
virtually all aspects of the interface, from signal timing to cable requirements. IEEE
488.2 defines commonly-used additions to the GPIB specification. Aside from a basic
set of commands defined by IEEE 488.2, the command set and data structure are not
specified by IEEE 488 but are defined by the instrument manufacturer. As a historical
note, GPIB was originally developed at Hewlett-Packard and was then called HP-IB;
older Hewlett-Packard equipment still carries the HP-IB label on compatible ports.
HP-IB was adopted as an IEEE standard in 1973 and renamed GPIB.
92
The data collection PC has a National Instruments PCI-GPIB host card residing in
an available PCI slot. This card, along with appropriate driver software from National
Instruments, allows the PC to act as a controller for GPIB devices. A GPIB-compliant
cable connects the PC to the SR430. If desired, the PC could control multiple devices
using the same GPIB connection by chaining cables from the PC (or the SR430) to the
other devices.
Commands are sent to a GPIB-compliant device in ASCII (text) format, and
responses are also returned from the device in ASCII format. Usually, one command is
sent per transaction. This format is also common for RS-232 instrument control
interfaces; in that case, one command is issued (or one response is returned) per line.
Devices that have both GPIB and RS-232 interfaces typically support nearly identical
command sets on both interfaces. However, devices often support binary data transfer
only over GPIB; GPIB uses 8 bits per byte transferred, while RS-232 supports 7 or 8 bits
per byte (and, in uncommon variations, as few as 4 bits per byte).
The SR430 is IEEE 488.2 compliant. Its GPIB interface operates at a raw data
rate of approximately 250 kbit/s, much lower than the IEEE 488.1 maximum of 8 Mbit/s.
The SR430 will only transfer binary trace data over GPIB. In binary format, each bin
count is represented by a two-byte number in little endian order (i.e., .least significant
byte first). At this rate, the SR430 requires approximately 70 ms to transfer 1024 bins of
data or approximately 1 s to transfer 16 384 bins of data. This offers a drastic
improvement over the 120 s required for a complete data transfer over RS-232. It is
93
important to note that binary transfer over GPIB requires the entire trace to be transferred
at once. All bins in a record are transferred.
Once the driver software is installed on the PC, the control program can be
written in any of a variety of languages, including C/C++. However, LabVIEW is often
used for GPIB instrument control and has a rich set of features for GPIB communication.
Many simplified, instrument-specific interfaces have been developed for LabVIEW to
allow easy implementation of control programs while avoiding some of the more
complex details of GPIB communication. LabVIEW was chosen as the development
system based on its extensive GPIB support and based on the expertise of laboratory staff.
3.5.2 LabVIEW
The LabVIEW development environment is a graphical environment. Essentially
no part of the program is typed, as with traditional development environments. A
LabVIEW program is called a virtual instrument, or VI. The user should think of a VI as
if it were another laboratory instrument. Each VI has a front panel and a block diagram.
The front panel defines the user interface, while the block diagram defines the operation
of the VI, much like a traditional laboratory instrument has a front panel and internal
circuitry.
The VI front panel contains controls, such as buttons, switches, and number entry
fields, and indicators, such as LEDs and text display fields. Controls allow input from
the user; indicators display information. More complicated controls and indicators, such
as waveform plots, are also available. Controls and indicators may be customized in any
number of ways, including with labels and data range restrictions.
94
The VI block diagram functions much like a circuit diagram. Each control or
indicator on the front panel is represented by a small symbol, called a block, on the block
diagram. On the block diagram, the developer may also place function blocks, which
perform computation and data manipulation functions but do not have a user interface
element on the front panel. Each block has one or more terminals. The block terminals
are connected together by wires that represent the flow of data. For cases where constant
data values are needed, the developer can place constants on the block diagram.
Constants function like controls, except they have no front panel component, and their
value is specified by the developer.
A simple example of a LabVIEW program is a VI that adds two numbers,
multiplies the sum by a third number, and displays the result. The VI has three numeric
controls and one numeric indicator on the front panel. The block diagram consists of the
front panel blocks plus one “Add” function block and one “Multiply” function block.
Two controls are wired to the inputs of the “Add” block. The “Add” output and the third
control are wired to the inputs of the “Multiply” block. The “Multiply” output is wired to
the numeric indicator. When the user enters numbers in each of the controls and presses
the “Run” button on the toolbar in the VI’s front panel window, the result is displayed in
the indicator.
The power of LabVIEW resides in its extensive set of function blocks. Simple
mathematical functions, such as addition and exponentiation, are of course available.
Traditional programming structures, such as loops and decision statements, are available
as blocks (including “for,” “while,” and “case” structures); these structures are large and
95
resizable and can contain any number of inputs, outputs, and other function blocks.
Comparison blocks return Boolean results that allow decisions to be made. Many
function blocks are available that provide operating system interfaces, such as file
input/output blocks and network interface blocks. GPIB communication is performed
through GPIB function blocks.
Structures provide a great deal of the interactive capabilities of LabVIEW. Case
structures replace the “if-then” statements of sequential programming languages. A case
structure is a large frame with a selector input. The selector may be a Boolean, making
the case structure function as an “if-then” statement, or any other kind of data type,
making the case structure function as a “case” or “switch” or “select” statement. Blocks
are placed inside the frame that correspond to the different functions to be executed for
different cases. One case is displayed in the frame at a time, much like the pages of a
note pad. A single case can handle one or more selector values. A single case may be
identified as the default case; if the selector has a value that is not covered by other cases,
the default case is selected. The developer may connect other inputs and outputs to the
case structure; the blocks placed in each individual case must each provide a value for
each output from the structure.
Loops are implemented as both for loops and while loops. A for loop executes a
fixed number of times (e.g., for each element in an array). A while loop executes until a
Boolean condition becomes false (i.e., while a condition is true). The function blocks
placed within the loop structure do not change, as with a case statement. However, the
iteration count of the loop is available as a variable, and more advanced loop features
96
such as tunnels, shift registers, and feedback nodes allow values to be propagated from
one loop iteration to another. Naturally, a loop structure may have data inputs and
outputs, just as a case statement.
Other kinds of execution structures are available in LabVIEW. Event structures
are primarily used for advanced user interface processing; they function similarly to case
structures, with one case for each possible user interface event. Formula nodes allow the
developer to type a complicated calculation as an expression in a syntax similar to the C
programming language. MATLAB script nodes function like formula nodes but call
MATLAB to process the script contained in the node.
When developing large programs, it is common practice to put logically separable
or often-used subprograms into separate functions or separate files. LabVIEW emulates
this practice by allowing the developer to create a subVI. A subVI is simply another VI.
It has a front panel and a block diagram. When the subVI block symbol is placed on the
block diagram of another VI, the controls and indicators on the subVI front panel act as
the block’s inputs and outputs, respectively. The example VI described above could be
used as a subVI by placing it on the block diagram of another VI; the three numeric
controls and the numeric indicator would be represented on the block diagram by three
input connections and one output connection, respectively. Multiple VIs can be stored in
a VI library, a compressed file that contains a set of VIs.
3.5.3 LabVIEW Execution
The most complicated aspect of LabVIEW development is understanding the
execution of the VI. Typical text-based programs have an obvious execution order, i.e.,
97
top to bottom, with branches and loops indicated in the source code. However,
LabVIEW VIs attempt to emulate laboratory instruments and are graphical in nature.
The block diagram, similar to a circuit diagram, seems to dictate that all things are
happening simultaneously. The key to understanding LabVIEW VI execution is to
comprehend how LabVIEW maps an apparently simultaneous diagram into sequential
computer execution. The best reference for this information is [19]. The process of
gaining this comprehension is aided immensely by the LabVIEW “Highlight Execution”
option, wherein the block diagram is highlighted during VI execution with small dots
representing data flow.
The basic element of VI execution can be thought of as the command, “Do
everything on this block diagram once.” Each function block is executed once. A
control “executes” by transmitting its data value along the wire connected to it; an
indicator “executes” by absorbing a data value from its wire and displaying it for the user
in an appropriate format. A function block or subVI executes by taking its inputs,
performing its appointed function, and generating outputs; these output values are
transmitted down the output wires. When one block’s input is connected to another
block’s output, the latter block is guaranteed to execute before the former. A block
cannot execute until data values have been transmitted to each of its inputs. Blocks that
have no relative dependencies, or blocks with no inputs, may execute in any order;
execution order is not guaranteed.
An brief analysis of the simple example above is helpful. The front panel of a VI
is always “live,” i.e., the controls can always be manipulated, even when the VI is not
98
strictly executing. The user enters three numbers in the three controls and presses the
“Run” button on the toolbar. At this point, execution begins. The VI executes by using
the pseudo-command “Do everything on this block diagram once.” The indicator cannot
execute until the “Multiply” block has executed. The “Multiply” block similarly waits
for the “Add” block, and the “Add” block waits for its two numeric controls. The
controls have no inputs and can execute first. Once the controls have transmitted their
data values, the “Add” block can execute. When the “Add” block has finished, the
“Multiply” block has its two inputs and can execute. Finally, the “Multiply” block
transmits its output value to the indicator, and the indicator displays the result for the user.
Although this is a simple example, some of the finer points of execution order can
be demonstrated. First, note that each of the controls is independent of the other, so the
controls themselves can execute in any order. The third control, connected to the
“Multiply” block, may transmit its value before either of the other controls executes.
(The transmitted value would then be stored at the input of the “Multiply” block until all
inputs are available and the block executes.) Conversely, the first two controls and the
“Add” block may execute before the third control executes. Since the “Add” block and
the third control are independent of each other, they may execute in any order. The only
guarantee is that the “Multiply” block will execute after the “Add” block and the third
control have both finished executing.
The execution of case and loop structures is similar to that of the block diagram.
When all of the input values, including the selector value, have arrived at a case structure,
the structure executes by choosing the appropriate case and then executing its function
99
blocks. One way to think about this execution is that the case selector decides which case
to use, and then execution continues as if the blocks in that case were placed directly on
the block diagram. Loop execution is similar. A loop structure executes by executing its
contents an appropriate number of times. It executes as if, instead of a loop with N
iterations, the loop contents were repeated on the block diagram N times. The output of
a loop structure is not transmitted until the final loop iteration has completed execution.
It was noted earlier that, when the “Run” toolbar button is pressed, the VI
executes its entire block diagram once and then ends execution. In order to provide a
more interactive experience, most VIs intended for interactive use have a main, outer
while loop and a “Stop” button. The VI continues to execute until the user presses the
“Stop” button. The loop usually contains a “Wait (ms)” function block configured to
wait for a short time, typically around 100 ms. In this way, the VI essentially re-executes
every 100 ms. Any updates to the controls produce instant results. Controls and
indicators are placed inside the main loop on the block diagram so their values are read
and updated every time the loop executes.
A common, alternative structure for interaction is an event structure inside a while
loop. When the event structure executes, it waits for a recognized user interface event to
occur. (User interface events that the event structure is not configured to handle are not
recognized.) When the event occurs, the event structure executes the corresponding
event case. When the event case completes, control is returned to the while loop. If the
user has pressed the “Stop” button, the loop completes execution, and the VI terminates.
Otherwise, the loop executes again, and the event structure executes again, waiting for a
100
recognized event to occur. Event structures are somewhat more complicated but provide
a smoother user interface. The control program for the present experiment uses an event
structure inside a while loop.
Event structures may be extended to cover event types other than interface events
through the use of user events. Most event messages are generated automatically by
LabVIEW as a result of user interaction. A user event is a custom event message
generated by the program. As an example, a VI front panel might have numeric controls
labeled “Amplitude” and “Frequency,” as well as several indicators whose displayed
values depend on the values of those controls. The developer might choose to create a
user event named “Recalculate Display Values.” The VI would first register this event,
and then an event structure would be configured with a case to handle the event. In the
VI event structure, the developer would create cases to handle the “Amplitude: Value
Change” and “Frequency: Value Change” messages. In each of those cases, the
developer would place a block to generate the “Recalculate Display Values” event.
When the value of the “Amplitude” field is changed, LabVIEW will automatically
generate the “Amplitude: Value Change” event message and place it in the event queue.
When the VI’s event structure handles this message, it will perform any necessary
functions and then place the “Recalculate Display Values” event message in the event
queue. Once processing for the “Amplitude: Value Change” event has completed, the
event structure returns control to the outer loop; on the next iteration, the event structure
reads the “Recalculate Display Values” message from the event queue and processes it.
Events used in this way allow common processing to occur for several different events.
101
3.6 The Vapor Cell Experiment LabVIEW Program
The Vapor Cell Experiment (VCE) LabVIEW program is a LabVIEW VI that was
written to run the SR430 repeatedly, retrieving the trace data after each run. After the
user specifies experiment settings, the VCE VI runs the experiment and retrieves the
SR430 data. The VI then repeats the cycle. Each run-finish-read cycle is called an
experiment cycle, or simply a cycle. Any number of cycle may be specified. The data
retrieved from the SR430 is stored in a MATLAB native format using the LabVIEW
MATLAB interface. The VI will optionally process the data before storing it. Records
are kept of the experiment settings, date and time of execution, and results. Running
optimally, the experiment can run at a repetition rate of approximately 3 Hz, or 3
experiment cycles per second.
The VCE VI is the top-level VI in a VI library. The library consists entirely of
VIs custom-written for this purpose. The VCE VI also relies on another VI library, the
SR430 instrument driver library. An instrument driver is a VI or collection of VIs that
provide simplified access to an instrument. For example, an instrument driver provides
one function block for each instrument command. Instrument drivers hide some of the
complexities of GPIB interfaces. The SR430 instrument driver is available from
Gesellschaft für Schwerionenforschung mbH (Association for Heavy Ion Research) in
Darmstadt, Germany. The GSI SR430 instrument driver is freely available under the
terms of the GNU General Public License. Several additional SR430 interface function
blocks were developed during the course of the experiment, particularly function blocks
needed to retrieve settings from the SR430. They are not strictly part of the GSI
102
instrument driver per se, but they fit the general pattern of GSI functions and were added
to the experiment copy of the GSI library to maintain consistency.
3.6.1 User Interface
The VCE VI interface is shown in Figure 34. Toward the upper-left corner of the
front panel are the main experiment settings. In the upper-right corner are some
additional settings that are rarely used. In the left middle region are text and filename
entry fields, and in the right middle region are the activation buttons. Toward the bottom
of the front panel are status indicators and some seldom-used buttons. The LabVIEW
Context Help window, if open, displays information relevant to the control or indicator
over which the mouse cursor is positioned.
The “Experiment type” selector allows the user to choose the kind of experiment
to run. This primarily affects post-processing of the SR430 data. Available types are
“Raw data,” “Start-stop,” and “Number corr.,” meaning “number correlation.” The “Raw
data” experiment type runs the SR430 and retrieves the complete data trace after each
scan. The entire data trace is saved to the data file; if multiple cycles are run, each trace
is saved as a column of the data matrix. The “Start-stop” experiment type does not save
the entire trace, but rather counts the number of time bins between the first and second
pulses and saves that number instead of the entire data trace. Multiple cycles lead to
multiple numbers stored in a vector. The “Number corr.” experiment type sums all of the
counts over two windows; it is expected that the windows will correspond to the write
and read pulses. The number of photon counts in the write pulse window and the number
103
of photon counts in the read pulse window are saved to the data file. A multi-cycle
“Number corr.” experiment results in a two-row data matrix.
The “# cycles” field determines the number of times to run the experiment, or the
number of data traces to collect. The “# records/scan,” “Bin width,” and “# Kbins”
correspond to the equivalent SR430 settings. The “Total scan time” field is computed
from the bin width and bin count fields. If a value is entered into the “Total scan time”
field, the bin count is recomputed. The “Read params” button causes the VI to access the
SR430, read the three parameters, and update the fields with the SR430’s current values.
The “First pulse offset,” “First pulse duration,” “Second pulse offset,” and
“Second pulse duration” fields are only used by the “Number corr.” experiment type and
are disabled (grayed out) when other experiment types are selected. These fields
determine the windows over which photon counts are summed. The pulse offsets and
durations are specified in terms of zero-based bin number. The corresponding times are
based on the selected bin width and are referenced to 0 s as the start of the data trace. If a
value is entered into any of the time fields, the corresponding bin number is recomputed.
The “GPIB address” field specifies the GPIB address of the SR430. The default
address for the SR430 is 8. Valid addresses range from 1 to 31. If multiple GPIB
controllers are present in the PC, the address format X : Y is used, where X is the
controller number (starting from zero) and Y is the device address on the specified
controller. The “Manual name” pushbutton overrides the automatic data file naming used
by the VI. For general operation, the “Manual name” button should be turned off; only
exceptional circumstances warrant the use of this feature.
104
The “Data filename” field allows entry of a data filename. Data files use the file
extension .mat, as they are MATLAB native format files. The default folder for data files
is a subfolder named for the current date (e.g., 2005-01-31) in the
Vapor Cell Experiment\Data folder. When the VI is opened, if the default folder does
not exist, the user is asked whether it should be created. The default data filename is
VCxx.mat, where xx is replaced by the lowest unused number in the folder (meaning the
lowest number that produces a filename that does not already exist).
The VCE VI uses automatic data file naming to avoid overwriting existing data
files and to create a log of all data recorded on a given day. The automatic file naming
feature uses numbered file names. The user may select a base name for the file, such as
Test data 001.mat. The VI will automatically increment the number at the end of the
filename until it finds find the next available number in the specified folder. For example,
if fifteen similarly-named, consecutively-numbered files were found in the data folder,
then when the user typed Test data 001.mat (or selected it from the file browse box,
activated using the ellipsis pushbutton near the “Data filename” field), the VI would
automatically change the data filename to Test data 016.mat. (When generating the
filename, the VI uses at least as many digits as are present in the specified filename.)
When the experiment is run, the data will be saved to this data file. Shortly after the
experiment completes, the VI will increment the filename again to Test data 017.mat.
This is the recommended behavior. In instances where this behavior is not desired,
enabling the “Manual name” pushbutton will use the data filename as entered and not
105
alter it. The user is always prompted at the start of the experiment run before a data file
is overwritten.
The “Description” field allows the user to enter a text description of the
experiment to be run; previous entries in the “Description” field can be selected using the
arrow to the right of the field. This text field is used to generate the “Full description”
field, which is written to the data file, the Readme file, and the log file. The Readme file
is a text file named Readme.txt in the same folder as the data file; it contains one-line
descriptions of the data files in the folder. A new description (using the value of the “Full
description” field) is appended to the file every time an experiment is run. The log file is
a text file named VC Log.txt in the same folder as the data file. The log file contains the
exact starting and ending times of the experiment run, as well as detailed information
about any errors that occurred during the experiment and whether the user cancelled the
experiment run. The names of these files cannot be changed by the user, and they always
reside in the same folder as the data file.
The “Run” button runs the experiment for the specified number of cycles. When
this button is first pressed, most of the controls on the front panel are disabled. The
SR430 is initialized with the specified parameters, and then the SR430 scan is started.
When the SR430 scan is complete, the VI reads the trace data from the SR430 and
restarts the scan, continuing as many times as specified. As each cycle is completed, the
“Cycles completed” field is incremented. The “End now” button allows the user to end
the experiment before all cycles are completed; any data retrieved is saved to the data file.
When the experiment run is completed (or ended early), the “Run” button resumes its
106
deselected state, the data filename is incremented (unless “Manual name” is selected), the
front panel controls are re-enabled, and the VI returns to its initial state.
The “Get data” button retrieves the current trace data from the SR430 without
initializing it or initiating a scan. The data trace is saved to the data file, and the data
filename is incremented, just as with the “Run” button. This is useful when the user has
operated the SR430 manually and wishes to capture the data trace to a file on the PC.
(Pressing the “Get data” button also causes the VI to retrieve the current SR430 settings,
as with the “Get params” button, so that a correct description can be written to the data
file.)
Other user interface elements are seldom used but should be self-explanatory.
The “Time stamp” field indicates the time at which the experiment run was started (i.e.,
the time at which the “Run” button was pressed). The “Status” field indicates the ending
time and status of the experiment run. Possible status values are “Completed,”
“Canceled,” and “Error.” The “EXIT” button is used to end the VI operation and close
the window. Do not use the window close button or any other means to end the VI. (To
edit the VI for further development, use the “Abort” button on the toolbar.) The
“Reinitialize” button reinitializes the VI front panel to its initial state.
If the VI stops responding or is incorrectly disabled, the “Reinitialize” button
should be pressed. If the SR430 stops responding to its own front panel, the “Help”
button on the SR430 should be pressed to bring the SR430 out of “remote” mode. If the
VI and SR430 appear to be operating normally but not communicating with each other,
the VI should be closed, and the SR430 should be turned off; after approximately 30 s,
107
the SR430 should be turned back on, and then the VI should be opened again. It is not
believed that any of these situations will arise during experimental operation of the VI
and the SR430; however, during development of the VI, they were rather frequent
occurrences, meriting a mention of the associated fixes.
3.6.2 Data File Format
The data files written by the VCE VI are MATLAB native format binary files.
These files are usually called MAT-files, since the file extension used is always .mat.
MAT-files contain one or more variables, with name, type, size, and value all stored in
the file. When the MAT-file is loaded from disk, using the load command in MATLAB,
the variables are loaded into the MATLAB workspace. Using an alternate form of the
load command, the variables may instead be loaded as fields in a structure.
The variables stored in the file are the data variable, which contains the data
retrieved from the SR430, and a several other variables that contain settings and other
information. The data variable is a double-precision matrix of values containing the data
read from the SR430. The number of columns in data corresponds to the number of
cycles completed. For the “Raw data” experiment type, each column contains the full
trace from the SR430. The number of rows will be an even multiple of 1024
corresponding to the number of bins per record. For the “Start-stop” experiment type,
each “column” contains a single number, namely, the number of time bins between the
first and second non-zero bins of the data. For the “Number corr.” experiment type, each
column contains two numbers. The first number is the number of photons detected
during the first pulse window, or write pulse; the second number corresponds to the
108
second pulse window, or read pulse. (Although the VCE VI will perform the
computations needed to reduce the SR430 data to one or two numbers, it is also possible
to run the “Raw data” experiment type and perform the computations in MATLAB.)
The remaining variables in the data are informational and, with one exception, are
all strings (i.e., character row vectors). description contains the value of the “Full
description” field, including the SR430 settings. status contains the value of the “Status”
field. dir is the full path of the folder where the data file resides, and file is the name of
the data file with no path information. The full path to the data file can be reconstructed
in MATLAB using the command fullfile(dir,file). The cycles variable is a doubleprecision scalar; it indicates the number of cycles that were requested by the user, which
may be different from the number of cycles actually completed. The number of cycles
completed is specified by the number of columns in the data variable.
3.6.3 VI Internal Structure
The VCE VI’s internal (block diagram) structure centers around an event
processing loop, i.e., an event structure inside a while loop. The bulk of the program
logic resides in the different cases in the event structure. User events are used to
consolidate event handling logic, as discussed in LabVIEW Execution above. The only
items located outside the event processing loop are the control and indicator blocks
themselves (with few exceptions), some initialization logic, and the event registration
blocks.
The types of events handled by the event loop are “Value Change” events and
user events. “Value Change” events are generated by LabVIEW in response to user
109
activity on the front panel, such as pressing a button or changing the value of a field. The
“Value Change” event processing is straightforward in most cases; for most controls, the
“Value Change” event is simply a trigger to generate an event to update the value of
another control. For example, the “# cycles” and “# records/scan” values are used in the
“Full description” field. A single event case handles “Value Change” events for both of
these controls, and the event case simply generates a “Compute full description” user
event to cause the “Full description” field to be updated. As an additional example, the
“# Kbins” parameter is used in the “Full description” field and specifies the maximum
value for the pulse offset and duration fields. The “# Kbins: Value Change” event case,
therefore, adjusts the maximum values of the pulse parameter fields, generates a
“Compute full description” user event, and generates a “Compute times” event to update
the pulse parameter fields.
The user events used in the VCE VI are as follows: “Compute filenames” causes
the data, Readme, and log filenames to be updated. “Compute times” causes the “Total
scan time” and pulse parameter time values to be updated from the corresponding bin
numbers, or vice versa. “Enable front panel” enables or disables certain parts of the front
panel, depending on the choice of experiment type and whether the VI is about to start or
finish running an experiment. “Compute full description” generates a new value for the
“Full description” field based on the current parameter settings. “Read params” causes
the operating parameters to be read from the SR430 and updates the front panel with the
new values. “Get data” retrieves the current data from the SR430, writes it to the data
file, adds an entry to the Readme file, and updates the data filename when the front panel
110
button of the same name is pressed. (One important note is that, since the “Get data”
operation first requires the VI to read the current SR430 settings, the “Get data” button
actually generates a “Read params” event, which in turn generates the “Get data” user
event.) “Run experiment” handles the mechanics of running the experiment, namely,
initializing and running the SR430, retrieving the data, and writing the data, Readme, and
log files.
Many subVIs were created to perform various functions within the block diagram.
Most subVIs perform a simple computation and return the results; for example, Adjust
Pulse Parameters.vi takes in pulse offset and duration bin numbers, as well as the value of
the “# Kbins” field, and returns offset and duration bin numbers that have been adjusted
to fall within an acceptable range. A few subVIs perform major, integrated functions;
examples of such functions are Run Start-Stop Experiment Once.vi, Run Number Corr
Experiment Once.vi, and Get SR430 Settings.vi. SubVI names should be self-explanatory,
and the subVIs themselves perform fairly straightforward functions.
3.6.4 Performance
The maximum repetition rate that can be achieved with the VCE VI is 3 Hz. The
VCE VI execution speed and the effective experiment repetition rate are limited primarily
by the operation of the SR430. A timing analysis of VCE VI execution shows that, even
at optimal settings of 1024 bins per record and a 5 ns bin width, the SR430 requires
approximately 250 ms to complete an entire scan cycle and approximately 70 ms to
transfer the data record to the PC. The time required by the VCE VI for one complete
experiment run is roughly 10 ms to 30 ms. The maximum trigger rate of the SR430 is
111
listed in the product manual as 2400 Hz and is only achievable with the settings specified
above. However, it appears that this rate applies only to the case of multiple records per
scan. Additional time may be needed for the SR430 to transfer trace data from data
acquisition memory to “display memory,” or the memory from which the GPIB data is
read. Display memory is discussed in greater detail in the SR430 product manual.
It should be noted that, although the repetition rate is limited to around 3 Hz, the
trigger rate can be 10 Hz or even higher. When multiple records per scan are requested, a
higher trigger rate will reduce data collection times, as the VCE VI does not require
access until the scan is complete. In the case of a single record per scan, scans are
initiated by the VCE VI, and the SR430 will ignore excess trigger pulses. For the present
experiment, 3 Hz is a sufficiently high repetition rate to make the required data
recordings in a reasonable amount of time.
3.7 Computer-Aided Analysis
All plotting and analysis for the experiment were carried out using the MATLAB
environment from The MathWorks. A series of MATLAB programs were developed to
read in, manipulate, and plot data. These programs were written as M-files, so called
because of the file extension .m. A very brief description of the more important M-files
follows. More information is available within the M-file source code. Descriptive help
text is usually available from within MATLAB by typing help followed by the command
name.
112
3.7.1 Data Import Commands
Data traces saved on the TDS 3012 digital oscilloscope are typically saved in the
Tektronix internal format with a file extension of .isf. These files can be read into
MATLAB using the read_tds3000 command. This command returns a column vector of
the recorded voltage value of each point in the oscilloscope data trace. It will optionally
also return a column vector of equal length containing the time value of each data point
relative to the oscilloscope trigger and a MATLAB structure containing the oscilloscope
settings listed in the data file. The command accepts an option to plot the data after
reading it from the data file. The read_tds3000 command is extremely robust and should
be able to parse data files correctly from any modern Tektronix digital oscilloscope,
including those from other than the TDS3000 series.
When SR430 trace files are saved to floppy disk, they are saved in the SR430
internal file format, typically with no file extension. The data in these files can be loaded
using the read_sr430 command. read_sr430 returns the count in each bin as a row vector.
As with read_tds3000, read_sr430 can optionally return the relative time of each data
point and a MATLAB structure containing the instrument settings listed in the data file
and can plot the data after reading it in.
3.7.2 Plotting and Analysis
MATLAB has extensive data plotting capabilities, and these were utilized quite
thoroughly in the present experiment. Several M-files were written to automate major
parts of the plot generation process and to afford some convenience in analysis. However,
these M-files were not intended to generate the plots entirely without user intervention.
113
As such, automatically plots are saved as MATLAB figure files (with a file extension
of .fig) and typically hand-tuned afterward. (The general rule mentioned previously was
followed; namely, if the development, testing, and use of a system required less time in
total than manual execution of the same tasks, the M-file would be developed, and not
otherwise.)
The primary plotting function used in the experiment is the fpplot command. It
was originally written for interactive generation and analysis of plots of Fabry-Pérot
spectrum data, both from the oscilloscope and from the SR430. However, many of its
features are broadly applicable, allowing it to be used more generally. Typically, the
arguments passed to the command are filenames or filename specifications to be plotted.
Wildcards may be used, namely, * (asterisk) to represent any number of characters, and ?
(question mark) to represent precisely one character. At the MATLAB command prompt,
these names may be typed directly after the command name, separated by spaces and
without quotes or parentheses. For example, fpplot *.isf will load and plot all
oscilloscope data files in the current folder. The user can scroll through the plots using
the arrow keys, and several other features are available. Perhaps the most important
additional feature is the “binning” of data. When a large number of bins per record are
specified on the SR430, consecutive groups of bins may be summed to provide a
smoother data trace. In particular, one interactive command changes the plot between
displaying each bin and displaying sums of every 16 bins. The fpplot command also has
a non-interactive mode for automated generation of plots. More information on fpplot is
available through the MATLAB help command and from the interactive menu.
114
Many times, the user wishes to mark the relative frequencies of the peaks on a
Fabry-Pérot plot. The add_peaks command offers this feature for pre-existing plots. It is
an interactive tool that allows the user to select the location of several peaks manually
and automatically determines the relative frequencies of the peaks (based partly on user
input). The peaks are labeled with vertical lines and text labels. The figure file can be
saved; later, the command get_peaks retrieves a list of these labeled peaks, and the
command find_peaks can find the maximum-value data point near each peak marker line.
The command rescale_peaks allows the frequency axis of a frequency-marked plot to be
rescaled slightly and updates the peak label text with the newly-computed frequency.
One additional MATLAB command, html_doc, was written and is available to aid
in analysis. After large amounts of data were collected, it became somewhat difficult to
locate important data files after their collection. Each data file is uniquely named and
stored in a folder named for the date of collection (e.g., 2005-01-31) in the
Vapor Cell Experiment\Data folder on the PC. A file named Readme.txt containing a
one-line description of each data file is kept in virtually all such data directories.
However, after data had been collected for many months, individual data files were
nevertheless hard to locate. To this end, the html_doc command generates two HTML
files in the Vapor Cell Experiment\html folder. The first file, named index.html, contains
a listing of every file and subfolder at every level beneath the Vapor Cell Experiment
folder on the PC. Text files, particularly Readme.txt, are copied in their entirety into the
HTML file. M-files are coupled with a one-line description of the function performed by
the file (taken from the first comment line of the file, called the H1 line in MATLAB).
115
For all recognizable data, figure, or image files, the files are plotted or displayed, and
html_doc generates both a full-size image and a tiny snapshot of the result. In the HTML
file, next to the filename, a reference to the snapshot image is placed, along with a link to
the full image; a user who clicks the snapshot will see the full image. In this way, the
user can browse the Vapor Cell Experiment folder and its subfolders with some idea of
the contents of the files. The second HTML file, images.html, simply contains all
snapshot images placed side-by-side with no intervening text and linked to the full-size
snapshots. This allows easy browsing and searching of plots and images. html_doc
intelligently generates only those images that have not been generated or whose sources
have been updated, particularly since the tiny and full-size snapshots take several minutes
to generate. html_doc skips any folders it finds named html, primarily to avoid recursion.
3.7.3 RS-232 Instrument Control
When it became clear that computer control of instrumentation would be
necessary, the obvious first choice for development environment was MATLAB.
MATLAB is flexible, efficient, largely user-friendly, and already was used exclusively
for data analysis. A MATLAB instrument control interface would allow seamless
retrieval of data and experiment execution control alongside the existing data analysis
features.
The MathWorks offers an Instrument Control Toolbox for MATLAB that offers
both GPIB and RS-232 interfaces. Partly as a consequence of IEEE Standard 488, the
interfaces work nearly identically from within MATLAB. The Instrument Control
Toolbox would offer an ideal choice for experiment control, allowing the development
116
initially over RS-232 and then offering an easy upgrade path to GPIB later when higher
data transfer rates were needed. Costs for MATLAB Toolboxes are often prohibitive,
except where they are directly pertinent to the kinds of data analysis performed. In this
case, cost was an overriding factor, and the Instrument Control Toolbox was not
purchased.
The RS-232 serial interface portion of the Instrument Control Box is included as a
standard part of MATLAB. This was pursued as a possible avenue for experiment
control. The serial interface features built into MATLAB were used in an attempt to
control the SR400 photon counter and the SR430 scaler/averager. Some success was
achieved; however, both instruments are limited to a maximum serial bit rate of
19 200 bit/s. With standard communications settings, and considering RS-232 framing
overhead, that equates to a typical maximum data rate of 1920 B/s. (Using uncommon
but allowed communications settings, an absolute maximum data rate of 2133 B/s is
possible.) More importantly, the serial interface was determined to be unreliable. Bytes
are sometimes lost, altered, or inserted into the data stream, and it is not always clear
when any of those events has happened. The cause of serial unreliability is unknown.
The SR400 and SR430 could very conceivably have identical RS-232 control circuitry; if
the circuits used by Stanford Research are erratic, then the same problems could be
exhibited by both devices. At the same time, the MATLAB serial interface on the
Windows platform is based on the Java serial port interface for Windows. Java is known
to be unreliable and unstable, and the Java serial port interface has reliability issues. The
MathWorks has made available a patch for MATLAB revision 13 that addresses some of
117
these Java serial reliability issues; however, it is not known whether the patch fixes all
serial issues. The net effect is that, although somewhat sophisticated and flexible control
software was implemented in MATLAB, the MATLAB instrument control software is
not used in the present experiment.
118
APD
Coupling
lens
Shielding barrel
Iris
Attenuator
wheel (x2)
Fabry-Perot
Cavity
Flip mirror
Photodetector
Multimode fiber
HV piezo input
(a)
TDS3012B Oscilloscope
1
DS345 Function Generator
2
From photodiode
10x
probe
HV Amplifier
T
To Fabry-Perot
HV piezo input
10 Hz
To Pulse Generator trigger input
SR400 Photon Counter
SR430 Multichannel Scaler
12,345
0
1
2
T
1
T
From APD output
(b)
Figure 27. Detection system block diagram.
119
300
HV ramp
Linear fit
Ramp voltage (V)
250
200
150
100
50
-0.06
-0.04
-0.02
0
0.02
Ramp time (s)
Figure 28. High voltage ramp distortion.
0.04
0.06
120
APD box
Coupling lens box
Felt
Beam
Optical fiber
(a)
Attenuators
Coupling lens
(b)
Figure 29. Shielding for APD and fiber coupling lens.
Iris
121
To APD gate input
TTL gate signal
2N2222
10 Ω
Figure 30. APD gate switching circuit.
122
200
0.5
Mirror images
Arbitrary scale
Mirror images
0
-0.05
-0.04
-0.03
-0.02
-0.01
0
Time (s)
0.01
0.02
Figure 31. Fabry-Pérot ramp mirror image.
0.03
0.04
123
Figure 32. Pulsed-mode excitation timing diagram.
124
Figure 33. APD dead time.
125
Figure 34. Vapor Cell Experiment VI front panel.
Chapter 4: Experimental Results
4.1 Summary of Results
A number of interesting results have already been obtained during the course of
the present experiment. Both Stokes and anti-Stokes lines have been observed, even at
classical light levels, in 85Rb. The absorption spectra of the heat pipe vapor cell, the
mixed-isotope glass vapor cell, and the pure-isotope glass vapor cell have all been
recorded experimentally. At low light levels, multi-spectral gain was observed even
beyond what was seen at classical light levels. The effects of optical pumping were
studied. Promising initial results were obtained for the pulsed excitation mode,
demonstrating that the current experimental apparatus will be sufficient for observing the
desired effects in the pulsed excitation mode.
4.2 Classical-Level Results
4.2.1 Anti-Stokes Generation at Classical Levels
The data collected during Phase I of the experiment focused on spectral resolution
of the Raman pump and probe. Figure 35 shows a collection of typical data traces for the
experiment. It is intriguing that both Stokes (probe) and anti-Stokes lines are visible, as
the Raman-resonant third-order susceptibility predicts the presence of only the Stokes
line. In this case, the anti-Stokes line can be explained by a phase-matched nondegenerate four-wave mixing process. The four-wave mixing process is a result of the
126
127
third-order susceptibility of the Raman vapor medium interacting with the pump and
probe fields. The pump acts as ω1 and ω2 , the probe acts as ω3 , and the anti-Stokes line
is generated as ω4 .
In effect, the pump is acting on both the 85Rb 52S1/2 F = 2 and F = 3 levels
simultaneously; the probe and pump cause transitions from F = 2 to F = 3 , and the
pump causes transitions from F = 3 to a virtual level, causing 85Rb atoms to emit the
anti-Stokes photons while returning to the F = 2 level. It should be noted that, because
of the phase-matching condition, the anti-Stokes beam propagates at a very shallow angle
relative to the pump and probe beams; however, the angle is shallow enough that the
beam still lands on both the classical detector and the APD fiber coupling lens, even after
propagation along the optical table. Figure 36 shows the heterodyne beat note between
the probe and anti-Stokes lines at roughly 6.07 GHz, or twice the ground-state splitting of
3.0357 GHz. Both the probe and the anti-Stokes line were found to be polarized
perpendicular to the pump. The probe gain is approximately 6 dB, and the anti-Stokes
line intensity can be made as large as about 8% of the input intensity. The exact
frequency shifts and relative intensities of the Stokes and anti-Stokes lines vary with the
Raman pump intensity and detuning and the optical pump intensity; these effects were
studied in greater detail using low photon count light levels.
4.2.2 Vapor Cell Absorption Spectra
The experimental setup was used to verify and record the absorption spectra of
the three Raman vapor cells (heat pipe cell, mixed isotope glass cell, and pure isotope
glass cell). Figure 37 shows the saturated absorption spectrum of mixed-isotope
128
rubidium. Figure 38 shows part of the absorption spectra of the three vapor cells used in
the experiment. The red curve shows the linear absorption for the mixed-isotope cell.
The green curve shows the linear absorption in the pure-isotope cell (note the missing
87
Rb absorption line). The blue curve is a typical, mixed-isotope saturated absorption
curve that has been shifted by 1.1 GHz to represent the detuned pump. Note that, as
expected, the mixed-isotope cells show absorption lines from both 85Rb and 87Rb, while
the pure-isotope cell shows only the lines for 85Rb. For these readings, the oscilloscope
was set to accumulate a number of traces and display the average of those traces.
Optical pumping is used for population transfer from the F = 3 to the F = 2 level.
In order to verify the optical pumping effect, an absorption spectrum trace was taken. As
described in the Experiment Description chapter, optical pumping was performed using a
fixed frequency from the second laser, while the first laser was scanned over the
appropriate frequency range. Figure 39 clearly shows population transfer out of the 85Rb
F = 3 line. There is virtually no absorption at the F = 3 line, as all of the 85Rb atoms in
the vapor medium have been pumped into the F = 2 state and are transparent to photons
at the D2 F = 3 transition frequency.
4.3 Spectrally Resolved Photon Counting
Phase II of the experiment focused on studying the behavior of the vapor medium
under low-light conditions. The Raman pump power are reduced, and the probe beam is
blocked entirely (except when used as a frequency reference). The APD is used for
photon counting, and the Fabry-Pérot cavity resolves the signal spectrally. Figure 40
shows a typical spectrally resolved trace. The pump is suppressed by the polarization
129
filtering and the absorption cell. Even at a reduced light level, the Stokes and anti-Stokes
lines from 85Rb are apparent in the trace. Their frequency separation is measured as
approximately 6.08 GHz. (Peak locations for measurement purposes are determined
manually.) Figure 41 shows the relative intensities of the Stokes and anti-Stokes lines for
different pump intensities. The spectral peaks in Figure 40 are asymmetric and slightly
broader than the Fabry-Pérot line with of approximately 260 MHz; it is presumed that
these effects are caused by an asymmetric transverse pump beam profile, which in turn
causes inhomogeneous power broadening in the vapor medium. Fabry-Pérot cavity
misalignment can produce similar effects but was ruled out based on careful alignment
and the use of back-reflections from the cavity. Nonlinear response of the high-voltage
amplifier and piezoelectric crystal is also ruled out, as the same broadening and
asymmetry are seen equally in all parts of the spectrum.
4.3.1 Multi-Spectral Raman Gain
Many additional spectral lines are present in the trace shown in Figure 40, beyond
even the Stokes and anti-Stokes lines observed in Phase I of the experiment. Some of
these lines may be explained by the light shift effect, or AC Stark effect. As the pump
field intensity is increased, the high-intensity field causes level splitting in the atom, and
small “satellite” lines shift away from the main lines. In this case, since the Raman pump
is red-detuned, the lines shift toward lower frequencies. Figure 42 shows a linear-fit plot
of the measured shift of these lines for different pump intensities. More information
about the AC Stark effect can be found in [5].
130
These light-shifted lines and the other newly appearing lines in Figure 40 have
been investigated theoretically using a numerical simulation. The results of the
simulation indicate that, aside from light-shift-induced lines, all lines in the spectrum can
be identified as Stokes or anti-Stokes lines from pump-induced transitions in both 85Rb
and 87Rb. Figure 43 shows the simulation results compared to actual experimental data.
Coincidentally, the free spectral range of the Fabry-Pérot cavity of approximately
15 GHz happens to match the 87Rb Stokes-anti-Stokes frequency separation of 13.6 GHz
almost exactly. As a result, the 87Rb Stokes and anti-Stokes lines overlap and appear as a
single line in the plot in Figure 40. For verification purposes, the Fabry-Pérot free
spectral range was increased to approximately 27 GHz; a spectral resolution at that free
spectral range is shown in Figure 44. That figure also shows the effects of pump
detuning on the relative intensities of the spectral lines.
It is noteworthy that all of the effects seen here result from excitation of the vapor
medium by a single pump frequency. Pump-induced Raman transitions in 85Rb generate
the Stokes frequency, and the pump and newly generated Stokes fields cause the
generation of the anti-Stokes frequency. A similar process is believed to happen
simultaneously in 87Rb, accounting for the presence of both Stokes and anti-Stokes lines
in that isotope. Further, high pump field intensities can induce light shifts in atoms of
both isotopes. A single pump beam produces as many as eight distinct fields, each at a
different frequency from the others.
131
4.3.2 Effects of Optical Pumping
Figure 40 shows the spectral effects of optical pumping for normal pump detuning.
Optical pumping and the resulting population transfer increase the intensity of the emitted
85
Rb Stokes line. Although the 85Rb anti-Stokes intensity is reduced, it is not reduced
much, due primarily to alignment difficulties between the optical pumping and Raman
pump beams. The other lines seen in Figure 40 also increase in intensity; backreflections of the strong optical pumping beam within the vapor cell are the likely cause
of this increase.
4.3.3 Isotopically Pure Line Spectrum
Although the multi-spectral gain effects seen in the mixed-isotope cells are
striking, they represent a source of loss rather than a tool for certain applications, most
notably the quantum memory and quantum entanglement source. Once the various
effects seen in the line spectrum are clearly understood, one would expect that the
isotopically pure 85Rb vapor cell would exhibit only the effects attributable to 85Rb.
Figure 45 and Figure 46 show precisely that behavior. Under weak pump excitation, the
isotopically pure vapor cell used in Phase III of the experiment emits only the 85Rb
Stokes and anti-Stokes lines.
4.4 Pulsed Excitation
Some initial results have already been achieved from Phase III of the experiment.
This phase uses the pulsed excitation mode of operation and the isotopically pure 85Rb
Raman vapor cell. Figure 47 consists of an oscilloscope trace showing the effects of
132
optical pumping. The falling edge of the optical pumping pulse is shown, as well as the
fluorescence from the vapor medium. While the optical pumping pulse is active, it
functions much like a continuous-wave beam, exciting transitions in the atoms and
stimulating the emission of photons as the atoms are excited into the F = 2 state. After
the optical pumping pulse is switched off, the atoms decay randomly into the F = 3 state
due to decoherence processes. Eventually, the atoms reach thermal equilibrium, being
distributed between the F = 2 and F = 3 states, and no further fluorescence from the
vapor cell is observed. Figure 47 shows an excited state lifetime of approximately 500 ns.
(To obtain the data for this figure, the Fabry-Pérot cavity was locked to a particular
frequency, allowing the separate acquisition of the optical pump pulse data and the cell
fluorescence data.)
Figure 48 suggests the kind of data that is expected using the APD and SR430
with pulsed excitation. For this figure, the write beam (i.e., the Raman pump) was pulsed
for approximately 0.04 ms, and no optical pumping pulse was used; the Fabry-Pérot
cavity was removed from the beam path. The curve labeled “Envelope” shows the rough
envelope of the write pulse. The curve labeled “Pulse detected by APD” shows the actual
photon count data received at the APD; note the random photon arrival time. (Before the
Fabry-Pérot cavity was removed from the beam path and this data was recorded, the
photons seen in this figure were verified to be Stokes photons at the probe frequency; the
write pulse photons are filtered and absorbed before they reach the APD.) The curve
labeled “Pulse detected by APD” shows the photon count data accumulated over
100 records. The line labeled “Low-intensity pulse” shows the photon count data from a
133
single record. 18 photons were recorded during the Raman pulse on that particular trace;
the ultimate goal is to reduce the write pulse strength and duration until, on average, less
than a single photon is recorded by the APD per pulse sequence.
Figure 49 shows the operation of the pulse sequence and the fluorescence detected
during pulsed excitation. The vertical scale shows photon counts per 5 ns bin, while the
horizontal scale shows the bin number. Figure 49(a) shows the last 2 µ s of the optical
pumping pulse with the write and read pulses blocked. Figure 49(b) shows only the write
pulse; in this case, the write pulse is expanded to 3 µ s to allow clearer observation of its
effects. Figure 49(c) shows the optical pumping and write pulses together, separated by
approximately 200 ns. Figure 49(d) shows the optical pumping and write pulses again,
only with the write pulse intensity significantly reduced.
134
0.11
Ramp
probe (no gain)
amplified probe
optical pumping
0.1
0.09
0.08
magnitude (a.u.)
0.07
0.06
0.05
0.04
anti-Stokes
image
anti-Stokes
pumpleakage
0.03
0.02
0.01
-0.03
-0.025
-0.02
-0.015
-0.01
-0.005
time (sec)
0
0.005
Figure 35. Stimulated Raman gain, FSR of 15 GHz.
0.01
0.015
135
-80
Heterodyne signal (dBm)
-82
-84
-86
-88
-90
-92
6.0707 6.0708 6.0708 6.0709 6.0709 6.071
6.071 6.0711 6.0711 6.0712
Frequency (GHz)
Figure 36. 6.07 GHz beat note between Raman anti-Stokes line and probe line.
136
1
0.9
0.8
Transmission
0.7
0.6
0.5
0.4
85
87
Rb
F=2
Rb
F=2
0.3
85
Rb
F=3
0.2
0.1
0
1
2
3
4
frequency (GHz)
5
6
Figure 37. Saturated absorption spectrum for mixed-isotope cell.
7
137
8
7
New cell
6
5
Normal cell
4
3
Saturated
absorption
2
1
0
-1
-0.1
-0.08
-0.06
-0.04
-0.02
0
0.02
0.04
0.06
Figure 38. Absorption spectra for three vapor cells.
0.08
0.1
138
No optical pumping
Counterpropagating optical pumping
6
4
2
magnitude (a.u.)
0
-2
-4
-6
F=3,Rb85
-8
-10
F=2,Rb85
-0.08
-0.06
-0.04
-0.02
0
0.02
Scan time (sec)
0.04
0.06
Figure 39. Population transfer with optical pumping.
0.08
0.1
139
2000
-4.67102 GHz
+1.43883 GHz
Probe
Anti-Stokes
Photon count
1500
1000
500
0
-6
-4
-2
0
2
Relative frequency (GHz)
4
6
Figure 40. Single-photon, spectrally resolved trace showing multi-spectral gain.
8
140
Stokes/Anti-Stokes Peak Count Ratio
1.5
1
0.5
0
0
5
10
15
20
Incident pump power (mw)
Figure 41. Stokes (probe) vs. anti-Stokes intensity.
25
141
3
2
1
frequency (GHz)
0
-1
Left probe
Right probe
-2
-3
-4
-5
-6
-7
0
5
10
15
20
Pump power (mW)
Figure 42. Light shift with increasing optical pump power.
25
142
-9
1
x 10
Generated Frequency components, P = 1 mW
S Rb
magnitude
0.8
S Rb
85
AS Rb
87
AS Rb
87
0.6
0.4
New Rb85
line
Rb85
0.2
0
-8 -6.8
Rb87
-5 -4 -3 -2
0
2 3
frequency (GHz)
16000
Photon count (per 5.12 µ s bin)
85
4
5
6.8
8
-- P ~ 5 mW, FSR = 30 GHz
Rb
14000
85
As
12000
10000
8000
6000
4000
2000
-0.01
Rb
Rb
87
85
S
Rb
S
-0.005
0
0.005
Scan time (s)
0.01
87
As
0.015
Figure 43. Simulation results compared to experimental results.
143
1000
85
δ = 1.1 GHz ( Rb)
Averaged photon count (per 5.12 µ s)
900
87
δ = 0.2 GHz ( Rb)
85
Rb A-S
800
700
600
87
Rb A-S
500
85
400
Rb S (Probe)
300
200
87
Rb S
100
0
-10
-5
0
5
Relative frequency (GHz)
10
Figure 44. Stokes and anti-Stokes powers for different detunings.
15
144
220
Pump incompletely absorbed
Pump fully absorbed
200
Photon count per 5.12µs bin
180
160
Probe
140
120
100
80
Pump
60
40
20
0
-4
-2
0
2
Relative frequency (GHz)
Figure 45.
85
4
Rb spectrum with 27 GHz FSR.
6
145
220
Pump incompletely absorbed
Pump fully absorbed
200
Photon count per 5.12µs bin
180
160
Probe
140
120
100
80
Pump
60
40
20
0
-4
-2
0
2
Relative frequency (GHz)
Figure 46.
85
Rb cell lines.
4
6
146
population decay
optical pump pulse
0.07
0.065
0.06
magnitude
0.055
0.05
0.045
0.04
0.035
0.03
3.5
4
4.5
5
5.5
6
pulse duration (sec)
6.5
7
7.5
Figure 47. Population decay after 0.5 ms optical pumping pulse.
8
-6
x 10
147
20
Pulse detected by APD
15
Photon count
Envelope
10
5
0
Low-intensity pulse
-5
25
26
27
28
29
30
Time (µs)
31
32
Figure 48. A typical pulse, as recorded by the APD.
33
148
100
50
0
200
400
600
800
1000
1200
1400
1600
1000
1200
1400
1600
1000
1200
1400
1600
1000
1200
1400
1600
(a)
100
50
0
200
400
600
800
(b)
100
50
0
200
400
600
800
(c)
100
50
0
200
400
600
800
(d)
Figure 49. Pulsed-mode excitation.
Chapter 5: Theory
5.1 Raman Effect in an Atomic Ensemble
The derivation of a quantum-mechanical representation of the Raman effect is
desired. The system shown in Figure 50 is used for the derivation. The system consists
of a pump laser, a three-level atom, and an optical cavity mode. The pump field is
represented by a Glauber coherent state α (t ) L , where α (t ) represents the time-varying
magnitude of the pump field. The atomic levels are labeled a A , b A , and c
A
and
form a Λ–system. The optical cavity may contain either zero or one photon tuned ,
represented by the photon number states 0
and 1 C . The total state (or wavevector) of
C
the system is represented as
ψ =φ
where, φ
L
⊗φ
is the state of the pump field, φ
L
A
⊗φ
A
C
= φ
L
φ
A
φ
(1)
C
is the state of the atom, φ
C
is the state of
the cavity, and ⊗ represents the tensor product (usually omitted for brevity). We note
that the pump coherent state can be decomposed into photon number states as follows:
φ
= α (t )
= e− α (t )
2
2
∞
∑
α (t )n
n
n!
(At this point, we drop the time dependence for simplicity and represent the coherent
state as α
L
L
L
(2)
n =0
, remembering the time-dependent nature of α .) Similarly, we represent the
atomic state as
φ
A
= ca (t ) a + cb (t ) b + cc (t ) c
The cavity state is then represented as
149
(3)
150
φ
C
= c0 (t ) 0 + c1 (t ) 1
(4)
We require ca (t ) + cc (t ) + cc (t ) = 1 and c0 (t ) + c1 (t ) = 1 (i.e., state vector
2
2
2
2
2
normalization) for all t .
We assume the pump is detuned from the a – c transition by an angular
frequency δ , and the cavity mode represents the frequency detuned from the b – c
transition by the same amount δ . We take the pump field to be in the coherent state
α L , the atom to be in the ground state a A , and the cavity to be in the vacuum state
0 C . The system state can then be written as
ψ =α
The coherent state α
L
L
a
A
0
(5)
C
can be viewed as a decomposition of number states
following a Poisson distribution with mean α and standard deviation
α . For large
values of α , this distribution roughly resembles a Gaussian distribution with the same
mean and standard deviation. The standard deviation is extremely narrow, and the
distribution is very nearly symmetric about the peak. For simplicity of analysis, we
replace the coherent state with a single number state, i.e.,
ψn = n
L
a
A
0
C
and we return to the coherent state notation later by taking an appropriate summation
over these states.
5.2 Rabi Oscillations
When the pump field is applied to the atom, the atom undergoes Rabi oscillations.
As discussed in the section entitled The Raman Effect, the atom oscillates between states
(6)
151
a and b , skipping the intermediate state c . The system state at any time t takes the
form
ψ n (t ) = ca (t ) n
L
a
A
0
C
+ cb (t ) n
L
b
A
1C
(7)
Using standard approximations relevant to nonlinear optics (the near-resonant excitation,
electric dipole, rotating wave, and slowly-varying envelope approximations), the timevarying coefficients for photon number state n can be shown to have the general form
ca (t ) = cos(Ω R ,n t )
cb (t ) = i sin(Ω R ,nt )
(8)
where Ω R , n = 2Ω0 g 0 n δ is the Rabi oscillation frequency, g 0 = 2 µba E h is the
vacuum Rabi frequency, Ω0 = µ0 E h is the (complex) Rabi oscillation frequency, and
µba E is a matrix element of the electric dipole interaction Hamiltonian, consisting of the
electric dipole moment µab and the pump field envelope E . (Note that ca (0) = 1 and
cb (0) = 0 , indicating the atom is initially in the ground state.)
For large α , the coherent state resembles a Gaussian distribution of number states
with mean α and standard deviation
α . The number states n that contribute most to
the coherent summation are those with values near n = α , i.e., n = α (1 ± ∆α ) . Taking
the Taylor series expansion of
α (i.e., the additional field strength factor, not the
standard deviation), we find that
 ∆α 

2 
δ
δ

Roughly speaking, the final term in Equation (9) will have equal positive and negative
Ω R ,α (1±∆α ) =
2Ω 0 g 0
α (1 ± ∆α ) ≈
2Ω 0 g 0
α 1 ±
(9)
contributions, since the number states are distributed more or less symmetrically about α .
Thus, the overall Rabi frequency is given by
ΩR =
2Ω 0 g 0
δ
NP
(10)
152
where N P ≈ α is the average number of photons in the coherent state α .
5.3 Collective Excitation Mode
Consider an ensemble of N atoms of the type described above. The ensemble
has the state vector
ψ =α
where φ
j
L
(φ
φ 2L φ
1
N
)⊗ φ
(11)
C
is the state of atom j . Further, consider that the system is in its ground state,
and that the incident laser is of a low enough intensity that, on average, less than one
atom out of the entire ensemble will be excited into a Raman transition. The initial state
vector is
ψ =α
L
a
a 2L a
1
N
0
C
=α
L
A
0
E
C
(12)
where we have defined
A
E
= a
1
a 2L a
(13)
N
as the “ground state” of the ensemble.
Let us now also define
Bj
E
= a
1
a 2L b jL a
(14)
N
as excited state j of the ensemble. If the pulse excites a single atom, we may identify
that an atom has been excited from the photon emitted by the stimulated Raman
transition; however, we do not know which atom is in the excited state. The ensemble is
then in a superposition state; let us define that state as
B
E
=
1
N
(B
1 E
+ B2
E
+ L + BN
E
)
(15)
153
where the
N factor comes from vector normalization. B E , then, is the state where
precisely one atom of the ensemble is excited, and all other atoms are in their ground
states. We then find that the state of the system after a weak excitation pulse is
1
α L B E 1C
N
The ensemble then undergoes Rabi oscillations between the A E and the B
ψ = CA α
A
L
E
0
Rabi oscillation frequency of Ω R . The extra
C
+ CB
(16)
E
states at a
N is called the collective enhancement
factor [20].
5.4 Entanglement Using the Raman Effect
Consider two ensembles of the type described above, numbered 1 and 2. A weak
excitation pulse is launched into each ensemble. The output beam paths from the
ensembles are combined using a 50/50 beamsplitter; each of the two output ports from
the beamsplitter is directed to a photodetector. Call the photodetectors D1 and D2 . After
the excitation pulse, the system is in the state
ψ =
(
1
A
2
1
B
2
0112+ B
1
A
2
11 0
2
) + 2i ( A
1
A
0
2
1
0 2+ B
1
B
2
11 12
)
(17)
(to within a phase factor). If, after a particular excitation pulse, a photon is detected at
D1 but not at D2 , we cannot know with certainty the origin of the photon, so the system
is now in state
(
)
1
A1 B 2 0 1 1 2+ B 1 A 2 11 0 2
2
When the photon is absorbed (annihilated) in the detector, the ensembles remain in the
ψ =
(18)
state
ψ
E
=
(
1
A1 B 2+ B
2
1
A
2
)
(19)
154
Thus, when only one detector detects a photon in this setup, the atomic ensembles are
macroscopically entangled.
5.5 Photon Storage Using the Raman Effect
Consider again an atomic ensemble of the type described above. The ensemble
can be used to “store” a photon. First, let us define two additional ensemble states,
namely,
1 N
∑ b b L a jL b N
E
1
N
E
N j =1 1 2
The ensemble is first optically pumped into the state B′ E . In the “write” phase, the
B′
= b
b 2L b
A′
=
(20)
pump field (as defined earlier) acts as the “write” pulse, and the probe provides the
photon to be stored. A Raman transition is excited, and the system undergoes a transition
from B′
E
1 C to A′
E
0 C . The photon is “stored” in the ensemble state. Later, in the
“read” phase, the pump acts as a “read” pulse; only the atom in the a state sees the
pump frequency. A Raman transition is excited, and the system moves from A′
B′
E
1 C , releasing the photon “stored” in the ensemble state.
E
0
C
to
155
c
δ
0 or 1
α (t )
ωbc − δ
ωac − δ
b
a
Figure 50. A three-level system.
Chapter 6: Conclusion
6.1 Results and Validity
The experimental system described in this text consists of a laser system for
exciting Raman gain in neutral rubidium vapor and a detection system observing the
results both temporally and spectrally. The experiment itself and the associated detection
system have been shown to work effectively to provide the data desired. The experiment
has been refined and enhanced in several ways and is now straightforward to operate.
Data collection has been streamlined and simplified, and results are cataloged for easy
access and for archival.
The most interesting result to date produced by the experiment has been the
observation of multi-spectral Raman gain in the dual-isotope rubidium vapor induced by
a single pump laser. The origins of the spectral lines have been investigated, and a
numerical simulation has attributed these lines to Stokes and anti-Stokes lines in both
rubidium isotopes, as well as to the AC Stark shift. These observations, while striking,
are clearly explained by the theory and validate the experimental system as working
correctly.
For experiments where the multi-spectral gain is a hindrance rather than a
beneficial effect, the dual-isotope vapor cell has been replaced with an isotopically pure
vapor cell. Promising initial results have been obtained with this cell for the pulsed
excitation mode, indicating that the pulsing system and the detection system will both
156
157
work properly to achieve this end. The pulsed excitation mode allows several interesting
experiments to be carried out, including the use of vapor cells as quantum memories and
quantum entanglement sources.
6.2 Future Direction
The primary future direction of the experiment is to complete measurement and
observation of photon correlation in the vapor cell under pulsed excitation. Photon
correlation measurements will determine the degree to which entanglement is achieved in
the vapor medium. Once macroscopic entanglement is achieved, many further
experiments are possible. Two vapor cells may be used in conjunction as a quantum
memory. The vapor cells may be used as quantum bits in a quantum computer, or they
may be used as elements in a long-distance quantum communications link. Each of these
experiments represents a new frontier in optics, clearly predicted by existing theory but
yet to be demonstrated experimentally.
References
[1] Y. Zhu, T. N. Wasserlauf, and P. Sanchez, “Effect of optical pumping and Raman
scattering on the degenerate four-wave mixing in coherently pumped rubidium
atoms,” Phys. Rev. A 55, 668 (1997).
[2] M. Winter. (2005, February). WebElements™ Periodic Table (professional
edition). [Online]. Available: http://www.webelements.com
[3] K. J. R. Rosman and P. D. P. Taylor, “Isotopic Compositions of the Elements
1997,” Pure Appl. Chem. 70, 217 (1998).
[4] A. Heifetz, A. Agarwal, G. C. Cardoso, V. Gopal, P. Kumar, and M. S. Shahriar,
"Super efficient absorption filter for quantum memory using atomic ensembles in a
vapor," Opt. Commun. 232, 289 (2004).
[5] R. W. Boyd, Nonlinear Optics, 2nd ed., San Diego, CA: Academic Press, 2003.
[6] M. Poelker and P. Kumar, “Sodium-Raman laser: direct measurements of the
narrow-band Raman gain,” Opt. Lett. 17, 399 (1991).
[7] J.L. Bowie, J.C. Garrison and R.Y. Chiao, “Stimulated Raman gain in a Λ-type
atomic system with doubly excited transitions,” Phys. Rev. A 61 053811 (2000).
[8] Y. Zhu and J. Lin, “Sub-Doppler light amplification in a coherently pumped atomic
system,” Phys. Rev. A 53, 1767 (1996).
[9] Y. Zhu, J. Lin and P. Sanchez, “Measurement of light amplification in coherently
pumped rubidium atoms,” Opt. Commun. 128, 254-261 (1996).
158
159
[10] A. E. Kozhekin, K. Mølmer, and E. Polzik, “Quantum memory for light,” Phys.
Rev. A 62, 033809 (2000).
[11] A. Kuzmich, W. P. Bowen, A. D. Boozer, A. Boca, C. W. Chou, L. M. Duan and H.
J. Kimble, “Generation of nonclassical photon pairs for scalable quantum
communication with atomic ensembles,” Nature 423, 731 (2003).
[12] A.F. Huss, N. Peer, R. Lammegger, E.A. Korsunsky and L. Winholz, “Efficient
Raman sideband generation in a coherent atomic medium,” Phys. Rev. A 63,
013802 (2000).
[13] L. M. Duan, M. D. Lukin, J. I. Cirac, and P. Zoller, “Long-distance quantum
communication with atomic ensembles and linear optics,” Nature 414, 413 (2001).
[14] W. Jiang, C. Han, P. Xue, L. M. Duan, G. C. Guo, “Nonclassical photon pairs
generated from a room-temperature atomic ensemble,” Phys. Rev. A 69,043819
(2004).
[15] D. N. Matsukevich and A. Kuzmich, “Quantum state transfer between matter and
light,” Science 306, 663 (2004).
[16] M. S. Shahriar and P. R. Hemmer, “Generation of squeezed states and twin beams
via non-degenerate four-wave mixing in a Λ-system,” Opt. Commun. 158, 273
(1998).
[17] C. H. van der Wal, M. D. Eisaman, A. Andre, R. L. Walsworth, D. F. Phillips, A. S.
Zibrov and M. D. Lukin, “Atomic memory for correlated photon states”, Science
301, 196 (2003).
160
[18] M. P. Gordon and P. R. Selvin, “A microcontroller-based failsafe for single photon
counting modules,” Rev. Sci. Instrum. 74, 1150 (2003).
[19] The LabVIEW User’s Guide. Austin, TX: National Instruments, April 2003.
[20] [3D] L.M. Duan, J.I. Cirac and P. Zoller, “Three-dimensional theory for interaction
between atomic ensembles and free-space light,” Phys. Rev. A 66, 023818 (2002).
Appendix A: APD Power Supply
The APD power supply was fashioned from an ATX-style computer power
supply. Such supplies are cheap and readily available. The APD needs a +5 V DC
supply, which the PC power supply provides. The actual voltage measured from the
supply in the present experiment under no-load conditions was 5.25 V. The use of a
power supply with a built-in power switch is highly recommended.
A series of connectors, best referred to as hard drive power connectors, are
available from the power supply. (See Figure ff(a).) There is also an ATX power
connector, which is intended for connection to the computer motherboard. Two pins on
the ATX power connector need to be wired together, namely, pins 13 and 14. (Either
soldering or the use of a firmly secured jumper wire will do.) Pin 14 is the PS-ON pin,
which the motherboard typically drives low in order to turn the system power on. Pin 13
is a ground pin; wiring pins 13 and 14 together ensures the power supply will provide
power. See Figure ff(b), which shows pins 13 and 14 connected. (Whenever the power
supply is connected to line voltage and turned on, Pin 9, also called +5VSB, will provide
+5 V DC, but maximum draw for that pin is usually between 10 mA and 2 A.)
161
162
Figure 51. Hard drive and ATX power connectors.
163
Appendix B: Fabry-Pérot Cavities
B.1
Introduction
A Fabry-Pérot cavity, also called a Fabry-Pérot etalon, or an optical resonator, works as a
resonator or a wavelength-selective filter. In its simplest configuration, it consists of two
planar mirrors oriented parallel to each other and perpendicular to a transverse axis. It is
appropriate to consider the cavity qualitatively at first to gain an understanding of its
operation. A more mathematically rigorous analysis follows.
Consider the Fabry-Pérot cavity depicted in Figure 52. The cavity consists of two
mirrors, M1 and M2, with air (or vacuum) between them. Imagine a plane wave
impinging on M1, traveling along the transverse axis of the cavity (perpendicular to M1
and M2). What happens when the wave hits M1? No mirror is perfectly reflective, so let
us assume our mirrors have a reflectivity of 99%. That means that 99% of the wave is
reflected back in the direction from which it came. Call this “reflected wave 1.” It also
means that 1% of the wave propagates unaffected through M1 and into the cavity. It
turns out to be this 1% that is the most interesting.
Once the “1% wave” hits M2, we have another “split:” 99% of the 1% wave is reflected
back into the cavity, and 1% of the 1% wave is transmitted through M2 and out of the
cavity. Call this “transmitted wave 1.” The wave that is still contained in the cavity
propagates back to M1, where 1% of it is transmitted out of the cavity, towards the
original source (call it “reflected wave 2”). The remaining 99% is reflected back into the
164
cavity, beginning the process once again, giving us “transmitted wave 2,” “reflected wave
3,” and so forth.
After a long time, the electric field reflected from the cavity towards the source is the
sum of many reflected waves, and the electric field transmitted from the cavity along the
transverse axis is the sum of many transmitted waves. Here is the crux of the operation
of the Fabry-Pérot cavity: If these transmitted waves are all in phase, they will add
constructively, producing an output electric field comparable in size to the input field. If
they are not perfectly in phase, they will add destructively, and the output electric field
will be nearly zero. What determines whether the waves add constructively? In short,
constructive interference is achieved when the round-trip length of the cavity is equal to
an integral number of wavelengths of the incident field. When the cavity is any other
length, the waves will have random phases relative to each other and cancel each other
out. Thus, we see the first application of the Fabry-Pérot cavity: a wavelength-selective
filter.
There are countless other applications of Fabry-Pérot cavities. If one of the cavity
mirrors (say, M2) is mounted on an actuator such that it can be moved in a preciselycontrolled manner, the cavity becomes a tunable filter. Attaching feedback electronics to
the M2 actuator creates a system that can be used for laser frequency or intensity
stabilization. Sweeping the M2 offset linearly with time and recording the cavity output
produces an optical spectrum analyzer. Over time, the electric field intensity inside the
cavity builds up to a value much greater than the input electric field. Fabry-Pérot cavities
provide a way to generate very large electric fields at optical frequencies with reduced
165
laser power. Finally, for interferometric physical measurements, Fabry-Pérot cavities
provide an effective amplification of the interferometric effect.
B.2
Quantitative Analysis
We consider the Fabry-Pérot cavity in Figure 52 consisting of two large parallel plane
mirrors, M1 and M2, with complex reflectivities ρ1 and ρ 2 and complex transmissivities
τ 1 and τ 2 . We allow the mirrors to be infinitely thin, metallic, and non-absorptive. We
assume that the mirrors are centered on the z axis of some coordinate system, separated
by a distance of L and a medium of index of refraction n , not necessarily unity. We
consider a collimated laser beam of some definite cross section impinging
perpendicularly on M1, i.e., propagating along the transverse axis of the cavity. The
beam’s cross section is small enough to be entirely reflected by M1 and M2. We allow
the beam to have a step-function envelope in time, as though it were switched on
instantaneously at some point in time. This laser beam has a definite “point of first
incidence,” but after that point, it appears to be a continuous-wave (CW) beam. We
define the complex electric field at the input to the cavity (i.e., just before the first contact
with M1) to be monochromatic with amplitude E0 and free-space wave vector k0 . For
convenience, we define k = nk0 , τ 1 = 1 − ρ1 , and τ 2 = 1 − ρ 2 , and we proceed with our
analysis.
We are interested in the electric fields at several points in and around the cavity, namely,
at the points R , A , B , and T in Figure 53. The points R and A are is immediately to
the left and right of M1, respectively. The points B and T are immediately to the left
and right of M2, respectively. Electric fields labeled ERi are propagating to the left, and
166
electric fields labeled ETi are propagating to the right. Electric fields labeled E Ai and
EBi are propagating to the right if i is odd and to the left if i is even.
We have defined the field E0 to be at the input to the cavity, i.e., right-moving. At M1,
the input field is partly reflected and partly transmitted, giving ER1 = E0 ρ1 and E A1 = E0τ 1 .
The part of the beam that propagates through the cavity ( E A1 ) acquires a phase eikL , so
EB1 = E A1eikL = E0τ 1eikL . At M2, EB1 is partly transmitted and partly reflected, giving
ET 1 = EB1τ 2 = E0τ 1τ 2 eikL and EB 2 = EB1 ρ 2 = E0τ 1 ρ 2eikL . The field EB 2 now propagates
through the cavity to the left, giving E A2 = EB 2 eikL = E0τ 1 ρ 2ei 2 kL . (For the sake of rigor,
we note that left-moving fields travel a distance equal to − L but have a wave vector of
− k , since they are moving in the − z direction. Thus, each wave propagating through the
cavity acquires a phase shift of eikL , regardless of whether it is left- or right-propagating.)
The left-moving field at point A is then partly transmitted and partly reflected, giving
ER 2 = E A 2τ 1 = E0τ 12 ρ 2 ei 2 kL and E A3 = E A 2 ρ1 = E0τ 1 ρ1ρ 2 ei 2 kL . Finally, we note that
EB 3 = E A3eikL = E0τ 1 ρ1 ρ 2 ei 3kL , ET 3 = EB 3τ 2 = E0τ 1τ 2 ρ1 ρ 2 ei 3kL , and
EB 4 = EB 3 ρ 2 = E0τ 1 ρ1 ρ 22ei 3kL .
At this point, one can easily see a pattern developing. For example,
ET (2 j +3) = ET (2 j +1) ρ1 ρ 2ei 2 kL , meaning that ET (2 j +1) = E0τ 1τ 2eikL ( ρ1 ρ 2ei 2 kL ) j . Similarly,
ER (2 j + 2) = E0τ 12 ρ2 ei 2 kL ( ρ1 ρ2 ei 2 kL ) j . (All of these expressions hold for j ≥ 0 , where j is
the number of round-trips the beam has traveled through the cavity.) After a long time,
the total field transmitted through the cavity ( ET ) and the total field reflected from the
Fabry-Pérot cavity ( ER ) are just the sums of the individual components:
167
∞
ET = ET 1 + ET 3 + ET 5 + ET 7 + L = ∑ ET ( 2 j +1)
j =0
∞
(
= E 0τ 1τ 2 e ikL ∑ ρ1 ρ 2 e i 2 kL
j =0
)
j
∞
E R = E R1 + E R 2 + E R 4 + E R 6 + L = E R1 + ∑ E R ( 2 j + 2)
j =0
∞
(
= E 0 ρ1 + E 0τ 12 ρ 2 e i 2 kL ∑ ρ1 ρ 2 e i 2 kL
j =0
)
j
We can see that the two summations follow a geometric series:
∞
∑a
n =0
n
=
1
,
1− a
( a < 1)
We note that ρ1 < 1 and ρ 2 < 1 and continue:
τ 1τ 2 e ikL
ET = E 0
1 − ρ1 ρ 2 e i 2 kL

τ 2 ρ e i 2 kL
E R = E0  ρ1 + 1 2 i 2 kL
1 − ρ1 ρ 2 e




2
We now proceed to view the cavity response in terms of light intensity, where I ∝ E .
(The proportionality constant depends on the choice of units.) We define
ρ1 = ρ1 exp(iφ1 ) , ρ 2 = ρ2 exp(iφ2 ) , φ = φ1 + φ2 , ρ = ρ1 ρ 2 and τ = τ1τ 2 . First, for
simplicity, we note that
168
1 − ρ1 ρ 2 e i 2 kL
2
= [1 − ρ1 ρ 2 cos(2kL + φ1 + φ 2 )] + [ ρ1 ρ 2 sin(2kL + φ ]
2
2
= 1 − 2 ρ cos(2kL + φ ) + ρ 2
= 1 + ρ 2 − 2 ρ + 2 ρ − 2 ρ cos(2kL + φ )
= (1 − ρ ) 2 + 2 ρ [1 − cos(2kL + φ )]
= (1 − ρ ) 2 + 4 ρ sin 2 (kL + φ / 2)
[
= (1 − ρ ) 2 1 + (2 F / π ) 2 sin 2 (kL + φ / 2)
]
where we have defined F = π ρ /(1 − ρ ) . The parameter F is called the cavity finesse,
and its importance will become clear shortly. For now, note that for the usual case where
ρ is nearly unity, F is very large ( F >> 1 ).
The intensity of light transmitted through the cavity (in the steady state) is
IT ∝ ET
2
τ 1τ 2eikL
= I0
1 − ρ1ρ 2 ei 2 kL
2
I 0τ 2
1
2
2
(1 − ρ ) 1 + (2 F / π ) sin 2 (kL + φ / 2)
I MAX
=
2
1 + (2 F / π ) sin 2 (kL + φ / 2)
=
where I MAX = I 0τ 2 (1 − ρ ) 2 and I 0 ∝ E0 with the same proportionality constant used in
2
all intensity-to-field relations. Figure 54 shows a plot of IT versus L for several values
of F ; we proceed to analyze this plot. First of all, note that the plot is periodic, with a
period of ∆L = π / k = λ / 2 . This is a manifestation of the resonance condition 2L = mλ .
For example, assume laser light with λ = 700 nm enters a cavity of length L = 49 µ m .
We typically expect φ = 0 , meaning that the mirrors don’t induce a phase shift upon
169
reflection. If the cavity length is changed to L = 49.35 µ m , the laser light will still
resonate. (For cases where φ ≠ 0 , we may instead think of the cavity as being
“shortened” by an amount φ / 2k . Then, the resonance condition is 2 L = mλ + φ / 2k ;
round-trip length changes of an integral number of wavelengths still have no effect on the
transmitted light intensity.) The distance λ / 2 is called the free spectral range λFSR ,
which is the distance between successive resonance peaks. The index m of a given
resonance peak is called the cavity mode or transmission order.
The maximum intensity transmitted by the cavity is I MAX . Maximum transmission
occurs at resonance. The width of the resonance peak may be measured using the fullwidth at half-maximum (FWHM), which is the wavelength range over which at least half
of the maximum intensity is transmitted (for a single resonance peak). We note that the
intensity reaches half-maximum when 1 + (2 F / π )2 sin 2 (kL + φ / 2) = 2 , i.e., when
sin(kL + φ / 2) = ±π / 2 F . We assume φ = 0 , F >> 1 , and sin(θ ) ≈ θ and find that the
half-maximum points are at L = ±π / 2 Fk = ±λ / 4 F , giving the FWHM as
λ / 2 F = λFSR / F . This gives the primary definition of the finesse parameter F : it is the
ratio of the free spectral range to the resonance peak width. A high-finesse cavity,
distinguished by high-reflectivity mirrors, has very sharp resonance peaks and is very
sensitive to small changes in either the cavity length or the wavelength of the incident
light. A low-finesse cavity, on the other hand, will have broad resonance peaks.
The minimum transmitted intensity occurs when sin 2 (kL + φ / 2) = 1 , or when
kL + φ / 2 = (m + 1/ 2)π , halfway between resonance peaks. The intensity in that case is
I MAXT 2 /(1 + (2 F / π )2 ) ≈ I MAXπ / 4 F 2i , a factor of π / 4F 2 smaller than the maximum
170
intensity. Thus we have the secondary definition of the finesse, which is a measure of the
contrast of the cavity (ratio of maximum to minimum transmission).
It is worthwhile to note that Fabry-Pérot cavity parameters are often measured in terms of
frequency. In this case, the free spectral range ν FSR = c / 2 L , the FWHM ∆ν = ν FSR / F ,
and the transmitted light intensity at a frequency ν is given by
I MAX
IT =
2
1 + (2 F / π ) sin 2 (πν /ν FSR + φ / 2)
where we have used the fact that kL = 2πν L / c and ν FSR = c / 2 L . The true definition of
the cavity free spectral range actually comes from this notation; namely, ν FSR is defined
as the maximum frequency range that can be resolved uniquely by a spectrum analyzer.
It is clear that the cavity can uniquely resolve frequencies between ν 0 and ν 0 + ν FSR .
However, if the spectrum of the input light includes components at, say, both ν 0 +ν FSR / 2
and ν 0 + 3ν FSR / 2 , a spectrum analyzer tuned to ν 0 +ν FSR / 2 will allow both frequencies
to resonate. This is similar to the aliasing effect observed when sampling a signal above
the Nyquist rate.
B.3
Variations on a Theme
Many other kinds of Fabry-Pérot cavities are possible. For non-collimated Gaussian
beams, instead of planar mirrors, spherical mirrors may be used that match the curvature
of the beam phase fronts. The cavity mirrors need not be traditional silvered-glass
mirrors; in fact, any reflecting surfaces may be used, such as dielectric interface.
(Typically, reflection off a dielectric interface includes a phase shift, so φ ≠ 0 in the
above derivation.) If the medium between the mirrors has an index of refraction N ≠ 1 ,
171
the resonance condition becomes 2 L = mλ / N . The name Fabry-Pérot is usually
reserved for a cavity composed of two coaxial mirrors, but an optical cavity may also
take other forms. For example, three mirrors arranged in a triangle also function like a
cavity; light enters through one mirror, reflects off the second mirror, and reflects off the
third mirror back to the first mirror, completing the circuit. Such a cavity is called a ring
cavity, and the principles of operation are very similar to those of a Fabry-Pérot cavity.
One mirror is chosen as the input mirror, and another mirror is chosen as the output
mirror (usually called the output coupler). The output coupler is often of a lower
reflectance than the other cavity mirrors; the input mirror is sometimes chosen also to be
the output coupler for this reason. Light that leaks out through mirrors other than the
output coupler is considered to be a source of loss.
One variation that is particularly relevant in the context of this report is the use of
distributed Bragg reflectors (DBRs) as mirrors. A DBR consists of alternating parallel
layers of two dielectrics (such as indium phosphide and air) with thicknesses chosen to be
a quarter-multiple of the wavelength of the incident light, i.e., 2 L = (m + 1/ 2)λ / N , or
L = (m + 1/ 4)λ / N . Typically, L = (5 / 4)λ / N . The boundaries of each dielectric layer
act as a Fabry-Pérot cavity in the reflection mode. Typically, these dielectric boundaries
themselves have poor reflectivities, on the order of 30-70%. The dielectric layer acts as a
partial mirror, and some or most of the light is transmitted through to the next layer. The
next layer in turn acts as a partial mirror, reflecting some of the light. Successive layers
continue to act as partial mirrors, and the effective total reflectance of the DBR is equal
to the product of the reflectances of the individual partial mirrors (i.e., the cavities formed
172
by the individual dielectric layers). DBRs built up in this way can provide extremely
high reflectances, well above 99%. Further, they can be fabricated easily using existing
semiconductor processes.
173
L
M1
M2
Figure 52. Schematic of a Fabry-Pérot cavity.
174
L
A
B
R
Figure 53. Important locations for analyzing cavity resonance.
0.5 IMAX
F=5
F = 30
F = 300
0
IT
IMAX
175
(n-1)λ /2
nλ /2
(n+1)λ /2
L-φ/2k
Figure 54. Transmitted light intensity for three values of F.
176
Appendix C: LabVIEW Documentation
Vapor Cell Experiment.vi
Runs the start-stop and number correlation experiments using the SR430.
Version 1.0 (2004-01-16)
Connector Pane
Front Panel
Controls and Indicators
Experiment type Selects the experiment type. The different experiment types are (where
N is the number of cycles run):
Raw data. Runs the SR430. The data file contains an Nx(# bins) matrix, where the entire
trace of each cycle is in each row.
Start-stop. Runs the SR430 and finds the number of bins between the start time (the
trigger or start pulse) and the first pulse during the scan (the stop pulse). (The signal
input and trigger input of the SR430 should both be wired to the detector output.) Data file
177
contains an N-element vector, where each element is the index of the first non-zero bin
(starting from 1) for the given cycle.
Number correlation. Runs the SR430 and sums the number of pulses over two windows
(the write and read pulses). Data file contains an Nx2 matrix, where the first column
contains the sums over the first window and the second column contains the sums over
the second window.
# cycles Number of times (cycles) to run the experiment. Typically, one cycle involves
one write/read pulse sequence.
Bin width Bin width for the SR430.
# Kbins Number of bins to record each cycle (1K-16K). Transferring 1K bins over GPIB
takes approximately 60 ms. Transferring 16K bins over GPIB takes approximately 860
ms. (Running one scan takes approximately 270 to 300 ms in addition to the data transfer
time.)
Total scan time Displays the total SR430 scan time, which is Bin width times # Kbins
times 1024. After choosing a bin width, entering an approximate time here will change #
Kbins to match the nearest correct value.
First pulse offset For the Number correlation experiment only. Represents the starting
offset of the first "pulse" window for summing SR430 bins. The number of bins is on the
left, and the equivalent time is on the right; entering a number in either field will adjust the
corresponding field as well.
First pulse offset (time) For the Number correlation experiment only. Represents the
starting offset of the first "pulse" window for summing SR430 bins. The number of bins is
on the left, and the equivalent time is on the right; entering a number in either field will
adjust the corresponding field as well.
First pulse duration For the Number correlation experiment only. Represents the
number of bins in the first "pulse" window for summing SR430 bins. The number of bins
is on the left, and the equivalent time is on the right; entering a number in either field will
adjust the corresponding field as well.
First pulse duration (time) For the Number correlation experiment only. Represents
the number of bins in the first "pulse" window for summing SR430 bins. The number of
bins is on the left, and the equivalent time is on the right; entering a number in either field
will adjust the corresponding field as well.
Second pulse offset For the Number correlation experiment only. Represents the
starting offset of the second "pulse" window for summing SR430 bins. The number of
bins is on the left, and the equivalent time is on the right; entering a number in either field
will adjust the corresponding field as well.
Second pulse offset (time) For the Number correlation experiment only. Represents
the starting offset of the second "pulse" window for summing SR430 bins. The number of
bins is on the left, and the equivalent time is on the right; entering a number in either field
will adjust the corresponding field as well.
178
Second pulse duration For the Number correlation experiment only. Represents the
number of bins in the second "pulse" window for summing SR430 bins. The number of
bins is on the left, and the equivalent time is on the right; entering a number in either field
will adjust the corresponding field as well.
Data filename A MATLAB .mat file for storing the output data from the experiment. Load
the file in MATLAB using the load command.
A two-digit, incrementing number is added to the filename (so, e.g., SS.mat would
become SS01.mat). This number is incremented each time the experiment is run, so no
data files are overwritten.
You can type a filename here or use the browse button (...) to select a filename. In either
case, the number will be increased to avoid overwriting any existing files. For example, if
you type in the filename SS.mat in a directory that already includes SS01.mat through
SS04.mat, the filename will automatically be changed to SS05.mat. Similarly, if you use
the browse button to select, say, SS03.mat in the same directory, that file won't be
overwritten -- the filename will automatically be changed to SS05.mat.
To disable this behavior, choose Manual name. You will still be prompted before any
files are overwritten.
Browse A MATLAB .mat file for storing the output data from the experiment. Load the file
in MATLAB using the load command.
A two-digit, incrementing number is added to the filename (so, e.g., SS.mat would
become SS01.mat). This number is incremented each time the experiment is run, so no
data files are overwritten.
You can type a filename here or use the browse button (...) to select a filename. In either
case, the number will be increased to avoid overwriting any existing files. For example, if
you type in the filename SS.mat in a directory that already includes SS01.mat through
SS04.mat, the filename will automatically be changed to SS05.mat. Similarly, if you use
the browse button to select, say, SS03.mat in the same directory, that file won't be
overwritten -- the filename will automatically be changed to SS05.mat.
To disable this behavior, choose Manual name. You will still be prompted before any
files are overwritten.
Description A description for this particular run of the experiment. Current parameters
are added after this description to form the "Full description," which is written to the
Readme, log, and data files. Enter a new description here, or choose a previouslyentered description from the drop-down box (the small down arrow to the right of this
field).
GPIB address Selects the GPIB address of the SR430. Usually set to 8. If the computer
has multiple GPIB controllers, use an address of the form X:Y, where X is the controller
number (0, 1, ...) and Y is the GPIB address on that controller (usually 8).
Manual name Normally, the data filename ends in an incrementing number (e.g.,
179
SS01.mat). After each experiment, the number is incremented (e.g., from SS01.mat to
SS02.mat) to avoid overwriting data files. This is the default, recommended behavior. A
record of the description and parameters of each file is kept in the files Readme.txt and
Start-Stop Log.txt in the same directory as the data file, as well as in the data file itself.
To override this filename behavior and force a particular filename, turn on the Manual
name switch. (You will be prompted before any data file is overwritten, even if you enable
this switch.)
Run Starts the experiment running. Most of the front panel will be disabled while the
experiment runs. The End now button will be enabled, allowing you to end the
experiment early. The Run button will show whether the experiment is still running, and
the Cycles completed field will show how many cycles have been completed in the
current run.
End now Ends the current experiment when the current cycle completes. The data,
Readme, and log files will still be written correctly (unless an error occurs while writing
them).
Reinitialize Reinitializes the front panel to its default values. Pressing this button causes
a confirmation dialog box to appear. The confirmation dialog box has three buttons: Yes,
to confirm reinitialization (same as pressing Enter); No, if the Reinitialize button was
pressed by mistake (same as closing the dialog box); and Yes, file/dir too confirms the
reinitialization and also reinitializes the output file/directory as at the start of VI execution.
This button is primarily intended for use in case the front panel remains partly grayed out
after an experiment run completes.
Exit Ends execution of the VI. Note that the window will not automatically close. The Exit
button is preferred over the stop-sign Abort button on the VI toolbar.
If you want to edit this VI, press the Abort button instead.
Base data directory Base data directory where data sub-directories reside. The default
data directory is <base data directory>\<today's date>.
Second pulse duration (time) For the Number correlation experiment only.
Represents the number of bins in the first "pulse" window for summing SR430 bins. The
number of bins is on the left, and the equivalent time is on the right; entering a number in
either field will adjust the corresponding field as well.
# records/scan Number of records per scan. Same as "Records/Scan" on the SR430
Mode menu. One experiment cycle sums (averages) this many records together before
downloading data from the SR430.
Get data Not normally used. Downloads data from the SR430, saves it to the data file,
and updates the data filename (if Manual name is not selected). Does not start the
SR430 running.
This button is not needed after pressing the Run button, as the data is automatically
downloaded then. Use the Get data button to download data after pressing the "Start"
180
button on the SR430 front panel. (Note: The data downloaded may not be correct if the
SR430 is still running when this button is pressed.)
Read params Gets settings from the SR430 and makes those the current settings.
Full description Contains the full description of the experiment. The full description
consists of the Description field, followed by a string containing all of the parameters
used for the experiment. The full description is the description written to the data,
Readme, and log files.
Cycles completed Shows the number of cycles completed so far in the experiment run.
You can end the experiment early using the End now button.
Time stamp Shows the time at which the most recent experiment started.
Status Shows the status of the most recently completed experiment, including whether it
executed correctly and when it completed. The Status field is blank during the
experiment.
Readme filename Contains the auto-generated Readme filename. The Readme file
contains one line about each experiment run, i.e., data filename and full description. Note
that the Readme filename is always Readme.txt in the same directory as the data file
and cannot be changed.
Log filename Contains the auto-generated log filename. The log file contains several
lines of information about the execution of each experiment run, including begin and end
times and any error encountered. Note that the log filename is always Start-Stop Log.txt
in the same directory as the data file and cannot be changed.
Bin width (time) Contains the currently selected bin width as a real number with units of
time. Always kept in sync with the Bin width ring selector.
Overwrite confirmed? True if the user confirmed overwrite of the output file. If false, we
should ask for confirmation before running the experiment.
Initialize SR430.vi
Connector Pane
Front Panel
181
Controls and Indicators
error in (no error) The error in cluster can accept error information wired from VIs
previously called. Use this information to decide if any functionality should be bypassed
in the event of errors from other VIs.
The pop-up option Explain Error (or Explain Warning) gives more information about the
error displayed.
status The status boolean is either TRUE (X) for an error, or FALSE
(checkmark) for no error or a warning.
The pop-up option Explain Error (or Explain Warning) gives more information
about the error displayed.
code The code input identifies the error or warning.
The pop-up option Explain Error (or Explain Warning) gives more information
about the error displayed.
source The source string describes the origin of the error or warning.
The pop-up option Explain Error (or Explain Warning) gives more information
about the error displayed.
GPIB address
SR430 settings
182
Bin width
# bins (x1K)
# records/scan Number of records per scan. Same as "Records/Scan" on the
SR430 Mode menu. One experiment cycle sums (averages) this many records
together before downloading data from the SR430.
trigger level (V) trigger level. Must be within -2.0V <= x <=2.0V
trigger slope rising slope
TRUE: triggers on rising slope
FALSE: triggers on falling slope
discriminator slope rising slope
TRUE: triggers on rising slope
FALSE: triggers on falling slope
discriminator level (V) discriminator level. Must be within -0.3V <= x <= 0.3V
cursor on cursor on
TRUE: display cursor
FALSE: do not display cursor
error out The error in cluster can accept error information wired from VIs previously
called. Use this information to decide if any functionality should be bypassed in the event
of errors from other VIs.
The pop-up option Explain Error (or Explain Warning) gives more information about the
error displayed.
status The status boolean is either TRUE (X) for an error, or FALSE
(checkmark) for no error or a warning.
The pop-up option Explain Error (or Explain Warning) gives more information
about the error displayed.
code The code input identifies the error or warning.
The pop-up option Explain Error (or Explain Warning) gives more information
about the error displayed.
source The source string describes the origin of the error or warning.
The pop-up option Explain Error (or Explain Warning) gives more information
about the error displayed.
address out
183
SR430 Run Scan and Get Data.vi
Connector Pane
Front Panel
Controls and Indicators
GPIB address
error in (no error) The error in cluster can accept error information wired from VIs
previously called. Use this information to decide if any functionality should be bypassed
in the event of errors from other VIs.
The pop-up option Explain Error (or Explain Warning) gives more information about the
error displayed.
status The status boolean is either TRUE (X) for an error, or FALSE
(checkmark) for no error or a warning.
The pop-up option Explain Error (or Explain Warning) gives more information
about the error displayed.
184
code The code input identifies the error or warning.
The pop-up option Explain Error (or Explain Warning) gives more information
about the error displayed.
source The source string describes the origin of the error or warning.
The pop-up option Explain Error (or Explain Warning) gives more information
about the error displayed.
Cancel button ref
error out The error in cluster can accept error information wired from VIs previously
called. Use this information to decide if any functionality should be bypassed in the event
of errors from other VIs.
The pop-up option Explain Error (or Explain Warning) gives more information about the
error displayed.
status The status boolean is either TRUE (X) for an error, or FALSE
(checkmark) for no error or a warning.
The pop-up option Explain Error (or Explain Warning) gives more information
about the error displayed.
code The code input identifies the error or warning.
The pop-up option Explain Error (or Explain Warning) gives more information
about the error displayed.
source The source string describes the origin of the error or warning.
The pop-up option Explain Error (or Explain Warning) gives more information
about the error displayed.
Data
Data sum
address out
cancelled?
ref out
Run Start-Stop Experiment Once.vi
185
Connector Pane
Front Panel
Controls and Indicators
error in (no error) The error in cluster can accept error information wired from VIs
previously called. Use this information to decide if any functionality should be bypassed
in the event of errors from other VIs.
The pop-up option Explain Error (or Explain Warning) gives more information about the
error displayed.
status The status boolean is either TRUE (X) for an error, or FALSE
(checkmark) for no error or a warning.
The pop-up option Explain Error (or Explain Warning) gives more information
about the error displayed.
code The code input identifies the error or warning.
The pop-up option Explain Error (or Explain Warning) gives more information
about the error displayed.
source The source string describes the origin of the error or warning.
186
The pop-up option Explain Error (or Explain Warning) gives more information
about the error displayed.
GPIB address
Cancel button ref
error out The error in cluster can accept error information wired from VIs previously
called. Use this information to decide if any functionality should be bypassed in the event
of errors from other VIs.
The pop-up option Explain Error (or Explain Warning) gives more information about the
error displayed.
status The status boolean is either TRUE (X) for an error, or FALSE
(checkmark) for no error or a warning.
The pop-up option Explain Error (or Explain Warning) gives more information
about the error displayed.
code The code input identifies the error or warning.
The pop-up option Explain Error (or Explain Warning) gives more information
about the error displayed.
source The source string describes the origin of the error or warning.
The pop-up option Explain Error (or Explain Warning) gives more information
about the error displayed.
first non-zero bin index
address out
cancelled?
ref out
Write header.vi
Connector Pane
187
Front Panel
Controls and Indicators
error in (no error) The error in cluster can accept error information wired from VIs
previously called. Use this information to decide if any functionality should be bypassed
in the event of errors from other VIs.
The pop-up option Explain Error (or Explain Warning) gives more information about the
error displayed.
status The status boolean is either TRUE (X) for an error, or FALSE
(checkmark) for no error or a warning.
The pop-up option Explain Error (or Explain Warning) gives more information
about the error displayed.
code The code input identifies the error or warning.
The pop-up option Explain Error (or Explain Warning) gives more information
about the error displayed.
source The source string describes the origin of the error or warning.
The pop-up option Explain Error (or Explain Warning) gives more information
about the error displayed.
Output filename
188
Readme filename
Log filename
Time stamp
Full description
error out The error in cluster can accept error information wired from VIs previously
called. Use this information to decide if any functionality should be bypassed in the event
of errors from other VIs.
The pop-up option Explain Error (or Explain Warning) gives more information about the
error displayed.
status The status boolean is either TRUE (X) for an error, or FALSE
(checkmark) for no error or a warning.
The pop-up option Explain Error (or Explain Warning) gives more information
about the error displayed.
code The code input identifies the error or warning.
The pop-up option Explain Error (or Explain Warning) gives more information
about the error displayed.
source The source string describes the origin of the error or warning.
The pop-up option Explain Error (or Explain Warning) gives more information
about the error displayed.
Write data and log.vi
Writes the experiment data and information to the data and log files.
NOTE: This VI will execute even if error in is active.
Connector Pane
Front Panel
189
Controls and Indicators
User cancelled? (false)
error in (no error) The error in cluster can accept error information wired from VIs
previously called. Use this information to decide if any functionality should be bypassed
in the event of errors from other VIs.
The pop-up option Explain Error (or Explain Warning) gives more information about the
error displayed.
status The status boolean is either TRUE (X) for an error, or FALSE
(checkmark) for no error or a warning.
The pop-up option Explain Error (or Explain Warning) gives more information
about the error displayed.
code The code input identifies the error or warning.
The pop-up option Explain Error (or Explain Warning) gives more information
about the error displayed.
source The source string describes the origin of the error or warning.
The pop-up option Explain Error (or Explain Warning) gives more information
about the error displayed.
190
Data
Numeric
Output filename
Log filename
Full description
# cycles
Cycles completed
Status message
error out The error out cluster passes error or warning information out of a VI to be
used by other VIs.
The pop-up option Explain Error (or Explain Warning) gives more information about the
error displayed.
status The status boolean is either TRUE (X) for an error, or FALSE
(checkmark) for no error or a warning.
The pop-up option Explain Error (or Explain Warning) gives more information
about the error displayed.
code The code input identifies the error or warning.
The pop-up option Explain Error (or Explain Warning) gives more information
about the error displayed.
source The source string describes the origin of the error or warning.
The pop-up option Explain Error (or Explain Warning) gives more information
about the error displayed.
Log message
191
Appendix D: MATLAB Source Code
D.1
add_peaks.m
function add_peaks(figurefile);
%ADD_PEAKS
Add peak measurements to a figure.
if nargin < 1
fig = gcf;
else
fig = open(figurefile);
end
figure(fig);
hc = get(gca, 'Children');
h = [];
for k=1:length(hc)
if isequal(get(hc(k), 'Type'), 'line')
h = hc(k);
break;
end
end
if isempty(h), error('No lines on plot.'); end
xdata = get(h, 'XData');
ydata = get(h, 'YData');
ax = axis;
texty = ax(3)+(ax(4)-ax(3))*0.8;
liney = [ax(3), texty];
text2y = ax(3)+(ax(4)-ax(3))*0.7;
line2y = [ax(3), text2y];
textprop = {'HorizontalAlignment', 'center', ...
'VerticalAlignment', 'bottom'};
help_msg = ...
['Zoom in, then:\n', ...
'Press A to set the location of the anti-Stokes peak.\n', ...
'Press P to set the location of the probe.\n', ...
'Press F to enter the frequency separation of A-S and P.\n', ...
'Press M to measure the frequency offset of a peak.\n', ...
'Press D to delete the last measurement.\n', ...
'Press ? to repeat this message.\n', ...
'Press Q to quit.\n', ...
'\n'];
asx = [];
has = [];
px = [];
hp = [];
ish = ishold;
hold on;
192
freq = 3.0357*2;
probe_abs_freq = 0;
done = 0;
print_help = true;
hm = [];
while ~done
zoom on;
if print_help
fprintf(help_msg);
print_help = false;
end
k = waitforbuttonpress;
if k == 1
c = get(fig, 'CurrentCharacter');
switch lower(c)
case 'a'
fprintf('Click on the center of the anti-Stokes peak.\n');
[asx, dummy] = ginput(1);
if ~isempty(hm), delete(hm); hm = []; end
if ~isempty(has), delete(has); end
has(1) = line([asx, asx], line2y, 'Color', [0 0 0]);
has(2) = text(asx, text2y, 'Anti-Stokes', textprop{:});
case 'p'
fprintf('Click on the center of the probe peak.\n');
[px, dummy] = ginput(1);
if ~isempty(hm), delete(hm); hm = []; end
if ~isempty(hp), delete(hp); end
hp(1) = line([px, px], line2y, 'Color', [0 0 0]);
hp(2) = text(px, text2y, 'Probe', textprop{:});
case 'f'
fprintf('Enter the frequency separation in GHz between A-S and P: ');
f = input('');
fprintf('\n');
if ~isempty(hm), delete(hm); hm = []; end
if ~isempty(f), freq = f; end
case 'm'
if isempty(asx) || isempty(px)
fprintf('Before measuring, enter the A-S and P locations.\n');
continue;
end
fprintf('Click on the location to measure.\n');
[x, y] = ginput(1);
scale = freq./(asx-px);
shift = -px+probe_abs_freq./scale;
newx = (x+shift).*scale;
fprintf('X: Probe%+.8g, Y: %.8g\n', newx, y);
hl = line([x, x], liney, 'Color', [0 0 0]);
ht = text(x, texty, sprintf('%+.6g GHz', newx), textprop{:});
hm = [hm; hl, ht];
case 'd'
if ~isempty(hm)
k = size(hm, 1);
delete(hm(k, :));
hm(k, :) = [];
end
case '?'
print_help = true;
193
case 'q'
done = 1;
end
end
end
if ~ish, hold off; end
return;
D.2
adjust_lines.m
function adjust_lines(figurefile);
if nargin < 1
figurefile = gcf;
end
[labels, dh, oh, hfig] = get_peaks(figurefile);
N = length(labels);
any_needs_adjust = false;
for k=1:N
y = get(labels(k).hline, 'YData');
p = get(labels(k).htext, 'Position');
if y(2) == p(2)
labels(k).needs_adjust = false;
else
any_needs_adjust = true;
labels(k).needs_adjust = true;
labels(k).adjusted = false;
labels(k).old_ydata = y;
labels(k).new_ydata = [y(1) p(2)];
end
end
if ~any_needs_adjust
fprintf('No label lines need adjusting.\n');
return;
end
while true
for k=1:N
if labels(k).needs_adjust
if labels(k).adjusted
s = '[adj.]';
else
s = '[not adj.]';
end
else
s = '[needs no adj.]';
end
fprintf('%d: "%s" %s\n', k, labels(k).string, s);
end
n = input('Adjust which line height? ');
if isempty(n)
break;
194
end
validate_label(n, 1:N);
if ~labels(n).needs_adjust
fprintf('Label %d does not need to be adjusted.\n', n);
continue;
end
if labels(n).adjusted
labels(n).adjusted = false;
set(labels(n).hline, 'YData', labels(n).old_ydata);
else
labels(n).adjusted = true;
set(labels(n).hline, 'YData', labels(n).new_ydata);
end
end
return;
function validate_label(n, valid_labels);
if ~isnumeric(n) || numel(n) ~= 1 || ~any(n == valid_labels)
error('Invalid label.');
end
return;
D.3
dirx.m
function d = dirx(varargin);
%DIRX Enhanced version of DIR
% DIRX works exactly the same as DIR, with two additional features:
%
%
1) Multiple inputs may be passed, in which case the results are
%
concatenated. In other words,
%
D = DIRX('*.txt','*.mat');
%
works the same as
%
D = [DIR('*.txt'); DIR('*.mat')];
%
%
2) Returned structures have an additional field named 'path'.
%
The fields, then, are
%
name -- filename
%
date -- modification date
%
bytes -- number of bytes allocated to the file
%
isdir -- 1 if name is a directory and 0 if not
%
path -- relative path to the file
%
The complete file path can then be computed using
%
FULLFILE(S.path,S.name).
%
% For example, in a directory containing the file 'Readme.txt' and the
% empty directory 'Data',
%
d = dirx('Readme.txt', 'Data');
%
d(1), d(2), d(3)
% might return
%
ans =
%
name: 'Readme.txt'
195
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
date:
bytes:
isdir:
path:
ans =
name:
date:
bytes:
isdir:
path:
ans =
name:
date:
bytes:
isdir:
path:
'28-Jan-2005 11:38:18'
1308
0
''
'.'
'20-Jan-2005 10:32:06'
0
1
'Data'
'..'
'30-Dec-2004 14:08:34'
0
1
'Data'
See also DIR.
error(nargoutchk(0, 1, nargout));
if nargout == 0
for k=1:nargin
dir(varargin{k});
end
return;
end
if nargin == 0
d = dirx('*');
return;
end
d = [];
for k=1:nargin
n = varargin{k};
dd = dir(n);
path = n;
if exist(n, 'dir')
path2 = fileparts(path);
if length(path2) == length(path)-1
% strip trailing \ or /
path = path2;
end
else
path = fileparts(path);
end
for n=1:length(dd)
dd(n).path = path;
end
d = [d; dd];
end
return;
196
D.4
find_peaks.m
function [xval, yval, index, names] = find_peaks(figurefile, peaks, window);
%FIND_PEAKS
Find and maximize peaks previously marked by ADD_PEAKS.
if nargin < 1
figurefile = gcf;
end
if nargin < 3
window = [];
end
[labels, dh, oh, hfig] = get_peaks(figurefile);
Np = length(labels);
if Np == 0, error('No text/line pairs on plot.'); end
if isempty(dh), error('No data on plot.'); end
data_handle = dh(1);
if nargin < 2,
peaks = 1:Np;
else
if any(peaks < 1) || any(peaks > Np) || any(peaks ~= floor(peaks))
error('Invalid peak requested. Only %d peak lines in this plot.', Np);
end
end
line_xdata = get(data_handle, 'XData');
line_ydata = get(data_handle, 'YData');
Nd = length(line_xdata);
if isempty(window), window = ceil(0.02*Nd); end
xv = zeros(Np, 1);
yv = zeros(Np, 1);
ind = zeros(Np, 1);
nam = cell(Np, 1);
k = 1;
for peak=peaks
p = get(text_handles(peak), 'Position');
desired_x = p(1);
[dummy, closest_pt] = min(abs(line_xdata - desired_x));
min_pt = max(1, closest_pt - window);
max_pt = min(Nd, closest_pt + window);
[yv(k), w] = max(line_ydata(min_pt:max_pt));
ind(k) = w + min_pt - 1;
xv(k) = line_xdata(ind(k));
nam{k} = get(text_handles(peak), 'String');
k = k + 1;
end
switch nargout
case 0
for k=1:Np;
fprintf('Peak "%s": Max value at (%.6g, %.6g), index %d\n', ...
nam{k}, xv(k), yv(k), ind(k));
end
197
case 1
xval = yv;
case 2
xval = xv;
yval = yv;
case 3
xval = xv;
yval = yv;
index = ind;
case 4
xval = xv;
yval = yv;
index = ind;
names = nam;
end
return;
D.5
fpplot.m
function figs = fpplot(varargin);
%FPPLOT Plot Fabry-Perot data in the current directory.
% FPPLOT plots all data files in the current directory.
% FPPLOT('FILE1','FILE2',...) and FPPLOT('PATTERN1','PATTERN2',...) plot
% only files matching the specified names or wildcard patterns.
%
% While viewing the plots, a keypress will advance to the next plot. A
% left/up arrow will go to the previous plot. Many other features are
% available, as indicated by the help message at the start of execution.
%
% FIGS = FPPLOT('FILE1','FILE2',...) is a non-interactive version that
% returns handles to the figure windows created in the column vector
% FIGS. Note that the figures are created with the property 'Visible'
% set to 'off'.
if nargout > 0
interactive = false;
figs = [];
else
interactive = true;
end
files = load_files(varargin{:});
if isempty(files), return; end
clear settings;
max_binning = 16;
settings.binning = max_binning;
settings.autoscale = false;
settings.zoom = false;
settings.keep = false;
settings.fig = [];
settings.ex = [];
settings.visible = 'on';
198
% Figure out the global axis we should use
ex = [inf -inf inf -inf];
for k = 1:length(files)
t = files(1).t;
y = files(1).y;
newex = find_extents(files(k), max_binning);
ex(1) = min(ex(1), newex(1));
ex(2) = max(ex(2), newex(2));
ex(3) = min(ex(3), newex(3));
ex(4) = max(ex(4), newex(4));
end
if ex(1) == ex(2), ex(2) = ex(1) + 1; ex(1) = ex(1) - 1; end;
if ex(3) == ex(4), ex(4) = ex(3) + 1; ex(3) = ex(3) - 1; end;
settings.extents = ex;
if ~interactive
settings.visible = 'off';
for k=1:length(files)
figs(k) = figure('Visible', settings.visible);
settings.fig = figs(k);
files(k) = do_plot(files(k), [], settings);
end
return;
end
help_msg = ...
['\n', ...
'Next plot: right/down arrows or space bar\n', ...
'Prev plot: left/up arrows\n', ...
'Hold plot: H (press again to turn off)\n', ...
'Autoscale: A (press again to turn off)\n', ...
'Set scale: S\n', ...
'Binning:
B (toggles 1 or 16 samples, SR430 files only)\n', ...
'Zoom mode: Z (press again to turn off)\n', ...
'Redraw:
R\n', ...
'Exit:
Escape key\n', ...
'Keep plot: K (exits but leaves plot window open)\n', ...
'Help:
? (prints this message)\n', ...
'\n'];
fprintf(help_msg);
hold_file = [];
k = 1;
settings.fig = figure;
while k >= 1 && k <= length(files)
% Display the figure in a loop
new_file = 0;
replot = 1;
while ~new_file
if replot
clf;
files(k) = do_plot(files(k), hold_file, settings);
end
b = getbutton;
switch b
case {'h', 'H'}
% toggle hold mode
199
if ~isempty(hold_file)
fprintf('%s will no longer display on each plot\n', ...
hold_file.name);
hold_file = [];
% Redisplay the figure
new_file = 0;
replot = 1;
else
hold_file = files(k);
fprintf('%s will now display on each plot\n', ...
hold_file.name);
% Display the next figure
new_file = 1;
end
case {'a', 'A'}
if settings.autoscale
settings.autoscale = false;
fprintf('Autoscale off.\n');
else
settings.autoscale = true;
fprintf('Autoscale on.\n');
end
new_file = 0;
replot = 1;
case {'b', 'B'}
if settings.binning == 1
settings.binning = max_binning;
else
settings.binning = 1;
end
fprintf('Binning set to %d times.\n', settings.binning);
new_file = 0;
replot = 1;
case {'s', 'S'}
fprintf('Plots will now use this axis scaling.\n');
settings.autoscale = false;
% settings.extents = find_extents(files(k), max_binning);
settings.extents = axis;
new_file = 0;
replot = 1;
case {'z', 'Z'}
if settings.zoom
fprintf('Zoom off.\n');
zoom off;
settings.zoom = false;
else
fprintf('Zoom on.\n');
zoom on;
settings.zoom = true;
end
new_file = 0;
replot = 0;
case {'r', 'R'}
new_file = 0;
replot = 1;
case 27 % Escape key
k = -1;
200
new_file = 1;
case {'k', 'K'}
settings.keep = true;
k = -1;
new_file = 1;
case {28, 30} % left arrow, up arrow
k = k - 1;
if k < 1, k = length(files); end
new_file = 1;
case {' ', 29, 31} % right arrow, down arrow
k = k + 1;
if k > length(files), k = 1; end
new_file = 1;
case '?'
fprintf(help_msg);
new_file = 0;
replot = 0;
otherwise
% ignore
new_file = 0;
replot = 0;
end
end
end
if ~settings.keep, close(settings.fig); end
return;
function files = load_files(varargin);
dirfiles = dirx(varargin{:});
files = [];
if isempty(dirfiles), return; end
for d = dirfiles';
if d.isdir
continue;
end
name = fullfile(d.path, d.name);
% replace TeX characters
title = regexprep(name, '([{}\\^_])', '\$1', 'tokenize');
% find file type
typenum = 0;
done = false;
while ~done
try
switch typenum
case 0
s = load(name, '-mat');
if isfield(s, 'data')
d = s.data;
else
% pick the largest numeric item in the structure
n = fieldnames(s);
maxel = 0;
field = [];
for k=1:length(n)
201
obj = s.(n{k});
if ~isnumeric(obj), continue; end
if numel(obj) > maxel
maxel = numel(obj);
field = k;
end
end
if isempty(field), error('Can''t find data'); end
end
% Pick the first row or first column (whichever's longer)
if size(d, 1) >= size(d, 2)
y = d(:, 1);
else
y = d(1, :).';
end
t = 1:length(y);
files = [files; ...
struct('name', name, 'title', title, 'type', 'mat', ...
'info', s, 't', t, 'y', y, 'axis', [])];
case 1
d = load(name, '-ascii');
if size(d, 1) >= size(d, 2)
if size(d, 2) >= 2
t = d(:, 1);
y = d(:, 2);
% silently ignore other columns
else
y = d(:, 1);
t = 1:length(y);
end
else
if size(d, 1) >= 2
t = d(1, :).';
y = d(2, :).';
% silently ignore other rows
else
y = d(1, :).';
t = 1:length(y);
end
end
d = sortrows([t, y]); t = d(:, 1); y = d(:, 2);
s = struct([]);
files = [files; ...
struct('name', name, 'title', title, 'type', 'CSV', ...
'info', s, 't', t, 'y', y, 'axis', [])];
case 2
s = read_sr430(name, 'struct');
files = [files; ...
struct('name', name, 'title', title, 'type', 'SR430', ...
'info', s, 't', s.time, 'y', s.data, 'axis', [])];
case 3
[t, y, s] = read_tds3000(name);
files = [files; ...
struct('name', name, 'title', title, 'type', 'TDS3000', ...
'info', s, 't', t, 'y', y, 'axis', [])];
otherwise
fprintf('Couldn''t read %s, skipping\n', name);
202
end
done = true;
catch
% ignore errors; try next file type
typenum = typenum + 1;
end
end
end
%if isempty(files)
% error('Couldn''t find any readable files.');
%end
return;
function b = getbutton;
w = waitforbuttonpress;
btn = get(gcf, 'SelectionType');
b = get(gcf, 'CurrentCharacter');
if w == 0
switch lower(btn)
case 'normal', b = char(201);
case 'extend', b = char(203);
case 'alt',
b = char(202);
case 'open',
b = char(211);
otherwise,
b = char(200);
end
end
return;
function [t2, y2] = bin(t, y, binning);
if binning == 1
t2 = t;
y2 = y;
return;
end
t2 = t(1:binning:end);
y2 = sum(reshape(y(1:floor(end/binning)*binning), binning, []))';
return;
function ex = find_extents(file, max_binning)
ex = [inf -inf inf -inf];
switch file.type
case 'SR430'
[t2, y2] = bin(file.t, file.y, max_binning);
ex(1) = min(t2);
ex(2) = max(t2);
ex(3) = min(y2);
ex(4) = max(y2);
otherwise
ex(1) = min(file.t);
ex(2) = max(file.t);
ex(3) = min(file.y);
203
ex(4) = max(file.y);
end
%ex(1) = min(ex(1), 0);
%ex(2) = max(ex(2), 0);
%ex(3) = min(ex(3), 0);
%ex(4) = max(ex(4), 0);
return;
function file = do_plot(file, hold_file, settings);
%figure(settings.fig)
raise_figure(settings);
switch file.type
case 'SR430'
binwidth = file.info.binwidth*settings.binning*1e6;
points = file.info.nbins/settings.binning/1024;
rec = file.info.nrecords;
[t2, y2] = bin(file.t, file.y, settings.binning);
if isempty(hold_file)
plot(t2, y2);
title(sprintf('%s, %d rec, bin width %.4g \\mu{}s, %gK pts', ...
file.title, rec, binwidth, points));
else
[ht2, hy2] = bin(hold_file.t, hold_file.y, settings.binning);
ax = plotyy(t2, y2, ht2, hy2);
if ~isempty(hold_file.axis), axis(ax(2), hold_file.axis); end
title(sprintf(['%s (blue) and %s (green), ', ...
'%d rec, bin width %.4g \mu{}s, %gK pts'], ...
file.title, hold_file.name, rec, binwidth, points));
end
otherwise
if isempty(hold_file)
plot(file.t, file.y);
title(file.title);
else
ax = plotyy(file.t, file.y, hold_file.t, hold_file.y);
if ~isempty(hold_file.axis), axis(ax(2), hold_file.axis); end
title(sprintf('%s (blue) and %s (green)', file.title, hold_file.title));
end
end
grid on;
xlabel('Time (s)');
switch file.type
case 'SR430', ylabel('Photon count');
otherwise,
ylabel('Arbitrary scale');
end
if settings.autoscale
file.axis = [0 0 0 0];
file.axis(1) = min(min(file.t), 0);
file.axis(2) = max(max(file.t), 0);
file.axis(3) = min(min(file.y), 0);
file.axis(4) = max(max(file.y), 0);
axis(file.axis);
else
file.axis = settings.extents;
axis(file.axis);
204
end
if settings.zoom
zoom on;
else
zoom off;
end
return;
function raise_figure(settings);
% figure(f) does three things: create a figure if one doesn't exist, raise
% it above other figures, and make it visible. This function does only the
% first two.
h = get(0, 'Children');
if ~any(h == settings.fig)
figure(settings.fig, 'Visible', settings.visible);
else
set(0, 'CurrentFigure', settings.fig);
h = [settings.fig; h(h ~= settings.fig)];
end
return;
D.6
full_spectrum.m
function [varargout] = full_spectrum;
% FULL_SPECTRUM
Get a full spectrum out of s-absorp1,4.fig.
error(nargchk(0, 0, nargin));
error(nargoutchk(0, 2, nargout));
try
m = load('full_spectrum.mat', '-mat');
f = m.f;
a = m.a;
switch nargout
case 2
varargout = {f, a};
case {0, 1}
varargout = {a};
end
return;
catch
% no luck -- regenerate it
end
% Get data
h1 = open('s-absorp1.fig');
hl1 = findobj(h1, 'type', 'line');
f1 = get(hl1, 'XData');
a1 = get(hl1, 'YData');
close(h1);
h4 = open('s-absorp4.fig');
hl4 = findobj(h4, 'type', 'line');
205
f4 = get(hl4, 'XData');
a4 = get(hl4, 'YData');
close(h4);
% These parameters are manually computed
adj = [1.969, 0.9035];
f1adj = (f1-max(f1)./2-min(f1)./2).*adj(2)+adj(1);
a1adj = (a1-min(a1))./(max(a1)-min(a1)).*(max(a4)-min(a4)) + min(a4);
df = 0.001;
% 1) Interpolate #4
f4min = ceil(min(f4)./df).*df;
f4max = 8.6; % because that's all the data in the figure file
f4i = f4min:df:f4max;
a4i = interp1(f4, a4, f4i, 'linear');
% 2) Interpolate #1
f1min
f1max
f1i =
a1i =
= ceil(min(f1adj)./df).*df;
= floor(max(f1adj)./df).*df;
f1min:df:f1max;
interp1(f1adj, a1adj, f1i, 'linear');
% 3) Extend #1 to the left
% Take 1 GHz of noise from the existing data
noise = f1i >= 3 & f1i < 4;
noisef = f1i(noise);
noisea = a1i(noise);
% Turn it into 3 GHz of noise by rephasing it randomly
na = fft(noisea);
aa = abs(na);
a1 = aa.*exp(i.*4.*pi.*(rand(size(na))-0.5));
a1(1) = na(1); % need to keep the DC phase the same
a2 = aa.*exp(i.*4.*pi.*(rand(size(na))-0.5));
a2(1) = na(1); % need to keep the DC phase the same
a3 = aa.*exp(i.*4.*pi.*(rand(size(na))-0.5));
a3(1) = na(1); % need to keep the DC phase the same
% Prepend it to a1i
f1min = f1min - 3;
f1i = [f1min:df:f1max];
a1i = [real(ifft(a1)), real(ifft(a2)), real(ifft(a3)), a1i];
% 4) Merge the two
f = [f1min:df:f4max];
a1first = a1i(f1i < f4min);
a1mid = a1i(f1i >= f4min);
a4mid = a4i(f4i <= f1max);
a4last = a4i(f4i > f1max);
a = [a1first, mean([a1mid; a4mid]), a4last];
% 5) One last adjustment: Make "zero frequency" the 85Rb F=2 line
f = f - 2;
% Save the .mat file for future use
save('full_spectrum.mat', 'f', 'a');
206
switch nargout
case 2
varargout = {f, a};
case {0, 1}
varargout = {a};
end
return;
return;
D.7
get_peaks.m
function [labels, data_handles, other_handles, hfig] = ...
get_peaks(figurefile);
%GET_PEAKS
Return a list of peaks previously marked by ADD_PEAKS.
error(nargchk(0, 1, nargin));
error(nargoutchk(0, 4, nargout));
if nargin < 1
hfig = gcf;
else
if isnumeric(figurefile)
hfig = figurefile;
try
obj = get(hfig, 'Type');
if ~isequal(obj, 'figure')
error('Invalid figure handle.');
end
catch
error('Invalid figure handle.');
end
else
hfig = open(figurefile);
end
end
figure(hfig)
hc = get(gca, 'Children');
Nhc = length(hc);
h = [];
text_handles = [];
line_handles = [];
data_handles = [];
other_handles = [];
k = 1;
types = get(hc, 'Type');
while k <= Nhc
% Is it a text object followed by a line object?
if k < Nhc && matching_text_and_line(hc(k), hc(k+1))
text_handles = [text_handles; hc(k)];
line_handles = [line_handles; hc(k+1)];
k = k + 2;
continue;
207
end
% Is it a line by itself?
if isequal(get(hc(k), 'Type'), 'line') && isempty(data_handles)
data_handles = [data_handles; hc(k)];
k = k + 1;
continue;
end
% Save as "other" and try next possible match
other_handles = [other_handles; hc(k)];
k = k + 1;
end
for k=1:length(text_handles)
labels(k).string = get(text_handles(k), 'String');
labels(k).htext = text_handles(k);
labels(k).hline = line_handles(k);
x = get(line_handles(k), 'XData');
labels(k).xpos
= x(1);
end
return;
function b = matching_text_and_line(htext, hline);
b = false;
% Are the types right?
if ~isequal(get(htext, 'Type'), 'text'), return; end
if ~isequal(get(hline, 'Type'), 'line'), return; end
%% pt = get(htext, 'Position');
% Is it a vertical line?
xd = get(hline, 'XData');
if length(xd) ~= 2, return; end
if any(xd ~= xd(1)), return; end
% If we've gotten this far, they match.
b = true;
return;
D.8
read_sr430.m
%READ_SR430 Read trace file generated by the SR430.
% D = READ_SR430('FILE',OPTIONS) reads the SR430 trace file FILE and stores
% the bin data in the column vector D. [D,T] = READ_SR430('FILE') also
% returns a column vector T that indicates the time offset of each data
% point in seconds, where T(1) is always 0. OPTIONS may be one or more
% optional strings described below:
%
% 'float'
Convert data to floating-point format, if floating-point
%
information is present in the file header
% 'notime'
Do not generate the time vector T (used with 'struct')
% 'struct'
Return a structure S with the following fields:
%
%
S.signature
The character string ['SR430_TRACE' 26]
%
S.binwidth
Bin width in seconds
%
S.nbins
Number of bins per record
%
S.mindata
Minimum data value for floating-point data
208
%
%
%
%
%
%
S.datarange
S.nrecords
S.data
S.time
Data range for floating-point data
Number of records accumulated
Same as D above
Same as T above
For more information, see the SR430 manual.
function [data, t] = read_sr430(filename, varargin);
error(nargchk(1, inf, nargin));
error(nargoutchk(0, 2, nargout));
use_float = 0;
notime = 0;
return_struct = 0;
for k=1:nargin-1
s = varargin{k};
if ~ischar(s), error('Options must be given as strings.'); end
switch lower(s)
case 'float', use_float = 1;
case 'notime', notime = 1;
case 'struct', return_struct = 1;
otherwise error('Unknown option ''%s''.', s);
end
end
% Undocumented option: pass an open file handle in place of the
% filename.
if ischar(filename)
[fid, s] = fopen(filename, 'r', 'ieee-le');
if fid == -1, error('Error opening %s: %s', filename, s); end
else
fid = filename;
end
% Read in the
S.signature =
S.binwidth =
reserved
=
S.nbins
=
reserved
=
S.mindata
=
S.datarange =
S.nrecords =
header
char(fread_exactly(fid, 12, 'uint8'))';
fread_exactly(fid, 1, 'uint16');
fread_exactly(fid, 2, 'uint8');
fread_exactly(fid, 1, 'uint16');
fread_exactly(fid, 18, 'uint8');
fread_exactly(fid, 1, 'float32');
fread_exactly(fid, 1, 'float32');
fread_exactly(fid, 1, 'uint32');
% Process header
if ~strcmp(S.signature, ['SR430_TRACE' 26])
error('Invalid file header.');
end
if S.binwidth < 0 || S.binwidth > 19, error('Invalid file header.'); end
if S.binwidth == 0
S.binwidth = 5e-9;
else
S.binwidth = 20e-9*2^S.binwidth;
end
if S.nbins < 1 || S.nbins > 16, error('Invalid file header.'); end
209
S.nbins = S.nbins.*1024;
% Read the data
if S.nbins == 0, S.nbins = inf; end
S.data
= fread_exactly(fid, S.nbins, 'uint16');
S.nbins = length(S.data);
% Convert to floating point data, if desired
if use_float && (S.datarange ~= 0 || S.mindata ~= 0)
S.data = S.mindata + (S.data./65536).*S.datarange;
end
% Compute time offsets
if ~return_struct || ~notime
S.time = [0:S.nbins-1]'.*S.binwidth;
end
% Close the file
if ischar(filename)
fclose(fid);
end
% Return the data
if return_struct
data = S;
else
data = S.data;
if nargout > 1
t = S.time;
end
end
return;
%FREAD_EXACTLY Read exactly the specified number of elements.
% FREAD_EXACTLY takes the same arguments as FREAD. It returns only one
% array (called A in the help text for FREAD). If the number of
% elements read does not match the number of elements requested, or if
% an error occurs while reading the data, FREAD_EXACTLY issues an error
% message.
%
% See also FREAD.
function data = fread_exactly(fid, varargin);
if nargin >= 2
if ischar(varargin{1})
count = inf;
else
count = varargin{1};
end
else
count = inf;
end
data = fread(fid, varargin{:});
210
if length(count) == 2
if isinf(count(2))
if ~feof(fid)
error('Couldn''t read file header.');
end
elseif all(size(data) ~= count)
error('Couldn''t read file header.');
end
elseif size(data, 1) ~= count
error('Couldn''t read file header.');
end
s = ferror(fid);
if ~isempty(s), error('Couldn''t read file header: %s', s); end
return;
D.9
read_tds3000.m
%READ_TDS3000 Read a TDS3000-series oscilloscope data file.
% Y = READ_TDS3000('FILE.ISF') loads the waveform data stored in FILE.ISF
% and returns it in the column vector Y.
%
% [X,Y] = READ_TDS3000('FILE.ISF') also returns the appropriate X values in
% the column vector X.
%
% [X,Y,S] = READ_TDS3000('FILE.ISF') also returns a structure S containing
% the parameters specified in the data file.
%
% S = READ_TDS3000('FILE.ISF','struct') returns only S with no X or Y data.
%
% The option 'intdata' returns unscaled integer data for X and Y, rather
% than scaling using the parameters in the data file.
%
% READ_TDS3000('FILE.ISF', 'plot') will generate a plot in the current
% figure window from the data in FILE.ISF. Any remaining options will
% be passed directly to the plot command.
%
% Note: If a min-max waveform (peak detect or envelope) is saved to disk, Y
% will have two columns. The first column will contain the minimum values,
% and the second column will contain the maximum values.
function varargout = read_tds3000(filename, varargin);
error(nargchk(1, inf, nargin));
error(nargoutchk(0, 3, nargout));
use_intdata = 0;
struct_only = 0;
do_plot = 0;
plot_args = {};
for k=1:nargin-1
switch lower(varargin{k})
case 'intdata'
211
use_intdata = 1;
case 'struct'
struct_only = 1;
if nargout > 1
error('Only one output argument allowed with "struct" option.');
end
case 'plot'
do_plot = 1;
plot_args = {varargin{k+1:end}};
break;
otherwise
error('Unknown option "%s".', varargin{k});
end
end
[fid, s] = fopen(filename, 'r');
if fid == -1, error('Error opening %s for reading: %s.', filename, s); end
[c, n] = fread(fid, inf, 'uchar');
c = char(c)';
fclose(fid);
if ~strcmp(upper(c(1:8)), ':WFMPRE:')
error('Unrecognized file header in %s.', filename);
end
quotes = find(c == '"');
marks = zeros(size(c));
marks(c == ':') = 1;
marks(c == ';') = 2;
marks(isspace(c)) = 3;
marks(quotes) = 4;
if mod(length(quotes), 2) == 1, quotes = quotes(1:end-1); end
for k=1:2:length(quotes)
marks(quotes(k)+1:quotes(k+1)-1) = 0;
end
findmarks = find(marks ~= 0);
byte_num = 2;
bit_num = 16;
encoding = 'BIN';
bin_format = 'RI';
byte_order = 'MSB';
num_pts = 10000;
waveform_id = 'TDS3000 Waveform';
point_format = 'Y';
xincr = 0.01;
point_offset = 0;
xzero = 0;
xunit = 's';
ymult = 1;
yzero = 0;
yoffset = 0;
yunit = 'V';
curve_data = '';
% Find all the commands
212
subcmdregex = '(\w+)\s*("[^"]*"|[^":;\s]*)\s*;?';
wfmregex = ['WFMPr?e?:((' subcmdregex ')*)'];
curveregex = 'CURVe?\s+#[0-9]';
f = 0;
while 1
c = c(f+1:end);
if isempty(c), break; end
n = min(find(c ~= ':' & ~isspace(c)));
if isempty(n), break; end
c = c(n:end);
[s, f, t] = ...
regexpi(c, ['^:?(' wfmregex '|' curveregex '):?\s*'], 'once');
if isempty(s) | isempty(t)
error('Unrecognized command or trailing garbage in file.');
break;
end
a = t{1}(1, 1);
b = t{1}(1, 2);
cmd = c(a:b);
if ~isempty(regexpi(cmd, '^WFMP(re)?', 'once'))
% process subcommands
[a, b, tokens] = regexpi(cmd, ['^' wfmregex], 'once');
if isempty(tokens), error('Invalid WFMPRE command.'); end
tokens = tokens{1};
subcmds = cmd(tokens(1):tokens(2));
[a, b, t] = regexpi(subcmds, subcmdregex);
for k=1:length(t)
tk = t{k};
subcmd = upper(subcmds(tk(1, 1):tk(1, 2)));
param = subcmds(tk(2, 1):tk(2, 2));
if param(1) == '"' & param(end) == '"'
param = param(2:end-1);
end
upperparam = upper(param);
numparam = sscanf(param, '%g');
switch subcmd
case {'BYT_N', 'BYT_NR'},
byte_num
= numparam;
case {'BIT_N', 'BIT_NR'},
bit_num
= numparam;
case {'ENC', 'ENCD', 'ENCDG'},
encoding
= upperparam;
case {'BN_F', 'BN_FM', 'BN_FMT'}, bin_format
= upperparam;
case {'BYT_O', 'BYT_OR'},
byte_order
= upperparam;
case {'NR_P', 'NR_PT'},
num_pts
= numparam;
case {'WFI', 'WFID'},
waveform_id = param;
case {'PT_FMT'},
point_format = upperparam;
case {'XIN', 'XINC', 'XINCR'},
xincr
= numparam;
case {'PT_O', 'PT_OF', 'PT_OFF'}, point_offset = numparam;
case {'XZE', 'XZER', 'XZERO'},
xzero
= numparam;
case {'XUN', 'XUNI', 'XUNIT'},
xunit
= param;
case {'YMU', 'YMUL', 'YMULT'},
ymult
= numparam;
case {'YZE', 'YZER', 'YZERO'},
yzero
= numparam;
case {'YOF', 'YOFF'},
yoffset
= numparam;
case {'YUN', 'YUNI', 'YUNIT'},
yunit
= param;
otherwise
error('Ignoring unrecognized subcommand "%s".', subcmd);
end
end
elseif ~isempty(regexpi(cmd, '^CURV(e)?', 'once'))
213
% process curve
[dummy, n] = regexpi(c, '^:?CURV(e)?\s*#[0-9]', 'once');
nb = c(n)-'0';
[len, dummy, msg] = sscanf(c(n+1:n+nb), '%d');
if ~isempty(msg), error('Invalid curve length.'); end
curve_data = c(n+nb+1:n+nb+len);
f = n+nb+len;
else
% This should never happen
error('Unrecognized command.');
end
end
y = curve_data;
% Now process the data according to the parameters
if bit_num ~= 8*byte_num
error('Invalid BIT_NR/BYT_NR combination.');
end
switch encoding
case 'ASC'
data = sscanf([curve_data ','], '%d,');
case 'BIN'
if mod(length(curve_data), byte_num) ~= 0
error('Odd-length curve data for specified BYT_NR.');
end
data = reshape(double(curve_data), byte_num, []);
switch upper(byte_order)
case 'MSB', mult = 256.^[byte_num-1:-1:0];
case 'LSB', mult = 256.^[0:byte_num-1];
otherwise, error('Invalid BYT_OR.');
end
data = (mult*data)';
switch upper(bin_format)
case 'RP', %do nothing
case 'RI', w = (data > 2^(bit_num-1)); data(w) = data(w) - 2^bit_num;
otherwise, error('Invalid BN_FMT.');
end
end
if num_pts ~= length(data)
error('Specified number of points is different than data length.');
end
% data now holds the raw integer data from the oscilloscope
% Format the data
n = [0:length(data)-1]';
xdata = xzero + xincr.*(n-point_offset);
switch upper(point_format)
case 'Y'
ydata = yzero + ymult.*(data - yoffset);
case 'ENV'
% y(:, 1) is min. pts, y(:, 2) is max. pts
ydata = yzero + ymult.*(reshape(data, 2, [])' - yoffset);
end
214
if use_intdata
xdata = 0:length(xdata)-1;
ydata = data;
end
if do_plot
plot(xdata, ydata, plot_args{:});
title([filename, ': ', waveform_id]);
xlabel(['X (', xunit, ')']);
ylabel(['Y (', yunit, ')']);
v = axis;
axis([min(xdata), max(xdata), v(3:4)]);
if size(ydata, 2) == 2
legend('Minimum', 'Maximum', 0);
end
end
% Create
S.BYT_NR
S.BIT_NR
S.ENCDG
S.BN_FMT
S.BYT_OR
S.NR_PT
S.WFID
S.PT_FMT
S.XINCR
S.PT_OFF
S.XZERO
S.XUNIT
S.YMULT
S.YZERO
S.YOFF
S.YUNIT
the return structure
= byte_num;
= bit_num;
= encoding;
= bin_format;
= byte_order;
= num_pts;
= waveform_id;
= point_format;
= xincr;
= point_offset;
= xzero;
= xunit;
= ymult;
= yzero;
= yoffset;
= yunit;
% Figure out what output we should return
if struct_only
switch nargout
case 1, varargout = {S};
end
else
switch nargout
case 1, varargout = {ydata};
case 2, varargout = {xdata, ydata};
case 3, varargout = {xdata, ydata, S};
end
end
return;
D.10 redofig.m
function hfig = redofig(name, varargin);
%REDOFIG
Open a figure file and reformat it.
215
error(nargoutchk(0, 1, nargout));
close_hf = false;
if nargin < 1
h = gcf;
elseif isnumeric(name)
h = name;
else
h = open(name);
close_hf = true;
end
hf = h;
while ~isequal(get(h, 'type'), 'figure') && hf ~= 0
hf = get(hf, 'Parent');
end
if hf == 0
error('Can only duplicate objects that are children of figures.');
end
params.xaxis
= [];
params.yaxis
= [];
params.size
= [8 6];
params.FontName
= 'Times New Roman';
params.FontSize
= 12;
params.x.scale
= 1;
params.x.shift
= 0;
params.x.preshift = 0;
params.y.scale
= 1;
params.y.shift
= 0;
params.y.preshift = 0;
params.z.scale
= 1;
params.z.shift
= 0;
params.z.preshift = 0;
k = 1;
while k + 1 <= length(varargin)
p = varargin{k};
v = varargin{k+1};
k = k + 2;
eval(['params.', p, ' = v;']);
end
if k <= length(varargin)
error('Trailing parameter without value passed as argument');
end
% Create new figure
hf2 = figure;
fn = params.FontName;
fs = params.FontSize;
set(hf2, 'PaperPosition', [0 0 params.size], ...
'DefaultAxesFontName', fn, 'DefaultAxesFontSize', fs, ...
'DefaultTextFontName', fn, 'DefaultTextFontSize', fs);
hc = copyobj(get(hf, 'Children'), hf2);
change_props(hf2, hc, params);
hfig = hf2;
if close_hf, close(hf); end
216
return;
function change_props(hf, hc, params);
for k = 1:length(hc)
hk = hc(k);
s = get(hk);
clear n;
fn = fieldnames(params);
for k = 1:length(fn)
if isfield(s, fn{k}) && ~isempty(params.(fn{k}))
n.(fn{k}) = params.(fn{k});
end
end
if isfield(params, s.Type)
fn = fieldnames(params.(s.Type));
for k = 1:length(fn)
if isfield(s, fn{k}) && ~isempty(params.(s.Type).(fn{k}))
n.(fn{k}) = params.(s.Type).(fn{k});
end
end
end
switch s.Type
case 'line'
n.XData = doshift(s.XData, params.x);
n.YData = doshift(s.YData, params.y);
n.ZData = doshift(s.ZData, params.z);
set(hk, n);
case 'text'
n.Position = [doshift(s.Position(1), params.x), ...
doshift(s.Position(2), params.y), ...
doshift(s.Position(3), params.z)];
set(hk, n);
case 'axes'
n.XLim = doshift(s.XLim, params.x);
n.YLim = doshift(s.YLim, params.y);
n.ZLim = doshift(s.ZLim, params.z);
axtemp = axes;
n.Position = get(axtemp, 'Position');
delete(axtemp);
set(hk, n);
ca = gca;
set(hf, 'CurrentAxes', hk);
v = axis;
if ~isempty(params.xaxis), v(1:2) = params.xaxis; end
if ~isempty(params.yaxis), v(3:4) = params.yaxis; end
axis(v);
if ~isempty(s.XLabel), xlabel(get(s.XLabel, 'String')); end
if ~isempty(s.YLabel), ylabel(get(s.YLabel, 'String')); end
if ~isempty(s.ZLabel), zlabel(get(s.ZLabel, 'String')); end
if ~isempty(s.Title), title(get(s.Title, 'String')); end
if ~isempty(s.Children), change_props(hf, s.Children, params); end
set(hf, 'CurrentAxes', ca);
otherwise
if isfield(s, 'XData'), n.XData = doshift(s.XData, params.x); end
if isfield(s, 'YData'), n.YData = doshift(s.YData, params.y); end
217
if isfield(s, 'ZData'), n.ZData = doshift(s.ZData, params.z); end
if isfield(s, 'Position')
n.Position = [doshift(s.Position(1), params.x), ...
doshift(s.Position(2), params.y), ...
doshift(s.Position(3), params.z)];
end
set(hk, n);
if ~isempty(s.Children), change_props(hf, s.Children, params); end
end
end
return;
function x = doshift(x, s);
x = (x + s.preshift).*s.scale + s.shift;
return;
D.11 rescale_peaks.m
function rescale_peaks(figurefile);
if nargin < 1
figurefile = gcf;
end
[labels, dh, oh, hfig] = get_peaks(figurefile);
N = length(labels);
for k=1:N
fprintf('%d: "%s"\n', k, labels(k).string);
end
first = input('Which label is the first label to use? ');
validate_label(first, 1:N);
s = labels(first).string;
image = input(['Which label is the image of the "', s, '" label? ']);
validate_label(image, 1:N);
if image == first
error('Invalid image label -- same as first label.');
end
fsr = input('What is the free spectral range (FSR), in GHz? ');
validate_fsr(fsr);
default_zero = [];
for k = 1:N;
if isequal(labels(k).string, 'Probe')
default_zero = k;
break;
end
end
if ~isempty(default_zero)
s = num2str(default_zero);
218
zero = input(['Which label is the zero-point [', s, ']? ']);
if isempty(zero)
zero = default_zero;
end
else
zero = input('Which label is the zero-point? ');
end
zero = reshape(zero, [], 1);
if length(zero) == 2
validate_label(zero(1), 1:N);
validate_label(zero(2), 1:N);
else
validate_label(zero, 1:N);
end
ax = labels(first).xpos;
bx = labels(image).xpos;
if length(zero) == 2
zx = mean([labels(zero(1)).xpos, labels(zero(2)).xpos]);
else
zx = labels(zero).xpos;
end
if ax > bx
[ax, bx] = deal(bx, ax);
end
scale = fsr./(bx-ax);
for k=1:length(labels)
s = labels(k).string;
if isequal(s, 'Probe') || isequal(s, 'Anti-Stokes')
new_freq = (labels(k).xpos - zx).*scale;
labels(k).new_string = sprintf('%s (%+.6g GHz)', s, new_freq);
elseif is_freq_label(labels(k).string)
new_freq = (labels(k).xpos - zx).*scale;
labels(k).new_string = sprintf('%+.6g GHz', new_freq);
else
labels(k).new_string = labels(k).string;
end
end
fprintf('\nNew labels:\n');
for k=1:N
fprintf('%d: "%s" -> "%s"\n', k, labels(k).string, labels(k).new_string);
end
s = input('Is this OK (y/n)? ', 's');
if ~isequal(lower(s(1)), 'y')
return;
end
for k=1:length(labels)
set(labels(k).htext, 'String', labels(k).new_string);
end
return;
219
function validate_label(n, valid_labels);
if ~isnumeric(n) || numel(n) ~= 1 || ~any(n == valid_labels)
error('Invalid label.');
end
return;
function validate_fsr(n);
if ~isnumeric(n) || numel(n) ~= 1 || ~isreal(n) || n <= 0
error('Invalid FSR.');
end
return;
function b = is_freq_label(label_string);
b = false;
a = min(find(~isspace(label_string)));
if label_string(a) == '+' || label_string(a) == '-'
a = a + 1;
end
if label_string(a) == '.'
a = a + 1;
end
if any(label_string(a) == '0123456789')
b = true;
return;
end
return;