7 <title>Open source single molecule force spectroscopy</title>
9 <meta name="description" content="Controlling and analyzing SMFS with varying salt concentrations">
10 <meta name="author" content="Trevor King">
12 <meta name="apple-mobile-web-app-capable" content="yes" />
13 <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
14 <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
16 <link rel="stylesheet" href="css/reveal.min.css">
17 <link rel="stylesheet" href="css/theme/beige.css" id="theme">
18 <link rel="stylesheet" href="css/local.css" id="local">
20 <!-- For syntax highlighting -->
21 <link rel="stylesheet" href="lib/css/zenburn.css">
23 <!-- If the query includes 'print-pdf', use the PDF print sheet -->
25 document.write( '<link rel="stylesheet" href="css/print/' + ( window.location.search.match( /print-pdf/gi ) ? 'pdf' : 'paper' ) + '.css" type="text/css" media="print">' );
29 <script src="lib/js/html5shiv.js"></script>
37 <!-- Any section element inside of this container is displayed as a slide -->
41 <h2>Open source<br/> single molecule<br/> force spectroscopy</h2>
42 <h3>Protein unfolding in varying salt concentrations</h3>
43 <p style="text-align: center;">
44 <small>Trevor King</small>
49 <h2>Open source SMFS</h2>
51 <li><a href="#/1" class="active">Proteins</a></li>
52 <li><a href="#/2">Atomic force microscopy</a></li>
53 <li><a href="#/3">Single molecule force spectroscopy</a></li>
54 <li><a href="#/4">Experiment control</a></li>
55 <li><a href="#/5">Cantilever calibration</a></li>
57 Modeling: Monte Carlo unfolding simulations</a></li>
59 Application: Unfolding in salty buffers</a></li>
60 <li><a href="#/8">Conclusions and future work</a></li>
64 <h2>Proteins: What are they?</h2>
66 <video width="640" height="480"
67 preload="auto" loop="" controls=""> <!--autoplay=""-->
68 <source src="media/build/1TIT-atoms.mp4"
69 type='video/mp4; codecs="avc1.42E01E, mp4a.40.2"' />
71 <!-- generated with PyMol from
72 http://www.rcsb.org/pdb/explore.do?structureId=1TIT -->
76 <h2>Proteins: Where are they?</h2>
78 <img src="media/build/takamori-fig4b-fw-fh.png" />
80 <p style="text-align: center;">
82 <a href="http://dx.doi.org/10.1016/j.cell.2006.10.030">
83 Takamori, Holt, Stenius, et al., 2006
89 <h2>Proteins: Titin</h2>
91 <img src="media/build/skeletal-muscle-fw-fh.png" />
93 <p style="text-align: center;">
96 <a href="http://en.wikipedia.org/wiki/File:Skeletal_muscle.jpg">
103 <h2>Proteins: Titin's I27</h2>
105 <img src="media/build/titin-fw-fh.png" />
107 <p style="text-align: center;">
109 <a href="http://www.ks.uiuc.edu/Research/telethonin/">
110 U. Illinois Biophysics Group
116 <h2>Proteins: I27</h2>
118 <img src="media/build/1TIT-fw-fh.png" />
120 <p style="text-align: center;">
122 <a href="http://www.rcsb.org/pdb/explore.do?structureId=1TIT">
129 <h2>Proteins: What's the problem?</h2>
130 <table class="center">
132 <td style="vertical-align: middle;">
133 <pre style="display: table; width: auto;">
143 <td style="vertical-align: middle;"><p> → </p></td>
144 <td style="vertical-align: middle;">
145 <img src="media/build/1TIT-tw-th.png" />
151 <img src="media/build/pirchi-fig1-fw-hh.png" />
153 <p style="text-align: center;">
155 <a href="http://dx.doi.org/10.1038/ncomms1504">
156 Pirchi, Ziv, Riven, et al., 2011
167 <h2>Open source SMFS</h2>
169 <li><a href="#/1">Proteins</a></li>
170 <li><a href="#/2" class="active">Atomic force microscopy</a></li>
171 <li><a href="#/3">Single molecule force spectroscopy</a></li>
172 <li><a href="#/4">Experiment control</a></li>
173 <li><a href="#/5">Cantilever calibration</a></li>
175 Modeling: Monte Carlo unfolding simulations</a></li>
177 Application: Unfolding in salty buffers</a></li>
178 <li><a href="#/8">Conclusions and future work</a></li>
182 <h2>Atomic force microscopy</h2>
184 <img src="media/build/afm-3d-fw-fh.png" />
188 <h2>AFM: Cantilever geometry</h2>
190 <!-- need height to stretch low-resolution pictures -->
191 <img src="media/build/cantilever.jpg" height="272" />
192 <img src="media/build/tip.jpg" height="272" />
194 <p style="text-align: center;">
196 <a href="http://probe.olympus-global.com/en/product/omcl_tr800psa_w/">
199 <a href="http://www.asylumresearch.com/Probe/TR400PSA,Olympus">
203 <a href="http://probe.olympus-global.com/en/product/omcl_tr400psa_hw/">
210 <h2>AFM: Laser deflection</h2>
212 <video width="640" height="480"
213 preload="auto" loop="" controls=""> <!--autoplay=""-->
214 <source src="media/build/contact-afm.ogv"
215 type='video/ogg; codecs="theora,vorbis"' />
218 <p style="text-align: center;">
220 <a href="http://www.freesbi.ch/fr/illustration/animations">
227 <h2>AFM: Piezo positioning</h2>
229 <img src="media/build/afm-fw-fh.png" />
233 <h2>The piezoelectric effect</h2>
235 <object data="media/perovskite.svg" type="image/svg+xml"
236 width="640" height="350"></object>
238 <p style="text-align: center;">
240 Lead zirconium titanate (PZT) from
241 <a href="http://en.wikipedia.org/wiki/File:Perovskite.svg">
248 <h2>AFM: Tubular piezos</h2>
250 <img src="media/build/piezo-fw-fh.png" />
256 <h2>Open source SMFS</h2>
258 <li><a href="#/1">Proteins</a></li>
259 <li><a href="#/2">Atomic force microscopy</a></li>
260 <li><a href="#/3" class="active">
261 Single molecule force spectroscopy</a></li>
262 <li><a href="#/4">Experiment control</a></li>
263 <li><a href="#/5">Cantilever calibration</a></li>
265 Modeling: Monte Carlo unfolding simulations</a></li>
267 Application: Unfolding in salty buffers</a></li>
268 <li><a href="#/8">Conclusions and future work</a></li>
272 <h2>Single molecule force spectroscopy</h2>
274 <img src="media/build/unfolding-fw-fh.png" />
278 <h2>SMFS: Sawtooth curve</h2>
280 <img src="media/build/expt-sawtooth-fw-fh.png" width="640" />
284 <h2>SMFS: What's going on?</h2>
286 <img src="media/build/carrion-vazquez-fig2-fw-fh.png" />
290 <a href="http://dx.doi.org/10.1016/S0079-6107(00)00017-1">
291 Carrion-Vazquez, et al., 2000;
292 adapted from Baljon and Robbins, 1996
298 <h2>SMFS: Unfolding one domain</h2>
300 <img src="media/build/lu-fig1-fw-fh.png" />
304 <a href="http://dx.doi.org/10.1016/S0006-3495(00)76273-4">
305 Lu and Schulten, 2000
313 <h2>Open source SMFS</h2>
315 <li><a href="#/1">Proteins</a></li>
316 <li><a href="#/2">Atomic force microscopy</a></li>
317 <li><a href="#/3">Single molecule force spectroscopy</a></li>
318 <li><a href="#/4" class="active">Experiment control</a></li>
319 <li><a href="#/5">Cantilever calibration</a></li>
321 Modeling: Monte Carlo unfolding simulations</a></li>
323 Application: Unfolding in salty buffers</a></li>
324 <li><a href="#/8">Conclusions and future work</a></li>
328 <h2>Experiment control</h2>
330 <img src="media/build/apparatus-fw-fh.png" />
334 <h2>Control: Quick-and-dirty</h2>
336 <img src="media/build/labview-fw-fh.png" />
340 <h2>Control: Modular stack</h2>
342 <img src="media/build/pyafm-fw-fh.png" />
346 <h2>Open source: Existing layers</h2>
347 <table class="center">
349 <td><img src="media/logo/tux.png" height="150" /></td>
350 <td><object data="media/logo/gnu.svg" type="image/svg+xml"
351 height="150"></object></td>
352 <td><object data="media/logo/gentoo.svg" type="image/svg+xml"
353 height="150"></object></td>
354 <td><object data="media/logo/python.svg" type="image/svg+xml"
355 height="150"></object></td>
356 <td><object data="media/logo/scipy.svg" type="image/svg+xml"
357 height="150"></object></td>
360 <td><a href="https://www.kernel.org/">Linux</a></td>
362 <a href="http://www.gnu.org/">
363 <abbr title="GNU's Not Unix!">GNU</abbr>
366 <td><a href="http://www.gentoo.org/">Gentoo</a></td>
367 <td><a href="http://www.python.org/">Python</a></td>
368 <td><a href="http://www.scipy.org/">SciPy</a></td>
373 <a href="http://www.comedi.org/">
374 <abbr title="Control and Measurement Device Interface">Comedi<abbr>
380 <a href="http://matplotlib.org/">matplotlib</a>
385 <a href="https://github.com/bashwork/pymodbus">pymodbus</a>
390 <a href="http://www.cython.org/">Cython</a>
395 <a href="https://www.numpy.org/">NumPy</a>
402 <a href="http://www.h5py.org/">h5py</a>
405 <td><small>…</small></td>
410 <h2>Open source: Teamwork</h2>
412 <img src="media/build/ants-fw-fh.png" />
414 <p style="text-align: center;">
416 <a href="http://dx.doi.org/10.1073/pnas.1016658108">
417 Mlot, Tovey, and Hu, 2011
423 <h2>Control: Example code</h2>
424 <pre><code data-trim="">
425 class Unfolder (object):
428 """Approach-bind-unfold-save[-plot] cycle.
431 ret['timestamp'] = _email_utils.formatdate(localtime=True)
432 ret['temperature'] = self.afm.get_temperature()
433 ret['approach'] = self._approach()
435 ret['unfold'] = self._unfold()
437 if _package_config['matplotlib']:
443 <h2>Archival: HDF5 and h5config</h2>
444 <!-- h5dump -H 2013-03-04T12-43-38.h5 |
445 grep 'GROUP\|DATASET' | sed 's/ {.*//' -->
447 GROUP <span style="color: blue">"/"</span>
448 GROUP <span style="color: blue">"approach"</span>
450 GROUP <span style="color: blue">"config"</span>
451 GROUP <span style="color: blue">"afm"</span>
453 GROUP <span style="color: blue">"approach"</span>
455 DATASET <span style="color: blue">"bind time"</span>
457 GROUP <span style="color: blue">"unfold"</span>
459 DATASET <span style="color: blue">"velocity"</span>
460 GROUP <span style="color: blue">"environment"</span>
461 DATASET <span style="color: blue">"temperature"</span>
462 DATASET <span style="color: blue">"timestamp"</span>
464 GROUP <span style="color: blue">"unfold"</span>
465 DATASET <span style="color: blue">"deflection"</span>
466 DATASET <span style="color: blue">"frequency"</span>
467 DATASET <span style="color: blue">"z"</span></pre>
470 <h2>Archival: Version control</h2>
472 <span style="color: red">commit 32bfbf98d79c73eba50b77d0917df100e0e33bcf</span>
473 Author: W. Trevor King <wking@tremily.us>
474 Date: Fri Jan 18 22:54:49 2013 -0500
476 afm: Optionally return stepper_approach data with `record_data`
478 Sometimes these approach curves are pretty funky, so I'll start
479 recording them by default in calibcant-calibrate.py.
481 <span style="font-weight: bold">diff --git a/pyafm/afm.py b/pyafm/afm.py
482 index 60741c6..e76b118 100644
484 +++ b/pyafm/afm.py</span>
485 <span style="color: blue">@@ -460,10 +460,11 @@</span> class AFM (object):
489 <span style="color: red">- def stepper_approach(self, target_deflection):</span>
490 <span style="color: green">+ def stepper_approach(self, target_deflection, record_data=None):</span>
496 <h2>Open source SMFS</h2>
498 <li><a href="#/1">Proteins</a></li>
499 <li><a href="#/2">Atomic force microscopy</a></li>
500 <li><a href="#/3">Single molecule force spectroscopy</a></li>
501 <li><a href="#/4">Experiment control</a></li>
502 <li><a href="#/5" class="active">Cantilever calibration</a></li>
504 Modeling: Monte Carlo unfolding simulations</a></li>
506 Application: Unfolding in salty buffers</a></li>
507 <li><a href="#/8">Conclusions and future work</a></li>
511 <h2>Cantilever calibration</h2>
513 <img src="media/build/unfolding-fw-fh.png" />
517 <h2>Calibration: Geometry</h2>
519 <!-- need height to stretch low-resolution pictures -->
520 <img src="media/build/cantilever.jpg" height="272" />
521 <img src="media/build/tip.jpg" height="272" />
523 <p style="text-align: center;">
525 <a href="http://probe.olympus-global.com/en/product/omcl_tr800psa_w/">
528 <a href="http://www.asylumresearch.com/Probe/TR400PSA,Olympus">
532 <a href="http://probe.olympus-global.com/en/product/omcl_tr400psa_hw/">
539 <h2>Calibration: Equipartition</h2>
540 <table class="center">
542 <td style="vertical-align: middle;">
543 <img src="media/build/calibcant-flow-hw-fh.png" />
547 The average spring energy is
551 \frac{1}{2} \kappa \left\langle x_c^2 \right\rangle = \frac{1}{2}k_B T \;,
555 where $k_B$ is Boltzmann's constant and $T$ is the
563 <h2>Calibration: Vibration</h2>
565 <img src="media/build/vibration-fw-fh.png" width="620" />
569 <h2>Calibration: Photodiode calibration</h2>
571 <img src="media/build/bump-fw-fh.png" />
575 <h2>Calibration: Results</h2>
579 T &= 298.15 \pm 0.03 \; \text{K} &
580 \sigma_p &= 35.7 \pm 0.9 \; \text{mV/nm} \\
581 \left\langle V_p^2 \right\rangle &= 97 \pm 1 \; \text{mV}^2 &
582 \sqrt{\left\langle x_c^2 \right\rangle}
583 &= \sqrt{\frac{\left\langle V_p^2 \right\rangle}{\sigma_p^2}}
584 = 0.28 \; \text{nm} \\
585 \kappa = \frac{k_B T \sigma_p^2}{\left\langle V_p^2 \right\rangle}
586 &= 54 \pm 3 \; \text{pN/nm}
592 <h2>Calibration: Stability</h2>
593 <table class="center">
599 <!-- 2013-03-03T16-37-12 -->
600 <th colspan="2" style="text-align: center">Day 1</th>
602 <!-- 2013-03-04T12-21-54 -->
603 <th colspan="2" style="text-align: center">Day 2</th>
621 <td> 46.2</td>
624 <td> 41.3</td>
628 <td>$\left\langle V_p^2 \right\rangle$</td>
651 <h2>Calibration: Inconsistency</h2>
652 <table class="center">
654 <td style="vertical-align: middle;">
655 <img src="media/build/florin-fig2-hw-fh.png" />
657 <td style="vertical-align: middle;">
658 <img src="media/build/vibration-hw-fh.png" />
662 <p style="text-align: center;">
664 <a href="http://dx.doi.org/10.1016/0896-6273(88)90139-0">
665 Florin, Rief, Lehmann, et al., 1995
673 <h2>Open source SMFS</h2>
675 <li><a href="#/1">Proteins</a></li>
676 <li><a href="#/2">Atomic force microscopy</a></li>
677 <li><a href="#/3">Single molecule force spectroscopy</a></li>
678 <li><a href="#/4">Experiment control</a></li>
679 <li><a href="#/5">Cantilever calibration</a></li>
680 <li><a href="#/6" class="active">
681 Modeling: Monte Carlo unfolding simulations</a></li>
683 Application: Unfolding in salty buffers</a></li>
684 <li><a href="#/8">Conclusions and future work</a></li>
688 <h2>Monte Carlo unfolding simulations</h2>
689 <table class="center">
691 <td rowspan="2" style="vertical-align: middle;">
692 <img src="media/build/unfolding-hw-fh.png" />
694 <td style="vertical-align: top;">
695 <img src="media/build/expt-sawtooth-hw-hh.png" />
699 <td><img src="media/build/pbs-hist-hw-hh.png" /></td>
704 <h2>Hooke: Experimental histograms</h2>
706 <img src="media/build/expt-sawtooth-hw-hh.png"
707 style="vertical-align: middle;" />
708 <img src="media/build/pbs-hist-hw-hh.png"
709 style="vertical-align: middle;" />
712 <a href="http://dx.doi.org/10.1093/bioinformatics/btp180">Sandal,
713 Benedetti, et al., 2009</a>
717 <h2>Sawsim: State model</h2>
719 <img src="media/build/unfolding-hw-fh.png"
720 style="vertical-align: middle;">
721 <img src="media/build/sawsim-states-hw-fh.png"
722 style="vertical-align: middle;">
726 <h2>Sawsim: Simulation loop</h2>
728 <li>Calculate piezo-induced gap $x_t(t)=v t$</li>
730 Find tension model parameters for each state
733 Distribute per-state stretching ($x_c$, $x_u$, …) to
737 Calculate the transition rates between states
740 Roll the dice to determine if transitions take
741 place as you step forward in time
746 <h2>Sawsim: Monte Carlo</h2>
748 <img src="media/build/monte-carlo-fw-fh.png" />
752 <h2>Sawsim: Unfolding models</h2>
753 <table class="center">
755 <td style="text-align: center;">
756 <img src="media/build/unfolding-hw-hh.png"
757 style="vertical-align: middle;">
760 <img src="media/build/landscape-hw-hh.png"
761 style="vertical-align: middle;">
765 <td style="text-align: center;">
766 <img src="media/build/sawsim-states-hw-hh.png"
767 style="vertical-align: middle;">
770 <img src="media/build/landscape-bell-hw-hh.png"
771 style="vertical-align: middle;">
777 <h2>Sawsim: Kramers' model</h2>
782 \int_{-\infty}^{\infty} \mathrm{d}\! x \;
783 e^{\frac{U_F(x)}{k_B T}}
784 \int_{-\infty}^{x} \mathrm{d}\! x' \;
785 e^{\frac{-U_F(x')}{k_B T}}
789 <img src="media/build/landscape-hw-hh.png"
790 style="vertical-align: middle;">
791 <img src="media/build/kramers-integrand-hw-hh.png"
792 style="vertical-align: middle;">
796 <h2>Sawsim: Tension models</h2>
797 <table class="center">
799 <td style="text-align: center;">
800 <img src="media/build/unfolding-hw-hh.png"
801 style="vertical-align: middle;">
803 <td rowspan="2" style="vertical-align: middle;">
804 <img src="media/build/wlc-model-hw-fh.png">
806 <td rowspan="2" style="vertical-align: middle;">
807 <img src="media/build/fjc-model-hw-fh.png">
811 <td style="text-align: center;">
812 <img src="media/build/sawsim-states-hw-hh.png"
813 style="vertical-align: middle;">
819 <h2>Sawsim: Fitting models</h2>
821 <img src="media/build/fit-valley-fw-fh.png" />
827 <h2>Open source SMFS</h2>
829 <li><a href="#/1">Proteins</a></li>
830 <li><a href="#/2">Atomic force microscopy</a></li>
831 <li><a href="#/3">Single molecule force spectroscopy</a></li>
832 <li><a href="#/4">Experiment control</a></li>
833 <li><a href="#/5">Cantilever calibration</a></li>
835 Modeling: Monte Carlo unfolding simulations</a></li>
836 <li><a href="#/7" class="active">
837 Application: Unfolding in salty buffers</a></li>
838 <li><a href="#/8">Conclusions and future work</a></li>
842 <h2>Unfolding in salty buffers</h2>
844 <img src="media/build/lu-fig1-fw-fh.png" />
846 <p style="text-align: center;">
848 <a href="http://dx.doi.org/10.1016/S0006-3495(00)76273-4">
849 Lu and Schulten, 2000
855 <h2>Salt: Glutamic acid</h2>
857 <img src="media/build/1TIT-hbond-fw-fh.png" />
861 <h2>Salt: Reduced stability in CaCl₂</h2>
863 <img src="media/build/pbs-0.5M-CaCl2-hist-fw-fh.png" />
867 <h2>Salt: Sawsim fits</h2>
869 <img src="media/build/fit-valley-PBS-hw-hh.png" />
870 <img src="media/build/fit-valley-PBS-0.5M-CaCl2-hw-hh.png" />
872 <table class="center" style="width: 640px;">
876 <th>$\Delta x$ (Å)</th>
877 <th>$k_{u0}$ (s$^{-1}$)</th>
887 <td>PBS + 0.5 M CaCl₂</td>
893 <p><small>Ca²⁺ radius ∼1.1 Å, H-bond ∼2 Å.</small></p>
898 <h2>Open source SMFS</h2>
900 <li><a href="#/1">Proteins</a></li>
901 <li><a href="#/2">Atomic force microscopy</a></li>
902 <li><a href="#/3">Single molecule force spectroscopy</a></li>
903 <li><a href="#/4">Experiment control</a></li>
904 <li><a href="#/5">Cantilever calibration</a></li>
906 Modeling: Monte Carlo unfolding simulations</a></li>
908 Application: Unfolding in salty buffers</a></li>
909 <li><a href="#/8" class="active">
910 Conclusions and future work</a></li>
914 <h2>Conclusions: Salt</h2>
917 Prelimiary results show the expected destabilizing
920 <li>More contextual data!
922 <li>Pulling speeds</li>
923 <li>Salt concentrations (physiological levels)</li>
924 <li>Salt species</li>
927 <li>Mutated proteins?
929 <li>Is glutamic acid special?</li>
935 <h2>Conclusions: Hardware</h2>
936 <table class="center">
938 <td style="vertical-align: top;">
939 <img src="media/build/afm-hw-hh.png" />
942 <p>For automatic control, it would be nice to have…</p>
944 <li>Piezos with capacitive feedback ($10k an axis)</li>
945 <li>Independent 4-segment photodiode readout</li>
946 <li>Control over photodiode positioning</li>
947 <li>Control over laser alignment</li>
954 <h2>Conclusions: Software</h2>
956 <img src="media/build/pyafm-hw-hh.png" />
958 <p style="text-align: left;">
959 Everything works for me, and I expect it will work for
960 others… but no software (except
961 maybe <a href="http://en.wikipedia.org/wiki/TeX#Development">TeX</a>)
962 is without bugs. Testers welcome!
974 <td rowspan="2" style="vertical-align: top;">
976 <li>Guoliang Yang</li>
977 <li>Luis Cruz Cruz</li>
978 <li>Marisa Roman</li>
980 <li>Jian-Min Yuan</li>
983 <li>Michel Vallières</li>
984 <li>Everyone else in Drexel physics!</li>
986 <a href="http://dx.doi.org/10.1093/bioinformatics/btp180">Sandal,
987 Benedetti, et al.</a> for initial work on Hooke</li>
990 <td style="vertical-align: top;">
992 <li><a href="http://lab.hakim.se/reveal-js/">reveal.js</a></li>
993 <li><a href="http://sourceforge.net/projects/pymol/">PyMOL</a></li>
994 <li><a href="http://asymptote.sourceforge.net/">Asymptote</a></li>
1000 <td style="vertical-align: top;">
1011 <script src="lib/js/head.min.js"></script>
1012 <script src="js/reveal.min.js"></script>
1014 // Full list of configuration options available here:
1015 // https://github.com/hakimel/reveal.js#configuration
1021 theme: Reveal.getQueryHash().theme, // available themes are in /css/theme
1022 transition: Reveal.getQueryHash().transition || 'none', // default/cube/page/concave/zoom/linear/fade/none
1023 // Optional libraries used to extend on reveal.js
1025 { src: 'lib/js/classList.js', condition: function() { return !document.body.classList; } },
1026 { src: 'plugin/markdown/marked.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
1027 { src: 'plugin/markdown/markdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
1028 { src: 'plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } },
1029 { src: 'plugin/zoom-js/zoom.js', async: true, condition: function() { return !!document.body.classList; } },
1030 { src: 'plugin/notes/notes.js', async: true, condition: function() { return !!document.body.classList; } }
1031 // { src: 'plugin/search/search.js', async: true, condition: function() { return !!document.body.classList; } }
1032 // { src: 'plugin/remotes/remotes.js', async: true, condition: function() { return !!document.body.classList; } }