unfolding force is proportional to time, so we expect exponential
population decay, even with multiple unfolding domains.
-For example, with a spring constant
+Analytically, with a spring constant
.. math:: k = df/dx
we have a loading rate
-.. math:: df/dt = df/dx dx/dt = kv \;,
+.. math:: df/dt = df/dx dx/dt = kv \\;,
so
-.. math:: f = kvt + f_0 \;.
+.. math:: f = kvt + f_0 \\;.
-With an unfolding rate constant
-
-.. math:: K = 1 \text{frac/s}
-
-The population follows
+With an unfolding rate constant :math:`K`, the population follows
.. math::
- dp/dt = Kp = 1 \text{s^{-1}}
- p(t) = exp(-tK) = exp(-(f-f_0)K/kv) = p(f) \;.
+ dp/dt = Kp
+ p(t) = exp(-tK) = exp(-(f-f_0)K/kv) = p(f) \\;.
Therefore, a histogram of unfolding vs. force :math:`p(f)` normalized
to :math:`p(0)=1` should follow
where :math:`w` is the binwidth and :math:`N` is the number of tested
domains.
+
+>>> test()
"""
from numpy import arange, exp, log
def probability_distribution(x, params):
"""Exponential decay decay probability distribution.
- .. math:: 1/\\tau \cdot exp(-x/\\tau)
+ .. math:: 1/\\tau \\cdot exp(-x/\\tau)
"""
p = params # convenient alias
p[0] = abs(p[0]) # cannot normalize negative tau.
Notes
-----
- .. math:: y \\propto \cdot e^{-t/\tau}
+ .. math:: y \\propto \\cdot e^{-t/\\tau}
"""
self._model_data.counts = (
self.info['binwidth']*self.info['N']*probability_distribution(
def constant_rate(sawsim_runner, num_domains=1, unfolding_rate=1,
- spring_constant=1, velocity=1, N=400):
- loading_rate = spring_constant * velocity
+ spring_constant=1, velocity=1, N=100):
+ loading_rate = float(spring_constant * velocity)
tau = loading_rate / unfolding_rate
w = 0.1 * tau # calculate bin width (in force)
A = w*num_domains*N / tau
theory.bin_centers, [tau])
theory.analyze()
+ max_time_step = tau/10.0
+ max_force_step = loading_rate * max_time_step
param_string = (
- '-v %(velocity)s -s cantilever,hooke,%(spring_constant)s -N1 '
- '-s folded,null -N%(num_domains)s -s unfolded,null '
- '-k folded,unfolded,const,%(unfolding_rate)s -q folded '
+ '-d %(max_time_step)g -F %(max_force_step)g -v %(velocity)g '
+ '-s cantilever,hooke,%(spring_constant)g -N1 '
+ '-s folded,null -N%(num_domains)d -s unfolded,null '
+ '-k folded,unfolded,const,%(unfolding_rate)g -q folded '
) % locals()
sim = sawsim_histogram(sawsim_runner, param_string, N=N,
bin_edges=theory.bin_edges)
e = ExponentialModelFitter(sim)
params = e.fit()
sim_tau = abs(params[0])
- assert (sim_tau - tau)/tau, 'simulation tau = %g != %g = tau' % (
- sim_tau, tau)
+ for s,t,n in [(sim_tau, tau, 'tau')]:
+ assert (s - t)/t < 0.1, 'simulation %s = %g != %g = %s' % (n,s,t,n)
return sim.residual(theory)
def test(num_domains=[1,50], unfolding_rate=[1,2], spring_constant=[1,2],
- velocity=[1,2], threshold=0.3):
+ velocity=[1,2], threshold=0.2):
m = get_manager()()
sr = SawsimRunner(manager=m)
try: