aboutsummaryrefslogtreecommitdiff
path: root/software
diff options
context:
space:
mode:
authorBlaise Thompson <blaise@untzag.com>2017-10-16 21:05:48 -0500
committerBlaise Thompson <blaise@untzag.com>2017-10-16 21:05:48 -0500
commit49de5fe553c2066520162cccd7d5dd586efc934d (patch)
treef1191ebc084ae49be6bd3efbb33e6dd4e3979494 /software
parent1b66cf20d0f40741d89d39b901716341beeabeca (diff)
structure
Diffstat (limited to 'software')
-rw-r--r--software/PyCMDS/ideal axis positions/delay steps.pdfbin0 -> 351037 bytes
-rw-r--r--software/PyCMDS/ideal axis positions/delay steps.tex99
-rw-r--r--software/PyCMDS/ideal axis positions/exponential.pngbin0 -> 210936 bytes
-rw-r--r--software/PyCMDS/ideal axis positions/steps.py83
4 files changed, 182 insertions, 0 deletions
diff --git a/software/PyCMDS/ideal axis positions/delay steps.pdf b/software/PyCMDS/ideal axis positions/delay steps.pdf
new file mode 100644
index 0000000..1472e0c
--- /dev/null
+++ b/software/PyCMDS/ideal axis positions/delay steps.pdf
Binary files differ
diff --git a/software/PyCMDS/ideal axis positions/delay steps.tex b/software/PyCMDS/ideal axis positions/delay steps.tex
new file mode 100644
index 0000000..88029ea
--- /dev/null
+++ b/software/PyCMDS/ideal axis positions/delay steps.tex
@@ -0,0 +1,99 @@
+% document
+\documentclass[11 pt]{report}
+\usepackage[letterpaper, margin=0.75in]{geometry} % 1 inch margins required
+\usepackage{setspace}
+\usepackage{afterpage}
+\usepackage{color}
+\usepackage{soul}
+\usepackage{array}
+
+% text
+\usepackage[utf8]{inputenc}
+\setlength\parindent{0pt}
+\setlength{\parskip}{1em}
+\usepackage{enumitem}
+\renewcommand{\familydefault}{\sfdefault}
+\newcommand{\RomanNumeral}[1]{\textrm{\uppercase\expandafter{\romannumeral #1\relax}}}
+\usepackage{etoolbox}
+\AtBeginEnvironment{verse}{\singlespacing}
+\AtBeginEnvironment{tabular}{\singlespacing}
+
+% graphics
+\usepackage{graphics}
+\usepackage{graphicx}
+\usepackage{epsfig}
+\usepackage{epstopdf}
+\usepackage{etoc}
+\usepackage{tikz}
+
+% math
+\usepackage{amssymb}
+\usepackage{amsmath}
+\usepackage[cm]{sfmath}
+\DeclareMathOperator{\me}{e}
+
+% hyperref
+\usepackage[colorlinks=true, linkcolor=black, urlcolor=blue, citecolor=black, anchorcolor=black]{hyperref}
+\usepackage[all]{hypcap} % helps hyperref work properly
+
+% date (http://tex.stackexchange.com/a/237251)
+\def\twodigits#1{\ifnum#1<10 0\fi\the#1}
+\def\mydate{\leavevmode\hbox{\the\year-\twodigits\month-\twodigits\day}}
+
+\begin{document}
+
+{\Huge{delay space stepping strategy}}
+
+Blaise Thompson \hfill last modified \mydate
+
+\dotfill
+
+Linear stepping is more expensive than it needs to be.
+
+Want to capture the dynamic range of the data as quickly as possible.
+
+Typically have exponential decay dynamics (perhaps multi-exponential)\dots we can capitalize on this. We want to take high resolution data at early delays and low resolution data at late delays.
+
+Of course, we don't want to throw away any information we would otherwise be entitled to.
+
+Conceptually we want to 'linearize' the data, so that each subsequent delay step accounts for the same change in signal.
+
+Signal goes exponentially...
+
+\begin{eqnarray}
+S &=& \me^{-\frac{t}{\tau}} \\
+\log{(S)} &=& -\frac{t}{\tau} \\
+t &=& -\tau\log{(S)}
+\end{eqnarray}
+
+So to step linearly in $t$, my step size has to go as $-\tau\log{(S)}$.
+
+We want to go linearly in signal, meaning that we want to divide $S$ into even sections. If $S$ goes from 0 to 1 and we choose to acquire $N$ points,
+
+\begin{eqnarray}
+t_n &=& -\tau\log{\left(\frac{n}{N}\right)}.
+\end{eqnarray}
+
+Note that $t_n$ starts at long times and approaches zero delay. So the first $t_1$ is the smallest signal and $t_N$ is the largest.
+
+Now we can start to consider realistic cases, like where $\tau$ is not quite known and where some other longer dynamics persist (manifested as a static offset). Since these values are not separable in a general system, I'll keep $S$ normalized between 0 and 1.
+
+\begin{eqnarray}
+S &=& (1-c)\me^{-\frac{t}{\tau_{\mathrm{actual}}}} + c \\
+S_n &=& (1-c)\me^{-\frac{-\tau_{\mathrm{step}}\log{\left(\frac{n}{N}\right)}}{\tau_{\mathrm{actual}}}} + c \\
+S_n &=& (1-c)\me^{-\frac{\tau_{\mathrm{step}}}{\tau_{\mathrm{actual}}} \log{\left(\frac{N}{n}\right)}} + c \\
+S_n &=& (1-c)\left(\frac{N}{n}\right)^{-\frac{\tau_{\mathrm{step}}}{\tau_{\mathrm{actual}}}} + c \\
+S_n &=& (1-c)\left(\frac{n}{N}\right)^{\frac{\tau_{\mathrm{step}}}{\tau_{\mathrm{actual}}}} + c
+\end{eqnarray}
+
+
+
+\begin{figure}[!htb]
+ \centering
+ \includegraphics[scale=0.5]{"out"}
+ \caption{}
+\end{figure}
+
+
+
+\end{document} \ No newline at end of file
diff --git a/software/PyCMDS/ideal axis positions/exponential.png b/software/PyCMDS/ideal axis positions/exponential.png
new file mode 100644
index 0000000..7ad27f3
--- /dev/null
+++ b/software/PyCMDS/ideal axis positions/exponential.png
Binary files differ
diff --git a/software/PyCMDS/ideal axis positions/steps.py b/software/PyCMDS/ideal axis positions/steps.py
new file mode 100644
index 0000000..13419c3
--- /dev/null
+++ b/software/PyCMDS/ideal axis positions/steps.py
@@ -0,0 +1,83 @@
+### import ####################################################################
+
+
+import matplotlib.pyplot as plt
+plt.close('all')
+
+import numpy as np
+
+import WrightTools as wt
+
+
+### define ####################################################################
+
+
+def get_signal(d, tau, pulsewidth=10, offset=0):
+ # pulse
+ pulse = np.exp((-d**2)/(pulsewidth**2))
+ # signal
+ sig = np.zeros(d.shape)
+ sig[d<=0] = np.exp(d[d<=0]/tau)
+ sig[d<=0] += offset
+ sig /= sig.max()
+ # finish
+ #sig = np.convolve(sig, pulse, mode='same')
+ return sig
+
+
+def logarithmic_stepping(p_tau, p_npts, n_tau, n_npts):
+ # positive
+ p_xi = np.arange(0, p_npts)
+ p_delays = p_tau * np.log((p_xi.size+1)/(p_xi+1))
+ # negative
+ n_xi = np.arange(0, n_npts)
+ n_delays = -n_tau * np.log((n_xi.size+1)/(n_xi+1))
+ return np.hstack((n_delays, [0], p_delays))
+
+
+tau = 200
+
+
+d = logarithmic_stepping(50, 3, 200, 15)
+
+
+### workspace #################################################################
+
+
+if True:
+ fig, gs = wt.artists.create_figure(width=13, cols=[1, 1], nrows=1)
+ # delay space
+ ax = plt.subplot(gs[0, 0])
+ ds = np.linspace(-1500, 1500, 1000)
+ sig = get_signal(ds, tau)
+ plt.plot(ds, sig, c='b', lw=2, alpha=0.5)
+ sig = get_signal(ds, tau, offset=0.5)
+ plt.plot(ds, sig, c='r', lw=2, alpha=0.5)
+ sig = get_signal(ds, tau*2, offset=0)
+ plt.plot(ds, sig, c='g', lw=2, alpha=0.5)
+ plt.xlim(-1250, 100)
+ plt.ylim(-0.1, 1.1)
+ for x in d:
+ plt.axvline(x, c='k', zorder=0)
+ plt.axvline(0, lw=3, c='k')
+ ax.set_xlabel('delay', fontsize=18)
+ ax.set_ylabel('signal', fontsize=18)
+ plt.grid(ls=':')
+ # index space
+ ax = plt.subplot(gs[0, 1])
+ d = logarithmic_stepping(50, 3, 200, 15)
+ sig = get_signal(d, tau)
+ plt.scatter(np.arange(sig.size), sig, c='b', edgecolor='none', s=50, alpha=0.5)
+ sig = get_signal(d, tau, offset=0.5)
+ plt.scatter(np.arange(sig.size), sig, c='r', edgecolor='none', s=50, alpha=0.5)
+ sig = get_signal(d, tau*2, offset=0)
+ plt.scatter(np.arange(sig.size), sig, c='g', edgecolor='none', s=50, alpha=0.5)
+ i = np.argmin(np.abs(d))
+ plt.axvline(i, lw=3, c='k')
+ plt.grid(ls=':')
+ plt.ylim(-0.1, 1.1)
+ plt.setp(ax.get_yticklabels(), visible=False)
+ ax.set_xlim(0-1, sig.size)
+ ax.set_xlabel('index', fontsize=18)
+ # finish
+ wt.artists.savefig('exponential.png')