From 9d89c09dfe49aba4c68b6911600715add419babd Mon Sep 17 00:00:00 2001 From: Blaise Thompson Date: Tue, 27 Feb 2018 23:58:32 -0600 Subject: 2018-02-27 23:58 --- .../PyCMDS/ideal axis positions/delay steps.pdf | Bin 0 -> 351037 bytes .../PyCMDS/ideal axis positions/delay steps.tex | 99 +++++++++++++++++++++ .../PyCMDS/ideal axis positions/exponential.png | Bin 0 -> 210936 bytes processing/PyCMDS/ideal axis positions/steps.py | 83 +++++++++++++++++ 4 files changed, 182 insertions(+) create mode 100644 processing/PyCMDS/ideal axis positions/delay steps.pdf create mode 100644 processing/PyCMDS/ideal axis positions/delay steps.tex create mode 100644 processing/PyCMDS/ideal axis positions/exponential.png create mode 100644 processing/PyCMDS/ideal axis positions/steps.py (limited to 'processing/PyCMDS/ideal axis positions') diff --git a/processing/PyCMDS/ideal axis positions/delay steps.pdf b/processing/PyCMDS/ideal axis positions/delay steps.pdf new file mode 100644 index 0000000..1472e0c Binary files /dev/null and b/processing/PyCMDS/ideal axis positions/delay steps.pdf differ diff --git a/processing/PyCMDS/ideal axis positions/delay steps.tex b/processing/PyCMDS/ideal axis positions/delay steps.tex new file mode 100644 index 0000000..88029ea --- /dev/null +++ b/processing/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/processing/PyCMDS/ideal axis positions/exponential.png b/processing/PyCMDS/ideal axis positions/exponential.png new file mode 100644 index 0000000..7ad27f3 Binary files /dev/null and b/processing/PyCMDS/ideal axis positions/exponential.png differ diff --git a/processing/PyCMDS/ideal axis positions/steps.py b/processing/PyCMDS/ideal axis positions/steps.py new file mode 100644 index 0000000..13419c3 --- /dev/null +++ b/processing/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') -- cgit v1.2.3