diff options
| author | Blaise Thompson <blaise@untzag.com> | 2017-08-10 18:47:11 -0500 | 
|---|---|---|
| committer | Blaise Thompson <blaise@untzag.com> | 2017-08-10 18:47:11 -0500 | 
| commit | 913c837f4e30734f47372ab563d6cc3ee89f0f17 (patch) | |
| tree | 2710e9e7ee84306668ec8686f592a52ee9e96b2d /figures/software/PyCMDS/ideal axis positions | |
| parent | 379d5b42ea29d5f5c60adf52aa8ed62f9a54080b (diff) | |
initial commit
Diffstat (limited to 'figures/software/PyCMDS/ideal axis positions')
| -rw-r--r-- | figures/software/PyCMDS/ideal axis positions/delay steps.pdf | bin | 0 -> 351037 bytes | |||
| -rw-r--r-- | figures/software/PyCMDS/ideal axis positions/delay steps.tex | 99 | ||||
| -rw-r--r-- | figures/software/PyCMDS/ideal axis positions/exponential.png | bin | 0 -> 210936 bytes | |||
| -rw-r--r-- | figures/software/PyCMDS/ideal axis positions/steps.py | 83 | 
4 files changed, 182 insertions, 0 deletions
| diff --git a/figures/software/PyCMDS/ideal axis positions/delay steps.pdf b/figures/software/PyCMDS/ideal axis positions/delay steps.pdfBinary files differ new file mode 100644 index 0000000..1472e0c --- /dev/null +++ b/figures/software/PyCMDS/ideal axis positions/delay steps.pdf diff --git a/figures/software/PyCMDS/ideal axis positions/delay steps.tex b/figures/software/PyCMDS/ideal axis positions/delay steps.tex new file mode 100644 index 0000000..88029ea --- /dev/null +++ b/figures/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/figures/software/PyCMDS/ideal axis positions/exponential.png b/figures/software/PyCMDS/ideal axis positions/exponential.pngBinary files differ new file mode 100644 index 0000000..7ad27f3 --- /dev/null +++ b/figures/software/PyCMDS/ideal axis positions/exponential.png diff --git a/figures/software/PyCMDS/ideal axis positions/steps.py b/figures/software/PyCMDS/ideal axis positions/steps.py new file mode 100644 index 0000000..13419c3 --- /dev/null +++ b/figures/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')
 | 
