aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBlaise Thompson <blaise@untzag.com>2018-04-15 19:43:48 -0500
committerBlaise Thompson <blaise@untzag.com>2018-04-15 19:43:48 -0500
commit37989608b63fdbc4d555a51b6135dea5a3555975 (patch)
treec0310d3427dd1bc81a0fb798792821a79b6fb770
parent14bc9be2a66cba11f88c87a3aebc93d142b19743 (diff)
2018-04-15 19:43
-rw-r--r--acquisition/chapter.tex148
-rw-r--r--active_correction/chapter.tex201
-rw-r--r--bibliography.bib49
-rw-r--r--todo.org9
4 files changed, 230 insertions, 177 deletions
diff --git a/acquisition/chapter.tex b/acquisition/chapter.tex
index a7d434e..7f6d43f 100644
--- a/acquisition/chapter.tex
+++ b/acquisition/chapter.tex
@@ -26,7 +26,7 @@ the context of an MR-CMDS experiment. %
A scan in MR-CMDS typically means sending hardware to a whole series of different positions. %
As an example, a three-dimensional ``movie'' might be collected in the following way:
-\begin{codefragment}{python, label=aqn:lst:psuedoaqn}
+\begin{codefragment}{python, label=acq:lst:psuedoaqn}
w1_points = [14300, 14400, 14500, 14600, 14700] # wn
w2_points = [14100, 14200, 14300, 14400, 14500, 14600, 14700] # wn
d2_points = [100, 75, 50, 25, 0, 50, 75, 100, 125, 150, 175, 200] # fs
@@ -61,37 +61,37 @@ In this chapter I describe how I built such an acquisition software, PyCMDS. %
For context, some description of the acquisition software that PyCMDS replaced is warranted. %
On the ``ps table'' (focus on mixed vibrational-electronic spectroscopy of molecular systems),
-PyCMDS replaces `ps\_control', an older acquisition software first developed in [YEAR] by Kent
-Meyer [CITE]. %
-ps\_control was very-much not modular, designed by generations of graduate students to get to
+PyCMDS replaces `ps\_control', an older acquisition software first developed prior to 2004 by Kent
+Meyer \cite{MeyerKentA2004b}. %
+ps\_control was very-much not modular, designed by generations of graduate students each getting to
``minimum viable'' as quickly as possible. %
When I joined the group, ps\_control had become unsustainable. %
The ps table was being revamped with new hardware, and the old motherboard finally died, so new
software was desperately needed. %
On the ``fs table'' (focus on semiconductor photophysics), PyCMDS replaces `Control for Lots of
-Research in Spectroscopy' (COLORS), developed by Schuyler Kain [CITE]. %
+Research in Spectroscopy' (COLORS), developed by Schuyler Kain \cite{KainSchuyler2017a}. %
PyCMDS is, in many ways, inspired by COLORS. %
Kain's design was modular in many ways. %
Still, there were fundamental problems that COLORS could not address. %
Chief among them was Kain's approach to the National Instruments DAQ card, which did not allow for
-the flexibility required to introduce more interesting chopping schemes [SECTION]. %
+the flexibility required to introduce more interesting chopping schemes (see
+\autoref{act:sec:chop}). %
PyCMDS is a unified software for controlling hardware and collecting data in the Wright Group. %
-It is written almost entirely in Python, with a graphical user interface (GUI) made using Qt
-[CITE]. %
+It is written almost entirely in Python, with a graphical user interface (GUI) made using Qt. %
It is cross-platform, with a core capable of running on Linux, Windows and macOS. %
-It is open source, developed on GitHub. [CITE (GITHUB, PyCMDS)] %
+It is open source, developed on GitHub. \cite{GitHub} %
Today PyCMDS is used to drive both the ps and fs tables. %
PyCMDS is best thought of as a core program with three kinds of modular ``plugins'' that can be
extended as needed. %
The three plugin kinds are
\begin{ditemize}
- \item Hardware: things that can be set to a position (\autoref{aqn:sec:hardware}).
- \item Sensors: things that can be used to measure a signal (\autoref{aqn:sec:sensors}).
+ \item Hardware: things that can be set to a position (\autoref{acq:sec:hardware}).
+ \item Sensors: things that can be used to measure a signal (\autoref{acq:sec:sensors}).
\item Acquisition modules: things that can be used to define and carry out an acquisition, and
- associated post-processing (\autoref{aqn:sec:somatic}).
+ associated post-processing (\autoref{acq:sec:somatic}).
\end{ditemize}
The first design rule for PyCMDS is that these three things should be easy for the average
(motivated) user to add by herself. %
@@ -131,10 +131,10 @@ I have borrowed the terms ``autonomic'' and ``somatic'':
\dsignature{W. J\"{a}nig, Autonomic Nervous System (1989) \cite{JanigW1989a}}
\end{dquote}
-Within PyCMDS, the autonomic system [SECTION] handles the ``reflex'' motion that is part of active
-correction. %
-The somatic system [SECTION], on the other hand, handles the ``voluntary'' motion in the context of
-acquiring a multidimensional scan. %
+Within PyCMDS, the autonomic system (\autoref{acq:sec:autonomic}) handles the ``reflex'' motion
+that is part of active correction. %
+The somatic system (\autoref{acq:sec:somatic}), on the other hand, handles the ``voluntary'' motion
+in the context of acquiring a multidimensional scan. %
% BJT: consider a layout preview paragraph or two
@@ -146,7 +146,7 @@ experienced by a first time user of the software. %
When PyCMDS starts up, the GUI is constructed out of modules depending on which hardware and
sensors the user has instructed the program to address. %
A screenshot of the PyCMDS GUI, running on the fs table, is shown in
-\autoref{aqn:fig:pycmds_screenshot}. %
+\autoref{acq:fig:pycmds_screenshot}. %
On the left hand there is a single column displaying the current positions for all loaded
hardware. %
@@ -156,7 +156,7 @@ display. %
Each hardware knows its own limits, displayed in a tool tip when hovering over the control. %
Users cannot type values outside of hardware limits into the controls. %
Each hardware also has an ``ADVANCED'' button, which takes the user to a more extensive GUI to
-control lots more features [SECTION]. %
+control lots more features (\autoref{acq:sec:hardware}). %
At the very top, on the left hand side, is the ``SHUT DOWN'' button. %
On the right hand side there is a extensive set of nested tabs. %
@@ -164,11 +164,11 @@ The top level tabs are ``Program'', ``Hardware'', ``Devices'', ``Autonomic'', ``
``Plot''. %
Under each of these tabs is an entire separate set of display and control elements. %
Some of these elements are themselves tabbed, like the ``Somatic'' tab (active in
-\autoref{aqn:fig:pycmds_screenshot}), which has ``Queue'' and ``Scan'' sub-tabs. %
+\autoref{acq:fig:pycmds_screenshot}), which has ``Queue'' and ``Scan'' sub-tabs. %
At the top of the right hand side there is a progress bar and queue status display, which I will
discuss further in future sections. %
-When PyCMDS opens (\autoref{aqn:fig:pycmds_screenshot}), the user is first greeted with the
+When PyCMDS opens (\autoref{acq:fig:pycmds_screenshot}), the user is first greeted with the
``Somatic/Queue'' tab on the right hand side of the GUI. %
This is where she may instruct PyCMDS to do acquisitions. %
In PyCMDS, all acquisitions are done in a queue system. %
@@ -179,14 +179,15 @@ To instruct PyCMDS to do an acquisition, the user must first create a queue by e
name (default is ``queue''), and pressing the ``MAKE NEW QUEUE'' button. %
Alternatively the user may open an existing queue using ``OPEN QUEUE''. %
Next, the user must add the desired acquisition(s) to the queue. %
-There are several acquisition modules, each with a different purpose [SECTION]. %
+There are several acquisition modules, each with a different purpose
+(\autoref{acq:sec:somatic}). %
Choose an acquisition module using the drop down menu. %
Enter a name for your acquisition, and any additional info that you might want to keep track of. %
Finally, fill out any additional information that acquisition module might require, and press
``APPEND TO QUEUE''. %
Once there are acquisitions in the queue, the user can press ``RUN QUEUE''. %
-\autoref{aqn:fig:pycmds_queue_screenshot} is a screenshot of the ``Somatic/Queue'' tab while a
+\autoref{acq:fig:pycmds_queue_screenshot} is a screenshot of the ``Somatic/Queue'' tab while a
queue is in progress. %
In this screen shot there are seven enqueued items, and PyCMDS is in the process of acquiring the
final one (index 6). %
@@ -198,7 +199,7 @@ parameters from that acquisition. %
This is useful when repeating an acquisition with slightly changed parameters, or simply when
inspecting what parameters were used in a given item. %
-\autoref{aqn:fig:pycmds_screenshot_during_scan} is a screenshot of PyCMDS during a representative
+\autoref{acq:fig:pycmds_screenshot_during_scan} is a screenshot of PyCMDS during a representative
acquisition. %
This time, the ``Somatic/Scan'' tab is chosen. %
On the left hand side, we can see that the ``SHUT DOWN'' and ``SET'' buttons are grayed out and
@@ -221,10 +222,11 @@ In this case, the displayed pixel (index 6, 40) took 2.448 seconds to acquire.
The other tabs are for more advanced interactions, and will be discussed further in future
sections. %
The ``Program'' tab contains various rarely-needed displays and inputs to configure PyCMDS. %
-The ``Hardware'' tab is where the advanced menu for each hardware appears [SECTION]. %
-The ``Devices'' tab is where sensor settings live [SECTION]. %
+The ``Hardware'' tab is where the advanced menu for each hardware appears
+(\autoref{acq:sec:hardware}). %
+The ``Devices'' tab is where sensor settings live (\autoref{acq:sec:sensors}). %
The ``Autonomic'' tab is where users configure the autonomic system for active correction
-[SECTION]. %
+(\autoref{acq:sec:autonomic}). %
The ``Somatic'' tab has already been described in this section. %
Finally, the ``Plot'' tab was intended to be a interactive, graphical post processing
environment. %
@@ -236,7 +238,7 @@ This functionality has not yet been implemented. %
\caption[PyCMDS at startup.]{
PyCMDS at startup, on the fs system. %
}
- \label{aqn:fig:pycmds_screenshot}
+ \label{acq:fig:pycmds_screenshot}
\end{figure}
\end{landscape}
@@ -246,7 +248,7 @@ This functionality has not yet been implemented. %
\caption[PyCMDS queue.]{
PyCMDS queue while acquiring data, on the ps system. %
}
- \label{aqn:fig:pycmds_queue_screenshot}
+ \label{acq:fig:pycmds_queue_screenshot}
\end{figure}
\end{landscape}
@@ -256,7 +258,7 @@ This functionality has not yet been implemented. %
\caption[PyCMDS while scanning.]{
PyCMDS scan tab while acquiring data, on the ps system. %
}
- \label{aqn:fig:pycmds_screenshot_during_scan}
+ \label{acq:fig:pycmds_screenshot_during_scan}
\end{figure}
\end{landscape}
@@ -449,8 +451,8 @@ All hardware and driver classes are children of the same parent \python{Hardware
These parent classes know how to communicate in a thread safe way, and they know the specific
attributes (like \python{name}), and signals (like \python{update_ui}) that all hardware and
sensors must have. %
-\autoref{aqn:fig:parent_hardware_class} shows the parent hardware class, and
-\autoref{aqn:fig:parent_driver_class} shows the parent driver class. %
+\autoref{acq:fig:parent_hardware_class} shows the parent hardware class, and
+\autoref{acq:fig:parent_driver_class} shows the parent driver class. %
Communication between the hardware and the driver goes via a queue, as mentioned previously. %
The hardware class has an attribute \python{q}, which is an instance of the \python{Q} class. %
@@ -469,7 +471,7 @@ driver can trigger signals like \python{update_ui} and modify Mutexes. %
For brevity, methods \python{close}, \python{update} and \python{wait_until_still} have been
omitted. %
}
- \label{aqn:fig:parent_hardware_class}
+ \label{acq:fig:parent_hardware_class}
\end{figure}
\begin{figure}
@@ -477,7 +479,7 @@ driver can trigger signals like \python{update_ui} and modify Mutexes. %
\caption[TODO]{
Parent class of all drivers. %
}
- \label{aqn:fig:parent_driver_class}
+ \label{acq:fig:parent_driver_class}
\end{figure}
\subsubsection{GUI components} % -----------------------------------------------------------------
@@ -547,12 +549,12 @@ For those wanting to learn more, all GUI components are defined in
\bash{PyCMDS/project/widgets.py}. %
\clearpage
-\section{Hardware} \label{aqn:sec:hardware} % ====================================================
+\section{Hardware} \label{acq:sec:hardware} % ====================================================
Hardware are things that 1. have a position, and 2. can be set to a destination. %
Typically they also have associated units and limits. %
They sometimes have an offset, as specified by the autonomic system
-(\autoref{aqn:sec:autonomic}). %
+(\autoref{acq:sec:autonomic}). %
Each hardware can be thought of as a dimension of the MR-CMDS experiment, and scans include a
specific traversal through this multidimensional space. %
@@ -561,9 +563,9 @@ In this section I briefly discuss PyCMDS' implementation for each type of hardwa
\subsection{Hardware inheritance} % --------------------------------------------------------------
All hardware classes are children of the parent \python{Hardware} class
-(\autoref{aqn:fig:hardware_class}), which is itself a child of the the global \python{Hardware}
-class shown in \autoref{aqn:fig:parent_hardware_class}. %
-By inspecting \autoref{aqn:fig:hardware_class}, we can see that all hardware require the following
+(\autoref{acq:fig:hardware_class}), which is itself a child of the the global \python{Hardware}
+class shown in \autoref{acq:fig:parent_hardware_class}. %
+By inspecting \autoref{acq:fig:hardware_class}, we can see that all hardware require the following
methods:
\begin{ditemize}
\item \python{close}
@@ -576,7 +578,7 @@ methods:
\item \python{@property units}
\end{ditemize}
-\autoref{aqn:fig:hardware_inheritance} shows the full inheritance tree, including all nine types of
+\autoref{acq:fig:hardware_inheritance} shows the full inheritance tree, including all nine types of
hardware currently supported by PyCMDS. %
In general the nesting is type/model, although there can be additional levels of nesting when
required, as can be seen in the case of OPA/TOPAS/TOPAS-C and OPA/TOPAS/TOPAS-800. %
@@ -597,7 +599,7 @@ Each of these classes can be directly instantiated as a minimum-viable instance,
\python{is_valid}, \python{on_address_initialized}, \python{poll}, and \python{@property units}
have been omitted. %
}
- \label{aqn:fig:hardware_class}
+ \label{acq:fig:hardware_class}
\end{figure}
\begin{figure}
@@ -605,7 +607,7 @@ Each of these classes can be directly instantiated as a minimum-viable instance,
\caption[Hardware inheritance.]{
CAPTION TODO
}
- \label{aqn:fig:hardware_inheritance}
+ \label{acq:fig:hardware_inheritance}
\end{figure}
\subsection{Delays} % ----------------------------------------------------------------------------
@@ -630,8 +632,8 @@ The delay GUI, by default, offers
\item \python{on_set_motor}
\item \python{on_set_zero}
\end{ditemize}
-\autoref{aqn:fig:delay_advanced} is a screenshot of the advanced panel for one of the Newport MFA
-[CITE] delay stages. %
+\autoref{acq:fig:delay_advanced} is a screenshot of the advanced panel for one of the Newport MFA
+\cite{MFA} delay stages. %
This advanced panel is pretty typical. %
Users may directly set the motor position or zero position. %
They may also change the label. % BJT: because...
@@ -645,7 +647,7 @@ can also account for double-passes and similar configurations. %
\caption[Representative delay stage advanced menu.]{
Advanced menu for one of the MFA-CC (SMC-100) delay stages, on the fs system. %
}
- \label{aqn:fig:delay_advanced}
+ \label{acq:fig:delay_advanced}
\end{figure}
\end{landscape}
@@ -665,7 +667,7 @@ Spectrometer driver instances require the following:
\item \python{set_turret}
\end{ditemize}
-\autoref{aqn:fig:spectrometer_advanced} is a screenshot of the MicroHR [CITE] advanced menu on the
+\autoref{acq:fig:spectrometer_advanced} is a screenshot of the MicroHR advanced menu on the
fs system. %
Nothing can be changed in the advanced menu except the label, and the offset can be seen. %
@@ -675,7 +677,7 @@ Nothing can be changed in the advanced menu except the label, and the offset can
\caption[Representative spectrometer advanced menu.]{
CAPTION TODO
}
- \label{aqn:fig:spectrometer_advanced}
+ \label{acq:fig:spectrometer_advanced}
\end{figure}
\end{landscape}
@@ -716,8 +718,8 @@ Many of these additional features have to do with the tuning curve, a crucial fe
The tuning curve contains motor positions needed to achieve each valid output color. %
Read more about my implementation of tuning curves in \autoref{cha:opa}. %
-\autoref{aqn:fig:opa_advanced} is a screenshot of the advanced menu for one of the TOPAS-C [CITE]
-OPAs on the fs table. %
+\autoref{acq:fig:opa_advanced} is a screenshot of the advanced menu for one of the TOPAS-C OPAs on
+the fs table. %
A large central plot displays the currently loaded tuning curve for one of the motors (chosen in
the pull down menu). %
Multiple filepath menus allow the user to specify each tuning curve. %
@@ -729,12 +731,11 @@ Each motor can be independently set and homed. %
\caption[Representative OPA advanced menu.]{
CAPTION TODO
}
- \label{aqn:fig:opa_advanced}
+ \label{acq:fig:opa_advanced}
\end{figure}
\end{landscape}
-\clearpage
-\section{Sensors (devices)} \label{aqn:sec:sensors} % ============================================
+\section{Sensors (devices)} \label{acq:sec:sensors} % ============================================
Sensors are the kind of things that actually measure data. %
In spectroscopy these can be photodiodes, array detectors, photo-multiplier tubes etc. %
@@ -743,12 +744,12 @@ In this section I describe the strategy that PyCMDS uses to represent sensors.
\subsection{The DAQ card} % ----------------------------------------------------------------------
The National Instruments PCI-6251 card is capable of eight analog inputs and 1 million samples per
-second (one sample per microsecond). %
+second (one sample per microsecond). \cite{PCI6251} %
Both instruments operate at 1 KHz, so that leaves 1000 samples per shot. %
It is important to be able to configure all of the timings within each shot. %
-\autoref{aqn:fig:samples} shows the GUI designed to control the sample level timing of the NI
-PCI-6251 card. %
+\autoref{acq:fig:samples} shows the GUI designed to control the sample level timing of the NI
+PCI-6251 card \cite{PCI6251}. %
All 1000 samples for the current shot are displayed in the large central plot. %
Users may allocate regions of samples to be assigned to particular channels. %
A second region may be allocated for explicit baseline subtraction. %
@@ -758,11 +759,11 @@ subtracted and the signal is (optionally) inverted. %
All of this results in a single processed value for each channel on each shot. %
Users may also allocate exactly one sample for chopper monitoring. %
-\autoref{aqn:fig:shots} is a screenshot of the shots GUI. %
+\autoref{acq:fig:shots} is a screenshot of the shots GUI. %
Only one channel is shown, chosen by the pull down menu on the right hand side. %
Each point is one processed value from all of the samples designated for that particular shot. %
Because this instrument is using dual chopping at this time, only one out of four shots has a large
-amount of light, so most shots are near zero in \autoref{aqn:fig:shots}. %
+amount of light, so most shots are near zero in \autoref{acq:fig:shots}. %
[SHOTS PROCESSING]
@@ -775,7 +776,7 @@ amount of light, so most shots are near zero in \autoref{aqn:fig:shots}. %
\caption{
CAPTION TODO
}
- \label{aqn:fig:samples}
+ \label{acq:fig:samples}
\end{figure}
\end{landscape}
@@ -785,7 +786,7 @@ amount of light, so most shots are near zero in \autoref{aqn:fig:shots}. %
\caption{
CAPTION TODO
}
- \label{aqn:fig:shots}
+ \label{acq:fig:shots}
\end{figure}
\end{landscape}
@@ -802,14 +803,14 @@ Sometimes, a sensor returns an entire array of information. %
In cases like these, PyCMDS expands the dimensionality of the scan to accommodate the many-valued
sensor. %
-For example, consider \autoref{aqn:fig:array_as_axis}. %
+For example, consider \autoref{acq:fig:array_as_axis}. %
This simple tune test was taken with an array detector, rather than using a scanning
monochromator. %
Although only one piece of hardware was scanned, the data is considered to be
\emph{two}-dimensional, with the second dimension being $\bar{\nu}_a$, the differential color axis
for the array vs the OPA setpoint. %
-The data in \autoref{aqn:fig:array_as_axis} does not occupy a rectangular region in this
+The data in \autoref{acq:fig:array_as_axis} does not occupy a rectangular region in this
parameterization. %
This is because the range of colors covered at each monochromator setpoint is different, with a
smaller dispersion (more colors across the finite array) at higher energies. %
@@ -822,10 +823,10 @@ It has been derived previously by \textcite{KainSchuyler2017a}. %
\caption[Array detector serving as an axis.]{
CAPTION TODO (2017-11-06 OPA2)
}
- \label{aqn:fig:array_as_axis}
+ \label{acq:fig:array_as_axis}
\end{figure}
-\section{Autonomic} \label{aqn:sec:autonomic} % ==================================================
+\section{Autonomic} \label{acq:sec:autonomic} % ==================================================
The autonomic system is used to define ``reflexes'' for PyCMDS---operations that are automatically
applied when certain conditions are met. %
@@ -844,7 +845,7 @@ means that PyCMDS is prepared for corrections that have not yet been fully imple
automated power correction. %
Simple plain-text \bash{.coset} files define the offset arrays. %
-They are automatically generated using processing scripts in \python{attune} [CITE]. %
+They are automatically generated using processing scripts in \python{attune}. %
Their headers prevent them from being loaded in the wrong spot. %
These files are internally represented as instances of the \python{CoSet} class, which is capable
of linear interpolation and extrapolation at the edges. %
@@ -861,10 +862,9 @@ In such cases, \emph{offsets always add}. %
\end{figure}
\end{landscape}
-\clearpage
-\section{Somatic} \label{aqn:sec:somatic} % =======================================================
+\section{Somatic} \label{acq:sec:somatic} % =======================================================
-In contrast with the autonomic system (\autoref{aqn:sec:autonomic}), the somatic system is all
+In contrast with the autonomic system (\autoref{acq:sec:autonomic}), the somatic system is all
about voluntary, user specified motion. %
This is where the fun stuff happens---the acquisitions!
@@ -931,8 +931,8 @@ This object has the same shape as the full multidimensional scan, and contains t
that hardware for that pixel in the scan. %
Then, a \bash{.data} file is created to accept the data that is about to be collected. %
A bunch of signals go off, telling PyCMDS that it needs to yield to somatic control. %
-Then PyCMDS simply sits in a loop generated by \python{numpy.ndindex} [CITE] and visits each pixel
-in turn. %
+Then PyCMDS simply sits in a loop generated by \python{numpy.ndindex} \cite{ndindex} and visits
+each pixel in turn. %
\python{ndindex} is a n-dimensional iterator over a given array shape. %
Written simply, it does the following:
\begin{codefragment}{python}
@@ -962,7 +962,7 @@ So that when evaluated:
This simple algorithm is used to visit each pixel in the entire PyCMDS scan space. %
At each pixel, something much like the following happens. %
-\begin{codefragment}{python, label=aqn:lst:loop_simple}
+\begin{codefragment}{python, label=acq:lst:loop_simple}
for idx in ndindex(shape):
for hardware in hardwares::
hardware.set(idx)
@@ -980,14 +980,14 @@ The simplicity of this central loop truly shows the power of abstraction in PyCM
Acquisition modules are defined interfaces which know how to assemble a scan. %
-\autoref{aqn:fig:aqn_file} shows an aqn file for an acquisition using SCAN. %
+\autoref{acq:fig:aqn_file} shows an aqn file for an acquisition using SCAN. %
\begin{figure}
\includebash{"acquisition/example.aqn"}
\caption[Example aqn file.]{
CAPTION TODO
}
- \label{aqn:fig:aqn_file}
+ \label{acq:fig:aqn_file}
\end{figure}
\subsubsection{SCAN}
@@ -998,7 +998,7 @@ SCAN is capable of acquisitions of arbitrary dimensionality. %
Users simply append as many axes as they want. %
Acquistions are done with the trailing (highest index) axis as the innermost loop. %
Arbitrary expressions (PyCMDS calls them ``constants'') are also possible, as can be seen in
-\autoref{aqn:fig:aqn_file}. %
+\autoref{acq:fig:aqn_file}. %
\subsubsection{TUNE TEST}
@@ -1072,7 +1072,7 @@ because indeed that is all that can be generalized. %
\caption[TODO]{
TODO
}
- \label{aqn:fig:slack}
+ \label{acq:fig:slack}
\end{figure}
\section{Future directions} % ====================================================================
@@ -1202,7 +1202,7 @@ S_n &=& (1-c)\left(\frac{n}{N}\right)^{\frac{\tau_{\mathrm{step}}}{\tau_{\mathrm
\begin{figure}
\includegraphics[scale=0.5]{"processing/PyCMDS/ideal axis positions/exponential"}
\caption[TODO]{TODO}
- \label{aqn:fig:exponential_steps}
+ \label{acq:fig:exponential_steps}
\end{figure}
\subsubsection{Gaussian}
diff --git a/active_correction/chapter.tex b/active_correction/chapter.tex
index 7ecbe2f..d3028fe 100644
--- a/active_correction/chapter.tex
+++ b/active_correction/chapter.tex
@@ -1,4 +1,4 @@
-\chapter{Active Correction in MR-CMDS} \label{cha:act}
+\chapter{Active correction} \label{cha:act}
\begin{dquote}
Calibrate, \\
@@ -9,7 +9,7 @@
run.
\dsignature{Long-hanging poster in Wright Group laser lab.}
-\end{dquote} % TODO: verify this quote
+\end{dquote}
\clearpage
@@ -34,20 +34,20 @@ Some of these strategies have already been implemented, others are partially imp
others are still just ideas. %
I hope to show that active correction is a particularly useful strategy in MR-CMDS. %
-Section ... addresses spectral delay correction, where automated delay stages are used to
-explicitly correct for small changes in optical path length at different pulse frequencies. %
+Section \ref{act:sec:sdc} addresses spectral delay correction, where automated delay stages are
+used to explicitly correct for small changes in optical path length at different pulse frequencies. %
-Section ... addresses poynting correction, where mirrors with motorized pitch and yaw control are
-used to actively correct for small changes in OPA output poynting. %
+Section \ref{act:sec:poynting} addresses poynting correction, where mirrors with motorized pitch
+and yaw control are used to actively correct for small changes in OPA output poynting. %
-Section ... addresses (dual) chopping, used to actively subtract artifacts such as scatter and
-unwanted nonlinear outputs. %
+Section \ref{act:sec:chop} addresses (dual) chopping, used to actively subtract artifacts such as
+scatter and unwanted nonlinear outputs. %
Chopping can only account for intensity level (additive) artifacts. %
Fibrillation is the opposite of chopping, as it can only account for amplitude level
\emph{iterference} effects. %
-Section ... addresses fibrillation. %
+Section \ref{act:sec:chop} also addresses fibrillation. %
-\section{Spectral delay correction} % ============================================================
+\section{Spectral delay correction} \label{act:sec:sdc} % =========================================
As a frequency domain technique, MR-CMDS requires automated tuning of multiple OPAs. %
These OPAs generate pulses, which are then manipulated and directed into a sample of interest. %
@@ -64,7 +64,8 @@ within the Wright Group. %
SDC was first implemented by Schuyler Kain within his COLORS acquisition software.
\cite{KainSchuyler2017a} %
COLORS' implementation was hardcoded for one particular OPA / delay configuration---it wasn't until
-PyCMDS that fully arbitrary SDC became possible through the autonomic system (see section ...). %
+PyCMDS that fully arbitrary SDC became possible through the autonomic system (see
+\autoref{acq:sec:autonomic}). %
Erin Boyle ``backported'' similar functionality into to ps\_control, although her implementation
allowed only for a simple, first order linear correction. %
@@ -76,7 +77,7 @@ color coordinate. %
A special method of \python{Data}, \python{Data.offset} is designed to do the necessary
interpolation for \emph{post hoc} SDC. %
-In many experiments spectral delay must be actively corrected for. %
+In many experiments spectral delay \emph{must} be actively corrected for. %
Fully coherent experiments are typically performed by scanning OPA frequencies while attempting to
keep delays constant. %
In such experiments, the dataset does not in-and-of-itself contain the information needed to
@@ -104,7 +105,7 @@ If a fully coherent experiment is performed with chirped white light as one of t
pulses, the other pulses will provide a gating effect in time that isolates interaction from one
frequency in the white pulse. %
This is similar to the gating that is accomplished using ``delay 1'' in the TOPAS-C OPAs (see
-section ...). %
+\autoref{cha:opa}). %
By gating in this way, a \emph{frequency} axis along the white light dimension could be scanned
using a delay stage. %
COLORS' has taken this idea to it's logical conclusion, with support for ``OPAs'' that are actually
@@ -136,19 +137,36 @@ The delay traces (horizontal) peaks at the same value for every OPA1 position (v
\begin{figure}
\includegraphics[width=0.45\textwidth]{"active_correction/sdc_before"}
\includegraphics[width=0.45\textwidth]{"active_correction/sdc_after"}
- \caption[CAPTION TODO]{
- CAPTION TODO: SPECTRAL DELAY CORRECTION FIGURE
+ \caption[Spectral delay correction.]{
+ Spectral delay correction.
}
\label{act:fig:sdc}
\end{figure}
-\section{Poynting correction} % ==================================================================
+\section{Poynting correction} \label{act:sec:poynting} % =========================================
-[CONTENT FROM KYLE SUNDEN]
+With scanning OPAs, output Poynting can change along with optical path length. %
+We now correct for such changes actively using mirrors with motorized pitch and yaw controls. %
+These Poynting corrections are implemented as part of the recursive OPA tuning curve system (see
+\autoref{cha:opa}), and not through the autonomic system. %
+
+To determine the appropriate positions for a Poynting correction, a pitch vs setpoint and yaw vs
+setpoint scan is performed. %
+A pinhole is placed at the sample location, and a detector is place \emph{immediately} after the
+pinhole. %
+
+\autoref{act:fig:poynting} is an autogenerated figure from PyCMDS. %
+It is a typical Poynting correction scan. %
+Like in spectral delay correction, each slice is fit and then a spline is fit to all slices
+simultaneously. %
+The top plot of \autoref{act:fig:poynting} show the initial Poynting correction in comparison with
+the new one. %
+In this case the change in the correction is mostly an offset, although there is a fairly dramatic
+shape change at the lowest energy setpoints. %
\begin{figure}
\includegraphics[width=0.45\textwidth]{"active_correction/poynting_correction/intensity"}
- \caption[Poynting Correction curve generation.]{
+ \caption[Poynting correction.]{
A typical example of the output of the Poynting Tune module.
The top figure shows the curve for the axis designated Theta.
The thin, solid line is the previous curve, the thick transparent line is the new tuning curve.
@@ -159,9 +177,10 @@ The delay traces (horizontal) peaks at the same value for every OPA1 position (v
This figure was automatically generated by PyCMDS on March 28, 2018 using an OPA-800 generating
1 ps infrared light.
}
+ \label{act:fig:poynting}
\end{figure}
-\section{Chopping} % =============================================================================
+\section{Chopping} \label{act:sec:chop} % ========================================================
\subsection{Scatter} % ---------------------------------------------------------------------------
@@ -186,10 +205,6 @@ A similar expression in the case of heterodyne-detected 4WM is derived by
The goal of any `scatter rejection' processing procedure is to isolate $|E_{\mathrm{4WM}}|^2$ from
the other terms. %
-% TODO: verify derivation
-
-\subsubsection{Abandon the Random Phase Approximation}
-
\subsubsection{Interference Patterns in TrEE}
TrEE is implicitly homodyne-detected. %
@@ -203,12 +218,14 @@ detection field are at the same frequency. %
\begin{figure}
\includegraphics[scale=0.5]{"active_correction/scatter/scatter interference in TrEE old"}
- \caption[Simulated interference paterns in old delay parameterization.]{Numerically simulated
- interference patterns between scatter and TrEE for the old delay parametrization. Each column
- has scatter from a single excitation field. The top row shows the measured intensities, the
- bottom row shows the 2D Fourier transform, with the colorbar's dynamic range chosen to show the
- cross peaks.}
- label{fig:scatterinterferenceinTrEEold}
+ \caption[Simulated interference paterns in old delay parameterization.]{
+ Numerically simulated interference patterns between scatter and TrEE for the old delay
+ parametrization.
+ Each column has scatter from a single excitation field.
+ The top row shows the measured intensities, the bottom row shows the 2D Fourier transform, with
+ the colorbar's dynamic range chosen to show the cross peaks.
+ }
+ \label{fig:scatterinterferenceinTrEEold}
\end{figure}
Here I derive the slopes of constant phase for the old delay space, where
@@ -231,16 +248,20 @@ The cross term between scatter and signal is the product of $\Phi_\mathrm{sig}$
\Delta_{2} = \Phi_{\mathrm{sig}}\mathrm{e}^{-\tau_2\omega} &=& \mathrm{e}^{-\left((\tau_{2^\prime}-2\tau_2)\omega\right)}\\
\Delta_{2^\prime} = \Phi_{\mathrm{sig}}\mathrm{e}^{-\tau_{2^\prime}\omega} &=& \mathrm{e}^{-\tau_{2}\omega}
\end{eqnarray}
-Figure \ref{fig:scatterinterferenceinTrEEold} presents numerical simulations of scatter interference as a visual aid. See Yurs 2011 \cite{YursLenaA2011a}.
+Figure \ref{fig:scatterinterferenceinTrEEold} presents numerical simulations of scatter
+interference as a visual aid. %
+See Yurs 2011 \cite{YursLenaA2011a}. %
% TODO: Yurs 2011 Data
\begin{figure}
\includegraphics[width=7in]{"active_correction/scatter/scatter interference in TrEE current"}
- \caption[Simulated interference paterns in current delay parameterization.]{Numerically simulated
- interference patterns between scatter and TrEE for the current delay parametrization. Each
- column has scatter from a single excitation field. The top row shows the measured intensities,
- the bottom row shows the 2D Fourier transform, with the colorbar's dynamic range chosen to show
- the cross peaks.}
+ \caption[Simulated interference paterns in current delay parameterization.]{
+ Numerically simulated interference patterns between scatter and TrEE for the current delay
+ parametrization.
+ Each column has scatter from a single excitation field.
+ The top row shows the measured intensities, the bottom row shows the 2D Fourier transform, with
+ the colorbar's dynamic range chosen to show the cross peaks.
+ }
\label{fig:scatterinterferenceinTrEEcurrent}
\end{figure}
@@ -271,7 +292,7 @@ amplitude-level interference terms. %
Both techniques work by modulating signal and scatter terms differently so that they may be
separated after light collection. %
-\begin{table}[h] \label{tab:phase_shifted_parallel_modulation}
+\begin{table} \label{tab:phase_shifted_parallel_modulation}
\begin{center}
\begin{tabular}{ r | c | c | c | c }
& A & B & C & D \\
@@ -281,7 +302,11 @@ separated after light collection. %
other & \checkmark & \checkmark & \checkmark & \checkmark
\end{tabular}
\end{center}
- \caption[Shot-types in phase shifted parallel modulation.]{Four shot-types in a general phase shifted parallel modulation scheme. The `other' category represents anything that doesn't depend on either chopper, including scatter from other excitation sources, background light, detector voltage offsets, etc.}
+ \caption[Shot-types in phase shifted parallel modulation.]{
+ Four shot-types in a general phase shifted parallel modulation scheme.
+ The `other' category represents anything that doesn't depend on either chopper, including
+ scatter from other excitation sources, background light, detector voltage offsets, etc.
+ }
\end{table}
We use the dual chopping scheme developed by \textcite{FurutaKoichi2012a} called `phase shifted
@@ -346,54 +371,7 @@ number of laser shots. %
Taking twice as many laser shots when dual chopping brings the signal to noise to at least as good
as the original single chopping. %
-\subsection{Normalization of dual-chopped self-heterodyned signal}
-
-%\begin{table}[!htb]
-% \centering
-% \renewcommand{\arraystretch}{1.5}
-%\begin{array}{r | c | c | c | c }
-% & A & B & C & D \\ \hline
-% \text{signal} & S_A=V_A^S & S_B=R^SC^1I_B^S & S_C=R^S(C^1) & S_D=R^SC^2I_D^S \\ \hline
-% \text{source 1} & M_A^1=V_A^1 & M_B=R^1I_B^1 & M_C^1=R^1I_C^1 & M_D^1=V_D^1 \\ \hline
-% \text{source 2} & M_A^2=V_A^2 & M_B^2=V_B^2 & M_C^2=R^2I_C^2 & M_D^2=R^2I_D^2
-%\end{array}
-% \caption{CAPTION}
-%\end{table}
-
-Shot-by-shot normalization is not trivial for these experiments. %
-As in table above, with 1 as pump and 2 as probe. %
-
-Starting with $\Delta I$ from \ref{eq:dual_chopping}, we can normalize by probe intensity to get
-the popular $\Delta I / I$ representation. %
-Using the names defined above:
-\begin{equation}
- \frac{\Delta I}{I} = \frac{A-B+C-D}{D-A}
-\end{equation}
-Now consider the presence of excitation intensity monitors, indicated by subscripts PR for probe
-and PU for pump.
-
-We can further normalize by the pump intensity by dividing the entire expression by $C_{PU}$:
-\begin{equation}
- \frac{\Delta I}{I} = \frac{A-B+C-D}{(D-A)*C_{PU}}
-\end{equation}
-
-Now, substituting in BRAZARD formalism:
-
-\begin{eqnarray}
- A &=& constant \\
- B &=& S I_{PU}^B (1+\delta_{PU}^B) \\
- C &=& I_{PR}^C(1+\delta_{PR}^C) + S I_{PU}^C(1+\delta_{PR}^C) \\
- D &=& I_{PR}^D(1+\delta_{PR}^D)
-\end{eqnarray}
-
-\begin{equation}
- \frac{\Delta I}{I} = \frac{<A> -
- \frac{<B_{PU}>B}{B_{PU}} +
- \frac{<C_{PU}><C_{PR}C}{C_{PU}C_{PR}} -
- \frac{<D_{PR}>D}{D_{PR}}}{<PR><PU>}
-\end{equation}
-
-\section{Fibrillation} % =========================================================================
+\subsection{Fibrillation} % ----------------------------------------------------------------------
Fibrillation is the intentional randomization of excitation phase during an experiment. %
Because the interference term depends on the phase of the excitation field relative to the signal,
@@ -401,6 +379,53 @@ averaging over many shots with random phase will cause the interference term to
This is a well known strategy for removing unwanted interference terms \cite{SpectorIvanC2015a,
McClainBrianL2004a}. %
-\section{Conclusions} % ==========================================================================
-
-In the future I'd like to do excitation power correction. % \ No newline at end of file
+% \subsection{Normalization of dual-chopped self-heterodyned signal}
+
+% %\begin{table}[!htb]
+% % \centering
+% % \renewcommand{\arraystretch}{1.5}
+% %\begin{array}{r | c | c | c | c }
+% % & A & B & C & D \\ \hline
+% % \text{signal} & S_A=V_A^S & S_B=R^SC^1I_B^S & S_C=R^S(C^1) & S_D=R^SC^2I_D^S \\ \hline
+% % \text{source 1} & M_A^1=V_A^1 & M_B=R^1I_B^1 & M_C^1=R^1I_C^1 & M_D^1=V_D^1 \\ \hline
+% % \text{source 2} & M_A^2=V_A^2 & M_B^2=V_B^2 & M_C^2=R^2I_C^2 & M_D^2=R^2I_D^2
+% %\end{array}
+% % \caption{CAPTION}
+% %\end{table}
+
+% Shot-by-shot normalization is not trivial for these experiments. %
+% As in table above, with 1 as pump and 2 as probe. %
+
+% Starting with $\Delta I$ from \ref{eq:dual_chopping}, we can normalize by probe intensity to get
+% the popular $\Delta I / I$ representation. %
+% Using the names defined above:
+% \begin{equation}
+% \frac{\Delta I}{I} = \frac{A-B+C-D}{D-A}
+% \end{equation}
+% Now consider the presence of excitation intensity monitors, indicated by subscripts PR for probe
+% and PU for pump.
+
+% We can further normalize by the pump intensity by dividing the entire expression by $C_{PU}$:
+% \begin{equation}
+% \frac{\Delta I}{I} = \frac{A-B+C-D}{(D-A)*C_{PU}}
+% \end{equation}
+
+% Now, substituting in BRAZARD formalism:
+
+% \begin{eqnarray}
+% A &=& constant \\
+% B &=& S I_{PU}^B (1+\delta_{PU}^B) \\
+% C &=& I_{PR}^C(1+\delta_{PR}^C) + S I_{PU}^C(1+\delta_{PR}^C) \\
+% D &=& I_{PR}^D(1+\delta_{PR}^D)
+% \end{eqnarray}
+
+% \begin{equation}
+% \frac{\Delta I}{I} = \frac{<A> -
+% \frac{<B_{PU}>B}{B_{PU}} +
+% \frac{<C_{PU}><C_{PR}C}{C_{PU}C_{PR}} -
+% \frac{<D_{PR}>D}{D_{PR}}}{<PR><PU>}
+% \end{equation}
+
+% \section{Conclusions} % ==========================================================================
+
+% In the future I'd like to do excitation power correction. % \ No newline at end of file
diff --git a/bibliography.bib b/bibliography.bib
index ef54ac4..af05877 100644
--- a/bibliography.bib
+++ b/bibliography.bib
@@ -677,6 +677,8 @@
year = 2012,
}
+
+
@article{DonaldsonPaulMurray2007b,
author = {Donaldson, Paul M and Guo, Rui and Fournier, Frederic and Gardner, Elizabeth M
and Barter, Laura M C and Barnett, Chris J and Gould, Ian R and Klug, David R and
@@ -1390,11 +1392,19 @@
}
@book{KahnemanDaniel2013a,
- author = {Kahneman, Daniel},
- title = {Thinking, Fast and Slow},
- year = {2013},
- publisher = {Farrar, Straus and Giroux},
- isbn = {9780374533557},
+ author = {Kahneman, Daniel},
+ title = {Thinking, Fast and Slow},
+ year = 2013,
+ publisher = {Farrar, Straus and Giroux},
+ isbn = 9780374533557,
+}
+
+@phdthesis{KainSchuyler2017a,
+ author = {Schuyler Kain},
+ school = {University of Wisconsin-Madison},
+ title = {Transition of Frequency-Domain Coherent Multidimensional Spectroscopic Methods to
+ the Femtosecond Time Regime with Applications to Nanoscale Semiconductors},
+ year = 2017,
}
@article{KambhampatiPatanjali2011a,
@@ -1915,6 +1925,14 @@
month = {dec},
}
+@phdthesis{MeyerKentA2004b,
+ author = {Kent A Meyer},
+ school = {University of Wisconsin-Madison},
+ title = {Frequency-Scanned Ultrafast Spectroscopic Techniques Applied to Infrared
+ Four-Wave Mixing Spectroscopy},
+ year = 2004,
+}
+
@article{MillmanJarrodK2011a,
author = {K. Jarrod Millman and Michael Aivazis},
title = {Python for Scientists and Engineers},
@@ -3519,4 +3537,23 @@
note = {Accessed: 2018-03-27},
title = {PyQtGraph: Scientific Graphics and GUI Library for Python},
url = {http://pyqtgraph.org/},
-} \ No newline at end of file
+}
+
+@misc{PCI6251,
+ note = {Accessed: 2018-04-15},
+ title = {NI PCI-6251},
+ url = {http://sine.ni.com/nips/cds/view/p/lang/en/nid/14124},
+}
+
+@misc{ndindex,
+ note = {Accessed: 2018-04-15},
+ title = {numpy.ndindex},
+ url = {https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndindex.html},
+}
+
+@misc{MFA,
+ note = {Accessed: 2018-04-15},
+ title = {Miniature Steel Linear Stages},
+ url = {https://www.newport.com/f/miniature-mfa-motorized-linear-stages},
+}
+
diff --git a/todo.org b/todo.org
index 88735ef..9cc5e61 100644
--- a/todo.org
+++ b/todo.org
@@ -44,15 +44,6 @@
* TODO future directions :opa:
* TODO figure captions :opa:
* IDEA insert content from SI :mix:
-* DONE insert content from main :pss:
- CLOSED: [2018-04-12 Thu 21:04]
-* IDEA insert content from SI :pss:
-* DONE insert content from main :psg:
- CLOSED: [2018-04-12 Thu 21:04]
* IDEA insert content from SI :psg:
-* TODO include errata, remove errata as chapter :mx2:
-* TODO better title :pps:
-* TODO first draft :pps:
-* IDEA unpublished data summary :pps:
* TODO verify all references :polish:
* TODO read through and make links where appropriate :polish: